SDLC-372 · Detailed design · One of two directions under consideration

Alternative B
One Sidebar,
Disciplined

Keep the single column — fix every rule inside it. Single-line project rows, sub-trees split into labelled Boards / Views / Quality clusters, global tools demoted to a pinned bottom strip, and a pinned working set that keeps the default height bounded while still letting four products stay open at once. This is the direction that preserves the thing A gives up.

Sibling doc
Alternative A →
Overview
Main doc →
Status
Ideation — no code changes
Date
2026-08-09
00

Decisions this design is built on

Identical constraints to Alternative A — the same answers, applied to a different shell.

Cross-project work
Occasional for you, frequent for reviewers. This is the constraint B is built around rather than compensating for.
Scale
15–20 today, growing, nothing retires. B's hardest problem — §03 is the whole answer.
Project icon
Keep colour emoji, expanded palette.
Boards & views
Monochrome glyphs + colour dot.
Viewport width
Current width is fine.
Page header
Removed — top bar absorbs it. Shared with A.
Pinned projects
In scope, and load-bearing here — pins define the default sidebar.
Responsive
Mandatory. §07 — and honestly B's weaker half.

Same interpretation to confirm

Your "monogram" for boards and views is read here as monochrome — single-colour line glyphs. Say the word if you meant literal two-letter monograms and I'll redraw the board rows in both docs.

01

The premise

Nothing structural moves. One dark column, projects listed in it, boards nested underneath — exactly the mental model everyone already has. What changes is that the column finally obeys rules: one icon language per level, colour only as identity, boards and views visibly different species, and a bounded default height.

WHAT B KEEPS

Several products open at once

The reviewer who checks six products every morning sees six trees, in one glance, with no menu in between. Alternative A has to replace that behaviour with pinned tiles and a cross-project My Work; B just keeps it.

WHAT B MUST SOLVE

Height that grows with the catalogue

At 50 products a naïve list is 1,600 px before a single board. B is only viable if the default rendering is bounded — which is what the pinned working set in §03 does.

B — /project/PAY?board=PCORE · 4 pinned, 2 expanded
Search at the top. Pinned working set in the middle. All projects · 18 collapsed below it. Agent Studio / Reports / Configurations pinned to the bottom so they never push projects down again.
02

Anatomy

Top to bottom, and why each block sits where it does. Pins 1–8 are marked on the column; 9 describes something that gets deleted, so it has nothing to point at.

sidebar, annotated
  1. Header — mark, name, collapse

    The collapse control moves out of the top bar and into the sidebar it controls. The DEV badge stops being an absolutely-positioned rotated element clipping over the logo and becomes an inline chip.

  2. Search — first-class, not buried

    A real ⌘K entry point at the top. Today JQL search only exists inside the All Tickets page; at 50 products search stops being a convenience and becomes the primary way people navigate.

  3. Personal block — three rows, never more

    Home · My Work · All Tickets. Cross-project by definition, so they sit above the project list rather than inside it. My Work is new and carries an unread-style count.

  4. PINNED — the working set

    The user's own projects, expandable, multi-expand allowed. This is the block that makes B viable at scale: it's what renders by default, and it's bounded by the user, not by the catalogue.

  5. Project row — single line, 32 px

    Colour tile · name · mono key chip. Chevron appears on hover at the left; the settings cog becomes a menu, also hover-only. Four permanent controls become one.

  6. BOARDS / VIEWS / QUALITY

    Micro-labels against a guide rail. Boards get full-weight monochrome glyphs plus the colour dot; views get 60% opacity. That weight step is the entire board-vs-view distinction — no extra chrome.

  7. ALL PROJECTS — collapsed directory

    Everything not pinned, behind one row that states the count. Expanding reveals a filter field and single-line rows. This is where the other fourteen live without costing a pixel until asked for.

  8. Workspace strip — pinned to the bottom

    Agent Studio, Reports, Configurations. Visited monthly, so they get the position that matches. Their nine-, six- and three-row sub-menus open as flyouts, not inline expansions — that alone removes the failure mode where one report visit buries every project.

  9. Account — absorbed into the top bar

    The 44 px footer slab with avatar, name, email and logout is deleted. Preferences, Admin Management and Application Preferences move into the top-bar avatar menu.

