Skip to content

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

titleauthorpagesstatus
The Left Hand of DarknessUrsula K. Le Guin304reading
PiranesiSusanna Clarke272to read
DuneFrank Herbert412read
A note with a table property is a row. Edit either side; the engine keeps them the same.

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.

Database/database.yaml
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] }

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
insert_row refused — nothing was written:
invalid Database/main/public/book/Dune.md: pages must be at least 1

Every write is journaled with who made it: the agent, its model, its session. One undo_migration puts the notes back as they were.

list_migrations
20261008T091502-insert_row insert_row book by claude-code / opus
20261008T091140-add_column add_column book by you

Start with the quick start, or read how it works.