Skip to content

Board (Kanban)

The Board tab is the primary execution surface in TruePPM. It presents the project’s tasks as cards in a Kanban layout and stays in sync with the Schedule view via WebSocket — moving a card here updates the task’s status everywhere.

The board has two zones:

  • BacklogBACKLOG cards live in a dedicated surface beside the working columns, not as a column of their own. Backlog is intake — undated, unrefined, not-yet-committed work — so it stays phase-agnostic and visible while you work the active board. Three layout variants are available from the toolbar’s segmented control: Rail (left-side band, the default), Drawer, and Queue.
  • Working columns — the committed-work columns, rendered as phase swimlanes (one lane per phase in the WBS). Columns are configurable per project — labels, visibility, WIP limits, and accent colors — and default to:
ColumnStatus valueMeaningDefault WIP limit
To DoNOT_STARTEDCommitted; work has not begun
In ProgressIN_PROGRESSWork is active5
ReviewREVIEWWork complete; awaiting review / sign-off3
DoneCOMPLETEDone

Dragging a card from the backlog into a working column commits it (status changes to the column’s status). Dragging a To Do card back to the backlog opens a confirmation dialog — demoting committed work is a deliberate decision. Cards that are In Progress or beyond cannot be demoted to the backlog.

The legacy ON_HOLD status is kept for data compatibility with pre-0.1 projects but does not appear as a column; on the board it is treated like Backlog for drag guards.

Each card shows:

  • Task name and task referenceENG-2026-8, using the Project code from Settings → General as the prefix. Without a code it reads T-8. The reference is formatted server-side, so the web app, the mobile app, a PDF export, and an MCP client all show the same string.
  • Assignee avatars (up to three, with +N overflow)
  • Readiness chipidea / estimated / ready / baselined, shown only when the board holds more than one readiness value (see Readiness states)
  • Risk badge — count of linked active risks, colored by max severity
  • Blocked indicator — shown when any predecessor is not yet COMPLETE
  • Sprint chip — when the task is committed to a sprint
  • Progress ring — % complete, fills as work progresses
  • CPI badge — cost performance index when cost data is available (board batch 4)

0.4 will consolidate a card’s stacked delivery chips — float, dwell, SPI, CPI, cost — into a single worst-offender badge that surfaces the one highest-severity signal at a glance. The severity order is derived from objective delivery state, never from PM priority rank:

  1. Blocked (⛔) — a predecessor is not yet complete, with the dependency count
  2. Stale (⚡) — past the column’s aging threshold and stalled; escalates when it passes twice the limit
  3. Critical path / late (⚑) — on the critical path or running on negative float
  4. Behind (📉) — behind schedule (SPI) or over budget (CPI) when EVM mode is on

An on-track card shows no badge. Every badge carries a glyph and a label (never color alone), so the signal reads without relying on hue.

The badge is expandable, not lossy — the full chip set is one interaction away. At comfortable density (the default), hover, focus, or tap the badge to reveal the complete health chips and baseline-variance panel; the tap target meets the 44px minimum and the disclosure is keyboard- and screen-reader-operable (press Esc to collapse). At detailed density the full chip set stays inline with no badge; at compact density only the badge shows.

A project’s custom fields — the Text, Number, Date, Single-select, Multi-select, Person, and Checkbox fields you define in Project Settings → Workflow → Fields — can show their value directly on the board card, so you can scan a task’s metadata without opening the drawer.

This is opt-in per field. A field’s value appears on cards only after someone with the Scheduler role or higher flips its Show on card switch in Project Settings → Workflow → Fields. Every field is off by default, so the card stays scannable until you deliberately add to it.

Values render as compact, type-aware marks that reuse the card’s existing chip vocabulary:

  • Single-select / Multi-select — a colored option chip. The option’s color is always paired with its label, never color alone.
  • Checkbox — a neutral ✓ mark. A checked box is not a health signal, so it never reads as green.
  • Text / Number / Date — a Label: value pair, so the datum is self-describing without a legend.
  • Person — an avatar initials pill, grouped after the task’s assignees and named by its field, so it is never mistaken for an assignee.

Custom-field marks are the lowest-priority content on the card. They render after every existing element and never displace the health badge or the story-point pill — a custom field can’t push a delivery signal off the row. When space is contested, they are the first content to collapse into overflow. Unset values render nothing — no placeholder, no empty chip, no reserved space.

How many marks show inline depends on the card density you are viewing:

DensityWhat shows
Comfortable (the default)Up to 3 marks inline, plus a +N more button that opens a tap-to-peek list of the rest
Compact / mobileA single ⊕N button on the card bar; tap it to peek every value
DetailedAll flagged values, inline

A per-user board switch, Show custom fields on cards (in the board’s settings panel, on by default), hides the whole class from your own view in one click. It is a view preference: turning it off changes only what you see and leaves every field’s Show on card setting untouched, so muting the cards on your board never changes them for the rest of the team.

