spec

MC Board Phase 1: Desktop Polish

2026-04-02

MC Board Phase 1: Desktop Polish

Compact cards, icon-based metadata, list view toggle, and collapsible empty columns. Inspired by Linear's design patterns documented in Linear App Architecture Deconstruction.

1. Problem Statement and Goal

The current MC kanban board works but cards are visually heavy. Each card shows a text badge for priority ("medium"), a text label for assignee, a 4-line description excerpt, explicit Edit/Delete/Drag buttons, and arrow buttons for column movement. This makes the board hard to scan when there are more than a few tasks per column. There's also no list view, which is the better layout for mobile and for quickly scanning all tasks at once.

Goal: Make the board scannable at a glance. Reduce card height by ~50%. Add a list view as an alternative layout. Collapse empty columns to save horizontal space.

2. Success Metric

Pete can scan the full board without scrolling vertically when there are 5 or fewer tasks per column. Cards communicate status, priority, assignee, and blocked state through icons, not text labels.

3. Current State

Board (TasksWorkspace.tsx, ~412 lines):

Cards (TaskCard.tsx, ~223 lines):

Editor modal (TaskEditorModal.tsx, ~271 lines):

status dropdown, project dropdown, assignee dropdown, blocked toggle

No list view exists. Board is the only layout.

Task data model (lib/tasks.ts):

blocked?, createdAt, updatedAt

4. Platform Capabilities

This is pure frontend work in Next.js/React. No OpenClaw platform capabilities needed. The task API (PUT /api/tasks) and data model remain unchanged.

5. Community Patterns

Linear's board cards show: issue ID + status icon + title + priority icon + assignee avatar + date. No description, no explicit buttons. Actions via context menu on hover. This is the industry standard for task boards (Notion, Asana, Monday all converge on similar density).

6. Options

Option A: Incremental card cleanup

Shrink current cards by removing description excerpt and hiding buttons behind hover. Keep text badges for priority.

Replace card internals with icon-based compact layout. Add list view with layout toggle. Collapse empty columns.

Option C: Scrap board, go list-only

Replace board with a grouped list view like Linear's default.

7. Recommendation

Option B. The card redesign and list view are complementary. The card changes alone cut card height in half. The list view adds a second layout that works better for scanning and mobile. Both reference the same task data and share status/priority icon components.

8. Security Considerations

No new data exposure. No new API endpoints. No auth changes. The task API already requires local network access (bound to 0.0.0.0:3100 behind Tailscale).

9. Implementation Scope

9.1 New shared components

StatusIcon component (components/tasks/StatusIcon.tsx)

PriorityIcon component (components/tasks/PriorityIcon.tsx)

AssigneeAvatar component (components/tasks/AssigneeAvatar.tsx)

9.2 Compact card redesign

Replace TaskCard.tsx internals:

New card anatomy (top to bottom):

┌────────────────────────────┐
│ ○ Task title here      P 👤│
│   #tag1 #tag2              │
└────────────────────────────┘

+ PriorityIcon + AssigneeAvatar (right-aligned)

regular tags unless they're activity tags. No description excerpt.

floating toolbar (or via right-click context menu).

or icon next to title

reduce to 12px for density

Remove the explicit "Drag" pill.

Hover actions toolbar:

top-right or bottom of card)

9.3 List view

New component: TaskListView.tsx

Layout: grouped by status, each group has a sticky header.

○ Backlog  3                                    +
─────────────────────────────────────────────────
  ○  Notion Integration           #spec    P  👤
  ○  Design token architecture    #build   P  👤
  ○  Gmail model routing                   P  👤

◐ In Progress  2                                +
─────────────────────────────────────────────────
  ◐  MC Board Phase 1 build      #build   P  👤
  ◐  Job search pipeline                   P  👤

Group header: StatusIcon + status name + count + add button (+) Row anatomy (left to right):

  1. StatusIcon (matches group, but shown per-row for visual rhythm)
  2. Title (primary text, flex-grow, single line ellipsis)
  3. Activity tags (compact pills)
  4. Blocked indicator (red dot if blocked)
  5. PriorityIcon
  6. AssigneeAvatar
  7. Updated date (gray, compact like "Apr 2")

Row interactions:

9.4 Layout toggle

In the Tasks page header (SectionHeader area):

9.5 Collapsible empty columns

In board view only:

status icon + column name (rotated vertical text) + "0"

(Linear pattern)

9.6 Files to create/modify

FileAction
components/tasks/StatusIcon.tsxCreate
components/tasks/PriorityIcon.tsxCreate
components/tasks/AssigneeAvatar.tsxCreate
components/tasks/TaskListView.tsxCreate
components/tasks/TaskCard.tsxRewrite internals
components/tasks/TaskBoardColumn.tsxMinor: support collapsed state
components/tasks/TasksWorkspace.tsxAdd layout toggle, list view routing
app/globals.css (if needed)Add list view + collapsed column styles

9.7 What NOT to change

10. Validation Criteria

  1. Board view: cards show status icon + title + priority icon + assignee

avatar on one line. No text badges for priority. No description excerpt. No always-visible buttons.

  1. Board view: hover over a card reveals action buttons (edit, delete,

move arrows).

  1. Board view: empty columns collapse or show as thin strips.
  2. List view: tasks grouped by status with sticky headers. Rows show

status icon + title + tags + priority icon + assignee avatar.

  1. List view: click a row opens the editor modal.
  2. Layout toggle: two buttons in the header switch between board and list.

Selection persists across page loads.

  1. All existing functionality still works: create, edit, delete, drag

between columns, blocked indicator, activity tags.

11. Category

Tool (UI component changes to Mission Control)

12. Context Loading

David needs to read:

(board view, list view, visual language) for icon/color reference

13. Guardrails

lucide-react icons)

14. Handoff

David builds, rebuilds MC (npm run build), and restarts the service. Vinny verifies against the validation criteria, takes screenshots, and moves the task to Needs Review for Pete. Pete verifies at the Tailscale URL: http://vinnys-mac-mini.tail31784c.ts.net:3100/tasks