← All posts

v2.0.0 - Desktop, P2P Storage, and a Bigger App Surface

Keating 2.0 starts the desktop/P2P release line: an Electron workspace now hosts the app as a local-first client, shared Hypercore storage moves into @keating/p2p-core, settings and session management are calmer, public download/legal pages are live, and deployed web users get safer stale-build recovery.

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.