<?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: JOYSTON</title>
    <description>The latest articles on DEV Community by JOYSTON (@joyston_ccd43d53e268ec635).</description>
    <link>https://dev.to/joyston_ccd43d53e268ec635</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%2F3237281%2Fee03ac91-ee0e-4089-be5b-2ea175c63228.png</url>
      <title>DEV Community: JOYSTON</title>
      <link>https://dev.to/joyston_ccd43d53e268ec635</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joyston_ccd43d53e268ec635"/>
    <language>en</language>
    <item>
      <title>Frame-Chaining AI Video: Building a 60-Second Film with GMI Cloud</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Tue, 27 Oct 2026 03:49:55 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/frame-chaining-ai-video-building-a-60-second-film-with-gmi-cloud-2nfm</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/frame-chaining-ai-video-building-a-60-second-film-with-gmi-cloud-2nfm</guid>
      <description>&lt;p&gt;I wanted to create a 60-second cinematic FPV travel film across the United States, moving from New York to San Francisco and Los Angeles.&lt;/p&gt;

&lt;p&gt;The goal wasn't simply to generate impressive AI footage. I wanted the entire film to feel like one continuous drone journey rather than a collection of unrelated clips stitched together in post-production.&lt;/p&gt;

&lt;p&gt;That introduced three practical challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintaining visual continuity across independently generated clips.&lt;/li&gt;
&lt;li&gt;Controlling camera movement, lighting, and transitions through prompts.&lt;/li&gt;
&lt;li&gt;Fixing individual shots without regenerating the entire video.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built the film using GMI Cloud's video generation models, frame chaining, and FFmpeg.&lt;/p&gt;

&lt;p&gt;The final output was exactly 60 seconds long, rendered at 1080p, with a targeted replacement for a shot that generated incorrectly.&lt;/p&gt;

&lt;p&gt;Here's how the pipeline worked, including the API issues, failed generations, and techniques that made the workflow more reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understanding the Duration Constraint
&lt;/h2&gt;

&lt;p&gt;The first step was checking the available models and their actual generation limits.&lt;/p&gt;

&lt;p&gt;Rather than relying on model names or assumptions, I used GMI Cloud's &lt;code&gt;get_model&lt;/code&gt; tool to inspect the supported parameters, duration limits, and pricing.&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="nf"&gt;get_model&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="s2"&gt;seedance-2-5-260628&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nf"&gt;get_model&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="s2"&gt;wan3.0-video&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nf"&gt;get_model&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="s2"&gt;veo-3.1-generate-001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following figures reflect the catalog and pricing I observed during development in October 2026. Verify them against the current catalog before using them in production.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Maximum duration&lt;/th&gt;
&lt;th&gt;Observed 1080p price/sec&lt;/th&gt;
&lt;th&gt;Relevant capabilities&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seedance-2-5-260628&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;30 seconds&lt;/td&gt;
&lt;td&gt;$0.569&lt;/td&gt;
&lt;td&gt;First-frame and last-frame conditioning, reference images, audio generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wan3.0-video&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;30 seconds&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;td&gt;Frame conditioning, reference images, separate negative prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;veo-3.1-generate-001&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8 seconds&lt;/td&gt;
&lt;td&gt;$0.40&lt;/td&gt;
&lt;td&gt;High photorealism, two-frame conditioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kling-3.0-turbo-t2v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;15 seconds&lt;/td&gt;
&lt;td&gt;$0.14&lt;/td&gt;
&lt;td&gt;Text-to-video generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seedance-2-0-260128-upscale&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;15 seconds&lt;/td&gt;
&lt;td&gt;$0.056&lt;/td&gt;
&lt;td&gt;Budget-oriented option&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;veo-3.1-lite-generate-001&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8 seconds&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;td&gt;Lower-cost generation at supported resolutions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These capabilities and prices are model- and configuration-dependent. Check the current API schema before building around a particular parameter.&lt;/p&gt;

&lt;p&gt;The key constraint was straightforward: no model in this selection could generate the entire 60-second film in one request.&lt;/p&gt;

&lt;p&gt;I therefore split the project into two 30-second generations.&lt;/p&gt;

&lt;p&gt;Fewer, longer clips reduce the number of boundaries that need to be managed. A six-clip pipeline introduces five joins, while a two-clip pipeline introduces just one.&lt;/p&gt;

&lt;p&gt;However, clip length shouldn't be the only consideration. The structure of the film matters, too. If a story naturally contains three distinct locations or sequences, three shorter clips may be easier to control than two longer generations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The objective is to minimize unnecessary joins without forcing unrelated scenes into one generation.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Prompt Engineering: Control the Camera Before the Scene
&lt;/h2&gt;

&lt;p&gt;One of the biggest lessons from this project was that a video prompt needs to describe motion, not just visual content.&lt;/p&gt;

&lt;p&gt;My initial prompts combined several events into short sequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dive between skyscrapers.&lt;/li&gt;
&lt;li&gt;Sweep toward the Hudson River.&lt;/li&gt;
&lt;li&gt;Transition from sunrise to blue hour.&lt;/li&gt;
&lt;li&gt;Race through city streets.&lt;/li&gt;
&lt;li&gt;Introduce light trails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The results were inconsistent. Architecture distorted, transitions became muddy, and the camera sometimes appeared to blend incompatible locations.&lt;/p&gt;

&lt;p&gt;The problem was trying to control too many independent events in a single prompt.&lt;/p&gt;

&lt;p&gt;My revised approach was to define a continuous camera movement with explicit scene timing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The single-movement principle
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Describe one continuous camera journey per generation, and use FFmpeg for editorial cuts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This doesn't mean a longer generation must contain only one location. It means the transitions between locations should follow a physically understandable camera movement rather than asking the model to perform several unrelated edits.&lt;/p&gt;

&lt;p&gt;For example, an aircraft wing can pass across the lens and temporarily obscure the entire frame. The next location can emerge as the wing clears.&lt;/p&gt;

&lt;p&gt;That provides a visual transition the model can attempt to render as part of the camera movement.&lt;/p&gt;

&lt;p&gt;Here's an excerpt from the prompt used for the film:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ultra-realistic cinematic FPV drone travel film, 30 seconds, 16:9.

One continuous high-speed journey across the United States.
Maintain forward camera momentum throughout.

Photorealistic imagery, consistent teal-and-orange commercial
color grading, high dynamic range, natural film grain,
subtle horizontal anamorphic lens flare, and a wide 14mm lens.

Use smooth motion blur only during the fastest movements.

No text, captions, subtitles, logos, watermarks, or readable
signage.

SHOT 1 (0-7s):
Above New York City at sunrise. Low mist surrounds the
skyscrapers as the drone tips forward and dives between
glass towers. Golden light reflects across the facades.

SHOT 2 (7-15s):
The camera descends to street level and races down a wide
Manhattan avenue. Moving cars pass beneath the camera,
their headlights and taillights creating flowing light trails.

SHOT 3 (15-22s):
The drone rises over New York Harbor. A ferry crosses the
water below, leaving a white wake. The camera sweeps around
to reveal the Statue of Liberty in the morning haze.

SHOT 4 (22-30s):
An aircraft wing passes directly across the lens, filling
the frame. As it clears, the camera emerges above turquoise
Pacific water near San Francisco, moving toward the Golden
Gate Bridge as its red towers appear through coastal fog.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The timing provides structure, but it doesn't guarantee that the model will follow every boundary precisely. Treat shot durations as guidance and inspect the generated footage before editing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the visual identity consistent
&lt;/h3&gt;

&lt;p&gt;Consistency doesn't require identical lighting throughout the film.&lt;/p&gt;

&lt;p&gt;The sequence moves between sunrise, daylight, golden hour, and night. Those changes are part of the story.&lt;/p&gt;

&lt;p&gt;What should remain relatively stable is the visual treatment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Color grading.&lt;/li&gt;
&lt;li&gt;Lens characteristics.&lt;/li&gt;
&lt;li&gt;Motion style.&lt;/li&gt;
&lt;li&gt;Contrast and highlight handling.&lt;/li&gt;
&lt;li&gt;Overall level of realism.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I repeated the same visual descriptors across prompts while allowing the lighting and environment to change.&lt;/p&gt;

&lt;p&gt;This gave the film a more consistent look without making every location feel artificially identical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Negative prompts are model-specific
&lt;/h3&gt;

&lt;p&gt;Different models expose different controls.&lt;/p&gt;

&lt;p&gt;For example, &lt;code&gt;wan3.0-video&lt;/code&gt; supports a dedicated &lt;code&gt;negative_prompt&lt;/code&gt; parameter, while the Seedance 2.5 configuration I used did not expose that parameter.&lt;/p&gt;

&lt;p&gt;For Seedance, I placed unwanted elements directly in the prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No text, captions, subtitles, logos, watermarks, or readable
signage anywhere in the frame.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The general lesson is to inspect the actual model schema rather than assume that every video model supports the same parameters.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Frame Chaining: Maintaining Continuity Between Clips
&lt;/h2&gt;

&lt;p&gt;Frame chaining was the central technique in this project.&lt;/p&gt;

&lt;p&gt;Instead of generating two unrelated clips and trying to hide their differences afterward, I used the final frame of the first clip to condition the beginning of the second.&lt;/p&gt;

&lt;p&gt;The pipeline is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate clip A.&lt;/li&gt;
&lt;li&gt;Extract a frame near the end of clip A.&lt;/li&gt;
&lt;li&gt;Upload the frame to GMI Cloud.&lt;/li&gt;
&lt;li&gt;Pass its URL as the &lt;code&gt;first_frame&lt;/code&gt; parameter when generating clip B.&lt;/li&gt;
&lt;li&gt;Inspect the boundary and adjust the edit if necessary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The second generation now has a visual reference for where the first generation ended.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extracting the frame with FFmpeg
&lt;/h3&gt;

&lt;p&gt;I extracted a frame near the end of the first clip:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-ss&lt;/span&gt; 29.9 &lt;span class="nt"&gt;-i&lt;/span&gt; clipA.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-frames&lt;/span&gt;:v 1 chain_last.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I then normalized the image to the intended output dimensions and converted it to JPEG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; chain_last.png &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-q&lt;/span&gt;:v 3 chain_first.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output dimensions should match the intended video aspect ratio. If the source frame already has the correct dimensions, unnecessary scaling and cropping can be avoided.&lt;/p&gt;

&lt;p&gt;The extracted image becomes the conditioning frame for the next generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uploading the frame to GMI Cloud
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;upload_media&lt;/code&gt; operation returns a signed &lt;code&gt;upload_url&lt;/code&gt; and a &lt;code&gt;public_url&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These serve different purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;upload_url&lt;/code&gt; is the destination for uploading the file.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;public_url&lt;/code&gt; is the image URL supplied to the video generation request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The signed URL doesn't upload the file automatically. You must send the image bytes to it.&lt;/p&gt;

&lt;p&gt;Here's a minimal Python example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib.request&lt;/span&gt;

&lt;span class="n"&gt;upload_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;upload_url from upload_media&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chain_first.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;image_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;image_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;upload_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;image_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PUT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image/jpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the URL and HTTP method specified by the upload operation. If the signed URL expires or the upload returns a signature error, request a fresh URL and retry.&lt;/p&gt;

&lt;p&gt;I encountered a &lt;code&gt;403 SignatureDoesNotMatch&lt;/code&gt; error with an earlier upload URL. Requesting a new URL resolved the problem in my case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generating the next clip
&lt;/h3&gt;

&lt;p&gt;With the frame uploaded, I passed its public URL to Seedance 2.5.&lt;/p&gt;

