alden

Alden in your browser

alden ui opens your review queue in the browser: the PRs waiting on you, a briefing on each, the PR's diff, and the comments you're writing, which you send to GitHub as one review. It shows the same briefings as the CLI, from the same engine, and runs on your machine like the rest of Alden. The desktop app shows this same UI in a window.

Alden in the browser: the queue on the left, a Django PR's briefing in the middle, and the Comments drawer on the right

Start it

cd ~/code/shop        # a clone of a repo you review
alden ui

Alden opens the page in your browser. Run it from a clone of a repo you review, as with alden review: Alden finds callers there, and My changes reviews that clone's uncommitted changes. PR briefings also find callers in other clones Alden knows (see Configuration).

Flag What it does
--port <n> Serve on this port instead of a free one.
--no-open Print the link instead of opening a browser.
--json Print one JSON line with the link and port, and don't open a browser. The desktop app uses it, and it turns on background briefings.

Stop it with Ctrl+C. The link holds a session key, so open Alden from the link it prints; a new run makes a new one.

The layout

Below 960px wide, the queue and the PR take turns: pick a PR to open it, and ← Queue or Esc goes back. At 700px and narrower, the Comments drawer is a full-width sheet over the briefing.

The UI follows your system's light or dark appearance unless Settings picks one. Its fonts (Geist and Geist Mono) are served by Alden itself, under the SIL Open Font License.

Signing in

With no GitHub sign-in at all, the page opens on the first run: sign in, choose how Alden thinks, then your queue, one screen each (see First run; Skip setup leaves it, Settings → Run setup again brings it back). If GitHub no longer accepts Alden's sign-in, or you skipped the first run, the queue says so and offers:

If you signed in in a terminal instead (alden auth login), I've signed in looks again. If Alden still can't see a sign-in, it says why: the keychain refused to answer (as it does for an unsigned development build of the desktop app), GitHub rejected the token, or there's no sign-in anywhere.

The queue

The queue has two groups: Ranked for you, and Fast-track, small low-risk PRs you can clear quickly. Above them, Your turn (in teal) lists the PRs you reviewed where something happened you haven't seen, when there are any (see below). Each row is two lines, so a long queue scans quickly:

The selected row also says why it ranks where it does. A reason marked ↑ or ↓ comes from your own feedback, and "↑ your rule: payments/ first" from a rule you set (see Ranking). On a PR you reviewed before, it says when ("Reviewed 2 days ago"), and once something has happened to your comments, it counts it ("3 of your 5 comments resolved"). See The review queue for how ranking works, and Re-reviews.

Your turn. A PR you reviewed that isn't in your queue, where someone answered you since, shows at the top: its title, what happened ("Ana replied to 2 of your comments · 1 resolved"), and when ("3h ago"). Click it to open the PR, with the Comments drawer's Conversation open on the thread the news is in; it stays in the list while it's open, and leaves once you move on. A PR that's in your queue (a re-review always is) gets the news on its own row instead, in teal under it, the same way. Search and filters don't hide Your turn; your queue's scope does. It follows each PR's follow-up level (Off hides it) and shares what you've seen with the desktop app's notifications. See Your turn for what counts, and what it asks of GitHub.

Under the search, a line says how the queue is sorted ("Sorted by rank") and how old it is. When you open the page, the last queue shows at once (up to a day old), "as of 3 min ago, refreshing…" until the current one arrives. r, or a click on "as of …", fetches it again. A PR you've opened shows ✎ 2 while it has comments waiting to be sent.

The first time, a card at the top asks whether to send anonymous usage stats. Your answer is kept, and Settings changes it.

Search, filters and sort

The Filter popover set to django/django with CI passing: 3 of 32 PRs, beside a briefing

Alden fetches your whole queue (up to the 1,000 PRs a GitHub search returns), so search and filters cover all of it.

j and k (or ↓ and ↑) move through the queue as it's shown, opening each PR. Filters and sort are remembered in this browser until you reset them; the search isn't.

Collapse the queue

