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.
How it works
One file per user. Three hops, and only one of them can read it.
Your agent writes the widget
Claude Code, or any MCP client, calls put_widget with a small JavaScript program: pages, text, charts, timers, buttons.
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.
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.
{x, y} data.// 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.
Get started
A few minutes from nothing to a widget your agent keeps up to date.
- Install the Kondai iOS app and create your account. Write down the recovery key it shows you.
- Add the widget to your home screen: long‑press, tap +, pick Kondai.
- Connect your agent with the two commands below. Needs Node 20 or newer.
- Ask your agent to update your widget. That's it.
# 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"] } } }