<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Chauncey Wang</title>
    <description>The latest articles on DEV Community by Chauncey Wang (@chncwang).</description>
    <link>https://dev.to/chncwang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4029378%2F71a792f4-5747-49a1-8ea6-518d3e31d5d7.png</url>
      <title>DEV Community: Chauncey Wang</title>
      <link>https://dev.to/chncwang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chncwang"/>
    <language>en</language>
    <item>
      <title>Claude Code can make videos: it records the app, narrates with ElevenLabs, and syncs audio to video automatically</title>
      <dc:creator>Chauncey Wang</dc:creator>
      <pubDate>Sat, 15 Aug 2026 03:40:08 +0000</pubDate>
      <link>https://dev.to/chncwang/claude-code-can-make-videos-it-records-the-app-narrates-with-elevenlabs-and-syncs-audio-to-video-7g8</link>
      <guid>https://dev.to/chncwang/claude-code-can-make-videos-it-records-the-app-narrates-with-elevenlabs-and-syncs-audio-to-video-7g8</guid>
      <description>&lt;p&gt;I'm a solo builder. I needed a 2-minute product demo for &lt;a href="https://clintrialfinder.info" rel="noopener noreferrer"&gt;ClinTrialFinder&lt;/a&gt; — a free tool I built that matches cancer patients to clinical trials. I can fumble through OBS and iMovie, but I'm not proficient — and Claude Code does it faster.&lt;/p&gt;

&lt;p&gt;So I asked &lt;strong&gt;Claude Code&lt;/strong&gt; — an agentic coding tool — to make it. And it did: a narrated walkthrough where the voiceover lands exactly on the on-screen action. I never opened a screen recorder. I never opened a video editor. I never manually lined up a single caption to a single frame.&lt;/p&gt;

&lt;p&gt;Here's &lt;a href="https://www.youtube.com/watch?v=gbVJLpa22Io" rel="noopener noreferrer"&gt;the video it produced&lt;/a&gt;. This post is about the three things the agent did to make it — because I think that combination is new.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. It recorded the app — no screen recording
&lt;/h2&gt;

&lt;p&gt;Instead of me screen-capturing a session by hand, the agent wrote a Playwright script that drives the &lt;strong&gt;real, live web app&lt;/strong&gt;: it opens the site, fills out the 10-step patient wizard with a synthetic case, submits, and records the finished results page — all headless, straight to video.&lt;/p&gt;

&lt;p&gt;That means no manual take, no re-shooting when I fumble a click, no "oops the mouse jittered." The recording is &lt;strong&gt;code&lt;/strong&gt;, so it's deterministic and repeatable. When the product changes, the agent re-runs the script and out comes a fresh clip. It even injected a fake cursor that glides between elements, because a headless recording has no real mouse pointer.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. It generated the narration — no microphone
&lt;/h2&gt;

&lt;p&gt;I didn't record a voiceover. The agent wrote the narration script, then called the &lt;strong&gt;ElevenLabs&lt;/strong&gt; text-to-speech API to synthesize it in a clean, consistent voice. If I want to change a line, it edits the text and regenerates that clip in seconds — no re-recording, no "let me find a quiet room," no matching my tone across takes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// the agent calls ElevenLabs per narration phrase&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.elevenlabs.io/v1/text-to-speech/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;VOICE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xi-api-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eleven_multilingual_v2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. It aligned audio to video — no timeline editor
&lt;/h2&gt;

&lt;p&gt;This is the part that normally needs a human in a video editor, dragging clips around a timeline until the words match the picture. The agent did it &lt;strong&gt;automatically&lt;/strong&gt;, and this is the genuinely clever bit:&lt;/p&gt;

&lt;p&gt;While recording, it logs the timestamp of every key on-screen moment — the submit click, the results appearing, a trial opening, the "copy to AI" dropdown.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;beat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`BEAT &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; @ &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;s`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// BEAT submit-click   @ 46.83s&lt;/span&gt;
&lt;span class="c1"&gt;// BEAT results-shown  @ 68.73s&lt;/span&gt;
&lt;span class="c1"&gt;// BEAT trial-open     @ 90.17s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then it cuts the narration into phrases, one per beat, and places each phrase at its beat's timestamp in the final mix (&lt;code&gt;ffmpeg&lt;/code&gt;'s &lt;code&gt;adelay&lt;/code&gt;). The result: when the voice says "now it goes to work," the button is being clicked; when it says "open any trial," the trial is opening. &lt;strong&gt;The sync falls out of the recording itself&lt;/strong&gt; — no dragging, no eyeballing, no manual alignment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Making a product demo used to mean: screen-record a take, write a script, record a voiceover, then sit in an editor syncing them. Four manual steps, each needing a skill (or a person).&lt;/p&gt;

