Build Supernotes
YESreplaces $10.82/mosaves $129.84/yrback to the verdict
A card based notebook whose hard problems are keeping files as the only source of truth with a disposable index, naming those files so they survive every filesystem your notes will ever touch, and handling edits made outside the application without ever overwriting one.
Before step 1
Everything below is assumed from the first step. Tick each one when you actually have it, not when you plan to.
- installfree
Why Tauri needs both, and finding out during the first build is an avoidable hour.
Get it nodejs.org and rustup.rs, plus the Tauri prerequisites for your platform. open ↗
Verify
A fresh Tauri template builds and opens a window - have readyfree
Why Filename sanitising, link resolution and rebuild all behave differently on two hundred real cards than on five invented ones.
Get it Export an existing notebook to Markdown, or copy a folder of notes you already keep.
Verify
The folder indexes without errors and the card count matches the file count - have readyfree
Why The filename rules only prove themselves on a filesystem with different rules from the one you develop on, and a virtual machine is enough.
Get it A Windows or macOS virtual machine, or a colleague willing to copy a folder and open it.
Verify
The fixture vault copies across and every card opens - installfree
Why The claim that the folder is portable is only true if another tool renders it, and that is a five minute check nobody does unless it is a prerequisite.
Get it Any Markdown editor that opens a folder.
Verify
Cards, front matter and relative images all render in it
Data model
Create these before the first phase that stores anything. Changing a table later is the expensive kind of change.
- card file front matter(id, title, tags, created, updated, pinned) · the file is the record and everything else is derived from it - cards(id, path, title, tags_json, created_at, updated_at, content_hash, missing_since) · an index row, rebuildable at any time - links(from_id, to_id, display_text, ordinal, resolved) · unresolved links are kept and shown rather than dropped - attachments(card_id, relative_path, sha256, bytes) · stored beside the cards and referenced by relative path only - conflicts(id, card_id, path, detected_at, resolved_at, kept) · an external edit that clashes becomes a second file, never an overwrite - index_state(rebuilt_at, cards_indexed, schema_version) · so you can see when the derived data was last derived - Every table except the front matter can be deleted and rebuilt, which is the test of whether the files really are the source of truth.
Environment variables
These go in a .env file the app reads at startup. The pack's .env.example is this table as a file · copy it, never commit the filled-in version.
| Variable | Needed | Example | Where the value comes from |
|---|---|---|---|
VAULT_PATH | required | ~/Notes | The folder of Markdown files. This is all of the user's data. |
INDEX_PATH | required | ~/.local/share/cards/index.db | Derived only. Deleting it must cost nothing but time. |
MAX_FILENAME_LENGTH | required | 120 | Leaves headroom under the platform path limit including the vault prefix. |
UNICODE_NORMALISATION | required | NFC | Applied on write so one accented title cannot become two cards. |
CONFLICT_SUFFIX | required | .conflict | Appended to the copy kept when an external edit clashes. |
WATCH_DEBOUNCE_MS | required | 200 | Coalesces editor save storms. It is not how own writes are ignored. |
The build, in order
Files are the truth, the index is disposable
Deleting the database and rebuilding loses nothing.
The order is the guarantee: a crash between the two costs an index entry, not a note.
Files
src/cards/write.tsBecause the title is the thing most likely to change.
Files
src/cards/id.tsIf rebuild is not in the suite, the index quietly becomes load bearing.
Files
src/index/rebuild.tstests/rebuild.test.ts
done when · tick each as it passeswatch out- Keeping the card body in SQLite and writing Markdown only on export means the export is a feature that can break, so the day it breaks the notes are inside a database file the person cannot read. Write the file first, index second, and treat the index as a cache you are willing to delete at any moment.
Names that survive every filesystem
A card title can contain anything and the filename still works everywhere.
Reserved characters, reserved device names, trailing space and period, path length.
Files
src/files/sanitise.tstests/filenames.test.tsOtherwise one accented title becomes two cards after it crosses a filesystem.
Files
src/files/sanitise.tsThe filename is a convenience; the title is the data.
Files
src/cards/write.ts
done when · tick each as it passeswatch out- Naming files straight from card titles produces notes that are fine on your laptop and unopenable the moment the folder touches Windows, which forbids the characters < > : " / \ | ? *, treats CON, PRN, AUX, NUL, COM1 to COM9 and LPT1 to LPT9 as devices even with an extension added, refuses trailing spaces and periods, and historically caps a path at 260 characters. Sanitise on write, keep the real title in front matter, and test the whole list.
Links that survive a rename
Renaming a card never breaks a link to it.
Two pieces of information, and only one of them is allowed to change.
Files
src/links/parse.tsVisibly, with the id, so it can be repaired rather than guessed at.
Files
src/links/render.tsxDerived means a rebuild fixes them, which is the point of the index.
Files
src/links/backlinks.tstests/backlinks.test.ts
done when · tick each as it passeswatch out- Linking by title means every rename silently breaks every link that pointed at the old one, and because links are only followed occasionally the damage is discovered months later across dozens of cards. Link by id, keep the title as display text, and let a rename update the text without touching the target.
Edits from outside, without losing one
A card changed in another editor is picked up and never overwritten.
Not by a timer, which is how real edits get eaten.
Files
src/watch/index.tsTwo files and a comparison beats a merge that guessed.
Files
src/conflicts.tstests/conflict.test.tsTemporary file, flush, replace, for every single save.
Files
src/files/atomic.ts
done when · tick each as it passeswatch out- A watcher that reacts to its own writes loops forever and rewrites files until something gives up, and the usual quick fix of ignoring events for a second turns into losing a real external edit that arrived inside that second. Track the hash you just wrote and ignore an event only when the content matches it exactly.
The folder already is the exportproduct builder
Someone can open the notes in another tool tomorrow and lose nothing.
Relative paths are the difference between a folder and a folder that only works here.
Files
src/attachments.tsAnother tool's keys are somebody's data, so do not tidy them away.
Files
src/cards/frontmatter.tsA backup you have not opened is a folder of unverified bytes.
Files
src/backup.tstests/restore-vault.test.ts
done when · tick each as it passeswatch out- Keeping attachments in an application support directory and referencing them by absolute path means the folder copied to another machine renders every image as a broken box, and the person only finds out when they have already moved. Store attachments inside the vault and reference them relatively, then test by opening a copied folder from a different path.
That is the whole plan for Supernotes. What it deliberately does not cover is below · check the gaps before you call it a replacement.
- A sync server.
- Real time collaborative editing.
- Mobile applications.
- Hosted publishing of cards.
- real-time collaboration, mobile polish, sync, and card-based workflow refinement
- frictionless mobile capture
- real-time team editing
- hosted publishing
- proprietary AI memory
- Daily notes, which are a card template and a date in the filename and nothing more
- Saved searches as cards, so a collection is a note rather than a feature
- Sync through a folder service you already pay for, once conflict copies have proven themselves
Need the files? The project pack on the verdict page hands your agent the whole brief · more notes & knowledge.