Skrive v0.2.0 — Same Skrive, new foundation
v0.2.0 — Same Skrive, new foundation
This release is a rebuild, not a redesign. Skrive's writing surface, project model, rename-with-references, and structural diff are all at v0.1.6 parity. What changed is everything underneath.
Skrive moves off Tauri + SvelteKit onto Electron + React + napi-rs. The reason is maintainability: React + Electron is one of the most heavily traveled paths in desktop software, with a single TypeScript codebase across the renderer and the shell, and a vastly larger ecosystem of accessible primitives (Radix), command runners (Cmdk), and animation libraries (Framer Motion) to pull from when design and feature work need to scale. Tauri + Svelte was lean and fast, but every meaningful feature was a custom-build job; the foundation needed to be one we can iterate on instead of fight.
The honest tradeoff is package size. Tauri ships a ~10MB binary by reusing the system webview; Electron bundles its own Chromium and lands in the 150-200MB range. There isn't really a best-of-both-worlds option for desktop apps right now — system webview comes with platform fragmentation, bundled Chromium comes with size. We picked the side that lets a solo project move faster without trading off correctness.
What's new
- Keyboard shortcut cheat sheet. ⌘/ opens a modal listing every binding the app responds to, grouped by area. First answer to "wait, what does ⌘⇧B do?"
- Accessibility baseline. Keyboard navigation reaches every primary action. ARIA labels on custom controls. Modal focus-trap via Radix.
prefers-reduced-motionrespected on every transition. Not a feature flag — just how the app is built now. - Signed + notarized macOS installer. Skrive opens cleanly on a fresh Mac without the Gatekeeper warning, on first launch and forever after.
- Auto-update wired in. "Update on launch" toggle in Settings → Updates, plus a manual "Check for updates" button. Background download, restart-to-apply.
- Sidebar moves to ⌘[. v0.1.6 used ⌘B, the VS Code convention. ⌘[ feels closer to "open the rail" than "make this bold," which matters when you're not coding.
Under the hood
- Stack: Electron 33 + React 19 + CodeMirror 6 + Radix UI + Cmdk + Framer Motion. Replaces Tauri 2 + SvelteKit + CodeMirror 6.
- Native diff core preserved. The Rust crate that powers version history is unchanged at the algorithm level — exposed through napi-rs as
@skrive/diffinstead of through Tauri commands. Same fixtures, same parity tests. - Typed IPC. Renderer and shell communicate through a type-checked contract instead of Tauri's runtime-typed
invoke(). Adding a handler is a type + an implementation, not a refactoring spelunk. - Performance budgets verified. Cold-open <1.5s on a 100-file project. File switch <50ms. Lint refresh <500ms on a 200-file project. Measured by an instrumented fixture in the repo.
- Central shortcut registry. Every keyboard binding lives in one TypeScript module — the same source the cheat sheet renders from, the same source the dispatcher reads. Adding a binding is one edit.
- Token-coherent chrome. Radius, z-index, and motion timing live as CSS custom properties at
:root. The next polish pass touches one place instead of fifty. - Voice consistency. Error toasts say "Couldn't" instead of "Failed to." Empty-state messages teach instead of just stating absence.
Coming next
A lot of great things are planned — typed blocks, exports, faster diff, cloud sync — and the new foundation is what lets those land in months instead of quarters.
Install
Pre-alpha build.
Existing v0.1.6 users: uninstall v0.1.6 before installing v0.2.0. The two versions use different installer formats and updaters, and we haven't validated sharing app data between them. After uninstalling, install v0.2.0 from the assets below; v0.2.0+ will auto-update from here on.
- macOS arm64 — download
Skrive-0.2.0-arm64.dmg, drag Skrive to Applications. Signed and notarized. - Windows — download
Skrive-0.2.0-Setup.exe. SmartScreen will warn (unsigned); click "More info" → "Run anyway." Code signing is on the roadmap.
Skrive is solo work. If something in v0.2.0 doesn't feel like Skrive, open an issue — that's the most useful thing you can do.