&lt;p&gt;Here it was &lt;strong&gt;one conversation with an agent&lt;/strong&gt;. The whole pipeline is code — record → narrate → align → assemble — so it's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repeatable&lt;/strong&gt;: product changes? Re-run. Fresh, re-synced video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic&lt;/strong&gt;: same framing and pacing every time, no shaky live take.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster than me&lt;/strong&gt;: I can muddle through OBS and iMovie, but slowly and not well — the agent does it faster, and I don't have to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent also quietly handled the fiddly parts I'd never want to — a site that won't render headless (screenshot + Ken Burns instead), audio mixing that silently halves volume, a blank loading frame that throws off the timing. I didn't debug any of it; it did.&lt;/p&gt;

&lt;p&gt;The shift, for me, is that &lt;strong&gt;making a demo video is now something you ask for, not something you produce.&lt;/strong&gt; The example here is my own project — &lt;a href="https://clintrialfinder.info" rel="noopener noreferrer"&gt;ClinTrialFinder&lt;/a&gt;, a free clinical-trial matching tool for cancer patients — but nothing about the approach is specific to it. If you have a web app and an agent, you can have a narrated, synced demo without touching a recorder or an editor.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>playwright</category>
      <category>ffmpeg</category>
    </item>
    <item>
      <title>Building a One-Person Software Shop with Claude Code</title>
      <dc:creator>Chauncey Wang</dc:creator>
      <pubDate>Thu, 06 Aug 2026 11:30:07 +0000</pubDate>
      <link>https://dev.to/chncwang/building-a-one-person-software-shop-with-claude-code-1d6i</link>
      <guid>https://dev.to/chncwang/building-a-one-person-software-shop-with-claude-code-1d6i</guid>
      <description>&lt;p&gt;I build a clinical-trial matching product alone — no cofounder, no team. Just one person, an AI coding agent, and a set of conventions that keep "vibes-based solo dev" from falling apart across weeks of parallel work.&lt;/p&gt;

&lt;p&gt;The first version was a command-line tool, &lt;a href="https://github.com/chncwang/ClinTrialFinder" rel="noopener noreferrer"&gt;open-sourced&lt;/a&gt;. Turning it into a &lt;em&gt;real web app&lt;/em&gt; — something a patient could open in a browser and trust with their situation — is the jump where a lot of solo projects quietly stall. I made it: today it's a live web app with ~30 drug pages, dozens of disease-specific trial landscapes, and a matcher real cancer patients use to find trials.&lt;/p&gt;

&lt;p&gt;I'm also a cancer patient; I built this partly because I needed it to exist. So I care less about it being impressive than &lt;em&gt;correct&lt;/em&gt; — a wrong trial match wastes a sick person's time. That constraint is the whole point: &lt;strong&gt;the interesting part isn't that an AI writes my code — it's the scaffolding that makes its work trustworthy when I'm not watching every keystroke.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A note on the tool first, then the transferable patterns — most of them scar tissue from something that broke once. Everything's sanitized — fake IPs, generic paths, invented tasks; the real secrets stay home. And the fake IPs aren't only for the article: the real task files never held a raw IP or email, and the server logs that hold IP addresses are purged within 14 days — matching the privacy policy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Claude Code, specifically
&lt;/h2&gt;

&lt;p&gt;People ask why Claude Code and not one of the other coding agents. Two reasons — one soft, one hard.&lt;/p&gt;

&lt;p&gt;The soft one: it infers intent from less. I can hand it a terse, half-specified ask — "the ranking's off for first-line patients, dig into it" — and it usually fills the gaps the way I &lt;em&gt;meant&lt;/em&gt;, not the way I literally typed. That matters when I'm running several sessions and can't write a full spec for each. Subjective, not a benchmark — but it's what keeps me reaching for it.&lt;/p&gt;

&lt;p&gt;The hard one: my review workflow feeds real patient-submission data to the agent — I pull a patient's result set to check whether the matcher did right by them. ClinTrialFinder's privacy policy names Anthropic's Claude as a tool for exactly that — "quality-checking match results, diagnosing issues." Using Claude Code for the review keeps the implementation matched to what patients were told. Other disclosed vendors handle other steps; the point isn't that Claude is the only option — it's that the words I show patients and the tools I run stay in lockstep.&lt;/p&gt;




&lt;h2&gt;
  
  
  The core bet: your task tracker is a git repo
&lt;/h2&gt;

&lt;p&gt;Most people reach for Jira, Linear, Notion. I keep every task as a plain file in a git repo of its own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project-manager/            # a git repo
  tasks/
    412-fix-ranking-edge-case.html
    413-wizard-validation.html
    414-review-user-submission.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F308yvd2s2kwc7srj5n0x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F308yvd2s2kwc7srj5n0x.png" alt="One task file, rendered — fixed shape, plain HTML in git. (Sanitized example.)" width="800" height="1152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One file per task, fixed shape — priority, status, the problem, the fix, verification plan, links to related tasks. No API, no board, no login. Just files in git — 500+ of them now, and the flat directory has never needed anything fancier.&lt;/p&gt;

&lt;p&gt;Why this beats a tracker &lt;em&gt;for an AI-assisted solo shop specifically&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version-controlled.&lt;/strong&gt; The backlog is plain files in git — every status flip and edit is a diff you can read, branch, or revert, exactly like source. It's a history you own and grep, not rows in someone else's database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Queryable with the tools the agent already has.&lt;/strong&gt; "Next free task number?" is &lt;code&gt;ls | sort&lt;/code&gt;. "Which tasks touch the ranking bug?" is &lt;code&gt;grep -rl&lt;/code&gt;. No integration — just &lt;code&gt;grep&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linkable and self-documenting.&lt;/strong&gt; Tasks cross-link; six weeks later the &lt;em&gt;why&lt;/em&gt; is one click away, written at the time, not reconstructed from memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The insight: &lt;strong&gt;when your teammate is an AI agent, your project management should be a git repo of plain files it can grep — not a SaaS it has to poke through an API.&lt;/strong&gt; (I use HTML for the files — renders and links nicely — but the format is the least interesting part; Markdown would do.)&lt;/p&gt;

&lt;p&gt;One file sits on top of that flat directory: a single &lt;strong&gt;overview&lt;/strong&gt; — a hand-maintained index that splits the backlog into &lt;em&gt;the full list&lt;/em&gt; and &lt;em&gt;the sprint&lt;/em&gt; (what to actually work on now). The task files are the atomic units; the overview is the priority view.&lt;/p&gt;

&lt;p&gt;And two kinds of judgment get their own &lt;em&gt;role&lt;/em&gt;. Worker sessions append tasks freely as they surface — a bug found mid-fix, a spinoff from a review — but none of them promotes itself into the sprint. That call belongs to a dedicated &lt;strong&gt;"CEO" session&lt;/strong&gt;: a Claude Code session that reads the backlog, decides what's worth doing now (via its own &lt;code&gt;update-active-sprint&lt;/code&gt; skill), &lt;em&gt;and&lt;/em&gt; proposes the forward-looking work the workers won't file on their own — new features, UI refinements, the product's next move. Reactive filing is mechanical and belongs to whoever hit the problem; setting direction — both prioritizing and proposing — is judgment, so I concentrate it in one named role instead of smearing it across four sessions that each think &lt;em&gt;their&lt;/em&gt; task is the important one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm3xf646kslp0yv9nkwtu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm3xf646kslp0yv9nkwtu.png" alt="The overview — the CEO-promoted Active Sprint on top, the full backlog below. (Sanitized example.)" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Parallelism — four sessions, each a standing role
&lt;/h2&gt;

&lt;p&gt;Here's where it gets honest. I often run &lt;strong&gt;four Claude Code sessions at once&lt;/strong&gt;, against a shared backlog and shared repos — but they're not four workers chewing through the same queue. Each holds a standing &lt;strong&gt;role&lt;/strong&gt;: a &lt;strong&gt;CEO&lt;/strong&gt; that prioritizes and proposes new work, an &lt;strong&gt;SEO/content&lt;/strong&gt; session that also watches the traffic and files a review task whenever a patient submits, and &lt;strong&gt;two full-stack engineers&lt;/strong&gt; working different tasks in parallel. And &lt;em&gt;full-stack&lt;/em&gt; undersells it — one engineer session will write HTML and CSS, write the Python behind it, review a real patient submission and file the fix tasks its defects reveal, and rewrite a matching prompt, all in one afternoon; a single context spans what used to be four specialties.&lt;/p&gt;

&lt;p&gt;That engineer session also writes as it works — logging its findings and progress back onto the task file, so the task becomes a running record of what was tried and learned, not a write-once spec. That record earns its keep: when a mid-work diagnostic disproves the task's own premise — the "bug" was correct behavior, the evidence was confounded — the CEO reads the update and &lt;strong&gt;demotes the task back to the backlog&lt;/strong&gt; instead of shipping it. The sprint self-corrects.&lt;/p&gt;