Drag a card to a new column to change its status. The status change is optimistic: the card moves immediately, and the API call fires in the background. If the API call fails, the card snaps back with a toast.

Keyboard alternative: every card’s ··· overflow menu includes a Move to… item with a submenu. Arrow keys navigate the submenu; Enter commits. An aria-live region announces the move.

The board keeps working with no signal. If you change a card’s status while offline — by drag, the Move to… menu, or the keyboard — the card moves immediately and the change is saved to a durable on-device queue that survives a page reload. Each queued card shows a Pending badge so you can see at a glance what has not yet reached the server.

When you reconnect, the queued moves are sent automatically and the Pending badges clear. Moves apply last-write-wins per card: only the most recent status you set for a card is sent. If a card changed on the server while you were offline, your queued move is reverted to the server’s latest state and a toast explains what happened, rather than silently overwriting someone else’s change.

The board also renders from its last successful fetch when you reopen it offline, so you can review the current state without a connection. Offline support currently covers card status changes and flagging a task blocked — creating tasks, editing card details, and reordering phases still require a connection.

The board toolbar (top of the board) groups its controls into these clusters:

  • Search — a card search box (see below) that leads the toolbar
  • Primary chipsGroup, Sort, and Density popovers (card density, plus a separate backlog-card density)
  • Zoom — a Small / Normal / Large stepper that scales the board surface (see below)
  • Filters — a ⚑ Filters button that opens the facet panel (see below); the button carries a badge with the count of active filters
  • Quiet togglesMy tasks (only tasks assigned to you), At-risk, and Cost
  • Layout segmented controlRail · Drawer · Queue backlog layout variants
  • More⋯ overflow — collapse/expand all lanes, WIP limit chips, column Tints, EVM mode, the Columns configuration panel, and Export PDF (see below)

The toolbar’s search box finds cards by title and description across the project. Press / anywhere on the board to focus it (typing in a form never steals focus to search).

  • As you type, matching cards stay lit and the rest dim, so the card you want stands out in place — the board never reflows or hides cards.
  • A chip shows the match count; clear the search with the × button or Esc.
  • The query is reflected in the URL as ?q=…, so a searched board is a shareable link.
  • Search respects your project role: results never include cards from projects you are not a member of, and the search response carries no cost or other role-gated fields.

Matching is a case-insensitive substring (searching foundation finds “Foundation pour”). Title matches rank above description-only matches. Comment search will arrive with threaded comments.

The ⚑ Filters button opens a facet panel that narrows the board to the cards you care about. Press f anywhere on the board to open it (typing in a form never opens the panel). It offers four facet groups:

  • Assignee — pick one or more people, plus an explicit Unassigned option for cards nobody owns yet.
  • PriorityHigh, Medium, Low, or Unranked, bucketed from each card’s priority rank.
  • DueOverdue or This week, derived from the card’s finish date. Only scheduled cards (a committed start date, or a card pulled into a sprint) are eligible — an uncommitted backlog idea never counts as “due”.
  • Label — pick one or more of the project’s labels. The facet lists the labels actually present on this board’s cards, so it never offers a label that would match nothing.

Facets combine as you would expect: a card must match every group you have narrowed, and any of the values you picked within a group. Selecting Alice and Bob under Assignee plus High under Priority shows Alice’s and Bob’s high-priority cards.

  • Cards that don’t match dim to the background and drop out of keyboard and screen-reader navigation, so faceting never strands focus on a hidden card — the board never reflows.
  • The Filters button shows a badge with the number of active facet values, and an active-filter bar below the toolbar lists each one as a removable chip so the lens is always visible. Remove a chip, or press Clear all, to widen the board again.
  • If nothing matches, a No cards match these filters banner replaces the board with a one-click Clear filters action.
  • The active facets are reflected in the URL (?fa=…&fp=…&fd=…&fl=…), so a filtered board is a shareable link, and your selection is also remembered per project in this browser.
  • Saving the current board as a named view captures the active facets — including the Label facet — along with sort and display settings; loading that view restores them, so a saved view carries its filter state rather than leaving it stranded in the URL or this browser’s storage.

Filters compose with the My tasks and At-risk quiet toggles — those remain independent one-tap lenses alongside the facet panel.

The Zoom stepper (Small / Normal / Large) scales the board surface only — the phase-column width and the gaps between columns and cards — so you can fit more of a dense board on screen or spread it out for a presentation. Unlike browser zoom (Cmd/Ctrl ±), it leaves the sidebar, top bar, and tabs at their native size.

  • Use the / + buttons, or focus the control and press the arrow keys.
  • Your choice is remembered per browser and survives a refresh.
  • Zoom is an independent axis from Density: Density controls per-card padding; zoom controls how much of the board fits on screen. The control is hidden on phones, where the mobile layout governs sizing.

Export PDF in the More⋯ overflow will produce a boardroom-clean PDF of the board for a deck or a client who has no portal access — no screenshots, no copy-paste. The export is a faithful, static projection of what you currently see:

  • Swimlanes and columns mirror the on-screen layout: one block per phase, the same status columns.
  • Cards carry their title, assignee initials, due date, and key chips (critical-path marker, blocked, story points, milestone).
  • A footer stamps the project name, the generation timestamp, the exporting user, and the active filter / sprint context, so the artifact is self-describing.

The export honors your current view — the selected sprint scope and any active filters (My tasks, At-risk, Tech debt, search) carry through, because the PDF renders the same filtered card set the live board draws. Tall boards paginate automatically. The whole document is generated in your browser — nothing is uploaded, so anyone who can view the board can export it. The action is hidden on phones; export from a desktop.

Readiness is computed server-side from the task’s data, resolved in this order (highest specificity first):

StateCondition
baselinedTask is in the active baseline (always wins)
ideaNo assignee and still in BACKLOG (unrefined, uncommitted)
readyHas an assignee + at least one predecessor link
estimatedHas an assignee without predecessors, or was promoted out of BACKLOG without an assignee (committed but unowned)

idea only applies while the task is in the backlog: once a card moves to any working column, a commitment decision has been made, so it reads as estimated even with no assignee.

The readiness chip drives the card’s left accent bar color (overridden by isCritical → red).

Readiness is a comparative signal, so the chip is hidden when every card on the board shares the same state — the steady state of any project past planning is “everything is baselined”, and a chip that is true of all of it tells you nothing while costing a line on every card. The chip returns the moment two states are in play. The left accent bar still carries readiness either way, and the state is always in the card’s detail view.

When a column exceeds its configured WIP limit, the column header turns amber and a warning badge appears. See WIP Overload for details.

When a sprint is active, committed tasks appear in the To Do → In Progress → Review → Done columns as normal. Sprint-committed tasks are never shown in the Unscheduled gutter on the Schedule view, regardless of whether they have a planned start date.

By default the board shows every committed task in the project. A scope switcher in the toolbar (next to the saved-views dropdown) will let you focus the phase columns on a single sprint:

  • Project — the default; all committed tasks.
  • A sprint — only tasks committed to the selected sprint. The dropdown lists active, planned, and completed sprints (viewing a closed sprint’s board is a legitimate retrospective read).

The selection persists in a ?sprint= URL parameter, so a sprint-scoped board is a shareable link. The backlog rail is unaffected — it stays the intake source you drag from. While viewing an active or planned sprint, dragging a card from the backlog (or another phase) into a phase column assigns it to that sprint — for an active sprint it enters the team’s scope-injection review as a pending item. A completed-sprint view is read-only for assignment.

Agile and hybrid projects can run their board on one of two cadences, set in Project → Settings → Workflow & fields → Board cadence (Scheduler+):

  • Sprint-based (the default) — the board carries the full sprint chrome: the active-sprint panel, burndown, and sprint header.
  • Continuous flow (Kanban) — a continuous-flow board with no sprint cadence. The sprint panel, burndown, and sprint header are hidden, and the board leans on the always-present Flow analytics panel (cycle time, throughput, cumulative flow) instead. That panel also carries a throughput forecast: a Monte-Carlo estimate over recent weekly throughput that headlines a P80 “finish in ~N weeks — by <date>” answer for the remaining backlog, so a Kanban team gets a forward delivery date without sprints or velocity. Cards still move through the same working columns.

Switching cadence is non-destructive — an in-flight sprint is preserved, not deleted, so switching back to sprint-based brings it back verbatim. Waterfall projects don’t use sprints, so cadence doesn’t apply to them.

Each working column can carry an aging threshold in days, configured per column in Workflow & fields (Scheduler+). When a card sits in its column longer than that threshold it gets a calm “aging” badge showing its dwell time — a quiet nudge that work is stalling.

Every card with a recorded column-entry time carries a dwell line reading 4d in this column · 60% done (or Moved here today on the day it lands). The progress clause is omitted at 0% and at 100% — a card in Done saying “100% done” adds nothing. The signal is board-local: it’s visible to everyone on the board but is never rolled up into a program or portfolio metric. Leave a column’s threshold blank to use the built-in default for that status.

On viewports below 768px the board reflows into a horizontal snap-scroll layout: each status column becomes a full-width page (scroll-snap-align: start), and swiping settles cleanly column-to-column. The phase swimlanes collapse on a phone — each column shows a flat list of its cards across every phase, so the narrow screen carries the status axis without nesting.

A dot-strip above the board names every column with its task count and a health dot, and acts as the map: the active column’s bar fills solid, and tapping any segment jumps to that column. Card anatomy, WIP limits, and the critical / blocked treatment are unchanged from desktop — only the layout reflows. The mobile FAB creates a task in the first visible column.

ActionMinimum role
View the boardViewer
Move cards, update statusMember
Create tasks from the boardMember