BREAKING: replace legacy API keys with device tokens via pairing flow.
- Server: /api/client/pair, revoke, me endpoints; server_sequence + tombstones + idempotency
- Desktop client: PairDevice, GetMe, RevokeCurrent; auto-sync loop every 60s
- Config: device_token stored in separate file (0600), not config.yml
- Client DB: last_pull_seq migration for incremental pull
- Frontend (Svelte): settings modal with connect/disconnect/interval
- User dashboard (/dashboard): device list with status, revoke with password
- Admin dashboard (/admin/dashboard): devices table from /admin/api/devices
- CLI (cmd/verstak): updated for ServerSequence/GetState changes
- Fix: autoSyncLoop falls back to SQLite sync_state for server URL
- Fix: SyncSetInterval preserves server_url/device_id from SQLite
- POST /api/v1/sync/push — accepts ops, assigns revisions, returns accepted list
- POST /api/v1/sync/pull — returns ops since given revision with server_revision
- POST /api/v1/blobs/ — multipart upload, stored as blobs/ab/cd/sha256
- GET /api/v1/blobs/{sha256} — download by hash
- server_blobs table for tracking stored blobs