Making Mila's launch video with Claude Code
How I made Mila's launch video in a day with Claude Code, plus the full conversation - every prompt and every reply.
We're launching Mila at Capchase, and I really wanted a launch video like the ones Attio, Rippling or Raycast put out - no cameras, just animated product UI, type and a great track. That's usually weeks of back and forth with a motion designer, so I wanted to see how far I could get with Claude Code and HyperFrames, which lets you write a video as HTML and GSAP and render it to MP4.
Turns out, quite far. The video above came out of this one conversation, which took about 8 and a half hours. A lot of people ask me how I actually talk to these models, so I decided to share the whole thing as it happened (I only redacted a couple of private links). Before that, here are some of the things that worked for me.
Start with references, not the brief
My first prompt has no context on the product at all. I asked Claude to find recent animated launch videos and download them, and then I ranked them myself and told it what I liked about each one. Only after that did I bring in the music, the brand, our blog post and, finally, the script. So, by the time we wrote the first line, we were both kind of looking at the same references.
Music first
I think we should actually start with the music then, and then build the video on top. Otherwise sync becomes super complex.
Everything is timed to the track. The bass drop lands on "Meet Mila" and the logo lands on the last hit. Whenever something felt off, it was almost always because it had drifted off the beat.
Be blunt, but say what works
Most of my prompts are reviews, and to be truthful they're not very polite ("sounds like a teletienda ad", "absolute AI slop", "cutre sound effects"). However, I always try to point at what's working too, so it doesn't get thrown away in the next pass. My favorite prompts are the ones that point at something that's already right and ask for more of it:
The acceleration is still off. You know where it's perfect? When it zooms into the is broken words. Just apply the same one!
Commit what's good
"Now it's perfect. Please commit." Commits are save points - if the next iteration goes sideways, I can always go back. It's also a pretty clear signal to the model about what not to touch.
Course-correct on the go
You don't have to wait for it to finish. Some of my messages went in while Claude was still working (they're marked sent mid-task below), mostly small nudges like "Attio is the perfect inspo for animation" or "Don't focus so much on SFX for now".
Ask for its opinion
When the second half of the video stopped working, I didn't try to fix it scene by scene. I asked "What are we missing?", read what it came back with, and told it to give it a shot. Later on it was "If you have a better idea, let me know… gogogo". It may seem obvious, but it works surprisingly well.
Keep the taste calls
I picked the sound effects I cared about myself and pasted the links. Same with the tagline and the lines that carry the message. Claude is extremely fast at everything else, but I wanted those to be mine.
Below is the full transcript. My messages are on the right and Claude's are on the left. Each reply has a collapsed list of the tools it used, in case you're curious about what it was actually doing behind the scenes.
The conversation
Every prompt and reply as it happened (minus a couple of small redactions). Times are Madrid time on October 5, 2026.
Worked · 30 steps
- ToolSearch
- Check for download tools and list project dir
- WebSearch
- WebSearch
- WebSearch
- Search YouTube for recent launch videos from known SaaS brands
- Debug yt-dlp search failure
- Search YouTube for launch videos from SaaS/AI brands
- Search more fintech/AI brand launch videos
- Fetch upload dates and views for shortlisted videos
- Download shortlisted launch videos at 1080p
- Retry failed downloads sequentially and check resolutions
- Retry one download with alternate YouTube client
- Retry download using Chrome cookies
- Check how yt-dlp was installed
- Upgrade yt-dlp via Homebrew
- Retry remaining downloads with updated yt-dlp
- Generate 4x4 contact sheet per video
- Read HSVVMgExV9U.jpg
- Read R1cF4T4lgI4.jpg
- Read An8IM-kPyms.jpg
- Read mRql2VJ99gM.jpg
- Read 31_moi-cVXg.jpg
- Read To5nrYqvR44.jpg
- Read uJ70iGerYzE.jpg
- Read Mi173xGb0ZA.jpg
- Read UwNeMoamoTQ.jpg
- Read Dq9-WUeZD0w.jpg
- Read hrkp_DIHTk8.jpg
- Read Ve6565BeUxI.jpg
Now pulling upload dates for the shortlist.
Filtering to the last ~12 months. Downloading candidates, then I'll build contact sheets to verify which are animated vs filmed.
Some downloads were throttled (403) when run in parallel. Retrying those one at a time.
yt-dlp (March 2026 build) is likely stale vs. YouTube's current player. Updating it.
All 16 downloaded. Now making contact sheets to check which are actually animated.
Worked · 9 steps
- Move filmed videos aside, find Krea 2, download ElevenLabs, locate Chatly video
- Read yoLe4_XscqA.jpg
- Read nJUylrt1OdU.jpg
- Read ekSyfD7uoiU.jpg
- Read QCOsZQ6vNco.jpg
- List Krea channel videos and download Chatly Vimeo
- WebSearch
- Download Krea 2 launch video from X
- Open folder in Finder and list videos with durations
Grabbing your three examples while I check the last few sheets.
Granola and Brex turned out to be filmed too, so they're out. Now downloading Krea and the Chatly Vimeo video.
I downloaded 15 animated launch videos to /Users/gulipad/dev/mila-launch-video/inspo/ (now open in Finder): 12 I found plus your 3. All are 1080p MP4s, and each filename starts with its upload date and ends with its video ID. I made a contact sheet for each one to check it's animated and not filmed.
Your examples (in inspo/user_examples/)
- ElevenLabs Reception (Sep 2026, 33s)
- Krea 2 (May 2026, 67s). I took it from Krea's announcement post on X.
- Chatly × Flowjam (52s). I pulled it from the Vimeo video on the Flowjam page.
What I found, newest first (in inspo/)
| # | Video | Length | Style |
|---|---|---|---|
| 1 | Ramp, Accounting Bench (Sep '26) | 55s | Warm off-white background, cut-out photos of old calculating machines, number counters, charts that build on screen. Editorial feel |
| 2 | Claude, Slides/Design/Docs (Sep '26) | 95s | Real product UI with cursor moves, warm cream palette, a typed tagline at the end |
| 3 | Harvey II (Aug '26) | 60s | Paper collage textures and isometric shapes, mixed with product screenshots. The most crafted-looking one |
| 4 | Hebbia, Projects (Apr '26) | 45s | Serif headlines, light/dark split screens, UI panels building in. One stock photo at the start |
| 5 | Linear Agent (Mar '26) | 55s | Dark UI shot at a tilted 3D angle with a slow camera drift. Very premium |
| 6 | Rippling AI (Mar '26) | 60s | Big kinetic type over dark gradients, chat UI typing in, word-by-word reveals |
| 7 | Attio, Ask Attio (Feb '26) | 47s | Minimal kinetic type ("Every call / Every note…"), grid backgrounds, typewriter text. About 17M views |
| 8 | Ramp, Policy Agent (Jan '26) | 123s | Mostly animated slides. The weakest one, kept as a fintech reference |
| 9 | Raycast, "Coming 2026" (Dec '25) | 39s | Dark glass UI close-ups and a teaser-style cut |
| 10 | Superhuman (Oct '25) | 62s | Hand-drawn character animation. Has one brief webcam shot |
| 11 | Cursor 2.0 (Oct '25) | 64s | Clean UI walkthrough, benchmark chart, tight cuts. About 9.5M views |
| 12 | Notion 3.0, Agents (Sep '25) | 90s | Character mascots and UI demo on a bold blue background. About 16M views |
Rejected for being mostly filmed: Granola, Brex, Decagon, and Raycast's "It's out". I moved them to inspo/_rejected_filmed/ in case you want to look anyway.
Setup change: the first round of YouTube downloads was blocked, so I updated yt-dlp through Homebrew (2026.3 → 2026.8). That fixed it.
Rank them however you like, and tell me what you like in the top few: music, pacing, type, or UI treatment. After that, send the HyperFrames, Mila and Capchase context.
Sources: Arcade launch video examples, Flowjam 2026 launch videos, Krea 2 on X, VentureBeat on Krea 2
Worked · 38 steps
- Check for audio/video analysis Python libraries
- Install librosa in a scratchpad virtualenv
- Extract audio, detect cuts, build timestamped 1fps sheets
- Extract audio, detect cuts, build timestamped 1fps sheets
- Write analyze.sh
- Write audio.py
- Run cut detection, contact sheets, and audio analysis
- Write analyze.sh
- Write tile.py
- Rerun cut detection, tile frame sheets, audio analysis
- Read attio_sheet01.jpg
- Read attio_sheet02.jpg
- Read attio_sheet03.jpg
- Read attio_sheet04.jpg
- Read attio_audio.png
- Read raycast_sheet01.jpg
- Read raycast_sheet02.jpg
- Read raycast_sheet03.jpg
- Read raycast_audio.png
- Read eleven_sheet01.jpg
- Read eleven_sheet02.jpg
- Read eleven_sheet03.jpg
- Read eleven_audio.png
- Check for transcription tools
- Find a local whisper.cpp model file
- Check model search output so far
- Download whisper model and transcribe the five videos
- Read claude_sheet01.jpg
- Read claude_sheet02.jpg
- Read claude_sheet04.jpg
- Read claude_sheet07.jpg
- Read claude_audio.png
- Read harvey_sheet01.jpg
- Read harvey_sheet03.jpg
- Read harvey_audio.png
- Write STYLE_NOTES.md
- Write mila-video-direction.md
- Add memory index entry
Now running cut detection, timestamped frame sheets, and audio analysis on the top 5.
Shell quoting broke the filters. Moving the logic into a script file.
No drawtext in this ffmpeg build, and -v error was hiding the cut output. I'll extract frames and label them in Python instead.
Data's in. Now reviewing the frame sheets, starting with Attio (ranked #1).
Attio is mostly sound design: typing ticks, pitched chirps, and a sub-bass drop at 28.4s. Next, Raycast.
Raycast: each visual cut lands on a synth bass/chord change, with a fast run of monospace "NEW ___" tags at the end. Next, ElevenLabs.
The ElevenLabs spectrogram shows curved pitch contours, which usually means voice. Checking whether it, Claude, and Harvey have speech, since you want no voiceover.
No local model yet, so I'm downloading the small whisper base.en model (~140MB) to the scratchpad.
ElevenLabs and Harvey both use voiceover. ElevenLabs's VO is kinetic: every spoken word also appears on screen. Attio, Raycast and Claude have none. Next, Claude.
I have what I need from all five. Writing the findings to a style brief in the project so we can build the script from it.
I went through all five frame by frame and analyzed their audio. The full breakdown is in inspo/STYLE_NOTES.md.
A 60s no-voiceover video is doable. I ran speech detection on all five: Attio, Raycast and Claude use no voice at all. ElevenLabs and Harvey do have voiceover. In ElevenLabs, every spoken word is also on screen as moving text, so we can take that structure and leave the voice out.
What each one does best
- Attio: it's almost one continuous shot, with type morphing into shapes and then into the next scene. The audio is mostly sound effects: a tiny tick for every keystroke and every word, rising chirps when things morph, and a heavy bass hit on a black "Everything is context" screen at 28s, the loudest moment. Two lines to borrow: "Ask Attio to brief my day / summarize this call / …" and a scrolling ticker of data sources.
- Raycast: dark glass UI with slow push-ins. The music is synth chords with almost no drums, and every cut lands on a chord change. It ends with a fast run of "NEW · FEATURE" tags in a typewriter-style font before the logo.
- ElevenLabs: problem, then a turn on "Until now.", then the fix, with a full colour change at the turn (cream to red to green). Words are scattered among floating objects, and transitions break into pixel blocks.
- Claude: a virtual camera follows the cursor through a real task from start to finish. The beat kicks in at 16.5s, right when the agent starts working. It ends with two cursors, "Claude" and "You", typing the tagline.
- Harvey: paper-collage textures, a repeating cube-and-dot shape, very fast cutting (about one cut per second), and letters that assemble into "Intelligence."
What they have in common
- They open quietly inside the product, on a cursor in an input field.
- Short phrases on screen do the job a voiceover would.
- One big drop lands at about the halfway point.
- They show the agent working, step by step.
- The edit is locked to the music.
- A fast feature recap comes just before a quiet logo.
Starting skeleton for 60s
| Time | Section |
|---|---|
| 0–8s | Hook in the UI |
| 8–20s | The problem, as an "every X" list |
| 20–28s | Build |
| ~28s | The drop, with the core claim |
| 28–45s | Mila doing the work |
| 45–53s | Fast feature recap |
| 53–60s | Logo |
I also saved the 60s / no-voiceover decision and your ranking to memory for future sessions.
Ready for the Mila context. The most useful inputs:
- What Mila does and who it's for
- The one thing a viewer should remember
- Any product UI or screenshots
- Brand assets (logo, colours, fonts)
- A launch URL or call to action
The leftover search for a local whisper model has finished. It doesn't change anything, since I'd already downloaded one to the scratchpad and run the transcription. Ready when you are with the Mila context.
Worked · 17 steps
- Probe Mixkit and Pixabay music pages for direct track links
- Inspect Mixkit HTML structure for titles and audio
- Show HTML context around one track link
- Write mixkit_scrape.py
- Scrape Mixkit pages for track metadata
- Print HTML around one Mixkit track card
- Write mixkit_scrape.py
- Scrape Mixkit catalog and summarize genres
- Write music_scan.py
- Analyze candidate tracks for intro/drop/body structure
- Download 12 shortlisted tracks and check for vocals
- Render spectrogram grid for shortlisted tracks
- Read music_grid.png
- WebFetch
- Extract Mixkit music license text
- WebSearch
- Sort picks and render 60s audition cuts, open folder
I'll start with the libraries that allow commercial use without attribution and can be downloaded directly: Mixkit and Pixabay.
Pixabay blocks scripted access (403), but Mixkit works. Collecting tracks with their titles from the relevant Mixkit genre pages.
230 tracks found, but my title regex missed. Checking the card markup.
Mixkit embeds JSON-LD with title, artist, genre and duration. Parsing that instead.
The numbers only show structure, not taste. Taking the 12 best-structured tracks that fit the minimal/electronic feel, downloading them, and checking spectrograms plus a vocal check.
None of them have vocals. Making one spectrogram grid to compare their energy shapes.
Mixkit's license allows commercial use with no attribution, and reviewers report no Content ID claims. Last step: rough 60s cuts of the top 6 so you can hear each one at the video's length.
I found six free tracks that fit and saved them to music/ (the folder is open in Finder). Listen to the rough 60s cuts in music/previews_60s/, and the full tracks are in music/candidates/.
All six are from Mixkit. Its license allows commercial use with no attribution, including YouTube, social and ads. What it doesn't allow is reselling the tracks on their own or claiming them as yours. Reviewers report no Content ID claims. Pixabay was the other main free library, but it blocks scripted downloads.
How I chose: I can't actually listen, so I picked on structure. I scanned 188 electronic, ambient, film-score and underscore tracks. I kept ones with a quiet opening, then one clear jump in energy (the drop), then at least 25s of full track after it. That's the shape our video skeleton needs. None of the six have vocals.
| # | Track | BPM | Drop | Shape |
|---|---|---|---|---|
| 1 | New Bass 01 (Lily J) | ~129 | 22.7s | Sparse plucks, then a heavy bass drop. The closest to the "quiet build, then hit" we want |
| 2 | Atoms in Peace (A. M.) | ~129 | 28.8s | Busy intro, a low-end gap around 22–28s, then a drop at 28.8s. Lands right where Attio's does |
| 3 | Forest Walk (Eugenio Mininni) | ~117 | 16.3s | The biggest dynamic jump of the set (+28 dB) into a pulsing bass/pad bed. Feels like Raycast |
| 4 | Sonor 01 (Eugenio Mininni) | ~86 | 22.6s | Sparse until the drop, then dense and steady. Same tempo as the Claude video |
| 5 | Other World (Lily J) | ~144 | ~9s | Dark bass pattern that comes in early. Better if we want energy from the start |
| 6 | A New Life (Eugenio Mininni) | ~129 | ~17–24s | More cinematic, with rising swells. The most "film" of the six |
I put six weaker matches (mostly ambient, with no real drop) in music/candidates/_maybe/.
Before you pick:
- The 60s cuts are rough. Each one is the first 60s of the track with a 5s fade. Once you choose, I'll edit a proper ending and can shift the drop to exactly where we want it.
- These won't be as polished as the references. Mixkit's catalogue is free but older, and Attio and Raycast almost certainly used premium or custom music. If there's budget, Artlist, Musicbed or Epidemic Sound are worth a browse. Send me any track link and I'll run the same structure check on it.
Once you've picked one, I'll map its exact beats, bars and drop. That timing becomes the grid we build the 60s script on.
Sources: Mixkit free stock music, Mixkit license guide, Swarmify free music roundup, Mixkit review
Worked · 27 steps
- Probe Epidemic Sound public pages
- Look for track data in Epidemic search page
- ToolSearch
- Load skill claude-in-chrome
- Browser: tabs context mcp
- Browser: navigate
- Browser: computer
- Browser: navigate
- Browser: read network requests
- Browser: navigate
- Browser: read network requests
- Browser: find
- Browser: computer
- Browser: computer
- Browser: computer
- Browser: computer
- Browser: computer
- Browser: read network requests
- Browser: get page text
- Browser: navigate
- Browser: read network requests
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
Epidemic is a better fit. Its catalogue is much more current, and it can search for tracks similar to a reference. Checking what I can reach without logging in.
Epidemic builds its pages in the browser, so there's no track data to scrape. I'll use your Chrome session, where you're presumably logged in.
You're logged in, but the plan shows as Creator. I'll check what that plan covers for company videos later. First, finding the search API calls the page makes.
The page opens in Assistant mode by default, so no search request fired. Switching to Search.
Epidemic's Assistant recommends tracks from a project description, which suits us. I'll describe our brief and capture the track data it returns.
The Assistant request didn't go through, but the regular search results include BPM, genre and mood. Reloading with network capture on to find the underlying API.
Found the track search endpoint (/json/search/tracks/). Checking what it returns.
The raw track object contains signed URLs, which the tool redacts. Listing just the field names and values without URLs.
Worked · 31 steps
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Save Epidemic track IDs and test preview download
- Write es_scan.py
- Download and analyze 100 Epidemic previews
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Scan the 54 Pulses/IDM/electronica tracks
- Browser: javascript tool
- Browser: javascript tool
- Render spectrogram windows around each drop
- Read es_grid.png
- Render 60s audition cuts with drop near 28s
- WebSearch
- Browser: tabs close mcp
- Edit mila-video-direction.md
Understood. The Mixkit picks are out, and I'm moving fully to Epidemic, which has far more and fresher tracks. Still working out the shape of its API.
That was too much for one 45s call. Running it in the background inside the page and polling for results.
The preview MP3s sit on a public CDN with no signed parameters, so I can fetch them for analysis. Filtering now.
Too many rows for one response, so I'll export the 213 candidates in chunks to a local file.
The tool truncates long outputs, so I'll export only the essentials: track ID and preview file ID for the top 100 by query relevance. Metadata can follow later for the final shortlist.
Saving the IDs and testing a preview download.
Preview downloads work. Downloading all 100 and running the structure scan: quiet intro, a clear drop, and a sustained section after it.
The genres=pulses filter works and returns 366 tracks. Collecting all of them, plus two related genres: minimal synth and IDM/glitch.
After filters, that's 54 new tracks I haven't scanned yet. Exporting them.
Getting metadata for the strongest of these.
I've narrowed both sweeps to 15 tracks that fit the brief: modern Pulses/IDM/electro, minimal, nothing cheesy. Checking their energy shape around the drop.
I've dropped the Mixkit options and found 10 new tracks on Epidemic Sound. The 60s audition cuts are in music/epidemic_auditions/, now open in Finder. I moved the old Mixkit files to music/_old_mixkit/.
Licensing problem first: your account is on Epidemic's Creator plan. That plan explicitly excludes music in marketing or promotion for a brand or company, and a Capchase launch video is exactly that. Company use needs the Business or Enterprise plan. Worth checking with whoever owns the Epidemic account before we commit to a track.
How I searched: I used your logged-in session to pull about 3,700 tracks through Epidemic's own search. That included the whole Pulses genre, which is their tech/motion-graphics underscore category, plus IDM and electronica. I filtered to no vocals and mostly 2023 or later, then scanned 154 previews for the shape we need: a quieter intro, a clear drop, and a strong section after it.
Each audition is cut so the drop lands at about 28s, matching our skeleton. The exception is "Not Again", whose intro is too short.
| # | Track | Feel | Why it made the cut |
|---|---|---|---|
| 01 | Brighter, Out To The World ('25) | Hopeful pulses | Biggest clean jump (+19 dB) from a sparse build into a full groove |
| 02 | Signal Containment, Out To The World ('26) | Mysterious, tense | Dense pulsing body after the drop. Closest to Raycast's mood |
| 03 | Utopia, Susan Bear ('26) | Downtempo/IDM | Breaks down to near-silence just before the drop, like Attio's black-screen moment |
| 04 | Autophagy, Timothy Infinite ('25) | Warm electronica | A hard silence right before the drop |
| 05 | Come Closer, Don't Speak, Tigerblood Jewel | Dark electro | The most dramatic of the set (+33 dB drop) |
| 06 | Star Voyage, Out To The World ('25) | Hopeful, polished | Steady low pulses through the build, then full |
| 07 | Are We Doing This, Hank Lotion ('24) | Future garage | Moody, with a breakdown and then a bass drop |
| 08 | Not Again, dreem ('26) | Breakbeat pulses | Early drop at 15s, so more energy from the start |
| 09 | Signal Loss, Slowya.roll | IDM, glitchy | Its natural drop is already at 27.6s, so no re-cut needed |
| 10 | Uncharted Territories, DEX 1200 | Dark electro | Breakdown into a heavy drop |
About the auditions:
- They come from Epidemic's low-quality preview files, with a crude fade-out at the end.
- Once you pick a track, I'll download the full-quality version from your account. Most of these come with stems (separate bass, drums, melody and instrument tracks), so I can rebuild the track to the video: extend the intro, shift the drop, and write a proper ending.
If none of these work either, tell me which one is closest and what's wrong with it ("too dark", "too busy", "want more Raycast"). I can then search Epidemic for tracks similar to it, which works better than keyword searches.
Sources: Epidemic Sound plans, Business Plan, Which plan is right for you, Epidemic pricing explained
Worked · 7 steps
- Write profile.py
- Profile loudness, bass, dynamics, drop timing for refs and candidates
- Edit profile.py
- Profile loudness, bass, dynamics, drop timing for refs and candidates
- Plot full-band and sub-bass energy curves for refs and Autophagy
- Read energy_curves.png
- Re-rank Epidemic candidates by slams, dynamic span, sub-bass, closeness to Autophagy
Your message cut off at "It's a bit too…". Too what? Let me know when you can. Meanwhile, I'll measure the bass, dynamics and drop timing of the reference videos and compare them with Autophagy.
librosa can't read MP4 here. Switching to an ffmpeg decode.
That's useful. Your three picks all score well on a new metric I built from the references: dynamic range, sub-bass, and how often the track cuts to silence and then slams back in. Out of 154 tracks, Come Closer, Don't Speak ranks #1, Autophagy #11, and Are We Doing This #18. The metric roughly matches your taste, so I can use it to filter the next round.
I also need to correct something: in the references you like most, the main drop comes late, about 65–75% of the way through, not at 28s.
Where the drop happens in the reference videos
| Video | Length | Biggest moment | % through | What leads into it |
|---|---|---|---|---|
| Attio | 47s | Big swell, peaking 30–34s | 64–72% | Sub-bass cuts out completely at 28.4s, about 1.5s of near-silence. Before that, a small bass thump on each word |
| Raycast | 39s | Slam at 28.3s | 73% | No single drop: 7 slams, each on a cut and each after a short dip (3.7, 8.9, 14, 17.8, 21.4, 24.2, 28.3s) |
| Linear | 55s | Hit at 42s | 76% | Opening hit at 4s, then a low bed |
| Krea | 67s | Drop at 50.5s | 75% | Silences at 31–33s and 48–50s |
| Rippling | 60s | Drop at 11s | 19% | A hard cut to silence first, then two more dropouts later |
| Notion / Claude / Hebbia | — | Drop at 13–17% | early | After that the groove stays flat |
In your favourites, the pattern is:
- Lots of small "cut to silence, then slam" hits on the cuts.
- The biggest hit around 70%, just after 1–2s of silence.
- The last 20–25% is a decaying tail under the logo.
For our 60s video, that means: slams every 3–6s, the main hit around 40–45s with silence right before it, and a logo tail from about 47–60s. My earlier "drop at 28s" came from Attio's black-screen moment, but at 28s Attio is actually in the silence before its big moment, and in a 47s video.
How Autophagy compares
| Autophagy (60s cut) | References you like | |
|---|---|---|
| Loudness range (LRA) | 2.1 LU | 11–13 LU |
| Punch (crest factor) | 9 dB | 14–16 dB |
| Sub-bass share | 58% | Raycast 54% |
| Drop position | 49% | about 70% |
So Autophagy has enough bass, but it's loud from the first second and stays flat, with one dropout at 24–29s. That's the "bassy but not dynamic" problem. (A wide loudness range means big swings between quiet and loud. A low crest factor means the track is heavily compressed, so hits don't stand out.)
Why stock tracks fall short: Attio's and Raycast's music was almost certainly scored to the picture, so their hits land on the cuts. A stock track won't do that. We can recreate it:
- Use the track's stems (separate bass, drums and melody parts) to mute the bass or drums for the dips.
- Add sub-hits, impacts and risers from Epidemic's sound effects for the slams.
- Place them on our cuts.
Next round:
- Re-cut your three picks to the new timing, with the main hit around 42s and a logo tail.
- Use Epidemic's similar-track search seeded with Come Closer, Autophagy and Are We Doing This, then filter with the new metric. That should beat keyword searches.
Also, you said Autophagy is "a bit too…" and the message cut off. Too what? It decides what I look for in the similar tracks.
Nothing came through with that message: no link, file or image. Could you resend it? Any of these works:
- A link (YouTube, X, Epidemic track page, Spotify, etc.)
- A file path, or drop the file into
inspo/ormusic/ - Paste the image again if it was a screenshot
Once I have it, I'll profile it like the others (bass, dynamics, where the hits land) and use it to steer the similar-track search, along with your three picks.
Also still open: Autophagy is "a bit too…" what?
Worked · 24 steps
- Browser: tabs context mcp
- Browser: navigate
- Browser: javascript tool
- Browser: javascript tool
- Browser: navigate
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Save the 125 similar-track IDs
- Write rank.py
- Download and rank 125 similar tracks against liked set
- Browser: javascript tool
- Write recut.py
- Cut round-2 auditions with main hit at 42s
- Plot energy curves of round-2 cuts
- Read round2.png
- Browser: tabs close mcp
Got it. That message was the vibe guidance: Autophagy is closest, Come Closer and Are We Doing This might work, Not Again is borderline, and the rest are out. I'll use those four as seeds for Epidemic's similar-track search, then re-cut the best ones to the new timing.
All four seeds have full stems (bass, drums, instruments, melody), so we can remix whichever wins. Now finding Epidemic's similar-tracks endpoint from a track page.
Found it: /json/similar/kosmos_id/<id>/. Testing what it returns and whether it pages.
Each seed returns 60 similar tracks. I'll crawl two levels deep in the background (seeds → similar → similar of those) and rank tracks by how often they come up.
1,554 related tracks. Filtering (no vocals, no pop/hip-hop etc.), skipping the 154 I've already scanned, and exporting the top 125 by similarity score.
Saving these and scoring them locally against your three picks. I'm combining the dynamics and bass metrics with how close each track sounds to Autophagy, Come Closer and Are We Doing This.
Autophagy itself ranks only 62nd here because it's so compressed. Its sound is what you like, so the score below still weights closeness to it. Getting names and details for the top 12.
Every cut has a real silence-to-slam moment. The very large jumps (+40 to +90 dB) mean the bass goes fully silent before coming back. Checking the cuts visually before handing them over.
Round 2 is ready in music/epidemic_round2/ (open in Finder). Every cut is re-timed so its biggest silence-to-slam moment lands at 42s, about 70% through, like Attio, Raycast, Linear and Krea. Round 1 is in music/_round1/.
Your picks, re-cut to the new timing
- A1 · Autophagy. Still loud and flat from the first second; the only contrast is a breakdown at 36–42s. To fix that I'd mute its bass and drum stems in the first 30s and bring them in as hits. Each of your four picks comes with separate stems.
- A2 · Come Closer, Don't Speak. The most Raycast-like: chopped, pumping bass with constant dips and slams, breakdowns at 10–17s and 28–32s, then the 42s hit.
- A3 · Are We Doing This. Busy groove with a dip right before 42s.
- A4 · Not Again. Long full-energy wall, then a dip into 42s.
New finds (B01–B12). These came from Epidemic's "similar tracks" for your four picks, crawled two levels deep: about 1,500 tracks. I kept the ones that score high on the reference metrics: wide loudness range, deep sub-bass, and frequent silence-to-slam moments.
| Track | What happens | Worth noting | |
|---|---|---|---|
| B01–B03 | Them Thieves / I Like Your Suit / Touch Touch Touch, Ava Low | Dark electro. I Like Your Suit has a riser from 34s into the hit | Ava Low is the artist most often listed as similar to Come Closer |
| B04 | Imp, Felix Johansson Carne | 12s fade into silence, then a slam at 42s | The textbook "silence before the big moment" |
| B05 | Escapism, Nina | Choppy before, solid after | Dubstep, but restrained |
| B06 | Want U 2 Know, Push N' Glide | Wall from 21–38s, dip, hit | Heaviest of the set |
| B07 | Terminal Velocity, Cospe | Busy, glitchy | Quirkier |
| B08 | Hello My Friend, Lovren | Steady groove, breakdown 34–42s, hit | Smoothest, closest to Autophagy |
| B09–B10 | hounds / makeshift, dreem | Liquid DnB, same artist as Not Again | Faster feel |
| B11 | Weekend, Paisley Pink | Lighter | Probably too pretty |
| B12 | DON'T TRY IT, Janset | Grime instrumental | Wildcard |
These are much bassier and more dynamic than round 1. The trade-off is that the genres spread out, into dubstep, DnB and grime.
About the cuts: the music after 42s is just the track continuing, with a fade from 53s. In the final edit I'll build a proper decaying tail under the logo, like Attio's last 10s. These cuts are for picking a sound, not the final structure.
Which of these are closest? Even "B04 energy with A1's sound" is enough: I can run another similar-track search from whatever you pick, or build the final version from stems plus sound-effect hits.
Worked · 1 step
- Copy shortlisted auditions and get full track durations
The shortlist has 6 tracks, copied into music/shortlist/. Each audition is cut so its big hit lands at 42s.
| # | Track | Artist | Feel | BPM | Full length | Stems | Notes |
|---|---|---|---|---|---|---|---|
| ⭐ 1 | Terminal Velocity | Cospe | Glitchy, quirky electronic, lots of hits | 80 (half-time) | 3:16 | to confirm | Your strongest reaction. Busy, with a lot of hit/dip contrast |
| 2 | Autophagy | Timothy Infinite | Warm, bassy electronica | 104 | 3:25 | ✅ bass/drums/inst/melody | The sound you said was closest. Needs stems work to add dynamics, since it's flat and compressed |
| 3 | Come Closer, Don't Speak | Tigerblood Jewel | Dark electro with chopped, pumping bass | 95 | 2:31 | ✅ | Most dynamic of all; scored #1 on the reference metrics |
| 4 | Them Thieves | Ava Low | Dark, dreamy electro | 105 | 2:30 | to confirm | Close cousin of Come Closer, constant slams |
| 5 | Are We Doing This | Hank Lotion | Moody future garage | 123 | 3:15 | ✅ | Busier groove, dip into the hit |
| 6 | Not Again | dreem | Breakbeat pulses | 128 | 2:26 | ✅ | You said borderline, so it stays at the bottom |
What I'd do next:
- Narrow to 1–2 tracks. If you listen to the shortlist back to back, I'd compare Terminal Velocity, Autophagy and Come Closer. They cover three directions: glitchy and playful, warm and bassy, dark and punchy.
- Download the full-quality versions and stems from your Epidemic account for the finalists. The previews are low quality and can't go in the final video.
- Build the 60s edit with an intro, slams on the cuts, the main hit at about 42s, and a tail under the logo. Its exact beat timings become the grid for the script.
Two notes:
- If Terminal Velocity is the frontrunner, I can run another similar-track search seeded on it alone. It's a different flavour from the other five.
- Licensing is still open. Your Epidemic account is on the Creator plan, which doesn't cover company marketing. It needs upgrading to Business or Enterprise before the video goes out, so it's worth starting that conversation now.
Worked · 15 steps
- Extract Rippling cuts, frames, audio, check for speech
- Tile Rippling frames into labelled sheets
- Read rippling_sheet01.jpg
- Read rippling_sheet02.jpg
- Read rippling_sheet03.jpg
- Read rippling_sheet04.jpg
- Plot full-length structure of Rippling and 6 shortlist tracks
- Read structure.png
- Extract section maps, silences, bass entries for Rippling and shortlist
- Write marry.py
- Build Rippling-structured rough edits and comparison plot
- Read marriages.png
- Write SCRIPT_CUES.md
- Open the marriages folder in Finder
- Edit mila-video-direction.md
You're right about Attio, and I overstated it earlier. Attio has no beat drop. Its big moment at 30–34s is a sub-bass swell and drone under "Everything is context", not a beat coming in. I'll analyze Rippling now: frames, cuts, audio, and the on-screen script with timings.
No voiceover; it's all on-screen text. Building timestamped frame sheets so I can read the script cues.
Rippling turns out to be the most useful reference: it has two drops. I'll map its exact script against the music, then do the same for the six shortlist tracks over their full length.
The structure plot makes the pairings fairly clear. Before writing it up, I'll pull exact timestamps for each track's breakdowns, silences and drops, so the cue sheet doesn't rely on eyeballing.
I recommend building on Rippling's structure. Five of the six shortlist tracks can be edited to fit it, and I've made rough 60s versions of all six in music/marriages/ so you can hear each pairing. The full write-up is in inspo/SCRIPT_CUES.md: cue sheets for Rippling, Attio and Raycast, a map of every shortlist track, and a draft 60s cue sheet for Mila.
Rippling's timeline (60s, no voiceover)
| Time | On screen | Music |
|---|---|---|
| 0–10 | Typed question → AI answer streams in → user types "Holy shi—" | Quiet build |
| 10–11 | Hard cut to black: "Introducing" | 1 second of silence |
| 11 | "Rippling AI" | Drop |
| 12–22 | Short lines: "With deep access to / Rippling's data layer / It has full context / on your business / so you can… / Make better better better decisions" | Full beat |
| 25 | The report zooms in | 1s dropout, then slam back |
| 28–34 | "Enough talk." → "Save time with action" → bonuses demo → "Yes." → "Done." | Full |
| 34–44 | "Best of all?" → "You can trust it." → "cites its sources / shows its work / scopes what every user can see" | Full |
| 44–52 | "Insufficient permissions." → "Nice try." → "Now every employee has the full power of Rippling…" | Bass drops out (tension) |
| 52–53 | Spark icon | Silence |
| 53 | Logo | Logo hit, then a tail to 60 |
How the three references are built
- Rippling has two peaks: the drop at 11s (about 19% in) lands on the product name, and the second peak at 53s (88%) lands on the logo.
- Attio works differently. It gives a small bass thump to each word, has one silence at 28s, then a long sub-bass swell on "Universal Context" at 30–37s.
- Raycast puts a slam on every cut, then runs a list of features in monospace type before the logo.
Rippling's structure suits us best. With no voiceover, the music announces the product twice: once on "Mila" and again on the logo. It also gives clear places to borrow Attio's "Every X…" list (in the opening lines) and Raycast's feature list (just before the bass-out).
Each track on Rippling's timing
| Edit | Fit | Notes |
|---|---|---|
| 2 · Autophagy | ⭐ Closest | Drop at 11s, a bass dip every two bars, bass-out from 43–51s, logo hit around 53s. Its real intro builds into a drop; my earlier 60s cut had skipped that intro. Has stems |
| 1 · Come Closer | ⭐ Most dynamic | Same shape, with stutter slams built into the track. One splice. Has stems |
| 3 · Terminal Velocity | Good | Strong riser into the drop at 11s. Needs three splices, and stems aren't confirmed |
| 4 · Are We Doing This | Good | Real silence before both peaks. One splice |
| 6 · Not Again | Good | Its dip lands at 25s, just like Rippling's |
| 5 · Them Thieves | ❌ | Drops at 2s. Wrong shape for this structure |
These are rough edits made from low-quality previews. Where a track goes bass-out, I faked it by filtering out the low end, since I don't have the stems yet. They're good for judging structure and feel, not for the final mix.
What to listen for: play Rippling's video, then 2 (Autophagy), 1 (Come Closer) and 3 (Terminal Velocity). They're three takes on the same structure: warm and bassy, dark and punchy, and glitchy and playful.
Once you pick one, I'll download the full-quality track and stems from your Epidemic account, rebuild the edit properly, and lock its beat timings as the grid for the Mila script. Then I'll need the Mila brief to write the copy. The plan still needs upgrading to Business or Enterprise before anything is published.
That makes sense. The order is: understand the references, understand the songs, write the Mila script, then match a song to it. The edits in music/marriages/ jumped ahead. Ignore them, or I can delete them.
The groundwork for the script is done:
- References: shot-by-shot cue sheets for Rippling, Attio and Raycast, covering what's on screen, when, and what the music does underneath. Also how each one is built: Rippling drops on the product name and hits again on the logo; Attio has no beat drop, just a thump per word and a swell on its big claim; Raycast slams on every cut and ends on a run of feature names. It's all in
inspo/SCRIPT_CUES.mdandinspo/STYLE_NOTES.md. - Songs: a section map for each of the six shortlist tracks, with intro length, natural drops, silences, bass-out sections and BPM. Once the script exists, we can see which song's shape it needs.
Next is the Mila context, so I can write the script. The most useful inputs:
- What Mila is and does. What it is (an agent, a copilot, something else), who uses it (founders, CFOs, finance teams?), and the 3–5 things it actually does.
- The one-line takeaway. What a viewer should remember after 60 seconds.
- Proof points. Numbers, customer outcomes, or capabilities that make it credible. Like Rippling's "cites its sources / shows its work".
- The product UI. Screenshots, a staging link, or a Figma file. Every reference opens inside the product, so this matters a lot.
- Brand. Mila's logo or mark, how it sits next to Capchase, colours, fonts, and any tone of voice.
- The ending. CTA, URL, and whether it's "available now", a waitlist, or "coming soon".
Share whatever you have, in any form: docs, links, or a quick brain dump. I'll write two or three script directions, each with its timing and the music it needs, and then we'll pick the song that fits.
Worked · 2 steps
- Edit SCRIPT_CUES.md
- Edit SCRIPT_CUES.md
I've added ElevenLabs to inspo/SCRIPT_CUES.md as a fourth reference. It has a full cue sheet, and it's in the comparison table alongside Rippling, Attio and Raycast.
ElevenLabs Reception (33s), in short
| Time | Beat | On screen | Music / SFX |
|---|---|---|---|
| 0–12.8 | The problem, three times: "Someone's calling / to make an appointment… / to book a job… / to schedule a meeting… / but nobody's around to pick up" | Words scattered among floating 3D objects. Between each line, a pixel wipe to a phone ringing on a blue halftone background. The last line pulls all the objects together | Steady groove; a glitch stutter and phone ring on each wipe |
| 13 | "Until now." | Full colour change: cream and blue switch to a red-orange orb on black | The biggest energy lift, though not a beat drop |
| 14.5–22.5 | The product shown as a conversation | Orb → sun → green/blue blur, with a real booking exchange appearing as chat bubbles | Groove |
| 23–28.5 | The claim, then the lineup | "Stop missing calls and opportunities" → three agent cards | |
| 29.5–33 | Logo | Reception.ai by ElevenAgents | Tail |
It does have a voiceover, but every spoken line also appears on screen, so the structure still works without the voice. The phones and the colour change carry the turn.
What each reference is good for:
| Reference | Technique to borrow |
|---|---|
| ElevenLabs | Open on the customer's problem (a scenario repeated three ways), turn on "Until now.", and show the product as a conversation |
| Rippling | A drop on the product name, the demo, proof points, a tension section where the bass drops out, a logo hit |
| Attio | "Every X…" lists and "Ask X to…" sentence completion |
| Raycast | Slams on cuts and a quick run of feature names |
That's a menu of building blocks for the Mila script. Send the Mila context whenever you're ready.
Worked · 22 steps
- Browser: tabs context mcp
- Browser: navigate
- Browser: computer
- Browser: computer
- Browser: computer
- Browser: get page text
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Take full-page headless screenshots of capchase.com pages
- Split screenshots into viewable halves
- Read home_root_a.jpg
- Read home_root_b.jpg
- Capture and crop lower sections of capchase.com
- Read full_c.jpg
- Read full_d.jpg
- Browser: javascript tool
- Browser: navigate
- Browser: get page text
- Browser: tabs close mcp
- Write CAPCHASE_BRAND.md
Browser screenshots are failing, so I'll pull the text and computed styles straight from the page, and take screenshots another way afterwards.
The fonts and colours are clear: ABC Diatype plus Diatype Semi Mono, navy text, a near-black background, and a violet accent. Getting the remaining details (headings, buttons, CSS variables, logo).
Now the visual feel. Taking full-page screenshots locally with headless Chrome, since the extension's screenshot isn't working.
That covers the top half. Getting the lower half, where the "Powered by Capchase AI" and stats sections are.
Last, the About page and the "Capchase AI" page, which is likely where Mila fits.
I've been through capchase.com (home and About) and saved notes on the company, tone, brand and problem to inspo/CAPCHASE_BRAND.md.
The company and the problem
- Vendor financing for enterprise tech. Capchase lends to the buyer, pays the vendor or reseller up front and in full, and gives the buyer flexible terms. The positioning is "the only platform that's both the lender and the technology."
- The tension they describe: vendors want to be paid early and buyers want to pay late, so financing becomes a "friction point" in the deal. Today that means multi-day underwriting, paperwork and email threads, in "a workflow that hasn't changed since the 1980s."
- Their framing: "Financing should be a sales lever, not a bottleneck."
- Proof points: 97% of decisions in under 30 seconds, deal win rates up 25–40%, AOV up 25–45%, $2B+ financed, 100% of vendors paid on time in 2025, all inside Salesforce.
- One thing to confirm: the About page says that in 2026 Capchase "launched Agentic Lending Coordinator" for Fortune 500 clients like Palo Alto Networks, Barracuda, CDW and Insight. I'm guessing that's Mila.
Tone of voice
- Speed is the idea everything hangs on: "Vendor financing at the speed of tech." "Minutes, not days." "Weeks to hours."
- Short, paired headlines: "Powered by Capchase AI. / Configured by you." and "Increase win rate, deal size, and velocity. / Without discounting."
- Confident and plain-spoken B2B. Numbers do the persuading, with few adjectives and no hype.
Brand
- Fonts: ABC Diatype for headlines, in a 500 weight with tight letter-spacing. ABC Diatype Semi Mono for small labels like "For Sales", "DEAL SIGNED" and "SECURE BY DESIGN".
- Colours: navy text
#17203A, a near-black#02051Afor dark panels, an off-white#F6F7FAbackground, and one violet accent,#7352F6. Pastel tag colours and soft gradient washes sit behind floating UI cards. - Recurring UI motifs: a payment-plan selector (Monthly / Quarterly), a "Financing approved → Deal created → Paid" status timeline, "Approved" badges, the Salesforce quote widget, and currency pills.
- The hero section already opens on a buyer chat bubble: "Hey, can I pay monthly for this contract?"
How this connects to the references
- The look: off-white editorial scenes (Attio, Claude) plus near-black scenes with a violet glow (Rippling, Raycast) fit the palette without forcing it.
- The type: Diatype for the kinetic headlines and Semi Mono for agent status lines and a Raycast-style feature list.
- The story: the buyer's question "Can I pay monthly?" is a natural opening scene, much like ElevenLabs' "Someone's calling…" or Rippling's typed question. Their "speed" message suits a hard music drop.
Ready for the Mila article whenever you are.
Worked · 2 steps
- ToolSearch
- mcp__claude_ai_Figma__authenticate
Not yet. The Figma connector is installed in this session but isn't signed in. The easiest fix:
- Type
/mcpin this prompt. - Select "claude.ai Figma" and sign in in the browser window that opens.
- Tell me when it's done.
Once you're connected, I can read that file directly: frames, components, colour and type styles, and exported images of node 1103-5345. That's the best option, because I get the real design data (exact styles, layers, assets) rather than just pictures.
If you'd rather not connect it, two fallbacks:
- Export from Figma: select the frames, export them as PNG or SVG, and drop them into
inspo/figma/in the project. - Through Chrome: if you're logged in to Figma there, I can open the link in your browser. But this session's screenshots have been failing, so I'd only see the page structure, not reliable visuals.
Worked · 45 steps
- ToolSearch
- Browser: tabs context mcp
- Browser: navigate
- Browser: computer
- Browser: computer
- Browser: tabs context mcp
- Browser: computer
- Browser: find
- Browser: get page text
- Browser: computer
- Browser: computer
- Browser: computer
- Browser: computer
- Browser: computer
- Browser: computer
- ToolSearch
- Browser: browser batch
- Browser: browser batch
- Browser: computer
- Check Downloads for the exported PNG
- Browser: computer
- Recheck Downloads for the export
- Move exported Key Visuals into project brand folder
- Browser: browser batch
- Browser: browser batch
- Browser: browser batch
- Browser: browser batch
- Browser: browser batch
- Browser: computer
- Check Downloads for logo, Mila frame, LP exports
- Organize exported Figma assets into inspo/brand
- Extract logo SVG and check its fills
- Split full LP export into four viewable sections
- Read lp_0.jpg
- Read lp_1.jpg
- Read lp_2.jpg
- Read lp_3.jpg
- Crop Gmail compose and hero UI for close reading
- Read gmail.jpg
- Read hero_ui.jpg
- Crop key-visual tiles and build a check montage
- Read tiles.jpg
- Sample colors from brand key-visual tiles
- Browser: tabs close mcp
- Edit CAPCHASE_BRAND.md
The Figma connector still isn't authorized, so I'll use your Chrome session.
Screenshots keep failing in this browser session, and Figma draws its designs on a canvas, so I can't just read the page. I'll see what the layers panel exposes.
Scaled-down screenshots work. Figma is still loading the file.
The page has two parts: LP, the full 2026 landing page with a Mila section, and Key Visuals, a grid of brand imagery. Zooming into Key Visuals first.
The Key Visuals export worked. Moving it into the project, then exporting the Mila landing-page section and the logo.
The logo already has an SVG export preset. Exporting it, then the Mila LP section.
All three exports landed. The logo came as a zip. Moving everything into the project and unpacking it.
Logo saved as a clean SVG in #02051A. Now I'll review the full 2026 landing page, which is 11,634px tall, in sections.
The 2026 landing page has plenty of Mila material. One detail I need to read up close: the Gmail compose window in the "We meet you where you already work" section.
The email is addressed to mila@capchase.com, so Mila can be emailed directly. Cropping the "Mila" wordmark tile and a few key-visual tiles as separate reference files.
Sampling exact colours from the tiles (the violets, the Mila peach gradient, the dark panels).
I've been through the Figma file and saved the references to inspo/brand/. I also added a 2026 section to inspo/CAPCHASE_BRAND.md.
Saved files
key-visuals.png: the full key-visual grid, 3560×2160lp-2026-full.png: the whole new landing pagelp-mila-section.png: the "Meet Mila" sectioncapchase-logo.svg: the vector logo, which we can animatetiles/: individual crops of the Mila wordmark, the violet "speed of tech" tile, the Mila prompt card, the Semi Mono alphabet, and the 10x and $2B+ number tiles
What's in it about Mila
- "AGENTS — Meet Mila - the intelligent agent that automates vendor financing."
- The Mila wordmark visual: white "Mila" on a grainy peach-orange gradient, with a frosted-glass band blurring the bottom half of the letters. That would make a strong logo reveal if the band sweeps across the word.
- The hero: a file chip, "Acme Corp - Proposal.pdf", dragged onto a prompt: "Create a payment link for Acme Co, paid monthly for 12 months based on the attached quote".
- Mila is reachable by email. The "We meet you where you already work" section shows Email, Salesforce, Slack and Teams, with an email to mila@capchase.com reading "Could you please approve my buyer… and prepare a payment link for $120k split monthly over 1 year?".
Product scenes we can rebuild in the video
- The app home: "Good afternoon, John / Ask Capchase anything", with three suggested actions: qualify a buyer, generate a proposal, create an order from a document.
- Approve → Proposal → Payment link: an approval chat, a "Proposal for Acme" card with Monthly/Quarterly and 30/90-day options, and an Atomic Inc $45,000 → $3,750/month "Pay now" card.
- An interest calculator: $20k deal, buyer pays $1,666.67/month, seller receives $18,000 up front.
- A dark stats band: 97% approved within 30 seconds · 5x more deals won · 4 to 17x faster deal closure · 99% reconciliation accuracy.
What changed visually in the 2026 design
- Buttons are now black pills. Violet has moved into gradients and accents.
- Small labels are uppercase in Diatype Semi Mono with wide letter-spacing: AGENTS, SOLUTIONS, USE CASES, and so on.
- The gradient palette (sampled): violet
#DADBFA → #8167FF, deep violet#5A25DF, Mila peach#FCD09A / #ED9876, prompt blue#C1D6F4 → #5E8ECE, and dark panels#232940with a violet glow. - Thin white line art (concentric arcs and diagonal line bundles) sits over the gradients. It'd be easy to animate.
Ready for the blog post. Then we can start on the script.
Pasted text · 20 lines
Worked · 1 step
- Write SCRIPT_DRAFTS_v1.md
I'll write three script directions. Each is built from the blog post's actual claims and borrows a different reference structure, so you can pick one or mix them. I'm saving them to the project too, so we can version the drafts as we go.
I've written three 60s directions, saved in script/SCRIPT_DRAFTS_v1.md with full second-by-second tables and music cues. Every on-screen line comes from the blog post. Here's each in short.
A · "Before midnight" (ElevenLabs problem triad, then Rippling's drop, bass-out and logo hit)
It's the night before quarter close, the buyer wants to pay monthly, and Mila gets it done before midnight.
- 0–10s:
THU · 11:42 PM, "The deal is agreed." Then the buyer's bubble: "Hey, can I pay monthly for this contract?" Then "Log into the portal. / Fill in the forms. / Email finance. Wait." with windows piling up, andQUARTER CLOSES IN 18 MIN. - 10–11s: "Meet" on black, in silence. DROP on "Mila", then "Your always-on AI deal desk."
- 14–24s: "Forward her a quote." (Gmail to mila@capchase.com) / "Mention her in Slack." / "Or open finance.new." Each line lands on a slam.
- 24–36s: Status lines
READING QUOTE ✓ CHECKING BUYER CREDIT ✓, then "Quote in. Proposal out.", then "What would it take to keep this under $2,500 a month?" with the card re-pricing live, then "Ready to sign." - 36–43s:
NO PORTALS · NO FORMS · NO SETUP · NO LEARNING CURVE · 24/7 - 43–52s, bass out: "Something needs a person? She hands it over. With the context." Then
11:58 PM, "Has the buyer signed?", "Signed ✓" - 52–60s: "Need financing?" on silence. Logo hit: "Just talk to Mila." with the Mila wordmark and finance.new.
B · "Just ask" (Attio: no beat drop, built on lists)
Everything a financing deal needs is now one sentence away.
- finance.new and "Price this quote for Acme" → "Every quote. / Every credit check. / Every proposal. / Every payment link. / and every…" → "Has the buyer signed?" → "…is now one question."
- On silence, then a long bass swell: "Ask Mila."
- "Ask Mila to price this quote / to check buyer credit / to keep it under $2,500 a month / to send the payment link / to hand it to legal" → "Over email. In Slack. At finance.new." → "Vendor financing just got a whole lot faster."
C · "One conversation" (Claude/Rippling: one deal, one continuous camera move)
From a Slack message to a signed payment link without leaving the thread.
- "Financing a deal shouldn't take longer than selling it." → Slack: "Acme wants 12 monthly payments… @Mila can you set it up?"
- Silence, then the beat drops as Mila replies → status checks → proposal card → "under $2,500 a month?" re-prices it → payment link → the same conversation moves Slack → Gmail → finance.new
- Bass-out section for the legal handoff and "Signed ✓" → logo hit with "Ask Mila to price it →"
My take: A has the most story and the most energy, and it uses your two favourite structures (Rippling and ElevenLabs). Its countdown also gives the "speed" message real stakes. C is the clearest product demo. B is the most elegant, but it only works if we build the music from stems.
A possible mix: A's opening and countdown with C's single continuous conversation in the middle.
Music, which follows from the choice:
- A and C: Autophagy, Terminal Velocity, Are We Doing This or Not Again. They all need an intro under 10s, then silence and a drop at 11s.
- B: a stems-based bed.
A few things I need from you:
- Do we keep "she/her" for Mila on screen, as the blog does?
- Is finance.new live and the main call to action?
- The deal numbers in the UI ($45k → $3,750/month → $1,875 over 24 months) are placeholders. Are fictional numbers OK?
- Should customer names be fictional (Acme, Atomic), or real logos?
- Where does Capchase branding appear: throughout, or only as the endorser at the end?
Which direction do you want to push, or what should we take from each?
Worked · 2 steps
- Organize shortlist into full tracks and 60s cuts, open folder
- Write SCRIPT_DRAFTS_v2.md
Agreed. v1 reads like an infomercial: problem, then a solution, then a list of features, then "but wait, there's more" stacked claims, a gimmicky countdown, and too many instructions ("Forward her a quote. Mention her in Slack."). The references do the opposite. Attio has about 15 lines and one idea. Raycast is almost wordless. Rippling has a wry, human voice ("Holy shi—", "Nice try."). So v2 follows these rules: one idea per film, at most about 12 lines of on-screen copy, the product carries the story, and the call to action appears once.
First, I'll put full-length versions of the shortlist tracks next to the cuts so you can hear the complete songs.
The music is in music/shortlist/, now open in Finder:
full tracks/: the six complete songs, numbered by preference (Terminal Velocity, Autophagy, Come Closer, Them Thieves, Are We Doing This, Not Again)60s cuts/: the same six cut to 60s
These are Epidemic's preview-quality files. We'll download the full-quality versions once we pick one.
The scripts. I agree v1 sounded like an infomercial: a problem, then a list of features, then more claims, a countdown gimmick, and lots of instructions. The v2 rules: one idea per film, at most about 12 lines of headline copy, and most on-screen words are the product itself. That means real questions people type to Mila and her replies. The call to action appears once. There are four new directions; the full tables are in script/SCRIPT_DRAFTS_v2.md.
D · "Just ask" (like Raycast: almost wordless) · Financing used to be a process. Now it's a question.
"Can Acme pay monthly?" → Mila: "Yes. Credit's approved. 12 × $3,750." → "Can we get it under $2,500?" → black, silence → drop, as the card re-prices to $1,875/mo → "Meet Mila." → a fast montage of real requests across Slack, email and finance.new, one per beat → "Vendor financing, in one conversation." → bass drops out:
SUN · 11:48 PM"Quarter closes tonight. Can we still get this signed?" → "Link's ready. Sending it now." → logo hit. 3 headline lines.
E · "Always on" (a montage where the clock tells the story) · Deals don't keep office hours.
The same question and the same instant answer, over and over, with only the timestamp changing:
TUE 3:12 PM→WED 8:02 AM→FRI 6:47 PM→SAT 1:15 AM"sorry for the late one" → "No problem. Here it is." →QUARTER END · 11:52 PM"Has the buyer signed?" … long pause … "Signed."11:57 PM2 headline lines. The timestamps carry the humour.
F · "One sentence" (like Attio: one continuous transformation) · The whole process is now a sentence.
"@Mila Acme wants to pay monthly." Each word unfolds into part of the deal: Acme becomes the credit check, pay the proposal, monthly the payment schedule, the full stop the payment link. They snap together into a finished deal → "That used to take weeks." → "Now it's a sentence." with the Mila wordmark. 4 headline lines. The most design-led of the four; the music would be built from stems.
G · "Re: Re: Re:" (Rippling's wry tone, using the blog's own subhead) · The old way is a thread nobody wants.
Email subjects pile up: "Re: Re: Re: Fwd: docs v4_FINAL_final.pdf", portal tabs multiply, then the buyer: "Any update?" → it all collapses into one empty input → drop: "@Mila can Acme pay monthly?", answered instantly → "Less back-and-forth." / "Fewer tabs." → the deal finishes in a few short messages → logo. 4 headline lines. The most relatable for salespeople, and it has a real joke.
My picks: D is the most premium, and G has the strongest hook. A combination worth trying: G's opening, then D's montage, then E's late-night ending.
Which ones work for you, and which lines don't sound like Capchase?
Worked · 2 steps
- Detailed per-second structure of Terminal Velocity
- Inspect later sections and exact onsets in Terminal Velocity
Agreed: problem in the first 10–15s, then the drop, and the rest on Mila. Before I re-cut it, I'll map exactly what happens around 25s in Terminal Velocity. The full track has a first bass drop there, then a bigger full drop at about 36s.
Pasted text · 4 lines
Worked · 4 steps
- Write tv_edit.py
- Render two problem-first Terminal Velocity edits and plot them
- Read tv_g.png
- Write SCRIPT_G_v3.md
I've mapped script G onto Terminal Velocity so the problem lasts 12.5s and the remaining 47s show Mila. The full beat-by-beat version is in script/SCRIPT_G_v3.md, and the two new music cuts are in music/shortlist/60s cuts/.
The cut (TV-G1): it starts on the track's first bass step, so the film opens on a hit. The tense bass plateau and riser run under the problem, and the main drop lands at 12.5s. Later, I splice into the build before the track's big slam at 110s, so the logo hit lands at 52.4s. The track's real ending is the tail. TV-G2 is the same edit with a 2.5s quiet opening and the drop at 15s.
Script G on that cut
| Time | Music | On screen |
|---|---|---|
| 0.0 | bass hit | "Financing request – Acme" lands in the inbox |
| 0–9.6 | tense bass plateau, one pulse per beat | A new subject line every beat: "Re: Re: …" · "Fwd: credit application" · "docs_v4_FINAL_final.pdf" · "Updated terms??". Dates move from Monday to Thursday and portal tabs pile up. At 7.6s the buyer: "Any update?" |
| 9.6–11.8 | riser | the clutter speeds up and gets pulled to the centre |
| 11.8–12.4 | near silence | it all collapses into one empty input → "@Mila can Acme pay monthly?" |
| 12.5 | main drop | Mila replies instantly: "Yes. Acme's approved. 12 × $3,750." |
| 14.6 / 17.6 | slams | "Less back-and-forth." / "Fewer tabs." |
| 17.6–33.6 | a slam every ~3–4s | The deal finishes in short messages, one per slam: "Make it quarterly." · "Legal wants to see the terms." → "Sent to legal, with the context." · "Keep it under $2,500?" → "24 months: $1,875." · "Send it to Acme." → Pay-now link. Then the same conversation moves from Slack to email to finance.new |
| 36.6–48.6 | thinner section | "Financing shouldn't take longer than the deal." → buyer side: "Acme opened the link" … "Signed." |
| 48.6–52.3 | build | the wordmark's colours start glowing in |
| 52.4 | big slam | Mila, with the frosted band sweeping across it |
| 54–60 | the track's own ending | "Your always-on AI deal desk." · finance.new · Capchase |
Mila's name first appears as @Mila, in the message that triggers the drop, and only in full at the logo hit. That keeps the "Meet Mila" moment from feeling like an ad.
When you listen, check two things:
- 12.5s or 15s for the drop? G1 gets to Mila faster. G2 lets the opening breathe.
- The section after 36s is still pulsing, so it's less of a breather than Rippling's bass-out. If it feels too busy under "Signed.", I can thin it out with the stems once we have the full-quality files.
A few copy choices are listed at the bottom of the doc. For example, the buyer could say "Any update?" or the more passive-aggressive "Just checking in on this 🙂".
Worked · 46 steps
- Load skill hyperframes
- Load skill hyperframes-cli
- Check Node and HyperFrames environment
- Scaffold HyperFrames project with the TV-G2 audio
- Read scaffolded project files
- Browser: tabs context mcp
- Browser: navigate
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Download SFX candidate previews and measure them
- Render spectrogram grid of SFX candidates
- Read sfx_grid.png
- Cut SFX one-shots into the project's assets/sfx
- Browser: tabs close mcp
- Measure drop, slams, and beat grid in the G2 cut
- Find Diatype font-face declarations on capchase.com
- Download Diatype and Diatype Semi Mono font files
- Load skill hyperframes-core
- Read sub-composition wiring reference
- Write DESIGN.md
- Organize music and logo into project assets
- Write index.html
- Apply typed-slot and scene-crossfade fixes to index.html
- Write sfx_cues.py
- Inject SFX cues and lint the composition
- Fix initial-visibility error and run full check
- List layout errors from inspect
- Apply layout/contrast fixes and re-run check
- Mark intentional overlaps, fix PDF icon contrast, re-check
- Look up the correct overlap-suppression attribute
- Mark specific layered text blocks and re-run check
- Check snapshot command options
- Capture 18 key-frame snapshots
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Fix number spacing and band, check, render v1 MP4
- Verify render streams, loudness, and SFX audibility vs music
- Isolate SFX level relative to music in render
- Loudness-match SFX files and set category levels
- Boost SFX files +8 dB with limiter and set per-category levels
- Re-render v1 and re-measure SFX balance and loudness
- Nudge SFX levels, final v1 render, start Studio preview
On licensing: not yet, as things stand. Two things have to happen before launch:
- Your Epidemic plan. The account shows Creator, and Epidemic's Creator terms exclude "digital advertising, marketing, or promotion for a brand or company." A Capchase launch video is exactly that, so it needs Business or Enterprise. The same licence covers the sound effects.
- The files. I'm working from Epidemic's low-quality preview MP3s. The final has to use the licensed download (full-quality WAV and stems), taken from the account once the plan covers commercial use.
"Royalty-free" on Epidemic means no per-play royalties within your plan's licence, not free for any use. For this draft (internal only) the previews are fine. Before publishing, upgrade the plan, then download and swap in the licensed files. Everything stays the same apart from the files.
Thanks for the confidence. Starting the HyperFrames project now.
The environment is fine (the only missing pieces are optional TTS and music generators). Scaffolding the project with the TV-G2 cut as its soundtrack.
The SFX search endpoint is /json/search/sfx/. Running one query per sound in the plan: typing, clicks, notification pops, whooshes, sub hits, ticks, success chimes, glitches and a logo shimmer.
The titles are long category strings, so I'll export just the IDs (top 4 per category), download the previews, and choose by measuring them locally.
All 48 downloaded. Next, a spectrogram grid so I can pick clean, modern-sounding ones (not sci-fi or game-like) and find good one-shots in the longer recordings.
Now the timing grid for the TV-G2 cut. I'm measuring every beat, dip and slam so the visuals land exactly on the music.
All assets are in place: music, 17 SFX one-shots and the brand fonts. Before writing the scenes, I'll load the composition contract so the project structure is right.
Moving the music and logo into assets/, then writing the composition.
Now the sound-design cue sheet. It's a small script that writes every SFX <audio> tag on the beat grid and keeps overlapping sounds on separate tracks.
Check passes with 0 errors. Before rendering, I'll snapshot key frames and look at them.
Rendered: 60s, 7.9 MB, 41 seconds. Checking the output: video frames, that the audio is present, and that the SFX actually sit in the mix.
Those numbers aren't comparable: the renderer mixes the music lower than my reference copy. I'll fit the music's gain first, then isolate what's left (the SFX).
Worked · 3 steps
- Get Studio preview URL and open the render
- Find Studio port from preview log
- Edit mila-video-direction.md
Understood. The SFX stay as a rough pass from here, and the focus moves to script, look, animation and sync to the song. Getting the Studio link.
v1 is rendered and I've opened it for you: video/renders/mila-v1.mp4 (60s, 1080p, 30fps). The editable project is in Studio at http://localhost:3002/#project/video. npx hyperframes check passes with 0 errors.
On licensing: under your current Epidemic plan, no. Creator excludes company marketing, so publishing needs Business or Enterprise. This draft also uses Epidemic's low-quality preview files. Once the plan is upgraded, we download the licensed track and SFX and swap them in. Nothing else in the project changes. Same for the fonts: they're Capchase's ABC Diatype web files, so check that the font licence covers video before release.
What's in v1 (script G on the TV-G2 cut)
| Time | Beat in the song | On screen |
|---|---|---|
| 0–2.5 | quiet opening | An empty inbox window fades in on a soft violet/peach wash |
| 2.53 | first bass hit | "Financing request – Acme renewal" lands |
| 2.5–8 | a pulse every beat (0.77s) | One email per beat, Re: Re: … · docs_v4_FINAL_final.pdf · Updated terms??, while the inbox count climbs and dates run Mon → Thu |
| 8.7 / 9.4 / 10.2 | beats | Portal tabs pile on top: Log in · Step 3 of 7 · Session expired |
| 11.17 | beat | Buyer: "Any update?" |
| 12.1–14.3 | riser | Six more emails land fast, the window pushes in, then everything collapses to a point |
| 14.0–14.9 | near silence | The Mila input appears and types "@Mila can Acme pay monthly?" |
| 15.00 | drop | Sent. Mila replies "Yes. Acme's approved." and $45,000 rolls down to $3,750/month |
| 18.19 / 20.46 | slams | "Less back-and-forth." / "Fewer tabs." |
| 23.3 · 25.8 · 30.3 · 33.1 | slams | One exchange per slam: quarterly → legal handoff → under $2,500 ($1,875 × 24) → payment link with "Pay now" |
| 37.1 / 37.9 / 38.6 | beats | Channel chips light up in turn: Slack · Email · finance.new |
| 39.2–49 | thinner section | Palette flips to dark. "Financing shouldn't take longer than the deal." lands word by word, with "the deal." on the 41.6 slam. Then 2:14 PM Proposal sent → Link opened → 2:26 PM Signed |
| 49–52.7 | build | Peach glow blooms in |
| 52.77 | logo hit | Mila, with the frosted band sweeping up through the letters |
| 54.4 · 56.6 | ending | "Your always-on AI deal desk." · finance.new · capchase |
Sound: rough, as you asked. There's a soft pop per email, a ping on "Any update?", a suck into the collapse, typing, clicks and sends, and a riser into the sub hit on the logo. Levels are balanced, but I'll leave sound alone now.
Things I'd expect you to want changed:
- The thread UI is small in the frame, about 1100px wide. The references fill the frame more and push the camera in on the details.
- The camera is static. Raycast and Linear push in and drift constantly. Moving the camera with the cursor would make it feel much more premium.
- The 23–37s stretch is four exchanges in the same layout. It may feel repetitive, even with each one on a slam.
- The dark section's copy is the blog line. It's the most "claim-y" moment left.
Watch it and tell me what lands and what doesn't: script, look, animation, or the sync to the song. A rough "this part drags" or "this looks cheap" is enough to work from.
Worked · 1 step
- Open shortlist music folder and list its files
I've opened the music folder in Finder: /Users/gulipad/dev/mila-launch-video/music/shortlist/
music/shortlist/
├── full tracks/ ← complete songs (Epidemic previews)
│ ├── 1 - Terminal Velocity - Cospe.mp3
│ ├── 2 - Autophagy - Timothy Infinite.mp3
│ ├── 3 - Come Closer, Don't Speak - Tigerblood Jewel.mp3
│ ├── 4 - Them Thieves - Ava Low.mp3
│ ├── 5 - Are We Doing This - Hank Lotion.mp3
│ └── 6 - Not Again - dreem.mp3
└── 60s cuts/
├── TV-G2 - Terminal Velocity - drop 15s, logo hit 52.8s.mp3 ← used in v1
├── TV-G1 - Terminal Velocity - drop 12.5s, logo hit 52.4s.mp3
└── A1–A4, B01, B07 … (older cuts with the hit at 42s)
The video uses a copy of TV-G2 at video/assets/music/terminal-velocity-g2.mp3.
Worked · 17 steps
- Survey the Edith HyperFrames project structure
- List Edith compositions and read its motion pass notes
- Locate Meet/bubble scenes and list Edith renders
- Build 4fps contact sheets of the Edith render
- Read sheet02.jpg
- Read sheet03.jpg
- Read sheet05.jpg
- Read sheet04.jpg
- Read the bubble-scroll scene's animation code
- Read Edith root transitions and Meet Mila scene code
- Read Meet Mila scene code and s8 click-wipe snippets
- Load skill hyperframes-animation
- Read animation rules index and transition catalog
- Read blueprint index and three key motion rules
- List skills and read the prompt-submit blueprint
- Check what the "synced" skill is
- Check font/asset paths in Edith sub-compositions
I'll start by studying the Edith project for the techniques you called out, then the animation skill, then rebuild with a proper camera and motion system tied to the beat grid.
An important structural difference already: Edith has 10 scenes in 45s, each 3.5–6s, overlapping by 0.3–0.6s. We have 4 long scenes. I'll look at its latest render frame by frame.
Worked · 26 steps
- Build 8fps contact sheets of the Attio video
- Read sheet01.jpg
- Read sheet02.jpg
- Read sheet03.jpg
- Read sheet05.jpg
- Read sheet06.jpg
- Read sheet04.jpg
- Back up v1 and write the v2 motion plan
- Write index.html
- Read index.html
- Diff on-disk index.html against my v1 backup
- Write index.html
- Fix camera conflict, retime rough SFX, lint
- Move v1 backup out of project root and run full check
- Fix status text paint, contrast, overlaps; re-check
- Capture 36 key-frame snapshots of v2
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Read contact-sheet-3.jpg
- Read contact-sheet-4.jpg
- Rebuild camera as nested GSAP layers and apply visual fixes
- Review remaining warnings and re-snapshot the fixed moments
- Shorten check pop to remove tween overlap; list snapshots
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Final check and confirm Studio preview is running
The file changed on disk since my last edit. Studio rewrites the file (it adds IDs and reformats), but you may also have edited something there. Checking what changed before I overwrite anything.
The only differences are Studio's data-hf-id stamps, with no edits from you, so it's safe to overwrite. Writing v2:
Check passes. Next, a dense set of snapshots to review the motion frame by frame.
Camera fix and polish are in, and the check passes. Reviewing the re-captured frames.
v2 is live in Studio: http://localhost:3002/#project/video (it hot-reloads, so refresh the page). The check passes. v1 is saved at versions/index-v1.html.
What I took from the references
- Attio (studied frame by frame): one focal point and small type, and every transition is a morph of what's already on screen. The UI falls away around a typed question and leaves it as a chip, a dot grows to fill the frame, words swap in place, a black panel wipes in. The camera punches in on beats and never sits still.
- Edith: "Meet ___" built from a glowing orb, clicking into a text box with a camera push, and a fast bubble scroll with motion blur.
v2 against the beats of the song (full map in script/MOTION_V2.md)
| Time | What happens |
|---|---|
| 0.3 → 2.53 | One email row builds itself from a blank screen, then the camera punches in on the bass hit |
| 3.3–9.4 | A new "Re: Re:" row lands on every beat with a small camera kick, and the camera eases back as the pile grows |
| 8.7–10.2 | Portal pop-ups whip in with motion blur |
| 11.17 | The thread blurs behind the buyer's "Any update?" |
| 12.1–14.2 | Riser: the thread pours in endlessly, accelerating, with vertical motion blur |
| 14.3 | Everything collapses into a single cursor |
| 15.00 | Drop: the cursor blooms into the Mila orb, with ripple rings, and "Meet Mila." slams in |
| 16.5 | The orb docks into an input that stretches open sideways |
| 18.19 | Cursor click and punch-in; the PDF drops in and "Can Acme pay monthly?" types out |
| 20.46 | Send: the UI falls away and the question floats up as a chip. Status words swap in place: Reading the quote → Checking Acme's credit → Pricing 12 months |
| 23.29 | The answer card lands: Approved · $3,750/month |
| 25.84 | "Keep it under $2,500?" The number rolls to $1,875 and 12 becomes 24 months |
| 28.1 / 29.67 | "Send it to Acme." The card turns into a payment link, and the buyer's cursor clicks Pay now: Signed ✓ |
| 30.27 | A dark panel wipes in, then a ticker of 12 real requests along a ruler, accelerating into a horizontal blur |
| 33.11 | Hard stop on "Just ask." |
| 36.3–37.9 | "Ask Mila in [Email → Slack → finance.new]", with the chip swapping on each beat |
| 40.1–45.6 | Always on: a big timestamp rolls on each slam (Tue 3:12 PM → Fri 6:47 PM → Sun 9:30 AM → Quarter end · 11:58 PM), each with an instant exchange under it |
| 47.62 | "Has Acme signed?" → Signed. ✓ |
| 49 → 52.77 | The ✓ turns peach and grows to fill the frame, then the Mila wordmark lands on the hit with the frosted-glass band sweeping up |
| 54.4 / 56.6 | "Your always-on AI deal desk." · finance.new · Capchase |
Fixed along the way: the virtual camera had a bug where zooms rendered a step late when you seek in Studio. It's rebuilt now, so punch-ins land exactly on their beats. I retimed the rough SFX to the new events but didn't spend time on them.
What I'd look at first:
- 0–2.5s: the opening row is left-aligned in a wide column. Attio would centre it.
- The answer card (23–30s) is the most "UI-screenshot" moment left. It could morph more, for example the card growing out of the status line.
- The script: "Just ask." and the always-on timestamps are new lines. Tell me if they sound like Capchase.

Worked · 14 steps
- Check git status and sizes of media folders
- Initialize git repo and make the first commit
- Sample gradient colors and grain from the reference image
- Rebuild the end card in the violet key-visual style
- Snapshot the new end card sequence
- Read contact-sheet-1.jpg
- Find where snapshots were written
- Read contact-sheet.jpg
- Fix wordmark offset, resize lockup, re-snapshot and crop grain
- Read contact-sheet.jpg
- Read grain_crop.png
- Boost grain and measure noise level in a flat area
- Read grain2.png
- Run check and commit the end card polish
I'll commit the current state first, then rebuild the final screen in that key-visual style: violet gradient, the diagonal light on the left, grain on the background only, crisp white type, and an animated background.
Committed: a6c9f71 on main. Next, sampling the reference image's colours so the gradient matches exactly.
The grain now shows clearly at full resolution and stays off the type. Running the check and committing.
I've rebuilt the end card in the style of your reference and removed the frosted band. It's committed and live in Studio (refresh http://localhost:3002/#project/video, around 48–60s).
Commits (the project wasn't a git repo, so I initialised one on main):
a6c9f71: v2 as you reviewed itfd53663: the new end card
The .gitignore leaves out the reference videos, the Epidemic preview library, renders and snapshots, about 340MB of media. The project, notes, brand assets, fonts and SFX are committed.
The end card
- Background:
- Colours sampled from your image: pale lavender on the left (
#D3D4FC) ramping through#B4B2F9 → #8075F7 → #6C53F6on the right. - The light: a soft diagonal shape leaning in from the left. It slides in during the build (49–52.7s), then keeps drifting slowly, with a deeper violet glow moving bottom-right.
- Grain: animated, on the background only. Measured at about ±3.5 levels of noise, so it should still read after video compression. The type sits above it and stays clean.
- Colours sampled from your image: pale lavender on the left (
- Transition in: the green ✓ from "Signed." turns violet, and the end card opens out of it in a circle from the centre.
- On the hit at 52.77: "Mila" lands big in the centre and the light flashes. At 53.75 it glides up to the top-right and docks as the lockup "Mila / by »capchase".
- 54.4: "Vendor financing at / the speed of tech." rises line by line, bottom-right, as in your image. "Your always-on AI deal desk." is gone.
- 56.6:
✦ finance.newappears bottom-left in navy Semi Mono, on the light side.
Two choices to check while you watch:
- The finance.new placement. Bottom-left on the light side gives it contrast and balances the tagline, but it's the one element your image doesn't have.
- The lockup. Right now it reads "Mila by capchase". The alternative is Mila alone, with the Capchase logo as a separate mark like in your image.
What's next on the polish list?
Worked · 11 steps
- Locate S1 sections and pill references in index.html
- Read index.html
- Rewrite scene 1 opening: cracking headline, re-timed inbox, day counter
- Apply scene 1 rewrite and run the check
- Fix ghost contrast, check, and snapshot the new opening
- List snapshot contact sheets
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Collapse hidden word, resize headline, re-check and snapshot
- Read contact-sheet.jpg
- Retime opening SFX, check, and commit
Plan for the new opening, mapped to the song:
- 0.3–2.5 (quiet intro): "Software and hardware financing" types out on its own, centred, in Attio's minimal style.
- 2.53 (first bass hit): "is broken." slams in, and the whole line cracks in half on the hit. The top and bottom halves shear apart with a split-colour glitch, then jolt again on the next two beats.
- 4.83: the halves split apart and the first email row comes out of the crack. The inbox you liked takes over from there, one row per beat.
- The portal pop-ups are gone. In their place, one quiet mono counter, "ACME RENEWAL · DAY 01", rolls up a day per email until it lands on DAY 14 in red. It reads as "stalled" without any clutter.
- "Any update?", the endless scroll, the collapse to a cursor, Meet Mila and the move into the chat all stay as they are.
Rewriting scene 1: the HTML for the cracking headline and day counter, its CSS, and its timeline. The email pile code stays; only its timing moves later to follow the headline.
The first replacement had already swept out the old blocks, so my extra removal step failed and nothing was written. Re-running without that redundant step:
These contrast warnings come from the red colour-ghost layer, which is decorative and on screen for only about 0.2s. I'll darken the ghost red slightly so it passes, then review frames.
The new opening is live in Studio (refresh http://localhost:3002/#project/video) and committed as c52f91b. Meet Mila and the move into the chat are unchanged.
The first 15 seconds
| Time | Music | What happens |
|---|---|---|
| 0.45–2.4 | quiet intro | "Software and hardware financing" types out on its own, centred, with the cursor following, while the camera pushes in slowly |
| 2.53 | first bass hit | "is broken." slams in (violet) and the line cracks on the hit: the top and bottom halves shear apart, a thin line flashes along the break, and red/blue colour fringes tear for a moment |
| 3.30 / 4.06 | next beats | It gives way further on each beat, with the halves shearing wider and the fringes flickering again |
| 4.62–4.83 | The camera pushes into the break, the halves fly apart (up and down) and the first email slides out of the gap | |
| 4.83–10.2 | a pulse every beat | The inbox you liked, one row per beat. Top-left, a quiet counter "ACME RENEWAL · FINANCING — DAY 01" rolls up with each email (02, 03, 05, 06, 08, 11) and lands on DAY 14 in red |
| 11.17 → 15.0 | riser, then drop | Unchanged: "Any update?", the endless scroll, the collapse to a cursor, Meet Mila |
The portal pop-ups ("Sign in to continue", "Step 3 of 7"…) are gone. The day counter does their job more quietly, by showing the deal stalling for two weeks. I've also moved the rough SFX to the new beats: typing, a sub hit and a glitch on the crack, a whoosh as it opens, and a pop per email.
When you watch, check two things:
- How strong the crack is. I kept it fairly restrained. It could break harder: more shear, a shattered "broken." in particular, or a hard cut to black on the hit like Attio's black frames.
- The day counter. It's small and in the corner on purpose. If it's too subtle, I can move it next to the inbox or make it bigger.
Worked · 8 steps
- Rewrite opening to clean type → zoom → split → inbox; drop counter and glitch SFX
- Re-run the check to see if the timeout was transient
- Check runtime-check options and stray headless processes
- Re-run check with a longer render-ready timeout
- Snapshot the reworked opening
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Commit the cleaned-up opening
Understood. Clean throughout: no crack, no colour ghosts, no jolts, no glitch sounds, and no day counter. The new flow:
- 0.45–2.4: "Software and hardware financing" types cleanly, as now.
- 2.53 (bass hit): "is broken." appears and the camera zooms in on it.
- 4.06 (beat): the line splits cleanly, the top half sliding up and the bottom down like doors, and the camera zooms through the gap into the emails. The inbox, "Any update?" and everything after stay as they are.
The check hit a 10-second navigation timeout. That could be a slow load or a script error from the build-time measurement, so I'll re-run it and look at the console output.
It passes with a longer timeout, so the page was just slow to load, not broken. Snapshotting the new opening:
The frames look right:
- the clean typing
- "is broken." centred and big on the bass hit
- the doors-style split with the first email opening in the gap
Committing.
The opening is reworked the way you proposed and committed as 4df5c9a. Refresh http://localhost:3002/#project/video to see it.
| Time | Music | What happens |
|---|---|---|
| 0.45–2.4 | quiet intro | "Software and hardware financing" types cleanly, centred, the cursor following it, with a slow camera push |
| 2.53 | bass hit | "is broken." rises in (violet) and the camera zooms in until it's centred and big in frame, then keeps drifting closer |
| 4.06 | downbeat | The line splits like doors, the top half up and the bottom half down, and the camera travels through the gap |
| 4.3 → 9.4 | a pulse every beat | The first email opens in the gap, then one row per beat. "Any update?", the endless scroll and Meet Mila are unchanged |
Removed: the crack, the colour fringes, the three jolts, the glitch sounds, and the "DAY 01 → 14" counter. The only sounds in the opening now are the typing, one soft whoosh on the split and a pop per email.
Next up: the middle section, from the chat answer (about 20s) through the dark "Just ask" and always-on part to about 49s. That's where I'd expect most of the remaining polish to be. Tell me what bothers you there first, or I can start with the answer-card moment I flagged earlier.
Worked · 3 steps
- Fully typed line, crooked zoom, jagged split; check and snapshot
- Read contact-sheet.jpg
- Commit the typed/crooked/jagged opening
Making it fully typed: the whole line types, including "is broken.". On the downbeat the camera zooms in on "is broken." at a slight tilt. On the next beat the line splits along a jagged break and the two pieces separate.
The opening now works the way you described, and it's committed as da25219. Refresh http://localhost:3002/#project/video to see it.
| Time | What happens |
|---|---|
| 0.45–2.4 | The whole line types: "Software and hardware financing is broken.", with "is broken." typed in violet as part of the sentence |
| 2.53, downbeat | The camera zooms in on "is broken." and lands tilted about -4°, then keeps creeping closer and slightly more crooked |
| 4.06, next beat | The line breaks along a jagged zig-zag edge. The top piece falls up-left and the bottom down-right, each slightly rotated, while the camera straightens and travels through the gap into the inbox |
You can tune the feel in Studio, or tell me:
- Tilt angle. It's -3.5° on the hit, drifting to -4.2°.
- How jagged the edge is. Currently 16 points, swinging about ±10% around the middle of the line.
- Split timing. At 4.06 it's one beat-pair after the hit. If you meant the next bar, it would be at 5.6. That holds "is broken." longer and pushes the inbox back by about 1.5s.
Worked · 8 steps
- Download Diatype Bold and inspect the S1 camera block
- Split headline/inbox cameras, add bold focus pull and forward push-through
- Dense snapshots of the focus pull, split and push-through
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Stack regular/bold weights and merge zoom into one push
- Read contact-sheet.jpg
- Commit the focus-pull and push-through opening
Three changes:
- "is broken." stays black. On the zoom it turns bold, using the real Diatype Bold weight, which I'll add.
- The rest of the line blurs out as the camera lands, so only "is broken." is in focus.
- No zoom-out before the break. The camera stays locked on "is broken." and keeps pushing forward. On the split it accelerates through the jagged gap, and the inbox comes towards us from behind. One continuous forward move with the speed matched across the cut, instead of out-then-in.
For the third point, the headline and the inbox need separate camera layers. Adding the bold font first:
The check passes. Snapshotting the transition densely (2.4–5.2s) to judge how smooth it is:
The focus pull is clean: the rest of the line blurs out, "is broken." turns bold in black, the camera holds the tilt, and the push into the jagged split runs as one continuous move. Committing.
All three notes are done and committed as 23f6119. Refresh http://localhost:3002/#project/video to see it.
- The rest of the text blurs on the zoom. On the downbeat, "Software and hardware financing" goes soft and fades back, so only "is broken." is in focus.
- "is broken." goes bold and stays black. It crossfades from Medium to the real Diatype Bold weight (I added the font file) as the camera lands.
- The zoom and break are smooth, and the camera never pulls back.
- 2.53: one decisive tilted zoom that lands "is broken." in the centre.
- 3.4–4.7: a single accelerating push straight through the break. The line splits along the jagged edge at 4.06 while the camera keeps speeding forward. Before, it eased out to a stop and then started again, which caused the jerkiness.
- The inbox now sits behind the headline on its own layer. It rushes towards you out of the gap, coming into focus at the same speed as the push, so the move into the emails reads as going forward through the break.
If anything still feels off, the most likely tweaks are:
- the length of the hold between the zoom landing and the break
- how far the pieces fly apart
- how fast the inbox rushes in
Tell me what you see.
Worked · 1 step
- Show the current inbox/riser section of the timeline
Changes for this round:
- The rest of the line blurs and fades almost to nothing.
- The camera keeps moving. After the downbeat zoom it creeps steadily towards "is broken.", and on the break a second layer adds acceleration on top, so speed only ever builds. The push-through stays continuous.
- The emails speed up before "Any update?" The pace holds at one per beat, then builds from about 8.7s into the bubble at 11.17.
- New line on the riser: after "Any update?", the inbox falls away and "But it doesn't have to be that way." types out. Just before the drop it backspaces into a single cursor, which then blooms into Meet Mila on the drop, as now.
I'll check the current inbox code first.
Worked · 13 steps
- Apply inbox acceleration, new riser line, fade+blur and camera creep
- Browser: tabs context mcp
- Browser: navigate
- Browser: javascript tool
- Browser: javascript tool
- Browser: tabs close mcp
- Download crack/break SFX candidates and plot spectrograms
- Read grid.png
- Cut break SFX layers and options, update SFX cues, check
- Snapshot creep, acceleration, new riser line and caret
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Commit the opening-act changes
The check passes. Now the break sound: searching Epidemic for crack and crumble effects.
The break SFX are wired in and the check passes. Snapshotting the new 8–15s section (the speed-up, "Any update?", the new line and the backspace into the cursor).
All four changes are in and committed as bd19070. Refresh http://localhost:3002/#project/video to see them.
1. Blur and fade. On the downbeat, the rest of the line now blurs and fades almost completely, so only "is broken." is left.
2. A camera that keeps moving. After the tilted zoom lands, the camera keeps drifting slowly towards "is broken.". On the break, a second layer adds acceleration on top of that drift, so the speed only ever builds as it pushes through the jagged split. There's no stall and no pull-back.
3. The new 4–15s, timed to the song
| Time | Music | What happens |
|---|---|---|
| 4.4–7.9 | one pulse per beat | One email per beat, as before |
| 8.7–11.0 | building | The emails speed up, with gaps shrinking from about 0.55s to 0.1s. The rows pick up a vertical motion blur and the camera leans in |
| 10.45 / 11.17 | Typing dots appear, then "Any update?", and the inbox blurs out behind it | |
| 12.0–13.6 | riser | Everything falls away and "But it doesn't have to be that way." types out while the camera rides the riser |
| 14.0–14.3 | the dip | It backspaces, faster and faster, down to a single cursor in the centre |
| 15.00 | drop | The cursor blooms into the orb: Meet Mila |
This replaces the endless email scroll on the riser. The speed-up before "Any update?" now does that job.
4. Break sound effects. I layered a cinematic crack impact with a short concrete crumble for the debris as the pieces fall away, plus a soft whoosh as the camera pushes into the inbox. If they don't sound right, I saved 11 alternatives in video/assets/sfx/break-options/ (glass, ceramic, porcelain, ice, concrete and cinematic cracks). Tell me which one you like and I'll swap it in.
Worked · 6 steps
- Apply full fade, drift-then-accelerate camera, earlier burst and timing
- Snapshot fade, push, burst, ping, and the longer riser line
- Read contact-sheet.jpg
- Pivot the acceleration layer on the word and re-snapshot the break
- Read contact-sheet.jpg
- Commit the timing and camera fixes
Three fixes:
- The rest of the text fades out completely as it blurs (opacity 0).
- The camera never stops. The zoom is now two layers: a fast tilted punch on the downbeat, and underneath it one continuous push that starts as a slow steady drift and curves smoothly into hard acceleration through the break. That removes both the pause and the linear-then-sudden step.
- The emails speed up earlier and finish faster. The steady per-beat pace runs only to about 6.4s, then the rows burst in (about 12 in 2s) and "Any update?" lands on the 9.43 beat instead of 11.17. That gives "But it doesn't have to be that way." about 2.5s on screen instead of about 0.5s.
I'm also turning the break SFX down for now.
Now "is broken." stays centred through the whole push and the pieces split around it. The faded text is fully gone. Committing.
All three are fixed and committed as 4af8df4. Refresh http://localhost:3002/#project/video to see them.
1. Full fade. On the downbeat the rest of the line blurs and fades to fully transparent, so only "is broken." remains.
2. Smooth camera. It now runs on two layers:
- The punch: a quick tilted zoom on the downbeat.
- The push: underneath it, one continuous move. Its speed never drops to zero: it's a slow steady drift into "is broken." that curves smoothly into hard acceleration through the break, with no pause and no linear section.
I also fixed a bug this exposed: the push was scaling around the wrong point, which slid "is broken." off-centre during the break. It now pivots on the word, so it stays centred while the pieces split around it.
3. Emails and timing
| Time | Before | Now |
|---|---|---|
| One row per beat | 4.4–7.9s | 4.4–6.4s (three rows) |
| The burst | 8.7–11.0s | 7.1–9.2s: about 12 emails piling in at once, with motion blur and the camera leaning in |
| Typing dots | 10.45s | 8.75s |
| "Any update?" | 11.17s | 9.43s, on the beat |
| "But it doesn't have to be that way." | typed at 12.3, ~0.5s on screen | typed at 10.3, ~2.5s on screen with a slow push into the riser |
| Backspace into the cursor, then Meet Mila | 14.0 → 15.0 | unchanged |
Break SFX: turned down to roughly half for now. Whenever you want to pick a replacement, the options are in video/assets/sfx/break-options/.
Worked · 3 steps
- Separate drift and acceleration layers, keep pieces visible, re-snapshot
- Read contact-sheet.jpg
- Commit the acceleration fix
You're right. The pieces were fading out as they flew apart, and the extra zoom after the break was too small to read as acceleration. The fix:
- Before the break: a steady slow drift on one camera layer (constant speed, never stopping).
- From the break (4.06): a separate layer accelerates hard, about 6× in 0.75s on an exponential curve, pivoting on "is broken.". Adding it on top keeps the speed continuous, so it reads as flooring it.
- The broken pieces stay fully visible while they rush past, picking up motion blur as they speed up, and only vanish at the end. The inbox appears just after, at 4.55.
The camera now speeds up through the break. Committed as 09318eb; refresh http://localhost:3002/#project/video to see it.
Why it felt flat: the zoom after the break was small, and the pieces were fading out while they flew apart. So it looked like the same speed throughout.
What changed: the camera runs on two separate layers, both pivoting on "is broken.":
- Drift layer: a constant slow push from the downbeat that never stops.
- Acceleration layer: kicks in exactly on the break. It goes 6.5× in 0.78s on a steep exponential curve, slow for the first few frames then racing, with motion blur building as it speeds up. Because it adds on top of the drift, the speed never dips.
On top of that:
- The pieces stay fully visible until they've rushed past the camera at about 4.7s. Then they vanish.
- The inbox comes into focus right behind them at 4.55s.
In the frames you can see it build: barely moving at 4.2s, clearly bigger at 4.5s, huge and blurred at 4.62s, gone by 4.72s.
Worked · 7 steps
- Apply expo punch-through, inbox push-only camera, shorter hold, rebuilt drop build-up
- List contact sheets
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Overlap inbox arrival with the departing pieces
- Read contact-sheet.jpg
- Commit the punch-through and timing fixes
Four fixes:
- The break uses the same move as the "is broken." zoom-in: a fast punch that bursts forward and eases out (expo.out), now pushing through the split.
- No zoom-out in the inbox. The camera arrives and then only ever pushes in, slowly, building into the burst.
- "But it doesn't have to be that way." is shorter on screen, about 1.6s instead of 2.5. "Any update?" holds a little longer before it.
- The drop into Meet Mila: it lost its build-up when I removed the email pour. I'm bringing back the "suck" riser sound that ends right on the drop, and making the camera accelerate into the cursor as the line backspaces, so the energy climbs into the drop again.
No blank frame now: the first email is already coming in as the pieces leave. Committing.
All four are done and committed as 298bf7d. Refresh http://localhost:3002/#project/video to see them.
-
The break uses the same move as the "is broken." zoom. At 4.06 the camera punches through the jagged split with the same fast-start, soft-landing curve as the downbeat zoom, so the pieces burst past immediately. I also start the inbox at 4.1 so it's already arriving as they leave, with no blank frames in between.
-
The inbox camera never zooms out. It arrives, then only pushes in: steady while the emails land on the beat, then building with the burst into "Any update?". The ease-back that caused the out-then-in is gone.
-
"But it doesn't have to be that way." is shorter on screen.
Before Now "Any update?" on screen 9.43–10.05s 9.43–10.75s Line types 10.3s 11.15s Hold before backspace ~2.5s ~1.6s -
The drop into Meet Mila has its build-up back. When I removed the email pour, two things went with it: the "suck" riser sound that ends right on the drop, and the camera rushing into the collapse. Both are back:
- the suck riser ends at 14.9s
- the camera drifts slowly while the line reads, then accelerates into the cursor as it backspaces at 13.65–14.3, so the orb blooms on the drop at the top of that build
If the drop still feels off, tell me which part: the build-up, the bloom itself, or the "Meet Mila." timing. Those are three different fixes.
Worked · 18 steps
- Crop candidate portrait tiles from brand key visuals
- Read faces.jpg
- Crop stock portraits from capchase.com screenshots
- Read faces2.jpg
- Cut square avatar images for the three senders
- Read avatars.jpg
- Re-center avatar crops
- Read avatars.jpg
- Fine-tune avatar crops and preview them as circles
- Read avatars.jpg
- Browser: tabs context mcp
- Browser: navigate
- Browser: javascript tool
- Browser: javascript tool
- Browser: tabs close mcp
- Download notification SFX candidates and plot spectrograms
- Read grid.png
- Cut the chime and make escalating pitch variants
That was already committed as 298bf7d.
For the bubbles I'll use real people from your brand assets. The Figma key visuals include portrait photos (the curly-haired man, the woman in the office, the man on a laptop), so the faces are on-brand and licence-safe. Cropping candidates first:
The crops are off-centre: one face is cut at the chin and one at the forehead. Re-centring them:
The avatars work. Next, a better notification sound. Searching Epidemic for message-received chimes:
Worked · 9 steps
- Locate bubble-related code in the composition
- Read index.html
- Replace the single bubble with a three-message stack
- Position typing dots, wire chime cues, run checks
- Show the warning and snapshot the bubble moment
- Fix the overlapping tween duration
- Read contact-sheet.jpg
- Scale up messages and anchor dots to the first bubble
- Fix dot offsets, re-check and re-snapshot
I'm reworking the chat bubbles. The new notification chime is cut, in three slightly rising pitches, one per message. Next I'm building the three-bubble stack with avatars and timestamps.
Duration 0.4 overlaps the next push by 0.02s — trimming to 0.36. Checking frames:
Worked · 4 steps
- Read inbox burst and message timing code
- Retime the burst and messages one beat earlier
- Check row count, lint, and snapshot new timing
- Read contact-sheet.jpg
Noted on the pacing. I'll give each message a full beat and start the stack earlier. Pulling up the inbox burst timing so it can make room:
I've rebuilt the "Any update?" moment as three stacked chat messages and retimed it to your note. It's ready to review in Studio (http://localhost:3002/#project/video) at about 7.5–11s. Lint passes, and I checked frames across 7.6–11s; nothing is committed yet.
The messages
- Each has a round photo, with the name, company and a late-night time above the bubble rather than inside it:
- Jordan Lee, Acme Corp, 11:42 PM: "Any update?"
- Marcus Hale, Sales, 11:51 PM: "Was my buyer approved?"
- David Okafor, Acme Corp · CFO, 11:58 PM: "Need this ASAP."
- The bubbles are now white with navy text and a soft shadow, matching the cards later in the video, and they're about 40% larger.
- The typing dots now appear exactly where "Any update?" lands, then give way to it.
- Each new message pushes the stack up so it stays centred on screen.
Timing
- The messages now land on full beats (8.66 / 9.43 / 10.19) instead of half-beats.
- The stack stays up until 10.85, about 2.2s on screen instead of 1.3s.
- To make room, the email burst starts one beat earlier (6.75) and peaks by about 8.4, so the "too many emails" moment is still there just before the first message.
- "But it doesn't have to be that way", the backspace and Meet Mila on the drop haven't moved.
Sound: the new notification is a clean two-tone chime, playing once per message and a little higher each time so it builds. The burst pops were moved to the new timing.
Names, roles and times are placeholders, so change any that don't fit. The three photos are people from capchase.com and the Figma file, which means they may be real customers or employees. They're fine for iterating, but should be swapped for stock or generated faces before this goes public.
Worked · 22 steps
- Read the camera rig helper and list chime candidates
- Add continuous push and beat kicks to the chat section
- Centre the chat stack inside its camera
- ToolSearch
- Browser: tabs context mcp
- Browser: navigate
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Download phone notification candidates
- Test the preview URL directly
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Browser: javascript tool
- Download notification candidates via preview URLs
- Analyze candidate chimes for notes and tonality
- Cut the chime, update cues, check and snapshot
First, the camera: I'll check how the existing camera helper works so the chat stack can get its own gentle push.
The camera now keeps pushing through the chats, with a soft kick on each message. Next I'm searching Epidemic for an iPhone-style text chime.
Epidemic has several phone text-message tones. I'm pulling the IDs and previewing them to find the one closest to the iPhone chime.
The preview audio lives at a different URL than I expected. I'm collecting the right links, then I'll analyze the candidates.
Worked · 8 steps
- Make the inbox camera push continuously
- Show the check error
- Mark intended overlap, re-check, snapshot
- Read contact-sheet.jpg
- ToolSearch
- Browser: tabs close mcp
- Write camera-momentum.md
- Index the new memory
That overlap is intentional: the blurred inbox sits behind the chats. I'm marking it as such and taking snapshots.
I've fixed the camera stall over the email list, given the chats their own beat-synced zooms, and swapped in a single phone chime. Check is clean, snapshots from 4.9s to 10.7s look right, and it's ready in Studio at about 4–11s. I haven't committed.
Camera
- Email list: there's no longer a pause after the inbox lands. One continuous zoom runs from about 4.8s to the first message, starting gently and speeding up as the burst builds. Before, it settled, nearly stopped, then started a new zoom.
- Behind the chats: the blurred inbox keeps drifting closer until everything falls away at 10.85.
- Chats: the stack has its own slow zoom in, plus a soft kick on each message (8.66 / 9.43 / 10.19). The kicks are milder than the opening's punch.
Notification
- I replaced the three rising chimes with one phone chime that plays the same on every message. It's a short, bright four-note rising ding from Epidemic (190966), the closest I found to the iPhone's default text tone. Apple's own sound can't be used.
- I picked it by analyzing the waveforms, not by listening, so give it a listen. Two alternatives are in
assets/sfx/notif-options/: 156097, a three-note ding closer to the classic iPhone "Tri-tone", and 184414, a very short two-note ding. To switch, copy one overassets/sfx/msg_in.wavor tell me which.
I also saved a note for future sessions that the camera should never stall.
Worked · 6 steps
- Read the "But…" section and S2 opening
- Inspect S1/S2 structure and drop cues
- Implement select, delete-on-thud, Meet Mila on upbeat
- Fix overlap, re-check, snapshot the drop
- Read contact-sheet.jpg
- Hide the leftover caret when the orb blooms
The select-and-delete drop is built. Check passes and it's ready in Studio at about 13–16.5s. I haven't committed.
- "But it doesn't have to be that way." I read your note as "this line should have no zoom", so I removed the zoom entirely. The line now sits still with only a faint drift while it reads, and there's no camera rush into the caret anymore. If you meant it needs more zoom, tell me and I'll flip it.
- Select (14.02): the caret hides and a soft violet highlight drags back over the line from the end, like selecting in a text editor. It takes about 0.4s and holds fully selected until the drop. There's a quiet click as it starts.
- Thud (15.00): the whole selection is deleted in one hit, leaving only the caret in the centre, with a camera kick and a key click on top of the boom.
- Upbeat (15.38): the caret gives way to the orb, the background turns to Mila's gradient, and "Meet" lands. "Mila." follows on the next half-beat (15.76). Everything from the orb moving into the chat box onwards is unchanged.
I checked frames from 13.5s to 15.95s and fixed one stray caret pixel that was left under the orb.
One thing to judge: between the delete and the orb (15.00–15.38) the screen is just the caret on the plain background. That's deliberate breathing room, but if it feels empty I can pulse the caret or start shifting the background on the thud.
Worked · 3 steps
- Map music energy and onsets around the drop
- Retime to the real thud and drop, drop the riser SFX
- Read contact-sheet.jpg
I'll check where the music actually hits instead of trusting my old grid, and list which SFX play around the drop.
I retimed the drop to the music's real hits and removed the extra swoosh. Check passes and frames from 13.6s to 15.5s look right; I haven't committed. Listen to it in Studio at about 13–16s.
What was wrong: I'd been treating 15.00 as the thud, but the track's own bass thud is at 14.47. It's followed by about half a second of near-silence, and the actual drop is at 15.00. That put the whole sequence a beat late.
What it does now:
- 13.68: the highlight starts dragging back over the line, on a small accent in the riser. The line is fully selected by about 14.1 and holds.
- 14.47 (the thud): the selection is deleted in one hit, with a camera kick and a key click. Only the caret is left.
- 14.5–15.0 (the silence): the caret sits alone and blinks once, then squashes.
- 15.00 (the drop): the orb blooms, the background shifts, and "Meet" lands, with "Mila." at 15.38 as before.
The swoosh: it was my "riser" sound effect (suck_collapse), which ran from 12.6s right through the silence after the thud. It's gone. The music's own build covers that stretch.
Worked · 2 steps
- Stage changes and review
- Commit the changes
Committed as d548879 on main. It includes the three-message chat stack with photos and the new phone chime, the camera that keeps pushing through the inbox and chats, and the select-and-delete on the 14.47 thud with Meet Mila on the 15.00 drop. It also drops the stray swoosh SFX.
Worked · 16 steps
- Read S2/S3 CSS
- Read S2 markup
- Read S2 conversation timeline
- Find frosted glass references
- Snapshot the current conversation cards
- Retry snapshots and list brand images
- Read contact-sheet.jpg
- Read key-visuals.png
- Read lp-mila-section.png
- Check swap CSS and shared tokens
- Rebuild the conversation scene in frosted glass
- Fix focus ring, check, snapshot the scene
- Read contact-sheet.jpg
- Clip the pay swap, fix the math, recheck
- Read contact-sheet.jpg
- Clip value rolls to their slots
I'll read the current conversation scene first: markup, styles and timeline from about 16.5s to 30.6s.
Next I'll take snapshots of the current cards and look up the frosted-glass reference from the brand notes.
Now the rewrite: new frosted styles, markup and timeline for the conversation, with the existing beat timing kept and the upfront message added.
I've rebuilt the conversation scene (about 18–30s) in the brand's frosted-glass style and added the $10k upfront message. Check passes, I reviewed snapshots from 18.6s to 29.9s, and it's ready in Studio; I haven't committed.
The frosted-glass look (taken from the Capchase key visuals and the Mila landing-page section)
- Background: when the first question is sent, the pale peach backdrop deepens into the brand's blue field: light periwinkle on the left, deep blue on the right, peach glints and fine grain. It drifts slowly so it never sits still.
- Cards: every element is now a white card in a translucent frosted rim, like the "Proposal for Acme" visual and the Mila input box.
- The chat input gets the same rim.
De-slopped cards
- Messages: each one is its own frosted pill with Marcus's photo; he's the sales rep from the opening chats. Each pill fits its text, so the dead space is gone. A new message lifts the previous one away and types itself out.
- "Thinking" status: a frosted pill with the Mila orb and the rotating status words.
- Proposal card: "Proposal for Acme" with a small green status that goes Approved → Updated → Sent; no mono labels or badge boxes. Below that sit a "Monthly payment" label, the big amount and three rows (Term / Upfront · hardware / Buyer). The footer reads "Ready to send", then "Sent to David · Acme CFO" next to the Pay now pill.
- Changing values roll inside their own slot instead of overlapping.
The conversation
| Time | Message | What happens |
|---|---|---|
| 23.29 | Can Acme pay monthly? | Card lands: $3,750 / month, 12 months, upfront "None". |
| 25.84 | Keep it under $2,500? | Rolls to $1,875, 24 months. |
| 27.54 (new) | And can you add an upfront payment of $10k for hardware? | The upfront row flashes peach and fills with $10,000; the monthly drops to $1,458. |
| 28.14 | Send it to Acme. | Card switches to sent, Pay now appears, and the CFO signs at 29.67. |
The new message types fast (about 1s) so the next scene can still start at 30.1. The prompts after it are tightened slightly; "Send it to Acme." now types between 27.74 and 28.1.
The $1,458 is consistent with the earlier number: $1,875 × 24 = $45,000, minus $10k = $35,000 over 24 months. It's illustrative only, with no interest modelled.
Worked · 1 step
- Shorten the prompt, check, and commit
The prompt is now "Add $10k upfront?", and everything is committed as 0edfa66 on main with the frosted-glass conversation scene. Check passes.
The shorter line types in 0.6s instead of 1.05s, and its typing sound is trimmed to match. The upfront row still fills on the 27.54 beat.
Worked · 9 steps
- Check git state and read S3 markup
- Read S3 timeline and its SFX cues
- Read S3 timeline JS
- Analyze music structure 29–50s
- Build the statement, 3D deal grid, retime Just ask
- Check and snapshot the new section
- Read contact-sheet.jpg
- Add a scrim behind the deal counter
- Read frame-00-at-34.6s.png
First I'll map the music between 30 and 49s so the new statement and grid land on the right hits.
I've built the new opening for the dark section: the deal-desk statement, then a big tilted 3D grid of deals flipping to approved and signed, then "Just ask." Check passes and I reviewed snapshots from 30.6s to 38.2s; it's ready in Studio at about 30–40s.
The previous work was already committed (the "Add $10k upfront?" change went into 0edfa66), so nothing was pending. This new section isn't committed yet.
30.1–32.9 · Statement (the beat kicks back in after a short breather)
- "A 24/7 financing deal desk." lands word by word on the 30.28 kick, with "24/7" in Mila's peach.
- "Your deals across the finish line in minutes, no matter how complex." follows underneath. I fixed your "not matter" to "no matter".
- The statement slowly pushes in and lifts away just before the hit.
31.85–36.4 · The deal grid
- From 31.85, while the bass drops out, a huge plane of deal tiles fades in blurred behind the statement. It's 150 tiles (15 rows × 10 columns), seen from a tilted, rotated camera so it reads as 3D.
- Hit at 33.0: the statement clears, the grid comes into focus and the camera punches in. It then keeps travelling up the plane, gently untilting, with small kicks on the music's accents.
- Each tile shows a fictional company, the deal type and term, an amount, and a status. A wave runs through the grid flipping tiles from "In review" to "Approved" (green); about 60% then go "Signed" with a peach glow.
- Counter: a running "Deals closed · today" tally at bottom left rolls from 1,248 to 1,391.
- At 36.3 the camera flies through the plane into the next beat.
36.46+ · Just ask
- "Just ask." now lands on the music's peak at 36.46; it was at 33.11.
- "Ask Mila in Email → Slack → finance.new" slides in underneath while "Just ask." stays on screen. The chips switch on the 37.94 and 38.61 accents.
- The always-on clock section from 40.08 is unchanged.
The sound effects were moved to match. The old accelerating ticker of asks and its riser are gone, replaced by a short riser as the grid appears, the hit at 33.0, quiet ticks while deals flip, and a whoosh at the fly-through.
Your call: with the grid taking 33–36.4, "Just ask." alone gets about a second before the channel line joins it, instead of three. Tell me if it should hold longer; that would shorten the grid.
Worked · 7 steps
- Look up the light grid background style
- Find the .grid class style
- Light deal section, restore Just ask, retime SFX
- Snapshot the light deal section
- Read contact-sheet.jpg
- Separate statement exit from the card entrance
- Read contact-sheet.jpg
Plan:
- Just ask: restore it exactly as it was, so it's back on the 33.11 boom with its original timing.
- Timing cost: the light deal section therefore gets 30.1–33.11.
- Text: "A 24/7 financing deal desk." then "Close within minutes."
- Transition to the deals: one deal card signs in the middle of the screen. The camera then pulls back and tilts, revealing it's one of dozens in the grid, which flips to approved and signed in a wave.
- Back to dark: the dark panel wipes in on the boom for "Just ask."
The deal section is rebuilt in the light theme and "Just ask." is restored exactly as it was. Check passes and I reviewed snapshots from 30.2s to 36.6s; it's ready in Studio at about 30–40s. I haven't committed.
Just ask: back to the original.
- "Just ask." lands alone on the 33.11 boom, and "Ask Mila in" takes its place at 36.33, with the chips at 37.09 and 37.86.
- The always-on clock section afterwards is unchanged.
- The dark panel now wipes in at 33.0, right before the boom.
Deal section (30.1–33.1), light theme like the email list:
- 30.12: a light panel with the faint grid wipes in from the right.
- 30.28: "A 24/7 financing deal desk." rises word by word in navy, with "24/7" in Mila's orange.
- 30.95: "Close within minutes." follows underneath in grey. The camera creeps in, with small kicks on each line.
- 31.45: the words clear upward and a single deal card rises into their place: "Acme Corp · Hardware + SaaS · 24 mo · $45,000 · In review".
- 31.9: it flips to Signed with a warm tint and a chime.
- 32.0: the camera pulls back and tilts into 3D, revealing that card is one of 130 in a huge grid. Neighbouring deals ripple in outward from it and flip to Approved (green) and Signed (orange) in a wave.
- 32.85: the camera speeds up and flies into the plane, straight into the dark wipe and the "Just ask." boom.
The counter is gone.
Keeping "Just ask." at 33.11 leaves this section only 3 seconds, so it moves fast:
- The statement is on screen about 1.2s.
- The pull-back into the grid lasts about 1s.
If you want it to breathe more, the trade-off is shortening the "Just ask." hold.
Worked · 14 steps
- Read the end card timeline
- Check opening line style and clip tags
- Restructure post-chat flow and shift the end card
- Rename clashing variables and recheck
- Rename single-letter time constants in S3
- Recheck the composition
- Hide covered text, darken accent, snapshot
- Read contact-sheet.jpg
- Retry the snapshots
- Read contact-sheet.jpg
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Earlier denser rain, extend S3 under the end-card reveal
- Read contact-sheet.jpg
I'll restructure everything after the chat. Let me read the end-card code first, since it has to move earlier.
I rebuilt everything after the chat as you described. Check passes and the frames from 29.9s to 46.5s look right; it's ready in Studio at about 29–53s. I haven't committed, and the music after about 30s is not resynced yet, as you said.
The video is now 53.1s and the music is cut off abruptly at the end.
- 29.67 · Sign → transition: the CFO clicks Pay now and it turns green. At 30.0 that green pill swells out of the button into the full dark frame, shifting from green to dark while the chat scene blurs behind it.
- 30.75–36.5 · Just ask: the same animation as before, just started off the button.
- "Just ask." holds about 3s.
- "Ask Mila in" then takes its place, cycling through Email, Slack and finance.new.
- 36.5 · Into the light: a light circle grows out of the finance.new chip and fills the screen with the canvas and faint grid from the email list.
- 37.25 · Typing: "A 24/7 deal desk." types out with a caret, like the opening line, with "24/7" in Mila's orange.
- 38.6 · Deals drop in: two rows of deal cards fall in and land along the bottom edge under the line. Each lands with a tiny tilt and a green dot pops in.
- 39.6 · The 3D plane: the line lifts away and the camera tilts back into a 3D plane. Dozens more cards fall onto it, nearest first, then spreading up the plane, until it's packed. The camera keeps drifting up the plane.
- 42.0 · End card: the violet circle opens straight over the deal plane into "Mila", then "Vendor financing at the speed of tech."
Cards are now minimal: white, with just the company name, the amount and a small green dot.
The always-on clock section and its sound effects are removed.
Known rough edge: the light circle opens slightly left of the finance.new chip's centre, because its position is worked out from layout rather than measured on screen. It's a small offset, but I can nudge it if it bothers you.
Worked · 2 steps
- Find blog and script source docs
- Pull key messaging from earlier script drafts
I'll check what the blog post emphasised so I can compare it against the current script.
The first half works because it's one story with real characters: Marcus is buried in emails and late-night pings, Mila arrives, and Acme signs. After "Just ask." the story stops and it turns into a string of slogans.
What goes wrong after "Just ask."
- "Just ask." repeats what we just saw. We've watched Marcus ask Mila things for 14 seconds, so the line sums up rather than adding anything. The one new idea, that you can ask from email, Slack or finance.new, is only told with three chips, never shown.
- "24/7" is claimed but never shown. The opening sets up exactly the right pain: "Any update?" at 11:42 PM. Nothing pays it off; nobody ever gets an instant answer at night. We removed the clock section, which was the only thing showing it.
- The deal rain is a show with no meaning. It reads as "lots of deals", but whose deals, and what changed? It doesn't show "minutes" or "no matter how complex". It's the AI-slop risk again: impressive motion that says nothing specific.
- Loose threads. Jordan's "Any update?", Marcus's "Was my buyer approved?" and David's "Need this ASAP." are never answered. That's the most satisfying payoff available, and we skip it.
- The end has no Mila line and no call to action. "Vendor financing at the speed of tech." is Capchase's brand line, not the launch message. The blog's own lines are stronger here: "Need financing? Just talk to Mila." and "Have a quote ready? Ask Mila to price it → finance.new".
Proposed back half (about 30–53s)
| Beat | On screen | Purpose |
|---|---|---|
| Sign → "Just ask." | Keep it as is: the button swells into the dark frame. | Your favourite beat stays. |
| Wherever you work | Instead of chips, three quick UI shots: an email forwarding Acme_Quote.pdf to Mila, a Slack thread ("@Mila can Globex defer 60 days?" → "Approved."), then finance.new. | The channels are shown, not told. |
| The callback | Back to the opening's late-night chats. Mila answers each one on a beat: "Any update?" → Approved. Link's out. · "Was my buyer approved?" → Yes, 24 months. · "Need this ASAP." → Signed. 11:59 PM. | This is where "24/7" and "in minutes" are earned, and it closes the story. |
| A 24/7 deal desk. | The line types in, and the camera pulls back: the answered thread is one tile in the huge grid of deals, all being handled at once. | The grid now means "this happens for every deal, all the time". |
| End card | Mila, then "Need financing? Just talk to Mila.", then finance.new. "Vendor financing at the speed of tech." can stay as a small Capchase sign-off. | A clear message and a next step. |
Smaller gaps worth considering
- No proof of speed in the demo. Small timestamps on the prompt pills (11:43 PM → signed 11:51 PM) would quantify "minutes" without adding a slogan.
- The handoff to a human is missing. The blog's "when something needs a person, Mila hands it over with context" is a trust point finance buyers care about. It could be one Slack reply in the channel shots, e.g. "Looping in Sarah from credit."
Decisions I need from you
- Should the grid say scale ("every deal") or complexity ("no matter how complex")? Complexity would need the tiles to show different deal shapes (hardware + SaaS, deferrals, split POs) rather than just names and amounts.
- For the end card, should we keep "Vendor financing at the speed of tech." as the main line, or lead with a Mila line?
Worked · 10 steps
- Read current end card code
- Build the new back half and end card
- Fix contrast, list warnings, snapshot back half
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Read contact-sheet-3.jpg
- Scale up the channel cards and recheck
- Read contact-sheet.jpg
- Fix reply selector and recheck
- Read contact-sheet.jpg
I'll build the new back half. One thing to confirm first is the end card's current markup.
Building it now. This is a full rewrite of the back half: the dark channel track, the late-night callback, the deal plane and the new end card.
The Slack and finance.new replies never appear: the helper always grabbed the first reply, the one in the email card. Fixing that:
I've rebuilt the back half (30–55.7s) as we discussed. Check passes, I reviewed snapshots across the whole stretch, and it's ready in Studio. I haven't committed. The video is now 55.7s, and the music after about 30s still needs resyncing; the logo hit is at 48.4 and the track is cut at 55.7.
| Time | Beat |
|---|---|
| 29.67–30.75 | Sign → "Just ask." The CFO clicks Pay now and the green pill swells into the dark frame, then "Just ask." lands. |
| 32.6–37.1 | Wherever you work. Large product cards on one horizontal track, racking from one to the next with a header that swaps per surface. |
| 37.15–41.3 | The callback. A light circle opens out of finance.new's send button, back into the opening's late-night thread. Each ping now gets an instant answer from Mila, her orb in place of a photo and her bubble in soft peach. |
| 41.95–46.9 | A 24/7 deal desk. The thread folds down into one tile: "Acme Corp · $10k upfront · 24 mo". The camera pulls back and tilts, and that tile is one of dozens landing on a 3D plane. "A 24/7 deal desk." types in above it. |
| 46.9–55.7 | End card. The violet circle opens over the plane: Mila, then "Need financing? Just talk to Mila.", with "Vendor financing at the speed of tech." and finance.new bottom left. |
Wherever you work, in detail
- "Forward her a quote." An email to mila@capchase.com with Acme_Quote.pdf attached; Mila replies: "Priced at 12 × $3,750. Proposal attached."
- "Mention her in Slack." Marcus asks: "@Mila can Initech split this across two POs?" Mila: "That needs a person. Looping in @Sarah from credit, with the full context." This is the blog's point about handing off to a human.
- "Or open finance.new." "Price the Globex renewal" types and sends; Mila: "Globex renewal: 12 × $4,100. Approved."
The callback thread
| Late-night ping | Mila's answer |
|---|---|
| Jordan, 11:42 PM: "Any update?" | 11:42 PM: "Approved. Your link's on the way." |
| Marcus, 11:51 PM: "Was my buyer approved?" | 11:51 PM: "Yes. 24 months, $10k upfront." |
| David, 11:58 PM: "Need this ASAP." | 11:58 PM: "Sent. Ready to sign." |
A green "✓ Signed · 11:59 PM" chip then lands under the last answer. Each ping plays the same phone chime as the opening, and Mila's same-minute answer comes half a beat later.
Decisions I made on the open questions
- The grid shows both scale and complexity. Each tile has a company name plus a deal shape ("Deferred 60 days", "Split across 2 POs", "Quarterly · 4 payments", "Hardware + SaaS · 36 mo"…), so it reads as every kind of deal, not just many deals.
- The end card leads with the Mila line, and "Vendor financing at the speed of tech." stays as a smaller sign-off.
Worked · 2 steps
- Faster Just ask, Via chips with minimal cards, shift later beats
- Fix cue times, verify shifted constants, check
Plan:
- "Just ask." gets about one bar instead of almost two.
- "Via [chip]" returns, cycling Email → Slack → finance.new on the music's accents, the same way the old "Ask Mila in" chips worked.
- Below the chip, a minimal dark-glass card shows each surface: one question and Mila's reply.
- The light callback then starts about 1.7s earlier, and everything after it moves up to match.
The cue script shifted two ping times twice. Fixing those, then checking:
Worked · 3 steps
- Snapshot the reworked section
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
I've made both tweaks; they're ready in Studio at about 30–37s. Check passes and I reviewed snapshots across the changed stretch. I haven't committed.
"Just ask." is faster. It now holds for about a bar (30.75–31.55, under a second, down from about 1.6s) and lifts away just before the next accent.
"Via [chip]" is back, with the same chip style and swap as the old "Ask Mila in" line:
- 31.79 · @ Email: a card addressed to mila@capchase.com with Acme_Quote.pdf attached; Mila replies "Priced at 12 × $3,750. Proposal attached."
- 32.95 · # Slack: "# deals", Marcus's "@Mila can Initech split this across two POs?", and Mila's handoff: "That needs a person. Looping in @Sarah, with the full context."
- 34.2 · ✦ finance.new: "Price the Globex renewal" types into a dark input and sends; Mila: "Globex renewal: 12 × $4,100. Approved."
The cards are dark now. Each surface is a minimal dark-glass card instead of a big white app mock-up: a small uppercase label, one message and Mila's reply under a hairline. Accents are in Mila's peach. Each card slides in from the right as its chip lands and leaves to the left on the next one, with a small camera kick each time.
Everything after moved up 1.74s. The light circle now opens out of finance.new's send button at 35.41, on a music accent. The callback, the plane and "A 24/7 deal desk." follow as before. The logo hit is now at 46.66 and the video is 53.96s; sound effects were shifted to match.
API Error: Can't reach the API server — check your internet or DNS (ENOTFOUND)
Worked · 11 steps
- Locate S4 and grid code blocks
- Read the code around deal creation and S4 markup
- Pan into the line on the plane, dot-to-orb, new end card
- Snapshot the deals pan and new end
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Exact dot-to-orb, subtle refraction band, deeper peach
- Deepen end gradient, recheck, snapshot
- Read contact-sheet.jpg
- Make the refraction band subtler
- Read frame-00-at-48.5s.png
Two ideas.
- Deals into the text: "A 24/7 deal desk." becomes part of the 3D world instead of being typed on top. It sits on the plane past the last row of deals. The camera pans across the deals toward it, its words drop onto the plane like the cards, and the camera levels out so the line faces us flat with the deals beneath it. No overlay text.
- Into the end: the full stop of "desk." turns into a small peach Mila orb, the same orb from Meet Mila. It swells and floods the screen into the end card.
- The end card: Mila's own key visual. "Mila" in white on a grainy peach-to-orange gradient, with the brand's frosted-glass band sweeping up across the lower half of the letters. Then "Need financing? Just talk to Mila.", with the Capchase lockup and finance.new.
I'll check how the current style and markup end before replacing them.
Writing the new deals pan, the full-stop-to-orb transition and the new end card:
Check flags low contrast for white text on the peach end card. I'll look at the frames first, then deepen the gradient.
The remaining flags are the giant white "Mila" against the lighter top of the gradient, plus the tagline. I'll deepen the peach a bit more, keeping the key-visual feel, then look at the frames.
I've rebuilt both parts: the deals now pan into the text, and the end card is new. Check passes and I reviewed the frames; it's ready in Studio at about 40–51.4s. I haven't committed. The video is now 51.4s, and the music still needs resyncing after about 30s.
Deals → the text (40.2–43.9)
- No more typed overlay. "A 24/7 deal desk." is part of the 3D world now, laid on the plane just past the last row of deals.
- The camera move: after the thread folds into the Acme tile, the camera pulls back and tilts, then pans up and across the plane. The rows ahead of it keep landing as it travels.
- Arriving at the text: the four words drop onto the plane the same way the cards do. The camera then levels out flat, so the line faces us with a row of deals underneath it.
Transition into the end (43.92–44.9)
- The full stop of "desk." turns into Mila's peach orb, the same one from Meet Mila, and swells with a little bounce.
- It then floods the whole frame in one accelerating move, which hands off seamlessly into the end card's colour.
New end card (44.8–51.4), built on Mila's key visual
- Background: a grainy peach-to-orange gradient that drifts slowly.
- Wordmark: "Mila" rises letter by letter, very large and white, with a soft thump.
- The brand's frosted-glass band: it sweeps up and settles over the lower part of the letters, which appear blurred and slightly shifted through it, as in the key visual.
- Then: "Need financing? Just talk to Mila." rises in two parts.
- Footer: "Vendor financing at the speed of tech." with the Capchase logo bottom left, and ✦ finance.new bottom right.
Contrast: the giant white "Mila" sits at about 2.7:1 against the lighter top of the gradient. Check passes, but it's below the 3:1 guideline. At 400px it reads clearly, and the key visual itself uses white on light peach. If you want strict 3:1, I can deepen the top of the gradient further.
Worked · 7 steps
- Read S4 end-card JS and its cues
- Logo, typed tagline, centered link; remove shimmer and band
- Snapshot the new final shot
- Read contact-sheet.jpg
- Keep the logo white through its entrance
- Read frame-00-at-49.3s.png
- Nudge the cursor off the arrow
I'll start with the end-card code and its sound cues.
Removing the shimmer sparkle, the "Mila" wordmark and the frosted band. Next comes the Capchase logo, the typed tagline, and a centred finance.new link pill with a cursor hovering on it:
The logo is rendering dark: its blur-in animation overwrites the filter that turns it white. Fixing that:
The cursor sits on top of the arrow, so I'll nudge its tip to the arrow's lower edge.
I've reworked the final shot; check passes and it's ready in Studio at about 44–51.4s. I haven't committed.
- Corny sound removed: I took out the sparkly "shimmer" effect that played when the frosted band swept in. I'm fairly sure that's the "video game star" you heard. If something cheap-sounding is still there, it may be the small pop when the full stop turns into the orb (43.95); tell me and I'll swap it.
- No more "Mila" wordmark or frosted glass: the band and the blurred letters are gone. A large white Capchase logo now lands on the hit at 45.1 with a soft blur-in and camera kick.
- Typed tagline: "Vendor financing, at the speed of tech." types in under the logo with a white caret and keyboard sound, like the other typed lines. The caret blinks twice, then disappears.
- finance.new is now a link:
- Centred and bigger (46px).
- A white pill with ✦, underlined text and a round arrow button.
- It pops in at 47.55. A cursor then glides in and hovers it at about 48.85: the underline darkens, the arrow turns orange and nudges right, and the pill lifts slightly.
- Unchanged: the peach background, and the hand-off from the full stop flooding into it.
Worked · 6 steps
- Commit the current state
- Beat-track the music and inspect its ending
- Pin the exact hit and cut-point onsets
- Cut 2 bars from the music, align end card to the hit
- Verify music tail and splice, check, snapshot end
- Read contact-sheet.jpg
Committing first.
Committed as e18735b. Now the ending. I'll map the track's beats and its tail to find a clean musical cut.
The ending now finishes with the music on a full final frame. It's ready in Studio at about 43–53.4s. Check passes and I reviewed frames around the hit and at the very end. The commit you asked for is e18735b; this ending work came after it and isn't committed yet.
How the ending lines up now
- Music edit: I cut exactly two bars (8 beats) from the sparse middle section of the track, from one hit at 41.60 to the next at 47.63, so the groove carries on unbroken. It's saved as
assets/music/terminal-velocity-g2-end.wav; the original stays untouched. - What the cut buys: the track's build now plays under the deal pan, and its big hit lands at 45.78. I'd been assuming the hit was at 52.77, but analysing the track puts it at 51.82.
- Visuals retimed by +0.63s: the full stop turns into the orb and floods the frame during the build. The Capchase logo arrives on the hit, with the camera kick and the boom sound on the same beat.
- The end: the music's own tail fades out by 53.4s (down to −41 dBFS at 53.25), so the video now ends at 53.4 instead of 51.4.
- No fade-out: the last frame holds the full end card: logo, tagline and the finance.new link with the cursor on it.
I checked the cut point numerically and it shows no obvious click, but I can't listen to it, so it's worth hearing in Studio. If you want the logo fully sharp exactly on the beat, rather than resolving just after it, I can start its entrance a few frames earlier.
Worked · 4 steps
- Find link and cursor code
- Frosted link button, click, cursor exit
- Read contact-sheet.jpg
- Read frame-03-at-53.35s.png
I'm wrapping the link in the brand's frosted rim (a white pill inside a translucent glass ring), adding a real click, and fading the cursor out afterwards:
The finance.new button now uses the frosted-glass design, and the cursor clicks it and then leaves. Check passes; I reviewed frames through the hover, the click and the final frame. It's ready in Studio at about 48–53.4s. I haven't committed.
- Frosted-glass button: the white finance.new pill now sits inside a translucent frosted rim, like the input box in the brand visuals. The rim blurs the peach behind it, with a fine light edge and a soft shadow underneath.
- Hover (49.45): the rim brightens and lifts, the underline turns solid, and the arrow slides right and turns orange.
- Click (49.95): the cursor presses and the pill dips and springs back, with a click sound.
- Cursor exit (50.3): the cursor fades out, so the final frame shows the logo, tagline and the hovered finance.new button with no cursor.
Worked · 1 step
- Commit the ending work
Committed as 8c1ecfd on main, and nothing else is left uncommitted. It includes the two-bar music cut that lands the Capchase logo on the hit, the 53.4s ending that holds the full final frame, and the frosted-glass finance.new button with the click and the cursor leaving.
Worked · 11 steps
- Search animation skill for 3D/camera/grid guidance
- Dense snapshots across the 3D pan
- Read 3d-camera-flight.md
- List the snapshot files
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
- Read the current plane camera block
- Single-camera 3-leg flight, ring ripple, approval wave
- Snapshot the new camera flight
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
First I'll check the animation skill's guidance on 3D camera moves and grid choreography, and take dense frames of the current pan.
Rewriting the camera as one state with three legs, plus the ripple and the approval wave:
I audited the 3D pan against the skill's 3D camera-flight rule and dense frames, then rebuilt it to be orderly. Check passes and the new frames confirm it reads as one deliberate move; it's ready in Studio at about 40–44.6s. I haven't committed.
What the audit found
- Random rain was the main source of disorder. Cards dropped at random times and spots, so the plane looked patchy, and cards falling from high up ballooned near the lens.
- Two camera moves fought each other. The tilt unwound during the whole pan while a sideways S-sway ran on top, so the path swirled instead of reading as one move.
- The line was assembled mid-move. The words landed while the camera was still flattening, so "24/7deal" collided right when it should become readable.
- The reveal was weak. The pull-back from Acme showed mostly empty plane, so "one deal among all of them" didn't land.
What I changed (one camera, three legs, each landing on a music beat)
| Leg | Time | What happens |
|---|---|---|
| Pull back | 40.87–41.95 | Out from the Acme tile to a fixed isometric pose. The full grid ripples in ring by ring around Acme, so it's clearly one deal among many. |
| Glide | 41.7–43.83 | One straight, smooth move up the plane at a constant angle: no rotation, no sway. A wave of green approval dots sweeps up the rows ahead of the camera toward the line. A soft tick sound replaces the old rain. |
| Land | 43.0–43.83 | The four words drop onto the plane while it's still tilted and are settled before the camera levels out. The camera lands flat on "A 24/7 deal desk." on the beat at 43.83, then holds and pushes in gently until the full stop turns into the orb. |
Optional extra: I could add a little depth of field, slightly blurring the far rows during the glide, which the 3D rule recommends for depth. It costs some sharpness, so I'd only add it if you want more of a cinematic feel.
Worked · 6 steps
- Snapshot the callback-to-grid handoff
- Read contact-sheet.jpg
- Find the deal data and fold timing lines
- Fix column bug, frosted wave drop, longer glide
- Read contact-sheet-1.jpg
- Read contact-sheet-2.jpg
I'll check where the cards collide with the chat before changing anything.
I fixed the overlap and rebuilt the drop as a frosted wave, with a longer glide before the title. Check passes and I reviewed frames from 38.5s to 43.5s; it's ready in Studio at about 38–44.6s. I haven't committed.
The cards overlapping the chat were a bug in my code. I never stored each card's column, so their timing calculated to "not a number" and every card showed up from the start of the callback, behind the chat bubbles. It's fixed:
- the late-night thread plays on a clean canvas;
- it folds away at 39.92;
- the Acme card appears alone at 40.25 and gets its green dot.
Wave drop with frosted cards
- Every other deal drops onto the plane in a wave that starts at Acme and runs up the plane ahead of the camera, with a few hundredths of a second of jitter so it feels organic rather than mechanical.
- While falling, each card is frosted (blurred and translucent). It sharpens as it lands, then its green approval dot pops.
- You can see it clearly around 40.8–41.1, when frosted cards fall in around Acme as the camera starts pulling back. The far rows are still landing during the glide.
Longer glide before the title
- The pull-back now starts at 40.62 and lands on the 41.62 beat.
- The straight glide up the plane now starts at 41.2, about half a second earlier, and runs about 2.6s instead of about 2.1s. It still lands flat on "A 24/7 deal desk." on the 43.83 beat.
- The words drop at about 42.9 while the plane is still tilted, so they're settled before it levels out.
The sound effects were moved to match: the fold whoosh, the pull-back whoosh, and soft ticks under the wave.
Worked · 8 steps
- Inspect break and card SFX spectra
- ToolSearch
- Browser: navigate
- Browser: javascript tool
- Browser: javascript tool
- Browser: tabs close mcp
- Cut the requested notification and build a soft card sound
- Build soft card sound, update cues, check
Three changes: drop the breaking sound, swap in your notification, and soften the card drops. First I'll check what each of the opening break sounds actually contains.
The break's bass impact is almost all low end, and the crackle is the separate break_crumble layer, so I'll just remove that one. Next, the notification you linked:
I'm building the softer card-landing sound; a small length mismatch in the mix needs fixing first.
All three sound changes are in. Check passes; I haven't listened to the result or committed. Have a listen in Studio around 4s, 8.6–10.2s, 36–38.5s and 40.8–42.5s.
- Break (about 4.06s): the crackle/debris layer is gone. The bass impact and the whoosh into the inbox stay.
- Notifications: every chat ping now uses the Epidemic sound you linked ("Notifications, User Interface 11"). I trimmed it to start right on its first sound (about 0.54s long) and matched its loudness to the other effects. It plays on all six pings: the three in the opening and the three in the late-night callback.
- Falling cards: I replaced the dry high ticks with a new soft landing sound. It's built from our existing pop, pitched down, with the sharp top end rolled off, a gentler attack and a short airy room tail. It plays eight times as the wave of cards lands (40.9 to 42.3, every 0.2s), getting quieter as the wave moves away up the plane.
If the card landings still feel too present or too sparse, I can make them quieter or space them differently. The other option is an actual soft paper/card sound from Epidemic.
Worked · 2 steps
- List SFX cues around the break
- Bass-only break sound, drop the whoosh
The crackle is already gone. The high-pitched swoosh is the separate whoosh layered at 4.1s, so I'll remove it. I'll also low-pass the impact so only its bass remains.
The break now has only the bass impact. The breaking crackle was already gone; the high-pitched swoosh you heard was a separate whoosh layered at 4.1s, and I've removed it.
I also made a low-passed version of the impact (assets/sfx/break_bass.wav) that keeps just the low thump; almost nothing above 300Hz is left. It plays at the same moment (4.06s), at about the same weight as before.
Check it in Studio around 4s. If the bass hit now feels too weak on its own, I can turn it up or add a little sub boom underneath.
Worked · 4 steps
- Snapshot and crop the click moment
- Read click_crop.png
- Aim the cursor at the button centre
- Read click_crop2.png
I'll check exactly where the cursor tip lands at the click.
The tip lands on the bottom edge of the arrow circle, barely touching it. I'll move it onto the centre of the arrow button so the click reads clearly:
The end cursor now clicks right on the arrow button. Its tip was landing on the circle's bottom edge; it now lands near the centre. Check passes and I confirmed it on a close crop of the click frame at 49.9s.
The hover, press and fade-out are unchanged.
Worked · 5 steps
- Browser: navigate
- Browser: javascript tool
- Browser: tabs close mcp
- Fetch the whoosh, speed it up 1.25x, trim and level
- Cue the new break whoosh
The whoosh is all low end and peaks 0.16s after it starts once sped up, so I'll start it at 3.96 to peak right as the line breaks.
I've added the Epidemic whoosh you linked ("Swooshes, Whoosh, Low, Short 04") to the break, layered on the bass impact; I haven't listened to the mix.
- Speed: sped up to 1.25× without changing pitch, so it's about 1.3s long.
- Timing: it starts at 3.96s and peaks at about 4.12s, just as the line splits and the camera punches through, then tails off into the inbox.
- Character: it's all low end, so there's no high hiss.
- Level: matched to the other effects; it's in as
assets/sfx/whoosh_break.wav.
If the peak feels early or late against the visual, I can nudge it by a few hundredths of a second, or speed it up a little more.
Worked · 1 step
- Build a low-mid punch impact and cue it
The impact is back, as a low punch with no top end, layered under the new whoosh at 4.06s; I haven't listened to the mix.
- What it is: a new
break_punch.wav, built from the original impact. I kept its thump and low-mid knock and cut everything above about 750Hz, so the bright, high-pitched part you disliked is completely gone (0% above 1kHz). I also boosted the first 60ms by about 4dB so the hit lands with a punch. - Level: a bit louder than the bass-only version it replaces.
Most of its energy is still deep bass, so it'll feel strong on headphones and big speakers but lighter on laptop speakers. If it doesn't cut through enough there, I can add a short, round "knock" layer in the low mids, still nothing high.
Worked · 1 step
- Slow the "But it doesn't…" typing to 2.15s
"But it doesn't have to be that way." now takes longer to type, so the pause after it is much shorter. Check passes; I haven't committed.
- Typing: still starts at 11.15, but now takes 2.15s instead of 1.25s, finishing at about 13.3 instead of 12.4.
- Pause: the hold before the highlight starts selecting the line (13.68) drops from about 1.3s to under 0.4s.
- Sound: the keyboard sound is stretched to cover the full 2.15s of typing.
- Unchanged: the select at 13.68, the delete on the 14.47 thud and Meet Mila on the 15.00 drop.
Worked · 3 steps
- Commit the latest tweaks
- Render the full video to MP4
- Check render output and file details
Committed as 1528e89. Starting the render now (standard quality, 30fps):
The render is running in the background (the commit is 1528e89). I'll report back with the file when it finishes.
The render finished without errors. It's 53.4s at 1920×1080, 30fps, with audio (26 MB):
/Users/gulipad/dev/mila-launch-video/video/renders/mila-v2.mp4
Open it with ! open video/renders/mila-v2.mp4.
- Overall level: the renderer turned the whole mix down by 5.5dB because the music and sound effects together peaked too hot. It sounds clean but a bit quieter than it could be. A proper mix pass, turning down the effects that stack up rather than everything at once, would get that loudness back.
- Licensing, before publishing:
- The music and sound effects are still Epidemic preview files, and they need swapping for the licensed downloads.
- The account is on the Creator plan, which doesn't cover company marketing, so it needs Business or Enterprise.
- The people photos are taken from capchase.com and the Figma file, so they may be real customers or employees and should be swapped for stock or generated faces.