&lt;p&gt;The following is a representative request structure; use the exact field names and request envelope documented by the current API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"seedance-2-5-260628"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;your scene and camera-movement prompt&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1080p"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ratio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"adaptive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"first_frame"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;public_url of chain_first.jpg&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"generate_audio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"watermark"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The critical setting was &lt;code&gt;ratio&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;ratio&lt;/code&gt; configuration issue
&lt;/h3&gt;

&lt;p&gt;I encountered failed generations when using an explicit &lt;code&gt;ratio: "16:9"&lt;/code&gt; and when omitting the ratio entirely.&lt;/p&gt;

&lt;p&gt;The API returned an error explaining that, when first-frame or first-and-last-frame conditioning is used, the output aspect ratio follows the input frame.&lt;/p&gt;

&lt;p&gt;The configuration that worked was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"ratio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"adaptive"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For this particular model configuration, using &lt;code&gt;ratio: "adaptive"&lt;/code&gt; resolved the issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't assume that a parameter's default value is valid for every generation mode.&lt;/strong&gt; Frame-conditioned generation can have different validation rules from text-to-video generation.&lt;/p&gt;

&lt;p&gt;Verify this behavior against the current API documentation before relying on it in another model version.&lt;/p&gt;

&lt;h3&gt;
  
  
  What frame chaining actually guarantees
&lt;/h3&gt;

&lt;p&gt;Frame chaining is useful, but it is important to distinguish three different forms of continuity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame continuity:&lt;/strong&gt; The next generation receives a reference image matching the preceding clip's endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Temporal continuity:&lt;/strong&gt; Camera motion, object movement, lighting, and perspective evolve naturally across the boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subject continuity:&lt;/strong&gt; People, vehicles, and other objects maintain their identity and appearance across shots.&lt;/p&gt;

&lt;p&gt;Frame chaining primarily addresses the first problem. It can help with the second, but it doesn't guarantee a perfect motion transition. It also doesn't guarantee subject consistency across independently generated scenes.&lt;/p&gt;

&lt;p&gt;A matching boundary frame is not proof that the surrounding motion will be seamless.&lt;/p&gt;

&lt;p&gt;For recurring subjects, combine frame conditioning with reference images where the model supports them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Reference parameter&lt;/th&gt;
&lt;th&gt;Observed catalog limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wan3.0-video&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;reference_image&lt;/code&gt;, &lt;code&gt;reference_video&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Up to 10 images and 5 videos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seedance-2-5-260628&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;reference_images&lt;/code&gt;, &lt;code&gt;reference_videos&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Up to 9 images and 3 videos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;happyhorse-1.1-r2v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;reference_image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Up to 5 images&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These limits are model-specific and should be verified before use.&lt;/p&gt;

&lt;p&gt;I also found that frame chaining works best when the next clip continues a compatible scene.&lt;/p&gt;

&lt;p&gt;A coastline transitioning into a bridge approach provides a natural continuation. A sudden jump from San Francisco to a Los Angeles street is a different editorial event and is often better handled as a deliberate cut.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chain compatible camera movements. Use editing to handle genuine changes in scene or location.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Stitching the Film with FFmpeg
&lt;/h2&gt;

&lt;p&gt;Once the clips were generated, I assembled them into the final video.&lt;/p&gt;

&lt;p&gt;For a simple join, FFmpeg's concat demuxer is convenient when the input files have compatible stream properties.&lt;/p&gt;

&lt;p&gt;Create a file named &lt;code&gt;list.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;file 'clipA.mp4'
file 'clipB.mp4'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then concatenate the clips:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; concat &lt;span class="nt"&gt;-safe&lt;/span&gt; 0 &lt;span class="nt"&gt;-i&lt;/span&gt; list.txt &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; 60.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"fps=24,scale=1920:1080:flags=lanczos,format=yuv420p"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="nt"&gt;-preset&lt;/span&gt; slow &lt;span class="nt"&gt;-crf&lt;/span&gt; 17 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart &lt;span class="se"&gt;\&lt;/span&gt;
  out/master.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example assumes that the input streams are compatible with the chosen filter and encoding pipeline. Incompatible codecs, time bases, resolutions, or audio streams may require normalization before concatenation.&lt;/p&gt;

&lt;p&gt;The command also re-encodes the video, so it is not a lossless join.&lt;/p&gt;

&lt;h3&gt;
  
  
  When the clips need different processing
&lt;/h3&gt;

&lt;p&gt;For the final replacement, I needed to combine a 50-second section of the existing master with a newly generated 10-second clip.&lt;/p&gt;

&lt;p&gt;I used a filter graph to concatenate the video and audio streams while normalizing the video output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; head.mp4 &lt;span class="nt"&gt;-i&lt;/span&gt; clipFix.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-filter_complex&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"[0:v][1:v]concat=n=2:v=1:a=0,fps=24,scale=1920:1080:flags=lanczos,format=yuv420p[v]; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
   [0:a][1:a]concat=n=2:v=0:a=1[a]"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-map&lt;/span&gt; &lt;span class="s2"&gt;"[v]"&lt;/span&gt; &lt;span class="nt"&gt;-map&lt;/span&gt; &lt;span class="s2"&gt;"[a]"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; 60.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="nt"&gt;-preset&lt;/span&gt; slow &lt;span class="nt"&gt;-crf&lt;/span&gt; 17 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-profile&lt;/span&gt;:v high &lt;span class="nt"&gt;-level&lt;/span&gt; 4.2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-b&lt;/span&gt;:a 192k &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart &lt;span class="se"&gt;\&lt;/span&gt;
  out/america_60s_16x9_v2.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This version assumes both inputs contain compatible audio streams. If one clip lacks audio, the filter graph needs to be adjusted to create or omit the missing stream.&lt;/p&gt;

&lt;p&gt;Also, &lt;code&gt;-t 60.0&lt;/code&gt; limits the output duration; it doesn't independently guarantee that the final file contains exactly 60 seconds of usable footage.&lt;/p&gt;

&lt;p&gt;To verify the result, inspect the actual duration and frame count.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffprobe &lt;span class="nt"&gt;-v&lt;/span&gt; error &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-show_entries&lt;/span&gt; &lt;span class="nv"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;duration &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-of&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;noprint_wrappers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1:nokey&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="se"&gt;\&lt;/span&gt;
  out/america_60s_16x9_v2.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a 24 fps output, 60 seconds corresponds to 1,440 frames. Checking both duration and frame count is useful when exact delivery specifications matter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a cinematic 2.39:1 presentation
&lt;/h3&gt;

&lt;p&gt;The source video was generated at 16:9, but I also wanted to test a wider cinematic presentation.&lt;/p&gt;

&lt;p&gt;One option is to scale the image to 1920 × 804 and add black bars to restore a 1920 × 1080 canvas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; master.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale=1920:804:flags=lanczos,pad=1920:1080:0:138:black"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="nt"&gt;-preset&lt;/span&gt; slow &lt;span class="nt"&gt;-crf&lt;/span&gt; 17 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-profile&lt;/span&gt;:v high &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:a copy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-movflags&lt;/span&gt; +faststart &lt;span class="se"&gt;\&lt;/span&gt;
  out/master_239.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This produces an approximately 2.39:1 image area within a 16:9 video frame.&lt;/p&gt;

&lt;p&gt;Letterboxing preserves the entire scaled image, unlike a direct vertical crop that discards parts of the original frame.&lt;/p&gt;

&lt;p&gt;However, scaling the full 16:9 image to 1920 × 804 changes its proportions unless the image is cropped first. For a geometrically correct widescreen presentation, use a crop-and-scale pipeline when necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Re-Rendering One Bad Shot Instead of the Entire Film
&lt;/h2&gt;

&lt;p&gt;One of the most useful aspects of this workflow was the ability to replace a specific segment without rebuilding the whole video.&lt;/p&gt;

&lt;p&gt;During generation, the Hollywood sign appeared as "HOLFWOOD" instead of "HOLLYWOOD".&lt;/p&gt;

&lt;p&gt;This is a familiar limitation of generative video models: text can look convincing at a glance while individual characters remain incorrect or unstable.&lt;/p&gt;

&lt;p&gt;Regenerating the entire 60-second film would have wasted both time and credits.&lt;/p&gt;

&lt;p&gt;Instead, I extracted the frame at the replacement boundary, used it as the new clip's &lt;code&gt;first_frame&lt;/code&gt;, and generated a replacement segment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-ss&lt;/span&gt; 50.0 &lt;span class="nt"&gt;-i&lt;/span&gt; out/master.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-frames&lt;/span&gt;:v 1 splice_first.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After uploading the frame and generating the replacement clip, I rebuilt the master from the unchanged opening section and the new footage.&lt;/p&gt;

&lt;p&gt;The replacement was approximately 10 seconds long.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompting for accurate text
&lt;/h3&gt;

&lt;p&gt;For the replacement, I made the lettering requirement explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CRITICAL: The hillside sign must read exactly HOLLYWOOD.

The spelling is H-O-L-L-Y-W-O-O-D: nine letters.

The fourth letter must be L, not F.

The letters are large, white, individually formed capital
letters arranged in a straight horizontal line on a dry,
brown hillside.

Keep the lettering stable, correctly formed, and clearly
visible from the front. Do not distort, rearrange, or replace
any characters.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The revised generation produced the intended spelling.&lt;/p&gt;

&lt;p&gt;This doesn't mean literal prompts can reliably solve text rendering in every model. It means a specific description of the expected output and known failure can improve the next attempt.&lt;/p&gt;

&lt;p&gt;For shots containing signs, product labels, or other critical text, I recommend treating one or two targeted re-renders as part of the production budget.&lt;/p&gt;

&lt;p&gt;When exact typography is essential, a more reliable approach is to add the text during post-production rather than depend on the video model to render it correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Practical Issues I Encountered
&lt;/h2&gt;

&lt;p&gt;The creative workflow was only part of the implementation. Several API and environment issues also affected the process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep generation parameters in the expected structure
&lt;/h3&gt;

&lt;p&gt;My generation-estimation requests required model-specific parameters to be nested under &lt;code&gt;parameters&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"seedance-2-5-260628"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;prompt&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1080p"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ratio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"adaptive"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the structure expected by the relevant operation. An estimation endpoint and a generation endpoint may not accept identical request bodies.&lt;/p&gt;

&lt;h3&gt;
  
  
  An MCP timeout doesn't necessarily mean generation failed
&lt;/h3&gt;

&lt;p&gt;One &lt;code&gt;submit_generation&lt;/code&gt; request timed out on the client side while the server-side generation continued running.&lt;/p&gt;

&lt;p&gt;Submitting the same request again could have created unnecessary work or additional charges.&lt;/p&gt;

&lt;p&gt;Instead, I used &lt;code&gt;list_generations&lt;/code&gt; to inspect the existing jobs and recover their status.&lt;/p&gt;

&lt;p&gt;For production systems, keep track of generation IDs, request parameters, and job status. When supported, use idempotency controls to distinguish intentional re-renders from accidental duplicate submissions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check which credits apply to each model
&lt;/h3&gt;

&lt;p&gt;My account displayed a zero-dollar balance alongside promotional credits. One model returned an &lt;code&gt;insufficient_balance&lt;/code&gt; error, while another accepted the request.&lt;/p&gt;

&lt;p&gt;This was an account-specific result, not proof that all promotional credits are restricted in the same way.&lt;/p&gt;

&lt;p&gt;Before running a large batch, verify that the available credits apply to the selected model and generation configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify your FFmpeg version
&lt;/h3&gt;

&lt;p&gt;My system FFmpeg installation was too old to handle the HEVC Main10 output produced by the video model.&lt;/p&gt;

&lt;p&gt;The resulting codec errors initially looked like a problem with the downloaded file.&lt;/p&gt;

&lt;p&gt;I installed a newer FFmpeg binary through &lt;code&gt;imageio-ffmpeg&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;imageio-ffmpeg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I checked the binary path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import imageio_ffmpeg; print(imageio_ffmpeg.get_ffmpeg_exe())"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a sufficiently recent FFmpeg build with the codecs required by your source footage.&lt;/p&gt;

