- Dockerfile: build-arg REQUIREMENTS_CHECKSUM verifica lo sha256 del
lockfile (fallisce la build se non coincide; vuoto = skip locale)
- docker-compose.yml: default = hash corrente del lock
- CI: nuovo job checksum.yml che fallisce se il pin non coincide
- Fix YAML preesistente in ci.yml (name: con ':' non quotati)
- Docs: README, .env.example, review aggiornati
- new bookish/services/database.py: SQLite with WAL mode, tables for
bookmarks and reading_positions, keyed by content_hash (SHA256)
- new bookish/routes/api.py: REST endpoints for CRUD bookmarks
and save/load reading position
- upload endpoint returns content_hash (SHA256 of file)
- reader route computes SHA256 and passes BOOKISH_HASH to template
- reader.js: bookmarks + positions use API server as primary storage
with localStorage fallback for offline/resilience
- position saves debounced (1.5s) to avoid hammering server
- .gitignore: added bookish.db
- showToast() displays a centered bottom toast for 3s
- flashBookmarkBtn() pulses the 🔖 button on bookmark creation
- CSS: .reader-toast with slide-up fade-in/out animation
- CSS: .bm-flash with @keyframes bmPulse (scale 1→1.25→1)
- user gets clear feedback when bookmark is saved
- bookmark button 🔖 in toolbar (Ctrl+B / Cmd+B shortcut)
- addBookmark() saves current position (CFI for epub, page for pdf, scroll% for text)
- bookmarks stored in localStorage per-file (bookish_bookmarks_<filename>)
- sidebar Segnalibri tab shows clickable list with delete button
- gotoBookmark() restores the exact position per format type
- CSS styles for bm-entry, bm-label, bm-time, bm-delete
Original SVG at 512x512 had strokes 2-3px → at 28px (navbar)
and 16px (favicon) became ~0.1px, invisible. Simplified to
64x64 with chunky shapes and 2.5px strokes.