Akan.js
DocsBlogCase StudiesRoadmapDeploy
Akan.js
DocsBlogCase StudiesRoadmapDeploy
DocsBlogCase StudiesRoadmapDeploy
Akan.js

Released under the MIT License

  • Official Akan.js Consulting onAkansoftCopyright © 2026 Akan.js All rights reserved.System managed bybassman

    Akan.js

    The TypeScript framework, agents included.

    Powered by Bun

    • Web
    • App
    • Server · DB
    • Infra
    • Agent
    New · Akan.js v3 — agents join the full stack

    Build a screen.Agents can use it.Build a server.Any AI can run it.

    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.

    Get started

    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 & agents

    Flip it — every mock on this page has a second face.What a model reads: tools and their arguments, not pixels.

    The usual way

    Your next user doesn't click.

    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.

    ▾+ namethe first project
    • schemaDefine the DB schema
    • queryAdd the query field
    • serviceAdd the service logic
    • apiAdd the API field
    • fetchAdd the fetch field
    • typeDeclare the client type
    • stateDeclare the state management
    • uiDeclare the UI prop

    …for one field. Then again on every platform you ship.

    Screen → agent

    IcecreamOrder.Zone.tsx

    Server → AI

    Your server is already an MCP server.

    Claude Code● koyo · 12 tools

    Add an MCP server

    https://koyo.example/mcp

    ●Connected — 12 tools from koyo

    listIcecreamOrderscreateIcecreamOrderserveIcecreamOrdericecreamOrderSummaryremoveIcecreamOrder+7

    Also: claude.ai · Cursor · any MCP client

    Serve every order that's ready, then tell me today's total.

    ✓listIcecreamOrders{ status: "processing" }3 orders

    1. 01 / 04

      Point any MCP client at your app.

      /mcp is on by default. Every endpoint whose guards admit the caller is a tool, described by the dictionary you already write.

      icecreamOrder.signal.ts
    2. 02 / 04

      Sign-in and consent happen on your app.

      OAuth 2.1 ships with libs/shared. The AI gets a token for this one user — exactly their rights, revocable at any time.

    3. 03 / 04

      Then it just works.

      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.

    4. 04 / 04

      And it can't do what it shouldn't.

      refundIcecreamOrder is guarded by Person, so it never reaches the shelf. To the AI it looks exactly like a tool that doesn't exist.

    icecreamOrder.signal.ts

    Guard → everyone

    One rule. Three kinds of users.

    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.

    ActionPersonPersonAgentIn-page agentMCPAI over MCP

    Place an order

    createIcecreamOrder

    guards: [Every]

    ✓asks first✓

    Serve an order

    serveIcecreamOrder

    guards: [Admin]

    ✓✓✓

    See today's sales

    icecreamOrderSummary

    guards: [Admin]

    ✓✓✓

    Refund an order

    refundIcecreamOrder

    guards: [Every, Person]

    ✓✓— not on the shelf

    Remove an order

    removeIcecreamOrder

    guards: [Admin]

    ✓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

    All of it is one line.

    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)"name": {"type": "string"}

    Scroll and watch it grow

    guards

    name: field(String)

    • ui
    • state
    • type
    • fetch
    • api
    • service
    • query
    • schema

    Web

    iOS

    Android

    macOS

    Windows

    Linux

    people

    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.

    ×8

    8 layers

    Through every layer.

    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

    Onto every platform.

    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

    For people and agents alike.

    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 star. The whole sky.

    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

    AI coding turns to spaghetti past a certain size.

    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.

    This is what we mean by agentic full-stack.

    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

    These docs run on it, too.

    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 docs

    26MB → 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.

    Start with one line.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.

    From build to a live URL

    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
    1. 01

      $ akan login

      Sign in to Akan Cloud from your machine.

    2. 02

      $ akan tunnel <app>

      Share the app you are running on a public URL before you ship.

    3. 03

      $ akan build <app>

      Build the production artifact Akan Cloud runs.

    $bunx create-akan-workspace@latest

    It asks for a workspace and an app name, then installs the akan CLI and the workspace's dependencies.

    Get started In-page agent MCP Case Studies

    Read for humans. Write for agents.

    9:41
    koyo#1043● Preparing● Served

    Greek yogurt soft serve

    Fresh fruit, crunchy granola

    from ₩4,500

    ◇ fillIcecreamOrderForm
    Size◇ setSizeOnIcecreamOrder
    100g150g200g
    Toppings◇ setToppingsOnIcecreamOrder
    MangoGranolaStrawberryOreoBananaFig
    How◇ setServeTypeOnIcecreamOrder
    For hereTake outDelivery
    Total₩4,500₩6,500
    ◆ createIcecreamOrder()confirm
    Order
    koyo assistant✕

    150g, mango and granola — to go.

    ✓size✓toppings✓serveType

    Place this order? · ₩6,500

    {"size":150,"toppings":["mango","granola"],"serveType":"takeOut"}
    DeclineApprove

    ✓Approved · order #1043 placed

    Claude CodeMCP

    → koyo.example/mcp

    ›serveIcecreamOrder("1043")✓

    1. 01Agent fills the form
    2. 02Person approves
    3. 03AI serves it via MCP
    ▾agent/the second project
    • tools.jsonEvery action, described again for a model
    • mcp-server.tsA second server beside your API
    • oauth/Sign-in and consent for AI clients
    • permissions.tsWho may do what — written a second time
    • ui-bridge.tsGlue so a chat can press your buttons
    • ApprovalDialog.tsxA human check before anything that matters

    …for one app. Then kept in step with the first, by hand.

    The screen you build is the agent's interface.

    9:41
    koyo#1043● Preparing● Served

    Greek yogurt soft serve

    Fresh fruit, crunchy granola

    from ₩4,500

    ◇ fillIcecreamOrderForm
    Size◇ setSizeOnIcecreamOrder
    100g150g200g
    Toppings◇ setToppingsOnIcecreamOrder
    MangoGranolaStrawberryOreoBananaFig
    How◇ setServeTypeOnIcecreamOrder
    For hereTake outDelivery
    Total₩4,500₩6,500
    ◆ createIcecreamOrder()confirm
    Order
    koyo assistant✕

    150g, mango and granola — to go.

    ✓size✓toppings✓serveType

    Place this order? · ₩6,500

    {"size":150,"toppings":["mango","granola"],"serveType":"takeOut"}
    DeclineApprove

    ✓Approved · order #1043 placed

    1. 01 / 04

      Write the screen you were going to write.

      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.

      IcecreamOrder.Zone.tsx
    2. 02 / 04

      An agent sees tools, not pixels.

      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.

    3. 03 / 04

      Ask, and it works the screen.

      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.

    4. 04 / 04

      What matters waits for a yes.

      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

    tools/call {"name":"listIcecreamOrders","arguments":{"status":"processing"}}

    tools/call {"name":"serveIcecreamOrder","arguments":{"icecreamOrderId":"1041"}}

    tools/call {"name":"serveIcecreamOrder","arguments":{"icecreamOrderId":"1042"}}

    tools/call {"name":"serveIcecreamOrder","arguments":{"icecreamOrderId":"1043"}}

    tools/call {"name":"icecreamOrderSummary","arguments":{}}

    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.

    koyo

    Authorize access

    Application
    Claude Code
    Returns to
    localhost:33418

    This application runs on your own computer. Continue only if you started this request yourself.

    It will be able to do everything your account can do until you sign it out.

    DenyAllow
    koyokitchenlive
    PreparingServed
    #1041150g · mango✓
    #1042100g · oreo✓
    #1043150g · mango, granola✓
    agents

    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.

    MCPhttps://akanjs.com/mcp

    listDocPages · searchDocPages · readDocPage

    {"tools":[
      {"name":"listDocPages","title":"Documentation Index"},
      {"name":"readDocPage","title":"Read Documentation Page"},
      {"name":"searchDocPages","title":"Search Documentation"}
    ]}