Architecture

No server. Just files and a careful client.

Neoma is a React and TypeScript application that runs entirely on your device. Here is how the pieces fit, for anyone who wants to check the claims or change the code.

Storage

Files are the source of truth

  1. InterfaceReact
  2. StorageAdapterone contract
  3. Folder · Browser · Desktop.md files · IndexedDB · native fs

The interface never touches IndexedDB or file APIs directly. Writes to folders are atomic, deletes go to a recoverable trash, and a file changed on disk is never silently overwritten.

Render

Markdown in, safe HTML out

  1. Markdown fileplain text
  2. Parserremark + GFM + maths
  3. Syntax treelinks, tags, citations
  4. Rendererrehype · KaTeX

Raw HTML in notes is dropped, never executed. The same pipeline renders the editor's reading view, published sites and these docs.

Search

Indexed off the main thread

  1. Fileson save
  2. Local indexMiniSearch
  3. Web Workerqueries, snippets
  4. Resultsfilters: tag, path, type, date

The worker owns note text. The main thread keeps only light metadata, so typing stays smooth on large vaults.

Graph

Links become a map

  1. [[Links]]from every note
  2. Link graphnames, aliases, paths
  3. Layoutcanvas, force layout, lazy loaded

The same graph answers backlinks, broken links and orphans, and plans the link updates you review when you rename a note.

Publish

The vault as a website

  1. Selected notespublish: false is respected
  2. Same rendererwiki links resolved
  3. Static outputHTML · CSS · ~5 KB script

Only the chosen notes are read. Links to unpublished notes render as text, and vault paths never reach the output.

Shells

One app, several homes

  1. Shared applicationReact · CodeMirror 6
  2. Web · PWAservice worker, offline
  3. Desktop · iOSTauri: native window, files, menus

Native shells add platform storage, window controls and packaging. They do not add network access: the shipped security policy has no remote host.

Extending

Built from registries.

Neoma's own features register through four documented registries, exactly as a future plugin would. There is no plugin runtime yet, and Neoma does not run third-party code today. The extension points are already the architecture.

Commands
src/commands/registry.ts
Panels
src/app/registries.ts
Markdown extensions
src/markdown/registry.ts
Settings sections
src/app/registries.ts
Themes
CSS variables · src/themes/tokens.css

Source map

Where things live.

A tour of the repository in one tree. Start with src/storage and src/app/vaultStore.ts.

Security model →

src/
├── app/        shell, stores, registries
├── components/ interface
├── editor/     CodeMirror 6 setup and slash menu
├── markdown/   frontmatter, metadata, render pipeline
├── storage/    StorageAdapter and its backends
├── search/     search client and query parser
├── workers/    the index and search worker
├── links/      link graph, backlinks, renames
├── graph/      graph view, lazy loaded
├── publish/    the static site builder
├── templates/  templates and starter vaults
└── themes/     design tokens and CSS