Release 0.2.0: project repositories, renamed Agents pages, find_project, tag filter
Release 0.2.0: merges dev into main. Once this merges, the v0.2.0 tag on the merged commit publishes the Windows and Linux installers (docs/releasing.md).
Changelog
Every change that landed, newest first, up to November 6, 2026. 119 changes so far.
Full Changelog: https://github.com/nervesscat/agent-board/commits/v0.2.0
Release 0.2.0: merges dev into main. Once this merges, the v0.2.0 tag on the merged commit publishes the Windows and Linux installers (docs/releasing.md).
Sets the desktop app's version to 0.2.0 in desktop/app/package.json. That file is the only place the release version is kept: .github/workflows/release.yml and scripts/release.mjs read the tag (v0.2.0) and the installers' versioned names from it.
Three different things were all labelled "Agents".
The ticket page's Hand-off card listed the same facts the task list already shows. The card's one unique check was whether an agent wrote the summary after the branch's last commit.
The Board's tag filter was a plain select holding every tag at once, with no search, no height cap, and labels in the plain text colour. It is now a searchable combobox that loads its tags from the server one page at a time.
From md up, the project sidebar sticks below the header and scrolls on its own when it is taller than the window. On narrow screens it stays above the content, as before. The page still scrolls as it does today, so scroll restoration and the other sticky bars are unchanged.
The board skill carried a table of every project and repo, filled in when the skill was rendered. A project or repo added, moved or renamed afterwards stayed invisible to every installed copy until it was copied again.
Repositories was a board-wide page in the top bar. It is now a page in each project's sidebar (/projects/ /repositories), listing and managing only that project's repos.
Release of dev into main.
A markdown table in its scroll box was still 100% wide (typography plugin), so a wide one shrank every column to its narrowest word: sentences wrapped word by word, rows got very tall, headers left gaps.
In the first ten days of a month that day is in the previous month, and the calendar opens on the current month, so the check failed.
Agents can now configure a repo's runs themselves, so they can get a preview for a repo nobody set up without waiting on the human.
Follow-ups to the tailnet entrance.
The check and desktop-linux jobs fail on Linux for every pull request built from dev, whatever the pull request changes. The product code was right in each case.
Pages that remember a choice in this browser (the PR queue's filter, the Ongoing features view, the Previews stage, the agents shell) put it in their URL with a replace as they mounted, while the router's push to the page was still loading.
A wide table in rendered markdown (instructions, posts, comments, summaries) pushed past its column and ran under the right sidebar.
Releases dev into main.
Agents can now ask for a repo to be added to their project, and can move a ticket onto another repo of its project.
A visual layout editor in a project's settings. The Layout section shows a small picture of the project's menu, its Overview cards and a ticket page with two columns.
No agent route can raise a role. - Delegated workers identify themselves as / , using X-Agent-Name or the agentName argument on every MCP tool. A sub-identity is always a worker.
The board's one hard-coded managed preview becomes runs: long-running processes the board starts from a ticket's worktree. Tickets also stop being tied to one repo.
Prepares the repository to be made public.
A work timeline per ticket, so it is visible what agents (and the sub-agents they start) are doing, what they wait on, and when a ticket has gone quiet.
Last, hover and Tab open the tooltip again. Against the old tooltip.tsx it fails.
The desktop app now builds and runs on Linux as well as Windows: pnpm desktop:package on Linux x64 produces an AppImage, a .deb, an .rpm and a pacman package. Windows still builds the same NSIS installer.
Adding a repo through the API with a Windows path answered a bare 400 body must be JSON.
On the PR queue, a second link to the same PR in one visit now shows its card again. Before, following #pr- switched the stage and filter to show that PR.
The board runs git, gh, claude (CLAUDE_BIN), node and pnpm. Until now a missing one only showed up as a feature failing quietly or with a raw spawn … ENOENT.
Agents could not archive tickets. Now they can ask: the human confirms, and only the human's answer archives.
Project settings' Default phases and Tag suggestions were textareas (one item per line). They now use the list editor from the New ticket dialog's Initial tasks: bulleted rows, × to remove, an add input with a + button ("Add a phase" / "Add a tag").
The Needs you and In progress cards on the Overview now have the same fixed height (28rem) on desktop and the same cap on a phone. Content that does not fit scrolls under the header, using the existing slim global scrollbar.
A new project page, Roadmap (/projects/:id/roadmap, in the project nav), that shows every ticket being worked side by side as horizontal swimlanes: one row per top-level ticket, a thinner row under it for each of its lanes, and the tasks of each running left to right as a…
Ships the board as an installable desktop program with its own sign-in, replacing passkey-gate.
Each project now keeps a list of tag suggestions, Bug, UI, Implementation and Report by default. The tag fields offer them, together with the tags already used in the project, and the board can be filtered by tag.
Lets the board be used from other devices over HTTPS on a tailnet, through tailscale serve.
Adds a Gallery module to every project: one place to find a file again without remembering which ticket it was on.
A ticket's feed now has two tabs. Main is for the human; Agents holds the agents' working record. One living summary at the top of Main takes the place of the hand-off post.
Agents may now delete the landed local branches of closed tickets (done, cancelled or archived). They get the same checks the Cleanup page applies to a human's delete. Removing worktrees, and deleting branches on origin, stay with the human, on the Cleanup page.
Each ticket now carries a review level, low, mid or high. It is chosen when the ticket is created (New ticket dialog, REST, MCP) and can be changed on the ticket page.
When a step needs the human, an agent can tag that task blocked and keep working on the rest. Examples are a credential, a manual action, or a call only the human can make. The tag carries an optional reason that says what the human must do.
Every item is checked again at delete time against the commit the person saw.
A ticket's to-do list gets two levels, new tickets start with default phases, and the hand-off gets an Implementation item.
The Agents pages now show whether the copy you rely on matches what the server serves, and give the one line that updates it.
Every hover hint in the app now uses one shadcn tooltip instead of the browser's native title. These hints used to look different from one place to the next and never showed on keyboard focus.
A PR could show mergeable on a ticket and in the PR queue while GitHub already reported conflicts.
The Previews page listed every preview of the project at once. It now has a Stage filter, set by default to the project's review stage ("In review").
The List and Archived views of Ongoing features get a search field. Finding a ticket in a long list or archive no longer means scrolling.
Moving from one ticket to another inside the app (Next/Previous, [ and ], Back and Forward, a lane link) left the previous ticket's Resume here card on the page, above the new one's.
A new Previews module in the project sidebar, after "Ongoing features", at /projects/:id/previews. It lists every preview of the project's tickets in one place, running or not.
A question an agent asks the human (a decision card) used to sink below newer posts in a ticket's Activity feed, so one asked a few days ago could sit far down the timeline unnoticed.
Lines typed one under the other in the rich text editor read as double spaced. Enter starts a new paragraph, and the typography plugin's prose-sm puts 16px above and below every paragraph, so each line started 40px below the last at a 24px line height.
The Daily page was mainly a log, and a project's report and its three-line daily summary were two separate things.
Every entry of the Needs you card (Home and Overview) linked to the top of its ticket or of the PR queue. Now each one lands on what waits on the human, scrolls it into view below the sticky header once the page's data has loaded, and highlights it for a moment.
The New ticket dialog's Tags field was a single text box of comma-separated words. It is now a chips input: what you type turns into chips inside the field, in the same look tags have on the board. The New lane dialog uses the same field.
On a top-level ticket's page, the ‹ › buttons (and [ ]) stepped through the ticket's current board column, worked out again on every render.
The PR queue's controls no longer scroll, and its author filter keeps only the two views it needs.
The paperclip attach button in the rich editor's formatting toolbar used to sit at the right end of the row (ml-auto).
People creating a ticket no longer pick its branch: whoever works the ticket sets it, from the ticket page or through the API and MCP tools. This removes the "Branch (optional)" field from the New ticket dialog. The New lane dialog uses the same form, so it loses the field too.
The Initial tasks field of the New ticket (and New lane) dialog was a textarea, one task per line, so the tasks a ticket would start with were never shown as tasks.
The New ticket dialog (and New lane, the same component) had no height limit. Long instructions, many tasks or attachments pushed it past the top and bottom of the window, so the heading and the Create button could not be reached.
The ticket page's Hand-off card gets a Merged row at the top, above PR. When every row on the card is green, Merged included, the whole card gets a green border.
A ticket's git state (GET /api/tickets/:id/git, the get_ticket_git tool) was worked out from scratch on every read: about ten git processes for a ticket with one workspace (branchInfo per branch, a fresh ref and worktree listing per request, built twice).
The PR queue's two filters used to split PRs by whose move it was. They now split them by who wrote them, and each filter tracks where the reviews stand.
The New post box on a ticket and the Reply box in threads (under posts, on PRs, on review results) had their own "attach" text button in the row under the editor. The New ticket dialog instead puts attach at the end of the editor's formatting toolbar.
The attach button at the end of the rich editor's formatting toolbar showed a paperclip and the word "attach". It now shows only the paperclip, like every other toolbar button.
Removes the "progress" switch from the row under the New post editor on the ticket page. The row now holds attach, the pending files and Post (still on the right).
The New ticket dialog gets a Stage control, so a new ticket can start in any stage of the project. Left alone it starts on the first open stage in board order (Backlog in the default layout), where before the dialog sent no stage and every new ticket landed in To do.
The browser UI gets a name and a logo: CrossBoard. The top bar and the tab said "Agent Board" in plain text, and there was no favicon.
The Cleanup report listed a worktree as untracked while an in-progress ticket was using it.
Moves the actions on a post and on a thread reply from their header to a row under their text, next to where the reply box opens, and turns the text buttons into icons with tooltips.
On a ticket page, every post in the Activity feed has a time legend left of the timeline rail: "10 minutes ago" over "01:20", or a short date for older posts. It sat in a 5.5rem / 7rem column, which squeezed posts on a phone.
One board instead of two: the built board on 47100 plus a pnpm dev copy with its own data was easy to confuse. While the built board was down, work was created on the copy (47101) by mistake, because it looked exactly like the real one.
On the hot-reload board (pnpm dev), Vite's red error overlay kept popping up with read ECONNRESET / at TCP.onStreamRead (node:internal/stream_base_commons:216:20). It covered whatever was on screen, open dialogs included, in every open tab.
Tab from the field before a rich editor now lands in the editor's text, not on its first formatting button. The attach button of the New ticket dialog moved from the row above the editor into the editor's formatting toolbar, after Link.
On a ticket page the window scrolls and the title scrolled away with the feed. The ticket header (title, opened-by line, status select and actions) is now sticky just under the top bar, so the title stays in view while reading a long page. At rest it looks exactly as before.
In the ticket header, "opened by 1 d ago" had the author 2-4px off the line of the text around it. The cause was in Actor.
Work that takes more than a day had nowhere to say how to continue it. The next session (another agent, the same one tomorrow, or the human) had to rebuild the state from the feed and the branch.
There was no single place that says where things stand. To see what waits on the human, what is moving and what got done, you had to open the PR queue, the board and the Daily page of each project in turn.
Projects owe their progress reports on different rhythms: some every day (by the hour), some once a week, some as a couple of lines, others as a PDF.
Agents handed work to review without a preview link. The agent docs only asked for "the preview link if there is one", and nothing pointed out what was missing.
A ticket can now declare which tickets it needs merged first, the board checks it against git, and a ticket cannot be marked done while one of them has not landed in its base.
Previews of a branch were pnpm dev processes an agent started in its own session (scripts/dev.mjs). They died with the session, and the Vite dev server behaves differently from the built board the human uses. The board now builds and runs them itself.
UI changes have shipped without being exercised in a browser, and nothing runs the checks on a pull request.
Agents can't get past the passkey gate, so UI changes ship without anyone trying them. The live board must never be able to run that way.
Nothing showed whether a branch had reached origin. A branch that only exists in one checkout is easy to lose and cannot be reviewed, so the board should say red or green, and agents should not hand off work that is not pushed.
Files uploaded but never attached stayed in the store forever: images added to a New ticket window that was closed without creating, files removed from a post before sending, uploads an agent never used.
Feedback left in a ticket's feed or replies only reached a working agent when the human told it to "check comments". Agents need a cheap way to ask "anything new for me?" and a routine that keeps asking while they have work in progress or in review.
The Agents page fetched every ticket of the project, lanes included, under the query key ['tickets', id]. The features board and the ticket page's stage navigation use that same key for top-level tickets only (?parent=root).
Code blocks are unchanged. The rule sits outside Tailwind's layers, so it wins over the plugin's.
A merge kept two versions of step 6 in the instructions the board gives connected agents: the current one (posts, replies and ask_decision) and the older one from before tickets had a single feed of posts, which still talked about threads and comment counts.
The New ticket dialog (and New lane) had no way to add files: a screenshot that explains the work could only be attached after the ticket existed, from the ticket page.
The project's Instructions page was the last markdown field on the board edited in a raw monospace textarea. Ticket instructions, posts and agents all use the rich text editor.
Done and cancelled columns only grow, so the board gets harder to read over time. Finished tickets need a way off the board that keeps them, either all at once from a column or one at a time.
On a lane's page you can step to the previous / next sibling lane, but a top-level ticket's page had no way to reach the ticket beside it on the board without going back to the board.
On a phone (390px) the top bar ran to about 540px: brand, project switcher and the Repositories, Daily, Agents and Settings links did not fit, so every page scrolled sideways.
Filter: To review / Waiting on others / All.
Agents start a branch from its worktree on a free port so it can be tried before merging, but the link only lived inside a post's text, and nothing said whether the server behind it was still up. This puts it in plain sight on the ticket page with its state.
Attachments lived only in data/uploads. This makes an S3-compatible store (the board's own MinIO) an option, without changing what anyone sees: the browser still gets files from the board, and agents still get a path on this machine to open.
When an agent is blocked on a call it should not make alone (an approach, a trade-off, a scope call), a free-form question in a thread is easy to miss and slow to answer. A card with the options laid out is quick to read and answers with one click.
A ticket had two kinds of message, updates (progress) and comments (discussion), shown together behind an Update / Comment switch, with different rules for each (updates only on tickets, comments with replies, neither editable).
At phone width the page also scrolls sideways, but that is the top bar's links on every page, not this change.
Reviewing a change meant merging it first, or someone switching branches in the main checkout (which changes the code under anything already running there). Agents should hand over something the human can open and try before deciding to merge.
Cards on the features board had a fixed height (h-40, 160px). A ticket with only a title left most of its card empty, and a column of such tickets took far more room than it needed.
A project can define its own agents on a new Agents page (project menu): a name, a picture and instructions. They are personas, not connections: a connected agent (a gate token: claude, codex, …) works for them.
The Reviews module no longer launches reviews itself.
The PR queue lists open PRs from two GitHub searches: review-requested:@me and reviewed-by:@me. A PR opened with my own account (which is how agents push here) can match neither: GitHub silently ignores a review request for the PR's own author, and I have not reviewed it yet.