5.9 KiB
Shijō Saikō no Manga — Greatest of All Time
greatest.html is a second, single-page dashboard. The Japanese title is 史上最高の漫画, romanized Shijō Saikō no Manga (“greatest manga of all time”). It displays the research reading map as ranked five-year cohorts from before 1970 through 2025–2026. Each period keeps its own separator and tile grid.
Each tile shows a four-line Why it matters preview from the editorial rationale; opening the tile shows the complete text under the same heading. The note is a reason for inclusion, not a plot synopsis or a machine-generated rating.
The inclusion rationale should answer why this title belongs in this particular survey: a documented award or record, a demonstrable genre/cultural legacy, exceptional artistic craft, or a clearly labelled editorial fit for this library. A synopsis alone is not sufficient. Do not turn the curator's cohort rank into a claim about an external top-10 poll. The 2025–2026 cohort is deliberately labelled as future-watch or provisional; a recent reader vote is evidence of early enthusiasm, not proof of all-time importance. Specific “first” and record claims need a primary source before publication.
Primary-source checks for selected concrete claims in the seed include Tezuka's Princess Knight archive, Guinness on Golgo 13's volume record, Kodansha's manga-prize history, the 2025 Harvey Award winners, and the official 2026 Next Manga Awards print and web results. Keep award year/category precise when editing the notes. Statements of artistic merit or personal-library fit are editorial judgments, not measurements.
Separation and data ownership
greatest/catalog.jsonis a versioned, read-only editorial seed in the application image. Entries have stable IDs, debut year, cohort, curator rank, rationale, official source lead, and optional AniList cover/chapter/status metadata. It is not part oflibrary/, scraper queue, ordata/catalog.jsoncollections.greatest/index.jsvalidates the seed and performs only exact title/alias matching against the existing library index. A match adds the local cover, chapter count, status and In library badge; it never moves or downloads a title.data/db.jsonholdsgreatestRatings[userName][entryId]. Each account can selectflame,good,neutral, orskip, or click its current choice to clear it. Existing chapter-version votes are separate. Deleting a user removes their ratings. Includedata/db.jsonin backups as before.- The only write route is authenticated
POST /api/greatest/ratingwith{id,rating}(nullclears). AuthenticatedGET /api/greatestreturns the catalog, per-user choice, valid-user community counts, score, and local-library match. Unknown IDs/ratings are rejected. There is no admin-only gate: every account may vote.
Within each cohort, Rank by my vote sorts flame → good → neutral → skull → unrated; Rank by everyone uses 3×flames + thumbs-up − 2×skulls, with curator rank as the tie-breaker. These are preference scores, not independent critical ratings. The quick chips filter by your ratings (or in-library status), even when community sorting is active. The popup shows the full rationale, metadata, official source link, community counts, and a library link where available.
Covers and metadata
The one-time seed is curated from the research document. All 106 catalog entries now have a cover URL. Most were matched to public AniList manga metadata; the five initial gaps were checked individually. Phoenix (1954) and Nausicaä use matching AniList records; Kitarō uses Drawn & Quarterly's Kitaro edition, Someone Hertz uses Shonen Jump's first-volume cover, and Hitoner uses Shueisha's 2026 first-volume cover. Hitoner's AniList 2024 entry represents an earlier work, so it was not used for the 2026 series. The five added URLs returned image content on 2026-10-09, but remote hosts can change them; the UI still shows a title-letter fallback if an image fails.
node tools/enrich-greatest-catalog.js is an optional manual public-AniList metadata refresh, paced at one request every 1.5 seconds. It only accepts matching manga title and original serialization year, leaving uncertain results untouched rather than using a sequel or remake cover. The server makes no metadata calls at runtime. Browser covers are lazy-loaded from their listed source; local library covers take precedence.
Public catalog chapter counts are often absent; the UI says “Chapters unknown” rather than inventing one. For owned titles, the local library count wins. Status comes from AniList's releasing/finished flag or local library metadata, and may be unknown. Official source links may be publisher editions, chapter services, or an award/info lead; they do not imply all chapters are available in every country. No unverified hoster coverage is claimed.
Deployment and QA
The Docker image now copies greatest/ as app code; no new Compose service, volume, port, secret, or migration is needed. Rebuild/recreate reader only to pick up catalog/UI changes. The scraper and sentinel do not need restarting. Existing data/db.json accepts the new greatestRatings object without migration.
Run npm run test:reader for catalog/API tests and node tools/test-greatest-ui.js for disposable headless-browser QA. The UI fixture blocks remote covers and never contacts the scraper. Manual catalog edits should preserve stable IDs once anyone has voted; changing a title's ID strands its votes.