PROJECT 06 / 18BROWSER PRODUCTTYPESCRIPT

Released · v1.2.2

ManwhaTrack.

Your reading history, remembered on your own device.

80%automatic detection gate
85%default completion threshold
IndexedDBlocal library storage
01 / IDEA02 / SYSTEM03 / PLAYGROUND04 / DECISIONS05 / SOURCE
01 / THE IDEA

A closer look.

A local-first Chrome extension for manhwa, manga, webtoons and web novels. It detects reading pages, records actual reading progress and restores unfinished chapters, with a side panel and full library backed by IndexedDB.

Opening a chapter and finishing it are different events. ManwhaTrack treats detection, progress, completion and resume position as distinct pieces of state so the library reflects what a reader actually did.

01

Layered page recognition

Site adapters and theme adapters handle known readers; a generic detector combines URL, DOM, image and prose signals. High-confidence observations track automatically, while borderline pages remain a manual choice.

02

Progress that survives real reading

A lightweight content script measures the reader container or paged-reader progress. It saves a separate viewport position, pauses active time on blur or idle, and sends versioned chapter updates.

03

A local library with ownership

IndexedDB stores series, sources, chapters, events and covers. Custom lists, notes, tags, manual corrections, backup and analytics remain local; manual metadata wins over subsequent detections.

04

Continue with context

Resume restores an unfinished scroll reader to a saved anchor where possible. Continue chooses the next chapter or unfinished chapter rather than treating every visit as a completion.

02 / UNDER THE SURFACE

A chapter visit becomes durable reading state

Inspect detection, authorization, active progress and the independent resume path.

DRAG TO PAN · SELECT A NODE · + / − TO ZOOM

Read the architecture as text
  1. Reader page — The content entrypoint runs only in the top frame on HTTP(S) pages. allowed checks incognito preference, ignored hosts and whether the extension is still active.
  2. DOM + route watcher — Page watching re-runs detection after route changes or delayed reader content. The content entrypoint tracks a generation counter so old async replies cannot attach to a new page.
  3. Adapter cascade — detectPage tries a matched site or theme adapter, then generic detection. A known chapter page waiting for client rendering returns low confidence instead of a generic guess.
  4. Generic signals — The fallback gathers structural reading signals and a confidence score when a purpose-built adapter cannot identify the page.
  5. PageObservation — An observation carries page kind, confidence, evidence, adapter ID and optional series/chapter metadata. Adapters produce observations and never persist them.
  6. Message boundary — The worker sanitizes observations, checks sender origin and applies incognito/ignored-host policy. A policy epoch revokes in-flight writes when permission changes.
  7. Track or observe — persistObservation writes automatically only at confidence >= 0.8. Explicit manual tracking can accept a medium-confidence observation.
  8. Active progress — ReaderProgress measures visible reading only while active. Furthest progress is monotonic; active time stops after 90 seconds idle. The default completion threshold is configurable.
  9. Viewport anchor — Reading position is captured independently from furthest-read progress. A user can scroll backward and save an earlier viewport without making the chapter less read.
  10. Revision fence — Messages carry progressRevision. A stale revision resets the content tracker to the authoritative chapter state; blocked updates stop tracking and re-resolve ownership.
  11. Completion event — recordProgress completes a chapter once maxProgress crosses the configured threshold. Clicking the detected next-chapter link provides another explicit completion signal.
  12. Atomic local writes — withTx groups related writes in IndexedDB. A write guard can abort a transaction after policy revocation; no external fetch is awaited inside the transaction.
  13. Library + analytics — The side panel consumes shared local state for continuing, organizing and inspecting series. The expanded library uses the same records.
  14. Resume intent — A deliberate Resume action authorizes position restoration for a chapter. Ordinary visits do not automatically scroll the page.
03 / INTERACTIVE STUDY

Opening is not finishing

Move confidence and reading progress through a simplified version of the extension’s two independent gates.

CHANGE THE INPUTS

Illustrative state model: automatic tracking at 80% confidence; default completion at 85% progress. Real completion also requires active reading and current revision, or an explicit next-chapter click. No browsing data is collected here.

ILLUSTRATIVE MODELLIVE

04 / ENGINEERING CHOICES

Why it works this way.

01

Detection does not write

Adapters return a PageObservation; the service worker sanitizes and authorizes it before persistence. This keeps recognition separate from the extension’s storage trust boundary.

02

Progress and position have different semantics

Furthest-read progress only increases, but a saved viewport can move backward. This preserves an honest completion history while resuming at the place the reader actually left.

03

Local storage with revocable writes

Related records share IndexedDB transactions. Incognito/host-policy changes invalidate pending writes, while manual metadata remains authoritative over later automatic detections.

05 / OPEN THE SOURCE

Trace it back.

Implementation details, examples, and project documentation.

Scope & limitations

  • Site markup changes can break an adapter. Generic detection is confidence-based and does not claim universal compatibility with protected or unusual readers.
  • Scroll readers can restore saved viewports; paged/canvas readers resume the chapter without automatic page navigation. Release availability does not establish Chrome Web Store approval.

Architecture and descriptions reflect the linked repository snapshot. The playground explains a mechanism; it does not execute the repository or report measured performance.