Repository navigation
Configuration
github-actions[bot] edited this page Oct 21, 2026
·
1 revision
Every setting is an environment variable, read at start, usually from a .env
file beside the binary (cp .env.example .env). The older DIARY_<NAME>
spelling of each is still accepted. A value that is set but cannot be read stops
the start with the reason rather than falling back to the default.
| setting | example | what it does |
|---|---|---|
WORKSPACE_USER |
narl |
The one and only account. Both are checked in constant time on login. |
WORKSPACE_PASSWORD |
change-me |
See the row above. |
WORKSPACE_SECRET |
replace-with-32-random-characters |
Signs session cookies. Rotate it to log every device out. 32+ random chars. Generate one with: openssl rand -base64 32 |
WORKSPACE_DATA_DIR |
./data |
Where the SQLite database and uploaded media live. |
WORKSPACE_BIND |
127.0.0.1:4242 |
Address to listen on. Put a TLS terminating reverse proxy in front of this. |
WORKSPACE_SESSION_DAYS |
30 |
How long a login lasts, in days. |
WORKSPACE_MAX_UPLOAD_MB |
1024 |
Largest upload, in megabytes: one request, or what an imported zip unpacks to. Uploads stream to disk, so this bounds the disk, not the memory. |
WORKSPACE_SECURE_COOKIE |
0 |
Set to 1 once the app is served over HTTPS: the cookie gets Secure and the __Host- prefix (everyone is logged out once), and browsers are told to use HTTPS only (HSTS). The server refuses to start with the example secret or password above still in place. |
| setting | example | what it does |
|---|---|---|
WORKSPACE_SFTP_BIND |
127.0.0.1:2222 |
Off until this is set. Once it's up, register a key with :sshkey add <name> <ssh-ed25519 ...> in the app, then sshfs -P <port> anything@host:/ mnt/ (the username is ignored — only the key decides who gets in). On the mount, mkdir at the root makes a space and anywhere else a folder; a new .md file is a new document. A leading # Heading is the document's title. Editor temp, swap and backup files are kept in memory for the session only, and renaming one onto a .md name saves it into that document. Under Docker, bind 0.0.0.0 (not 127.0.0.1) as the app listens inside the container — the host-side address in compose.yml's ports: is what actually restricts who can reach it. |
Off until :backup login <username> in the workspace (or narl-workspace proton-login) stores a session under WORKSPACE_DATA_DIR. These only shape how often the mirror runs.
| setting | example | what it does |
|---|---|---|
WORKSPACE_PROTON_DEVICE |
narl-workspace |
The device the server registers in Proton Drive; its sync root is the folder the diary is mirrored into. |
WORKSPACE_BACKUP_INTERVAL_MIN |
60 |
Backstop between runs, in minutes. 0 leaves it change-driven only. |
WORKSPACE_BACKUP_DEBOUNCE_SEC |
300 |
How long the diary must be quiet after a change before it is mirrored, so a writing session uploads once rather than after every save. |
WORKSPACE_BACKUP_PRUNE |
0 |
Set to 1 to let a deletion here trash the mirrored file there. Off by default: a backup that forgets on command is one accident from being none. |
WORKSPACE_SESSION_KEY_FILE |
/run/secrets/session_key |
Seal the stored Proton session under a key kept off the data volume, so a copy of the volume alone carries no usable session. Point it at a Docker secret (see compose.override.yml.example); openssl rand -base64 32 makes the key. Losing the key costs a new proton-login, nothing more. Unset by default. |
Off until WORKSPACE_SMTP_URL is set. Nothing is even queued while it is unset.
| setting | example | what it does |
|---|---|---|
WORKSPACE_SMTP_URL |
smtps://mail.example.org:465 |
The relay. smtps://host:465 is implicit TLS, smtp://host:587?tls=required is STARTTLS, and a bare smtp://host:1025 is plain — which only belongs on a local mail catcher. Credentials may live in the URL or in the two variables below. Unset by default. |
WORKSPACE_SMTP_USER |
See the row above. Unset by default. | |
WORKSPACE_SMTP_PASSWORD |
See the row above. Unset by default. | |
WORKSPACE_MAIL_FROM |
workspace@example.org |
Where the mail comes from and goes to. FROM defaults to TO. Unset by default. |
WORKSPACE_MAIL_TO |
you@example.org |
See the row above. Unset by default. |
WORKSPACE_TIMEZONE |
Europe/Berlin |
"Did I write today?" and "is this due today?" are local-day questions, and the answer changes with the timezone rather than with a fixed offset. |
WORKSPACE_REMINDER_AT |
20:00 |
When to ask about the diary, if nothing was written in it that day. off turns it into no reminder at all. |
WORKSPACE_CARD_DUE_AT |
08:00 |
When to mail about cards that are due today or already overdue. |
WORKSPACE_DIGEST_AT |
sun 18:00 |
Weekday and time of the weekly digest. |
WORKSPACE_MAIL_KINDS |
reminder,card_due,digest,login |
Which of the four kinds may be sent. Drop one from the list to switch it off. |
| setting | example | what it does |
|---|---|---|
WORKSPACE_VAULT_IDLE_MIN |
15 |
Minutes the vault stays open with nothing using it, before it locks itself. It also locks on logout and whenever the server restarts. |
WORKSPACE_TRASH_DAYS |
30 |
Days a deleted document, folder, file or space waits in the trash, where :trash can bring it back, before it and its files are deleted for good. |
WORKSPACE_REVISION_DAYS |
90 |
Days a document's earlier versions are kept for :history. The newest 20 of every document are kept however old they are. |
Written in docs/wiki and published by CI on every push to main; an edit made here is overwritten by the next one.