Step 2 of milestone 481. The operator chose a full rename (Scribe note 5071), so
this goes past the display strings into the identities:
- src/thoughtsync → src/inkwell; every import, the Dockerfile and both compose
commands, alembic env, pyproject
- THOUGHTSYNC_* → INKWELL_* (database URL, secret key, log level, tag/port/bind)
- container data dir /var/thoughtsync → /var/inkwell
- image git.fabledsword.com/bvandeusen/inkwell; Postgres user/db default inkwell;
CI's integration service follows
- the files the image serves are inkwell.*. fetch-clients.sh still fetches the
thoughtsync-named release assets, because the lanes that publish them are
renamed in steps 3 and 4
- exports are written with app "inkwell"
Two deliberate exceptions, both because data rides on them:
- compose volumes are now named explicitly and overridable (INKWELL_DB_VOLUME,
INKWELL_DATA_VOLUME), so a deployment installed as ThoughtSync points at the
volumes and DB identity it already has. .env.example says exactly what to set
- import still accepts app "thoughtsync", because exports written before the
rename are backups. Tested both ways
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- users.is_admin; first registered user becomes admin; registration gated by the
allow_registration setting (first account always allowed). is_admin in
/api/auth/* responses; require_admin guard (live DB check).
- settings table + code registry (site_name, allow_registration, session_ttl_days)
with typed defaults — empty table = all defaults (rule 26). get/set/validate
service; GET /api/config (public) + GET/PATCH /api/settings (admin), live
session-TTL apply with no restart (rule 25).
- Cookie-signing secret now persisted in the DB (before_serving load-or-create),
so sessions survive restarts with no volume. Config: DATABASE_URL is the only
required env; SECRET_KEY + DATA_DIR are optional break-glass items.
- Migration 0003; DB-free tests for settings validation + admin guard.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FRgehjoz7Yv8LkUfADxACm