Source-of-truth catalog for studio.chat's per-section copy variants. Variants
are chosen per section from the office at /office/copy; the public site
renders the selected variant (default = the live copy). Voice follows the
(untracked) docs/website/copy-guide.md guide — podcasts-led, dry, lowercase studio.chat,
ES as a parallel rewrite (never literal).
How it works
- Registry:
src/lib/copy/variants.ts— pages → sections → variants, plus each section's localenamespace+ basefields. - Store:
copy_variantstable (migration 0006).key=page.section,variant= chosen id. No row (ordefault) = the live copy. - Copy: lives in
locales/en.json+locales/es.json. The variant id doubles as the key suffix:default→ the base key (heroLine1),v1→heroLine1_v1,v2→heroLine1_v2. EN/ES key parity is build-enforced. - Manage:
/office/copy(administrator) — a preview card per variant with an EN/ES toggle; picking one applies it to the public site immediately.
Adding a variant
- Add
_vNkeys for the section'sfieldsto both locale files. - Add the variant
{ id: "vN", label: "vN · short name" }to the section in the registry. - New section/page → add a section entry (
namespace,fields,variants), wire the public page to readgetCopyVariant(key)+variantKey, and add the page's revalidate paths toCOPY_PAGE_PATHS.
Catalog
home — wired ✅
home.hero — heroLine1…heroLine4
- default — We craft experiences / in the form of social content, / short films, and live podcasts — / from concept to color and final mix. ES: Creamos experiencias / en forma de contenido social, / cortometrajes y podcasts en vivo — / del concepto al color y mezcla final.
- v1 · podcasts-led — Record the show. / Leave with the clips. / Live podcast production in Medellín — / multi-cam, clean audio, same-day cuts. ES: Graba el programa. / Sal con los clips. / Producción de podcasts en vivo en Medellín — / multicámara, audio limpio, cortes el mismo día.
- v2 · sharpened generalist — Make it look as good as it sounded. / Social content, short films, and live podcasts, / shot in Medellín — / concept to color, finished in-house. ES: Que se vea tan bien como sonó. / Contenido social, cortometrajes y podcasts en vivo, / grabados en Medellín — / del concepto al color, terminado en casa.
home.services — servicesIntro
- default — End-to-end production for brands, artists, and platforms. · ES: Producción integral para marcas, artistas y plataformas.
- v1 · studio day — The studio day that ends with a finished episode and a week of clips. · ES: El día de estudio que termina con un episodio listo y una semana de clips.
- v2 · record once — Record once. Feed the internet for a week. · ES: Graba una vez. Alimenta el internet por una semana.
home.cta — ctaTitle, ctaBody, ctaButton
- default — start a project / Tell us what you're making. We'll come back with a plan within two business days. / Get in touch · ES: comencemos / Cuéntanos qué estás creando… / Escríbenos
- v1 · book a session — book a session / Tell us about the show — format, hosts, episode count. We reply with a plan and a quote within two business days. / Book a session · ES: reserva una sesión / Cuéntanos del programa… / Reserva una sesión
- v2 · start with a pilot — start with a pilot / New show? Book a single pilot session and see the workflow before committing to a season. / Start with a pilot · ES: empieza con un piloto / ¿Programa nuevo?… / Empieza con un piloto
services — wired ✅
services.intro — intro
- default — What we offer end-to-end. Bookable as a single show, a season, or a kit-only rental.
- v1 · kit ladder — Everything we run, end-to-end. Book a single show, a full season, or just the gear.
- v2 · one room — Crew, studio, and kit under one roof. Take it as a single show, a season, or a rental.
podcasts — wired ✅
podcasts.hero — tagline, intro
- default — Conversational podcasts, shot like cinema. (+ the lounge-format intro paragraph)
- v1 · final_final_v3 — Your show, not a folder of
final_final_v3.mp4. (opens the intro on the dry truth — mismatched files and a sync headache) - v2 · long conversations — Long conversations, shot the way film is.
podcasts.cta — ctaTitle, ctaBody, ctaButton
- default — start a show / … / Get in touch
- v1 · book a session — book a session / … / Book a session
- v2 · bring the show — bring us the show / … / Book a session
The hero
taglinealso renders as the podcasts teaser on the /services hub, so the hub resolvespodcasts.herotoo — the teaser tracks the variant.
rentals — wired ✅
rentals.hero — tagline, intro
- default — A small shelf of the gear we shoot with.
- v1 · on purpose — A small shelf. On purpose.
- v2 · out on loan — The kit we shoot with, out on loan.
rentals.cta — ctaTitle, ctaBody, ctaButton
- default — request a quote / … / Request a quote
- v1 · ask about the shelf — ask about the shelf / … / Ask about the shelf
- v2 · check availability — check availability / … / Check availability
The hero
taglinealso renders as the rentals teaser on the /services hub.
contact — wired ✅
contact.intro — intro
- default — Tell us about your project. We respond within two business days.
- v1 · two-day turnaround — Tell us what you're making. We read every message and reply within two business days.
- v2 · a few details — A few details about the project go a long way. We reply within two business days.
contact.form — message, submit
- default — Tell us about it / Send message
- v1 · send the idea — What you have in mind / Send the idea
- v2 · the project — About the project / Send it over
The
messagelabel andsubmitbutton live in the clientContactForm; the server page resolves the variant and passes the strings in as props (the variants module is server-only).
faqs — wired ✅
faqs.intro — intro
- default — Quick answers to the questions we hear most.
- v1 · before the first email — The questions we get before the first email.
- v2 · what people ask — What people ask before they book a session.
EN shown above; the ES parallel for every variant lives in
locales/es.json(build-enforced key parity).
Candidate sections to wire next
- site (global) —
site.metaTitle,site.description. Alt: lowercase wordmark, podcasts-led description. Deferred: global metadata with no copy-tree node yet, plus brand-rendering rules (the intentional uppercase share title), so it needs a placement decision before wiring.
Left as-is (no variants planned): stills.tagline, all cinematography.*
(kept deliberately understated), footer.* (legal entity name),
rentalsCatalog.* / portal.* / errors.* (functional, not marketing).