&lt;p&gt;For reproducible workflows, check the installed version and codec support before beginning a batch of generations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify audio instead of trusting the response
&lt;/h3&gt;

&lt;p&gt;Although I requested audio generation, both clips returned valid AAC audio streams that were effectively silent.&lt;/p&gt;

&lt;p&gt;I checked the audio levels with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; clip.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-af&lt;/span&gt; volumedetect &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; null - 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"mean_volume|max_volume"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A valid audio stream doesn't necessarily contain audible sound. Inspect the output and listen to the actual result before delivery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separate language-model usage from media-generation costs
&lt;/h3&gt;

&lt;p&gt;The account-summary information I inspected reported language-model usage separately from image and video generation.&lt;/p&gt;

&lt;p&gt;Don't treat an LLM token-cost report as a complete accounting of a media-generation project.&lt;/p&gt;

&lt;p&gt;Track the actual generation requests and their associated charges, and reconcile them against the relevant billing information.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Cost Breakdown
&lt;/h2&gt;

&lt;p&gt;The final film used two 30-second clips and one 10-second replacement.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generation&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;th&gt;Observed cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clip A — Seedance 2.5, 1080p&lt;/td&gt;
&lt;td&gt;30 seconds&lt;/td&gt;
&lt;td&gt;$17.07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clip B — Seedance 2.5, 1080p, frame-conditioned&lt;/td&gt;
&lt;td&gt;30 seconds&lt;/td&gt;
&lt;td&gt;$17.07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replacement clip — Seedance 2.5, 1080p&lt;/td&gt;
&lt;td&gt;10 seconds&lt;/td&gt;
&lt;td&gt;$5.69&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;70 generated seconds&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$39.83&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The total cost was $39.83 for a final 60-second film.&lt;/p&gt;

&lt;p&gt;Notice that the generation duration adds up to 70 seconds, not 60. The extra 10 seconds came from replacing the incorrect segment.&lt;/p&gt;

&lt;p&gt;The effective cost was approximately $0.66 per second of finished video.&lt;/p&gt;

&lt;p&gt;These figures reflect the pricing and usage observed during this project. They exclude any additional costs not reflected in the recorded generation charges.&lt;/p&gt;

&lt;p&gt;A lower-cost model may make experimentation more affordable, but cheaper generation can also require additional attempts to reach the desired visual quality.&lt;/p&gt;

&lt;p&gt;The right choice depends on the importance of photorealism, continuity, generation speed, and budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Budget for re-renders from the beginning.&lt;/strong&gt; A pipeline that assumes every generated shot will be usable is likely to underestimate its actual cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Scaling the Pipeline Beyond 60 Seconds
&lt;/h2&gt;

&lt;p&gt;The same approach can be extended to longer films.&lt;/p&gt;

&lt;p&gt;At a maximum of 30 seconds per clip:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Final duration&lt;/th&gt;
&lt;th&gt;Number of clips&lt;/th&gt;
&lt;th&gt;Number of joins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;60 seconds&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 minutes&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 minutes&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These counts assume full-length 30-second clips. Shorter clips may be more appropriate when the story contains distinct scenes or requires tighter control.&lt;/p&gt;

&lt;p&gt;Each additional join creates another opportunity for mismatched motion, lighting, composition, or subject appearance.&lt;/p&gt;

&lt;p&gt;Several practices make a longer pipeline easier to manage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choose boundary frames deliberately
&lt;/h3&gt;

&lt;p&gt;Don't extract the final frame automatically without checking it.&lt;/p&gt;

&lt;p&gt;Look for a frame where the camera is passing behind an object, approaching a new landmark, or entering a natural visual transition.&lt;/p&gt;

&lt;p&gt;These moments can make an editorial boundary less noticeable.&lt;/p&gt;

&lt;p&gt;However, the extracted frame should also provide a useful starting composition for the next generation. A visually interesting boundary is not necessarily a good conditioning frame if the next scene cannot continue naturally from it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preserve intermediate frames and generation metadata
&lt;/h3&gt;

&lt;p&gt;Archive the conditioning frame used for every clip, along with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The original prompt.&lt;/li&gt;
&lt;li&gt;Model ID and generation parameters.&lt;/li&gt;
&lt;li&gt;Generation job ID.&lt;/li&gt;
&lt;li&gt;Source and output file paths.&lt;/li&gt;
&lt;li&gt;Cost and duration.&lt;/li&gt;
&lt;li&gt;Notes about failed attempts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If clip 4 needs to be regenerated, the saved endpoint from clip 3 allows you to reproduce its starting condition without rebuilding the earlier footage.&lt;/p&gt;

&lt;p&gt;This makes the workflow easier to debug and maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parallelize independent generations
&lt;/h3&gt;

&lt;p&gt;Once the necessary reference frames are available, independent segments can be generated concurrently.&lt;/p&gt;

&lt;p&gt;A fully sequential chain cannot be generated entirely in parallel because each clip may depend on the preceding clip's output.&lt;/p&gt;

&lt;p&gt;A practical compromise is to divide the film into sequences that can be generated independently, then chain clips within each sequence.&lt;/p&gt;

&lt;p&gt;Use idempotency controls where supported, and check the job list before retrying a timed-out request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make every segment independently replaceable
&lt;/h3&gt;

&lt;p&gt;Treat each generated clip as a separate production asset.&lt;/p&gt;

&lt;p&gt;The master video should be a reproducible output of the individual segments and the editing pipeline, not the only copy of the project.&lt;/p&gt;

&lt;p&gt;That allows a single failed shot to be replaced without rebuilding the entire film.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Visual Verification Before Delivery
&lt;/h2&gt;

&lt;p&gt;A successful API response doesn't mean the video is ready to publish.&lt;/p&gt;

&lt;p&gt;I used FFmpeg to extract representative frames from across the timeline and assemble them into a contact sheet.&lt;/p&gt;

&lt;p&gt;This made it easier to identify changes in visual style, unexpected objects, and problems with transitions.&lt;/p&gt;

&lt;p&gt;For example, to inspect eight points in the film:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; keys

&lt;span class="k"&gt;for &lt;/span&gt;t &lt;span class="k"&gt;in &lt;/span&gt;1 9 17 25 33 41 49 58&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;ffmpeg &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-ss&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$t&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; out/master.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-frames&lt;/span&gt;:v 1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale=470:-1"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"keys/m_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.jpg"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The individual frames can then be assembled into a contact sheet.&lt;/p&gt;

&lt;p&gt;A contact sheet is useful for reviewing the overall visual progression, but it won't reveal every temporal artifact.&lt;/p&gt;

&lt;p&gt;For that, inspect the actual footage around each join, preferably frame by frame or at reduced playback speed.&lt;/p&gt;

&lt;p&gt;For the Hollywood sign, I also extracted frames at half-second intervals to check whether the lettering remained stable throughout the replacement segment.&lt;/p&gt;

&lt;p&gt;This helped distinguish incorrect lettering from frames where the sign was partially visible or viewed at an angle.&lt;/p&gt;

&lt;p&gt;My final verification checklist included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Confirm the final duration and frame rate.&lt;/li&gt;
&lt;li&gt;[ ] Inspect every join for jumps in camera position or motion.&lt;/li&gt;
&lt;li&gt;[ ] Check lighting, color grading, and scene continuity.&lt;/li&gt;
&lt;li&gt;[ ] Review text, faces, architecture, and other high-risk details.&lt;/li&gt;
&lt;li&gt;[ ] Verify audio levels and playback.&lt;/li&gt;
&lt;li&gt;[ ] Confirm the output resolution and encoding.&lt;/li&gt;
&lt;li&gt;[ ] Play the final exported file from beginning to end.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The model generates the footage. The editing and verification pipeline determines whether it is ready to ship.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building a continuous AI-generated film is not just a prompting problem. It is a pipeline problem involving generation limits, frame conditioning, asset management, editing, and quality control.&lt;/p&gt;

&lt;p&gt;For this project, frame chaining provided a practical way to connect separately generated clips while keeping each segment independently replaceable.&lt;/p&gt;

&lt;p&gt;The most important lessons were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check model capabilities before designing the pipeline.&lt;/strong&gt; Generation limits and parameter support determine how the film should be structured.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Describe camera movement explicitly.&lt;/strong&gt; A coherent camera path is easier to manage than a prompt containing unrelated transitions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use frame chaining for continuity.&lt;/strong&gt; The previous clip's endpoint provides a visual starting condition for the next generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the pipeline modular.&lt;/strong&gt; Replace failed segments rather than regenerating the entire film.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify the actual output.&lt;/strong&gt; Inspect the joins, text, audio, duration, and final encoding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget for failed generations.&lt;/strong&gt; Re-renders are part of the workflow, not an unexpected exception.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The final film cost $39.83 in recorded generation charges and required 70 seconds of generated footage to produce 60 seconds of finished video.&lt;/p&gt;

&lt;p&gt;The broader takeaway is that AI video generation becomes more manageable when treated as a reproducible media pipeline rather than a sequence of isolated prompts.&lt;/p&gt;

&lt;p&gt;Frame chaining won't eliminate every continuity problem, but it gives you a useful degree of control over how separately generated footage fits together.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Model capabilities, parameter support, and pricing are subject to change. The figures in this article reflect observations from October 2026. Check the current GMI Cloud model catalog and API documentation before implementing the workflow.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Tried Shorebird and Finally Understood Why Flutter Developers Keep Talking About It</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Sat, 13 Jun 2026 13:54:50 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/i-tried-shorebird-and-finally-understood-why-flutter-developers-keep-talking-about-it-301n</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/i-tried-shorebird-and-finally-understood-why-flutter-developers-keep-talking-about-it-301n</guid>
      <description>&lt;p&gt;One thing that always annoyed me in mobile development is how long a simple fix can take to reach users.&lt;/p&gt;

&lt;p&gt;You find a bug.&lt;/p&gt;

&lt;p&gt;You fix the bug.&lt;/p&gt;

&lt;p&gt;You build again.&lt;/p&gt;

&lt;p&gt;You upload again.&lt;/p&gt;

&lt;p&gt;Then… wait.&lt;/p&gt;

&lt;p&gt;Sometimes for hours. Sometimes longer.&lt;/p&gt;

&lt;p&gt;Coming from web development where changes can go live quickly, mobile releases always felt slower than they should be.&lt;/p&gt;

&lt;p&gt;Recently I came across &lt;strong&gt;Shorebird&lt;/strong&gt;, and after understanding how it works, I can see why people are excited about it.&lt;/p&gt;

&lt;p&gt;If you build Flutter apps, this is probably worth knowing about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem isn’t writing code — it’s shipping it
&lt;/h2&gt;

&lt;p&gt;Imagine this.&lt;/p&gt;

&lt;p&gt;Your app is already live.&lt;/p&gt;

&lt;p&gt;Someone reports:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The submit button doesn’t work.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The actual fix takes 5 minutes.&lt;/p&gt;

&lt;p&gt;But releasing it?&lt;/p&gt;

&lt;p&gt;That’s a different story.&lt;/p&gt;

&lt;p&gt;Normally the process looks something like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix the issue&lt;/li&gt;
&lt;li&gt;Generate a new build&lt;/li&gt;
&lt;li&gt;Upload to Play Store / App Store&lt;/li&gt;
&lt;li&gt;Wait for approval&lt;/li&gt;
&lt;li&gt;Wait for users to update&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a tiny issue, that process feels heavy.&lt;/p&gt;

&lt;p&gt;That’s exactly the problem Shorebird tries to reduce.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what exactly is Shorebird?
&lt;/h2&gt;

&lt;p&gt;Shorebird lets Flutter developers push certain updates to already-installed apps without publishing a completely new app release every time.&lt;/p&gt;

