Docs.

Copy variants — catalog

website/copy-variants.md

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 locale namespace + base fields.
  • Store: copy_variants table (migration 0006). key = page.section, variant = chosen id. No row (or default) = 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), v1heroLine1_v1, v2heroLine1_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

  1. Add _vN keys for the section's fields to both locale files.
  2. Add the variant { id: "vN", label: "vN · short name" } to the section in the registry.
  3. New section/page → add a section entry (namespace, fields, variants), wire the public page to read getCopyVariant(key) + variantKey, and add the page's revalidate paths to COPY_PAGE_PATHS.

Catalog

home — wired ✅

home.hero — heroLine1heroLine4

  • defaultWe 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-ledRecord 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 generalistMake 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

  • defaultEnd-to-end production for brands, artists, and platforms. · ES: Producción integral para marcas, artistas y plataformas.
  • v1 · studio dayThe 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 onceRecord once. Feed the internet for a week. · ES: Graba una vez. Alimenta el internet por una semana.

home.cta — ctaTitle, ctaBody, ctaButton

  • defaultstart 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 sessionbook 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 pilotstart 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

  • defaultWhat we offer end-to-end. Bookable as a single show, a season, or a kit-only rental.
  • v1 · kit ladderEverything we run, end-to-end. Book a single show, a full season, or just the gear.
  • v2 · one roomCrew, studio, and kit under one roof. Take it as a single show, a season, or a rental.

podcasts — wired ✅

podcasts.hero — tagline, intro

  • defaultConversational podcasts, shot like cinema. (+ the lounge-format intro paragraph)
  • v1 · final_final_v3Your show, not a folder of final_final_v3.mp4. (opens the intro on the dry truth — mismatched files and a sync headache)
  • v2 · long conversationsLong conversations, shot the way film is.

podcasts.cta — ctaTitle, ctaBody, ctaButton

  • defaultstart a show / … / Get in touch
  • v1 · book a sessionbook a session / … / Book a session
  • v2 · bring the showbring us the show / … / Book a session

The hero tagline also renders as the podcasts teaser on the /services hub, so the hub resolves podcasts.hero too — the teaser tracks the variant.

rentals — wired ✅

rentals.hero — tagline, intro

  • defaultA small shelf of the gear we shoot with.
  • v1 · on purposeA small shelf. On purpose.
  • v2 · out on loanThe kit we shoot with, out on loan.

rentals.cta — ctaTitle, ctaBody, ctaButton

  • defaultrequest a quote / … / Request a quote
  • v1 · ask about the shelfask about the shelf / … / Ask about the shelf
  • v2 · check availabilitycheck availability / … / Check availability

The hero tagline also renders as the rentals teaser on the /services hub.

contact — wired ✅

contact.intro — intro

  • defaultTell us about your project. We respond within two business days.
  • v1 · two-day turnaroundTell us what you're making. We read every message and reply within two business days.
  • v2 · a few detailsA few details about the project go a long way. We reply within two business days.

contact.form — message, submit

  • defaultTell us about it / Send message
  • v1 · send the ideaWhat you have in mind / Send the idea
  • v2 · the projectAbout the project / Send it over

The message label and submit button live in the client ContactForm; the server page resolves the variant and passes the strings in as props (the variants module is server-only).

faqs — wired ✅

faqs.intro — intro

  • defaultQuick answers to the questions we hear most.
  • v1 · before the first emailThe questions we get before the first email.
  • v2 · what people askWhat 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).