plain-text daily notes with optional encryption
Project description
duras
Daily notes as plain text files, with search and optional encryption.
Install
pip install duras
Requires Python 3.13+. 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
Model
One note per day:
YYYY/MM/YYYY-MM-DD.dn
- plain UTF-8 text
- filesystem is the index
- no database, no hidden state
- atomic writes
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 / 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 -
- reads from stdin.
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) |
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 duras- https://codeberg.org/duras/duras/wiki
Variants
duras
Standard variant for Unix-like systems. Uses system gpg. No dependencies.
duras_ashell
For iOS a-Shell mini. Uses PGPy (pure Python) instead of system gpg. No external binaries. Handles .asc keys directly; no keyring. Compatible encrypted format.
License
ISC
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.0.7.tar.gz.
File metadata
- Download URL: duras-1.0.7.tar.gz
- Upload date:
- Size: 13.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 |
af164492f9b14c8f48ec57f2f11e648490081dd923f4881c3fc5fd3cf8578b2c
|
|
| MD5 |
4aa102de0a8405cdb1bbc1a0647c5b0f
|
|
| BLAKE2b-256 |
22087d043dcc56e413ba38204a35836244ea391c1cc77334899d6c05c9a0e1dd
|
Provenance
The following attestation bundles were made for duras-1.0.7.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.0.7.tar.gz -
Subject digest:
af164492f9b14c8f48ec57f2f11e648490081dd923f4881c3fc5fd3cf8578b2c - Sigstore transparency entry: 1356390295
- Sigstore integration time:
-
Permalink:
sduras/duras@5a9106ecfdd9be79652335de0bc511f32adfe1a9 -
Branch / Tag:
refs/tags/v1.0.7 - Owner: https://github.com/sduras
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5a9106ecfdd9be79652335de0bc511f32adfe1a9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file duras-1.0.7-py3-none-any.whl.
File metadata
- Download URL: duras-1.0.7-py3-none-any.whl
- Upload date:
- Size: 13.1 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 |
ddfa9888617738bb8ffad220760f2ad1434394a3af7714640868055a64ba2e61
|
|
| MD5 |
9c1268d54d5dc7a50d364cbf13c7b85c
|
|
| BLAKE2b-256 |
de653d300d02ec5396c6db479cfcfe8690802ce9464b0d0251ab9a2c8a9ca626
|
Provenance
The following attestation bundles were made for duras-1.0.7-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.0.7-py3-none-any.whl -
Subject digest:
ddfa9888617738bb8ffad220760f2ad1434394a3af7714640868055a64ba2e61 - Sigstore transparency entry: 1356390324
- Sigstore integration time:
-
Permalink:
sduras/duras@5a9106ecfdd9be79652335de0bc511f32adfe1a9 -
Branch / Tag:
refs/tags/v1.0.7 - Owner: https://github.com/sduras
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5a9106ecfdd9be79652335de0bc511f32adfe1a9 -
Trigger Event:
push
-
Statement type: