SDLC-372 · Side navbar alignment and icon UX issues · Ideation

The sidebar is
carrying the whole
application.

Janus puts every destination it has into one dark scrolling column — global tools, admin config, a nine-entry agent menu, a six-entry report menu, and every project with every board and every view underneath it — while a 44 px top bar holds two controls. This document audits why that reads as noise, sets the rules a fix has to obey, and carries two alternatives forward. Alternative C (top-led, full-bleed content) has been retired — the current content width is fine, which was C's entire reason to exist.

Repo
task-canvas-jam
Surface
AppSidebar · App shell header
Status
Ideation — no code changes
In play
A and B — C retired
Date
2026-08-09
DETAILED DESIGN → Alternative A · Rail + Context Anatomy · 50 products · reviewer persona · icon system · every breakpoint · build plan DETAILED DESIGN → Alternative B · One Sidebar Anatomy · pinned working set · row density · icon system · every breakpoint · build plan
00

Decisions

Answers to the open questions this document originally posed. Everything downstream — both alternatives, both detailed designs — is now built on these as fixed constraints.

Q1 — CROSS-PROJECT WORK

Occasional for you, constant for others

You hop between products only now and then, but people who sit across several products have to check in on all of them. Both A and B stay in play precisely because of this split — A optimises for the resident, B for the reviewer.

Q2 — SCALE

15–20 today, growing, nothing retires

Projects are products in a product company. New ones arrive; old ones stay on the board. Design target is 50+. This is the single most consequential answer — it's what makes A's constant-height property valuable and forces B to bound its default rendering.

Q3 — ICONS

Colour emoji for projects, monochrome inside

Projects keep expressive colour emoji — with a much larger palette. Boards and views go monochrome. Today's palettes are far too small: 8 hardcoded project emoji and 13 board icons.

Q4 — VIEWPORT WIDTH

Current width is fine

No demand for full-bleed reports. This retired Alternative C, whose main advantage was handing the timesheet and capitalization tables the whole viewport.

Q5 — PAGE HEADER

Remove it

The per-screen project header goes; the top bar absorbs identity, board switch and Create. Roughly 73 px returned on every project screen, and the duplicated identity ends.

Q6 — PINNED PROJECTS

In scope · client-side preferred

Client-side is fine, server-side welcome. Noted tension: users will be on web, mobile web and a planned Electron app, and localStorage doesn't cross devices. Both detailed docs recommend building against a small pins interface so storage can move without UI churn.

Q7 — NEW REQUIREMENT

Responsive is mandatory

Mobile-web users must not find this hard to use. That is now a first-class constraint on both alternatives, not a follow-up. It also changes the scoring: A's rail translates almost mechanically into a bottom tab bar, whereas B's single tree has no natural phone equivalent and has to diverge from its own desktop behaviour. Each detailed doc carries a full breakpoint table and phone mockups.

01

What's actually wrong

Below is a faithful reproduction of today's sidebar, built from AppSidebar.tsx — real row heights, real icon sets, real ordering, populated with a realistic four-project workspace. The amber pins mark problems 1–11; two more are structural and have nothing in the column to point at. The dashed line is where a 900 px-tall browser window cuts it off.

