Skip to content

Sample Apps

Three runnable sample Apps, Tick’s one file, Lintel’s property operations and Ladle’s general path: what each shows, how to start it, and where to look.

Start with the smaller one if you are new: Tick is a whole App in a single file. Lintel is the flagship, a complete App in modules with its own test suite. Ladle is the general path: a host’s own React site and server with the App inside. All are synthetic data over SQLite, Lintel over PostgreSQL too, each with a README holding the full recipe.

To see Read
A whole App in one file, with inline types, quick add and autosave Tick
Fixed actions that set a field Tick
Roles that extend roles, field grants, and a resident who sees only their household under a row policy Lintel: app.ts, policy.ts
State machines with groups, a timer on a date, stock a line consumes and a delivery restocks Lintel: resources.ts
Commands that change several tables in one transaction, with refusals Lintel: commands/
Boards, queues, a gantt, a calendar and cards refined from a rail Lintel: views.ts
Dashboards with windows, comparisons, steps and charts Lintel: dashboards.ts
Record pages: a conversation with a reply and note composer, a gallery, a price headline Lintel: pages/
A landing page, a public listing and an anonymous form Lintel: landing.ts, views.ts, commands/viewing.ts
A job, an event and the workflow it starts, and a signed callback Lintel: jobs.ts, late-fees.ts
Email to a person with no account, only while they agreed Lintel: resources.ts (notify)
An App’s own tests in layers, with a clock and a browser Lintel: tests/
PostgreSQL seeds Lintel
A free-form page beside declared lists, the handler in a server of your own, the App in a React app of your own Ladle: pages/, host/

The repository catalog (examples/apps/README.md) names the file that shows each capability. What none of them shows (a CRM pipeline, a theme of your own, tenancy, a forum, a warehouse) is a pattern in the agent skill’s recipes or the guides under Choose a building block, not a sample.

The samples ship in the npm package, seeds included. A project of their own needs the package, and the sample you want copied out of node_modules: Node does not run TypeScript from there.

Terminal window
mkdir try && cd try && npm init -y && npm pkg set type=module
npm install tablewalk typescript

Each seed takes a new database path, writes the database and a writable connection file beside it (<path>.json), and refuses to overwrite either. Lintel and Ladle sign people in, so they also need, once per shell:

Terminal window
export BETTER_AUTH_SECRET="$(node -e 'console.log(require("node:crypto").randomBytes(32).toString("hex"))')"
export TABLEWALK_AUTH_ADMIN_EMAIL=admin@example.test TABLEWALK_AUTH_ADMIN_PASSWORD=a-long-local-password

The first start creates that administrator; sign in with it. Each server prints its address, http://localhost:4111/ unless you pass --port.

Tick: a checklist of open tasks with counted tabs.

A to-do list in one app.ts: a checklist with quick add, a New form whose date hides once a task is done, Complete and Reopen actions, a hand-kept order and autosave. No menu, no sign-in.

Terminal window
cp -r node_modules/tablewalk/examples/apps/tick ./tick
node node_modules/tablewalk/examples/databases/tick/seed.mjs ./tick.db
npx tablewalk --config ./tick.db.json --app tick

From a source checkout, the same files are under examples/: npm run start -- --config /tmp/tick.db.json --app examples/apps/tick.

Open /, then the Overdue tab, then a task. Follow Tick in fifteen minutes to change it. README (examples/apps/tick/README.md)

A property company’s three Denver buildings, run from one App by two audiences. The office works a staff desk: leasing, a manager, technicians and an accountant, with a rent roll edited in place, an occupancy gantt, a repair board and Today, a dashboard of the morning. Residents sign in to the same App and see only their own household: their charges, their repairs and a conversation with the office. Signed out, a visitor browses the homes to let and asks for a viewing. Rent is posted by a job on the first of the month, a late-fee workflow follows it, parts used on a repair come off the storeroom’s shelf, a finished repair emails the resident, and the payment processor’s signed callback settles a charge once. It wears Lumen.

Terminal window
export LINTEL_MAIL_SECRET=$(openssl rand -base64 24) PAYMENT_CALLBACK_SECRET=$(openssl rand -hex 16)
cp -r node_modules/tablewalk/examples/apps/lintel ./lintel
LINTEL_APP=./lintel node node_modules/tablewalk/examples/databases/lintel/seed.mjs ./lintel.db
npx tablewalk --config ./lintel.db.json --app lintel \
--jobs lintel/jobs.ts --policy lintel/policy.ts --port 4610

Keep the two secrets exported in the shell that starts the server. From a source checkout, use node --import tsx examples/databases/lintel/seed.mjs and npx tsx src/server/index.ts with the examples/apps/lintel paths.

Open / signed out for the front page and /listings, then sign in as the administrator for Today, /leases and /repair-board. On PostgreSQL, seed-postgres.mjs takes an empty database. The README (examples/apps/lintel/README.md) says what each file teaches. Read the App piece by piece in the DSL in one App.

  • app.ts: the roles, home rules by role and the shell.
  • resources.ts: what each table says once, including the machines.
  • commands/: every business write, one module for each part of the business.
  • policy.ts: the row policy, and the services the jobs run as.
  • jobs.ts, late-fees.ts, events.ts: the monthly job, the workflow and the signed callback.
  • views.ts, dashboards.ts, navigation.ts, landing.ts, pages/: the screens.

tests/ is the App’s own suite, written on tablewalk/testing and Playwright alone, the way an App’s repository would hold it, and the worked reference for testing an App in layers. It starts the App with its jobs and policy (start.ts), then checks every grant in authority.lock as a matrix (permissions.test.ts), rent posted once and the late-fee workflow on a test clock (ledger.test.ts), a repair’s visit, parts and consent-gated email (maintenance.test.ts), the signed payment callback (integrations.test.ts), a resident’s portal (portal.test.ts) and the public, staff and phone journeys in a browser (*.spec.ts).

Terminal window
node scripts/test-node.mjs examples/apps/lintel/tests/*.test.ts
npx playwright test --config examples/apps/lintel/tests/playwright.config.ts

A cooking school: classes, bookings and a check-in page for the door, inside the school’s own React site. The general path in one project: the check-in page is drawn whole by the App’s own code (pages/check-in.page.tsx); the school’s Node server mounts the App’s handler beside a JSON route of its own (host/server.ts, host/schedule.ts); and the school’s site, in its own design, embeds the staff App under its header with tablewalk/react (host/main.tsx).

Terminal window
cp -r node_modules/tablewalk/examples/apps/ladle ./ladle
LADLE_APP=./ladle node node_modules/tablewalk/examples/databases/ladle/seed.mjs ./ladle.db
npx tablewalk --config ./ladle.db.json --app ladle

That serves the App on its own. For the school’s site around it, install the host’s dependencies (npm install vite @vitejs/plugin-react react react-dom tsx) and run npx tsx ladle/host/server.ts ./ladle.db.json 4620: / is the public schedule, /staff the App. The README (examples/apps/ladle/README.md) has the source-checkout recipe.