[, or the [ button beside Filter, folds the queue into a thin rail, so the PR takes the full width. [ again, or a click on the rail, brings it back. / and j/k still work while it's folded, and the fold is remembered like the filters. Below 960px wide there's nothing to fold.

React to a PR

The selected row has Useful, Not useful and Dismiss (or +, − and x), in plain words under it. Useful and not useful teach Alden which PRs like it to rank higher or lower ("ranked lower: you usually skip Dependabot PRs"). Dismiss moves a PR to the bottom until it changes; dismiss it again to undo. Briefing a PR from the queue counts as opening it, which teaches Alden too. See The review queue and Learning and memory.

A briefing

Over the briefing, the PR's header has a mono line ("acme/api #482 · ana → main · 6 files · +214 −38"; the repo and number open it on GitHub, and the bell beside it sets its notifications), the title, the reading steps with Comments (s) and Draft my review, and the age line: when it was briefed, Brief again, the model line and Export.

Pick a PR, then Brief me (or b). Alden fetches the PR, finds the callers of the code it changes, runs its checks and asks the model, showing each stage as it goes. Esc stops it. A briefing keeps running if you look at another PR, and it's there when you come back.

The briefing reads in one direction: what the PR does, the few places to look, then everything else folded away. See Briefings and checks for what's in it.

Each place, finding and flagged check has Useful and Not useful, which teach Alden what you look for, and Dismiss, which hides one place on this PR. A model finding raised because of one of your notes says "Because of your note: …". Useful on it confirms the note; after Not useful, it offers Stop applying this note to app/api? (Stop applying, then Undo) and Edit the note, and without either nothing changes. See Findings from your notes. You missed something tells Alden what it should have flagged. One line under the rows, "Shaped by your feedback: …", says what your feedback changed in this briefing, with What Alden knows.

Tune: model, tone, effort, callers and cap

The model line on the age line ("sonnet-5 · medium ▾", or "checks only") opens Tune this briefing:

Tune this briefing over a Django PR: the model, the tone Alden writes in, effort, callers, the cap, and a question asked about the PR with its answer and cost

Effort and callers last until you close the tab; Settings changes the defaults. Esc closes the popover.

Above the briefing, Alden says which clone the callers come from, when it isn't the folder alden ui runs in. With no clone of the PR's repo, it says so, and how to point Alden at your clones (alden config set clones.folders ~/src).

Set up a model

The Set up a model dialog: paste an Anthropic or OpenAI API key, use a local model, or checks only

With no model set up, the model line says "no model" and Tune offers Set up a model (or Add a key in the model list). It has the same three choices as alden setup, in the same order:

  1. Paste an API key, Anthropic's or OpenAI's: Alden detects which as you paste (sk-ant-… is Anthropic's, any other sk-… OpenAI's). It checks the key with one tiny request to its provider, which costs a fraction of a cent, then keeps it in your keychain and makes that provider the model. The page never gets it back.
  2. Use a local model through Ollama. Alden recommends one for your machine's memory and downloads it, with progress, if Ollama doesn't have it. Local models flag less than Claude.
  3. Checks only.

Below them is a link to Alden Cloud (beta). The next briefing uses the new model, with no restart. See Models, providers and budgets.

When it was briefed, and Brief again

The age line says when the briefing was made ("briefed 30m ago"), then Brief again (b). Once the PR or its base has moved on, it says what changed, in amber: "main +4 commits" (callers merged there since aren't in it) or "PR +2 commits"; hovering says it in full. Alden asks GitHub, one request, when the briefing is shown and when the window comes back to the front, at most once a minute. It doesn't poll. See Keeping up with the base.

Export

Export (or e), at the end of the age line, copies, saves or prints the briefing:

The Markdown leaves out your memory notes and what your feedback changed, keeps secrets masked as the briefing shows them, and ends with the model, its cost and when it was briefed. A line beside the button says what happened ("Copied as Markdown.").

The Diff tab

3 Diff on a Go PR: git/client.go with the place to look, E1, under line 445

Once a PR is briefed, 3 Diff (or d) shows the code itself, so you don't have to go to GitHub to read it.

A place's card that's been on screen for 1.5 seconds counts as a place you saw, which Alden learns from when you send your review: see Places you saw.

For a PR, the diff is the PR's latest push. If that's newer than the briefing, a line above the diff says so, since places may have moved. For My changes, it's your uncommitted changes, as the briefing read them.

Since your review

On a PR you reviewed before, the Diff tab has Whole PR | Since your review above the files, and opens on Since your review: only what changed from the commit you last reviewed to the PR's head, so a second look starts where your first one stopped. Whole PR shows everything.

Large diffs stay quick: rows render as you scroll to them, and files over 400 lines of diff start collapsed, with Show. Alden keeps a PR's diff per push while alden ui runs, so opening it again is instant. The tab you were on is remembered until you close the window.

Walk through

Walk through, step 1 of 3: a public API change in git/client.go, with the code at that place

When a briefing has places that need your eyes, 2 Walk through in the PR's header, Walk through these 3 places, or g (from the Diff too) takes them one at a time, in Alden's order, in place of the brief. Walk through from here on a place's card starts at that place. Each step shows:

After Alden's places, the model's other findings that point at code follow as extra steps, with Comment here too. A step from one of your notes says "Because of your note: …" and has the same offer after Not useful.

Previous (p) and Next (n) move between steps. Esc, or Back to the brief, goes back, and Resume the walk-through at step 3 takes you back there while the window is open. The last step offers Finish: review your comments, which opens the drawer at the review body. For My changes, the walk-through shows the places and their files to look at, without the code.

On a PR, a step that's been in front of you for 1.5 seconds counts as a place you saw, which Alden learns from when you send your review: see Places you saw. Nothing about it leaves your machine.

Comments and sending a review

You write your review in Alden, beside the briefing, and send it to GitHub as one review. Nothing posts until you send it. See Comments and sending a review for the same from the terminal.

The Comments drawer: the tone Alden writes in, a draft Alden suggested with Keep, Edit and Drop, then your comment on a line, a suggested change on lines 466–470 and one from Claude Code

The Comments drawer

Comments 3 (or s) in the PR's header opens and closes the drawer. Its header has two tabs, Drafts and Conversation, each with its count.

Drafts starts with Alden writes: the style Alden drafts in for this repo, Terse, Concise (the default), Detailed or Teaching, saved for the repo (shown when your Alden has it). Then your drafts, as cards, by where they'll post:

Then Add a general note, Comment on a line… and Draft my review. With nothing drafted yet, it says where your comments will go: "Kept on this machine until you send them to acme/shop#412 on GitHub, as one review."

Conversation has the PR's review threads, yours first and open ones first, each a card saying where it is and whether it's yours, its state (replied 2h ago, open, outdated or resolved), each comment with who wrote it in bold, and Reply and, on a thread you started, Resolve when sent (someone else's says "ana's to resolve"). A reply or a resolve is a draft like any other, sent with your review (see Replying in a thread).

At the bottom, always in view, are the verdict (Comment, Approve or Request changes), Review and send · 3 and "Nothing posts until you send."

The drawer stays open or closed as you left it in this window, and starts open when the window is wide enough for it beside the queue. S ›, s or Esc folds it to a narrow rail on the window's edge saying "Comments 3"; click the rail or press s to open it again. Drag its left edge to resize it, from 320 to 760 pixels (Alden remembers the width on this machine; arrow keys work on the edge too), and double-click the edge to put it back to 380. In a narrow window it's a full-width sheet instead, with no rail.

Write a comment

There's one editor, always in the drawer. It opens from:

The editor names exactly where the comment goes: "Comment on py/orders/pricing.py, line 4", or "lines 4–9" for a range. ⌘↵ (Ctrl+↵) saves; Esc cancels and puts focus back where you were. The place keeps a short list of your drafts on it.

In the Diff tab, a linked note shows at its line, or on its file, when the diff has it.

Claude's drafts, and outdated drafts

Drafts that Claude Code added (through the plugin or alden mcp) start with Claude Code, so you read them before they go out under your name. Claude can draft comments, but never send them.

Drafts Alden made from its model's findings start with Alden and say suggested, with a dashed border and Keep, Edit and Drop, and Keep all / Drop all at the top of the drawer. Until you keep or edit one, it isn't sent: the drawer says how many won't be, and Review and send counts only what will post. Kept, it looks like yours and says kept; dropped, it stays dimmed where it was until you open another PR. The briefing marks a finding with one Draft ready. See Alden's drafts.

Drafting with Alden

With a model set up, Draft my review (beside Comments, and in the drawer once the PR is briefed) asks the model, in one call within your caps, to draft comments for the places to look and the model's findings that have no comment near them yet. While it runs it says "Drafting…"; then it opens the drawer on the new drafts and says how many it made, what the call cost and how many places it skipped, or why it couldn't. Without a model, the drawer offers Set up a model instead.

Each comment and reply box has Draft with Alden: it fills an empty box with the model's text for you to edit (Undo empties it), or, when you've written something, shows Alden's version of it with Use it and Keep mine. Cancel stops it while it's drafting. It saves nothing: you save, and the comment is yours.

Both write in the repo's tone (Terse, Concise, Detailed or Teaching: a style you pick for Alden's drafts, not an imitation of you), set per repo on this machine or for every repo (drafts.tone); either can take a different tone for one draft. See The tone Alden writes in.

Ask about this PR takes a question in your words and streams the model's answer, from the PR's briefing (of its latest push), the diff around the places that matter and your notes, with what the call cost when it's done. The last five questions on a PR go along for follow-ups while Alden runs; nothing is stored. See Ask about this PR.

On a PR with text aimed at AI reviewers, neither drafts: Draft my review says why, and the boxes say "Alden won't draft here". See Drafting with Alden on demand.

A draft written before the PR's latest commits is dimmed and says outdated when its lines changed, with "These lines changed in 3f2a91c" and Move to new lines when Alden can tell where its code went (it then moves there and is a draft again), or Pick a line when it can't, which opens the file and line to choose. Or delete it. An outdated draft is left out when you send. See Move to new lines.

Send the review

Send this review to GitHub? over the Comments drawer: Approve, 4 comments on lines, 1 note in the body, 1 drafted by Alden and kept by you, what's left out, and the 3 places Alden flagged with no comment

Pick the verdict: Comment, Approve, or Request changes (which needs a body). Then Review and send. Nothing posts yet: "Send this review to GitHub?" counts what will, the verdict, the comments on lines and what's in the body, the drafts Alden wrote that you kept ("1, posted as you"), replies and resolves, and what stays behind (outdated drafts, Alden's drafts you didn't keep). See exactly what posts opens the text itself: the body (yours, then your general notes) and each comment with its file, line and suggestion. Only on Approve does it raise the places Alden flagged that you didn't comment on, each with Look first, which closes the summary and takes you to that place.

Only Send review in the summary (or ⌘↵ there) sends it; Back or Esc returns to your drafts. Afterwards "✓ Sent to GitHub · See the review ↗" shows at the bottom of the window for a few seconds and, when Alden learned something from it, the drawer says so in one line: "Alden learned: you care about callers flags (2 of 3)". If GitHub refuses, the summary shows why and keeps your drafts.

My changes

My changes briefs your uncommitted changes (staged, unstaged and untracked) in the clone alden ui started in, before you open a PR. It has the same toolbar, Diff tab and walk-through as a PR, without comments.

Memory

Memory lists each repo Alden knows about, then what you look for and what you skip there. Each item says where it came from and what it changes, with Edit (for notes), Forget and Undo. A note says how many reviews confirmed it ("confirmed 3×") and has Apply under app/api again for each place you stopped it. A learned item lists what it was learned from, newest first: "from your review of acme/shop#412, Oct 8", then "and 3 more". A switch pauses learning, and Tell Alden something adds a note ("Money is in cents, never floats"). See Learning and memory.

Stats

Stats shows a repo's time to first review and review cycle time, week by week, before and after you started using Alden there (or a date you pick), over the last 90 days or another window. See alden stats. Below it, Time to review: your own reviews sent with Alden, from this machine, over the last 14, 30 or 90 days: median active time and median time from opening the briefing to sending, with and without the model, and how many reviews each rests on. See Time to review.

Settings

Settings change your user config, like alden config set; a repo's .alden.toml still overrides them there.

The desktop app adds Command line tool, While you're away and Notifications: see The desktop app.

Ranking

Settings → Ranking: a slider per weight, three rules, and the top 5 of the queue with these settings

Ranking sets how the queue ranks:

Nothing applies until Save ranking; Discard changes goes back. In the desktop app, Ranking also sets how many top PRs to keep briefed in the background.

Keyboard

Keys never fire while you're typing in a text box.

Key Does
j or ↓ Next PR, with its briefing
k or ↑ Previous PR
/ Search the queue (opens it first if it's folded). In the search, Enter opens the first match and Esc clears it
[ Fold the queue to a rail, or bring it back (windows 960px and wider; in the Diff tab, [ is the previous place)
r Refresh the queue
o Open this PR on GitHub
+ − x Useful, Not useful, Dismiss on this PR
b Brief me on this PR
e Open the Export menu (↑ ↓ move, ↵ picks, Esc closes)
d Switch between the briefing and its diff (3 Diff)
] [ In the Diff tab: next and previous place to look (E1, E2…)
f In the Diff tab: open or close the file you're in
g Walk through the places that need your eyes, or resume at the step you left
n p Next and previous step of the walk-through
s Open the Comments drawer, or fold it to its rail
c Comment on the place you're on (a place in "Needs your eyes", an evidence line); elsewhere, open "Comment on a line…"
⌘↵ / Ctrl+↵ Save the comment you're writing
Esc Cancel the comment you're writing, or leave the send summary; go back from the walk-through to the brief; close the Comments drawer; stop a running briefing; in a narrow window, back to the queue

Security

The UI's server can use your GitHub sign-in and spend your model budget, so it's locked down:

Don't share the link while alden ui is running. A new run makes a new key. See Security model.

Working on the UI

See packages/ui/README.md. pnpm ui:demo serves the UI over the recorded public PRs, with no GitHub or model calls, for UI work; pnpm screenshots takes the pictures on this page from it. Every route of the local API is listed in Architecture. Colours, fonts and radii are CSS custom properties listed, with what each is for, at the top of packages/ui/src/styles.css: dark is the v3 design's palette, and light is derived from it.