<?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"><channel><title><![CDATA[Hex Builds]]></title><description><![CDATA[Hex Builds]]></description><link>https://openrepoguide.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 11:58:17 GMT</lastBuildDate><atom:link href="https://openrepoguide.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Crazy Frog AI Video Generator: Async Jobs, Leases, and Safe Retries]]></title><description><![CDATA[The visible part of Crazy Frog AI is two photo uploads and a scene picker. Underneath, it's an asynchronous workflow: submit a video task, wait for a provider, add audio, store the output, and let the]]></description><link>https://openrepoguide.hashnode.dev/crazy-frog-ai-video-generator-async-jobs-leases-and-safe-retries</link><guid isPermaLink="true">https://openrepoguide.hashnode.dev/crazy-frog-ai-video-generator-async-jobs-leases-and-safe-retries</guid><category><![CDATA[Cloudflare Workers]]></category><dc:creator><![CDATA[hex]]></dc:creator><pubDate>Sat, 17 Oct 2026 03:05:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69c3ae848a263e79cb1cad9a/56d77d4e-b12d-42ce-a912-91a2779d1c3a.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The visible part of <a href="https://crazy-frog-ai.org/">Crazy Frog AI</a> is two photo uploads and a scene picker. Underneath, it's an asynchronous workflow: submit a video task, wait for a provider, add audio, store the output, and let the user return later.</p>
<p>The interesting engineering question isn't just how to call the model. It's what to do when a request times out and you don't know whether the provider accepted it.</p>
<p>Here's how I approached that in the current implementation, using TypeScript on Cloudflare Workers, D1 for job state, and R2 for media storage. This is a small-app design, not a claim of exactly-once execution across external services.</p>
<h2>Give the inputs a stable meaning</h2>
<p>The app generates an invisible motorcycle chase. Photo one supplies the rider; photo two supplies the chaser. A scene preset supplies a reference video and its matching audio.</p>
<p>That ordering is part of the input contract, not just a label in the interface. The server validates exactly two photo IDs and a known scene ID. In simplified form:</p>
<pre><code class="language-ts">type JobInput = {
  requestId: string; // UUID, validated on the server
  photoIds: [string, string]; // rider, chaser
  sceneId: SceneId;
};
</code></pre>
<p>The generation instructions map image one to the rider and image two to the chaser. Keeping the same order from upload to provider request avoids an easy class of role-swapping bugs. It doesn't guarantee perfect identity preservation by the model, but it keeps the application itself unambiguous.</p>
<h2>Persist the job before doing remote work</h2>
<p>I store the validated inputs and provider request body in D1 before submission. The request ID is also the job ID.</p>
<p>When the same ID arrives again, the server returns the existing job only if the owner and normalized inputs match. Reusing that ID with different inputs is an error. The database insert handles conflicts, and the code reads the row back to verify it.</p>
<p>This covers a double click or a repeated browser request. It doesn't make the external provider idempotent, which is a separate problem.</p>
<p>The main path is:</p>
<pre><code class="language-text">queued → processing → composing → saving → succeeded
</code></pre>
<p>A confirmed failure can move the job to failed. An unknown outcome needs more care.</p>
<h2>A timeout is not a rejection</h2>
<p>Before submitting to the video provider, the worker records that submission has started. If it receives a task ID, it stores that ID and polls the existing task.</p>
<p>The awkward case is a lost response: the provider might have accepted the request, but the app never received its ID. Automatically submitting again could create another paid task.</p>
<p>For that case, the current implementation pauses for support review instead of issuing a fresh generation. It keeps the video allowance reserved. A definite rejection or confirmed generation failure can restore it.</p>
<p>That's an intentional tradeoff. Some users may wait for manual reconciliation, but a network timeout doesn't silently become permission to spend again. Browser-side deduplication alone wouldn't solve this.</p>
<h2>Use leases, but fence late writes too</h2>
<p>A worker claims a job with a time-limited lease. The claim also increments an attempts counter, used as a monotonic claim token.</p>
<p>A lease by itself isn't enough. A slow network request can outlive it. Another worker may take over while the first worker is still running.</p>
<p>Updates therefore check the job ID, claim token, unexpired lease, and allowed status. An old worker can't simply write a successful result after a newer claim has taken ownership. Output object keys include the claim token too, so a late upload doesn't overwrite the newer worker's object.</p>
<p>This protects database transitions and stored results. It doesn't magically make an external API side effect reversible; that's why the submission marker still matters.</p>
<h2>Treat the webhook as a wake-up signal</h2>
<p>The video callback contains a task ID and authentication information. After verification, the handler finds the corresponding job and makes it eligible for processing.</p>
<p>It doesn't trust callback fields as the final video result. The processing code asks the provider for the task's current state and output. A reconciliation pass also checks pending jobs, so recovery doesn't depend entirely on receiving a callback.</p>
<p>Retries use backoff with jitter. The important distinction is that these retries reconcile an existing task; they don't blindly create a replacement.</p>
<h2>Audio and storage are separate stages</h2>
<p>The video request asks for silent output. After that succeeds, a separate composition task adds the selected scene's audio. Only then does the app fetch and validate the finished video, save it to R2, and mark the job succeeded.</p>
<p>Splitting these stages means a storage problem doesn't need to restart video generation. It also makes “still processing” more useful internally: the job could be generating frames, composing audio, or saving the final file.</p>
<p>The audio service has the same uncertain-submission problem, so it gets its own submission marker and provider ID. I didn't assume that solving it once for video automatically solved it for the next service.</p>
<h2>What I'd carry into another app</h2>
<p>The lesson I keep coming back to is that “try again” needs a precise meaning. Retrying a status check, retrying a download, and creating another paid generation are different operations.</p>
<p>For a small AI app, a durable state machine and a conservative answer to unknown outcomes are worth more than a very optimistic retry button.</p>
<p>If you'd like to see the interface this supports, the project is at <a href="https://crazy-frog-ai.org/">Crazy Frog AI Video Generator</a>. I'd be interested in how other builders reconcile a provider submission when the response disappears and the provider offers no documented deduplication mechanism.</p>
]]></content:encoded></item><item><title><![CDATA[Unforgettable Car AI: building a car reveal video app around one photo]]></title><description><![CDATA[I built Unforgettable Car AI for a very specific kind of video: a person shows a 2 and a 4 card, covers the camera with a hand, and reveals a car when the lens clears.
The app starts with one portrait]]></description><link>https://openrepoguide.hashnode.dev/unforgettable-car-ai-building-a-car-reveal-video-app-around-one-photo</link><guid isPermaLink="true">https://openrepoguide.hashnode.dev/unforgettable-car-ai-building-a-car-reveal-video-app-around-one-photo</guid><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[hex]]></dc:creator><pubDate>Thu, 15 Oct 2026 08:56:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69c3ae848a263e79cb1cad9a/22525122-617a-4e21-9ebd-f4973f33d7a3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I built <a href="https://unforgettablecar.org/">Unforgettable Car AI</a> for a very specific kind of video: a person shows a 2 and a 4 card, covers the camera with a hand, and reveals a car when the lens clears.</p>
<p>The app starts with one portrait. You choose the car and the location, and it generates the reveal sequence with you in the scene.</p>
<p>That is the whole premise. There is no prompt to write and no footage to film. I wanted to share what the app does and a little about the web application around it.</p>
<h2>From a selfie to a reveal</h2>
<p>The homepage has sample clips you can watch before signing in. Each sample has a short preview and a full 15-second version. For a tool like this, the movement matters as much as the final frame: you need to see the card gesture, the hand over the lens, and the transition into the car reveal.</p>
<p>If you want to make your own, sign in with Google and upload a clear portrait. A regular selfie is enough. You do not need to recreate the pose or find a car for the original photo.</p>
<p>There are three car options: a black SUV, a green supercar, and a red coupe. The setting is a separate choice: an underground garage, a rooftop parking area, or a city street. You can combine them in nine ways.</p>
<p>Once the video is ready, it appears in My videos, where you can watch it and download the file.</p>
<h2>Keeping the app focused</h2>
<p>The web app uses TanStack Start, React, and Cloudflare Workers, with an existing video generation service handling the footage.</p>
<p>My work is in the application around that service: the upload flow, the preset choices, generation job tracking, and access to the finished videos.</p>
<p>A small set of presets makes the workflow fairly easy to follow. Someone can watch an example, choose a car and a setting, then use their own photo. There is no need to explain camera instructions or ask them to describe a transition in a text box.</p>
<p>Generation also creates a different kind of interaction from a normal form submission. The user sends a request and waits for a result. Job tracking and a clear place to find the finished video are part of the product, even though the sample clip is what usually gets the attention.</p>
<h2>What to expect from the file</h2>
<p>The output is a 15-second, 16:9 MP4, with a 720p output setting. It is silent. The Unforgettable song is not included, so music needs to be added separately. A vertical version would also need a crop or a separate editing step.</p>
<p>The model generates new footage. Hands, facial details, clothing, and the exact timing can vary, so it is worth watching the whole clip before sharing it. The samples show the format; they are not a promise that every detail will match.</p>
<p>Watching the public examples is free. Creating a personal video requires a paid, one-time credit pack, without a subscription. A generation confirmed as failed returns its credit.</p>
<p>Uploads and finished videos are private to your account. Photos are retained for up to seven days and videos for 30 days, so download a copy of anything you want to keep.</p>
<p>You can see the examples at <a href="https://unforgettablecar.org/">unforgettablecar.org</a>.</p>
<p>If you try the flow, I would like to know whether the samples give you enough information before uploading a photo. That is the part I am most interested in getting right.</p>
]]></content:encoded></item><item><title><![CDATA[Drake Burning Bridges AI: Making a Party Video Without Writing a Prompt]]></title><description><![CDATA[I’m building Drake Burning Bridges AI, a small photo-to-video site with a deliberately narrow job: put the person in your portrait into the Burning Bridges party scene.
The interesting part, for me, i]]></description><link>https://openrepoguide.hashnode.dev/drake-burning-bridges-ai-making-a-party-video-without-writing-a-prompt</link><guid isPermaLink="true">https://openrepoguide.hashnode.dev/drake-burning-bridges-ai-making-a-party-video-without-writing-a-prompt</guid><dc:creator><![CDATA[hex]]></dc:creator><pubDate>Wed, 14 Oct 2026 02:49:37 GMT</pubDate><content:encoded><![CDATA[<p>I’m building <a href="https://drakeburningbridgesai.video/">Drake Burning Bridges AI</a>, a small photo-to-video site with a deliberately narrow job: put the person in your portrait into the Burning Bridges party scene.</p>
<p>The interesting part, for me, is how little the user has to decide. There’s no blank prompt box and no model picker. The scene is already chosen. You bring the photo.</p>
<h2>Start with the result</h2>
<p>A blank prompt box is useful when you want to explore. It’s less useful when you’ve seen a particular clip and want your own version of it. At that point, choosing a model or describing camera movement feels like homework.</p>
<p>On this site, the workflow is one portrait in and a 20-second, 720p landscape MP4 out, with music included. The person becomes the lead; the other guests and the party setting come from the built-in reference.</p>
<p>That fixed setup makes the scope easier to explain. It also means saying no to requests for a different room, a different song, or custom casting for everyone in the background. I’d rather make that clear before someone uploads a photo than leave them to discover it after paying.</p>
<h2>The examples do most of the explaining</h2>
<p>There are public examples to watch before buying credits. I think they’re more useful than another paragraph describing what an AI video tool can do.</p>
<p>A still image tells you very little about a moving face. Watch the turns, the hands near the camera, and the toast. The generated clip can change facial details, clothing, and background people, so a recognizable first frame isn’t enough to judge the whole result.</p>
<p>For me, that’s a product design problem as much as a generation problem. The page needs to help someone decide whether the output is what they had in mind. Hiding the examples behind signup would make that decision harder.</p>
<h2>Keep the purchase small, too</h2>
<p>The site uses one-time video packs rather than a subscription. Someone making a party clip for fun may only need it once. A recurring bill would add a decision that has little to do with the video they came for.</p>
<p>One video currently costs $12.99 USD before tax. Unused credits don’t expire, and a confirmed failed generation returns its credit. While a task is still processing, check My videos before starting another attempt.</p>
<h2>Where the idea stops</h2>
<p>This is a specific scene, not an open-ended video editor. I’m still interested in whether that focus is enough to make a small product useful on its own. Adding options is easy to justify; keeping the experience understandable gets harder with each one.</p>
<p>If you’re curious, you can see the examples at <a href="https://drakeburningbridgesai.video/">drakeburningbridgesai.video</a>. It’s an independent project and isn’t affiliated with Drake.</p>
<p>If you’ve built something around a very specific result, I’d be interested to hear which controls you left out—and which ones people actually missed.</p>
]]></content:encoded></item><item><title><![CDATA[Two Photos, Two Roles: Designing a Small AI Video App]]></title><description><![CDATA[A pair of upload boxes looks simple until someone has to decide which photo belongs in which box.
That is one of the main design decisions in Alors on Danse AI, a website I built for the white-studio ]]></description><link>https://openrepoguide.hashnode.dev/two-photos-two-roles-designing-a-small-ai-video-app</link><guid isPermaLink="true">https://openrepoguide.hashnode.dev/two-photos-two-roles-designing-a-small-ai-video-app</guid><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[hex]]></dc:creator><pubDate>Tue, 13 Oct 2026 16:45:28 GMT</pubDate><content:encoded><![CDATA[<p>A pair of upload boxes looks simple until someone has to decide which photo belongs in which box.</p>
<p>That is one of the main design decisions in <a href="https://alorsondanseaivideo.net/">Alors on Danse AI</a>, a website I built for the white-studio keyboard scene featuring Stromae and Jamel Debbouze. The app takes two photos and generates a 16-second clip of the chosen subjects in that scene, with the original audio.</p>
<p>The first photo becomes the keyboard player. The second becomes the expressive partner reacting alongside them. People and pets can fill either role.</p>
<h2>Give each photo a job</h2>
<p>A generic “upload images” field would hide an important choice. A user might upload a person and a dog, expecting the dog to play the keyboard, only to discover that the roles were assigned the other way around.</p>
<p>The interface makes the assignment explicit before generation: keyboard player on the left, partner on the right. The two subjects are the variable part. The studio, reference movement, soundtrack, and duration stay fixed.</p>
<p>That constraint also makes the website easier to explain. There is no prompt to write and no timeline to edit. You choose the duo for one recognizable scene.</p>
<h2>Show the inputs beside the result</h2>
<p>The <a href="https://alorsondanseaivideo.net/examples">public examples page</a> includes a golden retriever playing the keyboard alongside a human partner. The input portraits are synthetic, and the page shows them next to the generated clip.</p>
<p><img src="https://alorsondanseaivideo.net/examples/golden-retriever-duo.jpg" alt="The dog-and-human example" /></p>
<p><em>Still from the public 16-second example. This test clip is 480p; the standard paid output is 720p.</em></p>
<p>Showing the inputs matters because a finished video alone leaves too much to guess. A reader should be able to see how much the subjects changed and decide whether the result is what they want.</p>
<p>A pet performing upright human gestures is funny, but it is also a demanding generation task. Paws, fur, faces, and movement can drift between frames. I would rather make those limits visible than promise an exact likeness from start to finish.</p>
<h2>The download is the end of the job</h2>
<p>The app uses React and TanStack Start on Cloudflare Workers, with D1 for account, credit, and job records and R2 for media files.</p>
<p>Video generation and soundtrack assembly are separate stages. Seedance 2.5 through KIE produces the video with generated audio turned off; a FAL step merges the fixed soundtrack into the result.</p>
<p>For the user, these are parts of one task. A provider returning a video file does not yet mean there is a finished MP4 to download. The job still has to complete the audio and storage steps.</p>
<p>Progress and completed downloads live in My videos. A confirmed failed generation restores a video credit. If the provider result is uncertain, the backend keeps it under review instead of immediately starting another paid generation.</p>
<h2>Set expectations before the upload</h2>
<p>The current flow is Google sign-in, a one-time video pack purchase, two photo uploads, and generation. The standard result is a 16-second, 720p, 16:9 landscape MP4. A single video costs $12.99; there is no subscription or free generation trial.</p>
<p>Clear individual photos make the role assignment easier. Group shots and obscured faces are poor inputs, and users should only upload photos they have permission to use.</p>
<p>Uploaded photos are retained for up to seven days and finished videos for 30 days. Anyone who wants to keep a result should download it.</p>
<p>You can see the app at <a href="https://alorsondanseaivideo.net/">alorsondanseaivideo.net</a> and watch the <a href="https://alorsondanseaivideo.net/examples">examples</a> before buying.</p>
<p>The question I would like feedback on is small and concrete: do the two role labels make it obvious where each photo goes? That seems like a useful place to improve a product whose whole premise is choosing the right duo.</p>
]]></content:encoded></item><item><title><![CDATA[Handling Retries in My One-Photo AI Video App]]></title><description><![CDATA[A user clicks Generate. The request times out. They click again.
For a paid AI video app, that small interaction raises two questions: did the first request spend a credit, and did the video provider ]]></description><link>https://openrepoguide.hashnode.dev/handling-retries-in-my-one-photo-ai-video-app</link><guid isPermaLink="true">https://openrepoguide.hashnode.dev/handling-retries-in-my-one-photo-ai-video-app</guid><category><![CDATA[cloudflare]]></category><category><![CDATA[webdev]]></category><dc:creator><![CDATA[hex]]></dc:creator><pubDate>Mon, 12 Oct 2026 11:27:02 GMT</pubDate><content:encoded><![CDATA[<p>A user clicks Generate. The request times out. They click again.</p>
<p>For a paid AI video app, that small interaction raises two questions: did the first request spend a credit, and did the video provider already start working?</p>
<p>I’m building <a href="https://drakeburningbridgesai.video/">Drake Burning Bridges AI</a>, a small tool that turns one portrait into a personal Burning Bridges party video. The user supplies the face; the app supplies the reference scene and prompt. The configured output is a 20-second, 720p landscape MP4, with the soundtrack added after generation.</p>
<p>That makes the interface fairly short. The job behind it takes more care.</p>
<h2>Give the retry something to find</h2>
<p>The app uses React and TanStack Start on Cloudflare Workers, with D1 for jobs and the credit ledger, and R2 for uploaded photos and finished videos. An external provider handles video generation.</p>
<p>Before submitting anything to that provider, the app creates a saved job with a request ID. If the same request arrives again, it checks the existing job.</p>
<p>Same user, same ID, same inputs: return that job. Same ID with different inputs or a different user: reject it.</p>
<p>The input check matters. Returning a job just because its ID matches could give the caller a result for a different photo. Treating every request as new would make an ordinary network retry expensive.</p>
<h2>Keep the debit next to the job</h2>
<p>Job creation and credit deduction need to agree. A job without a debit is free work; a debit without a job is a customer support problem.</p>
<p>In this implementation, a D1 trigger creates the debit when the job is inserted. If the debit cannot go through, the insert rolls back. There isn’t a separate read-balance, subtract-one, save-balance sequence in application code.</p>
<p>A confirmed failure restores one credit through the ledger. The refund reference is tied to the job and is unique, so processing the failure more than once doesn’t keep adding credits.</p>
<p>These are local guarantees. They don’t tell me whether a remote API accepted a request.</p>
<h2>A timeout leaves a question open</h2>
<p>Suppose the provider accepts the video task, but its response never reaches the app. The app now has no provider task ID. Submitting again could start another paid generation.</p>
<p>I record a submission marker before making the provider request. If a later attempt finds that marker but no task ID, it stops short of submitting again and leaves the job for support review. The video allowance stays reserved while that uncertain submission is reconciled.</p>
<p>This has a cost: a job can wait for manual attention. It can also catch a crash that happened after recording the marker but before sending the request. I’d rather handle that uncertainty explicitly than silently create another task.</p>
<p>It isn’t an exactly-once guarantee across services. That would need stronger cooperation from the provider, such as a documented idempotency key or a reliable way to look up the original submission.</p>
<h2>The provider’s result is one stage</h2>
<p>A successful generation still needs its soundtrack and a saved output. The app tracks those stages separately:</p>
<p><code>queued → processing → composing → saving → succeeded</code></p>
<p>That last transition happens after the finished file is saved. A temporary provider URL alone isn’t the result I want to hand to the user.</p>
<p>The job also lives independently of the browser tab. Users can return to My videos to check it instead of leaving a spinner open and hoping nothing disconnects.</p>
<h2>Keeping the product narrow helps</h2>
<p>There’s one scene, one portrait input, and one configured output format. Users don’t choose a model or write a prompt. That reduces the number of combinations the job system has to track, and makes it easier to explain what a generation credit buys.</p>
<p>It doesn’t remove the limits of generated video. Face likeness and motion can vary, and the project is independent, with no affiliation with Drake. People should only upload photos they have permission and consent to use.</p>
<p>The site is at <a href="https://drakeburningbridgesai.video/">drakeburningbridgesai.video</a>. If you’re building something similar, I’d be interested in how you handle a provider request whose outcome is unknown—especially when the API doesn’t offer idempotency.</p>
]]></content:encoded></item><item><title><![CDATA[Building a One-Scene Video App: The Parts Behind the Generate Button]]></title><description><![CDATA[I built Bulin 47 AI, a small web app that puts a portrait into the main performer’s role in the Bulin 47 freestyle scene. The reference clip is already chosen. So are the prompt, output format and sou]]></description><link>https://openrepoguide.hashnode.dev/building-a-one-scene-video-app-the-parts-behind-the-generate-button</link><guid isPermaLink="true">https://openrepoguide.hashnode.dev/building-a-one-scene-video-app-the-parts-behind-the-generate-button</guid><category><![CDATA[cloudflare]]></category><dc:creator><![CDATA[hex]]></dc:creator><pubDate>Mon, 12 Oct 2026 09:54:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69c3ae848a263e79cb1cad9a/e6475920-0540-4186-b817-b0a33aeac626.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I built <a href="https://bulin47.online/">Bulin 47 AI</a>, a small web app that puts a portrait into the main performer’s role in the Bulin 47 freestyle scene. The reference clip is already chosen. So are the prompt, output format and soundtrack. The user brings one photo.</p>
<p>That leaves a short interface: sign in, upload a portrait, generate a video, then download it from My videos. The result is a 10-second, 720p, vertical MP4.</p>
<p>The interesting work is behind that short flow. A fixed scene removes a lot of choices from the screen, but a paid generation still has to survive retries, slow responses and partial failures.</p>
<h2>Deciding what belongs in the form</h2>
<p>For this scene, a prompt box would ask the user to describe something the reference video already shows. A duration selector would add another decision even though the performance has a prepared 10-second cut.</p>
<p>I kept the portrait as the variable input. It supplies appearance cues; the reference supplies the movement, framing and timing. The instructions target the main rapper and ask the model to preserve the surrounding people and scene.</p>
<p>That is the intended behavior, not a promise that every frame will match. Head turns, hands and interactions with the crowd still need reviewing. Keeping the input narrow makes it easier to explain the task, but it does not make generation deterministic.</p>
<p>Someone who wants a different performance will need a different workflow. I’m comfortable leaving that outside this app’s scope.</p>
<h2>A video job has more than one finish line</h2>
<p>The generated picture and the finished download are separate stages. The video request runs without generated audio. Once that stage succeeds, the app adds the prepared reference soundtrack and stores the resulting file.</p>
<p>The job record follows that sequence:</p>
<p><code>queued → processing → composing → saving → succeeded</code></p>
<p>A failure can happen after the model has produced a video: audio composition might fail, or storage might be temporarily unavailable. Marking the task complete as soon as the model returns would give the user the wrong answer.</p>
<p>I use a stored job record to keep track of the provider task, the audio step and the saved output. The download becomes available after the final file has been stored. Closing a tab does not remove that record; the user can come back to My videos.</p>
<h2>Retrying a request should not buy another video</h2>
<p>The app runs on Cloudflare Workers, with D1 for job and credit records and R2 for media. The generation endpoint takes a request ID alongside the uploaded photo ID.</p>
<p>If the same request arrives again with the same user and input, it returns the existing job. Reusing the ID with different input is rejected. A database trigger records the credit debit when the job is inserted, so the debit belongs to the job creation rather than a separate browser request.</p>
<p>This covers retries at the app boundary. It does not make the external provider’s submission exactly-once.</p>
<p>The awkward case is a timeout after sending the provider request. A missing response does not tell me whether the provider accepted it. Sending a fresh request could create a second video and a second provider charge.</p>
<p>The implementation records that submission has started before making the call. If there is no task ID afterward, the job stays under review instead of being submitted again blindly. Its credit remains reserved while the outcome is checked.</p>
<p>That is less convenient than an automatic retry button. It also gives a more honest answer about what the app knows.</p>
<h2>A confirmed failure is different from an uncertain result</h2>
<p>A confirmed failed job returns its generation credit. The ledger uses a unique reference for that return so repeating the failure handling does not add another credit.</p>
<p>An uncertain submission is not yet a confirmed failure. And a completed video whose likeness the user dislikes is not the same thing as a failed task. These cases need different messages, even if all three feel like “it didn’t work” to someone looking at the screen.</p>
<p>I put those distinctions in the <a href="https://bulin47.online/guides/how-to-make-bulin-47-ai-video">creation guide</a> and <a href="https://bulin47.online/pricing">pricing page</a>. There are no free generations; credits are sold in one-time packs. A new accepted task uses a credit, including another version made with the same photo.</p>
<h2>Showing the limits before the upload</h2>
<p>The homepage has the motion reference, so someone can watch the scene before spending a credit. The gallery examples are credited clips from outside creators, not outputs from this service. They show the trend; they do not establish what every generated result will look like.</p>
<p>The site also states its file windows: uploaded photos are kept for up to seven days, and finished videos for 30 days. Users should download the clips they want to keep and use portraits they have permission to upload.</p>
<p>I wanted the first screen to be small. Making it small still meant writing the less exciting parts: input checks, job state, credit handling and clear descriptions of an uncertain outcome.</p>
<p>You can see the app at <a href="https://bulin47.online/">bulin47.online</a>. If you build apps around paid generation APIs, I’d be interested in how you handle the gap between “the request timed out” and “the provider definitely rejected it.”</p>
]]></content:encoded></item><item><title><![CDATA[What Is AutoResearch by Andrej Karpathy? A Clearer Guide for First-Time Readers]]></title><description><![CDATA[Andrej Karpathy’s autoresearch repository has been getting a lot of attention recently.
A lot of people are searching for:

autoresearch github

karpathy autoresearch

autoresearch ai


But if you are]]></description><link>https://openrepoguide.hashnode.dev/what-is-autoresearch-by-andrej-karpathy-a-clearer-guide-for-first-time-readers</link><guid isPermaLink="true">https://openrepoguide.hashnode.dev/what-is-autoresearch-by-andrej-karpathy-a-clearer-guide-for-first-time-readers</guid><dc:creator><![CDATA[hex]]></dc:creator><pubDate>Wed, 25 Mar 2026 11:06:30 GMT</pubDate><content:encoded><![CDATA[<p>Andrej Karpathy’s <code>autoresearch</code> repository has been getting a lot of attention recently.</p>
<p>A lot of people are searching for:</p>
<ul>
<li><p><code>autoresearch github</code></p>
</li>
<li><p><code>karpathy autoresearch</code></p>
</li>
<li><p><code>autoresearch ai</code></p>
</li>
</ul>
<p>But if you are seeing the project for the first time, the raw GitHub repo can still feel a bit dense.</p>
<p>So I built a small unofficial guide around it to make the project easier to understand before jumping straight into the source code.</p>
<h2>What AutoResearch Is</h2>
<p>At a high level, AutoResearch is an open-source project that lets AI agents run repeated ML training experiments inside a compact codebase.</p>
<p>Instead of manually changing everything yourself, the loop is closer to this:</p>
<ul>
<li><p>the agent edits code</p>
</li>
<li><p>runs short experiments</p>
</li>
<li><p>compares outcomes</p>
</li>
<li><p>iterates</p>
</li>
</ul>
<p>That makes the repo interesting not only as code, but as a glimpse of a different way to approach ML experimentation.</p>
<h2>Why It Got Attention So Fast</h2>
<p>There are a few obvious reasons:</p>
<ul>
<li><p>it comes from Andrej Karpathy</p>
</li>
<li><p>it fits directly into the current wave of interest around coding agents</p>
</li>
<li><p>it is small enough to inspect</p>
</li>
<li><p>it feels more understandable than a giant research stack</p>
</li>
</ul>
<p>For developers, that combination makes it the kind of repository that spreads very quickly.</p>
<h2>Why I Made a Separate Guide</h2>
<p>A GitHub README works well when you already know what you are looking for.</p>
<p>But many people searching for this project are not only asking for source code. They are also asking:</p>
<ul>
<li><p>what does this repo actually do?</p>
</li>
<li><p>where should I start reading?</p>
</li>
<li><p>can I run this on smaller hardware?</p>
</li>
<li><p>should I use cloud GPUs instead?</p>
</li>
<li><p>is this the same as AutoRA?</p>
</li>
</ul>
<p>That is why I turned it into a small explainer site.</p>
<h2>What I Published</h2>
<p>I broke the topic into a few focused pages:</p>
<ul>
<li><p>overview: <a href="https://openrepoguide.com">Open Repo Guide</a></p>
</li>
<li><p>GitHub explainer: <a href="https://openrepoguide.com/autoresearch-github-guide/">AutoResearch GitHub Guide</a></p>
</li>
<li><p>tutorial: <a href="https://openrepoguide.com/autoresearch-tutorial/">AutoResearch Tutorial</a></p>
</li>
<li><p>smaller hardware guide: <a href="https://openrepoguide.com/run-autoresearch-on-mac-or-small-gpus/">Run AutoResearch on Mac or Smaller GPUs</a></p>
</li>
<li><p>neutral infra guide: <a href="https://openrepoguide.com/best-gpu-cloud-for-autoresearch/">Best GPU Cloud Options for AutoResearch</a></p>
</li>
</ul>
<h2>What I’m Actually Testing</h2>
<p>This is also a small content experiment for me.</p>
<p>I’m exploring whether a simple site can grow by taking fast-rising GitHub repositories and turning them into clearer, more beginner-friendly explainer pages.</p>
<p>Not official product sites. More like independent project guides for people discovering these repos through search.</p>
<h2>Feedback Welcome</h2>
<p>If you have looked at <code>autoresearch</code>, I’d love to know:</p>
<ul>
<li><p>what confused you most at first</p>
</li>
<li><p>whether this kind of explainer page is useful</p>
</li>
<li><p>which GitHub repos would be worth covering next</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>