Skip to content

Latest commit

 

History

154 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Nexia-List

What is Nexia-List?

Nexia-List is an open-source, local-first knowledge management tool inspired by Tinderbox. It provides:

  • Spatial Canvas - Arrange notes visually, see relationships at a glance

  • Linked Notes - First-class bidirectional links between ideas

  • Intelligent Agents (planned) - Persistent queries that continuously organize your knowledge

  • Prototype Inheritance (planned) - Notes inherit attributes from templates

  • Local-First - Your data lives on your device, in readable formats

  • Web-First - Runs in the browser; an optional desktop shell can wrap the same app

Philosophy

North Star

A note is a letter we send to our future self.
— Mark Bernstein
The Tinderbox Way

This is the animating purpose everything in Nexia-List serves — and, as the tool grows more powerful, aims to enlarge. Every capability exists to help that letter reach a richer future self: to resurface it at the right moment, connect it to your other letters, and let a decade of them be searched, computed over, and rediscovered. Power here is something to liberate the correspondence, never to constrain it.

Local-first

Your knowledge is yours. Not in a cloud you don’t control. Not locked in a proprietary format. Not dependent on a company’s survival.

Nexia-List follows the local-first philosophy:

  1. Data stored in human-readable formats (JSON)

  2. Works offline by default

  3. Optional sync is additive, never required

  4. Export to open formats (HTML, Markdown, OPML — planned)

Architecture

Nexia-List is local-first in design, web first in user interface. The primary target is the browser: the Rust core is compiled to WebAssembly so the real engine runs client-side, with no server required. A desktop shell is optional and external. You can use it anywhere you can access a browser (online, offline, mobile desktop, or whatever). Once you download it it is yours to run (so long as none of the dependencies get seized by BigTech). Download it and you have the file to keep, yourself, forever.

┌──────────────────────────────────────────────────────────┐
│              ReScript UI (TEA-style)                     │
│   Model / Msg / Update / View — hand-rolled TEA loop     │
│   on @rescript/react; bundled by Bun → web/dist/         │
└─────────────────────────┬────────────────────────────────┘
                          │
                          ▼
┌──────────────────────────────────────────────────────────┐
│                  Browser (primary target)                │
│                                                          │
│   ┌──────────────────────────────────────────────┐       │
│   │   Rust Core → WASM (wasm-bindgen)            │       │
│   │   Notes · Backlinks · Search · JSON storage  │       │
│   └──────────────────────────────────────────────┘       │
│                                                          │
│   Persistence: IndexedDB + file download/upload          │
└─────────────────────────┬────────────────────────────────┘
                          │ optional
                          ▼
┌──────────────────────────────────────────────────────────┐
│   Gossamer desktop shell (OPTIONAL, EXTERNAL)            │
│   Requires a sibling checkout of hyperpolymath/gossamer; │
│   intentionally not built in this repo's CI              │
└──────────────────────────────────────────────────────────┘

Tech Stack

Layer Technology Purpose

UI Framework

ReScript 11 + hand-rolled TEA on @rescript/react

Type-safe functional UI with The Elm Architecture pattern

Core Engine

Rust (serde, serde_json, uuid, chrono, thiserror)

Note/Notebook model, backlinks reverse index, substring search, JSON storage

Browser Bridge

wasm-bindgen (wired)

Compiles the Rust core to WASM so the browser runs the real engine; loaded at boot and covered by a CI contract test

Tooling

Bun tasks + native bundler

Package management, tests, dev server, and browser bundling

Storage

JSON via IndexedDB + file download/upload

Local-first persistence in the browser

Desktop (optional)

Gossamer (external sibling checkout)

Thin webview shell wrapping the same web bundle

Why This Stack?

ReScript + TEA-style architecture gives us:

  • Exhaustive pattern matching (compiler catches missed states)

  • Pure update functions (easy testing, time-travel debugging)

  • Single source of truth (no stale UI bugs)

  • Type-safe message passing

Rust compiled to WASM gives us:

  • Memory safety without GC pauses

  • One core implementation shared by browser and any future shell

  • No type drift between "desktop core" and "web core"

Future directions (not yet implemented)

