722 B
722 B
Architecture
FastAPI with Jinja2, rendered on the server. SQLite through dataset, synchronous and deliberately without a threadpool. Sessions with PBKDF2-SHA256 passwords.
Layers
molodetz/database/: one file per subject, always import from the package root.molodetz/routers/: mirrors the URL path.molodetz/services/: background services under one supervisor with a file lock.molodetz/templates/: one Jinja environment intemplating.py.
Deleting
Everything is soft deleted with deleted_at and deleted_by. Only cleanup jobs delete for real.
Static files
Assets go through static_url(), which versions them under /static/v<version>/. Those are immutably cacheable for a year.