AppSidebar.tsx · today
Reproduced from source. Reports expanded, SDLC + PAY expanded — a realistic mid-session state, not a worst case.
  1. Three icon languages stacked in one list high

    Global rows use monochrome lucide line icons. Projects use free-text emoji at a different optical weight and baseline. Boards use lucide again — but tinted with an arbitrary per-board hex. Read top-to-bottom you cross three visual registers in about 400 px. Nothing tells you those registers mean anything, because they don't.

  2. Colour is decoration, not information high

    board.color is painted straight onto the icon glyph. Eight saturated hues appear inside a navy column with no shared semantic — blue isn't "in progress", rose isn't "at risk". They're just eight competing attention magnets. Meanwhile the one thing that is semantic — which board is a sprint board vs. a kanban board — has no visual expression at all.

  3. Boards and views are indistinguishable — except by absence high

    Inside an expanded project, "Core Platform" (a board) and "Backlog" (a saved view over the whole project) sit at the same indent, same row height, same font. The only difference is that the board has a coloured icon and the view has nothing at all. So the weaker distinction gets a colour and the stronger one gets a blank.

  4. Six sub-rows with no icons whatsoever med

    Future Sprint Board, Backlog, All Tickets, Roadmap, Test Cases, Test Cycles, QA Dashboard — all bare text. Once a QA-enabled project is expanded that's a seven-item wall of unscannable labels. The eye has no anchor to jump to; you read every line.

  5. Agent Studio alone is nine rows high

    AGENT_SIDEBAR_ENTRIES currently yields seven agents; plus "All Agents" and "PRD Generator" that's nine sub-rows. Expanded Reports adds six more. Expanded Configurations adds three. All three auto-open on route match and never auto-close — so visiting one report can permanently push every project below the fold for the rest of the session.

  6. PRD Generator has an icon; its seven siblings don't low

    A single FileText in an otherwise text-only sub-list. Small on its own, but it's the tell: there is no rule, so exceptions accumulate.

  7. The project row is a four-control compound med

    Chevron button · emoji · two-line name+key stack · settings cog — roughly 48 px tall, four hit targets, three of which are only occasionally wanted. Twenty projects is 960 px of chrome before a single board is visible. There is no search, no filter, no favourites, no recents.

  8. Admin config competes with daily navigation med

    Workflow Templates, Admin Management, Application Preferences and Preferences occupy prime vertical space directly above Projects. These are visited monthly. Boards are visited hourly. The layout ranks them equally.

  9. A group label and two separators for one external link low

    "Apps" wraps a single Specsmith link in ~90 px of chrome — label, row, two separators. Heavy framing for one item, and it sits above Projects.

  10. The top bar is 44 px holding two controls — and then the page draws a second one high

    The shell header has a sidebar toggle and a bell. Then ProjectBoard renders its own sticky header underneath with the project emoji, name, description, view tabs and Create. Two stacked bars ≈ 117 px of chrome, and the project identity is stated twice — once in the sidebar, once in the page. Nothing tells you which board you're on.

  11. Collapsed mode can't navigate med

    At 4rem the projects become bare emoji and every board, backlog and roadmap link disappears. Collapsing doesn't give you a compact navigator; it gives you a dead rail you have to un-collapse to use.

  12. The palettes are far too small for the catalogue high

    CreateProjectDialog.tsx offers eight hardcoded project emoji — 📋 🚀 🦞 🧪 ⚡ 🎯 🔧 💎 — and boardIconCatalog.ts offers thirteen board icons. At twenty products every third one already collides; at fifty, the icon stops carrying any identity at all and becomes decoration. Not pinnable to a row because it's a property of the pickers, not the column.

  13. Mobile is the desktop tree in a narrower box high

    useIsMobile() flips at 768 px and swaps the sidebar for an 18 rem Sheet drawer — containing exactly the same overloaded tree, complete with the nine-row Agent Studio and the six-row Reports menu. That isn't a mobile design; it's the desktop one, scrolled. With mobile web now a stated requirement this is a first-class defect rather than a nice-to-have.

Sample workspace used throughout

Every mockup in this document is populated with the same fixture — chosen to exercise the awkward cases rather than the easy one.

SDLC · Agentic SDLC — 3 boards (sprint + 2 kanban), roadmap on PAY · Payments — 2 boards (sprint + kanban), QA on DS · Design System — 1 board (kanban), nothing else on SRE · Reliability — 2 boards (kanban), roadmap + QA on
02

Six rules any fix has to obey

These are independent of which alternative wins. If a proposal breaks one of these, it's the proposal that's wrong.

RULE 01

One icon language per depth level

A level is either all-emoji, all-monochrome-line, or all-nothing. Never two. Mixed registers inside one list is the single biggest source of the current noise.

RULE 02

Colour identifies, it never decorates

A project or board colour may tint a container — a tile, a dot, a 2 px rail. It must not tint a glyph. Glyphs stay monochrome so the eye reads shape, not hue.

RULE 03

Boards and views are different species

A board is a place work lives. A view is a lens over work. They need visibly different treatment — grouping, weight, or indent — not the same row with a different icon.

RULE 04

Top bar owns context, sidebar owns destinations

"Where am I and what can I do here" is the top bar's job — breadcrumb, view switch, Create, search. "Where can I go" is the sidebar's. Today both are half-doing both, twice.

RULE 05

It has to survive twenty projects

The layout must be judged at 20 projects × 3 boards, not at 2 × 1. Anything that scales linearly in vertical space fails. Favourites, search, or one-project-at-a-time are the only real answers.

RULE 06

Collapsed must still navigate

Narrow mode is for people who want screen back, not people who've stopped navigating. Boards must remain reachable at every width — via flyout, via search, or by staying visible.

RULE 07

A phone is not a narrow desktop

Mobile web is a stated requirement, so 390 px is a design target rather than a degradation. The information architecture may stay the same; the containers must not. Today's drawer fails this by carrying the desktop tree verbatim.

RULE 08

The palette must outlast the catalogue

A fixed list of eight emoji cannot identify fifty products. Any palette that a person has to curate by hand will be too small within a year — so either it's genuinely large, or it's the platform's own set.

03

The icon grammar

This is the part that fixes the complaint in the ticket, and it is adoptable on its own — it works under both remaining alternatives and needs no backend change. project.icon keeps storing an emoji; board.color keeps storing a hex. Only the rendering rule changes, plus the two pickers get much larger sets. Picker designs are drawn in Alternative A §06.

LevelSymbolSizeColour ruleWhy
Global destinationlucide line icon16pxinherits sidebar foreground, 70% when idleThese are app-level nouns; they must recede behind project content.
Projectcolour emoji inside a rounded tile — palette expands from 8 to the full native set22px tile / 12px glyphtile fill = project.color @ 16%, 1px border @ 30%Containing the emoji gives it a consistent optical box and turns the colour into an identity swatch instead of a floating glyph. Rule 08 forces the palette open.
Boardlucide line icon — catalog expands from 13 to ~6014pxmonochrome + a 5px dot in board.colorRule 02. The hue still identifies the board, but it stops fighting the glyph for attention.
Viewlucide line icon, newly assigned14pxforeground @ 55% — one step quieter than boardsViews become scannable, and the quieter weight encodes Rule 03 without extra chrome.
Section labelnone11px capsforeground @ 45%Labels are structure, not destinations.
Proposed view icons — the seven rows that currently have none
Each is a lucide glyph already in the bundle. No new dependency.
04

A · Rail + Context

recommended

Split the sidebar in two. A narrow 52 px rail holds everything global and permanent. A 236 px context panel shows exactly one project — the one you're in — with its boards and views, reached through a project switcher at the top. The giant accordion disappears entirely: you never scroll past twelve projects to reach the thirteenth, because only one is ever rendered.

Alternative A — /project/SDLC?board=CORE
Rail: Home · My Work · Search · Agents · Reports · Config, avatar pinned bottom. Panel: one project. Top bar: breadcrumb → board switch lives here, search, Create, bell.
Project switcher — how you reach the other 19 projects
Starred pinned to top · type-to-filter · ⌘P anywhere. Recents fill the rest.
Collapsed — panel hidden, rail keeps working
The rail is never hidden. Boards stay reachable from the breadcrumb board switcher in the top bar — Rule 06 satisfied without a flyout.

What it buys

  • Sidebar height becomes constant — independent of how many projects exist. Rule 05 solved structurally, not by tricks.
  • Every icon-language conflict evaporates: the rail is all-lucide, the panel is one project tile plus monochrome board/view icons.
  • Boards and views separate into two labelled groups with a guide rail — Rule 03, for free.
  • Global admin noise (Reports, Agents, Config) leaves the scroll column entirely and becomes six permanent 34 px targets.
  • Breadcrumb in the top bar finally answers "which board am I on", and lets us delete the duplicate page header.

What it costs

  • Cross-project comparison gets slower — you can no longer see PAY's boards while sitting in SDLC. Mitigated by ⌘P and starred projects, but it's a real change in behaviour.
  • 288 px of chrome at rest vs. 256 px today. Slightly wider, though it collapses to 52.
  • Biggest build: new shell in App.tsx, a switcher component, and "what project am I in" has to be resolved on every route — including /browse/<KEY>, which today already does this lookup, so the hard part exists.
  • Needs a starred-projects concept to feel good. That's a backend field.
05

B · One Sidebar, Disciplined

lowest risk

Keep the single column. Fix the rules inside it. Projects become single-line rows with a colour tile and a mono key chip. The sub-tree splits into labelled Boards / Views / Quality clusters against a guide rail. Search moves to the top of the sidebar. Reports · Agents · Configurations drop to a compact pinned cluster at the bottom so projects own the scroll. Admin and preferences move into the top-bar avatar menu.

Alternative B — /project/PAY?board=PCORE
SDLC and PAY expanded together — the case Alternative A can't show. Note Boards vs Views vs Quality clusters, and the bottom-pinned workspace tools.
Row anatomy — before / after
48 px → 32 px per project. Chevron only on hover; cog moves into the row's menu.
Collapsed — icon rail with flyout
Hovering a project tile opens its boards and views as a flyout — collapsed stops being a dead end.

What it buys

  • Fixes every icon and hierarchy finding without touching App.tsx — it is essentially a rewrite of one file.
  • Keeps multi-project visibility, which is genuinely useful when you work across SDLC and PAY in one sitting.
  • Cheapest path to a visible improvement; shippable in one PR with tests.
  • Sidebar search + favourites can be added incrementally afterwards.

What it costs

  • Still scales linearly. At 20 projects it's better-organised but still a long scroll — Rule 05 is mitigated, not solved.
  • Global tools at the bottom is a learned position; some users will hunt for Reports the first few times.
  • The double-header problem stays unless the top bar work is done alongside — worth doing regardless of alternative.
  • Flyouts on hover need care to not fire accidentally.
06

Side by side

Scored against the six rules plus the practical questions. Green = solved, amber = mitigated, red = unaddressed or made worse.

A · Rail + ContextB · One Sidebar, Disciplined
Icon coherence (R1–R2)solvedsolved
Board ≠ view (R3)solved — groupedsolved — grouped
Context vs. destination (R4)breadcrumb + board switchsame top bar — shared work
Survives 50 products (R5)constant height — renders one projectbounded by pins, not by catalogue
Collapsed still navigates (R6)rail + breadcrumb switcherrail + hover flyouts
Mobile web (R7)rail → bottom tabs, 1:1 translationdrawer must diverge from desktop
Palette outlasts catalogue (R8)native emoji + ~60 iconsidentical
Several products open at onceno — replaced by My Work + pinsyes — this is B's reason to exist
Reviewer personaserved by new affordancesserved natively
Resident personaserved nativelyfine, with more on screen
Worst realistic columnone project, never scrolls8 pinned QA projects still scrolls
Files touchedAppSidebar, App.tsx shell, +2 new componentsAppSidebar; App.tsx only for the top bar
Rough effortmedium–highlow–medium
Pins storageworks client-side; server betterload-bearing — server recommended
Risk of regressionmedium — new shelllow — one file at a time
Detailed designAlternative A →Alternative B →
The two rows that decide it

Everything above the midpoint is a tie — both directions fix the icon and hierarchy complaints equally well, and the top-bar work is literally shared. The real choice is between “several products open at once”, which only B gives you, and “mobile web + fifty products”, which only A handles without compromise. Your Q1 answer says both personas are real, so this is a genuine trade rather than a right answer.

07

Where this stands

Both directions are now fully designed. What's left is one choice, one clarification, and one product question that's bigger than this ticket.

My recommendation is unchanged and now better supported: ship the icon grammar first as its own PR — it closes the literal ticket, it's identical under both alternatives, and it needs no shell decision. Then pick the shell. Two of your answers moved the needle toward A: fifty growing products, and mobile web as a hard requirement. The answer that argues for B is that reviewers who genuinely live across six products lose something real, and B is roughly half the build.

STEP 1 — START NOW, NO DECISION NEEDED

Icon grammar + expanded palettes

Monochrome board glyphs with colour dots, emoji-in-tile for projects, icons for the seven bare view rows, single-line project rows, native emoji picker, board catalog 13 → ~60. One PR. Identical under A and B.

STEP 2 — ALSO SHARED

Top bar + page-header removal

Breadcrumb with board switcher, global search, Create, account menu; delete the per-screen project headers. Byte-for-byte the same under A and B, and worth ~73 px on every project screen.

STEP 3 — THE ONE CALL LEFT

Rail + context panel, or one disciplined column

Read the two detailed docs and pick. Everything in steps 1 and 2 survives either way, so this decision can be made after that work is already in flight rather than blocking it.

Still open

“Monogram” — did you mean monochrome?

You said monogram for boards and views. I've read it as monochrome — single-colour line glyphs, no per-board hue on the glyph — since that's what the question was asking about, and a literal CP for "Core Platform" would scan worse than a shape. Both detailed docs are drawn that way. If you meant literal letter monograms, it's a contained change but it touches every board row in both directions.

Native emoji set, or a curated hundred?

Native is my recommendation — zero curation forever, users already know it, stored value stays a single emoji string so nothing migrates. Curated is more visually consistent and immune to an emoji that renders flat on one OS, but it's a list someone owns forever and it will still be too small for somebody.

Archiving — a real product question, raised not answered

You said old products stay on the board. At fifty that's fine if there's a way to mark one dormant, otherwise the switcher's tail and every search grows forever. The cheap version is a per-user hide from my sidebar toggle, which needs no schema change and no policy debate. A real project.status field is better but is bigger than SDLC-372. I'd ship the per-user hide and raise archiving separately.

Pins — client now, or server now?

Both docs recommend building against a small pins interface backed by localStorage, so storage can move later without UI churn. Worth knowing how close the Electron app is: if it's near, going straight to server-side saves a migration and matches the cross-device story you described.

SDLC-372 · IDEATION · NO CODE CHANGES SDLC Wiki · Alternative A · Alternative B