&lt;p&gt;The first version still goes through the app store normally.&lt;/p&gt;

&lt;p&gt;After that, when you make eligible Flutter code changes, Shorebird can send those updates directly to users.&lt;/p&gt;

&lt;p&gt;When I first read about it, my reaction was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Wait… so this is basically faster app updates?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s the simple explanation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I found interesting
&lt;/h2&gt;

&lt;p&gt;Instead of shipping the whole application again, Shorebird creates a &lt;strong&gt;patch&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Meaning:&lt;/p&gt;

&lt;p&gt;If you changed 20 lines of Dart code…&lt;/p&gt;

&lt;p&gt;you’re not rebuilding and redistributing everything.&lt;/p&gt;

&lt;p&gt;You’re only sending what changed.&lt;/p&gt;

&lt;p&gt;That idea feels obvious once you see it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Let’s say you release Version 1.0.&lt;/p&gt;

&lt;p&gt;A few hours later users start saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Dark mode crashes.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You fix it.&lt;/p&gt;

&lt;p&gt;Normally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter build
upload
&lt;span class="nb"&gt;wait&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Shorebird:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;shorebird patch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users can receive that update much faster.&lt;/p&gt;

&lt;p&gt;That part feels closer to deploying a website than releasing a mobile app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things it doesn’t magically solve
&lt;/h2&gt;

&lt;p&gt;This was something I misunderstood initially.&lt;/p&gt;

&lt;p&gt;Shorebird doesn’t replace app stores.&lt;/p&gt;

&lt;p&gt;You still need normal releases for things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native Android changes&lt;/li&gt;
&lt;li&gt;Native iOS code updates&lt;/li&gt;
&lt;li&gt;Permission changes&lt;/li&gt;
&lt;li&gt;SDK upgrades&lt;/li&gt;
&lt;li&gt;Store listing updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It mainly helps with Flutter-side changes.&lt;/p&gt;

&lt;p&gt;Still useful—but good to know before going in expecting instant updates for everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I think this makes the most sense
&lt;/h2&gt;

&lt;p&gt;After looking into it, I think Shorebird fits best if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You ship frequently&lt;/li&gt;
&lt;li&gt;You maintain production Flutter apps&lt;/li&gt;
&lt;li&gt;You hate waiting for tiny fixes&lt;/li&gt;
&lt;li&gt;You already use CI/CD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your app rarely changes, maybe the benefit isn’t huge.&lt;/p&gt;

&lt;p&gt;But for teams pushing updates often, I can see why people adopt it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;I’m not saying Shorebird suddenly makes mobile deployment perfect.&lt;/p&gt;

&lt;p&gt;But I do think it removes one of the most frustrating parts of the process.&lt;/p&gt;

&lt;p&gt;The interesting part isn’t the technology itself.&lt;/p&gt;

&lt;p&gt;It’s the feeling of being able to fix something and get it into users’ hands without turning a small change into a full release cycle.&lt;/p&gt;

&lt;p&gt;That’s probably why people keep recommending it.&lt;/p&gt;

&lt;p&gt;If you’ve used Shorebird in a real app, I’d love to know how your experience was.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>development</category>
      <category>software</category>
    </item>
    <item>
      <title>A Hackathon Ended. The Idea Didn't: Transforming CADemy into Triax AI for the Next Generation of Makers</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Tue, 02 Jun 2026 16:27:57 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/a-hackathon-ended-the-idea-didnt-transforming-cademy-into-triax-ai-for-the-next-generation-of-561j</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/a-hackathon-ended-the-idea-didnt-transforming-cademy-into-triax-ai-for-the-next-generation-of-561j</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;A few years ago, I participated in a hackathon and built a project called &lt;strong&gt;CADemy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 CADemy: &lt;a href="https://cademycad.netlify.app/" rel="noopener noreferrer"&gt;https://cademycad.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The idea came from a simple question that kept bothering me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is learning CAD still so expensive?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As engineering students, we're constantly told that skills like 3D design, product development, manufacturing, robotics, and architecture will shape the future. Yet the tools used to learn these skills are often locked behind expensive software licenses that many students simply cannot afford.&lt;/p&gt;

&lt;p&gt;For some universities and organizations, this may not be a problem. But for smaller schools, students from rural communities, and underprivileged children, the cost of accessing quality CAD education can be a real barrier.&lt;/p&gt;

&lt;p&gt;I kept thinking about something.&lt;/p&gt;

&lt;p&gt;A student shouldn't have to wait until college to discover a passion for engineering. Curiosity starts much earlier. A 13-year-old experimenting with design today could become tomorrow's engineer, architect, or inventor.&lt;/p&gt;

&lt;p&gt;So during that hackathon, I built CADemy a browser-based platform where anyone could learn CAD concepts through interactive 3D modeling, hands-on challenges, and experimentation.&lt;/p&gt;

&lt;p&gt;The project worked. People liked the idea.&lt;/p&gt;

&lt;p&gt;But like many hackathon projects, it reached the demo stage and stopped there.&lt;/p&gt;

&lt;p&gt;There were features I wanted to build, learning experiences I wanted to improve, and a much bigger vision that simply couldn't fit into a weekend.&lt;/p&gt;

&lt;p&gt;When I came across the GitHub Finish-Up-A-Thon Challenge, I knew exactly which project I wanted to revisit.&lt;/p&gt;

&lt;p&gt;Instead of starting something new, I decided to finish something I genuinely believed in.&lt;/p&gt;

&lt;p&gt;That decision led to &lt;strong&gt;Triax AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 Triax AI: &lt;a href="https://triax-ai.netlify.app/" rel="noopener noreferrer"&gt;https://triax-ai.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Triax AI is the next evolution of CADemy. It keeps the original mission intact while introducing AI-powered guidance, real-time feedback, interactive tutorials, personalized learning experiences and a significantly improved 3D design environment.&lt;/p&gt;

&lt;p&gt;The technology changed.&lt;/p&gt;

&lt;p&gt;The interface changed.&lt;/p&gt;

&lt;p&gt;Even the name changed.&lt;/p&gt;

&lt;p&gt;But the mission remained exactly the same:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To make 3D design education free, fun, and accessible to anyone with curiosity and an internet connection.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
    </item>
    <item>
      <title>Why Jira Is Still the Best Tool for Defect Monitoring and Complex Task Management</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Fri, 29 May 2026 17:21:43 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/why-jira-is-still-the-best-tool-for-defect-monitoring-and-complex-task-management-2eff</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/why-jira-is-still-the-best-tool-for-defect-monitoring-and-complex-task-management-2eff</guid>
      <description>&lt;p&gt;Modern software teams move fast. Features are released continuously, bugs need immediate attention, and projects often involve multiple teams working together. In this environment, having a proper workflow management system becomes essential.&lt;/p&gt;

&lt;p&gt;That’s where Jira by Atlassian stands out.&lt;/p&gt;

&lt;p&gt;At first glance, Jira may look like just another issue tracker. But once you start working on real projects, especially large-scale ones, its depth becomes obvious. From defect monitoring to sprint planning and advanced issue tracking through JQL, Jira helps teams stay organized even in highly complex workflows.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why Jira Works So Well for Defect Monitoring
&lt;/h1&gt;

&lt;p&gt;Jira was originally designed for bug and issue tracking, and that remains one of its strongest areas.&lt;/p&gt;

&lt;p&gt;A typical bug workflow in Jira looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open → In Progress → QA Testing → Resolved → Closed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure gives teams complete visibility into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which bugs are open&lt;/li&gt;
&lt;li&gt;Who is working on them&lt;/li&gt;
&lt;li&gt;How long issues remain unresolved&lt;/li&gt;
&lt;li&gt;Which defects are critical&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jira also allows teams to attach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;Error logs&lt;/li&gt;
&lt;li&gt;Stack traces&lt;/li&gt;
&lt;li&gt;Videos&lt;/li&gt;
&lt;li&gt;Comments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything stays centralized inside a single ticket, making communication between QA and developers much smoother.&lt;/p&gt;

&lt;p&gt;One of the biggest advantages is traceability. Bugs can be linked directly to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User stories&lt;/li&gt;
&lt;li&gt;Pull requests&lt;/li&gt;
&lt;li&gt;Deployments&lt;/li&gt;
&lt;li&gt;Releases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes debugging and tracking significantly easier in large projects.&lt;/p&gt;

&lt;h1&gt;
  
  
  Managing Complex Tasks Becomes Easier
&lt;/h1&gt;

&lt;p&gt;Jira is not just for bugs.&lt;/p&gt;

&lt;p&gt;It handles complex project structures extremely well through its hierarchy system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Epic → Story → Task → Sub-task → Bug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps teams break large projects into smaller manageable pieces.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;h3&gt;
  
  
  Epic
&lt;/h3&gt;

&lt;p&gt;Launch New Payment System&lt;/p&gt;

&lt;h3&gt;
  
  
  Stories
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add UPI support&lt;/li&gt;
&lt;li&gt;Add card tokenization&lt;/li&gt;
&lt;li&gt;Improve checkout UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tasks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create API endpoints&lt;/li&gt;
&lt;li&gt;Design database schema&lt;/li&gt;
&lt;li&gt;Build frontend integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure keeps technical work aligned with business goals.&lt;/p&gt;

&lt;h1&gt;
  
  
  Agile Boards Make Collaboration Better
&lt;/h1&gt;

&lt;p&gt;Jira provides both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scrum boards&lt;/li&gt;
&lt;li&gt;Kanban boards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scrum boards are useful for sprint-based development with features like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sprint planning&lt;/li&gt;
&lt;li&gt;Story points&lt;/li&gt;
&lt;li&gt;Burndown charts&lt;/li&gt;
&lt;li&gt;Velocity tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kanban boards are excellent for continuous workflows and DevOps teams.&lt;/p&gt;

&lt;p&gt;The visual nature of Jira boards makes project tracking much easier for both technical and non-technical stakeholders.&lt;/p&gt;

&lt;h1&gt;
  
  
  Basic Search vs JQL
&lt;/h1&gt;

&lt;p&gt;One of Jira’s most underrated features is its search system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Search
&lt;/h2&gt;

&lt;p&gt;Basic Search uses filters and dropdowns.&lt;/p&gt;

&lt;p&gt;You can quickly search by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project&lt;/li&gt;
&lt;li&gt;Status&lt;/li&gt;
&lt;li&gt;Assignee&lt;/li&gt;
&lt;li&gt;Priority&lt;/li&gt;
&lt;li&gt;Issue type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s beginner-friendly and perfect for non-technical users.&lt;/p&gt;

&lt;h2&gt;
  
  
  JQL (Jira Query Language)
&lt;/h2&gt;

&lt;p&gt;JQL is where Jira becomes incredibly powerful.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"Ecommerce"&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;issuetype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bug&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;priority&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Critical&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Blocker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;Done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This instantly filters critical unresolved bugs from a specific project.&lt;/p&gt;

&lt;p&gt;JQL supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AND / OR conditions&lt;/li&gt;
&lt;li&gt;Date filters&lt;/li&gt;
&lt;li&gt;Dynamic user queries&lt;/li&gt;
&lt;li&gt;Custom fields&lt;/li&gt;
&lt;li&gt;Advanced reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For QA engineers and project managers, learning JQL can save a huge amount of time.&lt;/p&gt;

&lt;h1&gt;
  
  
  My Experience Using Jira
&lt;/h1&gt;

&lt;p&gt;When I first used Jira, I honestly thought it was just another ticketing tool.&lt;/p&gt;

