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>
Foundation & Identity backend for ThoughtSync:
- Quart app factory (create_app) with /api/health + SPA history-fallback
- async SQLAlchemy 2.0 + asyncpg engine/session (lazy; boots without a DB)
- native email+password auth via signed-cookie session (register/login/logout/me
+ login_required guard); bcrypt password hashing (72-byte safe)
- multi-user sharing-ACL spine (rule 47): users, groups, group_members, and a
polymorphic shares table + visible_to_user() SQL predicate (owner OR direct
share OR group share) that M1's notes will scope through
- Alembic async env (adapted from family pattern) + 0001 foundation migration
- DB-free unit tests (app/health/auth-guard, password roundtrip, ACL compile)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FRgehjoz7Yv8LkUfADxACm