&lt;p&gt;And these sessions don't close when a task is done — each stays open and picks up the next thing in its lane, so it accumulates context instead of starting cold each time. A big multiplier for one person — the nearest thing to a team I've got.&lt;/p&gt;

&lt;p&gt;They all run from the same home directory — one shared filesystem, not four sandboxes. That's mostly the point: the SEO session opens the analytics export I just downloaded to &lt;code&gt;~/Downloads&lt;/code&gt;, any session can reach any repo in the tree, and nobody has to shuttle files between isolated boxes.&lt;/p&gt;

&lt;p&gt;The one place that sharing bites is the two engineers — point both at the same working tree and they'll clobber each other, one's half-finished edit sitting there when the other runs its tests. So each works in its own &lt;strong&gt;git worktree&lt;/strong&gt;: a separate checkout on its own branch, sharing the repo's history but not its uncommitted state. Shared filesystem, isolated working copies — both build, commit, and test at once without ever seeing each other's in-progress files, and each branch merges to main only after I've reviewed it.&lt;/p&gt;

&lt;p&gt;Those roles don't act in a vacuum — here's the full lifecycle they move a task through, for both kinds of task the shop runs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdxndp5k4t4alcccwneo3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdxndp5k4t4alcccwneo3.png" alt="The life of a task — two task types sharing one backlog, color-coded by which role acts. Dev lane (top): Filed → Backlog → Active Sprint → In progress → Review gate → Shipped, with a Diagnostics box off In progress (premise holds → keep building; premise disproved → the CEO demotes the same task back to the Backlog) and a Review-gate send-back to In progress for rework. Review lane (bottom): a patient submission triggers a review task (filed by the SEO session, audited by an engineer across the three result pools, funnel, and retrieval); a clean audit closes, but a defect found in review spawns a new fix task up into the Backlog. (Sanitized example.)" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of those 500-plus task files, about &lt;strong&gt;90 were spawned by reviewing real patient submissions&lt;/strong&gt; — the rest are features and fixes the CEO session or I dreamed up. That ratio is the part I care about: every genuine submission gets audited, and the ones that expose a gap become fix tasks. Roughly &lt;strong&gt;230 of the whole are done or shipped&lt;/strong&gt;; the rest are a living backlog. The traffic isn't huge — a few hundred submissions over the tool's life, at least &lt;strong&gt;100 real enough to enter an email to get their results back&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Every change gets its own URL before it's real
&lt;/h2&gt;

&lt;p&gt;The counterpart to building in parallel: every change to the product needs somewhere to &lt;em&gt;run&lt;/em&gt; that isn't production and isn't the other tasks in flight. So every task that touches the product gets its own &lt;strong&gt;isolated instance&lt;/strong&gt; — a fresh clone of the repo, its own service on its own port, reachable at its own private review URL behind a reverse proxy.&lt;/p&gt;

&lt;p&gt;Under the hood it's one small nginx config: a location block per instance, each routing a private sub-path to that instance's local port (&lt;code&gt;/task-&amp;lt;name&amp;gt;/&lt;/code&gt; → a service on &lt;code&gt;127.0.0.1:&amp;lt;port&amp;gt;&lt;/code&gt;). Spinning one up is a clone, a service on a fresh port, and a few lines of proxy. The honest ceiling is &lt;strong&gt;memory&lt;/strong&gt; — each instance is a full running copy of the app, so the dev box has to hold several at once; that, more than anything, caps how many tasks I can keep live for review at the same time.&lt;/p&gt;

&lt;p&gt;At any moment I might have several live, independently-viewable copies of the product up — one per task — each showing exactly that task's changes and nothing else. I open the URL, click through the actual rendered thing, and see the change in situ before it's anywhere near a user.&lt;/p&gt;

&lt;p&gt;That's the deploy gate: &lt;strong&gt;nothing reaches production until I've looked at it running on its own instance.&lt;/strong&gt; Build on an isolated branch → spin up an instance → review the real rendered page at its URL → approve → merge → deploy. The agent never pushes to prod on its own — the "approve" is mine, and it's a look at a &lt;em&gt;running thing&lt;/em&gt;, not a diff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The transferable pattern:&lt;/strong&gt; give every unit of parallel work its own running, reviewable instance. "Does it actually work, rendered, in isolation?" is a question you can only answer if the work has somewhere to live that isn't production and isn't your other tasks. The isolation is what makes parallel &lt;em&gt;and&lt;/em&gt; careful compatible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skills that encode judgment, not macros
&lt;/h2&gt;

