Skip to content

A reader people finish, and a library that remembers where they stopped

A reading platform for a comics catalog: a browse surface people can actually navigate, a reader that gets out of the way, and a history that puts everyone back on the page they left.

GutterlineSeries, authors, publishers/
ASAiko Sato6 series in progress
12 series
Status: OngoingType: Official translationChapters: 30–250Latest chapter
Ongoing, officially translated, 30 to 250 chapters · one indexed query/browse/ongoing/official-translation?chapters=30-250 Copy link
2 newCh. 42 · p.18

Ashfall Harbour

Juno Harte · 46 ch

Ch. 9 · p.14

Lanternwake

Tamsin Kilroe · 64 ch

Ch. 117 · p.6

Salt & Cinder

Oren Pike · 131 ch

Ch. 3 · p.27

Moth Hour

Ilse Varga · 38 ch

Ch. 61 · p.2

The Quiet Signal

Cato Min · 72 ch

Ch. 88 · p.21

Glasshouse Rebels

Juno Harte · 96 ch

The Cartographer’s Debt

Wren Adaire · 57 ch

Wirehollow

Oren Pike · 203 ch

Ninefold Cranes

Tamsin Kilroe · 44 ch

Undertow Academy

Cato Min · 118 ch

Ferrous Bloom

Ilse Varga · 88 ch

Last Train to Oriel

Juno Harte · 81 ch

Showing all 12 of 12 Your place in the chapter New since your last visit

The brief, in specifics

Industry
E-commerce & Retail
Duration
18 weeks
Cooperation model
Fixed price, phased
Services
Platform engineeringReader experienceEditorial tooling
Integrations
Cloudflare ImagesAlgoliaStripe BillingPostmark
Technologies
Next.jsTypeScriptPrismaPostgreSQLLaravelTailwind CSSNextAuth
Team
1 Project lead2 Full-stack engineers1 Product designer1 QA engineer

Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.

The hard problem

  • A catalog is four levels deep (series, volume, chapter, page), and every surface that flattened it lost people. Readers couldn't find where they had stopped, so a series abandoned at chapter nine was rarely resumed.

    Readers couldn't find where they had stopped. Position was recorded per series instead of per chapter, so a series abandoned at chapter nine resumed at chapter one or at the latest release, neither of which is where the reader was. In the analytics that showed up as a cliff: series opened twice and never a third time.

    A browse surface built on the real hierarchy, with filters that compose; a reader tuned for long sittings; and a reading history that turns a half-finished chapter into an obvious next action instead of something to hunt for.

The solution

How the pieces fit

  1. 01

    Modeled the catalog at its real depth: series, volume, chapter, page

    The catalog is modeled at its real depth, so nothing about browse has to pretend a volume and a chapter are the same kind of thing.

  2. 02

    Built browse as composable filters over genre, status, author and publisher

    The filter set was cut down from what the catalog could support to what readers actually combined: five dimensions out of eleven.

  3. 03

    Tuned the reader for uninterrupted sittings, with keyboard as a first-class input

    The reader hides its chrome until intent, preloads ahead of the reading position, and offers the next chapter at the boundary.

  4. 04

    Recorded reading position per chapter so resuming is one action

    Position is held per chapter per reader and surfaced wherever the series appears, so resuming is a button, not a search.

  5. 05

    Gave editors the tooling to publish a chapter without an engineer

    Editors stage, order and schedule a chapter without an engineer, with pages derived into reading sizes on ingest.

Introduction

The system we were asked to build

A large comics catalog was losing readers between finding a title and reading it. We built the browse surface, the reader, and the editorial tooling behind both.

A large comics catalog with healthy traffic and poor conversion into actual reading. The structure is four levels deep (series, volume, chapter, page), and every surface that had flattened it for simplicity had lost people at the level it removed. The engagement covered browse, the reader and the editorial tooling, because the three were failing as one system.

Platform & Product Engineering

Composable filters

Genre, status, type, author and publisher narrow together, and every combination is a real linkable state.

Genre, status, type, author and publisher stack on top of each other, and every combination is a real URL with its own server-rendered page. A filtered view can be linked, shared and indexed, where before it existed only in someone's session. Counts update with the selection so a dead-end combination is visible before it's chosen, and the query is one indexed pass over the catalog.

