The home page has had a striped box reading “Platform & methodology video, coming soon” since the day it shipped. The video is now recorded. And the copy around it read like it had been written by a model asked to sound confident: “Not just another slideshow-and-quiz course”, “You don’t memorize, you decode”.
This item swaps the placeholder for the real video and rewrites every section in the Instructor’s own voice. The structure stays exactly as it was: hero, Methodology, About the instructor, catalog, the same components, the same order.

Copy as a requirement
The Card set rules for the text rather than the text itself: write it modelled on mariomelo.com, use no em dashes, and avoid the constructions that give AI writing away (“not just X, but Y”, triplets of adjectives, a rhetorical question answered in the next line). The Instructor approved the result on the rendered page, next to the video, before anything was committed. The script of the video itself (hand-drawn illustrations, activities inspired by investigation games, “understand the why”) supplied most of the vocabulary, so the page and the video say the same thing.

Two of the rules can be checked by a machine, so they are. A test renders the page in en and in pt, strips the HEEx debug comments and refutes —. Another lists every msgid the item introduced and fails if any has no pt translation. The mix.exs aliases pin --no-fuzzy, so rewording a msgid loses its translation instead of inheriting a guess, and an empty msgstr passes everything except a Brazilian visitor’s eyes. Every one of the sixteen new strings was translated by hand.
The Methodology card used to promise a “priority ordering” activity that does not exist. It now names the four that do. In pt it uses names written for the home page (Complete as lacunas, Encontre a frase, Agrupe as cartas) through msgids of its own, so the "Word Match" entries the Studio and the Lessons use are untouched. Translating the type names across the platform is its own decision, made some other day.
The video that 404’d
The plan was to fix the Bunny video id in code and let VideoUrl.to_embed_url/2 assemble it against the configured library, the same path a Course’s Intro Video takes. It rendered a perfect iframe that showed Bunny’s “404”.
The id was right; the library was not. The introduction video lives in its own Bunny library, 722073, and BUNNY_LIBRARY_ID points at the one the Lesson videos live in. A bare id carries no library, so the assembly was always going to look in the wrong place.
flowchart LR
A["bare id
c75b47b1-…"] -->|"+ BUNNY_LIBRARY_ID"| B["embed/511443/c75b47b1-…"]
B --> X["404
not in that library"]
C["pinned URL
embed/722073/c75b47b1-…"] -->|"to_embed_url/1
(adds autoplay=false)"| D["iframe src"]
D -->|"referer learn.mariomelo.com"| OK["player"]
D -->|"referer localhost"| F["403
allowed-domains"]
style X fill:#fbe6e1,stroke:#b14333
style F fill:#fbe6e1,stroke:#b14333
style OK fill:#dce8dc,stroke:#5f7a5f
So the code now pins the full embed URL, library included, and still sends it through to_embed_url/1, which passes a full URL through and adds autoplay=false. One acceptance criterion went with it: “keep the placeholder when no Bunny library is configured” described a dependency that no longer exists, so the placeholder branch and its test were deleted rather than kept alive for a case that cannot happen.
Fixing the 404 uncovered a 403. Library 722073 only serves its player to the production domain, so from localhost Bunny shows its error page in the hero. That is the library doing its job. To see the real player, the browser check loaded the dev server as learn.mariomelo.com, with a Chromium host-resolver rule mapping the name to 127.0.0.1, so the referer was genuine rather than faked. That run produced the screenshot above.

Worth doing differently
The Card said “Bunny video ID” and gave only the id, which is how the item got as far as a rendered 404 before anyone noticed that the library mattered. Next time a video is handed over for a fixed place in the product, the Card could carry the embed URL Bunny’s dashboard shows, library included. Pasting that one string would have saved the detour.