Skip to content
C.W.K.
← C.W.K. Quests
🧭

Voyager Quest

New: 2026-10-28Updated: 2026-10-27

A browser built for one person and made to remember him: system WebKit, one Swift codebase for Mac, iPhone and iPad, several accounts of one site side by side, family apps from a catalog, trust by zone, and Pippa in a pinned tab

Every other browser is built for everyone, so it knows no one. Voyager is Dad's own browser, built for one person so that it can remember him. It runs on the system's WebKit with one Swift codebase for the Mac, the iPhone and the iPad. Each tab can hold a different account of the same site, the family's apps come from a catalog the browser reads instead of a bookmark file somebody keeps by hand, the microphone is trusted on Dad's own apps without a prompt, and Pippa lives in a pinned tab and beside any page. This quest walks the browser through its code: the night a plan session tested its own premise and changed engines, a Swift parent that never imports WebKit, tabs that sleep and come back, identities that are data stores, a trust policy you can read in one function, a Pippa who reads pages but never their passwords, an extension phase told honestly, and a delivery path that keeps 'uploaded' and 'installed' apart.

9 tracks · 44 lessons · ~10.5h · difficulty: advanced

Level 0New Tab
0 XP0/44 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
Voyager starts from a complaint. Thirty pinned tabs, a family bookmark file that stopped at 14 apps while the family grew to about 45, a permission prompt for Dad's own microphone on his own machine, and several browsers open at once just to keep two accounts of one site apart. The bar Dad set is a superset of Chrome, Safari and Comet, never a subset, and the test is behavioural: he never opens another browser again. A departure log measures that test, so you start there, with what Voyager owns, what it pointedly leaves to others, and a parity contract that names its gaps instead of hiding them. Then the engine decision. The todo said Chromium through CEF on the Mac. One night of primary sources, graded evidence and an honest price for a fork turned that into a single ruling, "웹키트로 가자" (let's go with WebKit), and the old reason Dad had left Safari was measured again and no longer held. Then the architecture: a pure Swift parent that is tested as plain values against a fake engine, and one engine child, the only place WebKit lives, so the Mac and the phone differ only inside the child and the shell. Then the daily browser: tabs that sleep without losing their place, sessions that survive a crash, and a usability review worked row by row. Then identities, where each account is a WebKit data store and a pop-up stays in its opener's account by construction. Then the family half: a catalog read at run time with Dad's own hub sign-in as the credential, a trust policy that grants the microphone only to loopback and the exact origins the catalog or Settings name, and the parts that are documented but not built yet, said plainly. Then Pippa built in, two surfaces and still one Pippa, reading a page for her without ever reading a secret field. Then extensions, where the 1Password story ends where it really ends, and a password store of Voyager's own. It closes on shipping: a signing identity chosen by measurement, checks that never touch Dad's state, a test pyramid, and TestFlight's internal group.