What shipped
  • Filters compose; every combination is a linkable URL
  • Server-rendered, so filtered views are shareable and indexable
  • Live counts, so a dead-end combination is visible in advance
GutterlineSeries, authors, publishers/
ASAiko Sato6 series in progress
Filters
5 dimensions · counts update with every choiceClear all
GenreAny
Drama5
Action5
Mystery3
Fantasy3
Sci-fi3
Comedy2
Romance2
Horror1
Slice of life1
Sports0 Nothing leftNo ongoing, translated series of 30–250 chapters is tagged Sports.
Status1 chosen
Ongoing12
Completed9
On hiatus3
Chapters published30–250
30 chapters250 chapters
Type1 chosen
Official translation12
Original English4
Vertical scroll5
One-shot0
AuthorAny
Juno Harte3
Tamsin Kilroe2
Oren Pike2
Ilse Varga2
Cato Min2
Wren Adaire1
PublisherAny
Kitebird Press4
Lamplight Comics3
Northvane3
Paperwing2
Hollowbrook Books0

What a count means

How many series you would see with that option added to everything already chosen.

3 dead ends shown

Sports, One-shot and Hollowbrook Books would leave nothing, so you can see that before choosing.

Status: OngoingType: Official translationChapters: 30–250Show 12 series
On screen

The filter panel across its five dimensions, each option with a live count. Sports, One-shot and Hollowbrook Books show zero, so the dead end is visible before anyone picks it, and the combination copies as a link to its own server-rendered page.

Ashfall HarbourVol. 3 · Ch. 42 · The Drowned ClockRight to left · fit heightPosition saved · p.18
18 / 29
After page 29Ch. 43 · Nightfreight
←→ turnF fitH hide bars Pages 19–22 preloadedThe last page offers chapter 43, not the chapter list
On screen

The reader on page 18 of 29 of Ashfall Harbour's chapter 42. The artwork sits on near-black and the bars fade in only on pointer movement. The position is already saved, the pages ahead are preloaded, and the end of the chapter offers chapter 43.

A reader for long sittings

Pointer or keyboard, no chrome in the way, and a chapter boundary that offers what comes next.

The reader is built for two hours, not two minutes: pointer or keyboard, chrome that gets out of the way and comes back on intent, and pages preloaded ahead of the reading position so a turn never waits. Position is written continuously as pages turn, and the boundary between chapters offers the next one instead of returning the reader to a listing.

What shipped
  • Pointer and keyboard equally, chrome hidden until intent
  • Pages preloaded ahead of position, so turns never wait
  • Chapter boundary offers what comes next

Resume, not search

Reading position is held per chapter and surfaced wherever the series appears.

Reading position is held per chapter per reader and surfaced everywhere the series appears (the card in a rail, the series page, the home screen), so a half-finished chapter is a button, not something to hunt for. Progress writes optimistically and reconciles, so it survives a closed tab, and a finished series is marked finished instead of looking abandoned.

What shipped
  • Position held per chapter and surfaced wherever the series appears
  • Optimistic writes that survive a closed tab
  • Finished series marked finished, never left looking abandoned
9:41
Library
In progress · 6FinishedSaved
Ashfall HarbourCh. 42 · p.18 of 2962% into the chapter3 days agoResume
Salt & CinderCh. 117 · p.6 of 2425% into the chapterYesterdayResume
Glasshouse RebelsCh. 88 · p.21 of 2391% into the chapter5 days agoResume
LanternwakeCh. 9 · p.14 of 3145% into the chapter14 days agoResume
Moth HourCh. 3 · p.27 of 4068% into the chapter9 days agoResume
The Quiet SignalCh. 61 · p.2 of 1911% into the chapter3 weeks agoResume
HomeBrowseLibrarySaved
On screen

The library on a phone: six series in progress, each with its exact chapter and page, how far into the chapter that is, and a Resume button.

GutterlineSeries, authors, publishers/
ASAiko Sato6 series in progress

Latest

ComputedChapters by publication timeSee all
New

Ashfall Harbour

