Skip to main content

Desktop Architecture

Native, light, fast shell for a calm Career OS — not a web SaaS in a trench coat.

Parent: OVERVIEW.md · Brand UI: ../brand/DESIGN_SYSTEM.md


Goals​

  • Desktop-first experience with system tray/status, keyboard flows, and local resources.
  • Clear split: host (privileged) vs ui (presentation).
  • Privacy chrome always visible (Agent · On-device / belt mark).
  • One job per view; dark mode first (Midnight Ink + Electric Teal).

Process model​

┌──────────────────────────────────────────┐
│ Host (main / native) │
│ storage · ai runtime · agent · scheduler│
│ plugin/extension loader · send egress │
│ event bus · OS notifications │
└─────────────────┬────────────────────────┘
│ narrow IPC / bridge
┌─────────────────▼────────────────────────┐
│ UI (renderer) │
│ Overview · Craft · Applications · Queue · Follow-ups │
│ Preferences · Agent · Timeline · Logs │
│ Jj* components · a11y · reduced motion │
└──────────────────────────────────────────┘

Law: Renderer never opens arbitrary network sockets for career payloads. All egress goes host → send.


Host responsibilities​

ConcernBehavior
PersistenceOwn DB/files under user data dir
Model lifecycleStart/stop local LLM adapters; emit Ai.* events
Agent controlStart/pause/resume; enforce preferences
SchedulerLocal jobs; respect quiet hours
EgressSole owner of send channels
NotificationsOS + in-app; sound off by default
UpdatesApp updates ≠ uploading user résumés

UI responsibilities​

ConcernBehavior
NavigationProduct nouns; sentence case
Review ritualApprove / reject queue items
Trust chromeAgent · On-device status always glanceable (main status bar; never hidden in compact)
Layoutdata-layout=compact|standard|wide from window width; one job per view; Applications uses list + detail
CopyBrand voice; errors plain; success quiet
MotionStatus pulse, row settle, toast rise only
A11yFocus rings, live regions, keyboard paths

IPC surface (normative catalog — conceptual shapes)​

Policy: Deny-by-default. The table is the H1-oriented allowlist. Host may omit a command until its story ships; unlisted commands are denied. Package surfaces may be richer for host-internal use without exposing every method to UI.

Commands (UI → host). Request/response are typed in the host.

CommandPurposeNotes
preferences.get / preferences.setRead/write policyEmits Preferences.Changed
identity.getProfile / importResume / listKnowledgeIdentity / Knowledge
applications.createDraft / update / list / setStage / findDuplicatesCraft
agent.startWorkflow / pause / resumeWorkflow / Task QueueNever Send
agent.getTaskQueueSnapshotProgress chromeCalm counts only
queue.list / enqueue / approve / reject / clearReview Queueapprove required before send when policy on
send.approveAndSendEgressPreferred; maps to send package; honest result
discovery.syncSourceJob Provider sync
followups.list / dismiss / sendFollow-upssend still via send package
timeline.queryTrust / craft historySanitized
ai.getStatusBadge / readinessNo complete from UI
plugins.list / enable / disableAgent skills
extensions.list / enable / disableHost contributionsMay stub until H3–H4
logs.tailSanitized diagnosticsNo prompt bodies by default

Queries / subscriptions (host → UI):

  • Event stream (batched) from EVENT_SYSTEM.md
  • Agent · On-device / model status for badge
  • Notification intents (shell-owned)

Bridge: no generic eval, no raw fs from UI.

AC: UI cannot invoke AI Provider complete/embed; only host handlers may.


Window & information architecture​

Primary areas (Horizon 1):

  1. Overview — calm local charts (funnel, pipeline mix, rates)
  2. Applications — craft list & drafts
  3. Queue — review before leave
  4. Follow-ups — polite calendar
  5. Agent — status, pause, recent preparative activity
  6. Preferences — model path, approval gates, quiet hours
  7. Timeline / Logs — inspectability

Avoid multi-dashboard “mission control.” Deep links open one purpose.


Privacy chrome​

  • Status bar: Agent · On-device pill (indigo/teal) reflecting real adapter health.
  • Optional belt mark for idle agent (“waiting for your signal”) — microcopy from brand.
  • Egress confirmation UI must state destination class plainly.

OS integration​

IntegrationUse
TrayQuiet presence; open queue / pause agent
OS notificationsFollow-up due, approval needed — batched, no marketing
File associationsImport résumé (user-initiated)
Secure storageTokens for boards only if user connects; never résumé cloud sync

Performance posture​

  • Prefer lazy-loading heavy AI runtimes until needed.
  • Batch UI event delivery.
  • Respect machine resources — local LLM may be optional until configured.
  • Reduced motion: snap states; meaning not motion-only.

Security posture​

  • Context isolation between host and UI.
  • Capability-gated plugins/extensions.
  • No analytics SDKs that exfiltrate career content.
  • Crash reports, if ever enabled, strip PII and are opt-in.

Mapping to monorepo​

  • app/host — process entry, wiring packages
  • app/ui — views composing packages/ui
  • Domain behavior remains in packages/* for testability without GUI