<?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: Voor AI</title>
    <description>The latest articles on DEV Community by Voor AI (@voorai).</description>
    <link>https://dev.to/voorai</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%2F3753035%2F25b654f3-79cc-4a51-aff8-56a4d15b2141.png</url>
      <title>DEV Community: Voor AI</title>
      <link>https://dev.to/voorai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/voorai"/>
    <language>en</language>
    <item>
      <title>How to Put an AI Media Workflow Under Version Control</title>
      <dc:creator>Voor AI</dc:creator>
      <pubDate>Wed, 22 Jul 2026 10:06:21 +0000</pubDate>
      <link>https://dev.to/voorai/how-to-put-an-ai-media-workflow-under-version-control-5bg1</link>
      <guid>https://dev.to/voorai/how-to-put-an-ai-media-workflow-under-version-control-5bg1</guid>
      <description>&lt;p&gt;Prompts are easy to save and hard to reproduce.&lt;/p&gt;

&lt;p&gt;A production AI-media run depends on more than a prompt: the selected model, input fields, connections between steps, output routing, and sometimes the layout a teammate uses to understand the graph. If those decisions live only in a browser tab, “the workflow that worked” disappears as soon as somebody rebuilds it from memory.&lt;/p&gt;

&lt;p&gt;A portable JSON graph gives the workflow a reviewable artifact. You can inspect it, import it, change it, export it, and put the semantic changes under Git.&lt;/p&gt;

&lt;p&gt;This tutorial uses Voor AI’s public Film Agent workflow as a concrete example. The file is small enough to understand without a special SDK: format version 1, three nodes, and two edges.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Download the workflow as data
&lt;/h2&gt;

&lt;p&gt;Create a clean folder and download the public example:&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; workflows
curl &lt;span class="nt"&gt;-fsS&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://voor.ai/workflow-examples/film-agent.workflow.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; workflows/film-agent.workflow.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before importing anything, inspect the envelope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="s1"&gt;'{
  formatVersion,
  title,
  description,
  graphKeys: (.graph | keys),
  nodeCount: (.graph.nodes | length),
  edgeCount: (.graph.edges | length)
}'&lt;/span&gt; workflows/film-agent.workflow.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the time of writing, the result is:&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;"formatVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"Film Agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Brief → text-to-video → output. Use the sidebar Agent to write prompts and run."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"graphKeys"&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="s2"&gt;"edges"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nodes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"viewport"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nodeCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"edgeCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&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 check is intentionally boring. It verifies that you downloaded a workflow object rather than an HTML error page or login response.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Read the graph without the visual editor
&lt;/h2&gt;

&lt;p&gt;List the nodes that affect execution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="s1"&gt;'.graph.nodes[] | {
  id,
  type,
  kind: .data.kind,
  modelId: (.data.modelId // null)
}'&lt;/span&gt; workflows/film-agent.workflow.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The graph contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;input-1  → input node
model-1  → model node using bytedance/seedance-1.5-pro
output-1 → output node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now inspect the edges:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="s1"&gt;'.graph.edges[] | {
  source,
  sourceHandle,
  target,
  targetHandle
}'&lt;/span&gt; workflows/film-agent.workflow.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first edge connects the input field &lt;code&gt;theme&lt;/code&gt; to the model’s text prompt. The second routes the model’s video output into the output node.&lt;/p&gt;

&lt;p&gt;The important idea is that an edge connects &lt;strong&gt;ports&lt;/strong&gt;, not just boxes. A line from &lt;code&gt;input-1&lt;/code&gt; to &lt;code&gt;model-1&lt;/code&gt; is ambiguous until the graph also records &lt;code&gt;field:theme → text:prompt&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Add a fast structural test
&lt;/h2&gt;

&lt;p&gt;Fail early if the file is malformed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'
  .formatVersion == 1 and
  (.graph.nodes | type == "array") and
  (.graph.edges | type == "array") and
  (.graph.nodes | length &amp;gt; 0)
'&lt;/span&gt; workflows/film-agent.workflow.json &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put that command in a pre-commit hook or CI check if workflow files are part of a shared project.&lt;/p&gt;

&lt;p&gt;Syntax validity is not full semantic validation. It will not prove that a model is currently available or that every port accepts the connected media type. It does catch corrupted files, missing arrays, and unsupported envelope versions before a teammate reaches the editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Import, change one thing, and export
&lt;/h2&gt;

&lt;p&gt;Open the &lt;a href="https://voor.ai/workflow/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=workflow_json_version_control&amp;amp;utm_content=builder_link" rel="noopener noreferrer"&gt;Voor AI Workflow Builder&lt;/a&gt;, sign in, and import &lt;code&gt;film-agent.workflow.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Fork or copy the example before editing it. Then make one deliberate change in the visual editor. Good first changes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;changing the runtime input field;&lt;/li&gt;
&lt;li&gt;tightening the model node’s prompt wrapper;&lt;/li&gt;
&lt;li&gt;switching to another compatible video model;&lt;/li&gt;
&lt;li&gt;adding a second output for review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run only after checking the displayed model and estimated credits. A JSON file proves what was configured when it was exported; it does not guarantee that a third-party model catalog, price, or availability has stayed unchanged.&lt;/p&gt;

&lt;p&gt;Export the updated graph as a new &lt;code&gt;.workflow.json&lt;/code&gt; file. Keep the original beside it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workflows/film-agent-v1.workflow.json
workflows/film-agent-v2.workflow.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Generate a semantic diff
&lt;/h2&gt;

&lt;p&gt;Raw diffs often contain noise: export timestamps, viewport changes, or node positions caused by rearranging the canvas. Those details are useful for reproducing the editor layout, but they can hide the execution change you actually want to review.&lt;/p&gt;