03

Fifty products in one column

This is the section that decides whether B is viable. A solves scale structurally by rendering one project; B has to solve it by bounding what renders by default. Three mechanisms, in order of importance.

MECHANISM 01

Pinned working set

Only pinned projects render as expandable trees. A new user's pins are seeded from their project_members rows, so the sidebar is useful on first load without any setup. Everything else is one collapsed row away.

MECHANISM 02

Filter, not scroll

Typing in the projects filter narrows both pinned and unpinned by name and key. At 50 products this is faster than any amount of scrolling, and it's the same interaction as A's ⌘P — just inline.

MECHANISM 03

Accordion option

A per-user toggle: keep one project expanded at a time. Off by default — collapsing someone's tree when they open another is hostile — but available for people who pin eight products and want a short column.

ALL PROJECTS expanded — filtered
Filter narrows by name and key. Star on hover pins into the working set. Archived collapsed at the tail.
Worst realistic case — 4 pinned, all expanded
Two QA projects and a roadmap project expanded together. Still scrolls — this is the honest limit of a single column, and the accordion toggle exists for exactly this user.

The honest comparison

B's height is bounded by how many projects a person pins, not by how many exist. That's a genuine solution to catalogue growth — 200 products cost nothing if you pin four. What it does not solve is the person who legitimately pins eight QA-enabled projects: they get a column that scrolls, and no amount of grouping fixes that.

A has no such ceiling because it never renders more than one project. If you expect several people to work across eight-plus products daily, that difference is the deciding factor between the two directions.

04

Row density

The project row is where most of the current sidebar's weight comes from: 48 px tall, four permanent hit targets, three of them rarely wanted. B halves it.

Before / after / hover
48px → 32px. At 6 pinned projects that alone recovers ~96 px.
The ⋯ menu
Absorbs the per-row cog plus the actions that have no home today — pin, hide, copy key.
ControlTodayAlternative B
Expand chevronpermanent 28px buttonhover-only, overlays the tile
Project iconbare emoji, 15pxemoji in a 22px colour tile
Name + keytwo stacked lines, 44pxone line + mono key chip, right-aligned
Settings cogpermanent, admins onlyinside the hover ⋯ menu
Row height48px32px
05

Top bar — identical to A

This work is shared between both directions and should be built regardless of which shell wins. The breadcrumb takes over project identity and the board switcher; the per-screen page header is deleted; Create, search, notifications and the account menu land on the right.

Today — two bars, 117px
B — one bar + conditional strip
Full route-by-route accounting is in Alternative A §05 — it is the same table.
06

Icons and emoji

Also shared with A, and also independently shippable — this is the piece that closes the literal ticket. Today: eight hardcoded project emoji in CreateProjectDialog.tsx, thirteen board icons in boardIconCatalog.ts. Both expand.

LevelSymbolTodayProposed
Projectcolour emoji in a tinted tile8 hardcodedfull native emoji set, searchable, with recents
Boardmonochrome glyph + colour dot13, tinted~60, categorised, monochrome
Viewmonochrome glyph @ 60%none7 assigned
Globalmonochrome glyphinconsistentone set, one weight
The seven view rows that have no icon today
Picker designs for both palettes are drawn in Alternative A §06 — identical under B.
07

Every width, down to a phone

B's weaker half, and worth being straight about. A's rail is already the shape of a bottom tab bar, so it translates almost mechanically. B's single tree has no equivalent — on a 390 px screen a drawer containing four expanded projects is a scroll, not a navigator.