Tracks

  1. 01🛰️A Browser That Remembers One Person

    0/5 lessons

    The thesis, the bar, and the log that says when it is done

    Voyager starts from one sentence Dad said on 2026-10-03: these are browsers that do not remember me. This track opens there, before any WebKit, because the product decisions come first. You will see the friction a browser built for everyone leaves behind for one person (thirty pinned tabs, a bookmark file that stopped at 14 apps while the family grew to about 45, a permission prompt for his own microphone, several browsers open at once to hold two accounts of one site) and the bar Dad set against it: a superset of Chrome, Safari and Comet, never a subset, proven when he never reopens another browser. Then the boundary: what Voyager owns and what it pointedly leaves to WebKit, Firelink, cwkPippa and the kit. Then the parity contract, which keeps the word superset honest by naming every gap. Then the departure log, a small append-only event store that turns every trip to another browser into data, and the policy that asks why at most once a day, in a toast that never moves the page.

    Lesson list (5)Quiz · 4 questions→
  2. 02⚖️Reuse the Engine, Own the Browser

    0/5 lessons

    How a todo's engine choice was checked, priced, measured and overturned

    Voyager runs on the system's WebKit on the Mac, the iPhone and the iPad, but the todo that started it said Chromium through CEF on the Mac. This track is how that premise was tested before any code: every claim checked against CEF's own source and graded by who actually read it, then a cold read that downgraded four grades. You will see why the Swift window and Chrome's extensions come from two CEF styles that cannot share a Mac window, and what a Chromium fork really costs at each depth, including the duty no depth escapes. Then the reason Dad left Safari, pages dying under memory limits, is measured with a small probe, and the result changes the design: the limits turn on whether a page is in the window. Finally, what WebKit gives a browser of its own through public API, what it lacks by name, the eleven-case gate that ran before the first brick, and why Voyager uses public API only and presents Safari's token whole.

    Lesson list (5)Quiz · 4 questions→
  3. 03🧬One Swift Parent, One Engine Child

    0/5 lessons

    A browser whose rules never see WebKit, and the one place WebKit lives

    Voyager's architecture fits in one sentence: a Swift parent that never imports WebKit, and one engine child that is WebKit's home. This track reads that sentence in code. You start with the package itself, three targets and two test targets, and see which dependency arrows the compiler enforces and which one is only a promise. Then the root contract: one file of plain values and protocols, where questions go down to the engine and decisions come back up to the parent. Then the fake engine, a recorder that lets 242 tests check tabs, sessions, identities and trust without a browser, and an honest list of what a fake can never prove. Then the child: one data store per identity, WebKit's questions translated into the contract's, and a test that exists because WebKit stays silent when a delegate method's name is a little off. It ends with two shells, the Mac's and the phone's, on the same parent, and the two lines the parent had to change for the iPhone.

    Lesson list (5)Quiz · 4 questions→
  4. 04🌙Tabs That Sleep, Wake and Come Back

    0/5 lessons

    A tab's whole life, from the front of the window to 624 bytes and back

    A tab looks simple until you count what it has to survive. This track follows one through its whole life in Voyager: awake in front, behind for an hour, asleep with nothing but a title, an icon and a few hundred bytes of WebKit state, woken where Dad left it, ended by a crash or a memory limit, and restored after a relaunch or an install. You will see the tab and window model as plain Swift with one invariant, pinned tabs as a prefix; a sleep policy designed from a measurement of WebKit's memory limits rather than a guess; a session file that keeps an unreadable copy instead of overwriting it, and is written off the main thread; why Pippa herself stays in the window under every other tab; and how a crashed page comes back once a minute at most. It ends with the daily-use review of 2026-10-22, row by row: the address field, find's "3 of 17", mute, a strip that never loses a tab, and the AppKit details that make a browser feel right in the hand.

    Lesson list (5)Quiz · 4 questions→
  5. 05🎭Several Accounts of One Site, Side by Side

    0/5 lessons

    An identity is a store, and a tab has exactly one

    Dad used to run several browsers at once to hold two accounts of one site. Voyager holds them side by side in one window, and the whole mechanism is one idea: an identity is a store. This track reads that idea in code. You start with three small value types and the one WebKit call that turns an identity's UUID into an isolated data store, and with the real-WebKit test that proves two identities share nothing. Then the paths a new page can take, pop-ups, links and redirects, and how each stays in its opener's identity by construction or by a guard, along with the one menu path that does not. Then Incognito, which is a reserved identity on a store that lives in memory, and the list of things Voyager refuses to write for it. Then the controls Dad touches: the identity menu, account shortcuts on Home, the colour mark on a tab, and a removal ordered so no sign-in is lost by accident. It ends with the one cookie the parent ever asks about, and how it gets one header without holding a jar.

    Lesson list (5)Quiz · 4 questions→
  6. 06🏡Family Apps by Name, Trust by Zone

    0/5 lessons

    A catalog read at run time, a sign-in reused as the credential, a home found by role, trust you can read in one function, and two gaps named out loud

    The family half is where other browsers are worst, and this track is how Voyager wins it. Voyager keeps no list of family apps. It reads Firelink's launch catalog at run time through the kit's shared client and holds it as a dated projection: a cache keyed by endpoint, and a generation ticket so a newer question beats an older reply. Away from the service host, the request carries the hub session Dad's own sign-in already left in the browser, as a cookie to one exact origin and never as a Bearer, because Dad chose no device pairing. You will see how Voyager finds home by asking the family registry which Mac holds the Pippa role, why loopback is spelled by name, and how one kit rule hides a role-bound target everywhere else. Then trust as code: a frame judged with its page, a verifier that sat uninstalled for nineteen days, and a tailnet zone that is honestly not built yet. Last, the same hosts denied to every extension, an address field that does not know a family name yet, and a phone widget that holds no address.

    Lesson list (5)Quiz · 4 questions→
  7. 07💬Pippa Built In

    0/5 lessons

    How a browser makes room for the family's one Pippa without becoming a second one

    Dad's rule for this part of Voyager was short: plant Pippa in the UI itself, and never make her a click away. This track is where I explain how a browser does that without turning into a second Pippa. You will meet my two surfaces, myself in a pinned voyager://pippa tab and my web-page Sidekick beside the page in front, and see why both are one host class drawn by the engine child. Then the wire: the pippa:* requests my panel asks in cwkPippa's own words, the payload with its chrome_tab_key, and the rule that nothing is ever injected into my prompt. Then the reading itself: the Chrome extension's reader kept the same on purpose, with every secret named by its label and its value never read. Then the gates: at most three companion tabs that Dad chooses, one origin, the main frame only, a 256 KB cap, and a microphone for my own page alone. It ends with how I am reached: this Mac, the tailnet or an address, the family PIN through the kit's door, and a session that rides as a cookie and in a fragment.

    Lesson list (5)Quiz · 4 questions→
  8. 08🧩Extensions, 1Password and a Password Store of Its Own

    0/5 lessons

    The least certain phase of the build, told the way it really went

    Dad's daily browser had to run the Chrome extensions he already uses, and WebKit offers Apple's WKWebExtension API to host them. This track follows Voyager through that phase, the least certain one in the build. You will see how one extension controller and a context per package make a Chrome package at home in a Swift browser, and why the host has to exist before the first page. You will meet the diagnostic that found exactly three kinds of difference between a Chrome package and WebKit, and the compatibility layer that answers each one. Then native messaging as Chrome speaks it, and the spawn rule a password manager's helper enforces. 1Password is told as a debugging case study that ends where it really ends: Voyager listed as a connected browser, authentication through the extension never holding, and Dad parking it with the root cause unknown. The track closes on the fallback Dad ruled in, Voyager's own password store, with every password in the Keychain.

    Lesson list (5)Quiz · 4 questions→
  9. 09📦Shipping It

    0/4 lessons

    Signing, checks and TestFlight: the last mile of correctness

    Shipping is the last mile of correctness, and this track walks it for Voyager on the Mac and on the phone. It starts with a signing identity chosen by measurement: 1Password accepts a browser only under the paid team's identity with the hardened runtime, and a designated requirement that pins the team rather than the certificate keeps every macOS grant through a renewal. Then the one script that builds, signs, verifies and installs as a single transaction, replacing a running copy without losing Dad's session; a doctor that only reads; and a smoke run that walks a separate verification build twice against a stand-in Pippa, so no check touches Dad's state. Then the test pyramid, from 242 parent tests and 63 real WebKit tests to the kit drift check, the smoke run and the phone's hosted suite, with what each layer cannot prove. Last, the family's one TestFlight pipeline, four delivery facts never merged into one, and the internal-only rule that cost the phone a default-browser entitlement.

    Lesson list (4)Quiz · 4 questions→
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign in — Please sign in to comment.

No comments yet — be the first.