2.0.0 is the first Keating release that treats the desktop app and the peer-to-peer storage layer as first-class product surfaces. The web app is still the fastest way to start learning, but the architecture now has a real Electron main process, a typed preload bridge, and a shared P2P core package for local-first storage and replication work.
Desktop and P2P Storage
The new desktop workspace boots Keating through Electron with the renderer sandboxed and all storage calls crossing a typed IPC boundary. The main process owns the P2P store, persists a per-user swarm secret, exposes peer stats, and adapts Hyperbee/Corestore storage to the same storage shape the browser app already expects.
That shared storage logic lives in @keating/p2p-core. It now builds runnable JavaScript into dist/, exports that JS for Node and Electron, and keeps the seeder entrypoint on the same built output. The package no longer asks Electron to execute TypeScript source through workspace exports.
Settings and Sessions
The settings surface has been reworked around shared local-setting hooks. Speech, model preferences, and UI settings now follow the same subscription pattern, which makes settings changes easier to reason about across tabs and components. Session management also moves toward a dedicated browser experience instead of the older sidebar/dialog split.
Public App Surface
Keating now has public /download, /privacy, and /terms routes, with navigation, footer, and sitemap updates so the app has a clearer release and policy surface. The retro styling pass also moves more of the product chrome into shared CSS so landing, app, settings, and public pages feel less stitched together.
Release Runtime Fixes
The lazy-route loader now goes through stale-build recovery, so users with an old HTML shell can reload cleanly when a deployed chunk has been replaced. On the P2P side, deriveTopic uses a deterministic Node crypto hash and native Hyperbee loading is deferred until storage opens, keeping Bun tests runnable even on machines where the transitive sodium-native addon is unavailable.
Verification
This release was checked with the P2P package build/typecheck/tests, the desktop main build/typecheck path, and the web TypeScript check. The native Hypercore-backed storage tests remain conditional: they run when the native addon is available and skip cleanly when the current Bun environment cannot load it.