Ch. 46 · 2h

Salt & Cinder

Ch. 131 · 5h

Wirehollow

Ch. 203 · 8h

Undertow Academy

Ch. 118 · 1d

Glasshouse Rebels

Ch. 96 · 1d

Brineheart

Ch. 212 · 1d

The Quiet Signal

Ch. 72 · 2d

Lanternwake

Ch. 64 · 2d

Ferrous Bloom

Ch. 88 · 3d

Last Train to Oriel

Ch. 81 · 3d

The Cartographer’s Debt

Ch. 57 · 4d

Ninefold Cranes

Ch. 44 · 4d

Moth Hour

Ch. 38 · 5d

Newest

ComputedSeries by the date they joined the catalogSee all

Vesper Relay

Added 09/16

Orchard of Knives

Added 09/15

Saltmarsh Choir

Added 09/12

Moth Hour

Added 08/30

Ninefold Cranes

Added 08/22

Ashfall Harbour

Added 08/09

The Cartographer’s Debt

Added 07/28

Lanternwake

Added 07/14

Ferrous Bloom

Added 06/30

The Quiet Signal

Added 06/11

Last Train to Oriel

Added 05/27

Undertow Academy

Added 05/03

Glasshouse Rebels

Added 04/19

Popular

ComputedView counts, decayed so older views weigh lessSee all
1

Salt & Cinder

2

Wirehollow

3

Brineheart

4

Glasshouse Rebels

5

Undertow Academy

6

Ashfall Harbour

7

The Quiet Signal

8

Ferrous Bloom

9

Last Train to Oriel

10

Lanternwake

11

The Cartographer’s Debt

Trending

ComputedRate of change in readers, not the totalSee all
1

Vesper Relay

2

Ashfall Harbour

3

Moth Hour

4

Orchard of Knives

5

Ninefold Cranes

6

Saltmarsh Choir

7

The Cartographer’s Debt

8

Lanternwake

9

Ferrous Bloom

10

Last Train to Oriel

11

The Quiet Signal

Computed from reading events, none curated by hand. Salt & Cinder leads Popular and is absent from Trending: many readers, steady rate.
On screen

The home rails: latest, newest, popular and trending, each labeled with the rule that computes it. Popularity is a decayed view count and trending is rate of change, so the series that leads Popular is missing from Trending.

Ranked rails

Latest, newest, popular and trending, each computed from reading data.

Latest, newest, popular and trending are computed from real events, with no hand curation: recency from publication, popularity from a decayed view count, trending from the rate of change instead of the total. That's what stops one perennial hit occupying every rail forever, and it means the front page changes because the readership did.

What shipped
  • Rails computed from events, none hand-curated
  • Popularity decayed over time; trending from rate of change
  • No perennial hit permanently occupying every rail
Release queue8 chapters staged · 1 held · publishes on its slot, no deployPreview as readerStage a chapter

Staged chapters

Sorted by slot
ChapterSlotOwnerReviewPages
Ashfall Harbour · Ch. 47The Lamp Room
Today · 6:00 PMMara QuillApproved31
Salt & Cinder · Ch. 132Cinderfall
Today · 9:00 PMDev OkaforApproved24
The Quiet Signal · Ch. 73Carrier Wave
09/18 · 7:00 AMMara QuillIn review19
Wirehollow · Ch. 204Live Wire
09/18 · 12:00 PMLior BattIn review22
Moth Hour · Ch. 39Pages 17–19 missing
09/18 · 6:00 PMInes CalderHeld37/40
Undertow Academy · Ch. 119Riptide Exams
09/19 · 8:00 AMDev OkaforApproved21
Lanternwake · Ch. 65Wick and Oil
09/19 · 5:00 PMInes CalderIn review31
Glasshouse Rebels · Ch. 97Greenhouse Riot
09/20 · 10:00 AMLior BattIn review23

Next four days

Readers see nothing until the slot

Today

6:00 PM · Ashfall 479:00 PM · Salt 132

09/18

7:00 AM · The 7312:00 PM · Wirehollow 2046:00 PM · Moth 39

09/19

8:00 AM · Undertow 1195:00 PM · Lanternwake 65

