Where one person's software lives.
Small apps keep what you make as plain files on one computer you control, and every device you own, and your agents, reach them there.
Whispering, desktop speech-to-text for macOS, Windows, and Linux, installs today.
Run it freely under AGPL-3.0-or-later. What that means.
How it works | Status | Trust | Repo map | Development | License
~/Epicenter is on a computer you control and keep on, owned or rented: the
home. It holds a folder per app in apps/. Each app is one epicenter.ts that
declares its collections and actions, an optional UI, and a data/ folder of
Markdown files you can read, with its code and its data each in a Git
repository of its own.
import { defineApp, defineCollection, field } from '@epicenter/app';
const tasks = defineCollection({
path: 'data/tasks/{time}.md',
description: 'task',
fields: { title: field.text(), done: field.boolean() },
});
export default defineApp({
description: 'Things I mean to do',
collections: { tasks },
actions: tasks.actions(),
});The epicenter command runs an app's actions on the home, and commits what
each one writes:
epicenter tasks add --title 'Call the bank'
epicenter tasks list --json
epicenter serveepicenter serve offers every app's actions over MCP, and each app's UI at
/<app>/, to every device on your tailnet. Nothing syncs and no one signs in:
your phone, your laptop, and your agents reach the one copy on the home, and
keep nothing of their own. An app's optional origin is a push-only backup.
Software that works without an Epicenter is an outside app: Gmail, Todoist, Whispering. An inside app brings its data in through actions. Mail pulls a copy of your mailbox to the home, and an agent changes Gmail only through a proposal you apply.
The vision | The epicenter command | What an app imports
The epicenter command and epicenter serve run from this repository; the npm
release is decided and not built
(ADR-0892).
epicenter service install keeps serve running as a macOS LaunchAgent; the
Linux job for a rented home and Epicenter for Mac are not built yet.
The author's inside apps (Capture, Mail, Messages, Reading, Tasks, and Vocab)
run on their home. They are not in this repository: each is a repository of its
own, taken with epicenter new <app> --from <git url>
(ADR-0877).
Whispering, an outside app, runs in a browser tab and as a desktop app, and
needs no Epicenter. Epicenter, the company, also hosts services: sign-in and
paid models (apps/api).
The folder sync product that came before is retired (ADR-0899). Some of its code stays here while Whispering imports it.
Your data is on the home, and whoever can read the home can read it.
| Where | Who can read it |
|---|---|
| A home you own | You, and whatever you let reach it: devices on your tailnet, agents you give a shell. |
| A home you rent | You and its provider, which can read the disk, .local sign-in files included. |
| Your other devices | Only what a UI or agent fetches while it reaches the home. They keep no copy. |
An app's origin backup |
Whoever hosts the backup repository. Nothing is pushed until you add one. |
| A service an inside app pulls from | The service already holds that data. Mail's Google sign-in is a .local file in Mail's folder on the home, and never leaves it. |
| Epicenter's hosted services | What you send them: a prompt or audio for a paid model, and your account. They hold no part of your Epicenter. |
serve signs no one in, so who reaches it is the tailnet's decision. See the
trust model for the details.
Every app in this repository is an outside app (apps/README.md).
| App | What it is |
|---|---|
| Whispering | Voice recorder and speech-to-text, in a browser tab or as a desktop app. Recordings, transcripts, and settings are files in a folder. |
| API | Epicenter's hosted services: sign-in, paid models, and hosted-only billing, on Cloudflare Workers. |
| Landing | The website at epicenter.so. |
| Package | What it is |
|---|---|
@epicenter/cli |
The epicenter command: runs each app's actions as commands and MCP tools, commits what they write, serves UIs, and backs each app up. |
@epicenter/app |
What an app's epicenter.ts imports: defineApp, defineCollection, defineAction, fields, folder, and the client a UI calls actions with. |
@epicenter/ui |
Shared Svelte components. |
@epicenter/ai |
Every source of models as an endpoint, one OpenAI-compatible client, the agent loop, and the model picker. |
@epicenter/server |
The Hono library apps/api composes. |
Whispering's own packages, and the folder sync product's code it still imports
(@epicenter/folder, @epicenter/definition, @epicenter/local), are under
packages/.
~/Epicenter on the home
EPICENTER.md marks the folder as an Epicenter
AGENTS.md sent to every MCP client as instructions
apps/<app>/
epicenter.ts collections and actions
ui/ the UI's source, built into ui/dist/
data/ the app's records, a repository of its own
packages/cli epicenter: runs actions, serve, snapshots, backup
packages/app what epicenter.ts imports
apps/api Epicenter's hosted services, an outside app from a homeUse Bun in this repo.
git clone https://github.com/EpicenterHQ/epicenter.git
cd epicenter
bun installEvery app starts from the repo root. bun dev:<app> runs every process the app needs; for apps that talk to the hosted API, that includes the API worker on localhost:8787. bun dev:<app>:ui runs the app's frontend alone when that split exists, and bun dev:api runs just the backend. Bare bun dev is bun dev:whispering, and bun run with no arguments lists every target.
| Command | Starts | App port |
|---|---|---|
bun dev:api |
Hosted API worker alone | 8787 |
bun dev:api-dashboard |
API + dashboard UI | 5178 |
bun dev:landing |
Landing site, standalone | 4321 |
bun dev:whispering runs Whispering in a browser tab.
The API needs local Postgres and Infisical; see apps/api/README.md. Rust is needed for Whispering's desktop build.
bun run check is the gate. It runs lint, typecheck, every workspace test, and the structural checks, and it is the same gate CI runs, so a green local run predicts a green pull request. Formatting is handled separately by the autofix workflow.
bun run checkRun the pieces on their own while you work:
bun run format # rewrite formatting (CI autofixes this for you)
bun run lint:check
bun run typecheck
bun run test
bun run check:structure # doc paths, catalog pins, API paths, UI boundary, boot purity, vocabulary, state pathsOne check sits outside the gate on purpose. bun run check:doc-hygiene flags specs and ADRs that time has made stale, so it belongs to review rather than to merge.
Durable decisions and their reasoning live in docs/adr/. Specs in specs/ are in-flight design scaffolding rather than current truth; when a spec and an ADR disagree, the ADR wins. Start with docs/README.md.
Contributions are welcome. Good entry points are docs, the epicenter command, Svelte interfaces, Whispering, and small changes that make the repo easier to understand.
Contributors coordinate in Discord.
Everything is AGPL-3.0-or-later. An MIT toolkit tier existed until 2026-08 and was dissolved; versions already published under MIT stay MIT for those versions.
See the root LICENSE, FINANCIAL_SUSTAINABILITY.md, and the licensing strategy for the full model.
Contact: github@bradenwong.com | Discord | @braden_wong_
Your data outlives the app that wrote it. Open source, on a computer you control, built on plain files, with its history in Git.