A folder of notes, run as a database
Datanotes turns the notes you already keep into typed tables. You keep editing them as notes; programs and AI agents read and write them as rows, through checks that refuse bad data and a journal that can undo any change.
Database/main/public/book/Dune.md
---
table: main.public.book
title: Dune
author: Frank Herbert
pages: 412
status: read
---
Read it twice. The second time for the ecology.select_rows table: book
| title | author | pages | status |
|---|---|---|---|
| The Left Hand of Darkness | Ursula K. Le Guin | 304 | reading |
| Piranesi | Susanna Clarke | 272 | to read |
| Dune | Frank Herbert | 412 | read |
table property is a row. Edit either side; the engine keeps them the same.Tables are written down in one file
Section titled “Tables are written down in one file”database.yaml holds every table, column and view. Agents create and change it for you with
operations like create_table and add_column; you can read it like any other note.
catalogs:main: schemas: public: tables: book: properties: filename: "{title}" columns: - { name: title, type: string, required: true } - { name: pages, type: integer, min: 1 } - { name: status, type: enum, values: [to read, reading, read] }Agents write through the same checks
Section titled “Agents write through the same checks”The MCP server gives Claude, Cursor or Codex every operation as a tool. A value that breaks the table is refused, and nothing is written.
insert_row refused — nothing was written:invalid Database/main/public/book/Dune.md: pages must be at least 1Any change can be undone
Section titled “Any change can be undone”Every write is journaled with who made it: the agent, its model, its session. One
undo_migration puts the notes back as they were.
20261008T091502-insert_row insert_row book by claude-code / opus20261008T091140-add_column add_column book by youStart with the quick start, or read how it works.