Notr
Encrypted, lightning-fast CLI notes with a modern TUI experience and pluggable sync backends.
Highlights
- End-to-end encryption – every note is encrypted with AES-256-GCM before touching disk.
- Rich CLI UX – colourful output, fuzzy search, notebook-aware completions, and ergonomic shortcuts powered by Click + Rich.
- Intelligent sync – per-note merges with UUID tracking, conflict-safe tombstones, and optional auto-sync.
- Extensible architecture – ships with local filesystem and WebDAV backends; new backends slot in via a single interface.
Installation
pipx install notr
# or
pip install notr
Upgrade with pipx upgrade notr (or pip install --upgrade notr).
Quick Start
# Initialise the secure store and select a backend
notr init
# Add your first note (opens $EDITOR when text omitted)
notr add Work
# Browse notebooks and notes
notr view # notebooks
notr view Work # notes in “Work”
# Search across everything (fuzzy search included)
notr find meeting
notr ffind "meetng"
# Merge local/remote state (auto-sync can do this for you)
notr sync
Every command provides --help, and short aliases exist (for example notr a for notr add).
Everyday Commands
| Command | Purpose |
|---|---|
notr add [NOTEBOOK] [TEXT] |
Create a note (opens $EDITOR if TEXT omitted; --file seeds from a file). |
notr view [NOTEBOOK] [ID] |
List notebooks, list notes, or render a note as pretty Markdown. |
notr edit NOTEBOOK ID |
Edit an existing note in your editor. |
notr move FROM ID TO |
Move a note between notebooks. |
notr find [-b NOTEBOOK] QUERY |
Case-insensitive search within a notebook or globally. |
notr ffind [-b NOTEBOOK] QUERY |
Fuzzy search powered by RapidFuzz. |
notr sync |
Merge local and remote changes with spinner + summary output. |
notr backend login/logout/status |
Manage backend credentials and health. |
notr login/logout |
Cache or forget the decrypted master password for the current session. |
notr changemaster |
Rotate the master password without re-encrypting notes manually. |
notr export [options] |
Emit FZF-friendly TSV/JSON listings of notebooks or notes. |
notr update NOTEBOOK ID [--file PATH] |
Apply note changes from stdin or a file (no editor launch). |
notr notebook create NAME |
Ensure a notebook exists (safe to run repeatedly). |
FZF integration
# pick a notebook, then fuzzy match its notes
notebook=$(notr export --scope notebooks --fields name --no-header | fzf)
notr export --scope notes --notebook "$notebook" \
--fields "note_id,title" --no-header |
fzf --delimiter "\t" --with-nth=2 --preview 'notr view '"$notebook"' {1} --plain'
# Fish shell variant
notr export --scope notebooks --fields name --no-header | \
fzf | read --local notebook
notr export --scope notes --notebook "$notebook" --fields "note_id,title" --no-header \
| fzf --delimiter "\t" --with-nth=2 --preview "notr view \"$notebook\" {1} --plain"
notr export supports TSV (default) and JSON; use --fields to choose columns (for example --fields name or --fields title,preview). More recipes live in docs/FZF-INTEGRATION.md.
Sync & Security
- The master password never leaves your machine. A PBKDF2-derived key wraps a randomly generated master key used for note encryption.
- Backends only see encrypted SQLite pages. Credentials live in the OS keyring when available (with a locked-down file fallback).
- Sync compares notebooks/notes with stable UUIDs, merging only what changed. Tombstones ensure deletions propagate safely. The first sync against an older database migrates it automatically.
- Enable automatic syncing after mutating commands by setting
"autosync": truein~/.config/notr/config.json.
Configuration
- Config file:
~/.config/notr/config.json(override viaNOTR_CONFIG_PATH). - Encrypted database:
~/.local/share/notr/notr.db(override viaNOTR_DB_PATH). - Tweak defaults within the
optionssection (editor, viewer, timestamps, auto-sync, conflict handling).
Built-in Backends
- local – keeps an encrypted copy in a directory you control (perfect for offline backups or sync tools like Syncthing).
- webdav – syncs against any WebDAV endpoint using
PUT/GET/HEAD, with graceful error messaging and spinner feedback.
To add a backend, subclass Backend in notr/backends/ and register it in notr/backends/base.py.
Shell Completion
Generate completion scripts and source them from your shell startup:
notr completion bash > ~/.config/notr/notr.bash
notr completion zsh > ~/.config/notr/notr.zsh
notr completion fish > ~/.config/fish/completions/notr.fish
Restart your shell (or exec $SHELL) to activate completions.
Neovim integration
A first-party Neovim plugin lives in nvim/notr.nvim. It uses fzf-lua to browse notebooks/notes and edits notes in-buffer via the new notr update command. Installation and usage details are in that directory's README.
Contributing & Support
- Report bugs or request features: https://github.com/kimusan/notr/issues
- Ready to contribute? Read CONTRIBUTING.md.
License
Released under the MIT License. Crafted with care by Kim Schulz and the community.
Metadata
Release files for notr 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| notr-1.1.0.tar.gz | 29.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| notr-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 62.5 kB
Release files / notr-1.1.0.tar.gz
| Download URL | notr-1.1.0.tar.gz |
|---|---|
| Size | 29.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7233f54882f4a64f35d7c4f165e52a8c6ed74dccb1b76f0a1e94c36e6f3cd109
|
|
BLAKE2b-256 checksum How to use checksums |
3b5afbc70da1b00e170e36a4aa23fef9444d6d428e4eeadcfc1d93f552d3fb7c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2025.
Transparency logRelease files / notr-1.1.0-py3-none-any.whl
| Download URL | notr-1.1.0-py3-none-any.whl |
|---|---|
| Size | 32.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9797e77d77ac047e2c097cde00e682ca6c72b8f08155ba16816e2ecf9cdf6ca9
|
|
BLAKE2b-256 checksum How to use checksums |
40426ae257f015e8c440ef8f615f9903128cf9545380c750e262f1574fa61407
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2025.
Transparency log