One row, every view
One row, three lanes. The card is wherever its status puts it, because a board is a way of looking at the table rather than a second copy of it — change the cell and the board has already moved.
7 formula dialects transpiled · 36 locales · self-hostable
Boards, timelines and dashboards over Postgres you can run on your own hardware: 47 page elements, {chartTypes} chart types and 24 dashboard widgets, every one of them free on every plan.
Not a screenshot — drawn on this page by the chart renderer the product ships, from sample data.
How it behaves
Every panel below runs on the rules the product runs on — the same statuses, the same transpiler, the same workflow. Nothing here is a recording, and nothing here is waiting for you to press play.
One row, three lanes. The card is wherever its status puts it, because a board is a way of looking at the table rather than a second copy of it — change the cell and the board has already moved.
monday.com
WORKDAYS({End},{Start}) Appdor (translated)NETWORKDAYS({Start}, {End}) Flagged on import: monday.com takes those two dates in the opposite order.
Smartsheet
NETWORKDAYS([Start],[End]) Appdor (translated)NETWORKDAYS({Start}, {End}) Converted with nothing to report.
Airtable
WORKDAY_DIFF({Start},{End}) Appdor (translated)NETWORKDAYS({Start}, {End}) Flagged on import: check how your own holidays should be handled.
Three source dialects, one output. The line on top keeps changing and the line under it never does — and where a dialect means something slightly different, that is written down instead of quietly returning a different number.
This is the workflow the manufacturing template installs, not an illustration of one. Three sentences, no scripting, and it runs on the row you just watched change lanes.
The shipped catalogue
Every element, chart and widget below is on the free plan and on the self-hosted build. The numbers on the tabs are counted from the code on each build, not typed in — and the twelve view types are in the band below.
Pick anything above and it will explain itself here.
We don't meter your dashboards.
Counted, not estimated. Every number below is checked against the code on each build.
Appdor reads 7 competitor dialects and rewrites them into one canonical formula — field references, function names and argument order. Every pair below is real output from the transpiler that ships.
DATETIME_DIFF({End},{Start},'days')Appdor (translated)DATETIME_DIFF({End}, {Start}, "days")WORKDAYS({End},{Start})Appdor (translated)NETWORKDAYS({Start}, {End})DATE_DIFF(field("End"), field("Start"))Appdor (translated)DATETIME_DIFF({End}, {Start})WEEKNUMBER([Due Date])Appdor (translated)WEEKNUM({Due Date})var text Code = Left([SKU], 3); CodeAppdor (translated)LETS(Code, LEFT({SKU}, 3), Code)formatDate(prop("Due"), "YYYY-MM-DD")Appdor (translated)DATETIME_FORMAT({Due}, "YYYY-MM-DD")USEREMAIL()Appdor (translated)USERID()Not everything maps cleanly, and that is reported rather than hidden: monday.com's WORKDAYS takes its two dates in the opposite order, and Smartsheet's weeks start on Monday. Appdor converts both and tells you what changed, instead of quietly returning a different number.
Twenty-two of them, and “which industry” is a published standard here rather than a list somebody wrote: the axis is NACE Rev. 2.1, the EU's classification of economic activities. Every section of it has a template that installs, and a field typed as an activity code is checked against the real code space — the gaps in it are the point.
The same axis filters the template gallery, so picking your section is how you find the system already built for it.
And the fields underneath them check the identifier as you type — the checksum, not just the shape.
The full Supabase stack, RLS-enforced, EU-friendly, no phone-home.
# Every secret below is EMPTY on purpose. # node scripts/generate-keys.mjs POSTGRES_PASSWORD= POSTGRES_DB=postgres JWT_SECRET= ANON_KEY= SERVICE_ROLE_KEY= # Leave blank to disable AI icon suggestions gracefully. GEMINI_API_KEY=▍
services: appdor: image: appdor ports: - "${WEB_PORT:-8080}:80" environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} JWT_SECRET: ${JWT_SECRET} ANON_KEY: ${ANON_KEY} SERVICE_ROLE_KEY: ${SERVICE_ROLE_KEY} POSTGRES_DB: ${POSTGRES_DB:-postgres} volumes: - appdor-data:/data▍
$ cp .env.example .env $ node scripts/generate-keys.mjs .env written with freshly generated keys. $ docker compose up -d --build http://localhost:8080▍
One container, one port, one volume — Postgres, auth, storage and the app together. It runs the free plan out of the box and keeps running it for as long as you like. Pro, Business and Enterprise features unlock with a licence you paste into the plan screen — checked against a key the image already carries, so there is still no licence server to call and no telemetry key to unset.
AI here is a billing arrangement, not a plan tier. You connect your own provider account and pay that provider directly at their list price. Appdor never sits between you and the meter.
OpenAI, Anthropic, Google Gemini, Mistral, DeepSeek, Groq, xAI, OpenRouter, Together AI or Azure OpenAI — or Ollama, LM Studio and any OpenAI-compatible endpoint on hardware you own. Revoke the key and every AI feature stops.
Appdor does not buy tokens and sell them back to you. There is no margin on a model call, and no allowance folded into your seat price that you pay for whether you use it or not.
Nothing to top up mid-quarter, and no per-seat AI charge for people who never open the assistant. Cap your own spend, change provider, or switch AI off entirely — nothing else in Appdor changes.
Thirteen providers today, read from the same registry the settings screen reads. Two of them run on hardware you own and cost nothing per call.
Model names change every few months. Whose account is billed, and where the data goes, does not.
| Appdor | Airtable | monday | |
|---|---|---|---|
| All views free | Yes | Gantt paid | Metered |
| Formula translation | 7 dialects | No | No |
| Self-host | Yes | No | No |
| Seat minimums | None | — | 3-in-blocks |
| AI pricing | Your own key | Credits | Per-seat |
25 templates install real tables, fields, formulas and sample rows — from a three-table project tracker to a 22-table manufacturing ERP. One click, and everything in them is yours to change.
No seat minimums. The same plans apply whether we host it or you do.
Read-only people are free on every plan, at any number. No seat minimums and no buckets — seven seats cost seven times one.
Estimates exclude any applicable tax (VAT or sales tax), which is added at checkout.
| Your monthly total | Editors | Viewers | Records | Automations | Files | Adds | |
|---|---|---|---|---|---|---|---|
| Free€0 | — | 5 included | Unlimited, free | 2,500 per base | 250 / month | 1 GiB per base |
|
| ProMost popular€12/editor/mo€10/editor/mo billed annually | — | Billed per editor | Unlimited, free | 50,000 per base | 25,000 / month | 20 GiB per base |
|
| Business€28/editor/mo€22/editor/mo billed annually | — | Billed per editor | Unlimited, free | 150,000 per base | 100,000 / month | 100 GiB per base |
|
| EnterpriseCustomfrom €40/editor/mo | — | Billed per editor | Unlimited, free | 500,000 per base | 500,000 / month | 1 TiB per base |
|
Only live runs count. A dry run previews a workflow in your browser and writes nothing, so testing an automation never spends the monthly allowance.
Delete this application? Its tables and records go with it, and any public share or form links stop working immediately. You can restore it from Trash in Administration.
Select an element to add to your page. Elements are building blocks for your interface.