&lt;p&gt;But after working on real projects, I realized how effective it is for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tracking defects properly&lt;/li&gt;
&lt;li&gt;Managing complex workflows&lt;/li&gt;
&lt;li&gt;Organizing agile sprints&lt;/li&gt;
&lt;li&gt;Improving team visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest upgrade for me was learning JQL. Basic Search helped initially, but JQL completely changed how efficiently I could track issues and generate reports.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Jira remains one of the best platforms for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defect monitoring&lt;/li&gt;
&lt;li&gt;Agile project management&lt;/li&gt;
&lt;li&gt;Sprint planning&lt;/li&gt;
&lt;li&gt;Workflow automation&lt;/li&gt;
&lt;li&gt;Complex task coordination&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its combination of flexibility, visibility, and scalability is what makes it so widely used across software teams.&lt;/p&gt;

&lt;p&gt;If you’re new to Jira, start with the basics — but definitely spend time learning JQL.&lt;/p&gt;

&lt;p&gt;That’s where the real power of Jira begins.&lt;/p&gt;

</description>
      <category>atlassian</category>
      <category>testing</category>
      <category>devops</category>
      <category>automation</category>
    </item>
    <item>
      <title>Google AI Studio Finally Feels Like a Real Developer Tool After I/O 2026</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Sun, 24 May 2026 12:34:19 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/google-ai-studio-finally-feels-like-a-real-developer-tool-after-io-2026-33n0</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/google-ai-studio-finally-feels-like-a-real-developer-tool-after-io-2026-33n0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-io-writing-2026-05-19"&gt;Google I/O Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Google I/O 2026 had the usual flood of AI announcements: faster models, smarter agents, multimodal demos, benchmark claims.&lt;/p&gt;

&lt;p&gt;But the most important shift wasn’t any single model upgrade.&lt;/p&gt;

&lt;p&gt;It was the realization that Google is finally trying to reduce workflow fragmentation for developers instead of just improving prompt quality.&lt;/p&gt;

&lt;p&gt;That distinction matters more than most keynote demos admit.&lt;/p&gt;

&lt;p&gt;For the past year, my workflow has looked something like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ideas in one tab&lt;/li&gt;
&lt;li&gt;prompts in another&lt;/li&gt;
&lt;li&gt;code in VS Code&lt;/li&gt;
&lt;li&gt;deployment somewhere else&lt;/li&gt;
&lt;li&gt;documentation scattered across notes and chats&lt;/li&gt;
&lt;li&gt;context constantly leaking between tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So after I/O, I decided to test something practical:&lt;/p&gt;

&lt;p&gt;Could Google AI Studio actually support the way developers work after the first prompt?&lt;/p&gt;

&lt;p&gt;Not as a showcase.&lt;br&gt;
Not as a five-minute prototype.&lt;br&gt;
As a real workflow surface.&lt;/p&gt;
&lt;h2&gt;
  
  
  I Stopped Testing Prompts and Started Testing Workflow
&lt;/h2&gt;

&lt;p&gt;To pressure-test the experience, I built a lightweight “release assistant” for my own projects.&lt;/p&gt;

&lt;p&gt;The goal was intentionally boring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;convert rough feature notes into structured release plans&lt;/li&gt;
&lt;li&gt;generate release notes&lt;/li&gt;
&lt;li&gt;identify deployment risks&lt;/li&gt;
&lt;li&gt;export markdown summaries&lt;/li&gt;
&lt;li&gt;create a small shareable preview&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting part wasn’t the app itself.&lt;/p&gt;

&lt;p&gt;It was whether AI Studio could reduce the constant context-switching that normally happens between planning, implementation, documentation, and deployment.&lt;/p&gt;

&lt;p&gt;My core prompt looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a senior release engineer.

Generate:
- implementation checklist
- release summary
- deployment risks
- rollback concerns
- unresolved questions

If information is unclear, explicitly mark ambiguity.
Do not invent missing details.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That final line ended up being the most important instruction in the entire workflow.&lt;/p&gt;

&lt;p&gt;Because the moment you move from “generate ideas” to “generate operational output,” hallucinations stop being funny and start becoming expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Upgrade Wasn’t Better Code Generation
&lt;/h2&gt;

&lt;p&gt;The biggest surprise during testing wasn’t the quality of generated code.&lt;/p&gt;

&lt;p&gt;It was the reduction in workflow friction.&lt;/p&gt;

&lt;p&gt;Google AI Studio finally feels less like a prompt playground and more like an operational layer between intent and execution.&lt;/p&gt;

&lt;p&gt;That’s a subtle but important shift.&lt;/p&gt;

&lt;p&gt;Most AI tools today are optimized for producing impressive first drafts. Very few are optimized for preserving context across multiple stages of development.&lt;/p&gt;

&lt;p&gt;This is where AI Studio started feeling different after I/O 2026.&lt;/p&gt;

&lt;p&gt;The combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemini workflows&lt;/li&gt;
&lt;li&gt;Cloud Run deployment paths&lt;/li&gt;
&lt;li&gt;Workspace connectivity&lt;/li&gt;
&lt;li&gt;structured prototyping&lt;/li&gt;
&lt;li&gt;multimodal interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;makes the experience feel much closer to a real developer environment instead of a disconnected experimentation surface.&lt;/p&gt;

&lt;p&gt;And honestly, that’s where I think the industry is heading.&lt;/p&gt;

&lt;p&gt;The future probably doesn’t belong to the AI tool that writes the most code.&lt;/p&gt;

&lt;p&gt;It belongs to the one that loses the least context.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Most Dangerous Output Was the Most Convincing One
&lt;/h2&gt;

&lt;p&gt;The first release plan the model generated looked excellent.&lt;/p&gt;

&lt;p&gt;Clean structure.&lt;br&gt;
Clear priorities.&lt;br&gt;
Confident recommendations.&lt;/p&gt;

&lt;p&gt;There was just one problem:&lt;br&gt;
it invented a rollback dependency that didn’t exist.&lt;/p&gt;

&lt;p&gt;That moment completely changed how I evaluated the workflow.&lt;/p&gt;

&lt;p&gt;Because the output didn’t look broken.&lt;br&gt;
It looked professional.&lt;/p&gt;

&lt;p&gt;And that’s the real risk with modern AI tooling.&lt;/p&gt;

&lt;p&gt;Bad outputs are easy to catch.&lt;br&gt;
Polished inaccuracies are not.&lt;/p&gt;

&lt;p&gt;Once I shifted the workflow toward structured JSON generation first and narrative summaries second, reliability improved significantly.&lt;/p&gt;

&lt;p&gt;Instead of asking for prose immediately, I forced the model into deterministic structure first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"release_title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mobile Search Improvements"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tasks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Add debounce handling"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Update pagination logic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Improve empty-state logging"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"risks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Ranking changes require QA verification"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one adjustment made the system noticeably more trustworthy.&lt;/p&gt;

&lt;p&gt;It reinforced something I’ve started noticing across AI-assisted development:&lt;/p&gt;

&lt;p&gt;Models are often better planners and parsers than autonomous engineers.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Still Breaks in Quiet, Expensive Ways
&lt;/h2&gt;

&lt;p&gt;Even after the improvements announced at I/O, the limitations are still very real.&lt;/p&gt;

&lt;p&gt;Hallucinations remain dangerous in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deployment planning&lt;/li&gt;
&lt;li&gt;infrastructure logic&lt;/li&gt;
&lt;li&gt;API assumptions&lt;/li&gt;
&lt;li&gt;dependency management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And debugging AI-generated code is still slower than people publicly admit.&lt;/p&gt;

&lt;p&gt;The first draft is usually decent.&lt;/p&gt;

&lt;p&gt;The second iteration — where edge cases, integration issues, state management, and production constraints appear — is where human judgment becomes essential again.&lt;/p&gt;

&lt;p&gt;Context management also remains fragile.&lt;/p&gt;

&lt;p&gt;If your instructions are ambiguous, the model fills gaps with confidence instead of clarification.&lt;/p&gt;

&lt;p&gt;That creates a new category of engineering problem:&lt;br&gt;
systems that fail convincingly.&lt;/p&gt;

&lt;p&gt;Which is why I think the conversation around AI development is starting to shift away from prompt engineering and toward workflow engineering.&lt;/p&gt;

&lt;p&gt;The hard problem is no longer generating code.&lt;/p&gt;

&lt;p&gt;The hard problem is maintaining context integrity across an entire development lifecycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Finally Seems Focused on the Middle Layer of Development
&lt;/h2&gt;

&lt;p&gt;That’s what made Google I/O 2026 interesting to me.&lt;/p&gt;

&lt;p&gt;Not the demos.&lt;br&gt;
Not the benchmark charts.&lt;br&gt;
Not the “AI changes everything” narrative.&lt;/p&gt;

&lt;p&gt;It was the fact that Google finally seems focused on the messy middle layer between idea and implementation — the part where developers spend most of their time.&lt;/p&gt;

&lt;p&gt;Planning.&lt;br&gt;
Refining.&lt;br&gt;
Structuring.&lt;br&gt;
Debugging.&lt;br&gt;
Rewriting.&lt;br&gt;
Deploying.&lt;br&gt;
Remembering what they were doing two hours ago.&lt;/p&gt;

&lt;p&gt;That’s where productivity is actually lost.&lt;/p&gt;

&lt;p&gt;And reducing that friction compounds fast, especially for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;solo developers&lt;/li&gt;
&lt;li&gt;indie hackers&lt;/li&gt;
&lt;li&gt;startups&lt;/li&gt;
&lt;li&gt;technical creators&lt;/li&gt;
&lt;li&gt;small engineering teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saving a few minutes on code generation is helpful.&lt;/p&gt;

&lt;p&gt;Reducing dozens of context switches every day changes how people build software entirely.&lt;/p&gt;

&lt;p&gt;After rebuilding part of my workflow around Google AI Studio, I came away with a surprisingly balanced conclusion:&lt;/p&gt;

&lt;p&gt;I still don’t trust AI agents to independently ship production systems.&lt;/p&gt;

&lt;p&gt;But I increasingly trust them to structure the path between intent and execution.&lt;/p&gt;

&lt;p&gt;And for the first time, Google AI Studio feels like it understands that distinction too.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleiochallenge</category>
      <category>googleio2026</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Building PromptForge AI: Smarter, Lighter, More Sustainable Marketing</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Sat, 02 May 2026 13:09:22 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/building-promptforge-ai-smarter-lighter-more-sustainable-marketing-3ldh</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/building-promptforge-ai-smarter-lighter-more-sustainable-marketing-3ldh</guid>
      <description>&lt;p&gt;Modern marketing often creates unnecessary digital waste—duplicate assets, oversized files, and excessive bandwidth usage. Every extra megabyte transferred consumes energy, and at scale, that environmental impact becomes significant.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;PromptForge AI&lt;/strong&gt; to tackle this challenge.&lt;/p&gt;

&lt;p&gt;PromptForge transforms a simple campaign idea into a complete marketing kit with AI-generated visuals, copy, and multi-platform assets. But instead of generating and storing dozens of separate files, it creates &lt;strong&gt;one master asset&lt;/strong&gt; and uses Cloudinary to dynamically transform, optimize, and deliver every required format.&lt;/p&gt;

&lt;p&gt;This dramatically reduces storage waste, lowers bandwidth consumption, improves performance, and minimizes digital carbon emissions. By reusing a single source asset across an entire campaign, PromptForge eliminates redundant file creation and unnecessary compute.&lt;/p&gt;

&lt;p&gt;To make sustainability measurable, PromptForge includes a &lt;strong&gt;Green Score&lt;/strong&gt;, a &lt;strong&gt;Green Impact Dashboard&lt;/strong&gt;, a &lt;strong&gt;Carbon Budget Tracker&lt;/strong&gt;, and an &lt;strong&gt;Asset Reuse Tracker&lt;/strong&gt;, helping users understand the real environmental impact of their digital content.&lt;/p&gt;

