---
id: w6/m3/t002
title: "/new/workspace route: name + plan picker (Render plan cards), create → switch"
worker: worker6
status: done
estimate: 35m
depends_on: [w6/m3/t001]
---

## Closeout

Shipped as `src/routes/new.workspace.tsx` + `src/features/workspaces/components/plan-picker.tsx`. Hobby/Pro/Scale/Enterprise cards with copy from RESEARCH-workspaces.md findings 1/4, Hobby preselected. `createWorkspace`'s response is used directly to switch context + navigate (no extra refetch round-trip first); the Hobby-cap refusal renders inline via the create hook's `error` state (verified live: creating a 6th Hobby workspace shows "bad request: at most 5 hobby workspaces per user" in an `Alert`, form stays put). No payment step — Hobby needs none and bex has no billing system, called out explicitly in the plan card copy ("Free").

## Objective

The page the user asked for by URL: a `/new/workspace` route with a workspace-name field and plan cards for the post-April-2026 lineup — Hobby ($0, personal projects, 1 member, 25 services), Pro ($25/mo flat, unlimited members), Scale ($499/mo flat, +roles/orgs), Enterprise (contact) — defaulting to Hobby. Submit calls `createWorkspace`, then switches the t001 context into the new workspace. No payment step (bex has no billing; Render itself skips the card for Hobby).

## Context

- Route file: `dashboard/src/routes/new.workspace.tsx` (TanStack file-based routing, matching existing `auth.login.tsx` style).
- Plan facts and card copy come from RESEARCH-workspaces.md finding 1/4 and m1/t001's capture — don't invent numbers.
- The 6th-Hobby limit error must render inline (typed error from m1/t006).
- Paid plans create with the plan recorded but no charge — mark the card copy honestly (e.g. "billing not yet enforced") rather than faking a checkout.

## Steps

1. Build the route: name input + plan cards (shadcn), Hobby preselected, i18n'd like existing pages.
2. Wire `createWorkspace` mutation; on success switch context and navigate to the (empty) services index.
3. Inline error states: limit reached, invalid name.

## Files

- `dashboard/src/routes/new.workspace.tsx` (new)
- `dashboard/src/graphql/` (mutation)

## Acceptance criteria

- [ ] Create → land in the new workspace with the switcher showing it selected
- [ ] Plan cards show the verified lineup/prices/limits; Hobby default
- [ ] 6th Hobby workspace shows the limit error inline without navigation

## Out of scope

- Payment/checkout; plan changes after creation (settings follow-up if Render capture shows one).
