Skip to main content

Encrypted, extensible command line note app with sync backends

Project description

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": true in ~/.config/notr/config.json.

Configuration

  • Config file: ~/.config/notr/config.json (override via NOTR_CONFIG_PATH).
  • Encrypted database: ~/.local/share/notr/notr.db (override via NOTR_DB_PATH).
  • Tweak defaults within the options section (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

License

Released under the MIT License. Crafted with care by Kim Schulz and the community.

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

notr-1.1.0.tar.gz (29.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

notr-1.1.0-py3-none-any.whl (32.9 kB view details)

Uploaded Python 3

File details

Details for the file notr-1.1.0.tar.gz.

File metadata

  • Download URL: notr-1.1.0.tar.gz
  • Upload date:
  • Size: 29.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for notr-1.1.0.tar.gz
Algorithm Hash digest
SHA256 7233f54882f4a64f35d7c4f165e52a8c6ed74dccb1b76f0a1e94c36e6f3cd109
MD5 6b11463e41a2c815f3315e3185ef3dbe
BLAKE2b-256 3b5afbc70da1b00e170e36a4aa23fef9444d6d428e4eeadcfc1d93f552d3fb7c

See more details on using hashes here.

Provenance

The following attestation bundles were made for notr-1.1.0.tar.gz:

Publisher: python-publish.yml on kimusan/notr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file notr-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: notr-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 32.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for notr-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9797e77d77ac047e2c097cde00e682ca6c72b8f08155ba16816e2ecf9cdf6ca9
MD5 1b95d7b44e3aa4bfe5f76c0d549bfcea
BLAKE2b-256 40426ae257f015e8c440ef8f615f9903128cf9545380c750e262f1574fa61407

See more details on using hashes here.

Provenance

The following attestation bundles were made for notr-1.1.0-py3-none-any.whl:

Publisher: python-publish.yml on kimusan/notr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page