Skip to main content

← Back to Journal

Shipping the studio site, week one

The studio site shipped its first eight PRDs in one week. The progression was tighter than I expected and the breakages were less interesting than I expected, which is its own lesson.1

PRDFocusHardest part
PRD-001Foundation, CSP, brand tokensCSP 'unsafe-inline' concession
PRD-002Hero, slogan, philosophy panelMid-merge hero copy rewrite
PRD-003Product widget gridStatus/priority ordering decision
PRD-004Build Log strip, newsletter formButtondown proxy via CF Pages Function
PRD-005Product sub-page template + VälkomnaTrailing-slash canonical form
PRD-006About page, legal anchorsFirst-person / studio voice boundary
PRD-007/my-next migration, route groupsStudio chrome exclusion by construction
PRD-008How We Build, dashboard tourScreenshot redaction bar
PRD-009Journal, MDX pipeline, RSSNo content until the entries existed

PRD-001 — Foundation. The CSP.

The Content Security Policy went on early because retrofitting one is worse than over-tightening one. I locked it down to the bone in next.config.ts and watched three things break. The Plausible script tag (later swapped — see the OpenPanel entry) needed script-src permission. The Google Fonts pre-connect hint needed connect-src. The third was Next.js inline-style emission for hydration boundaries — the policy needed style-src 'self' 'unsafe-inline' until I learned the nonce flow that lets 'unsafe-inline' go away. I'm still on 'unsafe-inline'. The lesson was that "tighten now, relax under signal" beats "relax now, tighten later." The relaxations are explicit; the laxities of the alternative would have been silent.

PRD-002 — Hero. The mid-flight rewrite.

The hero copy was wrong. I caught it three commits into the merge. Rather than ship the wrong copy and patch in PRD-002b, I rewrote the hero in flight and superseded the merge. The mechanism was a force-push to the feature branch after a fresh review round; the alternative — revert the merged commit and re-merge — produces a worse log. The lesson was editorial rather than technical: never ship a hero you'd rewrite tomorrow. If "tomorrow" arrives mid-merge, the merge is what gives.

PRD-005 — Trailing slashes, finally.

The URLs were a slash/no-slash patchwork inherited from the early scaffolding. Cloudflare Pages serves either form fine, which is the trap — internal hrefs, OG canonicals, and the sitemap can disagree silently. I picked trailing-slash, ran the migration (output: 'export' plus trailingSlash: true in the config; sitemap rewrite; canonical update across every page; one redirect rule per orphan path), and locked the contract in ADR-004 §4. A test now asserts no /path form survives in source. The lesson was the cost of deferred URL decisions: every page that shipped without a canonical contract was a page I had to revisit.

PRD-007 — /my-next migration. Route groups.

The legacy mynextstudio.com content (privacy, terms, support, the existing app info pages) had to move under /my-next/* without breaking the iOS apps' hard-coded links. The site's studio surfaces — landing, about, journal, how-we-build — needed to live under their own layout. Two route groups solved both: (studio) for studio chrome and (my-next) for legacy chrome, siblings under app/, both flat. ADR-005 records the choice; nesting was the alternative I rejected because layout inheritance gets weird at the boundary.

PRD-008 — /how-we-build/. The dashboard tour.

This is the page that exists because every other page on the site claims I work with a multi-agent dashboard and moves on. Putting a real tour up — workflow loop, PRD lifecycle, screenshots, open-source CTA — was the page I wanted before the visitor got to the Journal. PRD-009's seed entry on the dashboard's origin is the prose companion to PRD-008's screenshots.

PRD-009 — Journal. This entry.

The five seed entries are this one and the four before it in the index. The pipeline is MDX in src/content/journal/, RSS at /journal/rss.xml, and a homepage Build Log strip that auto-feeds from the same source. The newsletter has a real source for the first time.

The architecture-note bit. What I cut from v1.

No tags. No comments. No search. No pagination. No per-entry OG image generation. No JSON-LD. No author attribution beyond "the studio." Each one was deferred for the same reason: ship the smallest credible surface, revisit on signal, not on speculation. The deferred features are tracked in docs/project-state.md under the right backlog rows; nothing is forgotten, nothing is half-built.

A week's work. Five PRDs of breakage, four of cleanup, one of restraint. The site is live; the dashboard that runs the studio runs the site too.

Footnotes

  1. Eight PRDs includes the foundation scaffolding (PRD-001) which shipped before the clock started on the "one week" framing. The seven content PRDs (PRD-002 through PRD-008) fit inside a single wall-clock week; PRD-001 was the work week before.