Short answer: Ink now works like the big news apps. Everything paints from the phone first and is refreshed behind the paint. The last three days — every story, its Background page, its comments, its pictures — are saved on the phone automatically whenever Ink opens or you pull down. A pull is the one gesture that asks the network first. A tap opens a story at once — from the phone, or, if it isn't there yet, with its headline and picture while the body arrives. Never a dead tap, never an endless spinner.
Terms: the list = today's edition (edition.json, 17 KB) · a brief's body = the text of its page, kept in pegs files · the service worker = the app's small proxy on the phone that decides "phone copy or network" for every file.
A research pass on 09-28 (sources at the end). Engineering detail is thin for most apps — the patterns that recur are what matters; anything the vendor never published is marked unverified.
| App | When it downloads | Offline experience |
|---|---|---|
| Apple News | Recent + saved stories, automatically, on Wi-Fi while charging | "No Internet Connection" banner; stories not downloaded are dimmed; a "Check for New Stories" pill when back online |
| New York Times | Overnight background updates so normal reads don't hit the network (its open-source Store library); duplicate requests merged into one | The feed looks the same offline, with "last updated"; comments marked unavailable. A reviewer's complaint: an un-downloaded image spins forever |
| Guardian | Sections pre-cached (since its 2009 app); the daily Editions app downloads a bundle | Its website's offline page offers a crossword instead of a dead end |
| Financial Times | Offline was opt-in (casual visitors don't pay the download) | Its lesson: never trust the browser's "online" flag — trust whether the download worked |
| The Economist | The whole weekly edition downloads as one unit | Wi-Fi-only setting and retention: unverified |
| BBC · Google News | Saved items on Wi-Fi (BBC audio kept 30 days); Google downloads saved topics | The feed itself doesn't work offline; pictures may be missing |
The eight patterns that recur — and where Ink stands:
| Pattern | Ink | |
|---|---|---|
| 1 | Show the saved copy at once, refresh behind it — never block the reader on the network | ✓ v1135 |
| 2 | Don't swap the list under a finger — a "new stories" notice instead | ✓ repaints only at the top with nothing open; otherwise「Fresh Ink — pull down to see it」 |
| 3 | The edition is one downloadable unit, fetched before it's needed | ✓ every open and pull saves three days |
| 4 | Text before pictures — pictures are what goes missing | ✓ v1135 sync order; the smaller picture first |
| 5 | A tap on something missing fails clearly and at once | ✓ opens with the headline;「Couldn't load this story — it isn't saved on this phone yet」 |
| 6 | Offline is judged by real downloads, not the browser's flag | ✓ the service worker marks a phone-copy answer (X-Ink-Saved) |
| 7 | Bounded storage | ✓ three days (~10 MB), the oldest pruned; the phone is asked to keep it |
| 9 | A pull keeps spinning until the new stories are really loaded (the owner's catch, 09-28) | ✓ v1136 — the band holds a ring and「Refreshing…」until the day's text is on the phone (the list, every brief, the comments); pictures keep coming behind; capped at 20 s so a dead link lets go |
| 8 | Bulk downloads on Wi-Fi, overnight | not possible for a web app on iPhone — see §4 |
| File | Size | Served | On the phone for offline |
|---|---|---|---|
edition.json — the list (today's pointer) | 17 KB | phone first, refreshed behind; changed → "Fresh Ink"; a pull → network first | ✓ |
edition-<day>.json | 17 KB | phone first, refreshed behind (the comment faces land after publishing) | ✓ three days |
pegs-<day>.json — the day's bodies (new) | ~150 KB | phone first; asked for the moment the list paints | ✓ three days |
voices/<id>.json — comments | ~11 KB | phone first | ✓ |
img/<id>.m.jpg · .jpg — pictures | 100–300 KB | phone first (written once) | ✓ both sizes, the small one first |
pegs.json — every brief ever | 2.3 MB | only a fallback for a server without the day files | ✗ removed from the phone |
The brew writes pegs-<day>.json beside the edition on every publish (both lines, and a Source-card refresh); the app cuts any missing ones at boot (day_pegs_backfill). The phone's copy lives in its own store (mad-ink-offline), so a new app version never clears it.
Overnight download. The native apps fetch the edition at night. A web app on iPhone gets no background time at all; Android's periodic background sync exists, but the browser decides when, and only for installed apps people use. So Ink's dependable moment is when the app opens or comes back — which is exactly when it saves. For a flight: open Ink once before boarding and check the line at the end of the list —「Saved on this phone · 3 days · 06:20」.
Storage. An installed web app on iPhone may use a large share of the disk, and the phone is asked to keep Ink's store; ~10 MB for three days is far below any limit.
| Check | Result |
|---|---|
| the app's boot cuts the day files | 20 editions → 20 pegs-<day>.json |
| online: the first brief tapped | the full page (2,693 characters) — the 2.3 MB file never fetched |
| a tap that beats the load | opens at once with the headline + "Loading…", fills when the day arrives; a story with no body anywhere ends on the clear message |
| server killed, app reopened | lands on Ink · 12 stories · tap → the full body in 15 ms · picture · 3 comments |
| Date | What |
|---|---|
| 2026-09-28 · v1136 | the pull holds its ring. Before: the band snapped shut on release and nothing showed while the request ran. After: released → a spinner +「Refreshing…」→ closes when the three days' text is saved (measured locally: 19 text files in 215 ms, pictures 14 → 90 after). ⚠ caught in testing: the first draft broke an if … else and the whole app script failed to parse — never committed; the served-shell lag (the service worker paints the cached page, fetches the new one behind) is why a fix shows on the second open. |
| 2026-09-28 · v1135 | the day's pegs · phone-first serving + "ink-updated" · the never-dead tap · text-first sync · a failed comments load no longer remembered. owed the owner's read on a phone, on the real link. |
| 2026-09-27 · v1134 | the offline store (three days, automatic on open and pull) · the app lands on Ink with no network · pull-down reaches the network. |
support.apple.com/guide/iphone/offline-mode-read-downloaded-news-content-iph0c38a4b93/ios · github.com/nytimes/Store · uxcam.com/blog/new-york-times-offline-strategy · github.com/guardian/editions · github.com/Financial-Times/n-service-worker · github.com/matthew-andrews/ft-style-offline-web-app-part-4 · webkit.org/blog/14403/updates-to-storage-policy · developer.chrome.com/docs/capabilities/periodic-background-sync · developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria