Build Capacities
YESreplaces $11.99/mosaves $143.88/yrback to the verdict
A notes application built on typed objects with defined properties, where mentioning a person creates a real entity rather than a link to nothing, and where the daily note is the capture surface that feeds everything else without you filing anything.
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 Runs the local application.
Get it nodejs.org, or nvm install 22. open ↗
Verify
node --version prints v22 or higher - decidefree
Why Types shape everything and are painful to change once you have hundreds of objects. Four is enough to test the model and few enough to change your mind.
Get it Look at what you already write about. Person, book, idea and meeting is a reasonable start if nothing obvious presents itself.
Verify
Four types are written down with their properties before any code - have readyfree
Why Search performance, schema migration and export all behave differently at scale, and a knowledge base with twenty notes proves nothing.
Get it Export from whatever you use now, or generate a realistic corpus with varied references.
Verify
Several hundred objects with references exist to test against - have readypennies per month at personal scale
Why Phase 6 only. Sync goes through storage you own rather than a service that owns your notes.
Get it Any object storage or a synced folder. The requirement is that you control it.
Verify
Two machines can read and write the same location
Data model
Create these before the first phase that stores anything. Changing a table later is the expensive kind of change.
- types(id, name, icon, property_schema_json) · person, book, idea, meeting, whatever you define - objects(id, type_id, title, created_at, updated_at) · every note is an object of some type - properties(object_id, key, value_json) · typed per the type's schema, validated on write - blocks(id, object_id, ordinal, kind, text, children_json) · the body content - references(from_object_id, from_block_id, to_object_id, kind) · kind is mention or property_link - daily(date, object_id) · the daily note is an object too, which is why capture and structure are the same system - A reference is a row, so backlinks are a query rather than a text search across every note.
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 |
|---|---|---|---|
DB_PATH | required | ~/.local/share/capacities/base.db | Your entire knowledge base. The single most important file to back up. |
EXPORT_DIR | required | ~/Documents/notes-export | Where Markdown exports are written. Somewhere your ordinary backups already reach. |
DAILY_NOTE_START_HOUR | required | 4 | When a new day starts, so a note written at one in the morning lands on the right day. |
SYNC_REMOTE | optional | s3://my-notes/base | Phase 6 only. Absent means single machine, which is a fine way to run. |
BACKUP_DIR | required | ~/backups/capacities | Automated backups. Restore-tested, or they do not count. |
The build, in order
Typed objects with real properties
A person has a role and a book has an author, enforced.
Kind, required, default. This is what separates this from a folder of pages.
Files
src/types.tsA pure function against the schema, unit tested with wrong kinds.
Files
src/validate.tssrc/validate.test.tsExisting objects keep data and are marked incomplete. Decide this now, not at three hundred objects.
Files
src/migrate.ts
done when · tick each as it passeswatch out- Adding a required property to a type with three hundred existing objects either fails, silently invalidates all of them, or quietly drops the constraint. Decide the migration behaviour before you need it: existing objects keep their data and are marked incomplete rather than being rejected or rewritten.
Mentions that create the thing mentioned
Typing a person's name in a note produces a person object, not a dead link.
So renaming is free. Text references are the mistake that shows up months in.
Files
src/reference.tsChoosing the type at mention time is what keeps the graph typed rather than generic.
Files
src/mention.tsRefuse or convert with a warning. Never leave dangling references.
Files
src/delete.ts
done when · tick each as it passeswatch out- References stored as the displayed text mean renaming an object breaks every mention of it, and the breakage is silent because nothing checks. Store the id and render the current title, so renaming is free and a reference can never dangle.
The daily note as the capture surface
You write into today and the structure builds itself.
So it participates in references like anything else.
Files
src/daily.tsNo inbox, no later step. This is the design that survives contact with real use.
Files
src/daily.tsA person's page becomes a timeline of when you mentioned them.
Files
src/backlinks.ts
done when · tick each as it passeswatch out- A capture surface that requires you to file things later accumulates an unfiled backlog and stops being used within a month. Make the mention itself the filing, so writing a person's name in today's note is already the connection and nothing needs to be moved.
Finding things by what they are
Every book you rated above four, in one query.
Full text search over content, scoped by object type.
Files
src/search.tsThe reason the property model exists. Filters over typed values, not string matching.
Files
src/query.tsSo a view is part of the knowledge base rather than application state.
Files
src/saved.ts
done when · tick each as it passeswatch out- Full text search alone cannot answer the questions typed objects exist to make answerable, and building only text search wastes the entire property model. The filter path is the reason for the schema and needs to be there from the start rather than added once the data is large.
Getting everything out
Your knowledge base leaves in a form you could read in ten years.
Properties in the front matter, body as Markdown. Readable without your application.
Files
src/export.tsExport, import, compare. A backup untested is not a backup.
Files
tests/roundtrip.test.tsTen thousand objects should not need ten thousand objects of memory.
Files
src/export.ts
done when · tick each as it passeswatch out- An export that loses references or property types is a backup you cannot actually restore from, and you discover that at the moment you need it. Test the round trip in the suite, comparing objects, properties and references after re-import.
Two machines, and never losing a noteproduct builder
You write on a second machine and nothing is lost or duplicated.
Object-level last-write-wins loses paragraphs silently.
Files
src/sync.tsVisibly, for you to resolve. Choosing for the user is choosing to lose something.
Files
src/conflict.tsCompare against the source. Backups that have never been restored are hopes.
Files
scripts/verify-restore.sh
done when · tick each as it passeswatch out- Last-write-wins at the object level silently destroys a paragraph written on the other machine, and because notes are rarely re-read immediately, the loss is discovered long after the version that had it is gone. Resolve at the block level and keep both sides when they genuinely conflict.
That is the whole plan for Capacities. What it deliberately does not cover is below · check the gaps before you call it a replacement.
- Collaboration and shared spaces.
- Mobile capture.
- AI features over the knowledge base.
- Web clipping with content extraction.
- object-model polish, mobile capture, sync, calendar integration, and AI features
- frictionless mobile capture
- real-time team editing
- hosted publishing
- proprietary AI memory
- Object templates, so creating a meeting pre-fills the properties you always want
- A graph view, once the references are trustworthy enough to be worth looking at
- Scheduled review surfacing objects you have not touched, which is where a base earns its keep
Need the files? The project pack on the verdict page hands your agent the whole brief · more notes & knowledge.