Changelog.

What shipped, and when. Newest first, dated by the day the work landed on main — host releases carry their version.

Six themes, and a task screen that says what it does

Three dark themes and three light ones. Midnight — the default — is unchanged, down to the hex: if you liked the old look, you already have it. Sepia and Nocturne join it on the dark side; Daylight, Parchment, and Mist are the light ones.

  • The palette became a typed registry, so the CSS variables, the pre-paint boot script, the picker swatches, and Clerk's chrome are all generated from one source instead of three hand-synced copies. Contrast is a build failure now, not a review note.
  • The task screen states its own layout: chat on the left, one panel on the right, with a tab strip for TLDR, Diff, and Code Editor. The diff is a panel beside the conversation that produced it, not a drawer over the top of it.
  • Browser on and Previews 0/0 — two controls asking the same question in two vocabularies — collapsed into one Preview menu with a Watch section and a Dev servers section, each port reporting reachability in words.
  • Fixed: a task you started and navigated away from never got its opening prompt delivered. Delivery was wired to a page load rather than to the launch, so it worked only because people usually watch a task they just started. It fires from the launch now — which is what a scheduled run, with nobody present, always needed.

Recurring task schedules

Give a task a cron expression and a timezone and it runs without you. Each occurrence clones your template into a fresh task, branch, and chat, so last night's run is a diff you read this morning rather than a thread you untangle.

  • Run history per schedule. An occurrence due while the previous one is still live is skipped, and downtime coalesces into a single catch-up run rather than replaying a backlog — twelve missed hours don't become twelve containers.
  • Schedules re-check permissions and org membership at the moment they spend, not at the moment you saved them — so one that outlives its grant stops rather than fires.
  • A pending occurrence can no longer be claimed out from under the scheduler — including across the whole retry window while a host is offline, where the next tick would have torn down whatever someone else had started.

The composer also grew up. @ gets a typeahead instead of asking you to spell a handle from memory, ``` makes a code block you can actually type inside, makes a list that can reach a second item, and : opens an emoji picker. Attachments show image thumbnails rather than a filename and a generic icon.

  • A mention inside a code block used to route. Pasting a snippet containing @someone woke that agent and overrode the recipient you had picked. Mentions are prose, never code, and now there is exactly one definition of that in the codebase.
  • Backspacing into @ada left @ad — still a pill, still routing to an agent whose name was no longer on screen. Mention pills delete whole.
  • Pasting a URL onto selected text wraps it as a link instead of replacing what you selected.

The TLDR panel — a task summary you can check

Coming back to a busy task, the tail of the feed doesn't tell you where things stand, and reading the whole thing is the cost this product exists to remove. There's now a read-only panel beside the chat that answers "what happened while I was gone?"

  • Deterministic facts and generated ones are deliberately kept on separate surfaces — they have different cost, latency, and trustworthiness, and conflating them is how a feature like this goes wrong. Activity and Artifacts are projections of things that already happened: who is doing what, and every link, upload, and preview the task produced, indexed instead of scrolled away.
  • The generated digest — decisions made, questions still open — runs only when you ask for it, never on a page load or a panel open.
  • Every line of the digest cites the message it came from, and citations are re-validated server-side against the snapshot they were written from. Click one and you land on that exact message in the chat.

Organization roles and permissions

One permission catalog covering people and agents alike. Roles are additive and assignable several at a time, and they gate personas and hosts the same way they gate members.

  • Organization administration moved into the Uai settings shell: General, Members, Roles, and Billing.
  • Every API handler declares the permission it requires, with coverage checked in both directions — a handler can't quietly ship ungated.
  • Every organization starts with a managed Org Admin and Member role. The Member baseline matches exactly what members could do before, so turning roles on granted and revoked nothing.
  • Empty states say what is true for the reader. A member without permission to create agents no longer gets told their organization is empty and handed a task they can't perform.
  • An org admin can close any task in their org. A task belongs to one person but spends the org's budget and pins a host slot, and before this an abandoned one could only be stopped by an owner who might be on holiday. Closing is the only owner-level action an admin inherits — it uses nothing of the owner's credentials.

Drafts that follow you, handles you chose, faces you recognize

Typing into the composer and switching tasks used to throw the text away. Drafts now persist on the device on every keystroke and sync to the server per task, so you can start on the laptop and finish on the phone. Staged attachments are remembered with the text.

  • A failed send keeps your message. It used to show an error and wipe the composer.
  • Humans are mentioned by the username they picked, not by a guess taken from the first word of their display name — and everyone on a task shows their real avatar, not just you.
  • Every task gets a reliable browser by default, so agents can drive and verify a page rather than reason about it.

In-app support, and a GitHub connection that survives first contact

  • A support panel in the app with attachments, backed by a doc-grounded assistant that escalates to a real ticket when it can't answer.
  • Connecting GitHub stopped dead-ending: the first connect chains into the install picker, callbacks survive membership-sync lag, and a refused token connection reports the vendor's actual reason instead of a generic failure.
  • Sign-in works behind per-task preview URLs.

Watch it ship in your own repo.

The fastest changelog is the one in your task feed. Start a task and see.