← All case studies
Case Study 04 Personal Platform · AI-Native Rebuild

Phoenix

Rebuilding my personal site from a static Hugo blog into a living, AI-powered platform — and redesigning the whole thing with AI along the way.

How a folder of Markdown and hand-tuned templates became a Next.js 16 app with React Server Components, three AI providers each doing one job, and a standing place to run whatever experiment I want next — plus what has shipped on it since.

Role
Designer & sole engineer
Project
xinjiangshao.com · full rebuild
Timeline
Aug 2025 – present
Migration
Hugo (static) → Next.js (dynamic)
Stack
Next.js · React · TypeScript · Firebase
static → AI
from a build-time blog
to a live, dynamic app
3 AI providers
Claude chat · Gemini summaries
OpenAI narration
EN · 中文
full localization from
one content pipeline
80+ PRs
merged since this case study
first went up in July 2026
01 — Context

A static site that had run out of room.

For nine years xinjiangshao.com was a static site: a Jekyll blog from 2016, then Hugo from 2017. Markdown files, hand-tuned templates, and a build step that spat out flat HTML. It was fast, cheap, and easy to reason about — exactly what a static generator promises.

But every idea I had bumped into the same wall. Anything dynamic — a chat that knew my writing, audio narration of a post, live data, a small app I wanted to try — was either impossible or a hack bolted onto a system that was never meant to do it. The blog was frozen at build time, and I wanted a place that could respond.

02 — Ten years of the homepage

From a Jekyll blog to a platform.

The Internet Archive has saved 37 distinct copies of the homepage since February 2016. Read in order, they show the site moving from who I am to what I’ve built, and each rewrite changing what the <title> tag said about my job.

  1. The 2016 homepage: a full-screen photo of a desk with a laptop, iPad and keyboard, with the title Xinjiang’s Stuff and the tagline Web Developer, App Developer, and Much More
    Feb 2016 · Jekyll
    2016
    A Jekyll blog

    Kasper theme, a full-bleed photo of my desk, and five posts below the fold. Four of them are still on the site.

    Xinjiang's Stuff - Web Developer, App Developer, and Much More
  2. The 2017 homepage: a dark page with a round photo, a one-sentence introduction, an email address, a PGP key fingerprint, social icons and links to Projects, Reading List and Résumé
    Sep 2017 · Hugo 0.17
    2017
    The contact card

    Rebuilt on Hugo as one dark screen: a photo, one sentence about my job at Peapod, an email address, a PGP key and three links.

    Xinjiang's Stuff - Xinjiang Shao is a Full Stack Developer in Chicago @soleoshao
  3. The 2020 homepage: the same dark layout and photo, with a longer introduction naming Peapod Digital Labs
    Oct 2020 · Hugo 0.75
    2020
    A personality

    Same frame, more voice: Senior Software Engineer at Peapod Digital Labs, and the first mention of wanting to be a chef.

    Xinjiang Shao - Xinjiang Shao is a Senior Software Enigneer living in Chicago, IL
  4. The 2022 homepage on the PaperMod theme: a light page with a top menu, a name and one line of description. The avatar did not survive in the archive and shows as alt text.
    Apr 2022 · PaperMod (the avatar wasn’t archived)
    2022
    The blog takes over

    An off-the-shelf theme, PaperMod. The homepage shrank to a name and a sentence, and the menu did the work: posts, tags, search, then photography and a newsletter.

    Xinjiang Shao
  5. The 2024 homepage: an illustrated avatar, the tagline Software engineer by day, aspiring chef by night, social icons and Tags, Slides and Newsletter buttons
    Oct 2024 · the last Hugo year
    2023–25
    Bilingual, with a tagline

    A Zh link, a Talk page, and the chef as the headline. The title tag went from Software Engineer to Lead Software Engineer.

    Xinjiang Shao - Lead Software Engineer
  6. The October 2025 homepage: an illustrated avatar, Xinjiang Shao in handwriting, the tagline Software engineer by day, aspiring chef by night, and a menu with Blog, Talk, Podcast, Photography, Search, Tool and About
    Oct 2025 · Next.js 15, rebuilt from git
    Oct 2025
    Phoenix launches

    The Next.js homepage became a portfolio, with demos, testimonials, a floating chat and the latest post. Its content lived only in the JavaScript payload, so the archive replays it as a blank page. This screenshot comes from running that commit locally.

    Xinjiang Shao - Principal Software Engineer
  7. The February 2026 homepage’s Proven Track Record band: 14+ years of experience, team scaling from 5 to 20+, 10+ products shipped and green Core Web Vitals
    Feb 2026 · Next.js 16, rebuilt from git
    2026
    Proof, names, positions

    January added numbers, April retired the chef tagline, July named the brands, and October led with scope and four positions I’ll defend.

    Xinjiang Shao | Principal Software Engineer
  8. Today’s homepage: a serif headline reading I build healthcare platforms that can’t afford to fail and grow the teams behind them
    Nov 2026 · Next.js
    Now
    The editorial site

    One paper-and-ink design across every page, case studies and product pages, rendered on the server.

    Xinjiang Shao — Principal Engineer, Healthcare Platforms
