An end-to-end build of C Spire's internal AI Microsite — a Stories, Learn, Marketplace, Events, Governance, and Submit-for-Review hub for ~3,000 employees. Designed in Claude Design, built with Claude Code. This is the record of how it came together.
A single design canvas, every surface side-by-side, every variation co-located. Nine phases from discovery to handoff — design system, page-level artboards, mobile parity, role-gated authoring, and the architecture docs that made Claude Code's job nearly mechanical.
Aligned on audience, the six surfaces, and the one write path — Submit-for-Review. Tone set before pixels: internal, editorial, terminal accent, no marketing tropes.
Single visual contract for every downstream artboard. Hairline borders, mono labels for metadata, Work Sans + IBM Plex Mono + Georgia italic for editorial accent. No emoji.
Each surface as a self-contained DCArtboard on one scroll. Home · Stories · Learn · Marketplace · Events · Governance. Variations live as siblings, not separate files.
Every desktop artboard paired with a 390-wide mobile sibling. Same vocabulary, different rhythm — tab bar instead of top nav, 9:16 hero reel, denser metadata.
Five-step wizard: Idea → Data → Risk → Review → Submitted. Risk tiers (Light · Standard · Elevated · High) decide which reviewers (CoE · InfoSec · Privacy · Legal) get tagged.
Role-gated authoring for what the committee is the authority on: policies, Learn library, Story curation, vendor Marketplace entries. Demoted out of the wizard.
Compared DynamoDB · S3 JSON · RDS Postgres for the one missing backend: submissions. Chose DynamoDB on-demand with S3 attachments. Adapter pattern keeps it swappable.
Reworked around two clients (employee + committee editor), three Next.js surfaces, and two backends (Sanity + AWS). Added publish webhook so on-demand revalidate is explicit.
Bundled inputs, decisions, and the opening prompt. The artboards become a real Next.js codebase under Claude Code — design + architecture locked, build job begins.
The design system was locked in before any page-level work — so every downstream artboard could reuse the same tokens, the same icons, the same mono labels. The result is the dense editorial feel of internal tooling that actually respects its users.
Type weight does the work. Hairline borders, generous whitespace, mono labels carry every ID, timestamp, and status code — never body copy.
The whole microsite lives on a single canvas. Home, Stories, Learn, Marketplace, Events, Governance, Submit wizard, Editor — comparable side-by-side. Filter rails, hero reels, status pills, and mono ID stamps repeat across every artboard, so the system reads as one piece of software.
Adaptive video reel — 16:9 on desktop, 9:16 on mobile. Autoplay muted with poster fallback for mobile data.
Live counters above the fold — stories shipped, weekly views, active builders. Pulled from Sanity, not vanity.
AI news strip — outside signal alongside internal stories. Source filter chips, time-window tabs.
Calendar + recordings. Town halls, training sessions, partner demos. Recording submission stays public.
The Submit-for-Review wizard is the only write path on the public site. Five steps — Idea → Data → Risk → Review → Submitted. The risk tier you pick decides which reviewers (CoE · InfoSec · Privacy · Legal) get auto-tagged. Form primitives factor out so the Editor surface reuses them.
Submissions go to DynamoDB, not Sanity. Editorial content stays in Sanity. The two pipelines meet — visually — in the Marketplace.
Every desktop artboard has a 390-wide mobile sibling sitting next to it in the same DCSection. Tab bar instead of top nav. 9:16 hero reel. Denser metadata. 44px minimum hit target. Same components, different rhythm.
Editor authoring stays desktop-first. Mobile is for triage, not authoring.
Tech architecture v2 added Sanity as the CMS for editorial content alongside the existing AWS submissions store.
Reworked around two clients (employee + committee editor), three Next.js surfaces (/ · /studio · /api/*), and two backends. Publish webhooks make on-demand revalidate explicit.
The artboards become a real Next.js codebase. The implementation plan locks in every architectural decision before the first commit — stack, schemas, milestone ladder, env vars, risk register. Claude Code's job is to build, not to redesign.
The first message into Claude Code is the entire reason this build doesn't drift. It pins the stack, lists the constraints, and names what Claude Code is not allowed to reinvent: tokens, icon set, state lib, marketplace CTA copy. M1 ships in a day because nothing is up for debate.
Lift, don't reinvent. The 22 design-canvas JSX files become ES module exports — inline-style theme system preserved.
// First message to Claude Code We are implementing the AI Microsite for C Spire's internal AI Center of Excellence. Design and architecture are already done — your job is to build, not redesign. Read first, in order: 1. IMPLEMENTATION_PLAN.md 2. Tech Architecture v2.html 3. PROJECT_MEMORY.md 4. design-tokens.jsx 5. extracted/_inline_app.jsx Stack (locked): · Next.js 14 App Router on Vercel · Sanity Growth · production + staging · DynamoDB on-demand + S3 · Cloudflare DNS · ai.cspire.com · Magic-link via Resend Honor these: · Visual tokens come from design-tokens.jsx · Marketplace CTA is "+ SUBMIT" · No SSO on public site (v1) · Wizard schema is the API contract Do not add filler content. Do not invent new colors. Do not introduce a new state lib, icon set, or UI kit. First milestone: scaffold + tokens + nav.
Ordered so the first usable thing lands fast. Each milestone is its own commit and PR. Public Home reads from Sanity by M3 — three milestones in. Submit wizard ships by M5. Mobile + Editor at M7. Production cutover at M8.
Next.js 14 App Router on Vercel. Tokens lifted from design-tokens.jsx. Self-hosted fonts. Layout + nav rendering Onyx + Work Sans + IBM Plex Mono.
Studio embedded at /studio. Story · Policy · LearnEntry · MarketplaceItem · Event · NewsItem · SiteSettings · Person. Seed script drains inline canvas data into staging.
Public Home renders from Sanity. Stories library + detail. ISR 60s. First milestone where it starts to feel real.
Studio publish → page update in <10s, granular per-document tagging.
Magic-link via Resend. 5-step wizard. Zod validation. POST → DynamoDB + pre-signed S3. SUB-2026-NNNN display IDs.
Learn · Marketplace · Events · Governance · AI Wire archive. Marketplace shows both Sanity vendor items and approved DynamoDB submissions.
Mobile compositions wired with responsive switch. Search + Menu overlays. Editor role-gated, committee writes to Sanity.
Sentry. Structured logs. CSP + HSTS + referrer policy. Pen-test the magic-link flow. Cloudflare DNS cutover.
README · RUNBOOK · PROJECT_MEMORY refresh · Playbook Phase 09 next-rev capture.
A complete design system, 30+ artboards across desktop and mobile, a Tech Architecture v2 doc that survived security review, and an implementation plan dense enough that the first M1 commit was almost mechanical.
One canvas, every surface co-located. Trivial to spot inconsistency.
Design tokens locked Day 2 — every later artboard reused them.
Decisions logged inline (PROJECT_MEMORY) — no orphan choices.
22 JSX files lifted into Next.js with no rewrite. Inline styles held.
Implementation plan included the opening prompt — Claude Code didn't drift.
Accent color drifted between memory and tokens — single canonical source first.
Brand assets blocked M1 by a beat. Lock logo + SPF/DKIM before discovery ends.
Editor mobile parity creep — write the cut into the plan, not discover it mid-M7.
Design canvas → implementation plan → opening prompt → milestone ladder. Four artifacts, in that order, before the first commit. The plan absorbs the open questions so the build doesn't have to.
This site was built using Claude Code AI, Figma and Figma MCP Server.