How Uai works.
A chat, a summary pane, a crew of personas, the backlog they draft, the schedule that reruns it, a container, an editor, in-app review, a live preview, browser testing, your own credentials, and the roles that decide who may do what — the architecture, in the order you'll meet it.
1. The chat loop
A task is a Slack-style channel with a goal. You set a global context for the task; each agent gets its own kickoff prompt; any agent with a non-empty kickoff opens the first turn the moment its container is ready.
Mention @agent-id to address one directly. The
orchestrator routes the message; the agent answers in-channel. No
hidden side conversations.
2. Catching up
A busy task outruns you. Come back after lunch and the tail of the feed doesn't tell you where things stand — and reading the whole channel is exactly the cost Uai exists to remove.
So a task has two halves: the chat on the left, and one panel on the right — TLDR, Diff, or Code Editor, one at a time. You decide what the right half is for. Nothing ever slides over the conversation to show you something else.
TLDR is the catching-up half. Activity is who is working on what, right now. Artifacts indexes what the task has produced — links, the files people sent, the pull request and its diff, preview URLs, and everyone on the channel — so nothing useful scrolls away.
On paid plans it also generates a Digest: a short read on the goal, where it stands, what's blocked, and what's next. Every claim in it cites the messages it came from, and clicking a citation jumps to that exact message — so you can check the summary against the transcript instead of trusting it. Uai pays the model for the digest out of a monthly allowance; it never touches your keys.
3. Personas & the crew
You don't configure agents per task — you design
personas and reuse them. A persona is a named,
reusable teammate: a name and @handle, an avatar, a role
and brief (its system prompt), an engine (Claude or Codex, with model
+ effort), attached skills, permissions for what it may do, and
cross-task memory that carries what it learned into the next task.
Group personas into Teams — a saved lineup with a
leader — and drop a whole team onto a task as a unit. The specific
agents on one task are its crew: they answer
in-channel and review each other — an @architect
proposes, a @reviewer pushes back — before anything
reaches you. The host advertises which engines and models it
supports; the picker filters to what's actually available.
4. Agents that plan
Point a planner persona at a goal and it drafts the backlog for you — fully-configured task and subtask drafts that stay inert until you approve them with Start. You green-light the plan; nothing runs on its own.
Subtasks carry the parent's chat as context and kick off when the parent closes.
5. Work that repeats
Some work isn't a one-off. A nightly dependency bump, a morning PR sweep, a weekly changelog — you already know how to describe the task and read its output. The only missing piece is someone to click Start at 3am.
A schedule owns a template task: the whole configuration — projects, crew, context, host. Each occurrence clones it into a fresh task with its own branch, container, and chat, so runs never share state and last night's mess can't bleed into tonight's. Every run is recorded, so a schedule has a history you can read.
Set it from the composer's Repeat control — daily, weekdays, weekly, every N hours, or five-field cron behind an advanced escape hatch — with a preview of the next few runs before you commit. Your timezone is stored alongside it, because "every day at 09:00" is a wall-clock promise, not an interval.
- Cadence
- Five-field cron plus an IANA timezone, validated together. One hour is the floor — a five-minute schedule is 288 containers a day, which is never what anyone meant.
- Last run still going
- Tonight's is skipped. Two containers doing the same job is the expensive kind of surprise.
- Cloud was down
- One catch-up run, not a backlog — twelve missed hours don't become twelve containers. Or skip it entirely; that's the default.
- A run keeps failing
- Five consecutive failures disable the schedule and push you a notice, rather than burning a container a night in silence.
- Who may set one
- A permission of its own, off by default. Starting a task once is spending money with a human present; scheduling one commits the org to spending it again every night. See roles.
6. The container
Every task runs in a fresh Docker stack named task-<id>.
For each selected project Uai creates a git worktree
on the task's branch and bind-mounts it into the container.
One standard image per host carries the agent CLIs and a runtime
base; per-folder versions come from each repo's
.tool-versions via asdf. Your main
workspace is never touched.
7. The editor
Every task container runs code-server — the same
VS Code engine you know. It's the Code Editor tab
of the right panel; it and the chat point at the same worktree.
Edit a file mid-conversation. Drop a debugger. Run a command in the integrated terminal. The agents see your edits the moment they read the file again.
8. In-app review
Before anything ships, you review it. Switch the right panel to Diff and it spans every repo in the task, split or unified, comparing the task branch against your default branch — sitting beside the conversation that produced it rather than covering it up.
Approve what's right; send the rest back with a message — no leaving for "go check GitHub."
9. The preview
Declare a preview port on the project (e.g. web → 3000).
Every task gets a subdomain URL like
<taskId>-web.preview.runuai.com that proxies
straight into the running dev server inside the container.
Hot reload works because it's a real dev server. By default the URL is private, gated by a signed cookie; on Dev and up you can make it public — cookie-free, guarded only by an unguessable task ID — to hand to a teammate or point QA at it.
10. Browser testing
Turn on browser testing for a project and agents get a headless Chromium through the Playwright MCP — so they can drive the running app, click through a flow, and check their own work against a live preview before handing it back.
Opt-in, per project.
11. The credentials
Every task carries the task-creator's own credentials, not the host
operator's. The host generates a per-user SSH keypair — you paste
the public key into GitHub once — and keeps the private key
encrypted under the host master key, never touching your
~/.ssh. Commits are authored with your git identity
(name and email), so a task clones and pushes as you.
GitHub uses the Uai App with user-to-server tokens, so every PR
opened and every comment posted attributes to you, not to a bot.
Tokens live in the container's ~/.config/gh/hosts.yml;
the host refreshes them before each 8-hour expiry.
12. Roles & permissions
One person's org needs no governance. The moment it has contractors, "may this human do this?" becomes a real question — and it is not the same question as "did the org pay?"
So an org defines roles. A role carries permissions, caps, and the personas and hosts it unlocks. A member holds as many roles as you like and their access is the union of them — the model you already know from Discord, pointed at a dev team. May chat on tasks, may not enroll hosts, may not touch project env is a sentence you can now actually write down.
One catalog covers both audiences: the same permission ids gate what a member may do and what an agent's CLI may do, so the two can't drift apart. And caps only ever clamp down against your plan, never up — a role distributes what the org already bought; it can't sell more of it.
Nothing changes on the day you turn it on. Every org gets roles, seeded with exactly two — Org Admin and Member — and Member grants precisely what a member could always do. A persona or host gated by no role stays usable by everyone. You narrow access when you actually mean to.
Admins get one power over other people's work, deliberately: they can close any task in the org. A task is one person's authorship but the org's spend, and it pins one of the org's host slots — so a runaway task started by someone now on holiday needs an off switch. Everything else at that level still runs under the owner's own credentials.
See the whole loop in your repo.
Design a crew, start a task, and watch the whole loop come together — on a host you control.