// Academy lesson content. Each slide has: // scene: [builderName, props] — rendered by the scene library in academy.js // transcript: what the captions show (normal spelling) // tts: what the narrator actually says — only present when pronunciation, numbers, or // symbols need respelling for speech (Maillard -> "my-YARD", 8:30 -> "eight thirty", // °C -> "degrees Celsius"). The captions never show these respellings. // Audio files are pre-generated to /academy-audio/.mp3 by // scripts/generate-academy-audio.mjs and committed, so the app never needs a TTS key. // Slide ids are stable — renaming one orphans its committed audio. export const ACADEMY_TRACKS = [ { key: "roasting", name: "Roasting", blurb: "One continuous journey — a green seed to a finished roast, with the physics at every step.", lessons: [ { id: "roast-journey", title: "The roast, start to finish", minutes: 9, slides: [ { id: "gb-seed", title: "A seed, not a bean", scene: ["beanAnatomy", {}], transcript: "Coffee isn't a bean at all — it's the seed of a cherry. Under the papery silverskin sits a dense block of cellulose, packed with everything the seed saved up to grow a tree: sugars, acids, proteins, and about eleven percent water.", }, { id: "gb-composition", title: "What's inside", scene: ["composition", {}], transcript: "Roughly half the seed is cell-wall cellulose — the scaffolding. The rest is the flavor pantry: sucrose, chlorogenic acids, amino acids, lipids, and trapped water. Roasting is just chemistry applied to this pantry, in a particular order.", tts: "Roughly half the seed is cell wall cellulose — the scaffolding. The rest is the flavor pantry: sucrose, chloro-JEN-ick acids, amino acids, lipids, and trapped water. Roasting is just chemistry applied to this pantry, in a particular order.", }, { id: "rj-charge", title: "Charge, and the turning point", scene: ["charge", {}], transcript: "Drop cold beans into a hot drum and the probe plunges — it's reading the beans, not the air. Where the falling line bottoms out and turns is the turning point. How deep and how late it lands is your machine's thermal fingerprint — this app learns it from your logs.", }, { id: "rj-drying", title: "Drying — boiling water uphill", scene: ["steam", {}], transcript: "For the first minutes the bean mostly sweats. Evaporating water soaks up enormous energy, so temperature climbs stubbornly while the bean fades from green to yellow — grass, then hay, then bread. Drying earns forty-three to fifty-one percent of the whole roast. Rush it, and the surface races ahead of a steamy centre.", tts: "For the first minutes the bean mostly sweats. Evaporating water soaks up enormous energy, so temperature climbs stubbornly while the bean fades from green to yellow — grass, then hay, then bread. Drying earns forty three to fifty one percent of the whole roast. Rush it, and the surface races ahead of a steamy centre.", }, { id: "rj-maillard", title: "Yellow to brown — Maillard", scene: ["maillard", {}], transcript: "Around 150 degrees Celsius, amino acids and sugars begin the Maillard reaction — the chemistry that browns bread and seared steak. Hundreds of aroma compounds appear, steam and carbon dioxide swell the bean, and the silverskin flakes off as chaff. Brisk keeps sparkle; slow builds body and sweetness.", tts: "Around one hundred fifty degrees Celsius, amino acids and sugars begin the my-YARD reaction — the chemistry that browns bread and seared steak. Hundreds of aroma compounds appear, steam and carbon dioxide swell the bean, and the silverskin flakes off as chaff. Brisk keeps sparkle; slow builds body and sweetness.", }, { id: "rj-crack", title: "First crack", scene: ["crack", { phase: "during" }], transcript: "By now each bean is a tiny pressure cooker, several atmospheres of steam pushing outward. Around 196 degrees Celsius the cell walls fail and the bean audibly pops. The crack releases heat — so the gentle heat cut had to happen a minute before, not after. Get ahead of the exotherm; never chase it.", tts: "By now each bean is a tiny pressure cooker, several atmospheres of steam pushing outward. Around one hundred ninety six degrees Celsius the cell walls fail and the bean audibly pops. The crack releases heat — so the gentle heat cut had to happen a minute before, not after. Get ahead of the exo-therm; never chase it.", }, { id: "rj-development", title: "Development — the strongest lever", scene: ["dtr", {}], transcript: "Everything after first crack is development: harsh chlorogenic acids break down, sugars caramelize, body builds. Its share of the roast — the development time ratio — is the strongest single lever on the cup. This worksheet targets twelve to twenty percent: under it reads sharp and grassy, far over it goes flat and roasty.", tts: "Everything after first crack is development: harsh chloro-JEN-ick acids break down, sugars caramelize, body builds. Its share of the roast — the development time ratio — is the strongest single lever on the cup. This worksheet targets twelve to twenty percent: under it reads sharp and grassy, far over it goes flat and roasty.", }, { id: "rj-drop", title: "The drop, and the honest number", scene: ["weightLoss", {}], transcript: "Drop and cool fast — carryover heat keeps roasting for another half minute. Then weigh: weight loss rolls time, temperature, and development into one number a kitchen scale can verify. A light roast loses eleven to thirteen percent.", }, { id: "rj-curve", title: "Reading the curve", scene: ["curve", { shape: "smooth", focus: "all" }], transcript: "The whole story fits one chart: temperature dips to the turning point, climbs through drying and Maillard, cracks, and lands at the drop. Its slope — the rate of rise — should fall steadily and never stop falling. The temperature says where you are; the slope says where you're headed.", tts: "The whole story fits one chart: temperature dips to the turning point, climbs through drying and my-YARD, cracks, and lands at the drop. Its slope — the rate of rise — should fall steadily and never stop falling. The temperature says where you are; the slope says where you're headed.", }, { id: "rj-ror", title: "Crash, flick, and stall", scene: ["ror", { shape: "crash" }], transcript: "Cut heat too late and the exotherm crashes the rate of rise, then it flicks back up — a crash bakes out sweetness, a flick tastes roasty. Flatten to zero and the bean just sits there, baking. All three are fixed the same way: smaller, earlier moves, upstream of the crack.", tts: "Cut heat too late and the exo-therm crashes the rate of rise, then it flicks back up — a crash bakes out sweetness, a flick tastes roasty. Flatten to zero and the bean just sits there, baking. All three are fixed the same way: smaller, earlier moves, upstream of the crack.", }, { id: "rj-onechange", title: "Taste, then change one thing", scene: ["oneChange", {}], transcript: "Papery and thin? First crack came too fast — add thirty seconds. Savory with the florals gone? Too slow — take thirty off. Sharp acidity? Development plus fifteen. Change exactly one variable per batch, write it down, and let the next roast prove it. That note is what this app carries into your next plan.", }, ], }, ], }, { key: "brewing", name: "Brewing", blurb: "Extraction physics first, then the technique for every brewer you own.", lessons: [ { id: "extraction", title: "Extraction — the physics of a cup", minutes: 5, slides: [ { id: "ex-dissolve", title: "Coffee is a solution", scene: ["dissolve", {}], transcript: "Brewing is controlled dissolving. Hot water pulls soluble material out of ground coffee in a fixed order: bright fruit acids leave first, then sweet caramels and sugars, and finally the heavy bitter compounds. Every brew method is just a different way of deciding when to stop.", }, { id: "ex-yield", title: "Strength and extraction", scene: ["yieldMap", {}], transcript: "Two numbers describe any cup. Strength is how much dissolved coffee is in the water. Extraction is how much of the grounds you dissolved — sweetness peaks around eighteen to twenty-two percent. Under-extracted is sour and thin; over-extracted is bitter and drying.", }, { id: "ex-grind", title: "Grind is surface area", scene: ["grind", {}], transcript: "Grinding finer doesn't make coffee stronger by magic — it exposes more surface, so water extracts faster. Finer also slows the water down through the bed. Grind size is therefore your master dial: it moves extraction and contact time at once.", }, { id: "ex-temp-time", title: "Temperature, time, ratio", scene: ["tempTime", {}], transcript: "Hotter water extracts faster — 90 to 96 degrees Celsius suits most light roasts. Time decides how far along the dissolving order you travel. And the brew ratio — one part coffee to fifteen to seventeen parts water for filter — sets the canvas everything lands on.", tts: "Hotter water extracts faster — ninety to ninety six degrees Celsius suits most light roasts. Time decides how far along the dissolving order you travel. And the brew ratio — one part coffee to fifteen to seventeen parts water for filter — sets the canvas everything lands on.", }, { id: "ex-taste", title: "Taste, then move one dial", scene: ["tasteDial", {}], transcript: "Sour, sharp, salty? Extract more: grind finer, brew hotter, or longer. Bitter, drying, hollow? Extract less: coarser, cooler, shorter. Log every brew with its recipe and rating — the same one-change discipline as roasting.", }, ], }, { id: "immersion", title: "Immersion — steep and separate", minutes: 5, slides: [ { id: "im-principle", title: "The principle", scene: ["brewAnim", { method: "french-press", mode: "steep" }], transcript: "Immersion is the simplest physics in coffee: all the water meets all the grounds for the whole brew. Extraction is even and forgiving because nothing channels — time and temperature do all the work. The trade: less clarity, more body.", }, { id: "im-frenchpress", title: "French press", scene: ["brewAnim", { method: "french-press", mode: "plunge" }], transcript: "Coarse grind, one to fifteen, four minutes. Then the trick most people miss: don't plunge hard — break the crust, skim the foam, and press just below the surface. Pouring gently keeps the fines in the pot instead of your cup.", tts: "Coarse grind, one to fifteen, four minutes. Then the trick most people miss: don't plunge hard — break the crust, skim the foam, and press just below the surface. Pouring gently keeps the fines in the pot, instead of your cup.", }, { id: "im-aeropress", title: "AeroPress", scene: ["brewAnim", { method: "aeropress", mode: "press" }], transcript: "An immersion brew finished under gentle pressure. Medium-fine grind, one to twelve, ninety seconds of steep, thirty seconds of press. The pressure pushes water through the bed at the end, so you get immersion's evenness with a cleaner, fuller finish.", tts: "An air-o-press brew is an immersion finished under gentle pressure. Medium fine grind, one to twelve, ninety seconds of steep, thirty seconds of press. The pressure pushes water through the bed at the end, so you get immersion's evenness with a cleaner, fuller finish.", }, { id: "im-switch", title: "Clever & Hario Switch — hybrids", scene: ["brewAnim", { method: "hario-switch", mode: "valve" }], transcript: "A valve under a cone gives you both worlds: steep like an immersion, then flip the switch and drain through the filter like a pour-over. Steep two minutes closed, open, and let it draw down — even extraction plus paper-filter clarity.", tts: "A valve under a cone gives you both worlds: steep like an immersion, then flip the switch and drain through the filter like a pour over. Steep two minutes closed, open, and let it draw down — even extraction plus paper filter clarity.", }, { id: "im-coldcup", title: "Cold brew & the cupping bowl", scene: ["brewAnim", { method: "cold-brew", mode: "steep" }], transcript: "Cold water extracts slowly, so cold brew trades heat for time: coarse grind, one to eight, twelve to eighteen hours, then filter. And the cupping bowl is immersion stripped bare — just grounds, water, and a spoon. It's how this app's cupping scores are meant to be tasted.", }, ], }, { id: "percolation", title: "Percolation — water passing through", minutes: 5, slides: [ { id: "pc-principle", title: "The principle", scene: ["brewAnim", { method: "v60", mode: "pour" }], transcript: "In percolation, fresh water continuously passes through a bed of grounds — always hungry, always extracting. That makes it efficient and brilliantly clear, but unforgiving: wherever water finds an easy path, it channels, over-extracting one spot and ignoring the rest.", }, { id: "pc-bloom", title: "The bloom", scene: ["bloom", {}], transcript: "Fresh coffee is full of trapped carbon dioxide, and gas pushes water away from the grounds. So we bloom: wet the bed with twice its weight in water, watch it bubble and swell, and wait thirty to forty-five seconds. Skipping the bloom is brewing on top of a gas bubble.", tts: "Fresh coffee is full of trapped carbon dioxide, and gas pushes water away from the grounds. So we bloom: wet the bed with twice its weight in water, watch it bubble and swell, and wait thirty to forty five seconds. Skipping the bloom is brewing on top of a gas bubble.", }, { id: "pc-v60", title: "V60 — the cone", scene: ["brewAnim", { method: "v60", mode: "spiral" }], transcript: "Medium-fine grind, one to sixteen, finished around three minutes. Pour in slow spirals from the center out, keeping the bed level — the cone's single hole means your pour rate controls the flow. Gentle pulses beat one big flood.", tts: "For the V sixty: medium fine grind, one to sixteen, finished around three minutes. Pour in slow spirals from the center out, keeping the bed level — the cone's single hole means your pour rate controls the flow. Gentle pulses beat one big flood.", }, { id: "pc-flat", title: "Chemex & flat bottoms", scene: ["brewAnim", { method: "chemex", mode: "pour" }], transcript: "The Chemex's thick paper filters for the cleanest cup on this page — grind slightly coarser to keep it flowing. Flat-bottom brewers like the Kalita Wave spread water across an even bed, more forgiving of pour technique at a small cost in brightness.", tts: "The KEM-ex's thick paper filters for the cleanest cup on this page — grind slightly coarser to keep it flowing. Flat bottom brewers like the ka-LEE-ta Wave spread water across an even bed, more forgiving of pour technique at a small cost in brightness.", }, { id: "pc-batch", title: "Auto drip & the stovetop percolator", scene: ["brewAnim", { method: "batch", mode: "drip" }], transcript: "A good batch brewer is just a robot doing percolation with perfect consistency — give it the same grind and ratio you'd use on a flat bottom. The classic stovetop percolator recycles brewed coffee back over the grounds; charming, but it over-extracts by design. Keep it short.", }, ], }, { id: "espresso", title: "Espresso & pressure", minutes: 5, slides: [ { id: "es-principle", title: "Nine bars through a puck", scene: ["brewAnim", { method: "espresso", mode: "pressure" }], transcript: "Espresso forces water at nine atmospheres through a compressed puck of finely ground coffee — a thirty-times concentrated brew in thirty seconds. At that intensity every variable is magnified, which is why espresso rewards obsessive consistency.", }, { id: "es-puck", title: "The puck is everything", scene: ["tamp", {}], transcript: "Pressurized water exploits any weakness: a crack, a loose corner, an uneven density. Dose to the tenth of a gram, distribute the grounds evenly, tamp level. Puck preparation isn't ritual — it's channel prevention.", }, { id: "es-shot", title: "Reading the shot", scene: ["shot", {}], transcript: "Start from a one-to-two ratio: eighteen grams in, thirty-six out, in twenty-five to thirty-two seconds. The stream should start as slow dark drips and flow like warm honey. Blonde and gushing means under-extracted; choked drips mean grind coarser.", tts: "Start from a one to two ratio: eighteen grams in, thirty six out, in twenty five to thirty two seconds. The stream should start as slow dark drips and flow like warm honey. Blonde and gushing means under-extracted; choked drips mean grind coarser.", }, { id: "es-dial", title: "Dialing in", scene: ["tasteDial", {}], transcript: "Keep dose and ratio fixed; move only the grind. Sour and fast — finer. Bitter and slow — coarser. One change per shot, logged. When the grind is right, then and only then adjust ratio for body, or temperature for brightness.", }, { id: "es-moka", title: "The moka pot", scene: ["brewAnim", { method: "moka", mode: "flame" }], transcript: "The moka pot is pressure brewing at one and a half bars: boiler steam pushes hot water up through the grounds. Fill the boiler with pre-heated water, use a medium-fine grind, never tamp, and pull it off the heat when the flow gurgles — the last steam-driven pulse scalds.", tts: "The MOH-kah pot is pressure brewing at one and a half bars: boiler steam pushes hot water up through the grounds. Fill the boiler with pre-heated water, use a medium fine grind, never tamp, and pull it off the heat when the flow gurgles — the last steam-driven pulse scalds.", }, ], }, ], }, ]; export const ACADEMY_SLIDE_COUNT = ACADEMY_TRACKS.reduce( (sum, track) => sum + track.lessons.reduce((s, l) => s + l.slides.length, 0), 0, );