09/20

10:00 AM · Glasshouse 97

At its slot a chapter appears in the rails and in every subscriber’s continue list without a rebuild. A held chapter keeps its place in the queue and does not publish.

Page order

Drag to reorder
Ashfall Harbour · Ch. 47The Lamp Room · 31 pages · Mara Quill6:00 PM
123Drop5678910111213141516171819+12
12 → 4
31 of 31 uploaded straight to storageReading sizes derived on ingest
Invisible to readers until Today · 6:00 PMSave order

Editorial publishing

On screen

The release queue an editor publishes from: eight chapters staged with slot times, owners and review state. Moth Hour's chapter is held because three pages are missing, and the page order of the next release, Ashfall Harbour chapter 47, is open mid-drag.

Stage a chapter, order its pages, schedule it. No engineer required.

An editor stages a chapter, orders its pages by drag, sets a publication time and walks away. No engineer, no deploy. Pages upload directly to storage and are derived into reading sizes on ingest. A scheduled chapter is invisible until its moment and then appears in the rails and in every subscriber's continue list without a rebuild.

What shipped
  • Stage, order and schedule a chapter without an engineer
  • Direct uploads derived into reading sizes on ingest
  • Scheduled chapters appear in rails and resume lists without a rebuild
Process

Phase by phase

  1. Phase 1: Catalogue Modelling

    Four Levels, Kept Distinct

    Modeled series, volumes, chapters and pages as separate entities instead of collapsing them, so a volume-only release and a chapter-only release are both expressible.

    • Catalogue Schema
    • Taxonomy Model
    • Editorial Field Guide
  2. Phase 2: Browse and Filters

    Filters That Compose

    Built browse over the taxonomy (genre, status, type, author, publisher), with every combination a real, linkable state instead of a client-side narrowing.

    • Browse Surface
    • Composable Filter State
    • Ranked Rails
  3. Phase 3: The Reader

    A Page Turn With Nothing In The Way

    Built the reading panel for long sittings: page turn by pointer and by keyboard, chapter boundaries that offer the next chapter, and no chrome competing with the artwork.

    • Reader Panel
    • Keyboard Navigation
    • Chapter Boundary Handling
  4. Phase 4: Memory

    Bookmarks and Reading Position

    Recorded position per chapter and surfaced it on the series card, so a reader returning after two weeks resumes instead of searching.

    • Reading History
    • Bookmark Library
    • Resume Surface
  5. Phase 5: Editorial Tooling

    Publishing Without An Engineer

    Built the admin surface so an editor can stage a chapter, order its pages and publish on a schedule without a deployment.

    • Editorial Console
    • Page Ordering Tool
    • Scheduled Publishing
GutterlineSeries, authors, publishers/
ASAiko Sato6 series in progress

Volumes & chapters

3 volumes · 46 chaptersOldest first
Volume 1The Grey QuayCh. 1–16Read · 16 of 16
Volume 2Lamps Under WaterCh. 17–32Read · 16 of 16
Volume 3The Tide LedgerCh. 33–469 of 14 read · reading Ch. 42
33Low Water26 pp
34The Harbourmaster’s Key24 pp
35Ropewalk28 pp
36Two Lanterns25 pp
37Soundings27 pp
38What the Gulls Saw23 pp
39Salvage Rights30 pp
40The Breakwater Wall26 pp
41A Ledger in Ash28 pp
42The Drowned Clock29 ppp.18 of 29Resume
43Nightfreight25 ppUnread
44Signal Fire27 ppUnread
45The Cutter24 ppNew since your last visit
46Harbour Lights31 ppNew since your last visit
On screen

Ashfall Harbour opened at volume three: volumes one and two collapsed and ticked off, chapter 42 carrying the reader's position at page 18 of 29, and chapters 45 and 46 badged as new since the last visit.

What it carries now

+34%

Chapter completion rate

+61%

Series resumed after a week

−72%

Time to publish a chapter

4 levels

Catalogue depth

Chapter completion is the share of opened chapters read to the last page, compared across the quarter before and after. Series resumed after a week is the share of readers returning to a partly-read series between seven and thirty days later. Time to publish a chapter is measured from an editor beginning to the chapter being live.

Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.

What it settled

What the architecture settled

04
  1. 01

    Flattening a four-level catalog loses people at every level you removed.

    Every level flattened for simplicity is a level readers then have to reconstruct themselves, and the loss shows up exactly where the flattening happened.

  2. 02

    A filter combination that can't be linked to is a filter combination nobody shares.

    An unlinkable filter combination can't be shared, indexed or returned to, which removes most of the value of having built the filters.

  3. 03

    Reading position is the single highest-value thing a reading platform can remember.

    Position per chapter is the single most valuable detail this kind of platform can remember. It converts a lapsed reader into a one-tap return.

  4. 04

    Editorial tooling is product work. A publishing step that needs an engineer becomes a bottleneck the week you succeed.

    Editorial tooling is product work: the publishing step that needs an engineer is fine at ten chapters a week and fatal at a hundred.

Ways of working

How the work was run

01
  1. 01

    We rebuilt browse and the reader first and shipped them behind a flag to a tenth of readers, which is where the resume behavior proved itself: it moved completion before any of the editorial tooling existed. The admin surface followed once the reading side was settled.

    Phased across eighteen weeks with the editorial tooling in its own phase, not bolted on as a final step, because a publishing flow that needs an engineer becomes the bottleneck the week the platform succeeds. Reader work was validated on long sittings: the failure being fixed only appears after forty minutes of reading.

One reader, a fortnight later

Remember the series and readers start over. Remember the chapter and they resume.

The same reader returns to Lanternwake fourteen days after stopping partway through chapter nine: once under the old per-series position, once under the per-chapter position the rebuild writes. Switch tabs, or use the arrow keys once one is focused.

One position for the whole series, and no page inside chapter 9 to go back to. The series card opens at the start; the new-chapter alert opens at the latest release.

Lanternwake

Tamsin Kilroe

Last read 14 days agoCh. 9, page 14 of 31

  1. Returning after 14 days
  2. Reading the stored position
  3. Landed

What was stored

reader · series(lanternwake)

64 chapters · where the reader was, and where they landed

Stopped · Ch. 9, p.14
Ch. 1Ch. 64 · latest
Landed · Ch. 1Landed · Ch. 64
From the series cardChapter 1, page 1Back to the start: chapters 1 to 8 again, already read.
From the new-chapter alertChapter 64, page 1The latest release, 54 unread chapters past where they were.

Why it failed before: position was written per series, not per chapter, so there was no page inside chapter 9 to return to.

Architecture

From an editor’s upload to a reader’s continue list

Publishing and reading share one catalog. The editor’s side does its work once, on the way in, and the reader’s side reads what's already there, so a chapter going live needs neither an engineer nor a deploy.

  1. 01 · Source
    Editor stages a chapterPages upload directly to storage and the editor orders them by drag. No engineer, no deploy.
  2. 02 · Ingest
    Reading sizes derivedPages are derived into reading sizes on ingest, not when a reader first asks for them.
  3. 03 · Schedule
    Scheduled publishA scheduled chapter stays invisible until its moment, however early the editor finished staging it.
  4. 04 · State
    PostgreSQL via PrismaSeries, volume, chapter and page as four separate levels, plus reading position per chapter per reader and the events the rails are computed from.
  5. 05 · Delivery
    Server-rendered surfacesBrowse, rails and continue lists render on the server. Every filter combination is a linkable page, and a published chapter appears without a rebuild.

What goes live, and what is kept

Release timing & reading-position integrity

Invisible until its moment

A scheduled chapter is not shown to readers before its publication time. At that moment it appears in the rails and in every subscriber’s continue list, without a rebuild.

Progress that survives a closed tab

Reading position is written continuously as pages turn, optimistically and then reconciled, so closing the tab mid-chapter doesn't lose the page. It's held per chapter, and a finished series is marked finished.

Publishing without an engineer

Editors stage a chapter, order its pages and schedule it from the console, with no deployment, so a release never waits for an engineer to be free.

Running a catalogue that readers open but don’t finish? Scope your build in 3 minutes.

Scope your build
Have a project?

Let's talk

Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.