03 — The challenge

Rebuild it live — without losing what already worked.

Project Phoenix was a full rebuild, done solo. The static site was legitimately good, so the migration had a high bar: keep everything that made it fast and durable, and add everything a dynamic, AI-native platform makes possible. Four constraints shaped it:

01
Keep the content, drop the format
Years of Markdown posts had to carry over losslessly — now as MDX, with the URLs and reading experience intact.
02
Dynamic without paying for it
Server Components keep pages fast and cheap by default; interactivity is opt-in, not the baseline tax.
03
AI as a first-class citizen
Chat, summaries, audio, and translation had to be built into the platform — not stapled on as widgets.
04
A standing lab
Whatever I want to try next — a dashboard, a visualization, a tool — should have a home instead of a new repo.
04 — Approach

An AI-native Next.js platform.

The new site is Next.js 16 on the App Router with React Server Components as the default — content renders on the server and streams to the client, so most pages stay as lean as the old static ones. Interactivity is added deliberately, only where it earns its weight.

The AI layer is the part that couldn't exist before. Claude, Gemini, and OpenAI each do the job they're best at: Claude runs the chat through the Vercel AI SDK, with an MCP client that lets it reach live tools at request time; Gemini writes post summaries; OpenAI narrates posts and transcribes the audio into subtitles. Firebase handles auth, data, and hosting, so the whole thing runs as one deployable app.

05 — Architecture

How the pieces fit.

Client on top, Next.js in the middle rendering and routing, an AI orchestration layer fanning out to models and tools, and Firebase holding content and state.

Phoenix — system architectureclient → app → AI + services → data
Client
Web (RSC)streamed
Floating Chatalways-on
i18nEN · 中文
Dark / Lightsystem-aware
Apps & Toolsinteractive
▼
Phoenix · Next.js 16 App Router
React 19 Server Components · streaming · API routes · next-intl · TanStack Query · Firebase App Hosting
▼
AI orchestration & services
Vercel AI SDKchat streaming
Claudechat · tools
OpenAITTS · Whisper
Geminisummaries
MCP toolsStreamable HTTP
AuthGoogle OAuth
▼
Data & content
Firestoreuser data
Storagemedia
MDX Contentblog · talks
Sentrymonitoring
06 — What I shipped

The capabilities the old site couldn't have.

Conversational search

An AI chat that knows my blog, talks, and background — grounded in site content, extensible through MCP tools.

Listen to any post

OpenAI text-to-speech narrates articles, with a synced player that highlights the paragraph being read.

AI summaries

Gemini condenses a long read into a few bullets in the sidebar — a 3-minute take on a 15-minute article.

Bilingual by design

Full English / 中文 localization through next-intl, with hreflang and canonicals for each language.

Interactive apps

Tesla dashboard, Life in Weeks, a Technology Radar and a data story — real apps living inside the site, not screenshots.

Tested & monitored

Vitest units, Playwright E2E for a11y, i18n and SEO, Sentry in production — quality treated as a contract.

07 — Redesigned with AI

The redesign, done with AI as the co-designer.

The rebuild wasn't just an engineering migration — it was a visual reset. I used AI tools throughout to explore layouts, generate an atomic component system, tune tokens, and pair-program the implementation. What would have been a months-long solo rebuild happened in a fraction of the time, and the design got more exploration, not less.

