Each user gets an own read-ahead queue, served in turn, so two people reading
at once no longer cancel each other's chapter. The report rounds phase times
and measures the quiet time before a slow storage probe correctly.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- docs/deployment.md: step-by-step Docker deployment for anyone (setup,
configuration, LAN/HTTPS/VPN access, adding manga, operation, prebuilt
images, backups, peering, troubleshooting, rules for agents).
- deploy/circus.sh: host helper without Node (status, up/down with queue
pause, logs, pause/resume, update, rescan, restore-test); deploy/compose.https.yml
+ Caddyfile for automatic HTTPS.
- README rewritten for public readers (Docker first, sources/copyright note,
docs index); AGENTS.md + CLAUDE.md for contributors and coding agents.
- Removed notes about one particular installation (Windows host, handoffs,
audits of a private library, benchmarks with local paths, wishlist, reading
map) and the unused ops/proxmox templates; generalized remaining mentions of
hosts, VPN and Windows-only commands.
- Defaults: TZ and reading time zone UTC; .gitattributes keeps shell/YAML LF.
- Personal agent coordination files are git-ignored (CLAUDE.local.md,
.claude/skills/manga-org/).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The stall watchdog now runs inside the scraper (ScraperService.checkStalls,
every 30 s from the work loop): same rule as before, one checkpoint-safe
restart, quarantine on the second stall, missing checkpoint is no evidence,
and paused time no longer counts. Stalls are recorded as scraper incidents
(failure.kind 'stall'). The private /api/recovery endpoint is gone.
Dropped with the service: reader/scraper-unreachable incidents (supervisor
and Docker handle crashes; the health page shows "Scraper: unreachable"),
duplicate job-failure incidents and the unused /metrics endpoint.
The stack is now reader + scraper (+ optional peer-gateway).
The supervisor test moved to runtime/test (npm run test:runtime stays).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The reader owns a scheduled backup into BACKUP (Compose: BACKUP_PATH mounted at
/backup, off when unset). A run pauses the scraper queue through its control
API, waits (bounded) until no job is active, writes a verified tar.gz of DATA
with db.json from memory and scraper/queue.json stored paused, excludes
runtime/lock/pid/temp files, resumes only a queue it paused, then applies
count- or day-based retention to its own archive names only. Schedule,
retention, "Back up now" and last result live in Settings > Service health.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>