Money columns always come in pairs — NUMERIC(12,2) amount + CHAR(3) ISO
currency — and store the original amount; display conversion is a reading
layer (Money & currencies). price_fx_rate
(also on preorders) is the currency → EUR rate frozen when the cost was
recorded, powering the drift-free plus-value; NULL (pre-v0.23 rows) falls
back to today's rate.
The link itself lives on users — manga_server_id (→ manga_servers) + manga_slug. The join to the catalogue is series.mal_id (populated from the AniList idMal), so a figure's series and a MangaCollector library entry line up with no manual mapping. Cross-link fetches only fire when the linked server is approved.
Per-user credentials for the MCP endpoint. The 16-hex prefix is public and uniquely indexed (it's the lookup handle); secret_hash is a SHA-256 of the 256-bit secret, which is never stored. Revoked by stamping, never deleted, so the audit trail's foreign key stays resolvable
mcp_audit_log
One row per MCP tool call, resource read or refusal. args_digest is a SHA-256 of the arguments, never the arguments themselves — they carry prices, private notes and shop names, and the trail is read back into the owner's own UI. Pruned past 90 days
All migrations live in server/migrations/ as plain .sql files, wrapped by server/src/migration/m2026*_*.rs modules. The SeaORM MigratorTrait runs them in lexical order on backend boot.
Idempotent by design (IF NOT EXISTS, OR REPLACE), so a restart is always safe.