plain-text daily notes with optional encryption
Project description
duras
Daily notes as plain text files, with search and optional encryption.
Standalone tool, but most effectively used together with duras_bridge, a minimal Vim / Neovim plugin that integrates the CLI directly into the text editor.
Install
pip install duras
Requires Python 3.9 or later. No dependencies. gpg optional for encrypted notes.
Quick start
duras # open today's note in $EDITOR
duras append "fix login bug #todo"
duras search todo
duras tags
Note format
One file per day:
~/Documents/Notes/YYYY/MM/YYYY-MM-DD.dn
Each note is self-describing plain UTF-8 text:
date: 2026-04-28
2026-04-28 09:10 started work
2026-04-28 14:32 fix null check in login handler #todo
2026-04-28 16:00 called bank re: account — follow up Thursday
Properties:
- plain UTF-8, LF line endings
- header
date:field matches filename and directory - entries are timestamped lines, two spaces between timestamp and text
- filesystem is the index; no database, no hidden state
- atomic writes
- readable with any text tool
Encrypted note:
YYYY/MM/YYYY-MM-DD.dn.gpg
via the GNU Privacy Guard.
Scope
Fits:
- terminal-based workflows
- grep-based retrieval
- long-lived plain text notes
- optional encryption
Not a fit:
- sync system
- GUI or rich text editor
- query engine or database
Commands
open
duras # today
duras open -1 # yesterday
duras open 2026-04-19
duras open -- +10 # pass +10 to $EDITOR (jump to line)
append
duras append "text"
duras append -d -1 "yesterday"
cat file | duras append
cmd | duras append
Text argument is optional. When omitted, stdin is read automatically.
show
duras show
duras show -1
list / stats
duras list
duras list -n 0 # all notes
duras stats
Order: by filename (ISO date), not mtime.
search / tags
duras search error
duras search todo -i # case-insensitive
duras tags # all tags with counts
duras tags project # notes containing #project
Literal match, not regex. Encrypted notes excluded.
export
duras export ~/backup
duras export ~/backup --encrypt
Creates a timestamped .tar.gz. --encrypt pipes through gpg; no plaintext archive is written.
other
duras path # absolute path to today's note
duras dir # notes root directory
duras today # print today's date
duras audit # validate directory structure
duras echo # notes on this date in past years
duras near # notes within ±3 days of today
duras mv 2026-04-17 2026-04-16
Encryption
duras -c open
duras -c append "secret"
duras -c show
- uses system
gpg append -cis memory-only; no plaintext temp fileopen -cwrites a temp file to/dev/shmwhen available
Dates
YYYY-MM-DD absolute
0 today
-1 yesterday
-7 one week ago
Future dates are rejected.
Environment
| variable | meaning |
|---|---|
DURAS_DIR |
notes directory (default: ~/Documents/Notes) |
EDITOR |
editor (fallback: nano, vi, ed) |
DURAS_GPG_KEY |
GPG recipient (default: self) |
.editorconfig is written to the notes directory on first run. It configures
any supporting editor to use UTF-8, LF line endings, and 72-column line length
for .dn files.
Exit codes
| code | meaning |
|---|---|
| 0 | ok |
| 1 | error |
| 2 | not found |
| 3 | invalid input |
| 4 | external failure |
Limits
- encrypted notes are not searchable
- depends on system
gpgfor encryption
Docs
man durasduras --help- https://duras.readthedocs.io/en/latest/
Variants
duras
Standard variant for Unix-like systems. Uses system gpg. No dependencies.
duras_ashell
For iOS a-Shell mini. Uses PGPy instead of system gpg. No external binaries. Handles .asc keys directly; no keyring. Compatible encrypted format.
License
ISC License
Project details
Release history Release notifications | RSS feed
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 duras-1.1.0.tar.gz.
File metadata
- Download URL: duras-1.1.0.tar.gz
- Upload date:
- Size: 15.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
68590e652ffad3b8f47eef2bf46497ed1243df553083cd06e8a1e59064dfeed8
|
|
| MD5 |
abac290955828365c2e4a7cd47a507d2
|
|
| BLAKE2b-256 |
a0c080d4d91929a4dbf315230f7f2f5415f657897284c1f0acef5f791b3aca94
|
Provenance
The following attestation bundles were made for duras-1.1.0.tar.gz:
Publisher:
publish.yml on sduras/duras
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duras-1.1.0.tar.gz -
Subject digest:
68590e652ffad3b8f47eef2bf46497ed1243df553083cd06e8a1e59064dfeed8 - Sigstore transparency entry: 1396313984
- Sigstore integration time:
-
Permalink:
sduras/duras@0208b2420a87e10264d4e5586a36dfe7a39739c2 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/sduras
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0208b2420a87e10264d4e5586a36dfe7a39739c2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file duras-1.1.0-py3-none-any.whl.
File metadata
- Download URL: duras-1.1.0-py3-none-any.whl
- Upload date:
- Size: 14.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e995e75fdb68fdfcd14b0a4a73955cd2e2eebb7a646fca767387ba713a80680
|
|
| MD5 |
d41768980b9cc02af89be82d7cf78328
|
|
| BLAKE2b-256 |
4e60cbd2191c13a87daeab8990b6f5b8613516b40b248aab5185f00062a9b443
|
Provenance
The following attestation bundles were made for duras-1.1.0-py3-none-any.whl:
Publisher:
publish.yml on sduras/duras
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duras-1.1.0-py3-none-any.whl -
Subject digest:
3e995e75fdb68fdfcd14b0a4a73955cd2e2eebb7a646fca767387ba713a80680 - Sigstore transparency entry: 1396313995
- Sigstore integration time:
-
Permalink:
sduras/duras@0208b2420a87e10264d4e5586a36dfe7a39739c2 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/sduras
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0208b2420a87e10264d4e5586a36dfe7a39739c2 -
Trigger Event:
push
-
Statement type: