<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Managing the Machine]]></title><description><![CDATA[A senior engineer on building software with AI, shipping real products, and where tech goes next.]]></description><link>https://managingthemachine.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!Bp0G!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7070a86f-d3b5-4213-a03b-63245696f604_1024x1024.png</url><title>Managing the Machine</title><link>https://managingthemachine.substack.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 04 Jun 2026 16:28:12 GMT</lastBuildDate><atom:link href="https://managingthemachine.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Florent Berrez]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[managingthemachine@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[managingthemachine@substack.com]]></itunes:email><itunes:name><![CDATA[Florent Berrez]]></itunes:name></itunes:owner><itunes:author><![CDATA[Florent Berrez]]></itunes:author><googleplay:owner><![CDATA[managingthemachine@substack.com]]></googleplay:owner><googleplay:email><![CDATA[managingthemachine@substack.com]]></googleplay:email><googleplay:author><![CDATA[Florent Berrez]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[I stopped recording my screen to make demo videos]]></title><description><![CDATA[The demo is a webpage. Claude Code drives the browser. ffmpeg does the rest.]]></description><link>https://managingthemachine.substack.com/p/i-stopped-recording-my-screen-to</link><guid isPermaLink="false">https://managingthemachine.substack.com/p/i-stopped-recording-my-screen-to</guid><dc:creator><![CDATA[Florent Berrez]]></dc:creator><pubDate>Tue, 02 Jun 2026 12:04:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JY-b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JY-b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JY-b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!JY-b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!JY-b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!JY-b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JY-b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:158952,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://managingthemachine.substack.com/i/200096680?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JY-b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!JY-b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!JY-b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!JY-b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe08a111e-322e-4179-9ca7-dc0e4774cc13_2400x1260.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Every time I shipped a side project, the same wall showed up at the end: the demo video. The thing people actually watch before they read a word. And the normal way to make one is miserable.</p><p>You open a screen recorder, rehearse the clicks, fluff a take, redo it. You drop the clip into an editor, trim, add a caption, render. The export looks soft because a video codec compressed your crisp UI into smears. You spot a typo in the third second, and now you re-record the whole thing. A two minute clip eats an afternoon.</p><p>So I stopped recording my screen. Here is what I do instead.</p><h2>The demo is a webpage</h2><p>The trick is to stop treating the screen as the source of truth. The screen is a lossy copy of something. Make that something a file you control.</p><p>I write the demo as a single HTML page. CSS animations for the motion, a tiny JavaScript timeline for the choreography. A dashboard fades in, a chart draws itself, a row slams into place, a number counts up. None of it is a recording of a real app. It is a reconstruction of the app&#8217;s interface in its own colors and fonts, built to play on a clock.</p><p>Two things make this page recordable rather than just pretty.</p><p>First, one knob controls all the timing. Every duration in the CSS reads <code>calc(var(--d) * 0.6s)</code> instead of a hard <code>0.6s</code>. Set <code>--d</code> to 1 and it plays at normal speed in the browser. Set it to 7 and the whole demo crawls, uniformly, every transition stretched by the same factor. That single variable is what lets me slow the motion down later without re-timing anything by hand.</p><p>Second, the page reports where it is. A small script schedules each beat with <code>at(ms, fn)</code>, exposes the current animation time on <code>window.__t</code>, and flips <code>window.__demoDone</code> to true at the end. So a script driving this page always knows the exact frame it is looking at and when the show is over.</p><h2>Claude Code drives the browser</h2><p>This is where the Playwright MCP comes in. I ask Claude Code to open the page in Chrome, crank <code>--d</code> up so everything plays in slow motion, and then sit in a loop: grab a frame, check the animation clock, grab the next frame, until the page says it is done.</p><p>The frames come out through Chrome&#8217;s DevTools protocol as plain JPEGs, not through a video encoder. That is the whole point. There is no codec in the capture loop, so there is no compression smear. Each frame is stamped with the <code>window.__t</code> value it was taken at, so I know its real position on the timeline rather than guessing from a frame count.</p><p>The slow motion is not for looks. The capture runs at about eleven frames a second, which would be a stutter at real speed. But the page is playing at fifteen percent of normal, so those eleven real captures cover a sliver of actual motion. Stretch them back out and you get more than seventy distinct frames for every second of final video. You are sampling the animation far denser than the output needs.</p><h2>ffmpeg puts it back together</h2><p>Now I have a folder of JPEGs and a timestamp for each one. I hand ffmpeg the list with each frame&#8217;s real duration and ask for a constant sixty frames a second, H.264, high quality.</p><p>Because the captured frame rate is higher than sixty, ffmpeg picks real frames to land on each output slot instead of duplicating one or inventing a blurry in-between. The result is genuine sixty frames a second of motion, built entirely from frames that actually existed, so the interface stays sharp and nothing smears.</p><p>If I want sound, ffmpeg muxes a CC0 track underneath, trimmed to length with gentle fades and normalized so the music sits under the visuals instead of fighting them. A few seconds of the best beat get pulled out as a looping GIF for social.</p><h2>What this buys you</h2><p>Here are three reels made this exact way. Each one reconstructs a product&#8217;s real interface and plays it on a timeline, captured frame by frame, never recorded.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;04868122-9b06-46d5-b18d-da911ebbbb49&quot;,&quot;duration&quot;:null}"></div><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;6885e8d2-f39e-4adb-b5e1-fa2069da8603&quot;,&quot;duration&quot;:null}"></div><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;8b578d1d-af8f-4af1-979b-05223cb0647a&quot;,&quot;duration&quot;:null}"></div><p>The reason I will never go back: it is code, so it is repeatable. A stat is wrong? Change a number and rerun. A beat feels rushed? Nudge one timestamp. Want the same demo for four different products? Loop over four pages and render them all while you make coffee. There is no take to redo and no quality lost to another export.</p><p>The studio is a browser. The editor is a script. The footage never touches a codec until the last step, so it stays sharp the whole way through.</p><h2>Next</h2><p>I am writing one of these a week: how I actually work with AI as a senior engineer, and the small mechanical tricks that turn out to matter. If that sounds useful, subscribe and the next one lands in your inbox.</p><p>One question back to you, because it shapes what I write next: what is the last thing you made that took an afternoon and should have taken ten minutes? Reply and tell me. I read every one.</p>]]></content:encoded></item><item><title><![CDATA[I manage AI like a junior engineer]]></title><description><![CDATA[Ten years in startups taught me to delegate the typing and keep the judgment.]]></description><link>https://managingthemachine.substack.com/p/i-manage-ai-like-a-junior-engineer</link><guid isPermaLink="false">https://managingthemachine.substack.com/p/i-manage-ai-like-a-junior-engineer</guid><dc:creator><![CDATA[Florent Berrez]]></dc:creator><pubDate>Wed, 27 May 2026 21:19:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qHa_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qHa_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qHa_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png 424w, https://substackcdn.com/image/fetch/$s_!qHa_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png 848w, https://substackcdn.com/image/fetch/$s_!qHa_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png 1272w, https://substackcdn.com/image/fetch/$s_!qHa_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qHa_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be187736-7174-43d1-89f2-e552898b4053_4800x2520.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:345942,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://florentberrez.substack.com/i/199519321?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qHa_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png 424w, https://substackcdn.com/image/fetch/$s_!qHa_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png 848w, https://substackcdn.com/image/fetch/$s_!qHa_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png 1272w, https://substackcdn.com/image/fetch/$s_!qHa_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe187736-7174-43d1-89f2-e552898b4053_4800x2520.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Ten years in, mostly at startups, I write less code by hand than at any point in my career. Not because I stopped caring about the craft. Because I found a better seat: the one where I decide what gets built and whether it is good enough to ship.</p><p>I work with AI every day now. Not as a magic box I type wishes into, and not as autocomplete. I work with it the way I would manage a sharp, fast, slightly overconfident junior engineer. That one shift changed how much I can build, and it is what this newsletter is about.</p><p>Here is what it looks like in practice.</p><h2>I hand over goals, not keystrokes</h2><p>A junior does their best work when you give them a clear outcome and the constraints around it, then get out of the way. &#8220;Build the admin dashboard for my projects. Here is the data model. Make it boring and reliable.&#8221; Not &#8220;create a file called route.ts and add a GET handler.&#8221;</p><p>So I delegate at the level of intent. I say what done looks like, what it must not break, where the edges are. Then I let it run. The good ones surprise you with how far they get from one good sentence.</p><h2>I review like it is my name on the commit</h2><p>Delegation without review is just hoping. The first pass, from a junior or a model, is often wrong in a way you only catch when you look at the actual result. A loader that never appears. A layout that breaks at the one width you forgot. A feature that is &#8220;done&#8221; but quietly half-wired.</p><p>So I stay close as the quality gate. I read the diff. I run the thing. I look at the rendered screen, not the description of it. When it takes a wrong turn, I catch it early and redirect in a sentence, instead of letting it pour another hour into the wrong idea. A confident wrong move I can correct beats ten minutes of hedging.</p><h2>I make it prove the work</h2><p>The highest-leverage instruction I give is simple: do not tell me it works, show me. Take the screenshot. Run the test. Open the page and click the thing. A junior stops saying &#8220;should be fine&#8221; once you ask for proof every time. A model is no different. &#8220;Verify it end to end before you call it done&#8221; turns a confident guess into a checked result.</p><h2>I write the context down once</h2><p>What makes a junior fast by month three is not raw talent. It is that they stopped needing the same explanation twice. The conventions, where things live, the things we never do: written down once, referenced forever.</p><p>I treat the model the same way. The standing instructions, the repeatable routines, the access to check real state instead of guessing, I put them in place once so I never re-explain. It is onboarding, and the payoff compounds.</p><h2>What that buys</h2><p>Working this way, in a month I shipped more finished things than I used to ship in a quarter. An admin dashboard for my whole project portfolio, with its own tool layer so the model can act on real data. A markdown-to-everywhere publishing tool. A keyboard-first database client. A mobile app. I usually have two or three of them running at once, each delegated, each reviewed.</p><p>None of it is magic. It is the same management I would give a person, pointed at something that types faster and never gets tired, and that still needs someone with taste deciding what good means.</p><h2>What this is</h2><p>I am going to write here, once a week, about how I actually work: the delegation, the reviewing, the small systems I build so the machine stays useful instead of just impressive. I will write about where I think tech is going, with opinions I am willing to be wrong about in public. And I will build my projects in the open, the parts that work and the parts that break.</p><p>If any of that sounds useful, subscribe. And tell me one thing to get us started: what is the last task you handed to AI that fell apart on you? Hit reply and tell me. That is what I want to write about next.</p><p>Florent</p>]]></content:encoded></item></channel></rss>