Hugo templates
Design system
Atomic components and design tokens, drafted and refined with AI.
static HTML →
RSC
Server Components stream content instead of freezing it at build.
solo rebuild
weeks
AI pair-programming compressed a multi-month job into weeks.
one language
EN · 中文
Full localization from a single content pipeline via next-intl.
The migration wasn't the point — the capability was. I didn't want a faster blog. I wanted a site that could do things, and a way to keep adding to it.
— On why Phoenix earned its name
08 — Experiments unlocked

The site is now a place to try things.

The real payoff of going dynamic is optionality. Ideas that were impossible on a static generator are now a weekend project — the platform is the sandbox, and each new experiment ships to the same live site.

AI features on tap

New models and prompts plug into one SDK — trying a new provider is a config change, not a rebuild.

Live data apps

OAuth-gated dashboards like the Tesla monitor pull real-time data — something static hosting simply can't.

Data stories

The Average American follows the median household from 2008 to 2026, with sources on every chart.

Feature flags

Progressive rollouts let me ship an experiment to myself first, then widen it — no branching deploys.

MCP tool servers

Remote MCP over Streamable HTTP means the chat can gain new abilities without touching the app.

Data visualization

Recharts and D3 turn ideas like Life in Weeks into interactive pieces instead of static images.

09 — Since launch

The platform kept moving after the migration.

The rebuild started in August 2025. Everything below shipped on the same platform afterwards, most of it as small pull requests: more than 80 have been merged since this case study first went up in July 2026.

Sep 2025
Live data and the first AI tools
A Tesla dashboard behind OAuth, the Technology Radar, a D3 view of what the blog covers, related posts, and a Claude chat that calls an MCP server about my work.
Nov 2025
Next.js 16 and feature flags
Upgraded to Next.js 16 and put AI search behind LaunchDarkly flags, so a new AI feature reaches me before it reaches anyone else.
Jan 2026
Speed, reach and two languages
Tailwind 4, image resizing on Cloud Run and a Core Web Vitals pass; then every main page in Chinese, bilingual sitemaps, structured data, breadcrumbs, a newsletter, and staging behind Google sign-in.
Jun 2026
One design system, more to read
Every page moved to a single design system. Then came the case studies, podcast episode pages, and MDX for every post.
Oct 2026
The editorial redesign and 2.0
The header, footer, demos and archive moved to the editorial paper style, released as version 2.0. New on top: the Average American data story and product pages for Tinycap and bogyman.
Nov 2026
Built to be found and measured
Pages render on the server, with a CI check that the HTML carries the content. Every page has a generated share image, analytics load through Partytown, the résumé PDF builds from LaTeX in CI, and the chat moved to Claude Sonnet 5.5 when Sonnet 4 retired. A performance pass took PageSpeed to 99 on mobile and 100 on desktop.

Not everything stayed. The JSON linter, Markdown preview and translator were retired in November 2026. Unpublished drafts moved out of the public folder, so nothing is reachable before it's ready.

A performance pass, November 2026. A PageSpeed run that morning scored the homepage 80 on desktop, held back by 460 ms of blocking time. A CPU profile mapped back to source found most of it in a syntax highlighter registering about 300 languages on every page, pulled in through a shared component index for a component nothing rendered. Three pull requests later: that dead code is gone, English pages no longer load a Chinese web font's CSS, Sentry Replay loads after the page goes idle, and Firebase Auth loads only on the pages that sign people in.

99
mobile performance
Moto G Power · slow 4G
80→100
desktop performance,
same day
460→70
total blocking time,
ms, desktop
100
accessibility, best
practices and SEO
PageSpeed Insights for xinjiangshao.com on mobile: 99 performance and 100 for accessibility, best practices and SEO, with first and largest contentful paint at 1.4 s, 120 ms total blocking time, no layout shift and a 1.4 s speed index
PageSpeed Insights, mobile, Nov 8 2026 · full report
10 — Reflection

Build the platform, not the page.

The temptation with a personal site is to keep polishing the page in front of you. Phoenix worked because I stopped optimizing the artifact and started building the substrate — a platform where the next idea already has a home, a data layer, and an AI layer waiting for it.

The other lesson was about pace. Doing this solo would once have meant scoping down hard. With AI as a co-designer and pair programmer, the constraint flipped: the bottleneck became deciding what to build, not finding time to build it. That's the whole reason the site exists now — to keep answering that question.

A year on, the third lesson is that a platform needs pruning as much as building. What I take away is part of what I ship.

Built with
Case studies

Curious what I'd build for you?

Get in touch →