Encrypted, project-local notes for your terminal.
Project description
pwdnote
Encrypted, project-local notes for your terminal.
pwdnote keeps project-specific notes — TODOs, deployment notes, AWS account
details, session IDs, customer context, reminders — encrypted on disk, right
next to your code, without ever exposing plaintext inside the repository.
It is local-first, encrypted-by-default, Git-friendly, and
terminal-native. The single encrypted file (.pwdnote.enc) is safe to
commit; without your key it is just ciphertext.
pwdnote is not a cloud service, a note-taking app, a password manager, a
database, or a sync platform. It does one small thing well.
Installation
uv tool install pwdnote
That's it — no further setup. The encryption key is generated automatically on first use.
Quick start
cd my-project
pwdnote init # create .pwdnote.enc
pwdnote edit # open it in your editor
pwdnote # print the decrypted note
pwdnote add "Remember to rotate AWS credentials"
Commands
| Command | Description |
|---|---|
pwdnote |
Show the decrypted project note. |
pwdnote init |
Create an encrypted note (# Project Notes). |
pwdnote edit |
Decrypt, open in $VISUAL/$EDITOR, re-encrypt on save. |
pwdnote add "text" |
Append - text to the note without opening an editor. |
pwdnote status |
Show the project root, note file, and encryption status. |
pwdnote gitignore |
Add recommended ignore entries (.pwdnote.tmp, .pwdnote.cache). |
Examples
$ pwdnote
TODO:
- rotate AWS keys
- update deployment docs
Notes:
Client requested staging environment.
$ pwdnote status
Project root:
~/projects/example
Note file:
.pwdnote.enc
Encrypted:
Yes
If no note exists yet:
No project note found.
Run:
pwdnote init
Project root detection
pwdnote does not operate only on the current directory. Starting from your
working directory it searches upward:
- If
.pwdnote.encexists, that location is used. - Otherwise, if
.gitexists, that location is treated as the project root. - The search stops at the filesystem root.
So from project/backend/api, running pwdnote finds
project/.pwdnote.enc.
Security model
- Authenticated encryption. Notes are encrypted with
Fernet (AES-128-CBC with an
HMAC-SHA256 authentication tag) from the well-maintained
cryptographylibrary. We do not implement custom cryptography. - Integrity protection. Tampered or corrupted files fail to decrypt rather than returning garbage.
- Key storage. A single key is generated on first use and stored at
~/.config/pwdnote/key(honouringXDG_CONFIG_HOME) with0600permissions inside a0700directory. - No plaintext on disk.
pwdnote editwrites to a temporary file with restrictive permissions and always deletes it afterwards. - Commit-safe.
.pwdnote.encis meant to be committed; it is ciphertext. Do not ignore it. (The temporary/cache artifacts are ignored instead.)
The crypto backend lives behind a small abstraction (encrypt_text /
decrypt_text), so it can be replaced later — and future versions may add
macOS Keychain, 1Password, age, or GPG key backends.
Limitations
- The key lives on your machine. If you lose
~/.config/pwdnote/key, encrypted notes cannot be recovered. Back the key up somewhere safe. - There is no built-in sync. Sharing a note across machines means sharing the same key (e.g. via a secrets manager).
- One note per project root.
pwdnoteis intentionally simple — no databases, no cloud, no plugins, no AI features.
Contributing
git clone https://github.com/pwdnote/pwdnote
cd pwdnote
uv sync # install deps + dev tools
uv run pytest # run the test suite
uv run pwdnote --help # try the CLI from source
Issues and pull requests are welcome. Please keep the tool small and reliable — new storage/key backends should slot in behind the existing abstractions.
License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pwdnote-0.1.0.tar.gz.
File metadata
- Download URL: pwdnote-0.1.0.tar.gz
- Upload date:
- Size: 28.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef5046ed87e9bac3bba97d1ca12f5ba6b9b83b27d167c1f5c9653229b01254b1
|
|
| MD5 |
e15e1522dc3ccd817786d6def94c58d6
|
|
| BLAKE2b-256 |
2aa4ceb5d9c8706562aefcfb861f94d636a3951446410b534d76e1fde5d46551
|
File details
Details for the file pwdnote-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pwdnote-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d6c877e46331906b79f82579ef48a91a26815161d8b52220cb58bb19d4c99c9
|
|
| MD5 |
dfa532c49b4f22d1743c1d4046431781
|
|
| BLAKE2b-256 |
9ecd8c64480407a1a40919d8d31a7465226db37f4e3331b2f9a43c0d1bfe079b
|