<?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: Formacara</title>
    <description>The latest articles on DEV Community by Formacara (@formacara).</description>
    <link>https://dev.to/formacara</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%2F4159367%2Fd29130e8-6320-4deb-a531-8b2c776d460c.png</url>
      <title>DEV Community: Formacara</title>
      <link>https://dev.to/formacara</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/formacara"/>
    <language>en</language>
    <item>
      <title>A small JSON handoff for a custom figurine from a photo</title>
      <dc:creator>Formacara</dc:creator>
      <pubDate>Sat, 03 Oct 2026 09:05:35 +0000</pubDate>
      <link>https://dev.to/formacara/a-small-json-handoff-for-a-custom-figurine-from-a-photo-p1m</link>
      <guid>https://dev.to/formacara/a-small-json-handoff-for-a-custom-figurine-from-a-photo-p1m</guid>
      <description>&lt;p&gt;A rendered preview and a printable model answer different questions. The preview communicates appearance; the production file must also match an agreed size, material and version. If those facts live only in a chat, it is easy to lose track of which revision a customer actually approved.&lt;/p&gt;

&lt;p&gt;Here is a lightweight data model for keeping that handoff explicit. This is an illustrative design proposal, not a claim about Formacara's deployed software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Store the agreement, not just the latest filename
&lt;/h2&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;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example-figurine-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"modelVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v03"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"references"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"assetId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ref-front"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"purpose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"likeness"&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;span class="nl"&gt;"assetId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ref-side"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"purpose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pose"&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;span class="nl"&gt;"specification"&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;"heightMm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"material"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PLA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"colourMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"single-colour"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"standing, arms close to body"&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;"visualApproval"&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"approvedModelVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&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;"productionReview"&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reviewedModelVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&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 150 mm height is an example value, not a product specification. Replace it with the agreed dimension. Asset identifiers point to references without embedding photographs or public download links in the record.&lt;/p&gt;

&lt;p&gt;The useful detail is the version beside each approval. A boolean such as &lt;code&gt;approved: true&lt;/code&gt; does not explain what was approved. If the pose changes after review, the old approval should remain associated with the old version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make version changes visible
&lt;/h2&gt;

&lt;p&gt;One possible release condition is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;visualApproval.status == "approved"
AND visualApproval.approvedModelVersion == modelVersion
AND productionReview.status == "passed"
AND productionReview.reviewedModelVersion == modelVersion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a workflow condition, not a geometric test. A matching version does not prove that thin features are strong enough or that supports can be removed cleanly. Those checks still belong to the person preparing production.&lt;/p&gt;

&lt;p&gt;When a model changes, avoid silently carrying approvals forward. Show the previous decision in the history, mark the new revision as awaiting review and identify what changed. Even a short note such as “right arm moved closer to torso” gives the next reviewer a useful starting point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Distinguish missing information from permission to improvise
&lt;/h2&gt;

&lt;p&gt;A photograph may not show the back of the subject. That is missing evidence, not automatic approval for any reconstruction. Add an explicit note for interpreted details, or request another reference before proceeding.&lt;/p&gt;

&lt;p&gt;The interface can present the same information in plain language: “This preview uses model v03, at the agreed height, in single-colour PLA.” The customer does not need to see JSON. They need to understand which appearance, pose and material their decision covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the record small
&lt;/h2&gt;

&lt;p&gt;Do not put payment data, unnecessary personal information or photographs into a handoff that only needs asset references and design decisions. Decide who needs access to the source images and keep that separate from a broadly shared production checklist.&lt;/p&gt;

&lt;p&gt;For context on the customer request behind this example, see &lt;a href="https://formacara.com/en/custom-figurine-from-photo/" rel="noopener noreferrer"&gt;Formacara's custom figurine from photo overview&lt;/a&gt;. A clear brief connects that request to production without implying that a digital preview is identical to a physical print.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published by Formacara with AI assistance. The schema and identifiers above are illustrative. They contain no customer data and describe a proposed workflow, not a tested production system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>product</category>
      <category>software</category>
    </item>
  </channel>
</rss>