WidthSidebarTop barNotes
≥ 1280264px, persistent, resizablefull breadcrumb + search + Createthe design above
1024 – 1279264px, collapsible to 56px railsearch collapses to iconcollapsed rail keeps pinned tiles
768 – 102356px rail by default, flyout on hoverbreadcrumb truncatesflyout carries the full sub-tree
< 768drawer, projects collapsed by default40px: hamburger · title · search · avatarplus a bottom quick bar — see below
Collapsed rail + flyout
Pinned tiles stay visible at 56 px; hovering one opens its full Boards / Views / Quality tree. Collapsed stops being a dead end.
Mobile — drawer
Mobile — board

The mobile compromise B has to make

On phones, B's drawer opens with every project collapsed — including pinned ones — because four expanded trees on a 390 px screen is a 900 px scroll. That means mobile behaves differently from desktop, which is a real inconsistency and a real thing to explain to users.

A bottom quick bar (Home · My Work · Create · Search · Menu) carries the frequent destinations so most mobile sessions never open the drawer at all. That's the mitigation, and it's the same bar A uses — but under A it's the same navigation as desktop, and under B it's an additional one.

08

Where pins live

Under B, pins aren't a convenience — they define what the sidebar renders. That raises the stakes on the client-vs-server question you flagged.

CLIENT — localStorage

Ships in the same PR

No backend, works offline. But because pins are the sidebar here, a new device shows the seeded default rather than the user's real working set — a more visible regression than under A, where pins are just a rail shortcut.

SERVER — user preference

Correct across web, mobile web, Electron

One small per-user record. Given pins carry more weight in B, and given the multi-platform plan you described, this is the safer default here even though you'd accept client-side.

Recommendation

Same shape as A — build against a small pins interface so the storage can move later — but under B I'd lean server-side sooner. The seeding rule (pin every project the user is a member of, on first load) blunts the worst of the client-only case, and is worth building either way.

09

What it takes to build

B's headline advantage: phases 1–3 are essentially one file. App.tsx is untouched until the top-bar phase, and the routing model never changes.

PHASE 1

Icon grammar + expanded palettes

Monochrome board glyphs with colour dots, emoji-in-tile projects, icons for the seven bare view rows, native emoji picker, board catalog to ~60. Identical to A's phase 1 — build it before the shell decision is even final.

PHASE 2

Structure — clusters, single-line rows, bottom strip

BOARDS / VIEWS / QUALITY grouping, 32 px rows, ⋯ menu, Agent Studio / Reports / Configurations moved to the bottom with flyout sub-menus. Confined to AppSidebar.tsx.

PHASE 3

Pinned working set + filter + directory

PINNED group, ALL PROJECTS collapsed directory, inline filter, member-seeded defaults, accordion toggle. The phase that makes B survive the catalogue.

PHASE 4

Top bar + page-header removal

Shared with A. Touches App.tsx and every project page's header block.

PHASE 5

Responsive

Collapsed rail flyouts, mobile drawer defaults, bottom quick bar. The largest divergence from today's behaviour.

Risks worth naming now
RISK

Global tools at the bottom

Reports moving from mid-column to a bottom strip is a learned position. Expect hunting for the first week. Mitigated by ⌘K search reaching them by name from day one.

RISK

Hover flyouts

Used in three places — collapsed rail, bottom workspace strip, and the ⋯ menu. Needs open/close delays, keyboard equivalents and touch fallbacks, or it becomes the most-complained-about part of the design.

RISK

Pins are load-bearing

If pin seeding is wrong — someone is a member of fifteen projects — the sidebar is worse on first load than it is today. The seeding rule needs a cap (say, six) and a clear empty state.

RISK

Mobile divergence

Desktop expands pinned trees, mobile collapses them. Defensible, but it is two behaviours to document and test rather than one.

SDLC-372 · ALTERNATIVE B · IDEATION ONLY SDLC Wiki · Main doc · Alternative A