GitHub - EpicenterHQ/epicenter: Open-source, local-first apps. · GitHub
Skip to content
EpicenterHQPublic

About

Open-source, local-first apps.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

4.8k stars

Watchers

14 watching

Forks

Latest commit

 

History

25,576 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Epicenter

Epicenter

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.

GitHub stars Apps license: AGPL-3.0 Packages license: AGPL-3.0-or-later Discord

How it works | Status | Trust | Repo map | Development | License


How it works

~/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 serve

epicenter 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

Status

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.

Trust boundaries

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.

Repo map

Apps

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.

Packages

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/.

Architecture

~/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 home

The vision | Trust model

Development

Use Bun in this repo.

git clone https://github.com/EpicenterHQ/epicenter.git
cd epicenter
bun install

Every 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 check

Run 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 paths

One 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.

Design notes

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.

Contributing

Contributions are welcome. Good entry points are docs, the epicenter command, Svelte interfaces, Whispering, and small changes that make the repo easier to understand.

Read the Contributing Guide

Contributors coordinate in Discord.

License

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.

About

Open-source, local-first apps.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

4.8k stars

Watchers

14 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages