Overview & Roadmap
Scope overview, implementation status, and the architecture map for Geode's clean-room clone of Obsidian.
Geode is a clean-room, open-source (MIT) clone of Obsidian: a local-first Markdown knowledge base. The full target scope was reverse-engineered from Obsidian’s official documentation only (help.obsidian.md, docs.obsidian.md, jsoncanvas.org, the public changelog) — no proprietary code, assets, or branding were used. The name, icon, and styling are original.
Spec library
| Doc | Contents |
|---|---|
| Core App | Vaults, files/folders, editor modes, Obsidian Flavored Markdown, properties, linking, search syntax, workspace, hotkeys, settings, appearance |
| Core Plugins | All 30 core plugins, incl. deep dives on Bases (.base), Canvas (JSON Canvas 1.0), Graph view, Templates, Daily notes, Sync/Publish service capabilities |
| Plugin & Theme API | Plugin anatomy (manifest, lifecycle), the full API class hierarchy (App, Vault, Workspace, MetadataCache, Editor…), events, CM6 editor extensions, themes/CSS variables, community distribution, obsidian:// URIs |
| Formats & Platform | .obsidian config files, JSON Canvas spec, Bases YAML format, URI scheme, Sync/Publish internals (E2EE), platform matrix, changelog evolution v1.5→v1.13 |
Implementation status (v0.1)
Done — working and verified
- Shell: Electron + TypeScript + CodeMirror 6 (same stack as the original, which keeps a future API-compatible plugin layer feasible); esbuild build; strict tsc
- Vaults: open any folder as a vault, recent-vault persistence, vault picker; filesystem watcher (chokidar) reflects external edits/creates/deletes live
- Vault model: file tree, create/rename/trash (to OS trash) for files and folders, “Untitled n” allocation, content cache
- Metadata cache: YAML frontmatter (incl. aliases/tags), wikilinks + embeds with positions, inline #tags (code-block aware), headings, resolved/unresolved links, backlink index, link resolution (exact path → relative → shortest basename → alias)
- Editor: CM6 with markdown syntax highlighting,
[[wikilink autocomplete, Cmd/Ctrl+click to follow links, Cmd+B/I formatting, debounced autosave, inline title rename (updates links vault-wide) - Reading view: OFM rendering — wikilinks (incl. unresolved styling), embeds (images w/ sizing, audio, video, note transclusion w/
#headingsections), all 13 callout types with fold, ==highlights==, #tags, tables, task lists, footnote syntax via GFM, properties table, %%comments%% stripped - Workspace: tab groups with split-right, pinned tabs, sidebars (collapsible icon docks), status bar (word/char count, backlink count), empty-state tab
- Core views: file explorer (tree, context menus, active highlight), search (operators:
tag:path:file:content:,"phrases",-negation,/regex/), backlinks pane, outline pane (click-to-jump), tag pane (click-to-search) - Command system: command palette (Cmd+P), quick switcher (Cmd+O, create-on-no-match), hotkey registry, daily note (Cmd+D), random note
- Settings & theming: dark/light via CSS variable theme (
.theme-dark/.theme-lightbody classes, Obsidian-convention variable names), readable line length, per-vault settings persisted in.geode/ - Live Preview mode (default): CM6 decorations hide markdown syntax away from the cursor — headings, emphasis, inline code, quotes, highlights; wikilinks/links render as clickable text; task markers become toggling checkboxes; HRs render as lines. Gotcha learned the hard way: block widgets must carry no external margins or CM’s height map drifts and cursor motion breaks
- Properties editor: frontmatter renders as an integrated, editable typed table (block widget) that serializes back to YAML
Next (rough priority order)
- Test harness — no automated tests exist yet; everything so far was
verified manually via CDP probes. Set up: (a) vitest unit tests for the
pure data layer —
parseMetadata, link resolution (getFirstLinkpathDest), search query parsing/matching, fuzzy matcher, rename link-rewriting; (b) a Playwright_electron.launch()smoke test that boots the app againsttest-vault/, opens a note, asserts Live Preview rendering and no console errors. Wire both intonpm testand require green before push. - Live Preview embeds — render
![[image]]/![[note]]transclusions inline while editing (currently raw syntax in LP, rendered in reading view) - Graph view — canvas force-directed renderer over
resolvedLinks; local graph - Unlinked mentions in backlinks pane; backlink context snippets
- Canvas —
.canvasJSON Canvas 1.0 editor (see Core Plugins and Formats & Platform) - Plugin API layer —
geodemodule mirroring the documentedobsidianAPI surface (see Plugin & Theme API); CSS snippets + community themes - Templates, bookmarks, note composer, page preview (hover), slash commands, workspaces (see Core Plugins)
- Search upgrades —
line:/block:/section:/task:operators, property[key:value]queries, embedded query blocks - Bases —
.basetable/card views with formula language (see Core Plugins and Formats & Platform) - Mobile (Capacitor) and packaging/auto-update (electron-builder), pop-out windows, vertical splits/stacked tabs
- Sync alternative — document Git/Syncthing workflows; optional E2EE sync server is out of scope for core
Architecture map
src/main/main.ts Electron main: window, vault-scoped fs IPC, chokidar watcher
src/main/preload.ts contextBridge "geode" API (typed)
src/renderer/app.ts App: wiring, commands, modals, settings, notices, menus
src/renderer/vault.ts Vault: file tree model + CRUD + events
src/renderer/metadata-cache.ts Frontmatter/link/tag/heading parsing, backlinks
src/renderer/workspace.ts Workspace/TabGroup/WorkspaceLeaf/Sidebar
src/renderer/views/ markdown-view (CM6), file-explorer, search, backlinks/outline/tags
src/renderer/modals/ Modal, SuggestModal (fuzzy), quick switcher, palette
src/renderer/markdown/ Reading-view renderer (marked + OFM extensions)
styles/app.css CSS-variable theme system (dark/light)
Legal posture
Functional clean-room clone: implemented from publicly documented behavior. No Obsidian source, binaries, icons, fonts, or CSS were copied. “Obsidian” is a trademark of Dynalist Inc.; Geode is unaffiliated and uses its own name and identity. The JSON Canvas spec is MIT-licensed by its authors.