&lt;p&gt;Claude Code lets you define &lt;strong&gt;skills&lt;/strong&gt; — named routines the agent runs on command. The naive use is automation: "deploy the site," "run the tests." Useful, but shallow.&lt;/p&gt;

&lt;p&gt;The valuable skills encode &lt;em&gt;how a domain expert thinks&lt;/em&gt; — the judgment, not just the steps.&lt;/p&gt;

&lt;p&gt;My highest-value one reviews a user submission. It doesn't just dump data. It:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pulls the result across three pools (shown to the user / computed-but-hidden / rejected).&lt;/li&gt;
&lt;li&gt;Reconstructs what the user actually &lt;em&gt;did&lt;/em&gt; from the logs — did they wait, did they click through, did they leave.&lt;/li&gt;
&lt;li&gt;Checks whether a genuinely-good result got silently dropped &lt;em&gt;before&lt;/em&gt; the scoring stage even saw it (a whole class of bug that's invisible if you only look at what was shown).&lt;/li&gt;
&lt;li&gt;Cross-references anything it finds against a catalog of known past defects.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's not a macro. That's a reviewer's &lt;em&gt;worldview&lt;/em&gt; — what to suspect, what to verify, what caveat to attach to a claim — written down once and rerun consistently. When I invoke it, I'm not saving keystrokes; I'm borrowing a disciplined second brain that never gets lazy on step 3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The transferable pattern:&lt;/strong&gt; your best skills should capture the &lt;em&gt;reasoning&lt;/em&gt; of your most careful self, especially the checks you'd skip when you're tired. Automation saves time. Encoded judgment saves you from your own shortcuts.&lt;/p&gt;




&lt;h2&gt;
  
  
  The operating manual: where corrections become rules
&lt;/h2&gt;

&lt;p&gt;There's a file Claude Code reads at the start of every session — CLAUDE.md. Mine has grown into an operating manual: the project's standing rules, accumulated one mistake at a time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment discipline.&lt;/strong&gt; &lt;em&gt;Never deploy to production without explicit sign-off. Never edit files directly on the server — always local, commit, push, pull.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected behaviors.&lt;/strong&gt; How to format a task, when to sync which repo, what "done" means.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of those started as a bug. The first time the agent restarted prod and interrupted a live request, the fix wasn't "don't do that this time" — it was a line in the manual so it never happens again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's the load-bearing pattern:&lt;/strong&gt; a correction that lives only in a chat window evaporates; a correction written to a file that loads next session is a permanent behavior change. The manual is the accumulated scar tissue of the project — the difference between an agent that repeats your mistakes and one that compounds your lessons. The test of a good rule is simple: can the mistake it came from happen again?&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually transfers
&lt;/h2&gt;

&lt;p&gt;Strip away my specifics and here's what I'd hand another solo builder working with an AI agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Make your project management out of primitives your agent is fluent in.&lt;/strong&gt; Files, grep, git — not a SaaS behind an API. The backlog should be as greppable as the code. Let worker sessions append to it freely, but concentrate direction-setting — both prioritizing and proposing new work — into &lt;em&gt;one&lt;/em&gt; role, a dedicated "CEO" session, instead of every session promoting its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run parallel sessions as standing roles, not a shared queue.&lt;/strong&gt; Give each a lane and let them share one filesystem so they see the same world — then isolate what would collide (a git worktree per engineer) so "more hands" never becomes clobbered work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give every change somewhere to run before production.&lt;/strong&gt; Isolated per-task instances behind a reverse proxy let you review the real rendered product — so "approve" is a look at a running thing, not a diff, and prod stays a deliberate step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write skills that encode judgment, not just steps.&lt;/strong&gt; Capture the careful reasoning you'd skip when tired. That's the compounding asset; automation is just the floor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep an operating manual, and treat every correction as a candidate rule&lt;/strong&gt; — written to a file that loads next session, not left in a chat window that evaporates. The manual is your project's scar tissue; the test of a rule is whether the mistake it came from can happen again.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this is about the AI being the smartest. It's about building the scaffolding that makes an AI agent's work &lt;em&gt;trustworthy&lt;/em&gt; — which, when the output affects a sick person looking for a trial, is the only thing that matters.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I build &lt;a href="https://www.clintrialfinder.info" rel="noopener noreferrer"&gt;ClinTrialFinder&lt;/a&gt; solo, with Claude Code, as a patient myself. If any of these patterns are useful in your own shop, I'd genuinely like to hear how they hold up — the failure modes especially.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>aiagents</category>
    </item>
  </channel>
</rss>