These appear in older docs as if they existed — they do not, yet:

  • Graph engine via petgraph

  • Full-text search via tantivy (current search is substring matching)

  • Nickel schemas for configuration/validation

  • Service worker / offline PWA install

  • Mobile targets

  • A dedicated TEA library and URL router (the current TEA loop is hand-rolled; rescript-tea and cadre-tea-router were removed as unused/unresolvable)

LambdaDelta: the programmable substrate

The larger direction — treating the notebook as live, homoiconic data that a real Lisp (LambdaDelta, λδ) can read, query, transform, and extend — is recorded in ADR-0003. The guiding constraint is that this power is opt-in and invisible by default: Nexia-List stays a Tinderbox-like tool you can use for life without ever seeing a parenthesis, while power users gain the full expressive reach of Lisp. The L0 kernel, notebook host, macros, multimethods, and prelude are built; the first UI door is a collapsed, read-only computed-field panel scoped to the current note.

Features

MVP (v0.1)

  • ✓ Create, edit, delete notes

  • ❏ Spatial canvas with drag-and-drop (pan/zoom and double-click create work; drag-and-drop pending)

  • ✓ Bidirectional linking between notes (in core; UI surfacing in progress)

  • ✓ Basic search

  • ✓ Local file storage (JSON)

  • ❏ Optional desktop shell (Gossamer, external)

Future

  • ❏ Agents (persistent queries)

  • ❏ Prototype inheritance

  • ❏ Timeline view

  • ❏ Web app installable as PWA (service worker)

  • ❏ Rich text editing

  • ❏ Entity extraction (names, dates, places)

  • ❏ Export (HTML, Markdown, OPML)

  • ❏ Optional sync between devices

Project Structure

nexia-list/
├── core/                  # Rust — note/notebook engine + λδ substrate (5,344 LOC, 91 tests)
│   ├── Cargo.toml
│   └── src/
│       ├── lib.rs         # Crate root
│       ├── note.rs        # Note data model (serde)
│       ├── notebook.rs    # CRUD, backlinks reverse index, substring search
│       ├── storage.rs     # JSON save/load
│       └── wasm.rs        # wasm-bindgen bridge for the browser
├── ui/                    # ReScript — TEA-style app (~880 LOC)
│   ├── rescript.json
│   └── src/
│       ├── Main.res       # Entry point
│       ├── Model.res      # Application state
│       ├── Msg.res        # Message type
│       ├── Types.res      # Shared types
│       ├── Update.res     # Message handling
│       ├── View.res       # Rendering (list, editor, canvas)
│       └── bindings/
│           └── DomBindings.res
├── scripts/               # Bun build/dev scripts (native bundling, dev server)
├── web/                   # Browser entry (index.html, styles) + bundle output (dist/)
├── desktop/               # OPTIONAL Gossamer shell — requires external sibling
│                          # checkout of hyperpolymath/gossamer; not built in CI
├── docs/                  # ADRs, reports
└── tests/                 # Cross-cutting tests

Getting Started

Prerequisites

  • Bun 1.3+ (the estate-standard JS toolchain)

  • Rust stable (plus the wasm32-unknown-unknown target for WASM builds: rustup target add wasm32-unknown-unknown)

  • Optional, desktop only: a sibling checkout of Gossamer next to this repo

Development

# Clone the repository
git clone https://github.com/hyperpolymath/nexia-list.git
cd nexia-list

# Install dependencies
bun install --frozen-lockfile

# Run development server (http://localhost:5173)
bun run dev

# Build for production (ReScript + web bundle)
bun run build

# Build the WASM core
bun run build:wasm

# Run tests (Rust core + UI)
bun run test

Contributing

Contributions welcome! Please read our Contributing Guide first.

Development Principles

  1. Local-first always - Never require network for core functionality

  2. Web-first - The browser is the primary target; shells are additive

  3. Type safety - Leverage ReScript’s type system fully

  4. Performance - Keep UI responsive with 10,000+ notes

  5. Simplicity - Resist feature creep, do fewer things well

License

MPL-2.0 for code, CC-BY-SA-4.0 for documentation. See LICENSE for details.

Your knowledge is yours. The code to manage it should be too.

Acknowledgments

Architecture Map

See TOPOLOGY.md for a visual architecture map and completion dashboard.

About

Cross-platform personal knowledge management - spatial notes, relationships, and agents

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages