Full stack developer · AI products · Philippines, remote
I build the AI that turns raw interviews into stories.
That's Plot, the product I lead at Butter Studio: hours of interview footage in, a story out, inside DaVinci Resolve and on the web. I also wire up business systems that never wanted to talk to each other, and payments that have to land exactly once.
The story
Seven parts, one arc
- 06:24
- Running time
- 12
- Clips
- 83
- Story score
Hook
The line that makes you stay.
1 clip, 00:28. Found at minute 66 of the raw interview, cut to the word and placed frame-accurate.
Illustrative example. Running time and score come from real test edits.
- Runs inside DaVinci Resolve
- Claude reads and writes through MCP
- Word-level cuts, frame-accurate
- Story score with fixes
Selected work
Systems, drawn to be questioned
- Claude Desktopeditor's own subscription
MCP only. No chat in the panel and no API key in Plot. Anthropic doesn't allow a third-party product to offer claude.ai login, so the key and subscription stay with the editor.
- Resolve MCPdoes the cutting
Its main tool is run_script: untyped Python strings, slower edits, no access to our engine or its tests. Claude uses it to cut. The panel doesn't.
- Plot MCPwrites the story back
Hand-written stdlib JSON-RPC on Python 3.9, about 150 lines at first, so no SDK and no pip on the editor's machine. Claude writes sections, sub-categories and the score back, and works through the editor's tasks.
- DaVinci Resolvethe real timeline
No move call in 21.1, and GetSourceStartFrame reads a frame low at 23.976, so source frames come from GetLeftOffset at the exact NTSC rate.
- Python enginepy3.9 · stdlib · typed JSON
Reads the cut back and maps every clip to the transcript. A reorder is DeleteClips plus one AppendToTimeline: 73 ms for 37 clips, two undo entries. It refuses what it can't move safely.
- Story sidecarone JSON per timeline
Keyed on clip numbers with a fingerprint of the cut, so a changed cut marks the story stale. The story follows the footage, not the position, so labels survive trims and reorders.
- React panelone committed renderer.js
Strict CSP, so no inline styles. dnd-kit and Radix inject style tags, so their rules live in a stylesheet with a test that fails on upgrade, and a CSP gate scans the built bundle.
- Sheet
- 1 of 4 · Plot
- Client
- Butter Studio
- Role · period
- Full Stack Developer · 2024 to now
- Stack
- Claude API · MCP · OpenAI API · Next.js
- Status
- Active
Experience
- Sep 2024 to nowFull Stack Developer · Butter Studio (Plot)
- OngoingEngineer · Client under NDA
- 2026Freelance developer · QC Chart AI
- Aug 2023 to Oct 2025Full Stack Developer · Bless Payments
- May 2023BS Computer Science · University of Rizal System
GitHub
Mostly private, rarely quiet
- 1,569
- Contributions, last 12 months
- 99.9%
- In private repos
- 10
- Repos contributed to
- 48
- Busiest day (2026-04-14)
Languages across the repos I commit to
- TypeScript · 5 repos
- Python · 3 repos
- JavaScript · 1 repo
Early public projects
- bookPython · 2023
- For-QuizTypeScript · 2023
- ChickNJhorgeTypeScript · 2023
- thesis-abstractTypeScript · 2023
- V380-RecorderPython · 2022
- hbomb-appTypeScript · 2022
From github.com/TorrCod, snapshot 2026-10-29. Client code is private, so most of this shows up as counts.