Commit Graph
60 Commits
Author SHA1 Message Date
MaashkinoozheandClaude Opus 5.5 23a87099c5 Discovery store keeps harvest, settings and nightly state (BL-0051)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 09:00:41 +01:00
MaashkinoozheandClaude Opus 5.5 62ec69bc0d Single-flight discovery harvester with budgets and stop reasons (BL-0051)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 08:58:48 +01:00
MaashkinoozheandClaude Opus 5.5 41437c5321 Discovery anchors and top tags (BL-0051)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 08:52:18 +01:00
MaashkinoozheandClaude Opus 5.5 60a25bacac Discovery AniList client: drop removed recommendations (BL-0051)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 08:51:16 +01:00
MaashkinoozheandClaude Opus 5.5 3e7b1ca49f Discovery AniList client: spec sorts, challenge on 5xx, strict list validation (BL-0051)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 08:50:11 +01:00
MaashkinoozheandClaude Opus 5.5 461a37e924 Rate-limited AniList client for discovery seeds (BL-0051)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 08:47:52 +01:00
MaashkinoozheandClaude Opus 5.5 aad2761dc9 Discovery cache with per-kind TTL and size cap (BL-0051)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 08:45:47 +01:00
MaashkinoozheandClaude Opus 5.5 12c54e5ffb Plan: wider Discovery candidate pool (BL-0051)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 08:41:47 +01:00
MaashkinoozheandClaude Opus 5.5 70a41c4531 Design: wider Discovery candidate pool from AniList (BL-0051)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 08:36:59 +01:00
MaashkinoozheandClaude Opus 5.5 57a571d2f0 WeebCentral and MangaPill are off by default, with an admin switch per source
Both are unofficial sites that mostly host unlicensed copies; MangaDex (official
API) stays on. Settings → Admin → Scraper → Hoster settings has a 'Use <source>'
switch. A switched-off source refuses new jobs, keeps queued jobs waiting and is
skipped by nightly update checks. Installations whose queue or history already
used a source keep it switched on, so upgrades don't stop a working queue.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 07:47:47 +01:00
MaashkinoozheandClaude Opus 5.5 336d3325fe Add the MIT license
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 13:39:37 +02:00
MaashkinoozheandClaude Opus 5.5 6292e35654 deploy/circus.sh: a first 'up' leaves the queue alone instead of reporting it paused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 11:10:39 +02:00
MaashkinoozheandClaude Opus 5.5 f53b92a7dc Prepare the repository for a public release
- 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>
2026-10-24 11:09:00 +02:00
MaashkinoozheandClaude Opus 5.5 7b52da2f9c Official release dates from MangaUpdates; peers lower ecosystem dates (BL-0048, BL-0049)
- scraper/metadata/release-dates.js fills x-dates.release from MangaUpdates
  publisher releases. MangaUpdates also lists English back-catalog re-releases,
  so a date is kept only inside the AniList original run, when no scanlation or
  source upload is more than 4 days earlier, and when it fits the release order
  (no lower chapter dated after a higher one). Seasons that restart chapter
  numbers are skipped; dates this job wrote and no longer accepts are withdrawn.
- The scraper refreshes ongoing series nightly before its update checks, only
  while no download runs, and bumps the publish revision so the reader reconciles.
- tools/release-dates.js for a whole library (dry run default). Production dry
  run: 728 chapters dated (Kagurabachi, JJK, Chainsaw Man, One Piece from 928).
- Peer sync: chapters this library already has adopt a peer's earlier ecosystem
  date (job result ecosystemLowered); the peer listing now carries dates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 08:47:36 +02:00
MaashkinoozheandClaude Opus 5.5 e0dacd81c6 Chapter dates: read date setting and tiered release dates (BL-0047)
- Chapter rows show when you first finished a chapter (setting: date + hour,
  date, off) from a new durable progress doneAt; older reads fall back to the
  reading clock's earliest remembered completion.
- chapter.json keeps added (arrival in this library, now kept on replace) plus
  x-dates.source (source upload, bulk imports flagged), x-dates.release
  (official, for a later metadata job) and x-dates.ecosystem (first entry into
  any Manga Circus library; carried over peering, earliest wins, clamped).
- Rows show one release date by tier: official > source upload > ecosystem >
  library, with all known dates in the tooltip (setting to hide).
- Fixes: WeebCentral dates came from the chapter page, which has none (every
  chapter got the download time); they now come from the full chapter list.
  MangaDex no longer writes a group's publishAt into added. Peering sends dates.
