Obsidian was one of the biggest inspirations behind the Epicenter project. I used it daily and think it's incredible software. But it's not open source, and Obsidian Sync never quite worked the way I wanted it to. I think any tool that sits this deep in your personal knowledge system should be open source and auditable.
So I built Opensidian as an open-source proof of concept: what happens when you store notes as Yjs CRDTs, sync them across servers, encrypt them end-to-end, and put a POSIX-like filesystem on top?
To do this, I built `@epicenter/filesystem`, which exposes a virtual filesystem interface on top of `@epicenter/workspace`'s CRDT tables. I then wired this into `just-bash`, a bash interpreter implemented entirely in TypeScript, which provided 80+ Unix commands (awk, sed, grep, jq, find, sqlite3, curl, etc.) to run against the same data the editor uses. Shell commands and the UI hit the same underlying CRDTs.
$ echo "# Meeting notes" > /notes/2026-04-06.md
$ mkdir /notes/archive
$ mv /notes/2026-04-06.md /notes/archive/
$ open /notes/archive/2026-04-06.md
Those commands create and move real files that immediately appear in the editor's file tree. The best part is that all of this works in both browser and server-side contexts, since yjs (https://github.com/yjs/yjs) is isomorphic.
Under the hood, metadata (name, parent, timestamps) lives in a versioned CRDT table. Document content lives in a separate Y.Doc per file, so the directory index syncs without pulling every document body. Sync uses the Yjs protocol over WebSocket, with Cloudflare Durable Objects persisting an append-only SQLite update log. Everything is encrypted end-to-end with XChaCha20-Poly1305. Keys derived via HKDF-SHA256; the sync server sees only the ciphertext.
More features: CodeMirror 6 with Yjs collaboration binding, `[[` internal links that store file IDs (renames don't break them), SQLite FTS5 search, AI chat with tool-call approval UI, and Vim mode.
Opensidian itself is a demo. For the last six months, I've been working on the infrastructure underneath: `@epicenter/workspace` (typed CRDT tables with versioning, migrations, encryption, and sync) and `@epicenter/filesystem` (a POSIX filesystem layer over Yjs). I'll be writing more about those APIs separately and integrating them into more apps in the ecosystem (including Whispering). The idea is that anyone can build local-first apps on the same foundation: notes, task managers, knowledge bases, etc., while solving the most difficult problems of local-first sync.
The UI is rough, and the feature set is thin compared to Obsidian; this isn't trying to replace it today. But I'm excited for what the future of personal computing tools could look like!
MIT licensed. Would love feedback, ideas, and roasts.
Source: https://github.com/EpicenterHQ/epicenter/tree/main/apps/open... Discord: https://go.epicenter.so/discord
dtkav•1h ago
Im building something similar but have been working from the opposite direction.
I started by making Obsidian real time collaborative (relay.md), and have been slowly heading in the direction of yjs backed filesystem (that supports the obsidian graph "protocol").
IMO the obsidian editor is best-in-class, and the important thing is owning sync. I also wish it was open source, but I'm also impressed with their business model (100% user funded) so I'm happy to support them.
I've found that many devs starting with the infrastructure tend to hand wave conflict UX with yjs. It can be useful to support LWW in certain scenarios like updating links across many files, or frontmatter updates.
Automated find-and-replace is particularly bad in yjs/ytext because deletes are idempotent but inserts are not. race conditions trigger broken links. (I call this the "machine edits" problem, not sure if there is a better name).
I think the other underexplored discussion for local first apps is how to build a business so that you can afford to work on it full time.
dtkav•3m ago