A heavy reader's entire library, imported in one select-all

We loaded a real phone-storage snapshot onto a vivo foldable, select-all imported the 315 webnovel txt files it scanned out (about 1GB), and clocked batch ingestion at roughly 8 seconds. Ten random books all opened clean; system frame stats over 71,320 frames showed 0.49% jank. Full methodology and numbers from two real devices — including the data-safety bug this test caught and we fixed.

A stack of old books pouring from above into a phone screen, arranging themselves into tidy bookshelf tiles inside

The test device was a vivo foldable loaded with a snapshot of a real phone's storage (91 files, 570MB) on top of the device's own accumulated clutter. Smart scan turned up 315 webnovel txt files — in the QQ Browser download folder, inside other readers' private directories, buried in dot-prefixed hidden folders, encodings all over the map, the largest single file 30MB. Which is exactly the environment we wanted: not laboratory-clean data, but the way a heavy reader's storage actually looks.

The method was as blunt as possible: smart scan, select all, import, then open ten books at random. The ledger from two devices:

The numbers

Itemvivo foldable (315 books)Xiaomi K50 Ultra (82 books)
Smart scan resultsSeconds (19 directories)Seconds
Batch ingestion≈ 8 seconds≈ 7 seconds
Random open ×10All opened cleanAll opened clean
Pending book first open3.3 – 6.8 s9.5 – 14.5 s
Frame-stat jank rate0.49% (71,320 frames)0.71%
99th-percentile frame time31ms
Crashes / freezes0 / 00 / 0

Notes on what these numbers mean. “Batch ingestion ≈8 seconds” covers 315 books (about 1GB) from confirming the import to everything shelved — import is register-first, so books land in a pending state and full parsing happens on first open. Fast ingestion is not corner-cutting; the cost is amortized onto each book's first open (3 to 7 seconds, after which opens ride the index and are much quicker). The jank rate comes from Android's own frame accounting, not our self-reported telemetry.

The real bug this test caught

The best outcome of the round was not the numbers. During bulk import, books picked through the system file picker are first copied to a staging area; the old implementation staged them in the system cache directory, and pending books kept pointing there long-term. The problem: the OS is free to clear its cache directory whenever it wants — meaning that of your 315 imported books, the ones you had not yet opened could be permanently corrupted by a routine system cleanup.

The fix moved staging to a persistent directory, reclaims each copy the moment conversion succeeds, and sweeps orphans when the import finishes. Re-verified on both devices afterwards. The point of writing this down: performance testing earns its keep by forcing features through a full-scale, real-shape pipeline — a 315-book, 1GB pile builds scenarios a unit test never will.

Why we obsess over import, of all things

Because migration cost is the first wall around any reader. A book hoarder's library is not in a cloud; it is scattered across the odd corners of their phone. Whoever makes the moving-in step painless earns the right to talk about everything after it. Our trade-offs: scan wide (hidden folders included), ingest fast (feedback within ~8 seconds at the three-hundred-book scale), parse lazily (amortized to first open), and fail soft (encoding detection falls back and retries rather than rejecting).

What happens after the books arrive is other posts' territory: select any sentence and have AI continue it as a preserved branch, listen to whole chapters as an AI audiobook on the commute, or hand the shelf's chores to the resident agent. Same bookshelf, every door.

FAQ

How long does importing a few hundred books take?

Measured: 315 real txt files (about 1GB total) in one select-all, batch ingestion in roughly 8 seconds with no freeze and no crash. A Xiaomi device imported 82 books in about 7 seconds. Import is register-first: books shelve in a pending state and full parsing runs on first open.

How long does a pending book's first open take?

On the vivo foldable, 3.3 to 6.8 seconds including full chapter parsing and first-page layout; 9.5 to 14.5 seconds on the Xiaomi. Later opens skip conversion and ride the index — around 5 seconds for converted books on the Xiaomi, varying with device and book size.

How was the 0.49% jank figure measured?

With Android's built-in frame statistics (gfxinfo): after the full import-plus-random-reading session, the accumulated counters read 71,320 frames with 0.49% janky and a 99th-percentile frame time of 31ms. System-reported numbers, not self-instrumented ones.

Can it find books hidden in other readers' folders?

Yes. Smart scan covers the usual stashes — browser download folders, other readers' private directories, dot-prefixed hidden folders. Already-authorized directories scan directly, and results at the 315-book scale arrive within seconds.

Questions or ideas? Join our Discord →

We Dumped 315 Real Novels Into a Phone Reader, Then Opened Ten at Random · Foreverse · Xinmeng