I had Claude make the same video twice, 5 months apart. The difference is staggering.
Back in May, I had Claude Code make a demo video for Videowright, my open source tool for making videos in Claude Code. Last week I had it make the same video again: same script, same brief, but Opus 5.5 instead of Opus 4.7. The attached video compares them.
The video gen tool: scosman/videowright
What changed in 5 months
- 🎨 Design: May was basic text on a grid. Now it's rich animation and vector graphics, with a logo that draws itself.
- 🌍 3D: May was a spinning polygon. Now it renders real-time scenes on the GPU (the planet's coastlines, clouds and atmosphere are computed per pixel).
- 🖱️ Product UI: May was a dashboard that played itself. Now someone's actually using it: a cursor, a panning camera, a real route change.
- 🗣️ Narration sync: May synced by line. Now it's timed to every word.
- 🎙️ Voice: May was a stock ElevenLabs v2 voice. Now it's my own cloned voice on ElevenLabs v4, which can take emotion cues.
It's a fair comparison
Same script, same brief. Claude built the new one from scratch, and never opened the old video's code or renders. The style brief was literally "rebuild the style with the new model making the decisions".
It wasn't a one-shot. My notes were mostly taste: "too much text on screen", "more breathing room here", "this title is too busy". Claude did the rest: code, motion, audio sync, mixing.
The two full videos
Old video (May): on YouTube
New video (Nov): on YouTube
This video was made the same way
The comparison video above was also made in Claude Code with Videowright. It plays both real renders inside the motion graphics, syncs every cut to my voice, and mixes in music and sound effects.
What Videowright adds
While you can just prompt Claude Code to make a video, Videowright adds a bunch of helpful features:
- Live preview: a dev server that hot-reloads as you build. Say "make that motion a bit slower" and see it immediately.
- Styles: built-in templates, or create your own to reuse across videos
- AI voiceovers (ElevenLabs, Gemini, others), or record your own: it gets word timings and syncs the video to your pace
- Sound effects and music: sources and mixes many audio sources. Gen AI and open-source options.
- Mix in real video: drop in MP4s and it works them into the motion design
- Export to MP4: deterministic frame-by-frame rendering, no dropped frames
It's free and open source: scosman/videowright
What should I compare next? Hopefully folks find it helpful!
2 comments
I built a free, private meeting recorder for Mac entirely with Claude Code. You can chat with your meeting notes in Claude Desktop via MCP
I'm an ex-Apple engineer who got sick of non-private, non-native meeting recording apps, so I built Biscotti: a private and free meeting recorder for macOS.
Free, no account, no subscription, no upsell. Source is on GitHub: scosman/Biscotti
The whole app was built with Claude Code. It also has a built-in MCP server, so you can chat with your meeting notes and transcripts in Claude Desktop. Ask things like "What did Sarah and I agree to last time?" or "Draft a follow-up email from today's design review" (see demo video).
What it does
- 🔒 Private by design - recording, transcription, and AI all run on your Mac. Your data stays local.
- 🧠 Powerful AI summaries - automatic summaries, action items, meeting titles, and real speaker names.
- 🤖 No bots, any app - records Zoom, Teams, Meet, FaceTime, Slack huddles, or even an in-person conversation. No bot joins your call.
- 🗣️ Knows who said what - transcripts split by speaker, and it recognizes voices across meetings to tag names automatically.
- 💬 Chat with your meetings - MCP server for Claude Desktop. Claude can search your meetings and read summaries, notes, and full transcripts.
- 📅 Calendar-aware - sees your upcoming meetings, offers to start recording.
- ⏹️ Auto-stop - detects when your call ends and stops recording.
- 🎤 Voice isolation - captures your mic and everyone else as separate, clean channels. No echo.
- 🌍 Any language - detects the spoken language automatically.
- 🔍 Search and import - instant full-text search across thousands of meetings, plus import from Granola or any CSV.
Private AI == Local AI
With Biscotti, you still get state-of-the-art AI for transcription, speaker identification, and summaries. It just runs locally on your Mac. It works fully offline once the models are downloaded. Your data lives on your Mac, and you own and control it.
(Yes, Claude Code isn't local, and if you chat with your meetings in Claude Desktop, Claude sees what it retrieves. But the app itself runs all of its AI on-device, and nothing leaves your Mac unless you connect it.)
How I built it with Claude Code
I spent years at Apple building the Photos app, Memories, the lock screen, and more, and I wanted this to feel like it belongs on the Mac: Swift and SwiftUI, launches instantly, small on disk. Claude Code wrote the code: the native app, system audio capture, the on-device model pipeline, SQLite full-text search, and the MCP server.
I used spec-driven development with /spec, a Claude Code skill I open-sourced: scosman/vibe-crafting
Demo Video Made in Claude Code Too!
The demo video was also done in Claude Code with Videowright: another open-source skill/framework I made for making videos with claude.
scosman/videowright
Try it (free)
Download the notarized app: scosman/Biscotti
Requirements: Apple Silicon (M1+), macOS 15+, 16GB RAM recommended.
App details: Notarized, Free (no upsell), Private (zero data collection, all AI is local), Source Available on GitHub (PolyForm Perimeter License), built with Claude Code using spec-driven development.
What should I build next? And what else would you want Claude to be able to do with your meeting notes/transcripts?
129 points · 71 comments
I built an open source, OpenEnv-compatible framework for building RL environments for LLM agents. Named "Seahaven" after the fake town in The Truman Show.
For multi-turn, tool-use agents, the environment is the hard part. Every episode needs realistic data, stateful tools (a write on turn 3 changes a read on turn 30), and a reset to the exact same starting state. Thousands of times, in parallel.
I've been working on some version of optimizing AI for over a decade (at Apple, my own startup, now Kiln). Recently I built a few large RL environments by hand. Doable, but hard, and every one rebuilt the same layer: a database per episode, frozen starting states, parallel instances, clock control, a log of every change. That layer needed a great framework, so I built one: Seahaven.
What it is: an open source (MIT) Python framework for building synthetic worlds for LLM agents: working copies of an agent's tools and data. You write just the logic specific to your world. Seahaven handles the rest. Every world is an OpenEnv environment.
Example World: a fake Stripe. Stripe World has 24 tables and 155 API operations, behind the same tools as Stripe's own MCP server. It also serves Stripe's REST API, so well that the official Stripe SDK works against it unchanged.
What Seahaven handles:
- Stateful: each instance has its own SQLite DB. The agent's tool calls read and write it (actions are tool calls, observations are their results).
- Fixtures: freeze starting states like small_startup or big_co, and reuse them across every episode (reset gives you a fresh copy of a fixture in milliseconds).
- Parallel: each connection gets its own instance, hundreds of instances per process.
- Reward from state: every row the agent changed is logged, before and after. Grade the result, not the trace (verifiable rewards, no LLM judge needed for most tasks).
- Deterministic: same fixture, same clock, same random seed, same episode. The clock and seed are wired into the SQLite connection, so even random() and CURRENT_TIMESTAMP in SQL replay exactly.
- Composable: your world can include Stripe World (or any other world) to add its tools and APIs.
- Optimized for agents: includes the docs, linter and tests your coding agent needs to build a world.
An episode loop looks like this:
from seahaven.openenv import SeahavenClient
with SeahavenClient(base_url="127.0.0.1") as env:
for episode in range(100):
env.reset(fixture="big_co", seed=episode) # fresh private world, in ms
run_policy(env) # your agent calls tools: env.call("create_lead", ...)
reward = grade(env.state()) # every row the agent changed
OpenEnv Compatible + MCP + Web Console:
- Every world is an OpenEnv environment, so it works with TRL's OpenEnv support or any other OpenEnv-compatible trainer. Sync and async clients. You can publish worlds to Hugging Face.
- seahaven mcp serves a world to any MCP client, so you can try a task by hand before your policy does.
- seahaven serve has a web console: open instances, call tools, and inspect state in your browser.
- Everything runs locally: Python 3.14+ and SQLite, no external services.
I built it at Kiln, where we use it to evaluate and optimize agents. Seahaven is standalone. You don't need Kiln to use it.
Seahaven is open source (MIT).
Links
- Seahaven on GitHub
- Stripe World
- Docs
- Kiln Harness Optimizer: our optimizer that optimizes the harness instead of the model (not RL, but it needs the same tooling)
What would make it fit your training setup? I'm thinking about reward helpers, fixtures as a curriculum, and more example worlds. Happy to answer any questions.
Side note: I made the video with videowright, another open source project of mine.
19 points · 3 comments
I built an open source framework for building RL environments. Named "Seahaven" after the fake town in The Truman Show.
I've been optimizing long-running agents: rewriting their prompts, tools, skills and subagents, and keeping the changes that score better. I've been working on some version of this problem for over a decade (at Apple, my own startup, now Kiln).
The hard part is the eval environment. It needs realistic data, stateful writes, and a respawn from the same starting point for every single run. So I built the Seahaven framework.
Production and staging don't work: they're shared, and you can't reset them. Hand-written mocks reset fine, but they don't hold state, and they aren't realistic enough to fool an agent. And for long tasks, you want to grade what the agent actually changed in the world, not read a 50-turn transcript.
I built a few one-off environments. Doable, but hard, and every one rebuilt the same layer: a database per run, frozen starting states, parallel instances, clock control, a log of every change. So I pulled that layer into an open source framework. You write just the logic specific to your world. Seahaven handles the rest.
Why: evals and RL. Both need the same thing: thousands of isolated agent runs, each from a known starting state, graded on what the agent changed. I've mostly used Seahaven for harness optimization with evals. I'm starting to tinker with RL, and I'd love to hear from anyone who tries it with GRPO.
Example World: a fake Stripe. Stripe World has 24 tables and 155 API operations, behind the same tools as Stripe's own MCP server. It also serves Stripe's REST API, so well that the official Stripe SDK works against it unchanged.
What Seahaven handles:
- A private world per run: each connection gets its own instance, and each instance gets its own SQLite DB, copied from a fixture in milliseconds. The agent can break anything.
- Fixtures: freeze starting states like small_startup or big_co, and reuse them across every run.
- Parallel: hundreds of instances per process.
- State diffs: every row the agent changed is logged, so you grade the result, not just the trace.
- Reproducible: same fixture, same clock, same random seed, same run.
- Composable: your world can include Stripe World (or any other world) to add its tools and APIs.
- Optimized for agents: includes the docs, linter and tests your coding agent needs to build a world.
The loop can be as simple as this:
for rollout in range(100):
with world.instance("big_co", seed=rollout) as inst:
run_agent(inst) # your agent, your harness
reward = grade(inst.state()) # every row the agent changed
OpenEnv Compatible + MCP + Web Console:
- Every world is an OpenEnv environment, so it works with Kiln auto-optimize, TRL's OpenEnv support or any other OpenEnv-compatible tool. You can publish worlds to Hugging Face.
- seahaven mcp serves a world to any MCP client, so you can point a local model at it.
- seahaven serve has a web console: open instances, call tools, and inspect state in your browser.
- Everything runs locally: Python 3.14+ and SQLite, no external services.
I built it at Kiln, and Kiln uses it to evaluate and optimize agent harnesses. But Seahaven is standalone -- you don't need Kiln to use it.
Seahaven is open source (MIT).
Links
- Seahaven on GitHub
- Stripe World
- Docs
- Kiln for optimizing harnesses
Which world should I build next? Happy to answer any questions.
Side note: I made the video with videowright, another open source project of mine.
32 points · 13 comments
Mentions
I had Claude make the same video twice, 5 months apart. The difference is staggering. Back in May, I had Claude Code make a demo video for Videowright, my open source tool for making videos in Claude Code. Last week I had it make the same video again: same script, same brief, but Opus 5.5 instead of Opus 4.7. The attached video compares them. The video gen tool: scosman/videowright What changed in 5 months - 🎨 Design: May was basic text on a grid. Now it's rich animation and vector graphics, with a logo that draws itself. - 🌍 3D: May was a spinning polygon. Now it renders real-time scenes on the GPU (the planet's coastlines, clouds and atmosphere are computed per pixel). - 🖱️ Product UI: May was a dashboard that played itself. Now someone's actually using it: a cursor, a panning camera, a real route change. - 🗣️ Narration sync: May synced by line. Now it's timed to every word. - 🎙️ Voice: May was a stock ElevenLabs v2 voice. Now it's my own cloned voice on ElevenLabs v4, which can take emotion cues. It's a fair comparison Same script, same brief. Claude built the new one from scratch, and never opened the old video's code or renders. The style brief was literally "rebuild the style with the new model making the decisions". It wasn't a one-shot. My notes were mostly taste: "too much text on screen", "more breathing room here", "this title is too busy". Claude did the rest: code, motion, audio sync, mixing. The two full videos Old video (May): on YouTube New video (Nov): on YouTube This video was made the same way The comparison video above was also made in Claude Code with Videowright. It plays both real renders inside the motion graphics, syncs every cut to my voice, and mixes in music and sound effects. What Videowright adds While you can just prompt Claude Code to make a video, Videowright adds a bunch of helpful features: - Live preview: a dev server that hot-reloads as you build. Say "make that motion a bit slower" and see it immediately. - Styles: built-in templates, or create your own to reuse across videos - AI voiceovers (ElevenLabs, Gemini, others), or record your own: it gets word timings and syncs the video to your pace - Sound effects and music: sources and mixes many audio sources. Gen AI and open-source options. - Mix in real video: drop in MP4s and it works them into the motion design - Export to MP4: deterministic frame-by-frame rendering, no dropped frames It's free and open source: scosman/videowright What should I compare next? Hopefully folks find it helpful!
I built a free, private meeting recorder for Mac entirely with Claude Code. You can chat with your meeting notes in Claude Desktop via MCP I'm an ex-Apple engineer who got sick of non-private, non-native meeting recording apps, so I built Biscotti: a private and free meeting recorder for macOS. Free, no account, no subscription, no upsell. Source is on GitHub: scosman/Biscotti The whole app was built with Claude Code. It also has a built-in MCP server, so you can chat with your meeting notes and transcripts in Claude Desktop. Ask things like "What did Sarah and I agree to last time?" or "Draft a follow-up email from today's design review" (see demo video). What it does - 🔒 Private by design - recording, transcription, and AI all run on your Mac. Your data stays local. - 🧠 Powerful AI summaries - automatic summaries, action items, meeting titles, and real speaker names. - 🤖 No bots, any app - records Zoom, Teams, Meet, FaceTime, Slack huddles, or even an in-person conversation. No bot joins your call. - 🗣️ Knows who said what - transcripts split by speaker, and it recognizes voices across meetings to tag names automatically. - 💬 Chat with your meetings - MCP server for Claude Desktop. Claude can search your meetings and read summaries, notes, and full transcripts. - 📅 Calendar-aware - sees your upcoming meetings, offers to start recording. - ⏹️ Auto-stop - detects when your call ends and stops recording. - 🎤 Voice isolation - captures your mic and everyone else as separate, clean channels. No echo. - 🌍 Any language - detects the spoken language automatically. - 🔍 Search and import - instant full-text search across thousands of meetings, plus import from Granola or any CSV. Private AI == Local AI With Biscotti, you still get state-of-the-art AI for transcription, speaker identification, and summaries. It just runs locally on your Mac. It works fully offline once the models are downloaded. Your data lives on your Mac, and you own and control it. (Yes, Claude Code isn't local, and if you chat with your meetings in Claude Desktop, Claude sees what it retrieves. But the app itself runs all of its AI on-device, and nothing leaves your Mac unless you connect it.) How I built it with Claude Code I spent years at Apple building the Photos app, Memories, the lock screen, and more, and I wanted this to feel like it belongs on the Mac: Swift and SwiftUI, launches instantly, small on disk. Claude Code wrote the code: the native app, system audio capture, the on-device model pipeline, SQLite full-text search, and the MCP server. I used spec-driven development with /spec, a Claude Code skill I open-sourced: scosman/vibe-crafting Demo Video Made in Claude Code Too! The demo video was also done in Claude Code with Videowright: another open-source skill/framework I made for making videos with claude. scosman/videowright Try it (free) Download the notarized app: scosman/Biscotti Requirements: Apple Silicon (M1+), macOS 15+, 16GB RAM recommended. App details: Notarized, Free (no upsell), Private (zero data collection, all AI is local), Source Available on GitHub (PolyForm Perimeter License), built with Claude Code using spec-driven development. What should I build next? And what else would you want Claude to be able to do with your meeting notes/transcripts?
I built an open source, OpenEnv-compatible framework for building RL environments for LLM agents. Named "Seahaven" after the fake town in The Truman Show. For multi-turn, tool-use agents, the environment is the hard part. Every episode needs realistic data, stateful tools (a write on turn 3 changes a read on turn 30), and a reset to the exact same starting state. Thousands of times, in parallel. I've been working on some version of optimizing AI for over a decade (at Apple, my own startup, now Kiln). Recently I built a few large RL environments by hand. Doable, but hard, and every one rebuilt the same layer: a database per episode, frozen starting states, parallel instances, clock control, a log of every change. That layer needed a great framework, so I built one: Seahaven. What it is: an open source (MIT) Python framework for building synthetic worlds for LLM agents: working copies of an agent's tools and data. You write just the logic specific to your world. Seahaven handles the rest. Every world is an OpenEnv environment. Example World: a fake Stripe. Stripe World has 24 tables and 155 API operations, behind the same tools as Stripe's own MCP server. It also serves Stripe's REST API, so well that the official Stripe SDK works against it unchanged. What Seahaven handles: - Stateful: each instance has its own SQLite DB. The agent's tool calls read and write it (actions are tool calls, observations are their results). - Fixtures: freeze starting states like small_startup or big_co, and reuse them across every episode (reset gives you a fresh copy of a fixture in milliseconds). - Parallel: each connection gets its own instance, hundreds of instances per process. - Reward from state: every row the agent changed is logged, before and after. Grade the result, not the trace (verifiable rewards, no LLM judge needed for most tasks). - Deterministic: same fixture, same clock, same random seed, same episode. The clock and seed are wired into the SQLite connection, so even random() and CURRENT_TIMESTAMP in SQL replay exactly. - Composable: your world can include Stripe World (or any other world) to add its tools and APIs. - Optimized for agents: includes the docs, linter and tests your coding agent needs to build a world. An episode loop looks like this: from seahaven.openenv import SeahavenClient with SeahavenClient(base_url="127.0.0.1") as env: for episode in range(100): env.reset(fixture="big_co", seed=episode) # fresh private world, in ms run_policy(env) # your agent calls tools: env.call("create_lead", ...) reward = grade(env.state()) # every row the agent changed OpenEnv Compatible + MCP + Web Console: - Every world is an OpenEnv environment, so it works with TRL's OpenEnv support or any other OpenEnv-compatible trainer. Sync and async clients. You can publish worlds to Hugging Face. - seahaven mcp serves a world to any MCP client, so you can try a task by hand before your policy does. - seahaven serve has a web console: open instances, call tools, and inspect state in your browser. - Everything runs locally: Python 3.14+ and SQLite, no external services. I built it at Kiln, where we use it to evaluate and optimize agents. Seahaven is standalone. You don't need Kiln to use it. Seahaven is open source (MIT). Links - Seahaven on GitHub - Stripe World - Docs - Kiln Harness Optimizer: our optimizer that optimizes the harness instead of the model (not RL, but it needs the same tooling) What would make it fit your training setup? I'm thinking about reward helpers, fixtures as a curriculum, and more example worlds. Happy to answer any questions. Side note: I made the video with videowright, another open source project of mine.
I built an open source framework for building RL environments. Named "Seahaven" after the fake town in The Truman Show. I've been optimizing long-running agents: rewriting their prompts, tools, skills and subagents, and keeping the changes that score better. I've been working on some version of this problem for over a decade (at Apple, my own startup, now Kiln). The hard part is the eval environment. It needs realistic data, stateful writes, and a respawn from the same starting point for every single run. So I built the Seahaven framework. Production and staging don't work: they're shared, and you can't reset them. Hand-written mocks reset fine, but they don't hold state, and they aren't realistic enough to fool an agent. And for long tasks, you want to grade what the agent actually changed in the world, not read a 50-turn transcript. I built a few one-off environments. Doable, but hard, and every one rebuilt the same layer: a database per run, frozen starting states, parallel instances, clock control, a log of every change. So I pulled that layer into an open source framework. You write just the logic specific to your world. Seahaven handles the rest. Why: evals and RL. Both need the same thing: thousands of isolated agent runs, each from a known starting state, graded on what the agent changed. I've mostly used Seahaven for harness optimization with evals. I'm starting to tinker with RL, and I'd love to hear from anyone who tries it with GRPO. Example World: a fake Stripe. Stripe World has 24 tables and 155 API operations, behind the same tools as Stripe's own MCP server. It also serves Stripe's REST API, so well that the official Stripe SDK works against it unchanged. What Seahaven handles: - A private world per run: each connection gets its own instance, and each instance gets its own SQLite DB, copied from a fixture in milliseconds. The agent can break anything. - Fixtures: freeze starting states like small_startup or big_co, and reuse them across every run. - Parallel: hundreds of instances per process. - State diffs: every row the agent changed is logged, so you grade the result, not just the trace. - Reproducible: same fixture, same clock, same random seed, same run. - Composable: your world can include Stripe World (or any other world) to add its tools and APIs. - Optimized for agents: includes the docs, linter and tests your coding agent needs to build a world. The loop can be as simple as this: for rollout in range(100): with world.instance("big_co", seed=rollout) as inst: run_agent(inst) # your agent, your harness reward = grade(inst.state()) # every row the agent changed OpenEnv Compatible + MCP + Web Console: - Every world is an OpenEnv environment, so it works with Kiln auto-optimize, TRL's OpenEnv support or any other OpenEnv-compatible tool. You can publish worlds to Hugging Face. - seahaven mcp serves a world to any MCP client, so you can point a local model at it. - seahaven serve has a web console: open instances, call tools, and inspect state in your browser. - Everything runs locally: Python 3.14+ and SQLite, no external services. I built it at Kiln, and Kiln uses it to evaluate and optimize agent harnesses. But Seahaven is standalone -- you don't need Kiln to use it. Seahaven is open source (MIT). Links - Seahaven on GitHub - Stripe World - Docs - Kiln for optimizing harnesses Which world should I build next? Happy to answer any questions. Side note: I made the video with videowright, another open source project of mine.