&lt;p&gt;Create a small semantic projection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="s1"&gt;'{
  formatVersion,
  title,
  description,
  nodes: [
    .graph.nodes[] |
    {
      id,
      type,
      kind: .data.kind,
      modelId: (.data.modelId // null),
      promptWrap: (.data.promptWrap // null),
      fields: (.data.fields // null)
    }
  ] | sort_by(.id),
  edges: [
    .graph.edges[] |
    {source, sourceHandle, target, targetHandle}
  ] | sort_by(.source, .target, .sourceHandle, .targetHandle)
}'&lt;/span&gt; workflows/film-agent-v2.workflow.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; workflows/film-agent-v2.semantic.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate the same projection for v1, then compare them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff &lt;span class="nt"&gt;--no-index&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  workflows/film-agent-v1.semantic.json &lt;span class="se"&gt;\&lt;/span&gt;
  workflows/film-agent-v2.semantic.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the full export as the source of truth. Use the semantic file as a review aid, not as a replacement. Layout and viewport data may still matter to teammates who use the graph visually.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Review workflow changes like code
&lt;/h2&gt;

&lt;p&gt;A useful pull-request description answers five questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What input contract changed?&lt;/li&gt;
&lt;li&gt;Which model or model setting changed?&lt;/li&gt;
&lt;li&gt;Which edges or ports changed?&lt;/li&gt;
&lt;li&gt;Which previously approved outputs must be regenerated?&lt;/li&gt;
&lt;li&gt;What evidence shows that the new graph still passes review?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Avoid commit messages like &lt;code&gt;update workflow&lt;/code&gt;. Prefer something causal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workflow: route theme input through the video prompt wrapper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workflow: add review output before final export
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Do not store secrets in a portable graph
&lt;/h2&gt;

&lt;p&gt;Treat exported workflow JSON as shareable project data.&lt;/p&gt;

&lt;p&gt;Do not place API keys, passwords, private customer assets, signed URLs, personal data, or confidential prompts inside input defaults before exporting. Git history is persistent, and deleting a secret from the latest file does not remove it from earlier commits.&lt;/p&gt;

&lt;p&gt;Keep secrets in your runtime’s credential system. Keep the graph focused on inputs, model configuration, connections, and reviewable metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  A workflow is more useful when it can leave the browser
&lt;/h2&gt;

&lt;p&gt;Version control does not make AI output deterministic. It makes change visible.&lt;/p&gt;

&lt;p&gt;With a portable graph you can answer: Which model was selected? Which input fed which port? What changed between the approved graph and today’s experiment? Can a teammate import the same structure without rebuilding it from a screenshot?&lt;/p&gt;

&lt;p&gt;Start with the &lt;a href="https://voor.ai/workflow-examples/film-agent.workflow.json" rel="noopener noreferrer"&gt;public Film Agent JSON&lt;/a&gt;, inspect it with &lt;code&gt;jq&lt;/code&gt;, and then open the &lt;a href="https://voor.ai/workflow/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=workflow_json_version_control&amp;amp;utm_content=final_cta" rel="noopener noreferrer"&gt;Voor AI Workflow Builder&lt;/a&gt; to import and modify the graph. The goal is not to make creative work look like software. It is to give creative work the same change history that makes software reviewable.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>git</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A Practical Checklist for Evaluating AI Video Generators</title>
      <dc:creator>Voor AI</dc:creator>
      <pubDate>Wed, 22 Jul 2026 07:00:09 +0000</pubDate>
      <link>https://dev.to/voorai/a-practical-checklist-for-evaluating-ai-video-generators-4im9</link>
      <guid>https://dev.to/voorai/a-practical-checklist-for-evaluating-ai-video-generators-4im9</guid>
      <description>&lt;p&gt;Choosing an AI video generator is less about a flashy demo and more about whether the workflow survives a real project. Before committing to a tool, I use a small checklist that covers continuity, inputs, audio, cost, exports, and operational risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Test continuity, not just a single frame
&lt;/h2&gt;

&lt;p&gt;A beautiful opening frame tells you very little. Try prompts that require a subject to move through a scene, a camera to maintain direction, or an object to remain consistent after a cut-free transition. Look for identity drift, sudden changes in lighting, broken geometry, and motion that feels physically impossible.&lt;/p&gt;

&lt;p&gt;A useful test set includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a product orbit with a fixed camera distance&lt;/li&gt;
&lt;li&gt;a person walking while the background remains stable&lt;/li&gt;
&lt;li&gt;a reference-image prompt with a specific color palette&lt;/li&gt;
&lt;li&gt;a scene with small text or a recognizable logo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Save the exact prompts and settings. Reproducibility matters more than one lucky result.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Separate text-to-video from reference workflows
&lt;/h2&gt;

&lt;p&gt;Many products describe themselves as “text-to-video,” but the practical workflow may also include image-to-video, video references, or multiple reference inputs. These modes solve different problems.&lt;/p&gt;

&lt;p&gt;Text-to-video is useful for exploration. Reference-driven generation is usually better when composition, subject appearance, or product placement matters. Evaluate each mode separately instead of treating them as interchangeable.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Check audio and export details early
&lt;/h2&gt;

&lt;p&gt;Audio can be a major differentiator, but it is also easy to overlook during a visual demo. Verify whether sound is generated, synchronized, downloadable, and editable. Then check the actual output format, resolution, frame rate, watermark policy, and maximum duration.&lt;/p&gt;

&lt;p&gt;If you are evaluating a Seedance 2.5 workflow, the &lt;a href="https://seedance2-5ai.im/" rel="noopener noreferrer"&gt;Seedance 2.5 AI site&lt;/a&gt; is a useful reference point for checking the current product positioning and available workflow details. Treat model availability and API claims as something to verify directly before production use.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Measure cost per usable iteration
&lt;/h2&gt;

&lt;p&gt;A credit price is not the same as the cost of a finished clip. Track how many attempts are normally required before you get a usable result. A simple spreadsheet can compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;credits per generation&lt;/li&gt;
&lt;li&gt;average retries per accepted clip&lt;/li&gt;
&lt;li&gt;resolution or duration multipliers&lt;/li&gt;
&lt;li&gt;image and video reference costs&lt;/li&gt;
&lt;li&gt;monthly minimums or expiration rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cheapest first generation may not be the cheapest production workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Define a small acceptance test
&lt;/h2&gt;

&lt;p&gt;Before adopting a tool, run five to ten prompts from your real workload. Score each output for subject consistency, motion quality, prompt adherence, audio, export usability, and turnaround time. Keep the raw outputs so you can compare tools fairly.&lt;/p&gt;

&lt;p&gt;The best AI video generator is rarely the one with the most impressive homepage demo. It is the one that produces predictable results for your specific inputs, at a cost and speed your team can sustain.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>From AI Concept Image to a Printable STL: A Practical 2D-to-3D Workflow</title>
      <dc:creator>Voor AI</dc:creator>
      <pubDate>Tue, 21 Jul 2026 18:59:08 +0000</pubDate>
      <link>https://dev.to/voorai/from-ai-concept-image-to-a-printable-stl-a-practical-2d-to-3d-workflow-589m</link>
      <guid>https://dev.to/voorai/from-ai-concept-image-to-a-printable-stl-a-practical-2d-to-3d-workflow-589m</guid>
      <description>&lt;p&gt;A polished concept image is often the beginning of a physical project, not the end. A product designer may start with a generated reference, a maker may have only a front-view sketch, and a teacher may want to turn a simple illustration into a classroom model. The difficult part is moving from a visually persuasive 2D image to a 3D shape that can actually be inspected, edited, and printed.&lt;/p&gt;

&lt;p&gt;This guide explains a practical workflow for treating an image as a starting point rather than pretending that a single bitmap already contains a complete 3D model.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start with a reference that has usable structure
&lt;/h2&gt;

&lt;p&gt;Before converting anything, make the reference easy to interpret. A clean silhouette, a distinct foreground object, and a simple background are more useful than extra texture.&lt;/p&gt;

&lt;p&gt;For AI-generated references, I usually check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the subject isolated from the background?&lt;/li&gt;
&lt;li&gt;Are the major contours visible from edge to edge?&lt;/li&gt;
&lt;li&gt;Does the object have a clear front, side, or top orientation?&lt;/li&gt;
&lt;li&gt;Are holes, handles, and thin parts large enough to survive simplification?&lt;/li&gt;
&lt;li&gt;Does the image avoid accidental shadows that look like geometry?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Image-generation workspaces such as &lt;a href="https://krea2.org" rel="noopener noreferrer"&gt;Krea 2 AI&lt;/a&gt; and &lt;a href="https://seedream5-pro.im" rel="noopener noreferrer"&gt;Seedream 5.0 Pro&lt;/a&gt; can help create controlled references, but the prompt should describe the geometry you need—not only the mood. “A simple front-facing desk organizer, thick walls, large openings, isolated on a plain background” is more useful for modeling than “a beautiful futuristic organizer.”&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Decide what the image is allowed to become
&lt;/h2&gt;

&lt;p&gt;An image-to-mesh conversion is an interpretation. It does not recover hidden surfaces with certainty. Decide whether the output is meant to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a relief or embossed plaque;&lt;/li&gt;
&lt;li&gt;a silhouette cutout;&lt;/li&gt;
&lt;li&gt;a rough full object for a concept review;&lt;/li&gt;
&lt;li&gt;a base mesh for cleanup in Blender or another 3D tool; or&lt;/li&gt;
&lt;li&gt;a quick printable prototype.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This decision controls how much cleanup is reasonable. A relief can work from one strong view. A watertight full object usually needs multiple views, manual edits, or a separate modeling step.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Convert the image into a mesh
&lt;/h2&gt;

&lt;p&gt;For a fast browser-based starting point, &lt;a href="https://imagetostl.online/" rel="noopener noreferrer"&gt;ImageToSTL.online&lt;/a&gt; converts an image into an STL-style 3D starting model. The useful mindset is to treat the result as a draft mesh.&lt;/p&gt;

&lt;p&gt;After conversion, inspect the file in a viewer or slicer and look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;non-manifold edges;&lt;/li&gt;
&lt;li&gt;paper-thin walls;&lt;/li&gt;
&lt;li&gt;inverted faces;&lt;/li&gt;
&lt;li&gt;disconnected islands;&lt;/li&gt;
&lt;li&gt;noisy backgrounds turned into bumps;&lt;/li&gt;
&lt;li&gt;a base that is too thin to print;&lt;/li&gt;
&lt;li&gt;dimensions that are technically valid but impractical.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the input has a gradient background, crop it or replace it with a flat color before conversion. Small changes to contrast can alter the height map dramatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Make the mesh printable
&lt;/h2&gt;

&lt;p&gt;A mesh can open correctly and still fail on a printer. Before slicing, set a real-world scale and check the minimum wall thickness for the material and nozzle you plan to use. Add a flat base when the object needs one, and avoid relying on a tiny contact patch.&lt;/p&gt;

&lt;p&gt;For a first test, choose a simple orientation and a moderate layer height. The goal is not maximum detail; it is learning which features survive the full pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;reference image;&lt;/li&gt;
&lt;li&gt;conversion;&lt;/li&gt;
&lt;li&gt;mesh cleanup;&lt;/li&gt;
&lt;li&gt;scaling;&lt;/li&gt;
&lt;li&gt;slicing; and&lt;/li&gt;
&lt;li&gt;physical output.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A small calibration print is often more informative than staring at the STL preview.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Keep the reference and the mesh connected
&lt;/h2&gt;

&lt;p&gt;Save the source image alongside the STL and record the important settings: crop, contrast, height/depth range, scale, and orientation. If you revise the reference later, you should be able to tell whether a change came from the image or from mesh cleanup.&lt;/p&gt;

&lt;p&gt;This is especially useful for teams. A designer can own the visual reference, while a maker can adjust thickness and supports without losing the original intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common failure modes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The background becomes geometry.&lt;/strong&gt; Use a clean background and crop tightly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The object looks correct from one angle but collapses from another.&lt;/strong&gt; A single image cannot reliably describe hidden surfaces. Use a relief or plan a manual modeling pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fine details disappear.&lt;/strong&gt; Increase the feature size in the reference or simplify the design before conversion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The STL is too large or too small.&lt;/strong&gt; Set scale in the modeling or slicing tool; do not infer physical size from pixel dimensions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The print has a weak base.&lt;/strong&gt; Add thickness and a stable footprint before slicing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final checklist
&lt;/h2&gt;

&lt;p&gt;Before sending a 2D-to-3D experiment to a printer, confirm that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the silhouette is intentional;&lt;/li&gt;
&lt;li&gt;the background is not part of the mesh;&lt;/li&gt;
&lt;li&gt;the base is stable;&lt;/li&gt;
&lt;li&gt;thin features have a realistic thickness;&lt;/li&gt;
&lt;li&gt;the model has been inspected from multiple angles; and&lt;/li&gt;
&lt;li&gt;the test size matches the purpose of the prototype.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most reliable workflow is not “image in, perfect object out.” It is a short feedback loop: create a readable reference, convert it into a draft, inspect the mesh, make the minimum cleanup needed, and test a small physical version. That loop turns a visually interesting image into something you can actually evaluate in your hands.&lt;/p&gt;

</description>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Evaluate AI Image Models When Typography and Layout Matter</title>
      <dc:creator>Voor AI</dc:creator>
      <pubDate>Tue, 21 Jul 2026 18:39:25 +0000</pubDate>
      <link>https://dev.to/voorai/how-to-evaluate-ai-image-models-when-typography-and-layout-matter-57j1</link>
      <guid>https://dev.to/voorai/how-to-evaluate-ai-image-models-when-typography-and-layout-matter-57j1</guid>
      <description>&lt;p&gt;AI image benchmarks often focus on how attractive a single image looks. That is useful, but it is not enough for product design, advertising, packaging, or interface mockups. In those workflows, the model must also preserve structure, readable text, and the intent of the brief.&lt;/p&gt;

&lt;p&gt;Here is a practical evaluation checklist that can be run without a large benchmark suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Test the same brief three times
&lt;/h2&gt;

&lt;p&gt;Use one controlled prompt instead of collecting random examples. Include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a clearly defined subject&lt;/li&gt;
&lt;li&gt;a requested aspect ratio&lt;/li&gt;
&lt;li&gt;two or three lines of text&lt;/li&gt;
&lt;li&gt;a layout constraint&lt;/li&gt;
&lt;li&gt;a visual style&lt;/li&gt;
&lt;li&gt;a negative requirement, such as “no extra logos”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run the same brief with the same reference image where possible. This makes the comparison about model behavior rather than prompt drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Score structure separately from style
&lt;/h2&gt;

&lt;p&gt;A beautiful image can still fail production if the layout is wrong. Score each result from 0 to 2 on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Subject fidelity&lt;/strong&gt; — did it create the requested object?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composition&lt;/strong&gt; — are the main elements placed where the brief asked?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography&lt;/strong&gt; — is the text legible and spelled correctly?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt; — do repeated elements keep their identity?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editability&lt;/strong&gt; — can a small change be made without destroying the rest?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keeping these scores separate makes it easier to choose a model for the job instead of choosing the most impressive thumbnail.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Typography is a first-class test
&lt;/h2&gt;

&lt;p&gt;Generate a poster, product label, or app hero with a short phrase. Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exact spelling&lt;/li&gt;
&lt;li&gt;letter spacing&lt;/li&gt;
&lt;li&gt;line breaks&lt;/li&gt;
&lt;li&gt;hierarchy between title and supporting text&lt;/li&gt;
&lt;li&gt;whether the text is still readable at mobile size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the output will be used commercially, export the best visual and replace critical text in a design tool when necessary. “Looks close” is not the same as production-ready typography.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Reference images need a defined role
&lt;/h2&gt;

&lt;p&gt;A reference can control different things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;composition&lt;/li&gt;
&lt;li&gt;palette and lighting&lt;/li&gt;
&lt;li&gt;product identity&lt;/li&gt;
&lt;li&gt;pose or camera angle&lt;/li&gt;
&lt;li&gt;material and texture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write down the role before adding the reference. If one image is expected to control all five, the result may become visually confused. In an iterative image workspace such as &lt;a href="https://krea2.org" rel="noopener noreferrer"&gt;Krea 2 AI&lt;/a&gt;, it is useful to keep the reference, prompt, and accepted variation together so the reason for each change is visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Test dense layouts deliberately
&lt;/h2&gt;

&lt;p&gt;A model that performs well on portraits may struggle with a crowded ecommerce banner or multilingual packaging mockup. Use a second test with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;three visual objects&lt;/li&gt;
&lt;li&gt;a defined foreground and background&lt;/li&gt;
&lt;li&gt;one product label&lt;/li&gt;
&lt;li&gt;one small callout&lt;/li&gt;
&lt;li&gt;a clear empty area for a button or price&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://seedream5-pro.im" rel="noopener noreferrer"&gt;Seedream 5.0 Pro&lt;/a&gt; is one example worth evaluating for this kind of image-to-image and text-to-image workflow, especially when layout and multilingual text rendering matter. The important point is to verify the actual output on your own brief rather than relying only on a model name or a marketing claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Compare iteration cost, not only quality
&lt;/h2&gt;

&lt;p&gt;A model is more useful when the second and third attempts move in the right direction. Track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;number of generations before an acceptable result&lt;/li&gt;
&lt;li&gt;whether edits preserve the successful parts&lt;/li&gt;
&lt;li&gt;time spent rewriting prompts&lt;/li&gt;
&lt;li&gt;whether the output needs manual cleanup&lt;/li&gt;
&lt;li&gt;total credits or subscription cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A slightly less dramatic model can be the better production choice if it reaches an acceptable result in fewer iterations.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Build a small acceptance report
&lt;/h2&gt;

&lt;p&gt;For every model you test, save:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the exact prompt&lt;/li&gt;
&lt;li&gt;reference images and their intended roles&lt;/li&gt;
&lt;li&gt;three candidate outputs&lt;/li&gt;
&lt;li&gt;the score for each criterion&lt;/li&gt;
&lt;li&gt;known failure modes&lt;/li&gt;
&lt;li&gt;licensing and commercial-use notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a reusable internal benchmark. It also keeps model selection grounded in the work your team actually does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I work with or help maintain the tools linked in this article. They are included as concrete examples for comparison, not as a universal ranking. Model capabilities, pricing, and usage terms change frequently, so verify current details before using an output in client or commercial work.&lt;/p&gt;

&lt;p&gt;The best image model is not the one with the most viral samples. It is the one that reliably satisfies your brief, survives iteration, and reaches a shippable result with predictable cleanup.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>A Practical AI Video Workflow for Short Product Demos</title>
      <dc:creator>Voor AI</dc:creator>
      <pubDate>Tue, 21 Jul 2026 18:36:54 +0000</pubDate>
      <link>https://dev.to/voorai/a-practical-ai-video-workflow-for-short-product-demos-371a</link>
      <guid>https://dev.to/voorai/a-practical-ai-video-workflow-for-short-product-demos-371a</guid>
      <description>&lt;p&gt;Short AI videos are easy to generate and surprisingly hard to ship. The difficult part is usually not the model. It is deciding what the video must communicate, keeping visual continuity between shots, and producing an export that is actually usable on the first review.&lt;/p&gt;

&lt;p&gt;This guide describes a repeatable workflow for a 15–30 second product demo, social clip, or launch teaser.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start with the deliverable, not the prompt
&lt;/h2&gt;

&lt;p&gt;Write down five constraints before opening a generator:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;target channel and aspect ratio&lt;/li&gt;
&lt;li&gt;final duration&lt;/li&gt;
&lt;li&gt;one message the viewer should remember&lt;/li&gt;
&lt;li&gt;whether the output needs voice, music, captions, or just motion&lt;/li&gt;
&lt;li&gt;what must remain visually consistent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example: “A 20-second vertical clip showing a designer turning a rough sketch into a polished product visual; no spoken dialogue; three shots; readable captions; end on the product URL.”&lt;/p&gt;

&lt;p&gt;This prevents the common failure mode where every generation looks interesting but none of them tells a coherent story.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Build a small shot list
&lt;/h2&gt;

&lt;p&gt;A useful short-form structure is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt; — show the starting problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transformation&lt;/strong&gt; — show the action or workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result&lt;/strong&gt; — show the finished outcome and one clear next step.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep each shot responsible for one idea. If a prompt asks for camera movement, a character action, a UI transformation, a product reveal, and a text animation at the same time, the model has too many competing instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Treat prompts like production specs
&lt;/h2&gt;

&lt;p&gt;A production prompt is more reliable when it separates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;subject and action&lt;/li&gt;
&lt;li&gt;camera and framing&lt;/li&gt;
&lt;li&gt;lighting and visual style&lt;/li&gt;
&lt;li&gt;timing or motion&lt;/li&gt;
&lt;li&gt;things to avoid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A practical template is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Subject + action. Framing and camera movement. Lighting and palette. Duration and pacing. Preserve [specific details]. Avoid [artifacts].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reference images help, but they should have a clear job. One image can establish composition, another can establish a visual direction, and a third can establish a product detail. Mixing too many references often creates an attractive but inconsistent result.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Use a workspace that supports iteration
&lt;/h2&gt;

&lt;p&gt;The biggest productivity gain comes from comparing generations in one place instead of losing prompts across tabs. For example, &lt;a href="https://voor.ai" rel="noopener noreferrer"&gt;Voor AI&lt;/a&gt; is useful when a project needs a browser-based workspace across image, video, audio, and workflow steps. For a video-focused pass, &lt;a href="https://seedance2-5ai.im" rel="noopener noreferrer"&gt;Seedance 2.5 AI&lt;/a&gt; can be used for text-to-video, image-to-video, and reference-driven experiments.&lt;/p&gt;

&lt;p&gt;The goal is not to generate dozens of random clips. Generate a small set of deliberate variations: change one variable at a time, keep the best prompt, and record why a version passed or failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Keep image development and video development connected
&lt;/h2&gt;

&lt;p&gt;Many product demos begin as still frames. A practical workflow is to establish the visual language in an image workspace, then animate selected frames. &lt;a href="https://krea2.org" rel="noopener noreferrer"&gt;Krea 2 AI&lt;/a&gt; is a useful example of an image iteration workspace for exploring styles and refining compositions. If the final frame needs dense layouts or multilingual text, &lt;a href="https://seedream5-pro.im" rel="noopener noreferrer"&gt;Seedream 5.0 Pro&lt;/a&gt; is another option to evaluate.&lt;/p&gt;

&lt;p&gt;When moving from stills to motion, check the details that models commonly alter: logos, typography, hands, product geometry, and UI labels. A short “detail integrity” pass before editing saves more time than another round of broad prompting.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Review the export like a video editor
&lt;/h2&gt;

&lt;p&gt;Before publishing, check the actual rendered file—not just the preview:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the first frame explain why the viewer should keep watching?&lt;/li&gt;
&lt;li&gt;Are captions inside the safe area on mobile?&lt;/li&gt;
&lt;li&gt;Does motion remain coherent at normal playback speed?&lt;/li&gt;
&lt;li&gt;Are faces, hands, logos, and text stable?&lt;/li&gt;
&lt;li&gt;Is the audio licensed for the intended use?&lt;/li&gt;
&lt;li&gt;Does the final frame contain one readable call to action?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a shot fails, replace that shot rather than regenerating the entire sequence. Local fixes keep the visual identity and reduce cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Measure usefulness, not novelty
&lt;/h2&gt;

&lt;p&gt;A successful AI video is not the one with the most dramatic effect. It is the one that communicates a product, idea, or story with less production friction. Track a small set of signals: completion rate, click-through rate, qualified replies, and the number of revisions required before approval.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I work with or help maintain the tools linked in this article. They are included as concrete workflow examples, not as a claim that one provider is best for every project. Always verify current model capabilities, pricing, and commercial-use terms before shipping client work.&lt;/p&gt;

&lt;p&gt;The durable skill is the workflow: define the message, constrain the shot list, iterate deliberately, and inspect the rendered result. Models will change quickly; that process remains useful.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>video</category>
    </item>
    <item>
      <title>voor.ai — saving this URL here</title>
      <dc:creator>Voor AI</dc:creator>
      <pubDate>Wed, 22 Apr 2026 12:45:58 +0000</pubDate>
      <link>https://dev.to/voorai/voorai-saving-this-url-here-4p5p</link>
      <guid>https://dev.to/voorai/voorai-saving-this-url-here-4p5p</guid>
      <description>&lt;p&gt;Public note so I can find it again: &lt;strong&gt;&lt;a href="https://voor.ai" rel="noopener noreferrer"&gt;https://voor.ai&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
    </item>
    <item>
      <title>Bookmark: voor.ai (quick reference)</title>
      <dc:creator>Voor AI</dc:creator>
      <pubDate>Wed, 22 Apr 2026 12:45:05 +0000</pubDate>
      <link>https://dev.to/voorai/bookmark-voorai-quick-reference-bn6</link>
      <guid>https://dev.to/voorai/bookmark-voorai-quick-reference-bn6</guid>
      <description>&lt;p&gt;Keeping a tiny public bookmark here: &lt;a href="https://voor.ai" rel="noopener noreferrer"&gt;voor.ai&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No review, just a stable link I can point teammates to.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://voor.ai" rel="noopener noreferrer"&gt;https://voor.ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>Voor: one link I keep in my stack (voor.ai)</title>
      <dc:creator>Voor AI</dc:creator>
      <pubDate>Wed, 22 Apr 2026 12:43:38 +0000</pubDate>
      <link>https://dev.to/voorai/voor-one-link-i-keep-in-my-stack-voorai-b7d</link>
      <guid>https://dev.to/voorai/voor-one-link-i-keep-in-my-stack-voorai-b7d</guid>
      <description>&lt;p&gt;Short take: I keep a single go-to for coordination around AI work. &lt;a href="https://voor.ai" rel="noopener noreferrer"&gt;Voor&lt;/a&gt; is the one I have been trying lately — nothing fancy in this post, just a pointer for folks who are still shopping.&lt;/p&gt;

&lt;p&gt;Direct link: &lt;a href="https://voor.ai" rel="noopener noreferrer"&gt;https://voor.ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Own experience; YMMV.)&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Quick note: trying Voor (voor.ai) for AI workflows</title>
      <dc:creator>Voor AI</dc:creator>
      <pubDate>Wed, 22 Apr 2026 12:38:42 +0000</pubDate>
      <link>https://dev.to/voorai/quick-note-trying-voor-voorai-for-ai-workflows-37io</link>
      <guid>https://dev.to/voorai/quick-note-trying-voor-voorai-for-ai-workflows-37io</guid>
      <description>&lt;p&gt;I have been looking for a simpler way to keep AI-related work organized. I recently started exploring &lt;strong&gt;&lt;a href="https://voor.ai" rel="noopener noreferrer"&gt;Voor&lt;/a&gt;&lt;/strong&gt; and wanted to share a short note in case other builders find it useful.&lt;/p&gt;

&lt;p&gt;The landing page is here: &lt;a href="https://voor.ai" rel="noopener noreferrer"&gt;https://voor.ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you try it, I would be curious to hear what worked for you in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
  </channel>
</rss>
