Note
Return back to the README.md file.
I have used the recommended PEP8 CI Python Linter to validate all of my Python files.
Validation was performed using the raw GitHub URL method, which ensures the deployed version is validated, not just local code.
After making fixes (line wrapping, removing excess blank lines, correcting indentation),
run.py passes validation with 0 errors and 0 warnings.
| Directory | File | URL | Screenshot | Notes |
|---|---|---|---|---|
| run.py | PEP8 CI Link | ![]() |
All previous errors (E302, E501, W293) resolved. |
PwdShell has two distinct environments, and testing was performed in both:
-
Local Version
- Master password is hashed with SHA256 and stored in
master.key. - Account data is stored persistently in
vault.json. - All data is preserved between sessions.
- Master password is hashed with SHA256 and stored in
-
Deployed (Heroku) Version
- No files are written (
master.keyandvault.jsonare not used). - All data (master password and accounts) is stored only in session memory.
- Data is cleared whenever the dyno restarts, the page is refreshed, or the tab is closed.
- No files are written (
Note
For this reason, screenshots from the Heroku deployed version often only show the final confirmation/error message.
Input prompts are cleared by the clear() function and, in deployed mode, data is reset between sessions.
The Python terminal was provided by Code Institute, and is known to have responsiveness issues.
However, I still tested the deployed version on multiple screen sizes using Chrome DevTools and an Android phone.
- Mobile (425px – 1080px wide) → Terminal displayed, though some horizontal scrolling (
overflow-x) was required. - Tablet (768px – 1080px wide) → Layout displayed correctly with minimal issues.
- Desktop (1920px X 1080px) → Fully functional, no responsiveness issues.
| Mobile | Tablet | Desktop | Notes |
|---|---|---|---|
![]() |
![]() |
![]() |
Mobile: overflow-x occurs. iPhone does not accept input. Android accepts input but can stop randomly. |
I tested the deployed site on multiple browsers.
| Chrome | Firefox | Safari | Edge | Opera | Brave | Notes |
|---|---|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Chrome: works fully. Firefox: emojis cut-off. Safari: terminal input unreliable. Edge: works as expected. Opera: works as expected. Brave: works fully |
I ran Lighthouse audits on the deployed Heroku site.
Scores are lower on mobile due to third-party scripts and Code Institute terminal environment, which are outside my control.
Desktop performance and accessibility scored higher.
| Mobile | Desktop |
|---|---|
![]() |
![]() |
Defensive programming was tested extensively, covering both happy paths and bad inputs.
Errors caused by user or data actions are always reported back to the user in a clear, colour-coded way:
- Input validation: Blank or mismatched passwords, invalid menu choices, and duplicate entries are rejected with red error messages.
- Data handling: Corrupted or missing
vault.jsonfiles trigger an error message and the app safely resets to an empty vault. - Session handling: On wrong master password attempts, the user is notified immediately and access is blocked.
- Exit handling: CTRL+C interrupts display a friendly error message instead of a crash.
This ensures the user is always informed of what went wrong and how the program has responded.
All user stories from the README were manually tested.
- Fixed
PEP8violations (E302, E501, W293, indentation issues). - Fixed issue where mismatched passwords in setup caused crash → now loops until valid.
- Fixed JSON decode error when vault.json was empty/corrupted → now defaults to empty dict.
- Fixed Deployment Bug:
- Heroku defaulted to Python 3.13, causing dependency build errors (
pillow,numpy). - Added
.python-versionfile to pin Python to 3.12. - Cleaned up
requirements.txtto include only actual dependencies (cryptography,colorama). - After these fixes, the build completed and the app deployed successfully.
- Heroku defaulted to Python 3.13, causing dependency build errors (
- Fixed Input Validation Bug:
- Previously, blank values for account name, username, or password were still accepted.
- Added if, else defensive checks to reject empty inputs inside the add_new_password function, ensuring all fields must be filled before saving.
Currently, no functional bugs remain open. Any remaining issues are environmental (see below).
Note
Some design choices, such as storing passwords in plaintext JSON and not enforcing password strength rules, are deliberate.
They were made to ensure simplicity, transparency, and easy assessment by Code Institute, while still demonstrating hashing, file handling, and secure input with getpass.
These choices are appropriate for the target audience of this educational project and do not represent logic errors.
Important
No remaining functional bugs are known. Environment-specific issues have been documented.































