ContributingDraft
Onboarding v2: a step per import
The user's direction (28 Sep): onboarding leads. Every import and setup gets its own dedicated, interactive step, not a line item inside a bigger step. launch owns the whole flow, its order, and each step's "wow"; the owner team named per step builds that step's engine (the data, the tools, the events). Two of these already have their own design docs, linked below; this file is the frame they sit inside, and the spec for the steps that do not have one yet.
The step-shell (launch owns; every step plugs into it)
One shell, reused by all ten steps:
- Skippable. Every step has a visible "Skip for now" that never blocks the next step. A
skipped step can be finished later from Settings or a
vyrecommand (existing convention,deck/onboard/onboard.js's current steps already do this for Tailscale, Claude and history). - Resumable. Reloading, closing the tab, or a Mac and a phone both mid-onboarding: state
lives on the box (
core/onboard/index.js's existingonboard.status), never only in the page. A step's own progress (a scan in flight, an import mid-stage) survives a reload too, by asking the owning module's own status tool (import.status, and the vault-import equivalent once it exists), not by the shell inventing its own copy of that state. - Progress, live. Every step that does real work (a scan, an import, a connection) shows
progress as it happens, not just a spinner: the existing
progressRow(label, state, note, since)checklist-row component (todo/doing/done/failed, a spinner/check glyph, elapsed time) is the shape every step's "doing" state renders through, so a person options-checking a multi-source step (secrets, step 5) sees each source's own row advance independently. - A small celebration per step. Not a modal, not confetti: a one-line, specific win in the
step's own voice when it finishes ("Vyre now manages 14 keys", not "Done!"). Silent for a
skipped step. Off under
prefers-reduced-motionsame as the rest of onboarding. - A summary at the end. After the last step, one screen totalling what happened: sessions imported, keys imported, accounts connected, drives synced, devices paired, what was skipped and where to finish it later. Read from each step's own final state, not tracked separately by the shell.
Terminology
ADR 0038 (docs, status: draft as of this writing): "server" and "device" apply everywhere
user-facing, not only onboarding, no alias window on marketing surfaces. "Box" survives only as
the literal vyre box <sub> CLI form during 0.1.1's alias window (vyre server <sub> is the
new form, not yet shipped) and as the unrenamed role: "box" config value, neither of which this
flow's own copy
quotes except where it is literally showing real CLI output (step 2's pairing instructions, which
quote vyre up's live menu text verbatim and must stay in sync with whatever that command
actually prints, not with this doc's wording).
One onboarding for every device
The lead's decision (29 Sep), resolving federation's question about the second-device flow: one onboarding-v2, not a second experience. A new Mac or PC runs the exact same steps.
- Step 2 detects an existing server. If this device finds one it can pair to, the step becomes "Add this device to your Vyre server" instead of the first-server flow. Steps already done at the server level (naming, the Claude sign-in) show as done and are skipped for this run.
- Device-level steps run again for this device: step 4 (import this device's own sessions), step 5 (import this device's own secrets), step 9 (the Capsule tour) all run fresh per device, since each device has its own history, its own local secrets and its own Capsule.
- Add a device from the Deck. Settings > Devices gets an "Add a device" entry: the one-line install command and a pairing code, so a person does not have to leave the Deck to start a second device's onboarding.
- Windows. Follows the windows teammate's guide (
docs/using/windows.md, in progress); asked them directly rather than guessing at Windows-specific install steps. - Only the upload wiring (federation's transport,
import.start) waits on e2e's review; the design and the UI for all of this can proceed now.
The ten steps
| # | Step | Owner(s) | Size | Status |
|---|---|---|---|---|
| 1 | Name Vyre, and set who you are | launch | S | mostly exists (core/onboard's you step), terminology pass |
| 2 | Pair this device with the server (detects an existing server; see above) | launch, tailnet, federation | S | mostly exists (name/tailscale steps), terminology pass, existing-server detection to add |
| 3 | Sign in to Claude, through the vault | launch, sessions, vault | S | mostly exists (claude step), wire to vault |
| 4 | Import your sessions: discover, choose, watch Vyre Memory learn | memory-iq (leads), federation | M | built, real memory-iq shapes: docs/design/import.md (work/memory-iq); board: Import.dc.html/-paper (work/app-design, e7aab867, owed a revision for the real 5-stage shapes) |
| 5 | Import your secrets, from several sources | vault (leads) | L | stubbed (secrets, a "Coming soon" card); board ready: VaultImport.dc.html/-paper (work/app-design, 19a96abd); tool shapes still needed from vault |
| 6 | Connect accounts: Google and email, MCP servers | vault, connectors | M | stubbed (accounts, a "Coming soon" card); board available: Connections.dc.html/-paper (work/app-design, db3dbbfa), sent to vault; spec needed |
| 7 | Agent computers: Off / Browser only / Browser + desktops | glass-live (backend) | S | built (computers); server-size numbers are placeholders ("still measuring") until docs/design/agent-browsers.md and e2e's measurements land |
| 8 | Vyre Drive | federation (leads) | ? | stubbed (drive, a "Coming soon" card); federation drafting the options (see below); design once the lead brings back the user's choices |
| 9 | Your phone: pair it, swipe-to-approve | mobile | S | later, per the lead; stub/skippable for 0.1.1 |
| 10 | A tour of the Capsule: press ⌥Space | capsule-pro | S | can reuse the landing page's Capsule demo pattern (site/index.html's hero demo) as a starting shape |
Reconciled (the lead, 29 Sep): the client STEPS array (deck/onboard/onboard.js) now has 11
entries, in the same order as this table, with two intentional differences kept on purpose rather
than forced into a false 1:1 mapping:
- Step 2 is two client screens,
tailscalethenname: connecting to Tailscale and reserving an address are different enough pieces of work (one is a sign-in and a wait, the other is a certificate request with its own multi-row progress) that merging them into one screen would lose the per-piece progress each already shows. They're adjacent and both still called "Pair this device with the server" in spirit. - Step 10 (the Capsule tour) is its own screen,
capsule, split out of the olddevicesstep.devices(Mac and phone pairing, step 9) used to be the mandatory, non-skippable final screen; that property moved tocapsule, which is genuinely last now and triggersfinish().devicesis a normal, skippable middle step today.
No step is silently combined or renumbered without a note here.
Step 2: Pair this device with the server
Built: the existing tailscale screen now has an "Advanced: your tailnet policy" collapsible,
shown once signed in, with the merged policy snippet (Taildrive, Taildrop, SSH, egress when on)
from tailnet's onboard.tailscale {action: "policy"} (work/tailnet ecd89c0c), replacing the four
separate placeholder snippets in docs/adr/0014-tailnet.md: pretty-printed JSON, a Copy button,
tailnet's own notes. ready: false shows tailnet's why instead. A person who onboarded before
this shipped would want the same panel in Settings > Network; not built there yet.
The existing-server detection (this step becoming "Add this device to your Vyre server" when one
is found) still waits on tailnet's proposed names.discover tool (peer scan + an unauthenticated
/v1/whoami probe on each online peer), not yet built (design agreed): tailnet is on another
0.1.1 item first.
Step 4: Import your sessions
Full spec: docs/design/import.md on work/memory-iq (8702ab66). Built (deck/onboard/onboard.js
history(), provisional pending memory-iq's real tool shapes): Discover (import.scan,
sources with counts/date range/size, dev and Vyre folders unticked with the reason, nothing
leaves the device), Choose (import.plan {include}, "N sessions, X MB, from these folders,
to your server", a "Keep them in sync" checkbox unticked by default, a Fast/Gentle reading-pace
choice with neither preselected, and the note that Claude Code keeps sessions 30 days so import
now, Vyre never changes Claude Code's own settings; confirms with import.start {plan, mode, pace}), Watch it fill (import.status, polled every 5 s since the loopback's event stream
carries only onboard.*, in three plain-language stages: Searchable now, Understood, The graph
growing; a question box wired to memory.ask (not memory.answer, which can't see freshly
imported sessions) as soon as the first sessions are searchable, showing the answer and sources,
or "Not sure yet." plus known facts when it abstains). import.start's pace field is confirmed
correct by memory-iq. This step replaces today's "Your history" step rather than extending it,
keeping the step's id and CLI label ("Your history") unchanged so test/journey.test.js's
CLI-output assertion still holds.
Step 5: Import your secrets
Stubbed for now (secrets in deck/onboard/onboard.js's STEPS, a "Coming soon" card,
Skip/Continue, no backend call). Lead's spec (28 Sep): discover keys on the device, recognise
their providers, show them masked and grouped by project, one Touch ID for the batch, animate
each key into the vault with its connection created, end on "Vyre now manages N keys". Each
source is its own card inside the step: .env files, shell exports (~/.zshrc and the like),
password managers (1Password, Bitwarden, Apple Passwords), Chrome passwords, SSH keys, and the
MCP and Claude settings env. The board is ready (VaultImport.dc.html, work/app-design 19a96abd);
asked vault for the discover/import tool shapes per source before building the real screen.
Step 6: Connect accounts
Stubbed for now (accounts in deck/onboard/onboard.js's STEPS, a "Coming soon" card,
Skip/Continue, no backend call). Google and email, MCP servers, through vault and connectors.
Spec needed; likely close to existing connectors flows, reframed as its own step with the shell's
progress/celebration.
Step 7: Agent computers
Built (computers in deck/onboard/onboard.js's STEPS). The lead's choice (29 Sep): Off /
Browser only / Browser + desktops, a warm one-line explanation of what each gives an agent (a
browser to look things up in, live to watch; a full desktop for anything a browser alone can't
do), and the server size each needs. glass-live owns the backend
(docs/design/agent-browsers.md, not written yet) and the real size numbers; both are placeholder
"still measuring" text for now, since e2e hasn't measured them. No server call yet: the choice is
kept locally only, same degrade-gracefully shape as every stub step here.
Step 8: Vyre Drive
The user's decisions (the lead, 29 Sep): files on demand by default, a what-to-sync folder picker
with sizes, per-folder agent access, a receive-files switch, no quota ("warn when the server's
disk is low" instead). Full spec: docs/design/drive-onboarding.md on work/federation
(e69a544a), which is candid about what each piece needs: on-demand mounting is real
(files.drive.share/mount); the folder picker and per-folder access are M each (no picker
UI, no grant table for shares yet); the receive-files switch is S but not wired to a settings
UI yet (it's a config.json key today; federation tried the settings-hub route and reverted it
rather than ship unreviewed); the "watch it appear on your other device" celebration needs the
phone app and a Capsule drop target, neither of which exist, so it can't be the real celebration
yet. Still a stub (drive in deck/onboard/onboard.js's STEPS, "Coming soon", Skip/Continue),
but the copy now names the decided design accurately instead of a placeholder line. Building the
real picker/access/switch and the celebration waits on federation's and the phone team's tools
landing; nothing to wire safely yet.
Step 9: Your phone
Lead: "later". A stub for 0.1.1: shown, explained, skippable, no engine yet, so the step order and the summary screen are correct once mobile's swipe-to-approve pairing lands.
Step 10: A tour of the Capsule
Press ⌥Space (the corrected default hotkey, team/archive/work-journals/launch-surfaces.md). The landing
page's hero Capsule demo (site/index.html, site/app.js's .keys/demo wiring) is sample-data
only and public-facing, but its shape, tabs (Typing/Recall/Held/Waiting) and the ⌥Space
open/close handling are a reasonable starting point for capsule-pro's real, signed-in tour.
Open items (tracked in team/archive/work-journals/launch-surfaces.md "Needs from others")
- vault: tool shapes for step 5 and step 6.
- connectors: confirm step 6's scope (which of today's connector flows this step wraps).
- app-design: the step-shell's progress/celebration board (shared by every step); still owed.
- glass-live:
docs/design/agent-browsers.md(not written yet), and the real server-size numbers for step 7, once e2e measures them. - mobile: confirm step 9 is fine as a stub for 0.1.1.
- federation: step 8's drafted options, once the lead brings the user's decisions back.
- tailnet: the proposed names.discover tool for step 2's existing-server detection (design agreed, not built).
- windows: confirm
docs/using/windows.mdcovers what step 2 needs to point a fresh Windows PC at for install, once that guide exists.