- tools/backfill-chapter-dates.js migrates an existing library (dry run default).
- Coverage dry run on the server: docs/chapter-dates-coverage-2026-10-24.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:01:33 +02:00
MaashkinoozheandClaude Opus 5.5 b2bb34174c Fold the sentinel into the scraper and drop the sentinel service (BL-0046)
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>
2026-10-22 22:58:03 +02:00
MaashkinoozheandClaude Opus 5.5 88555d4780 Document the measured first-scan speed on the server (BL-0043)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:07:30 +02:00
MaashkinoozheandClaude Opus 5.5 5e14e54286 Faster first library scan: bounded concurrency and a 32 KB first read
An uncached scan probed one image at a time and read 256 KB of each. On
a NAS that is bound by per-file latency (the server/Synology: ~20 ms per
image, ~100 min for 298k images). Now chapter folders of a book and
their images are probed SCAN_CONCURRENCY (default 8, 1-64) at a time
and assembled in folder order, and imageSize() reads 32 KB first, then
256 KB, then the whole file: a prefix gives either no size or the same
size, so results do not change. Tests: every format and read stage
equals the whole-file answer; concurrency 1 and 8 build the same index
and cache; the limiter keeps its bound and per-task errors. (BL-0043)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:07:29 +02:00
MaashkinoozheandClaude Opus 5.5 d6254a8be5 Admins can grant or revoke admin rights in Settings (BL-0045)
New POST /api/admin/user/role {name, admin}: admin-only (checked on the
server), keeps the password and sessions, takes effect on the target's
current session at once, logs who changed whom. Revoking your own
rights is refused, so at least one admin always remains. Settings ->
Users & access shows "Make admin" / "Remove admin" next to every other
user, with a confirmation. Test: normal users and anonymous callers are
refused, input checks, promotion and revocation apply immediately and
are saved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:35:04 +02:00
MaashkinoozheandClaude Opus 5.5 f8f21ab42a Backup: probe the target with a real write instead of access(W_OK)
On the server the backup folder is a Synology NFS share with "map all
users to admin": access(W_OK) returns EACCES for uid 1000 although
writes succeed, so the first scheduled run failed with "not usable".
Create and remove a probe file instead; test that it leaves nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:12:41 +02:00
MaashkinoozheandClaude Opus 5.5 086f6353f8 Add built-in backup of the data folder (BL-0044)
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>
2026-10-22 18:03:21 +02:00
Codex fcc50d576c Record main reading-hours settings release 2026-10-14 22:44:39 +02:00
Codex ddd9c62c40 Show read-only server reading hours in settings 2026-10-14 22:42:54 +02:00
Codex de8e7ed988 Record main reading limiter cutover 2026-10-14 22:24:20 +02:00
Codex e944a87b42 Allow reader-only release selection in Compose 2026-10-14 22:22:56 +02:00
Codex 77553bbece Style reading quiz feedback by result 2026-10-14 21:48:31 +02:00
Codex f607994a5d Reset stale reading challenges after navigation 2026-10-14 15:36:43 +02:00
Codex d8eba9169f Add deployment reading windows and progress-aware quiz unlock 2026-10-14 15:34:55 +02:00
Codex edbc9c6056 Handle large WeebCentral catalogs and correct MangaPill checkpoint monitoring 2026-10-14 14:01:05 +02:00
Codex 0d51f214d5 Test paused-source confirmation through reader UI 2026-10-14 09:44:01 +02:00
Codex b96ab42add Allow queued confirmation during source pause 2026-10-14 09:42:21 +02:00
Codex a22913129a Preserve per-source pacing across queue jobs and add source pause 2026-10-14 09:23:04 +02:00
Codex a08e847932 Add first-party MangaPill source and distinct volume releases 2026-10-14 09:05:34 +02:00
Codex a8df57f165 Recognize additional WeebCentral chapter labels and record source pilot 2026-10-13 23:58:33 +02:00
Codex 6d713e0a8c Keep source plugins in single scraper process 2026-10-13 22:42:20 +02:00
Codex 0fc1a7b52a Mark sparse MangaDex hosted catalogs as partial 2026-10-13 22:01:57 +02:00
Codex 47de081721 Checkpoint peering identity and opt-in discovery 2026-10-13 22:00:54 +02:00
Codex eba9b50e30 Record source pilot boundaries and upstream decision 2026-10-13 21:58:58 +02:00
Codex 1c61686c9b Checkpoint opt-in MangaDex parser worker 2026-10-13 21:57:59 +02:00
Codex 93f07e838e Fix pinned lookup for dual-stack HTTPS requests 2026-10-13 21:53:59 +02:00
Codex cc2fd05062 Document and package opt-in source worker 2026-10-13 21:52:22 +02:00
Codex f4123b32e4 Checkpoint guarded source request broker 2026-10-13 21:51:03 +02:00
Codex 6599d0a244 Validate first-party parser boundaries 2026-10-13 21:47:18 +02:00
Codex c5a92282a9 Checkpoint first-party source parser pilot 2026-10-13 21:45:27 +02:00
Codex 605fa5b9d8 Add per-user page tone modes to reader 2026-10-12 23:49:02 +02:00
Codex 26d6cd59fc Repair metadata title on queue retry 2026-10-11 09:09:37 +02:00
Codex a500ea7c3f Use inspected manga title for metadata lookup 2026-10-11 09:07:42 +02:00
Codex da40d73f02 Redesign admin peering settings and catalogs 2026-10-11 01:06:03 +02:00
Codex 492477f86a Add scoped peer access and reversible serving controls 2026-10-11 00:25:14 +02:00
Codex 6c994113c6 Plan Discovery Scout recommendation architecture 2026-10-09 19:23:19 +02:00