Skip to content

Product

In production

Workbench

Deadlines, milestones and merge requests across every GitLab project on one board.

Status
In production
Technology
Rails 8.1, PostgreSQL, GoodJob, React 19, TypeScript, TanStack Router, WorkOS, Playwright

The problem

GitLab knows everything about a project and nothing about the situation. Running twenty projects across four groups means twenty issue lists and no answer to the only question that counts: what is due this week, and what is it waiting on. The usual escapes are a spreadsheet beside it or a second ticket system that then wants maintaining.

How it solves it

Workbench indexes deadlines, milestones, work items and merge requests across projects, groups and several allow-listed GitLab instances. GitLab stays the truth. Workbench keeps only a disposable projection bound to a workspace, and stores neither descriptions nor comments, neither source code nor diffs, neither tokens nor raw webhook bodies.

On top of that sits a React kanban that shows cross-project work as columns.

What it does

Columns are rules, not membership tables. A column is a predicate over the projection. Moving a card writes to GitLab; which column it lands in afterwards follows from re-evaluating the rules. A simulation runs before the write, and a move that would not arrive is rejected rather than half-executed.

Tenant isolation in the database. Every table carries a workspace_id under enforced row level security. Every access runs through WorkspaceContext.with, and missing context fails loudly. Eighteen tables are inventoried this way and checked at runtime.

Sessions for coding agents. A CLI called wb registers a work session, survives the agent restarting and expires by itself after a day of silence. Sessions appear as a fleet dashboard and as a badge on the board card.

Shared plans behind an unguessable link. wb plan push stores immutable plan revisions, wb plan share produces a public link for one. It is the application’s only unauthenticated read access, and it is bounded by a dedicated RLS policy rather than by a controller check.

CI history as a deliberate exception. Pipeline and job timings are retained for 400 days, even though the projection is otherwise disposable. The reason is recorded in an ADR: self-managed GitLab offers no queryable job history with queue time and P50/P95.

What it does not do

It is not a replacement for GitLab and does not want to be. Without GitLab, Workbench has nothing to show.

It runs as an internal production system for ourselves today. We have no external users to claim anything about, and there is no self-service registration.

It supports GitLab from 19.1 and allow-listed instances only. GitHub, Jira and Azure DevOps are not connected.

Workbench

Join the waiting list

Tell us what you would use it for. We will get in touch as soon as Workbench is ready for you.

Join the waiting list