Local-first, open-source apps
Own your data. Use any model you want. Free and open source ❤️
Apps • For Developers • Vision • Contributing • Discord
Epicenter is an ecosystem of open-source, local-first apps. Our goal is to store all of your data—notes, transcripts, chat histories—in a single folder of plain text and SQLite. Every tool we build shares this memory. It's open, tweakable, and yours. Grep it, open it in Obsidian, host it wherever you'd like.
The library that powers this, @epicenter/workspace, is something other developers can build on too. Define a schema, get CRDT-powered tables that materialize down to SQLite files and markdown, with multi-device sync handled for you.
|
Press shortcut, speak, get text. Desktop transcription that cuts out the middleman. Bring your own API key or run locally with Whisper C++. |
Chrome extension for saving tabs as bookmarks and building a read-later list, all stored in the shared workspace. |
|
The hub server. Handles authentication, real-time sync via Durable Objects, and AI inference. Everything that needs a single authority across devices. |
The workspace library makes it straightforward to add new apps that share the same data. Notes, assistants, and other tools are in various stages of development. |
The hard problem with local-first apps is synchronization. If each device has its own SQLite file, how do you keep them in sync? If each device has its own markdown folder, same question. We ended up using Yjs CRDTs as the single source of truth, then materializing that data down to SQLite (for fast SQL reads) and markdown (for human-readable files). Yjs handles the sync; SQLite and markdown handle the reads.
The @epicenter/workspace package wraps this into a single API. Define a schema, get CRDT-backed tables, attach providers to materialize to SQLite or markdown, and add sync when you're ready.
import { defineWorkspace, createClient, id, text, boolean, select } from '@epicenter/workspace';
const workspace = defineWorkspace({
id: 'blog',
tables: {
posts: {
id: id(),
title: text(),
published: boolean({ default: false }),
category: select({ options: ['tech', 'personal'] }),
},
},
kv: {},
});
const client = createClient(workspace.id)
.withDefinition(workspace)
.withExtension('persistence', setupPersistence)
.withExtension('sqlite', (c) => sqliteProvider(c));
// Write to the Y.Doc — SQLite updates automatically
client.tables.get('posts').upsert({ id: '1', title: 'Hello', published: false, category: 'tech' });Each user gets their own database. Schema definitions are plain JSON, so they work with MCP and OpenAPI out of the box. Write to Yjs and SQLite updates; edit a markdown file and the CRDT merges it in.
Read the full workspace docs →
The goal is a personal workspace where every app you use shares the same memory, your data stays on your machine, and you choose your own models. Epicenter Cloud will provide hosted sync infrastructure for people who don't want to run their own server—the same model as Supabase selling hosted Postgres or Liveblocks selling hosted collaboration. Enterprise features (team management, SSO, admin dashboards) will live in a separate proprietary layer.
Self-hosting is and will remain a first-class option. The sync server is open source under AGPL, and when you run it on your own infrastructure, you control the encryption keys and trust boundary.
brew install --cask whisperingOr download directly from GitHub Releases for macOS (.dmg), Windows (.msi), or Linux (.AppImage, .deb, .rpm).
# Prerequisites: Bun (https://bun.sh) and Rust (https://rustup.rs)
git clone https://github.com/EpicenterHQ/epicenter.git
cd epicenter
bun install
cd apps/whispering
bun devIf things break after switching branches or pulling changes:
bun clean # Clears caches and node_modules
bun install # Reinstall dependenciesFor a full reset including Rust build artifacts (~10GB, takes longer to rebuild):
bun nuke # Clears everything including Rust target
bun installYou rarely need bun nuke—Cargo handles incremental builds well. Use bun clean first.
We're looking for contributors who are passionate about open source, local-first software, or just want to build with Svelte and TypeScript.
Contributors coordinate in our Discord.
Most packages and all apps are MIT—use them however you want, no strings attached. The sync server (apps/api) and sync protocol (packages/sync) are AGPL-3.0, which means anyone hosting a modified version shares their changes. This follows the same pattern as Yjs (MIT core, AGPL y-redis), Liveblocks (Apache clients, AGPL server), and Bitwarden (GPL clients, AGPL server).
See FINANCIAL_SUSTAINABILITY.md for the full reasoning behind the split.
Contact: github@bradenwong.com | Discord | @braden_wong_
Own your data · Local-first · Open source