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
| PRD | Focus | Hardest part |
|---|---|---|
| PRD-001 | Foundation, CSP, brand tokens | CSP 'unsafe-inline' concession |
| PRD-002 | Hero, slogan, philosophy panel | Mid-merge hero copy rewrite |
| PRD-003 | Product widget grid | Status/priority ordering decision |
| PRD-004 | Build Log strip, newsletter form | Buttondown proxy via CF Pages Function |
| PRD-005 | Product sub-page template + Välkomna | Trailing-slash canonical form |
| PRD-006 | About page, legal anchors | First-person / studio voice boundary |
| PRD-007 | /my-next migration, route groups | Studio chrome exclusion by construction |
| PRD-008 | How We Build, dashboard tour | Screenshot redaction bar |
| PRD-009 | Journal, MDX pipeline, RSS | No 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
-
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. ↩