# Architecture How `mangabaka-seeder` is built today. Update in the same commit as any structural change. ## Overview No code exists yet. The design is in [`specs/001-webtoons-covers.md`](specs/001-webtoons-covers.md): one pure TypeScript core (`src/core/`) that turns a MangaBaka series link and a Webtoons series link into a cover submission, used by three front ends — a static page served by a small self-hosted Bun server (primary), a userscript, and later a Bun CLI. Replace this section with reality as modules land. ## Map (planned — spec §4) | Path | Responsibility | |---|---| | `src/core/` | Pure pipeline: sources, Wayback history, image inspection, dedupe, seed, MangaBaka client. No DOM, Bun, Node or `GM_*` APIs. | | `src/web/` | Static page UI. | | `src/server/` | Web-standard `fetch` handler (`app.ts`) run by `bun.ts` (`Bun.serve`, behind our reverse proxy). Static assets, `/api/fetch` allowlisted proxy, `/api/upload`. Gate and Workers entry deferred. | | `src/userscript/` | Userscript on mangabaka.org; network via `GM_xmlhttpRequest`. | | `src/cli/` | Later: Bun CLI. | | `test/fixtures/` | Saved real responses; tests never hit the network. | ## Data flow Links → series id + `source.resolve` → current + Wayback candidates → inspect (bytes, size, sha256) → dedupe against MangaBaka → seed → user reviews → rehost (explicit) → submit or manual entry. ## External dependencies | Service | Reached via | If unavailable | |---|---|---| | `api.mangabaka.org` | direct (CORS open) | Nothing works. | | Webtoons HTML / `swebtoon-phinf.pstatic.net` | server proxy or `GM_xmlhttpRequest` | Nothing works. | | Wayback (`web.archive.org`) | same | Warning; current covers only. | | Server storage (S3-compatible bucket) | server | `server` host hidden; litterbox/catbox/direct still work. | | litterbox / catbox | browser directly (litterbox), server or `GM_xmlhttpRequest` (catbox) | That host fails; others still work. | ## Invariants - `src/core/` never imports from `web/`, `server/`, `userscript/` or `cli/`. - The MangaBaka token is only ever sent to `api.mangabaka.org`, never through our server. - Nothing is uploaded or submitted without an explicit user action; saves use `save_mode: "review"`. - `/api/fetch` only fetches allowlisted hosts; `/api/upload` only takes a source URL, never bytes. ## Known rough edges See the open questions in spec §7 and [`TODO.md`](TODO.md).