Personal Project · AI-Native Design · Glance at News

Glance — A Calendar‑Axis News Dashboard Built with Claude Code

A two-day experiment in AI-assisted design. I built Glance, a working news dashboard in Next.js, by directing Claude Code with Figma MCP across five iteration rounds. This case documents the prompts, the rendered states I accepted, and where I had to override the code by hand.

Duration 2 days
Role Designer, Director, Developer-of-Record
Partners Claude Code (IC), Figma MCP (bridge)

Domain

Editorial Dashboard · News Aggregation · Bilingual Content

Deliverables

Working Next.js Prototype · Design System · 5-Round Iteration Log

Scope

Product Definition, UX/UI, Typography, Code Direction, QA

Timeline

Concept → v3.7 Final

Executive Narrative

Why I Built This

I built Glance because I was spending too much time every day checking news sites and losing attention inside feeds. There were still things I needed to know, but the process of finding them had become noisier than the information itself. Glance started as a way to reduce that cost: one place, a smaller surface, only the stories worth knowing. The six stories in the demo were a presentation device, not a product limit. In the actual model, Glance pulls up to three stories from each of six fixed sources, for a maximum of eighteen items. Those items are grouped into tabs by content category rather than by publication. That matters because source and topic do not map cleanly. A business outlet like CNBC will still carry political news, so the organizing logic has to follow the story, not the publisher.

Glance final v3.7 dashboard showing the full 1440px layout with sidebar lockup, bilingual filter bar, and six-publication card grid
The Challenge

Scope and Constraint

Most AI-assisted design stops at "it compiles." I wanted to push further: use Claude Code as a pairing engineer, not a generator, and document where that stops working. The editorial scope was narrow, which helped. Fixed sources, equal weight per story, terminal density. The self-imposed mandate: a working Next.js prototype in two days, with every ambiguous decision still mine.

The Solution

How the Work Was Split

Four roles, one loop. I write prompts that encode intent and constraint. Claude Code generates the Next.js and Tailwind implementation. Figma MCP returns the rendered state as a frame. I QA against reference spec, then sign off or write the next prompt. Keeping the four roles separate matters because each one needs different judgment, and collapsing them pushes the wrong decisions onto the wrong surface.

Collaboration & Constraints

Five Rounds in Two Days

I wrote prompts that encoded spec, not intent alone. "Lock source logo height to 16px with object-fit contain" instead of "make logos consistent." Figma MCP returned each rendered state as a frame, which made QA a visual comparison rather than a code review. The work AI couldn't own stayed mine: calendar baseline, toggle alignment, logo rhythm across six publications.

Round 1 (Dashboard). One prompt produced a working list layout with eight event-driven sources. I accepted it as a critique target. Round 2 (v2 Demo). I enlarged the sidebar and its type scale. News decays by the hour, so the time signals need to read first. Tabs got icons, the calendar got pagination, the header got taller. Round 3 (v3 Demo). Structural pivot to a 2×3 card grid. Six equal cards beat a ranked list when no algorithm is doing the ranking. The SOURCES list left the sidebar; badges already carried that signal. Round 4 (v3.3 Final). Source canon locked to six publications across politics, economy, and academia. Bilingual toggle added with independently generated summaries rather than machine translation. Calendar date-dot rule re-normalized. Round 5 (v3.7 Padding Unified). GLANCE lockup, 16px logo baseline, 24px padding across cards. The product started reading as an editor rather than a container.

Round 1 — Glance Dashboard initial prototype with single-column list, eight event-driven sources, and SOURCES chip list in the sidebar
Round 1 — Dashboard. One prompt, one working list. Eight event-driven sources, tinted row backgrounds, SOURCES chips in the sidebar. A critique target on screen.
Round 2 — v2 Demo with enlarged sidebar typography, Today section header, iconified tabs, and calendar pagination arrows
Round 2 — v2 Demo. Sidebar and its type scale get larger because news decays by the hour. Tabs iconified, calendar gets pagination arrows, header gets taller.
Round 3 — v3 Demo with the structural pivot from single-column list to a 2×3 card grid with pastel-tinted source backgrounds
Round 3 — v3 Demo. The structural pivot: one news per row becomes two per row in a 2×3 grid. The SOURCES list leaves the sidebar; badges already carry that signal.
Round 4 — v3.3 Hi-Fi Mockup Final with real publication logos, white cards with 1px borders, top-right WCAG AAA badges, and English/Chinese language toggle
Round 4 — v3.3 Final. Source canon locked to six publications. EN/ toggle lands. Real publication logos replace text labels; cards go white-on-white with 1px borders; the calendar date-dot vertical-shift bug gets fixed.
Round 5 — v3.7 Padding 24px Unified with GLANCE Lockup added to sidebar, source logos reduced to 16px baseline, and all card padding unified to 24px
Round 5 — v3.7 Padding Unified. GLANCE Lockup joins the sidebar top. Source logos reduce to 16px so six aspect ratios sit on one baseline. All card padding unifies to 24px. The product becomes an editor with its own voice.
Daily Use

What Transfers

Glance isn't shipped. It's a tab I open every morning, and the transferable output of the two days was the loop, not the product.

  • The workflow generalizes. Prompt → Claude Code → Figma MCP QA applies to any dashboard-shaped problem I'll work on next.
  • Prompt patterns became templates. "Lock element X to Y regardless of Z" is a reusable shape that I now reach for before describing intent.
  • Manual overrides mark the boundary. Where I had to leave the prompt and fix layout in Figma is the current line of what AI can deliver without a designer in the room.