&lt;p&gt;PromptForge shows that great marketing can also be mindful marketing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Create once. Optimize everywhere. Deliver sustainably.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Screenshot
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2F8j1elpxs36s9l5r2tlwo.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.amazonaws.com%2Fuploads%2Farticles%2F8j1elpxs36s9l5r2tlwo.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fmpp3j81sx1bycbu2uzc2.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.amazonaws.com%2Fuploads%2Farticles%2Fmpp3j81sx1bycbu2uzc2.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fag2pszd0bpvvqfzfzd6v.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.amazonaws.com%2Fuploads%2Farticles%2Fag2pszd0bpvvqfzfzd6v.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fgk0op7py96ffbtv5y5yw.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.amazonaws.com%2Fuploads%2Farticles%2Fgk0op7py96ffbtv5y5yw.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fg3lmz5qpb4q5bx1uoin8.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.amazonaws.com%2Fuploads%2Farticles%2Fg3lmz5qpb4q5bx1uoin8.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fy82qcq6668vw8ih86em5.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.amazonaws.com%2Fuploads%2Farticles%2Fy82qcq6668vw8ih86em5.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fczya8k849vsqkhws5jw5.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.amazonaws.com%2Fuploads%2Farticles%2Fczya8k849vsqkhws5jw5.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Ffu3d90m8mhvbxddmzo9z.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.amazonaws.com%2Fuploads%2Farticles%2Ffu3d90m8mhvbxddmzo9z.png" alt=" " width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>marketing</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How MindsDB Is Becoming the Data Brain for AI Agents in 2026</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Tue, 28 Apr 2026 13:59:49 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/how-mindsdb-is-becoming-the-data-brain-for-ai-agents-in-2026-4p6p</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/how-mindsdb-is-becoming-the-data-brain-for-ai-agents-in-2026-4p6p</guid>
      <description>&lt;p&gt;AI agents are getting smarter. But intelligence alone is not enough.&lt;/p&gt;

&lt;p&gt;The real challenge in building production-ready AI systems is not choosing the best model—it is connecting that model to your data, tools, and workflows in a reliable way. That is exactly where MindsDB is making a huge impact.&lt;/p&gt;

&lt;p&gt;With its latest 2026 updates, MindsDB is evolving from an AI query layer into a full-fledged federated data and context engine for AI applications and autonomous agents.&lt;/p&gt;

&lt;p&gt;If you are building AI products, this shift matters a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Today's AI Stack
&lt;/h2&gt;

&lt;p&gt;Most AI applications still rely on a fragmented workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull data from multiple databases and SaaS tools&lt;/li&gt;
&lt;li&gt;Clean and transform that data&lt;/li&gt;
&lt;li&gt;Send it to an LLM&lt;/li&gt;
&lt;li&gt;Parse unstructured responses&lt;/li&gt;
&lt;li&gt;Push results back into business systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works but it is often slow, brittle, and difficult to scale.&lt;/p&gt;

&lt;p&gt;Every additional integration introduces more complexity. Every custom pipeline adds maintenance overhead. And every manual handoff creates opportunities for failure.&lt;/p&gt;

&lt;p&gt;This is where MindsDB changes the game.&lt;/p&gt;

&lt;h2&gt;
  
  
  MindsDB's New Direction: A Federated Context Layer for AI
&lt;/h2&gt;

&lt;p&gt;MindsDB is now positioning itself as the infrastructure layer that sits between your data and your AI systems.&lt;/p&gt;

&lt;p&gt;Instead of moving data to the model, MindsDB brings AI directly to the data.&lt;/p&gt;

&lt;p&gt;That means you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Query distributed data sources using SQL&lt;/li&gt;
&lt;li&gt;Connect AI agents directly to live business data&lt;/li&gt;
&lt;li&gt;Generate structured outputs&lt;/li&gt;
&lt;li&gt;Write results back into operational systems&lt;/li&gt;
&lt;li&gt;Maintain governance and observability throughout the workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture aligns closely with the growing importance of the Model Context Protocol (MCP), which aims to standardize how AI systems interact with external tools and data.&lt;/p&gt;

&lt;p&gt;MindsDB is essentially building the practical implementation of that vision.&lt;/p&gt;

&lt;p&gt;(&lt;a href="https://mindsdb.com/blog/introducing-mindsdb-v26.0.0-with-improved-agents-and-knowledge-bases?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;mindsdb.com&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  What's New in MindsDB in 2026?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. More Powerful AI Agents
&lt;/h3&gt;

&lt;p&gt;One of the biggest upgrades is the migration from LangChain to a Pydantic-based agent framework.&lt;/p&gt;

&lt;p&gt;Why does this matter?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster execution&lt;/li&gt;
&lt;li&gt;More predictable behavior&lt;/li&gt;
&lt;li&gt;Better reliability in production&lt;/li&gt;
&lt;li&gt;Cleaner abstractions for developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best part? Existing workflows remain compatible. You can continue using familiar commands like &lt;code&gt;CREATE AGENT&lt;/code&gt; without rewriting your applications.&lt;/p&gt;

&lt;p&gt;This is a significant step toward making AI agents more stable and enterprise ready.&lt;/p&gt;

&lt;p&gt;(&lt;a href="https://mindsdb.com/blog/introducing-mindsdb-v26.0.0-with-improved-agents-and-knowledge-bases?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;mindsdb.com&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Stronger Knowledge Bases
&lt;/h3&gt;

&lt;p&gt;Knowledge Bases in MindsDB have received major improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PGVector is now the preferred vector backend&lt;/li&gt;
&lt;li&gt;Faster ingestion through batched inserts&lt;/li&gt;
&lt;li&gt;Better scalability for large datasets&lt;/li&gt;
&lt;li&gt;Improved reliability for semantic search workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For teams working with retrieval-augmented generation (RAG), these upgrades translate directly into better performance and lower operational friction.&lt;/p&gt;

&lt;p&gt;(&lt;a href="https://mindsdb.com/blog/mindsdb-product-updates-february-2026?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;mindsdb.com&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Expanded Enterprise Integrations
&lt;/h3&gt;

&lt;p&gt;MindsDB now supports even more enterprise systems, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle&lt;/li&gt;
&lt;li&gt;Amazon Redshift&lt;/li&gt;
&lt;li&gt;Databricks&lt;/li&gt;
&lt;li&gt;TimescaleDB&lt;/li&gt;
&lt;li&gt;MariaDB&lt;/li&gt;
&lt;li&gt;HubSpot&lt;/li&gt;
&lt;li&gt;Shopify&lt;/li&gt;
&lt;li&gt;NetSuite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This expanded connector ecosystem allows organizations to unify structured and unstructured data across their entire stack.&lt;/p&gt;

&lt;p&gt;Instead of building custom connectors, developers can access everything through a single SQL interface.&lt;/p&gt;

&lt;p&gt;That is a massive productivity boost.&lt;/p&gt;

&lt;p&gt;(&lt;a href="https://mindsdb.com/blog/introducing-mindsdb-v26.0.0-with-improved-agents-and-knowledge-bases?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;mindsdb.com&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Developers
&lt;/h2&gt;

&lt;p&gt;AI development is shifting from model-centric design to data-centric design.&lt;/p&gt;

&lt;p&gt;The winning applications will not necessarily be those using the most advanced model. They will be the ones that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access the right data at the right time&lt;/li&gt;
&lt;li&gt;Maintain context across workflows&lt;/li&gt;
&lt;li&gt;Produce reliable, structured outputs&lt;/li&gt;
&lt;li&gt;Integrate seamlessly into existing systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MindsDB helps developers focus on building intelligent experiences instead of stitching together infrastructure.&lt;/p&gt;

&lt;p&gt;It acts as the missing middleware layer between enterprise data and modern AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Use Case
&lt;/h2&gt;

&lt;p&gt;Imagine building an AI sales assistant.&lt;/p&gt;

&lt;p&gt;Without MindsDB, you would need to manually connect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRM data from HubSpot&lt;/li&gt;
&lt;li&gt;Order data from Shopify&lt;/li&gt;
&lt;li&gt;Customer records from PostgreSQL&lt;/li&gt;
&lt;li&gt;LLM APIs for reasoning&lt;/li&gt;
&lt;li&gt;Custom pipelines for orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With MindsDB, the workflow becomes much simpler:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Query all customer data in one place&lt;/li&gt;
&lt;li&gt;Pass that context to an AI agent&lt;/li&gt;
&lt;li&gt;Generate recommendations or summaries&lt;/li&gt;
&lt;li&gt;Write results back to your CRM automatically&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is not just more efficient it is fundamentally more scalable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture: AI Infrastructure Is Maturing
&lt;/h2&gt;

&lt;p&gt;In 2025, the focus was on experimenting with AI.&lt;/p&gt;

&lt;p&gt;In 2026, the focus is on operationalizing it.&lt;/p&gt;

&lt;p&gt;Organizations now need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;li&gt;Governance&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Interoperability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MindsDB is positioning itself at the center of this transition.&lt;/p&gt;

&lt;p&gt;Its latest releases show a clear strategy: become the universal context and data layer for AI-native applications.&lt;/p&gt;

&lt;p&gt;And that is a very exciting place to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The future of AI is not just about smarter models.&lt;/p&gt;

&lt;p&gt;It is about smarter systems.&lt;/p&gt;

&lt;p&gt;Systems that can securely access distributed data, reason over it, and take action in real time.&lt;/p&gt;

&lt;p&gt;MindsDB is building exactly that foundation.&lt;/p&gt;

&lt;p&gt;If you are working on AI agents, RAG pipelines, conversational analytics, or enterprise AI applications, MindsDB deserves a place in your toolkit.&lt;/p&gt;

&lt;p&gt;Because in the era of autonomous AI, data access is no longer a backend concern it is the core of intelligence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are your thoughts on federated AI infrastructure?&lt;/strong&gt;&lt;br&gt;
Are tools like MindsDB the missing layer for scalable AI applications? Let’s discuss in the comments.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>database</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Netlify vs Vercel: Why I Prefer Netlify</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Mon, 27 Apr 2026 04:07:55 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/netlify-vs-vercel-why-i-prefer-netlify-4can</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/netlify-vs-vercel-why-i-prefer-netlify-4can</guid>
      <description>&lt;p&gt;When people build websites today, two names come up again and again: Netlify and Vercel. Both are excellent platforms. Both help developers deploy websites quickly. Both make hosting feel almost magical.&lt;/p&gt;

&lt;p&gt;But after using both, I personally prefer Netlify.&lt;/p&gt;

&lt;p&gt;This is not about saying Vercel is bad. It is a great platform. In fact, Vercel has done an amazing job, especially for modern frontend development. But Netlify offers a more complete and beginner-friendly experience, especially for developers who want flexibility, simplicity, and powerful built-in features.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vercel is like a super-fast sports car.&lt;/li&gt;
&lt;li&gt;Netlify is like a reliable SUV with lots of extra features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both will get you where you want to go. But one might fit your journey better.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Netlify and Vercel?
&lt;/h2&gt;

&lt;p&gt;Both Netlify and Vercel let you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Host websites&lt;/li&gt;
&lt;li&gt;Deploy directly from GitHub&lt;/li&gt;
&lt;li&gt;Get automatic updates when you push code&lt;/li&gt;
&lt;li&gt;Use custom domains&lt;/li&gt;
&lt;li&gt;Add serverless functions&lt;/li&gt;
&lt;li&gt;Scale easily&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In simple words, they help you put your website on the internet without needing to manage servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Vercel Shines
&lt;/h2&gt;

&lt;p&gt;Before comparing, it's only fair to mention Vercel's strengths.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excellent performance&lt;/li&gt;
&lt;li&gt;Best-in-class support for Next.js&lt;/li&gt;
&lt;li&gt;Smooth developer experience&lt;/li&gt;
&lt;li&gt;Fast global delivery&lt;/li&gt;
&lt;li&gt;Clean and polished interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are building heavily with Next.js, Vercel is often the natural choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Prefer Netlify
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. More Framework Freedom
&lt;/h3&gt;

&lt;p&gt;Vercel feels deeply connected to Next.js, which makes sense because Vercel created it.&lt;/p&gt;

&lt;p&gt;Netlify, on the other hand, feels more open. It works beautifully with almost any framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;li&gt;Angular&lt;/li&gt;
&lt;li&gt;Svelte&lt;/li&gt;
&lt;li&gt;Astro&lt;/li&gt;
&lt;li&gt;Eleventy&lt;/li&gt;
&lt;li&gt;Plain HTML, CSS, and JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not feel tied to one ecosystem. That freedom is refreshing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Better Built-In Features
&lt;/h3&gt;

&lt;p&gt;Netlify includes many powerful tools right out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forms handling&lt;/li&gt;
&lt;li&gt;Identity and authentication&lt;/li&gt;
&lt;li&gt;Split testing&lt;/li&gt;
&lt;li&gt;Edge functions&lt;/li&gt;
&lt;li&gt;Redirects and rewrites&lt;/li&gt;
&lt;li&gt;Analytics&lt;/li&gt;
&lt;li&gt;Visual editing tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Vercel, some of these features require third-party services or additional setup.&lt;/p&gt;

&lt;p&gt;Netlify gives you more in one place.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Easier for Beginners
&lt;/h3&gt;

&lt;p&gt;If you are just starting out, Netlify feels incredibly welcoming.&lt;/p&gt;

&lt;p&gt;Its dashboard is simple, clear, and easy to understand. Setting up forms, redirects, or deployments is straightforward. You don't need to dig through lots of documentation just to get started.&lt;/p&gt;

&lt;p&gt;It feels like a platform built to help you succeed from day one.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Stronger for Static Sites
&lt;/h3&gt;

&lt;p&gt;Netlify was built with static sites in mind, and it shows.&lt;/p&gt;

&lt;p&gt;If you are creating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blogs&lt;/li&gt;
&lt;li&gt;Portfolios&lt;/li&gt;
&lt;li&gt;Documentation sites&lt;/li&gt;
&lt;li&gt;Marketing websites&lt;/li&gt;
&lt;li&gt;Landing pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Netlify is often the perfect fit.&lt;/p&gt;

&lt;p&gt;It is fast, reliable, and packed with useful features for these kinds of projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Better All-in-One Experience
&lt;/h3&gt;

&lt;p&gt;With Netlify, you often need fewer external tools.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forms? Built in.&lt;/li&gt;
&lt;li&gt;User login? Built in.&lt;/li&gt;
&lt;li&gt;Deployment previews? Built in.&lt;/li&gt;
&lt;li&gt;Site management tools? Built in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This saves time, reduces complexity, and keeps everything in one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Netlify&lt;/th&gt;
&lt;th&gt;Vercel&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework flexibility&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Excellent, but Next.js-focused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in forms&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication tools&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static site features&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Very good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js optimization&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Best&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beginner-friendly&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Very good&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When to Choose Netlify
&lt;/h2&gt;

&lt;p&gt;Netlify is a great choice if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build across multiple frameworks&lt;/li&gt;
&lt;li&gt;Want built-in tools&lt;/li&gt;
&lt;li&gt;Prefer simplicity&lt;/li&gt;
&lt;li&gt;Create static or content-driven websites&lt;/li&gt;
&lt;li&gt;Want an all-in-one platform&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Choose Vercel
&lt;/h2&gt;

&lt;p&gt;Vercel is a great choice if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primarily use Next.js&lt;/li&gt;
&lt;li&gt;Need advanced Next.js features&lt;/li&gt;
&lt;li&gt;Want highly optimized React workflows&lt;/li&gt;
&lt;li&gt;Focus on dynamic web applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Netlify and Vercel are both outstanding platforms. There is no wrong choice.&lt;/p&gt;

&lt;p&gt;But for me, Netlify stands out because it feels more complete, flexible, and beginner-friendly. It offers powerful features without making things complicated.&lt;/p&gt;

&lt;p&gt;Vercel is fantastic, especially for Next.js developers. But Netlify feels like a platform designed for everyone.&lt;/p&gt;

&lt;p&gt;And sometimes, that matters more.&lt;/p&gt;

&lt;p&gt;If you want a hosting platform that is simple, powerful, and works well across many types of projects, Netlify is hard to beat.&lt;/p&gt;

&lt;p&gt;What has your experience been? Are you Team Netlify, Team Vercel, or somewhere in between?&lt;/p&gt;

</description>
      <category>vercel</category>
      <category>netlify</category>
      <category>productivity</category>
    </item>
    <item>
      <title>VirtuLab: A Browser-Based Lab Built to Close the Practical Learning Gap</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Sun, 01 Mar 2026 15:24:12 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/virtulab-a-browser-based-lab-built-to-close-the-practical-learning-gap-1a3h</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/virtulab-a-browser-based-lab-built-to-close-the-practical-learning-gap-1a3h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I built VirtuLab for students who struggle not because they lack ability, but because they lack access.&lt;/p&gt;

&lt;p&gt;In many colleges, especially underprivileged institutions and rural campuses, physics and electrical labs are limited by shared equipment, outdated apparatus, and tight time slots. Students often get one short session to complete an experiment. If a circuit is wired incorrectly or a setup fails, there is rarely time to restart.&lt;/p&gt;

&lt;p&gt;For underprivileged students, the gap is wider. There is no personal lab kit at home. No private coaching. No extra practice outside scheduled hours. Practical exams then become exercises in memorizing steps instead of understanding systems.&lt;/p&gt;

&lt;p&gt;VirtuLab was built to give them something most never truly get: repetition without restriction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;VirtuLab is a browser-based virtual physics and electrical laboratory that simulates experimentation as a dynamic system, not a fixed animation.&lt;/p&gt;

&lt;p&gt;It contains three major environments:&lt;/p&gt;

&lt;h3&gt;
  
  
  3D Motion and Optics Lab
&lt;/h3&gt;

&lt;p&gt;Students can experiment with pendulums, springs, lenses, and Newtonian motion. Parameters like mass, length, angle, and force can be adjusted in real time, with measurements updating instantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2D Circuit Builder
&lt;/h3&gt;

&lt;p&gt;A drag-and-drop circuit workspace where students connect batteries, resistors, LEDs, and other components using precise wire drawing. Circuits behave based on real topology, not visual shortcuts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Astronomy Lab
&lt;/h3&gt;

&lt;p&gt;A fully interactive celestial mechanics environment including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solar System simulation to explore planetary orbits and gravitational interactions&lt;/li&gt;
&lt;li&gt;N-body gravity simulation where users can observe multi-body gravitational dynamics&lt;/li&gt;
&lt;li&gt;Orbital mechanics experiments to study satellite trajectories and escape velocities&lt;/li&gt;
&lt;li&gt;Tidal force visualization to understand gravitational gradients and Roche limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Students can modify mass, distance, and velocity to observe how orbital paths evolve. This makes gravitational equations observable instead of abstract.&lt;/p&gt;

&lt;p&gt;Each environment includes real-time measurement feedback and built-in conceptual explanations to bridge simulation behavior with theory.&lt;/p&gt;

&lt;p&gt;Authentication is handled through Appwrite, allowing students to securely access and continue experiments.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes It Different
&lt;/h2&gt;

&lt;p&gt;VirtuLab treats simulations as computational systems, not animations.&lt;/p&gt;

&lt;p&gt;In the Circuit Builder, every wire connection is translated into a graph-based internal model. Current and voltage are calculated from actual network topology. If a student leaves a circuit incomplete, it fails realistically.&lt;/p&gt;

&lt;p&gt;In the Motion Lab, oscillation periods and forces are recalculated dynamically as parameters change. Nothing is pre-rendered.&lt;/p&gt;

&lt;p&gt;In the Astronomy Lab, gravitational interactions are computed continuously. When a student increases planetary mass or modifies initial velocity, orbital paths shift according to gravitational equations, not scripted motion.&lt;/p&gt;

&lt;p&gt;Students are not watching outcomes. They are shaping them.&lt;/p&gt;

&lt;p&gt;For students with limited lab exposure, this builds intuition instead of dependency on memorized procedures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live Demo:&lt;br&gt;
&lt;a href="https://virtulab.appwrite.network/" rel="noopener noreferrer"&gt;https://virtulab.appwrite.network/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Repository:&lt;br&gt;
&lt;a href="https://github.com/joyston602-rgb/Virtulab" rel="noopener noreferrer"&gt;https://github.com/joyston602-rgb/Virtulab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example scenario:&lt;/p&gt;

&lt;p&gt;A student logs in and opens the Circuit Builder.&lt;br&gt;
They place a battery, resistor, and LED.&lt;br&gt;
They connect terminals carefully.&lt;/p&gt;

&lt;p&gt;If the circuit is valid, the LED responds immediately based on calculated current.&lt;br&gt;
If they misconnect a wire, nothing happens.&lt;/p&gt;

&lt;p&gt;They adjust resistance. Brightness changes in real time.&lt;br&gt;
They disconnect a node. The system recalculates instantly.&lt;/p&gt;

&lt;p&gt;In the Astronomy Lab, they increase a planet’s mass and watch orbital paths tighten due to stronger gravitational pull. They increase initial velocity and observe escape trajectories form.&lt;/p&gt;

&lt;p&gt;Cause and effect becomes visible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Fd7d3c9prioj9efjgh0bh.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.amazonaws.com%2Fuploads%2Farticles%2Fd7d3c9prioj9efjgh0bh.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fa7zq029heg3ofr4v518y.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.amazonaws.com%2Fuploads%2Farticles%2Fa7zq029heg3ofr4v518y.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F6yvhv64ayjvq7wpi4woi.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.amazonaws.com%2Fuploads%2Farticles%2F6yvhv64ayjvq7wpi4woi.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Ffxq6m7bw81za4k0kc23l.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.amazonaws.com%2Fuploads%2Farticles%2Ffxq6m7bw81za4k0kc23l.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fjx6ije50gtz4grca3tmt.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.amazonaws.com%2Fuploads%2Farticles%2Fjx6ije50gtz4grca3tmt.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F9kpnjv2llw5ubz2s2qb3.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.amazonaws.com%2Fuploads%2Farticles%2F9kpnjv2llw5ubz2s2qb3.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Educational inequality is not only about access to books. It is about access to experimentation.&lt;/p&gt;

&lt;p&gt;Students from underprivileged backgrounds often work harder with fewer opportunities to practice. VirtuLab gives them a digital lab bench that does not close after one hour.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Designing a Reliable Contract Intelligence System with Gemini</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Sun, 01 Mar 2026 13:32:49 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/designing-a-reliable-contract-intelligence-system-with-gemini-1nh2</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/designing-a-reliable-contract-intelligence-system-with-gemini-1nh2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The turning point in this project was not infrastructure. It was deciding whether a language model should sit directly in a production decision path without guardrails.&lt;/p&gt;

&lt;p&gt;I built a document intelligence system for contract review. It ingests PDFs, extracts clause-level risk signals, and surfaces them for small businesses that cannot afford outside counsel for routine vendor agreements. The constraint was reliability. If a liability cap was hallucinated or an auto-renewal was missed, the output would not just be inaccurate. It would be harmful.&lt;/p&gt;

&lt;p&gt;The architecture has three layers.&lt;/p&gt;

&lt;p&gt;A PDF extraction pipeline segments contracts into clauses using heading detection and semantic boundary shifts instead of page splits.&lt;/p&gt;

&lt;p&gt;A Gemini layer classifies each clause against a fixed risk taxonomy and generates a plain-language summary with a risk tier.&lt;/p&gt;

&lt;p&gt;A React frontend groups clauses by risk tier rather than document order, aligning with how users actually review exposure.&lt;/p&gt;

&lt;p&gt;Each clause moves through classify, summarize, score, and validate stages. Prompts are minimal and schema-constrained. Using gemini-1.5-pro with structured JSON output, every response is validated against a Zod schema before entering application state. Failures are flagged for manual review. Nothing degrades silently.&lt;/p&gt;

&lt;p&gt;Gemini’s strength here is compression. Dense legal language becomes concise summaries that reflect practical implications. Iterating on the taxonomy exposed overlapping categories early, allowing me to reduce twelve risk types to six in days instead of weeks.&lt;/p&gt;

&lt;p&gt;The friction appeared in nested clauses. Parent clauses with modifying sub-clauses produced summaries that were technically correct but incomplete. A liability cap without its exception clause is misleading. The solution was architectural: recursively unnest clauses, inject parent references into context, and reconstruct structure in code. That reduced summarization drift significantly.&lt;/p&gt;

&lt;p&gt;Cost was another constraint. A forty-page contract could trigger over thirty model calls. An embedding similarity filter now pre-classifies low-risk template clauses, reducing calls by roughly thirty-five percent without hurting recall.&lt;/p&gt;

&lt;p&gt;The real shift was conceptual. I stopped treating Gemini as an assistant and started treating it as a probabilistic component with defined failure modes. Structured outputs, validation boundaries, explicit failure states, and clear separation between language understanding and business logic now define the system.&lt;/p&gt;

&lt;p&gt;Next, I am building multi-document comparison to detect deviations across similar vendor agreements. Before release, I am running recall evaluation against a manually annotated dataset. The system works, but without measurable precision and recall under edge cases, it does not belong in decision-critical workflows.&lt;/p&gt;

&lt;p&gt;This project changed how I integrate language models. They are not conversational layers on top of applications. They are bounded components inside systems designed for validation, uncertainty, and measurable reliability.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Supabase Has More Depth Than Most People Use</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Wed, 25 Feb 2026 14:45:19 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/supabase-has-more-depth-than-most-people-use-10pk</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/supabase-has-more-depth-than-most-people-use-10pk</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fsgjrgbgxh2vjnvbpjh4k.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.amazonaws.com%2Fuploads%2Farticles%2Fsgjrgbgxh2vjnvbpjh4k.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most developers use Supabase for the obvious things: tables, authentication and storage. It works well for that. But what often goes unnoticed is how much depth sits underneath.&lt;/p&gt;

&lt;p&gt;Because everything is built on Postgres, Supabase isn’t just a backend wrapper it’s a programmable database platform. Features like Row Level Security can move authorization logic directly into the database, reducing the need for repetitive backend checks. When designed properly, your data layer becomes responsible for enforcing access rules.&lt;/p&gt;

&lt;p&gt;Database functions exposed through RPC are another underused capability. Instead of building separate APIs for complex operations, you can run logic inside Postgres itself. This keeps operations atomic and simplifies architecture.&lt;/p&gt;

&lt;p&gt;Realtime subscriptions tied directly to database changes also feel more integrated than many expect. They allow reactive systems without managing separate infrastructure.&lt;/p&gt;

&lt;p&gt;The more you design around the database-first model, the more Supabase reveals its strength. Many teams only use a fraction of what’s available, even though the deeper capabilities are already built in.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>database</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Triax AI: A Free, Lightweight 3D CAD Platform Bringing Engineering Education to Underserved Students</title>
      <dc:creator>JOYSTON</dc:creator>
      <pubDate>Sat, 14 Feb 2026 06:05:30 +0000</pubDate>
      <link>https://dev.to/joyston_ccd43d53e268ec635/triax-ai-a-free-lightweight-3d-cad-platform-bringing-engineering-education-to-underserved-students-46np</link>
      <guid>https://dev.to/joyston_ccd43d53e268ec635/triax-ai-a-free-lightweight-3d-cad-platform-bringing-engineering-education-to-underserved-students-46np</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Triax AI&lt;/strong&gt; - A completely free, lightweight 3D design education platform that brings professional CAD learning to underprivileged students and aspiring engineers worldwide through AI-powered guidance.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Professional CAD software costs thousands of dollars annually. Engineering students from underprivileged backgrounds face impossible barriers: expensive licenses, high-end hardware requirements, and zero interactive guidance. Even existing 3D web applications are notoriously heavy - they lag, crash and are unusable on the basic computers that underprivileged students have access to. They're locked out of careers in design, manufacturing, and engineering before they even start.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution &amp;amp; Core Challenge
&lt;/h3&gt;

&lt;p&gt;Triax AI runs entirely in the browser - no downloads, no installations, no cost. But here's the real innovation: &lt;strong&gt;making a full-featured 3D CAD platform lightweight enough for basic hardware.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;3D websites are inherently heavy. Real-time rendering, complex geometries, and interactive controls typically require powerful GPUs and significant RAM. The main technical challenge was building a professional-grade 3D modeling environment that runs smoothly on the 4GB RAM laptops and integrated graphics that underprivileged students actually have access to.&lt;/p&gt;

&lt;p&gt;Through aggressive optimization - efficient geometry management, smart rendering strategies and minimal bundle sizes - Triax AI delivers real-time 3D modeling with AI-powered mentorship on hardware that can't even run traditional CAD software. It's what expensive CAD courses charge thousands for, but accessible to anyone with a basic computer and internet connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Barriers&lt;/strong&gt;: Completely free, browser-based, works on low-spec devices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Mentor&lt;/strong&gt;: Real-time chatbot that guides students through CAD concepts like a personal tutor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Challenges&lt;/strong&gt;: Progressive learning system that adapts to each student's pace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Feedback&lt;/strong&gt;: Automated assessment that validates designs and explains improvements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional Tools&lt;/strong&gt;: Move, rotate, scale, boolean etc.. operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dual Modes&lt;/strong&gt;: Structured tutorials for beginners, playground for creative exploration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Impact
&lt;/h3&gt;

&lt;p&gt;This isn't just another learning app - it's a pathway to economic mobility. Triax AI gives underprivileged students the same quality CAD education that privileged students pay thousands for. A student in a rural school with a basic laptop now has the same learning opportunity as someone with access to expensive software and private tutoring. &lt;/p&gt;

&lt;p&gt;By making 3D design education free, lightweight and AI-enhanced, Triax AI opens doors to engineering careers for students who would otherwise never get the chance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Deployed link : &lt;a href="https://triax-ai.netlify.app/" rel="noopener noreferrer"&gt;https://triax-ai.netlify.app/&lt;/a&gt;&lt;br&gt;
Demo Video link : &lt;a href="https://www.youtube.com/watch?v=bLIuMA0I_X8" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=bLIuMA0I_X8&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Fdvy2fk714az5hie0khtq.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.amazonaws.com%2Fuploads%2Farticles%2Fdvy2fk714az5hie0khtq.png" alt=" " width="800" height="366"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F2nh8ef6o6zz205l8jftw.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.amazonaws.com%2Fuploads%2Farticles%2F2nh8ef6o6zz205l8jftw.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F8ni9fsitpc2ydt1b7x4q.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.amazonaws.com%2Fuploads%2Farticles%2F8ni9fsitpc2ydt1b7x4q.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;The biggest challenge in building Triax AI wasn't adding features - it was making a 3D web application lightweight enough for underprivileged students with basic hardware. 3D websites are notoriously resource-heavy, and GitHub Copilot CLI was absolutely critical in solving this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Performance Optimization Challenge&lt;/strong&gt;&lt;br&gt;
3D rendering typically requires powerful GPUs and significant RAM. My target users have 4GB RAM laptops with integrated graphics. Every optimization mattered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gh copilot suggest "optimize three.js for low memory usage"&lt;/code&gt; generated geometry instancing patterns that reduced memory footprint by 60%&lt;/li&gt;
&lt;li&gt;Helped implement object pooling to prevent garbage collection spikes that cause stuttering&lt;/li&gt;
&lt;li&gt;Suggested efficient LOD (Level of Detail) systems - complex shapes simplify when zoomed out&lt;/li&gt;
&lt;li&gt;Generated code for lazy-loading geometries only when needed, keeping initial bundle under 200KB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without Copilot CLI, I would have spent weeks researching Three.js performance patterns. Instead, I got production-ready optimization code in minutes, letting me iterate rapidly on what actually worked on low-end hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Lightweight Rendering Strategies&lt;/strong&gt;&lt;br&gt;
Traditional 3D apps render everything every frame. On basic hardware, this kills performance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gh copilot suggest "selective rendering for three.js scene"&lt;/code&gt; gave me smart render-on-demand patterns&lt;/li&gt;
&lt;li&gt;Helped implement frustum culling to skip rendering objects outside the camera view&lt;/li&gt;
&lt;li&gt;Generated efficient raycasting for object selection without performance overhead&lt;/li&gt;
&lt;li&gt;Suggested WebGL state management to minimize GPU state changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copilot CLI understood the nuances of WebGL optimization - something that would have required deep expertise or days of trial-and-error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Bundle Size Optimization&lt;/strong&gt;&lt;br&gt;
Every kilobyte matters when students have slow internet. Copilot CLI helped me keep the app lightweight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suggested tree-shaking strategies for Three.js (it's a massive library)&lt;/li&gt;
&lt;li&gt;Generated dynamic import patterns for features like boolean operations (loaded only when used)&lt;/li&gt;
&lt;li&gt;Helped implement efficient state management without heavy frameworks&lt;/li&gt;
&lt;li&gt;Suggested compression strategies for 3D assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result: a full-featured 3D CAD platform that loads faster than most blog websites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Building the AI Chatbot for Unreliable Networks&lt;/strong&gt;&lt;br&gt;
Underprivileged students often have unstable internet. The AI mentor needed to work reliably:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gh copilot explain&lt;/code&gt; helped me understand streaming response patterns that handle network interruptions&lt;/li&gt;
&lt;li&gt;Generated robust retry logic with exponential backoff&lt;/li&gt;
&lt;li&gt;Suggested local caching strategies for common CAD questions&lt;/li&gt;
&lt;li&gt;Helped implement optimistic UI updates so the app feels responsive even with latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Challenge Assessment System&lt;/strong&gt;&lt;br&gt;
The automated grading needed to be computationally efficient:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copilot CLI generated spatial algorithms that run in O(n log n) instead of O(n²)&lt;/li&gt;
&lt;li&gt;Suggested efficient bounding box checks before expensive geometry comparisons&lt;/li&gt;
&lt;li&gt;Helped implement tolerance-based validation that's both accurate and fast&lt;/li&gt;
&lt;li&gt;Generated scoring logic that provides detailed feedback without performance cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Real Impact&lt;/strong&gt;&lt;br&gt;
GitHub Copilot CLI didn't just accelerate development - it made the entire project possible. As a solo developer, I couldn't have achieved this level of performance optimization without it. The CLI gave me access to expert-level knowledge in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebGL and Three.js optimization&lt;/li&gt;
&lt;li&gt;Memory management for JavaScript applications&lt;/li&gt;
&lt;li&gt;Efficient algorithms for 3D spatial queries&lt;/li&gt;
&lt;li&gt;Network resilience patterns for unreliable connections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every suggestion was production-ready, followed best practices, and actually worked on the low-end hardware I was targeting. I could ask "how do I make this faster for 4GB RAM?" and get concrete, implementable solutions.&lt;/p&gt;

&lt;p&gt;The natural language interface meant I could stay focused on the mission making CAD education accessible rather than getting lost in documentation. It felt like pair programming with a performance optimization expert who understood both the technical constraints and the social impact goal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most importantly:&lt;/strong&gt; Copilot CLI helped me ship a lightweight, professional grade 3D platform that underprivileged students can actually use. That's not just faster development that's the difference between an idea and real impact.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
