1
1 line
The line you write.
Adding a field is one declaration — a name and a type. The database, API, screens and agent tools all come from that line, so there is nothing else to write by hand.

The TypeScript framework, agents included.
Powered by Bun
No tool schemas, no MCP server to write, no second permission model. The app you build for people is already the one AI can use — on the model you choose.
Paste it into Claude Code or Codex, and it sets up the workspace and starts your app. See the prompt or the terminal command ↓
1 line×8 layers×6 platforms×people & agentsThe usual way
Agents already read screens and call APIs for the people they work for. Getting an app ready for them is usually a second project — stacked on the first one you already wire by hand.
…for one field. Then again on every platform you ship.
Screen → agent
Server → AI
01 / 04
/mcp is on by default. Every endpoint whose guards admit the caller is a tool, described by the dictionary you already write.
02 / 04
OAuth 2.1 ships with libs/shared. The AI gets a token for this one user — exactly their rights, revocable at any time.
03 / 04
Ask in plain words. It calls your endpoints through the same guards and services as your screens — and the board that's open updates live.
04 / 04
refundIcecreamOrder is guarded by Person, so it never reaches the shelf. To the AI it looks exactly like a tool that doesn't exist.
Guard → everyone
You write a guard once per endpoint. It decides for a person on the screen, for the agent in their tab, and for an AI calling over MCP.
| Action | PersonPerson | AgentIn-page agent | MCPAI over MCP |
|---|---|---|---|
Place an order createIcecreamOrder | ✓ | asks first | ✓ |
Serve an order serveIcecreamOrder | ✓ | ✓ | ✓ |
See today's sales icecreamOrderSummary | ✓ | ✓ | ✓ |
Refund an order refundIcecreamOrder | ✓ | ✓ | — not on the shelf |
Remove an order removeIcecreamOrder | ✓ | asks first | ✓ |
asks first — the in-page tool waits on an approval card · not on the shelf — the endpoint never reaches MCP
Refusals give nothing away
A tool an agent may not use answers exactly like one that doesn't exist, so the shelf leaks nothing.
Rate-limited per caller
MCP calls are capped at 120 a minute and 8 at once for each caller.
Secrets stay home
Hidden and secret fields are stripped before anything reaches a model.
Connections end when you say
Revoke a connection and its next call is refused. The chat relay keeps no session and no transcript.
How it works
The screen an agent drives, the server any AI calls, the guard that judges them all — none of it is a second project. It all grows from a line like this.
1name: field(String)
Scroll and watch it grow
1
1 line
Adding a field is one declaration — a name and a type. The database, API, screens and agent tools all come from that line, so there is nothing else to write by hand.
×8
8 layers
That one line drops through the schema, query, service, API, fetch, client type, state and UI prop — the eight places of the first project, now changing together. Nothing to chase, nothing to miss.
×6
6 platforms
The same code ships as SEO-ready web, iOS and Android apps, and macOS, Windows and Linux desktop apps — with native-level screen transitions, not a wrapped website. One implementation to maintain, not six to keep in step.
×2
people & agents
Every guarded endpoint becomes an MCP tool and every control on screen an in-page agent tool, behind the same guards people pass. The screens, servers and guards you saw above all start here — in code you already wrote.
1 line × 8 layers × 6 platforms × people & agents
One line runs through every layer, lands on every platform and reaches everyone who uses it — people and agents. Type-safe from the database to the screen, and all you wrote was the line.
Agents build it, too
The faster an agent writes code, the more file paths, names, structures, and declaration styles drift apart — until review and maintenance fall over. Akan stops this at the source with strict rules.
It runs in both directions. Agents use the app through the same guards people pass. And agents build it on strict rules and fixed blocks — upload, login, admin, chat, boards, alerts — so they produce nothing but consistent code. Not an abstract idea, but quality that rules make.
This site
Ask the docs
Every docs page carries the in-page agent. Ask about a topic; it searches the docs and opens the page for you.
Open the docs26MB → 8.1MB
Client build output in v3
3.5ms → 0.9ms
Hydrating 1,000 rows on the client
−33%
Time for a 50-row list query
v3 benchmark
Startup 2× faster, a third less memory
The TypeScript framework, agents included.
Hand one prompt to your coding agent, or run one command yourself, and the workspace is ready. The next line you write ships to web, iOS, Android, desktop, your server and database — and to every agent your users talk to.
Set up a new Akan.js workspace for me (https://akanjs.com). 1. Check that Bun 1.4 or newer is installed (`bun --version`). If it isn't, install or upgrade it as https://bun.sh describes. 2. Ask me for a workspace name and a first app name, short and lowercase, unless I wrote them below. 3. In this directory, run `bunx create-akan-workspace@latest <workspace> --app <app>`. It installs the akan CLI globally, creates ./<workspace> and installs its dependencies. 4. Inside ./<workspace>, start the dev server in the background with `akan start <app>` and check that the URL it prints (http://localhost:8282 by default) loads. 5. Tell me it's running, and that I should reopen you inside ./<workspace>: the project's Akan MCP server and AGENTS.md rules load from there.
Akan Cloud is the deploy platform built for Akan apps. Sign in from the CLI, share a preview, build, and ship it live.
Open Akan Cloud$ akan login
Sign in to Akan Cloud from your machine.
$ akan tunnel <app>
Share the app you are running on a public URL before you ship.
$ akan build <app>
Build the production artifact Akan Cloud runs.
Read for humans. Write for agents.

Claude CodeMCP
→ koyo.example/mcp
›serveIcecreamOrder("1043")✓
…for one app. Then kept in step with the first, by hand.
01 / 04
A field handed its setter publishes it. A button's handler becomes a tool with one st.tool line — the same function the button calls.
02 / 04
Every control you wired is published under its own name, with the arguments it takes. What isn't on the screen isn't on the list — no lever the user doesn't have.
03 / 04
It runs in the customer's own tab, with their session — exactly like a click. You watch the pointer land on every control it uses.
04 / 04
A tool declared with confirm stops on an approval card. Approve, and the handler the button calls runs — through the same guards.
Setup: one <Agent.Chat /> in a layout, and your model's key.
✓serveIcecreamOrder"1041"served
✓serveIcecreamOrder"1042"served
✓serveIcecreamOrder"1043"served
✓icecreamOrderSummary42 orders · ₩273,000
Served 3 orders. Today so far: 42 orders, ₩273,000.
Refund #1042 too.
✕refundIcecreamOrderUnknown tool
I don't have a refund tool for koyo — you'll need to refund it in the app.
Config Hell Ends
Configure everything in akan.config.ts. Even when you configure nothing, defaults keep the product moving.
Strict Rules, Unified Style
File paths, names, structures, and declarations stay consistent. Code reads like one person wrote it.
Rules Agents Can't Route Around
Every workspace ships a plan-then-apply workflow MCP and akan code, so an agent edits through the rules, not around them.
Agentic Full-Stack, Redefined
Fixed blocks for upload, login, admin, chat, boards, and alerts let agents produce consistent code.
Connect your AI
akanjs.com answers MCP. Point Claude Code or Cursor at it, and your AI reads these docs while it writes your code.
listDocPages · searchDocPages · readDocPage