iPhone widget for AI agents

Your AI agents,
on your home screen.

Kondai gives every user one end-to-end encrypted widget. Your agent writes it, your phone renders it natively, and the server never sees what it says.

Free. Two MCP tools. Zero plaintext on our servers.

How it works

One file per user. Three hops, and only one of them can read it.

1

Your agent writes the widget

Claude Code, or any MCP client, calls put_widget with a small JavaScript program: pages, text, charts, timers, buttons.

2

It's encrypted on your machine

The Kondai MCP server runs locally and holds your data key. The script is sealed with XChaCha20‑Poly1305 before it leaves the process.

3

Your iPhone renders it natively

The widget extension fetches the ciphertext, decrypts it with the key in your Keychain, runs the script in JavaScriptCore and draws it with SwiftUI. A silent push refreshes it in seconds.

A real program, not a template

The widget file is JavaScript. Your agent builds a native view tree through a tiny runtime API, and the system draws it.

PagesNo scrolling in widgets, so Kondai has pages. Buttons switch between them in place, no app launch.
Live timers & countdownsTimers, relative dates and progress bars tick on their own, rendered by iOS.
ChartsBar, line and area charts from plain {x, y} data.
Canvas graphicsA Canvas 2D subset over Core Graphics, rendered at 3× for crisp custom visuals.
Buttons that open appsAny URL scheme or universal link: Maps, Spotify, Shortcuts, phone, mail.
Full viewOptional HTML detail screen inside the app when you tap, scrollable, video OK.
Medium & large4×2 and 4×4 home screen families, plus extra large on iPad. Stack several, one per page.
SandboxedNo network, no filesystem, no timers inside the script. Data travels in the file. 2 s budget.
// what your agent writes
const w = kondai.widget();
const p = w.page();

p.column(c => {
  c.text("Today", { font: "caption" });
  c.text("3 things", { font: "title" });
  c.list([
    { title: "Ship v0.2 notes", detail: "11:00" },
    { title: "Call with Priya", detail: "14:30",
      url: "facetime://[email protected]" },
  ]);
  c.chart({ type: "bar",
    data: [{x:"M",y:4},{x:"T",y:6},{x:"W",y:9}] });
  c.button("Open Maps", "maps://?q=coffee");
  c.button("Page 2", { page: 2 });
});

w.refreshAfter(30);

Two tools. That's the whole integration.

get_widget returns the current script and version. put_widget replaces it. The tool descriptions carry the full runtime reference, so an agent can write a valid widget with no other docs.

Optimistic versioning means two agents can't silently clobber each other. Scripts are capped at 512 KiB.

Works with Claude Code, Claude Desktop, Cursor, and any client that speaks MCP over stdio.

The server stores only ciphertext

Kondai is designed so that a leaked database, a leaked backup, or a compromised server cannot reveal a single widget.

  • Keys never leave your devices.Your password is stretched with Argon2id on your machine. One subkey logs you in, a different one unwraps your data key. The server only ever sees the login key.
  • Every widget is sealed end to end.XChaCha20‑Poly1305 with the version bound into the authenticated data. Decryption happens in the MCP process and in the widget extension, nowhere else.
  • Recovery key, shown once.Lose your password and a 52‑character recovery key unwraps the same data key. Rotate it any time.
  • Nothing to sell, nothing to read.We hold your email, a salt, two verifiers, two wrapped keys and one blob. Logs carry no bodies and no tokens. Delete your account and it's all gone.

Read the privacy policy →

Get started

A few minutes from nothing to a widget your agent keeps up to date.

  1. Install the Kondai iOS app and create your account. Write down the recovery key it shows you.
  2. Add the widget to your home screen: long‑press, tap +, pick Kondai.
  3. Connect your agent with the two commands below. Needs Node 20 or newer.
  4. Ask your agent to update your widget. That's it.
App Store listing coming soon
# sign in once; the password is never stored
npx -y @kondai/mcp login

# register the MCP server with Claude Code
claude mcp add kondai -- npx -y @kondai/mcp

# or, in any MCP client's config:
{ "mcpServers": { "kondai":
    { "command": "npx",
      "args": ["-y", "@kondai/mcp"] } } }