Single-file · Janet Lisp · WASM

Notes that run on
real Lisp, in your browser

A plain-text knowledge base built to the YANP vault spec v0.2. All logic — wikilinks, frontmatter, search — runs in Janet Lisp compiled to WebAssembly. One HTML file. No install.

localhost:3000/notes.html
+ New Note
Zettelkasten Method
2026-04-05
Reading List
2026-04-04
Evergreen Notes
2026-04-03
Weekly Review
2026-03-31
Inbox
2026-03-28
Project Log
2026-03-25
Edit
Preview
## Zettelkasten Method

The Zettelkasten is a system of [[Evergreen Notes]] linked
together to form an emergent knowledge graph.

### Core principles

- Each note captures one atomic idea
- Notes link to related ideas via [[wikilinks]]
- See also: [[Reading List]]

#knowledge-management #pkm
active 2026-04-05 #knowledge-management #pkm
Everything a plain-text vault needs

Faithful to the YANP spec. Your notes are just strings in localStorage — readable, exportable, yours.

🔗

Wikilinks

Type [[Note Name]] anywhere in your note. In preview mode, links resolve by frontmatter title → aliases → slug — exactly as the YANP spec demands. Clicking a missing link creates the note.

📄

YAML Frontmatter

Open notes with a --- block. Supports title, tags, aliases, status, author, due, and more. Unknown fields are preserved — the spec requires it.

📝

Markdown Preview

Switch between raw edit and a fully rendered preview. Wikilinks are processed first by Janet, then passed to marked.js for Markdown rendering. Code blocks, blockquotes, lists — all styled.

🔍

Full-text Search

The search box filters your vault in real time. Janet's search-notes function matches against slug, frontmatter title, and body content — all case-insensitive.

⚠️

Safe Deletes

Before deleting a note, YANP Notes checks for inbound wikilinks from other notes. If any exist, you get a warning listing the linking notes — then you decide.

🧠

Janet Lisp Brain

All business logic runs in Janet Lisp via WebAssembly. PEG grammars parse wikilinks and tags. JavaScript only handles the DOM. A real Lisp, in your browser tab.

Zero build step. Open and go.

One HTML file contains everything: styles, markup, Janet source code, and the JavaScript glue. The WASM runtime is fetched on first load.

Serve the file

Run npx serve . in the folder containing notes.html and open it in your browser.

Janet loads

janet.js is fetched from janet-lang.org, which auto-downloads the WebAssembly runtime (~1 MB, cached after first load).

Functions evaluate

The embedded Janet source code is evaluated into the REPL environment. All app functions — wikilinks, search, slugs — are now live.

Write notes

Notes are auto-saved to localStorage as you type. Your vault persists across reloads, no server required.

Built to the spec

YANP defines a plain-text, tool-agnostic vault format. This app adapts the file-system spec for the browser using localStorage.

Spec requirement Browser adaptation
UTF-8 .md files, kebab-case names localStorage keys are kebab-case slugs generated by Janet's note-slug function ✓
Optional YAML frontmatter Parsed by Janet's parse-frontmatter using string splitting. Unknown fields preserved on round-trip. ✓
Wikilink resolution: title → aliases → stem Janet's PEG grammar extracts link targets; resolution follows the spec precedence order ✓
Tags: inline #tags and frontmatter tags: [] Janet's extract-tags merges and deduplicates both sources, case-insensitive ✓
Warn before deleting linked notes Janet's inbound-links scans the vault for references; confirmation dialog names the linking notes ✓
Reject duplicate slugs / titles / aliases Checked on note creation — duplicate title or alias triggers an alert before the note is saved ✓
status: draft / active / archived Stored in frontmatter, displayed as a chip in the frontmatter bar, new notes default to draft ✓
A Lisp-powered notes app
in a single HTML file.

No npm. No bundler. No framework. Just Janet, WASM, and a browser.

Open YANP Notes →