Coda

coda.iocontributed by Samuele Ongaro

ALMOST

A weekend of work, and real gaps remain.

A document that contains databases: tables with typed columns and formulas live inside pages of text, with buttons and automations that change the data from where you are reading it.

Promptfree, for everyone, and the only version there is
Build me a document with databases in it, replacing Coda — and know why this is ALMOST.

Tables and pages are separately easy. What is hard is **one formula language that spans the whole document**: a paragraph that references a table's rows, a button that mutates data from inside the text, a table that filters by a value defined three pages away. That single namespace is the product, and it is a compiler problem rather than a feature.

STACK
- Node 20+ with Fastify, server-rendered HTML with a little vanilla JS
- SQLite through better-sqlite3, WAL mode
- Caddy in front

THE DATA MODEL
- docs: id, name, owner_id, created_at
- pages: id, doc_id, parent_id, title, content_json, position — the content is a block tree of text, headings, and embedded views
- tables: id, doc_id, name; columns: id, table_id, key, label, kind, formula, config_json
- Rows in real SQL tables per user table, created and altered by generated migrations. A generic key-value store makes every constraint impossible and every formula slow
- views: id, doc_id, table_id, kind, filters_json, sorts_json, group_by, columns_json — embedded into a page, so a view is a block
- controls: id, doc_id, kind, name, value_json — a select, a date, a slider defined on a page, referenced by formulas anywhere in the document
- buttons: id, doc_id, label, action_json, condition — insert a row, modify rows, run a sequence
- formula_deps: from_kind, from_id, to_kind, to_id — the dependency graph, which is what makes recomputation correct

THE FORMULA LANGUAGE, WHICH IS THE PROJECT
- One expression language, one namespace: tables, columns, rows, controls and named values are all addressable from anywhere in the document
- Parsed into an AST, type-checked, and compiled into a dependency graph. A cycle is rejected at save time, not discovered at render
- Values: numbers, text, dates with zones, booleans, and lists of rows — the last one matters, because filtering and aggregating a table is the most common thing anybody writes
- Functions in three groups: arithmetic and text, dates, and list operations — filter, map, sum, count, first, sort, group. That is most of a spreadsheet's usefulness in about thirty functions
- Row references are stable identifiers, not positions. Sorting a table must not change what a formula points at
- Errors shown in place with the reason, and a formula that fails on one row does not break the page

RECOMPUTATION
- On a write, walk the dependency graph and recompute only what depends on what changed. Recomputing everything is what makes these documents slow at the size where they become useful
- Formulas evaluated on read where the input is a query, and cached with an invalidation keyed to the graph
- A formula that touches a whole table must have a row cap and a timeout, so one careless expression cannot stall a document

BUTTONS AND AUTOMATIONS
- A button is a named action with a condition: add a row, set values on the rows a formula selects, send an email, call an endpoint
- Every press recorded with what it changed. A button that silently modified forty rows and cannot be explained is the worst thing this product can do
- Automations on a schedule or a row change, with the same action vocabulary, every run recorded, retries with backoff, and a per-recipient daily mail cap

PACKS, HONESTLY
- Two-way integrations with other services are what the paid tier is really selling. Each one is an adapter with authentication, pagination and rate limits, and each breaks when the other service changes
- Build the two you need as small modules with fixtures and tests. Do not build a plugin framework for integrations you have not written

OPERATIONS
- .env: DATABASE_PATH, BASE_URL, SESSION_SECRET, ENCRYPTION_KEY
- Migrations on boot, each once; nightly backup off the machine, restore script
- Health endpoint that evaluates a fixture formula

WHAT MATTERS MOST
The dependency graph. Build the parser, the graph and the incremental recomputation before a single page looks good — everything else in this product is a table or a text editor, and both of those are solved.

What you lose

  • A formula language that spans documents and tables, closer to a spreadsheet than a database
  • Buttons and automations that mutate rows from inside the document
  • Packs — two-way integrations that pull live data from other products into a table
  • Real-time collaboration with presence, comments and per-section permissions
  • The free-for-editors pricing, which is why whole teams end up inside it

If you would rather not build

  • Notion — paid, the direct competitor, weaker formulas

What it costs

read from their page 15 Aug 2026

PlanBilled monthlyBilled yearlyLast read
—$12/mo—15 Aug 2026

Their pricing page is where these came from. Seeing a different price? Tell us.

The escape hatch

open source · no votes, no paid placement

Grist

$0

Spreadsheet-database with Python formulas and granular access rules, self-hostable.

gristlabs/grist-corefree · open source

AppFlowy

$0

Documents and databases in a similar shape, storing their data locally.

AppFlowy-IO/AppFlowyfree · open source

Why this verdict

our own opinion · changed only by a person

49/100

Verdict kinda at 49: tables, views and a small formula language are a real weekend, and the revision table is straightforward. Where the build stops is live collaboration and Packs — the integrations are the reason a team keeps the doc open all day.

History

tracked since 9 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 1/day
views0130 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

Questions about Coda

answered from the record above

Is Coda free?

No — the plan we track is $12 a month. Pro at $12 per Doc Maker per month billed monthly, $10 annually; editors and viewers are free, which is unusual for this category.

Can you replace Coda by building your own?

ALMOST. A weekend of work, and real gaps remain. Replacement score 49 out of 100, build time a weekend. Read what you lose before you decide.

How much does Coda cost?

$12 a month on Pro — $144 a year. Recorded 9 Aug 2026.

What do you lose by replacing Coda?

A formula language that spans documents and tables, closer to a spreadsheet than a database; Buttons and automations that mutate rows from inside the document; Packs — two-way integrations that pull live data from other products into a table; Real-time collaboration with presence, comments and per-section permissions; The free-for-editors pricing, which is why whole teams end up inside it. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Coda?

Yes: Grist, AppFlowy. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 16 in No-code apps & databases

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc