Portal navigation — option analysis

Date: 2026-07-14

Context: The user (operator) said the chip dock in the FreshCards-inspired mockup would "get very ugly very quickly" as the system grows. They asked me to think about alternatives without building yet. This doc captures the options I considered and a clear comparison so the operator can read it cold and form a view.

Mockup reference: https://preview.mockup.freshvibeapps.com/portal-mockup.html — the chip-dock version that triggered this conversation.


The actual problem

The chip dock has 4 chips today (deployments, previews, inventory, settings). User said it gets ugly as features grow. Concrete numbers:

  • 4 chips today: fine
  • 8 chips: starts to wrap or scroll
  • 15 chips: unusable
  • 30 chips: dead
  • We need an architecture that scales to 20+ meta-surfaces (deployments, previews, inventory, audit log, billing, support, teams, databases, secrets, webhooks, regions, themes, plugins, marketplace, etc.) without the UI getting worse as we add things.


    Option 1 — Flat chip dock (rejected)

    What it is: The current mockup. A horizontal row of chips at the top. Click to expand.

    Why it fails: Doesn't scale past 5-6 chips. The user already said this.


    Option 2 — Cmd+K palette (rejected for this product)

    What it is: A command palette (Linear/Raycast model). Hit a hotkey, type to search, click a result.

    Pros: Scales to 1000s of items. Keyboard-driven.

    Cons:

  • Requires knowing the hotkey exists. The operator will never discover it.
  • It's a TWO-STEP process: open palette, then search. Slow.
  • A blank palette is a dead end.
  • Doesn't show what's AVAILABLE — only what you search FOR.
  • Why it fails: Wrong for an operator who uses the panel in short bursts and doesn't want a learning curve. Fine for power users; not for this.


    Option 3 — Bottom tab bar (rejected for desktop)

    What it is: iOS/Android pattern. 3-5 tabs across the bottom. Always visible. Tap to switch.

    Pros: Mobile-native. Fast. Discoverable. Capped at 5 things.

    Cons: On a desktop monitor, the bottom is dead space and it looks wrong. The operator is on desktop 80% of the time.

    Why it fails: Right for mobile, wrong for desktop. Doesn't compose with both.


    Option 4 — Side rail with collapsible sections (rejected for mobile)

    What it is: VSCode/Photoshop model. Vertical strip of icon-only chips, with hover-to-expand.

    Pros: Discoverable. Scales to ~30 items. Standard pattern.

    Cons:

  • Eats screen real estate on mobile.
  • "Hover" doesn't work on touch. The operator uses mobile.
  • 200px sidebar on a 360px phone screen = 55% of the screen is nav.
  • Why it fails: Wrong for the operator's mobile usage.


    Option 5 — Breadcrumb-as-nav (rejected)

    What it is: Click a level to go up. Suits deep content (file trees, settings categories) not parallel surfaces.

    Why it fails: Deployments + Previews + Inventory + Settings are SIBLINGS, not parent/child. Breadcrumbs are for hierarchies.


    Option 6 — Hub-and-spoke (one of my top candidates)

    What it is: ONE main surface visible at a time. Below it, a thin row of "nearby surfaces" — siblings, recent, suggested. The siblings change based on context: if you're looking at a deployment, the siblings are {previews for this project, deploys for this client, history}. If you're at home, the siblings are {deployments, previews, inventory, settings}.

    Pros: Scales — the siblings list is always short because it's context-filtered. The operator sees what matters now, not everything.

    Cons: Requires the system to know "what's nearby" for any given context. That's a real piece of logic. When the system gets it wrong, the user is stuck.

    Verdict: Strong option. The "smartness" is the cost. Easy to get wrong.


    Option 7 — Card-with-actions-on-it (what the mockup already does, but more)

    What it is: Each card has its own actions inline (Open, Preview, Docs, auth_mode, history). The chips at the top are SECONDARY nav for cross-cutting concerns (settings, inventory, all projects). The cards ARE the navigation.

    Pros:

  • Scales forever. Adding a feature = adding a card. The chips stay at 4-6.
  • The cards are the universe. The chips are the escape hatches.
  • This is what GitHub does. Your repos page is a list of cards; the nav is in the cards.
  • Cons:

  • Cross-cutting concerns that don't fit on a card (full-text search, audit log, billing) need somewhere to live. This option needs a small "other stuff" escape hatch.
  • The cards need to be self-aware of related surfaces. That coupling is real work.
  • Verdict: Strong option. Most scalable. The cards-as-nav model is the most "FreshCards way."


    Option 8 — Persistent search bar with autocomplete (compromise)

    What it is: Not a Cmd+K palette — a VISIBLE bar at the top. Type "deploy" → shows the deployments surface AS YOU TYPE, with the existing filters below it auto-applied. Type "pre" → shows previews. Type "set" → shows settings. Empty bar shows the curated 4-6 chips.

    Pros:

  • Scales to anything.
  • Discoverable (the bar is always there, no hotkey to know).
  • No learning curve.
  • Doesn't show all options, but shows the ones matching intent.
  • Empty state = curated chips (the safe default).
  • Cons:

  • The chips-when-empty means the user is back to the same chip-dock problem when not searching.
  • Requires keyboard input. The operator might prefer to never type.
  • Verdict: OK option. Lighter than Cmd+K but still search-heavy.


    Option 9 — Spotlight-style with chips as suggestions (hybrid)

    What it is: The search bar is always there. As you type, the suggestions ARE chips. The chip row only appears when the search bar is empty.

    Verdict: Same as 8. Solves the "what if there are 30 chips" case but the operator doesn't type to navigate.


    Option 10 — Page-as-state (rejected)

    What it is: Each "view" is a URL. /deployments, /previews, /inventory, /settings. Browser back works.

    Why it fails: Loading cost per switch. The operator uses mobile; back button is sometimes hard to hit. Loses the "one screen, switch between surfaces" feel.


    Option 11 — Tab-as-state (rejected, sort of)

    Same as 10 but with a tab bar at the top. Each tab is a full page. Loading cost on switch.


    Option 12 — Cards ARE the nav, no chips at all (option 7 hardened)

    What it is:** Remove the global chips entirely. Each card has inline links to {previews for this project, deploys for this client, history of this project, settings}. Settings gets a corner button. Inventory is hidden behind a "View all" link on the cards. **The cards are the universe.

    Pros:

  • Scales forever. Adding a card adds an entry point. The chips at the top stay at 3-4.
  • This is what GitHub does for the repos view.
  • Cons:

  • Cross-cutting concerns that don't fit on any single card (full-text search, audit log) have no home.
  • Each card needs to be self-aware of related surfaces. Coupling.
  • Verdict: Most scalable. Most risky to demo without real data.


    Option 13 — The FreshCards actual answer (re-reading WorkspaceChip)

    What it is: FreshCards doesn't have a global nav at all. It has:

  • A **sidebar with a tree of surfaces** (left rail, ~200px wide)
  • A **main area with the active surface** (cards, tables, etc.)
  • A **toolbar at the top of the main area** (search, view switcher, + new)
  • **No global chip dock**. Chips are CONTEXTUAL — they appear when a specific surface is active, with the actions for THAT surface.
  • Pros:

  • Scales to any number of features (each new feature = a new sidebar item).
  • Discoverable (the sidebar lists everything).
  • Mobile-friendly (the sidebar becomes a top menu or hamburger).
  • Operator-specific actions appear when relevant.
  • No learning curve (sidebar = "all the things," card = "this thing's options").
  • Cons:

  • The sidebar takes real estate on small screens.
  • Changes the whole mental model.
  • Verdict: Right for a long-term app the operator uses 4+ hours/day. The portal isn't that. The portal is a "check it 2x a day for 5 minutes" thing.


    My actual pick

    For the operator, who uses the portal in short bursts on mobile and desktop:

    Option 12 (cards ARE the nav) PLUS a small "settings" corner button.

    The chip dock disappears. Each card has its own inline actions. The filter chips stay (they're attached to the deployment list, which is the main content). Settings gets a corner button on the user chip. Inventory gets a "View all deployments" link on the cards. New meta-surfaces are added to the corner area or to a small overflow menu.

    Why this wins:

  • The user said the cards look good. Keep them.
  • The user said the chip dock gets ugly. Remove it.
  • The cards are already self-aware (they have Open, Preview, Docs, auth_mode). Add a few more actions to the card and the dock isn't needed.
  • Mobile-perfect (the cards are already mobile-friendly).
  • Scales forever (new surfaces = new card actions or new corner menu items, NOT new chips).
  • Matches "cards ARE the universe" intuition.
  • The risks:

  • Cross-cutting concerns that don't fit on any single card need a small overflow menu. That's fine, an overflow menu scales.
  • Each card needs to know about related surfaces. That's a real piece of work but it's bounded — you only do it for the surfaces that exist.
  • Backup plan if the user doesn't like option 12: option 6 (hub-and-spoke with context-aware siblings) is the second-best. The siblings list stays short because it's context-filtered. But it requires the system to know "what's nearby" which is real logic.

    Backup plan if the user doesn't like 6 or 12: option 2 (Cmd+K palette) as a power-user feature, plus option 1 (flat dock) for the curated 4-5. The palette for the long tail, the dock for the common case. This is the GitHub/Linear model in practice.


    What I will NOT do without explicit go-ahead

  • I won't ship any of these to the live portal until the operator says "do X."
  • I won't regen the mockup with any of these until the operator picks one.
  • The current mockup (`https://preview.mockup.freshvibeapps.com/portal-mockup.html`) stays as-is, with the chip dock visible, so the operator can compare.