Builds

Every build, and what it changed.

Each TestFlight build of the Yui app, newest first, with the screens it brought. The build number counts the commits in the app repo, so every build has a clear list of changes. The ship log has the full story, including work on this site and the spec.

Release

Where the next release stands

Yui 0.6.0 shipped as build 351. 2 changes are on main for the next one. The timeline, live from the board.

Built in public Feedback becomes a card, an agent builds it, it ships to TestFlight, and the site says so. 60 s, share it

Next build

Waiting on Apple

Done in the code, not on TestFlight yet. We upload once per release and Apple caps uploads per day, so these go up together as the next build. It gets its number when it uploads.

  1. Build 370

    Sep 29, 2026
    • A deploy can no longer run ahead of its database changesYUI-211
    • Hold the Yui icon, get your agents' shortcutsYUI-191
    • Key vault plugin: yui_key_ask, vault_call, key_answer line (YUI-34 step 2, plugin lane)
    • Wire the key vault into the Yui adapter and test it (YUI-34 step 2, plugin lane)
    • Key vault relay: sealed keys, per-agent grants, audited uses, cap holds, key_ask no-nag (YUI-34 backend)
    • Vault relay checks: RLS, sealed column, grants, holds, once, lapse, key_ask and key_answer (YUI-34 backend)
    • yui-vault Edge Function: HPKE-opened keys, token/grant/path/cap checks, fixed hosts, scrubbed logs; connector public key (YUI-34 backend)
    • Vault proxy tests: wrong agent, revoked, path, cap and holds, once, provider refusal, CryptoKit interop, no key in any log line (YUI-34 backend)
    • Key vault in the app: Keychain store, Settings > Keys (add by paste or scan, Face ID, no reveal, iCloud off), key-shaped sends held, key_ask sheet, HPKE sealing, Controls > Keys with Revoke (YUI-34 step 2)
    • Pin the real vault connector key yvk-1 in the app and the function (YUI-34 step 2)
    • Yui plugin: a typed line gets a note naming the agent's newest message
    • Yui plugin: channel guide v41
    • Reply quotes the screen: title plus its first rows
    • yui-mcp reads the semibold type base (YUI-211, yuigui a2d0291)
    • Stage polish: six-line question, mic stays with a quiet Back home, roomy Type your own
    • Several chats, on your phoneYUI-169
    • The board says who has each card, and done means linkedSITE-110
    • Reply quotes a list's items; card + ask reply regression test
  2. Build 351

    Sep 29, 2026
    • Hold to talk keeps every wordYUI-209
    • Chat top bar: the agent chip and its dropdown are gone, the drawer is the only agent picker (YUI chip, feedback AJw_G3S2)
    • Your own key: Claude, ChatGPT, Gemini and Grok join the providers, each with a seeing default so no model id is needed (YUI-139 step 2, server half)
    • Your own key at every stop: a photo the pick can't see says so, a lookup on a key with no web search says it ran on Yui's; a test per stop on a stub key (YUI-139 step 2c)
    • Own key: OpenRouter one-tap sign-in (PKCE) and My computer (keyless, reach check) (YUI-139 step 2b, server half)
    • Your own key at every stop in the app: one plain key form (plan line, where to make a key, add Yui in Claude or ChatGPT) in Settings, the limit card, Add agent and Controls > Model (YUI-139 step 2e)
    • Per-agent model key: one agent on Claude, the rest on Yui (YUI-139 step 2f, server half)
    • Controls > Model: pick which key each agent runs on, Yui's, Claude or ChatGPT (YUI-139 step 2g)
    • A deploy can no longer run ahead of its database changesYUI-211
  3. Build 342

    Sep 29, 2026
  4. Build 332

    Sep 29, 2026
  5. Build 329

    Sep 29, 2026
  6. Build 288

    Sep 28, 2026
  7. Build 281

    Sep 28, 2026
    • Tables right in the reply, for any agentYUI-171
    • Fix the 0.5.0 crash on switching agents and on launch: save the hellos you have met as a plain array
    • Yui 0.5.1: the switch-agents and launch crash fixYUI-181
  8. Build 278

    Sep 27, 2026
  9. Build 258

    Sep 27, 2026
  10. Build 244

    Sep 27, 2026
  11. Build 229

    Sep 27, 2026
  12. Build 216

    Sep 27, 2026
    • Channel guide v34: agents send a tuner and a metronome (YUI-116, yuigui 0bbd205)
    • Explainers draw every pageYUI-157
    • YuiLines: 39-map.json waits for the app half of maps (YUI-158 step 2)
    • yui-mcp: sync the YL parser and MCP App for maps (YUI-158 step 1)
    • Plugin: a flow the phone can't run goes out as a planYUI-155
    • A form inside a plan is just fields: one Send per screenYUI-156
    • One Send per screen, picks tooYUI-159
  13. Build 208

    Sep 27, 2026
    • A tuner and a metronome in the app (YUI-116 step 4)
    • Channel guide v33: agents send keys and chords (YUI-116, yuigui 85bbee1)
    • Record a take, plug in a keyboard (YUI-116 step 5)
    • Agents send a tuner and a metronomeYUI-116
  14. Build 204

    Sep 27, 2026
  15. Build 176

    Sep 26, 2026
    • Hold to reply, no more swipe: the sideways drag always pages (feedback AACnEo9w)
    • DrawerTests pass again: the About card's id no longer covers its button
    • A quiet dot on the menu button, no count; it goes the moment nothing waits (feedback AI3Pbaid)
    • It says what it is doingYUI-63
    • Agents make their own flows: variantsFLOW-1
    • The working row says what the agent is doing (YUI-63 step 2, app half)
    • Speed numbers are stored onceYUI-107
    • yui_library: agents find ready-made screens and flows over MCP; guide v28 (FLOW-2 step 2)
    • Outside agents draw like the appINT-3
    • Flow variants reach the copies (FLOW-1 step 3, yuigui cbf1e7a)
    • Music vectors wait for the app half (YUI-116 step 1)
    • yui-mcp reads and draws the music presets (YUI-116 step 1, yuigui 5414ba3)
    • Working row says how long this agent usually takes
    • Swift parser reads the six music presets; 37-music.json passes (YUI-116 step 2)
    • YuiSound, and loop and drums that play (YUI-116 step 2)
    • Yui 0.3.2: ship main to TestFlight (Chris, Sep 26)
  16. Build 160

    Sep 26, 2026
    • Half-typed words stay: each agent's thread keeps its own draft (feedback AK-9fNEZU)
    • Channel guide v25 bundled (feedback APSw0dsa): a lesson is one screen. Synced from yuigui 6b035e2.
    • A lesson is one deckYUI-113
    • An answered war room ask leaves at once: the plugin redraws the war room after a tap (feedback ANP2Pn6z)
    • Yui 0.3.1: ship main to TestFlight (Chris, 2026-09-26)
  17. Build 155

    Sep 26, 2026
  18. Build 148

    Sep 26, 2026
  19. Build 138

    Sep 26, 2026
  20. Build 135

    Sep 25, 2026
    • Group threads: the plumbing is liveYUI-93
    • Shared agents, database side (YUI-95, step 2 of YUI-57; spec yuigui spec/AGENTS.md "Shared agents"). WIP: plugin + app proof follow.
    • Hermes plugin: shared agents on the host (YUI-95). The heartbeat and session report this profile's sandbox (sandbox.py) so Yui can mark the agent client-safe. A shared thread is its own Hermes session (chat_id <agent id>~<user id>; the owner's stays the agent id) and replies go back to that person. Before any turn for someone other than the owner the sandbox is checked again: if it no longer passes, the turn does not run, the person reads "This agent is paused by its owner.", the owner gets one card naming the rule, and a heartbeat clears client_safe at once. War room, Needs you and invite taps from anyone but the owner are refused with one line; board and mention notes go only into the owner's turns; an agent's @s never leave a shared thread. test_shared 13/13, every plugin test green (test_screen_talk harness now names the owner).
    • Shared agents on the simulator (YUI-95): shared_agents_e2e.py + YuiUITests/SharedAgentTests. A throwaway owner's host reports a shell, grant.py refuses (exit 3); the host reports a sandbox, the template (Penny, candy, a first message, by Sam) goes out on an @example.com invite (--no-testflight); the invitee claims it and signs in: Penny is in the list in her look and her first message waits (light, then dark); grant.py revoke mid-test and on relaunch she is gone. 8/8. Regression after the migration: agents_test 80/80, invites_test 54/54, mention_test 38/38, relay_test 51/51.
    • Shared agents follow-up (YUI-95): rows with no agent pass the owner-or-grant trigger and stay readable and deletable by their user, as before (accounts_test caught it); the two trigger functions are not callable by the app or a host. Migration 20260925090000_yui_shared_agents_fixes.sql, applied to PROOF. accounts_test and strangers_test allow the three grant checks the message policies call (strangers also names YUI-93's yui_group_notes, which failed before this card). accounts_test 73/73, strangers_test 85/85, shared_agents_test 81/81.
    • Restyle Yui by asking, native (YUI-96, step 2 of YUI-43; spec yuigui spec/RESTYLE.md).
    • Yui now times itself: speed numbers from real phones, every dayYUI-102
    • Shapes that move, native (YUI-104; spec yuigui spec/YL.md "shapes"; Chris on build 96: "simple SVG style vector graphics... basic shapes both geometric and organic to show some complex ideas very quickly... not an immersive experience, still just in the chat with captions").
    • Shared agents, step 3 (YUI-97, step 3 of YUI-57; spec yuigui spec/AGENTS.md "As built (YUI-97)").
    • The MCP server and Telegram read Yui Lines like the app againINT-22
    • Typing keeps up on a long thread (YUI-99). Chris on build 96: "when I hold the backspace button it goes very slow, and if I hit space twice, it is slow to create the period."
    • A full-screen page never comes up blank (feedback AKsr0Ha8)
  21. Build 122

    Sep 25, 2026
  22. Build 96

    Sep 25, 2026
    • Meta Muse Spark in Yui as a model (INT-11). --server meta (or muse) on the model bridge: Meta Model API's base URL (https://api.meta.ai/v1), key from $MODEL_API_KEY at run time (the name Meta's docs use), nothing stored, muse-spark-1.3 unless --model says otherwise, a 32k thread window. Where Meta's API differs from OpenAI's, the client copes: a bad key's 401 invalid_api_key reads as a key problem, 402 billing_error says the balance ran out and does not retry, a 403 for a model the key can't use says that instead of blaming the key, a content policy 400 reads as the safety filter, a context 400 says to lower --context or --max-tokens, 429 waits as long as Retry-After says (the bridge now honors it for any server), a plain 504 gateway_timeout does not retry and says to let it stream, an error event mid-stream (service_overloaded) waits and asks again, a 404 with no body still reads as not found, and the always-empty reasoning_content changes nothing. No request carries stop, n or logit_bias. fake-model.ts --meta replays those shapes; client.test.ts 65/65 (17 new), A2A tests 46/46. No live call to Meta yet: it waits on a Model API key (public preview, US developers).
    • LangGraph agents in Yui (INT-14). LangGraph's own Agent Server (langgraph dev, and LangSmith deployments; langgraph-api 0.13+, https://docs.langchain.com/langsmith/server-a2a) serves every graph over A2A at /a2a/{assistant_id}, so the A2A bridge pairs a graph by its card, /.well-known/agent-card.json?assistant_id=<id>. That server turns each text part into its own message under one id (a second text part replaces the first) and drops part metadata, so the guide sent as a marked text part never reached the graph. For a card listing LangChain's A2A extensions (isLangGraph), the bridge now sends one text part and one data part, {"yui_channel_guide": {version, body}, "yui_events": [taps]}, which LangGraph hands the graph as state keys; every other agent gets the same parts as before. tests/sdk/langgraph_agent.py is a scripted graph (no model) that declares those keys, draws a choose screen only when the guide names it, and answers a tap from its data. a2a_e2e.py --protocol langgraph on live Yui, a throwaway account: pair by the ?assistant_id= card (A2A 1.0), a turn answered once, a screen the YL parser reads, the tap read from yui_events, the thread (contextId = thread_id) holding the guide in state and never as a chat message, clean stop, account deleted, 12/12. The ADK run shares the same runner now. A2A client tests 45/45 (3 new), SDK interop 4/4, scripted e2e 66/66, openai-compat 65/65. No threads/runs adapter: every Agent Server serves A2A unless its owner turns it off.
    • Agent bubbles draw markdown (YUI-76). A slash command's answer (/status: **Model:** `claude-...`) and any host's markdown no longer show raw marks: bold, strikethrough, inline code and fenced code blocks on a soft tint, bullet and numbered lists (nested ones step in), headings as bold lines, and links, which tap only for https (others keep their words). BubbleMarkdown parses per line with Foundation's inline markdown; a ```yui fence stays word for word, and anything malformed (an unclosed ** or fence, a half link) stays as written. The person's bubbles are unchanged. Copy, Select text, VoiceOver, the reply quote and the long-answer fold and pages all take the plain words, so a folded excerpt never ends in a stray **. Bold is set in the theme's own weight; italic draws upright, since SF Rounded has no italic. -yuiDemoMarkdown seeds a /status answer and one of each element. Tests: BubbleMarkdownTests 11/11 in YuiTests 94/94 (PushToTalk skipped, it hangs on the sim); MarkdownBubbleTests 2/2 (light, dark, held), LongMessageTests, ReplyTests and SelectTextTests green on the iPhone 18 Pro sim.
    • The hold menu fits any message (YUI-78, TestFlight feedback AFduDX-JwEKyTFAt4pnYIPY: "the copy button and the emojis are competing here, and I can't select the emojis"). Holding a message taller than the screen used to lift it under the header, drop the reaction bar at the bottom and clamp the menu on top of it. Now the overlay lays out one column: the reaction bar always above, the held message, the menu always below, all inside the window and clear of the header and each other. A message too tall for the room between them lifts as a preview of its top with a soft fade at the cut. A short one stays where it was held; one at the top comes down under the bar, one at the bottom lifts for the menu. The menu is measured as drawn (Remove row, bigger type) rather than guessed, and gains a Share row. Tapping the preview closes, like tapping the thread; the lift is a few points at most so it never reaches the bar or the menu. Menu icons keep pace with the theme's fixed-size words at large Dynamic Type. Copy and Select text still take every word. -yuiDemoHold seeds a checklist taller than any phone, a message at the top, one at the bottom and a card. Tests: HoldLayoutTests 6/6 (the layout math), YuiTests 100/100 (PushToTalk skipped, it hangs on the sim); HoldMenuLayoutTests light, dark and AX3 on the iPhone 18 Pro and the iPhone 17e (frames inside the window, bar over, menu under, no overlap, every emoji and row tappable, with and without Remove, tap outside closes, Select text has the full words); SelectTextTests, ReplyTests and MarkdownBubbleTests green.
    • n8n workflows in Yui, three ways (INT-17). adapters/n8n is n8n-nodes-yui, a community node "Yui" (TypeScript, n8n's node conventions, no runtime dependencies, usable as an AI Agent tool): Ask and Wait puts a screen on the phone and holds until the tap, then hands the next node choice, echo, value, the [yui] line and the screen id; Send Screen returns the screen id and tap ids; Wait for Answer reads the tap on a screen sent earlier; Send Message writes a chat line. It talks to yui-mcp with plain JSON-RPC (yui_show, yui_answers with wait=25 in a loop up to the node's timeout, yui_say), signed by a Yui API credential holding the yui_ct_ token. Lines Yui can't read fail the node with the parser's own message and nothing is sent; typed text during a wait rides along in also_wrote unless Taps Only is off; a timeout fails or outputs timed_out. workflows/ holds three importable workflows: the AI Agent with n8n's MCP Client Tool (HTTP Streamable, Bearer Auth, yui_show/yui_answers/yui_say, 40 s timeout) on Ollama, the Yui node asking lunch and saying what happens next, and a Webhook trigger answering turns from the webhook bridge (path E, a tap arrives as kind event). Tests: npm test 10/10 against a fake yui-mcp. tests/n8n_e2e.py runs a real n8n 2.40.7 (Node 24, empty user folder) with this package installed from npm pack and the three workflows published, on a throwaway account in live Yui: qwen2.5:7b put one choose screen up through the MCP Client Tool, it parsed with the YL parser, the tap came back through yui_answers and the agent answered "You picked Soup for lunch."; the Yui node returned the tap flat and its Send Message used it; the bridge's "hi" got a screen and the tap got "Soup it is"; account and n8n folder deleted, no token in the log, 22/22. Not on npm or n8n's community list.
  23. Build 91

    Sep 25, 2026
    • The chat stays on your newest messageYUI-74
    • Your own model, in YuiINT-12
    • No more text bombsYUI-79
    • Yui in Telegram, step 1: the renderer (INT-4). adapters/telegram turns an agent reply (chat text and ```yui fences) into Telegram Bot API messages. ask, choose and pick become inline keyboards: a button carries y:<token>:<index> (callback_data stays under 64 bytes) and the component waits in a Store the bot supplies, so a tap turns back into the exact line the phone sends ([yui] n2 choose choice=Legs), with the app's rules: changed answers say changed, an identical answer is not sent twice, graded quizzes carry correct, a screen brought back with show carries saved, pick toggles in place and goes out on Done, max= holds. say, list, card (url= as a link button, cta= as a callback), stat, table, step and timeline become formatted HTML text. Everything else (timer, slide, form, media, chart, math, calc, deck, plan, project, narrate, game, custom) is listed in one Open in Yui message whose web_app button opens the whole fence in the Mini App at yuigui.com/tg (share-code link, same ids). src/webapp.ts takes Mini App taps back: readWebAppData for sendData, readBridgePost with verifyInitData (Telegram's HMAC check on initData) for a bridge. Parser and event formatter are yuigui's, copied by scripts/sync-vendor.mjs, never forked. Runtime neutral, no dependencies. node yui-telegram.ts render --yl --tap 0,1 prints the calls and the lines taps send, no bot needed. Tests: npm test 62/62 (every preset in yl.mjs placed, none dropped; all 61 playground samples; tap round trips; initData checked against node:crypto; vendor copies current); miniapp_e2e.mjs 128/128 in Playwright against the /tg page (every sample in Telegram's dark and light themes, the adapter's link opens the same screen, taps through sendData and the bridge arrive as the phone's line with initData the bot verifies). No bot runs it yet: that needs its own BotFather token (step 2).
    • Gemini in Yui, two ways (INT-9). A Gemini model: --server gemini on the model bridge (Google's OpenAI-compatible base URL, key from $GEMINI_API_KEY at run time, nothing stored, a 32k thread window by default). Where Gemini's endpoint differs, the client copes: models/ comes off listed ids, errors wrapped in a list read as their message, a bad key's 400 INVALID_ARGUMENT reads as a key problem, 429 RESOURCE_EXHAUSTED waits, thought summaries (extra_content.google.thought pieces, or a leading <thought>/<thinking> block) stay out of the answer, a blocked answer (content_filter, SAFETY) gets one line saying the filter stopped it, and a stream with no opener whose last piece carries text and finish reads whole. fake-model.ts --gemini replays those shapes; client.test.ts 37/37 (11 new). A Gemini agent: tests/sdk/adk_agent.py, a Google ADK LlmAgent served over A2A by ADK's own to_a2a, on local Ollama qwen2.5:7b through LiteLLM (no key); its before_model_callback moves the part marked {"yui": "channel_guide"} into the model's instructions. a2a_e2e.py --protocol adk on live Yui, a throwaway account: pair by ADK's card (A2A 1.0), a turn answered once, a choose screen the YL parser reads (only the guide tells the model about Yui), a tap answered once, clean stop, account deleted, 9/9. A2A client tests 42/42. No live call to Google's API yet: it waits on an AI Studio key.
    • The chat never gets stuck shrunkYUI-80
    • Grok in Yui as a model (INT-10). --server grok on the model bridge: xAI's base URL (https://api.x.ai/v1), key from $XAI_API_KEY at run time, nothing stored, grok-4.7 unless --model says otherwise (presets can now carry a default model, so try, pair and add need no --model with one), a 32k thread window. Where xAI's API differs from OpenAI's, the client copes: errors as {"code", "error"} read as the error, a bad key's 400 "Incorrect API key provided" reads as a key problem, a 403 for a team out of credits or at its spending limit says so instead of blaming the key and does not retry, 429 waits, reasoning_content stays out of the answer, a refusal with no content is shown instead of nothing (streamed or plain), and no request carries stop or the penalties that reasoning models refuse. fake-model.ts --grok replays those shapes; client.test.ts 48/48 (11 new), A2A tests 46/46. No live call to xAI yet: it waits on an xAI key.
  24. Build 82

    Sep 25, 2026
  25. Build 74

    Sep 25, 2026
    • A newly added agent answers what you sent before its gateway came up: pairing and the gateway restart are separate steps, and the plugin started a first-seen agent's cursor at "now", so anything sent in between was skipped for good and the app sat on "Sent to an agent" (TestFlight feedback AMiI7ezKx6x1KcexlzOKYJc: an agent paired 22:36, gateway never restarted, "Did we stall?" never answered). A new agent now starts a day back (new_agent_floor); only unhandled user rows are fetched, so nothing already answered replays. Proof on the live case: cleared the agent's cursor, restarted, both waiting messages went in as one turn and an agent replied in 21s. Plugin only, no app build needed.
    • Links in a card open SafariYUI-67
    • Copy any part of a message: hold an agent bubble, Select text opens its words read-only, drag to select and Copy (or Copy all); a bubble at the bottom lifts so the menu never covers it (TestFlight feedback AG9JzU4LeWl-TFeKWftiFIE). Reply to a message is YUI-68. SelectTextTests 2/2 light + dark (no keyboard, whole text, Done closes), ComposerTests.testReactionLeavesTheComposerEmpty, YuiTests 44/44
    • A timeline for the war roomYUI-65
    • Drag the war room queue into your own orderYUI-66
    • Games: tic-tac-toe, snake and memoryYUI-59
    • Outside agents draw like the appINT-3
    • Reply to one messageYUI-68
    • The war room, built outYUI-73
  26. Build 64

    Sep 25, 2026
  27. Build 61

    Sep 24, 2026
  28. Build 57

    Sep 24, 2026
  29. Build 33

    Sep 24, 2026
  30. Build 31

    Sep 24, 2026
  31. Build 30

    Sep 24, 2026
  32. Build 29

    Sep 24, 2026
  33. Build 27

    Sep 24, 2026
  34. Build 26

    Sep 24, 2026
  35. Build 23

    Sep 24, 2026
  36. Build 22

    Sep 24, 2026
  37. Build 21

    Sep 24, 2026
  38. Build 20

    Sep 24, 2026
  39. Build 19

    Sep 24, 2026
  40. Build 18

    Sep 24, 2026
  41. Build 16

    Sep 24, 2026
  42. Build 14

    Sep 24, 2026
  43. Build 13

    Sep 23, 2026
  44. Build 11

    Sep 23, 2026
  45. Build 10

    Sep 23, 2026
  46. Build 9

    Sep 23, 2026
  47. Build 8

    Sep 23, 2026
  48. Build 5

    Sep 23, 2026
  49. Build 4

    Sep 23, 2026

Try Yui, or help build it

Get the alpha

The MVP is done and Yui is in alpha, open to anyone with an iPhone on iOS 26. Download it on TestFlight, then connect the agent you already run: Hermes, OpenClaw, Claude Code, a model you run, or anything behind a webhook.

Star it on GitHub

Yui is open source under Apache 2.0. Star the repo, open an issue, or send a pull request.

Lend your agent

Spare tokens on Claude or ChatGPT Codex? Your agent can pick a card off our backlog and open a pull request. Yui@home, like SETI@home.

Want a hand getting in?

You don't need this to try Yui: the alpha on TestFlight is open to anyone with an iPhone on iOS 26. Leave your details if you have no agent yet, want help connecting one, or would rather Apple email you the invite.

  1. Yui emails you a link to confirm your address.
  2. We read your request, and reach out if you asked for help.
  3. Apple emails you a TestFlight invite.
  4. Open it on your iPhone, install Yui, and sign in with Apple.

We use this only to get you into Yui. Privacy.