<?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: Whispart</title>
    <description>The latest articles on DEV Community by Whispart (whispart).</description>
    <link>https://dev.to/whispart</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%2Forganization%2Fprofile_image%2F14675%2F0a3374ae-3f65-418c-89c8-2f33ba0a92f6.png</url>
      <title>DEV Community: Whispart</title>
      <link>https://dev.to/whispart</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/whispart"/>
    <language>en</language>
    <item>
      <title>An honest wall-art preview needs two sizes</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Wed, 09 Sep 2026 04:50:15 +0000</pubDate>
      <link>https://dev.to/whispart/an-honest-wall-art-preview-needs-two-sizes-240h</link>
      <guid>https://dev.to/whispart/an-honest-wall-art-preview-needs-two-sizes-240h</guid>
      <description>&lt;p&gt;A wall-art preview can show the right image at the wrong scale. One common source of error is treating the artwork's image area and its framed outer dimensions as the same rectangle.&lt;/p&gt;

&lt;p&gt;This matters to studios such as Whispart, where a selected GAN image is developed into a framed physical work. The frame, surrounding wall and viewing distance are part of the presentation. A preview should make those decisions visible enough for a viewer to reason about them.&lt;/p&gt;

&lt;p&gt;Here is a small geometry model for a front-facing, schematic preview. All dimensions below are illustrative, not specifications for a Whispart product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Store the outer dimensions explicitly
&lt;/h2&gt;

&lt;p&gt;Suppose the visible image is 50 × 50 cm. A hypothetical frame adds 2 cm on each side, with no mat or gap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;outer width  = 50 + 2 + 2 = 54 cm
outer height = 50 + 2 + 2 = 54 cm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the same design includes a mat, a float gap or a different overlap, that formula changes. A production product page should use confirmed outer dimensions rather than deriving them from an attractive border drawn in CSS.&lt;/p&gt;

&lt;p&gt;For a 240 cm-wide wall represented by a 720 px canvas, the scale is 3 px per cm. The image area is 150 px wide; the complete framed object is 162 px wide. Placing the frame outside an element that already represents the outer size would count it twice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Element&lt;/th&gt;
&lt;th&gt;Real dimension in this example&lt;/th&gt;
&lt;th&gt;Preview dimension&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wall width&lt;/td&gt;
&lt;td&gt;240 cm&lt;/td&gt;
&lt;td&gt;720 px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image width&lt;/td&gt;
&lt;td&gt;50 cm&lt;/td&gt;
&lt;td&gt;150 px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frame face, each side&lt;/td&gt;
&lt;td&gt;2 cm&lt;/td&gt;
&lt;td&gt;6 px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complete framed width&lt;/td&gt;
&lt;td&gt;54 cm&lt;/td&gt;
&lt;td&gt;162 px&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Preserve the artwork's aspect ratio
&lt;/h2&gt;

&lt;p&gt;For a schematic component, keep the image and the surrounding frame separate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;figure&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"work"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"artwork.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Complete artwork preview"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/figure&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Example only: 3 screen pixels represent 1 cm. */&lt;/span&gt;
&lt;span class="nc"&gt;.work&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;162px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#6f5947&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.work&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the square source image in this example, the content is 150 × 150 px and the outer object is 162 × 162 px. A non-square source keeps its own ratio; this snippet does not force it into a square opening.&lt;/p&gt;

&lt;p&gt;The colored border is a schematic frame, not a photograph or material simulation. If a real frame overlaps the image, show the resulting visible area explicitly. Do not let &lt;code&gt;object-fit: cover&lt;/code&gt; silently decide which part of the artwork disappears.&lt;/p&gt;

&lt;h2&gt;
  
  
  Say how the scale was established
&lt;/h2&gt;

&lt;p&gt;A measured wall elevation gives a defensible scale for this simple model. An arbitrary room photograph does not. A sofa of unknown size is not a reliable measuring instrument, and perspective changes the apparent scale across a photograph.&lt;/p&gt;

&lt;p&gt;When dimensions are unknown, call the image a styling illustration. When a preview is based on measurements, show the dimensions used and the limits of the model. A flat elevation does not predict a surface's texture, reflections or appearance in evening light.&lt;/p&gt;

&lt;p&gt;Before deciding on a size, a viewer can mark the proposed &lt;em&gt;outer&lt;/em&gt; rectangle on the wall with a suitable removable paper template, then look from the doorway and the usual seated position. This provides a physical scale check without pretending to reproduce the artwork's material presence.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://whispart.com/blogs/the-journal/how-whispart-makes-gan-art-from-visual-archive-to-one-of-one-work" rel="noopener noreferrer"&gt;Whispart process journal&lt;/a&gt; treats framed-room visualizations as decision aids and physical proofing as a separate step. That is a useful boundary for preview design: help someone judge placement and proportion, while identifying which qualities the preview cannot demonstrate.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published by Whispart. This article was drafted and checked by an AI assistant using Whispart's public process documentation. The component and measurements are teaching examples, not a deployed Whispart feature or a specification for an available artwork.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>css</category>
    </item>
    <item>
      <title>Print preflight for generative art: pixels, crop and physical proof</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Wed, 09 Sep 2026 04:37:16 +0000</pubDate>
      <link>https://dev.to/whispart/print-preflight-for-generative-art-pixels-crop-and-physical-proof-21nh</link>
      <guid>https://dev.to/whispart/print-preflight-for-generative-art-pixels-crop-and-physical-proof-21nh</guid>
      <description>&lt;p&gt;An image export can pass every file check and still fail as a physical artwork. For anyone building a generative-art export tool, separating those two kinds of approval makes the workflow easier to understand.&lt;/p&gt;

&lt;p&gt;Whispart develops GAN-based images and gives selected works a physical form. Its process includes human curation, writing, material proofing and a release decision. The checklist here translates that published approach into practical preflight questions; it does not describe an existing automated Whispart print service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculate resolution at the intended size
&lt;/h2&gt;

&lt;p&gt;Pixel dimensions describe a file. Physical dimensions describe an object. The relationship is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;effective PPI = pixels along an axis / (print size in cm / 2.54)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an illustrative 4096 × 4096-pixel image:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Square print size&lt;/th&gt;
&lt;th&gt;Effective PPI, rounded&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;40 × 40 cm&lt;/td&gt;
&lt;td&gt;260&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50 × 50 cm&lt;/td&gt;
&lt;td&gt;208&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60 × 60 cm&lt;/td&gt;
&lt;td&gt;173&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are arithmetic examples, not Whispart product specifications or pass/fail thresholds. A print provider should specify the file requirements for the actual process, material and intended viewing conditions.&lt;/p&gt;

&lt;p&gt;If the image is cropped, calculate from the pixels that remain. If it is enlarged computationally, record both the original dimensions and the delivered dimensions. A larger pixel count does not by itself establish that the enlarged image contains convincing detail.&lt;/p&gt;

&lt;p&gt;Changing only a file's resolution metadata does not add pixels. A useful export interface should therefore show the intended physical size beside the dimensions, rather than celebrating a “300 PPI” label in isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate the front image from the edge treatment
&lt;/h2&gt;

&lt;p&gt;A stretched canvas introduces a second geometry problem: what appears on the front, and what is reserved for the sides or finishing process?&lt;/p&gt;

&lt;p&gt;Keep the approved complete image separate from any production derivative. Ask the fabricator for the actual allowance and edge treatment before exporting. Do not assume that every canvas depth or frame uses the same dimensions.&lt;/p&gt;

&lt;p&gt;A review should make any crop visible. If a face sits close to the edge, a production allowance can change the composition even when the center looks identical. A preview that shows only the front rectangle can conceal that problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give each check a truthful result
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What software can report&lt;/th&gt;
&lt;th&gt;What still needs inspection&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File opens&lt;/td&gt;
&lt;td&gt;Decoding succeeded; dimensions read&lt;/td&gt;
&lt;td&gt;Whether the image is the intended version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size calculation&lt;/td&gt;
&lt;td&gt;Effective PPI for the selected crop and size&lt;/td&gt;
&lt;td&gt;Whether the print is convincing at the intended distance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crop preview&lt;/td&gt;
&lt;td&gt;Which pixels remain on the front&lt;/td&gt;
&lt;td&gt;Whether the altered composition is acceptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Color preparation&lt;/td&gt;
&lt;td&gt;The file's declared profile and export settings&lt;/td&gt;
&lt;td&gt;The result on the actual material under real light&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production proof&lt;/td&gt;
&lt;td&gt;A proof record has been attached&lt;/td&gt;
&lt;td&gt;Whether the proof deserves approval&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;“Check completed” and “approved” should be separate states. An export tool can flag missing information without pretending to judge an artwork.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffrdr19fkfnj52corzq9d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffrdr19fkfnj52corzq9d.jpg" alt="A hand inspecting the textured surface of an unframed printed image in a Whispart studio process photograph" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Studio process photograph supplied by Whispart. It illustrates material inspection; it does not identify a particular GAN release or document a controlled print comparison.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Close the loop with the physical object
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://whispart.com/blogs/the-journal/how-whispart-makes-gan-art-from-visual-archive-to-one-of-one-work" rel="noopener noreferrer"&gt;Whispart journal's account of physical proofing&lt;/a&gt; distinguishes room visualizations from physical evidence. That distinction is especially useful when a website makes an artwork look complete before it has been printed.&lt;/p&gt;

&lt;p&gt;Attach the inspected proof to the exact file version, intended size, material and date. Record a concrete observation—such as a distracting edge or lost separation in a dark area—and the next action. If the file changes, do not silently carry the old approval forward.&lt;/p&gt;

&lt;p&gt;For a practice that authorizes one physical release of a selected image, the decision to release deserves its own record. A successful export is an input to that decision.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published by Whispart. This article was drafted and checked by an AI assistant using the studio's public documentation. Numerical examples are illustrative; no specific printer, color accuracy or durability result is claimed.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>design</category>
    </item>
    <item>
      <title>Designing a contact sheet for GAN art review</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Wed, 09 Sep 2026 04:19:15 +0000</pubDate>
      <link>https://dev.to/whispart/designing-a-contact-sheet-for-gan-art-review-4pij</link>
      <guid>https://dev.to/whispart/designing-a-contact-sheet-for-gan-art-review-4pij</guid>
      <description>&lt;p&gt;A gallery of generated images has two different jobs: letting someone see the range of a model, and helping them decide which candidates deserve a closer look. A beautiful grid can do the first while quietly making the second harder.&lt;/p&gt;

&lt;p&gt;This note comes from Whispart, a studio developing and curating GAN-based images for physical artworks. Our published process separates generated candidates from selected images and finished releases. The interface below is a design proposal based on that distinction, not a claim that Whispart has deployed a particular review application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve the comparison before adding a score
&lt;/h2&gt;

&lt;p&gt;Begin with a stable contact sheet. Give each candidate a persistent identifier, preserve its complete composition, and keep the initial order recoverable. Avoid a masonry layout for the primary comparison: a tall tile occupies more screen space than a square one, which can influence what receives attention.&lt;/p&gt;

&lt;p&gt;Equal-sized containers are useful, but equal-sized &lt;em&gt;crops&lt;/em&gt; are a different decision. Use &lt;code&gt;object-fit: contain&lt;/code&gt; for the review thumbnail so that the interface does not silently remove an edge or a figure. A detail crop can be a separate, clearly labeled view.&lt;/p&gt;

&lt;p&gt;Let the reviewer toggle between three views:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;View&lt;/th&gt;
&lt;th&gt;Question it supports&lt;/th&gt;
&lt;th&gt;Limitation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Complete contact sheet&lt;/td&gt;
&lt;td&gt;Is there meaningful variation across this batch?&lt;/td&gt;
&lt;td&gt;Small details are difficult to judge.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single candidate, complete image&lt;/td&gt;
&lt;td&gt;Does the composition hold together without its neighbors?&lt;/td&gt;
&lt;td&gt;One image cannot demonstrate the range of a system.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detail at a stated zoom&lt;/td&gt;
&lt;td&gt;Is that mark deliberate-looking ambiguity or a distracting artifact?&lt;/td&gt;
&lt;td&gt;Enlarged detail cannot decide the whole composition.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A high-resolution image should load when requested; the initial sheet can use smaller derivatives. Keep the same candidate identifier attached to both. A thumbnail and its full-size file must never drift apart because filenames were sorted differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make “undecided” a real state
&lt;/h2&gt;

&lt;p&gt;An unchecked image has not necessarily been rejected. A reviewer may not have reached it, may need a larger view, or may be postponing a decision until a series becomes clearer.&lt;/p&gt;

&lt;p&gt;For a small tool, an illustrative record could look like this:&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;"candidate_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;"study-017"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"review_state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hold"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"observation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The pale area competes with the figure at thumbnail size."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"next_check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Inspect the complete image on its own."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reviewed_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-09T04:00:00Z"&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;This is fictional example data. Its useful feature is the separation of observation from action. “Bad image” does not tell the next reviewer what to inspect. A bounded visual observation does.&lt;/p&gt;

&lt;p&gt;Keep &lt;code&gt;unreviewed&lt;/code&gt;, &lt;code&gt;hold&lt;/code&gt;, &lt;code&gt;shortlisted&lt;/code&gt;, and &lt;code&gt;excluded&lt;/code&gt; distinct. Store a change history if multiple people can alter a decision. Shortlisting should not automatically authorize printing or publication; those are later decisions with different evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the studio's preferences legible
&lt;/h2&gt;

&lt;p&gt;Whispart's approach values emotional tension, ambiguity and images that continue to hold attention. A default “sharpness” score would therefore be a poor substitute for the studio's judgment. Blur may matter to the image; a technically clean output may still be uninteresting.&lt;/p&gt;

&lt;p&gt;For another practice, graphic clarity might be essential. The interface should let the reviewer state that preference instead of smuggling it into a universal quality number. Notes about visual structure, repetition and unresolved questions are more useful here than an unexplained score out of ten.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://whispart.com/blogs/the-journal/how-whispart-makes-gan-art-from-visual-archive-to-one-of-one-work" rel="noopener noreferrer"&gt;Whispart process journal&lt;/a&gt; provides the concrete workflow behind this proposal: a visual field becomes candidates, then human selection, writing and material proofing determine what can become a physical work. A contact sheet supports the selection stage. It cannot supply all of the later decisions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Published by Whispart. This article was drafted and checked by an AI assistant using Whispart's public studio documentation. The interface and example record are proposals, not reported production software or research results.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
    </item>
    <item>
      <title>A seed is not a provenance record: documenting generative art outputs</title>
      <dc:creator>Whispart Studio</dc:creator>
      <pubDate>Tue, 08 Sep 2026 04:03:35 +0000</pubDate>
      <link>https://dev.to/whispart/a-seed-is-not-a-provenance-record-documenting-generative-art-outputs-25f4</link>
      <guid>https://dev.to/whispart/a-seed-is-not-a-provenance-record-documenting-generative-art-outputs-25f4</guid>
      <description>&lt;p&gt;A seed is useful when you want to revisit a generated image. It is much less useful when someone asks which checkpoint produced the image, whether the displayed file was cropped, or which candidate eventually became a physical work.&lt;/p&gt;

&lt;p&gt;Those questions need a small chain of records: &lt;strong&gt;run → output → selected image → production file → physical proof&lt;/strong&gt;. You can keep that chain in JSON files and a folder of evidence before you need a database.&lt;/p&gt;

&lt;p&gt;This article proposes a lightweight record format for people building generative art workflows. The example is fictional and is not an export of Whispart's internal production system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the run and the image different identities
&lt;/h2&gt;

&lt;p&gt;Treat a run as the configuration used to generate a set of candidates. Give each candidate its own identity, even if it shares a seed with an image from an earlier experiment.&lt;/p&gt;

&lt;p&gt;For the run, preserve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The exact checkpoint file, with a checksum to identify its bytes.&lt;/li&gt;
&lt;li&gt;The generation code revision and resolved configuration, including default values.&lt;/li&gt;
&lt;li&gt;The software environment and relevant hardware information.&lt;/li&gt;
&lt;li&gt;A dataset version reference, when you control the training process, with its source-review records stored separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each output, record the run ID, sampling inputs and the actual exported file. Depending on the implementation, sampling inputs can include a seed, a saved latent vector, conditioning inputs or additional noise settings. Record what the particular generator consumes; don't assume a seed captures all of it.&lt;/p&gt;

&lt;p&gt;Even a carefully recorded configuration is not a promise of identical pixels everywhere. &lt;a href="https://docs.pytorch.org/docs/2.14/notes/randomness.html" rel="noopener noreferrer"&gt;PyTorch's reproducibility documentation&lt;/a&gt; explains that results can differ across releases, platforms and CPU/GPU execution. Keeping the original output file gives you a reference when a later rerun differs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Record what happened after generation
&lt;/h2&gt;

&lt;p&gt;Suppose a fictional studio selects &lt;code&gt;candidate-0042&lt;/code&gt;, crops it for presentation and later exports a separate file for printing. If all three images are called &lt;code&gt;final.png&lt;/code&gt;, the history becomes difficult to reconstruct.&lt;/p&gt;

&lt;p&gt;Instead, preserve the original candidate and record each derived file with its parent and the operation performed. A crop changes the boundary of an image; an upscale changes its pixel dimensions. Neither operation should silently replace the original record.&lt;/p&gt;

&lt;p&gt;Selection is a separate event. Record which candidate was selected, by whom, when, and why. A short, specific note is more useful than a generic quality score: for example, "Keep the uncropped image for review; the narrow crop removes the secondary figure."&lt;/p&gt;

&lt;p&gt;This separation matters when generated images become physical objects. &lt;a href="https://whispart.com/blogs/the-journal/how-whispart-makes-gan-art-from-visual-archive-to-one-of-one-work" rel="noopener noreferrer"&gt;Whispart's illustrated GAN process&lt;/a&gt; distinguishes a model, an output, a selected image and an authorized physical release. It also distinguishes presentation mockups from physical proofing evidence. The record format below applies that distinction to file management; it does not imply that the studio uses this particular schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small example you can adapt
&lt;/h2&gt;

&lt;p&gt;The following is an &lt;strong&gt;illustrative record with unresolved fields&lt;/strong&gt;, not a completed production record. Paths and IDs are invented. Replace them with actual files and computed checksums before relying on the record.&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;"schema_version"&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;"example_only"&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;"run"&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;"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;"demo-run-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"checkpoint_file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"models/demo-checkpoint.pkl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"checkpoint_sha256"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code_revision"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"configuration_file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runs/demo-run-01/config.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"environment_file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runs/demo-run-01/environment.txt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dataset_version"&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;"output"&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;"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;"candidate-0042"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"run_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;"demo-run-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"seed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sampling_inputs_file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runs/demo-run-01/inputs-0042.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"outputs/candidate-0042.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sha256"&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;"presentation"&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;"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;"presentation-0042-a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"parent_output_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;"candidate-0042"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"crop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"presentations/candidate-0042-crop.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sha256"&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;"selection"&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;"selected_asset_id"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reviewer"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reviewed_at"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reason"&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;"production"&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;"source_asset_id"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"print_file"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"print_file_sha256"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"proof_photo"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"proof_result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_reviewed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"release_id"&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;Notice that the presentation crop exists while selection is still pending. Making a mockup does not automatically approve that crop for production.&lt;/p&gt;

&lt;p&gt;Here is a concrete way to use the example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compare the original output with the presentation crop. If the original is selected, set &lt;code&gt;selected_asset_id&lt;/code&gt; to &lt;code&gt;candidate-0042&lt;/code&gt;; if the crop is selected, use &lt;code&gt;presentation-0042-a&lt;/code&gt;. Save the reviewer, time and actual reason.&lt;/li&gt;
&lt;li&gt;Export the print file from the selected asset. Record that asset's ID as &lt;code&gt;production.source_asset_id&lt;/code&gt;, and compute the checksum of the exported print file.&lt;/li&gt;
&lt;li&gt;When a physical proof is made, attach a photograph of that specific proof and record the review result. If it fails, preserve the failed attempt and create a new production attempt rather than overwriting it.&lt;/li&gt;
&lt;li&gt;Assign a release ID only when the studio's release decision is complete. Keep any edition policy in a separate, explicit record.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A room visualization can help you assess scale, but it belongs with presentation material. It cannot fill the missing &lt;code&gt;proof_photo&lt;/code&gt; field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the relationships before you trust the record
&lt;/h2&gt;

&lt;p&gt;Start with a few checks that catch ordinary mistakes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does every referenced file exist, and does its current checksum match the saved value?&lt;/li&gt;
&lt;li&gt;Does each derived asset point to the actual parent used to create it?&lt;/li&gt;
&lt;li&gt;Does the production file trace back to the selected asset?&lt;/li&gt;
&lt;li&gt;Does the proof evidence identify the same production attempt?&lt;/li&gt;
&lt;li&gt;Are unresolved fields still visibly unresolved?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A checksum helps detect a changed file. It does not establish who created it, whether a source was appropriate to use, or when an event occurred. Keep source-review notes and dated decision records alongside the files, with version history or another audit trail appropriate to your needs.&lt;/p&gt;

&lt;p&gt;If you retain only one thing from an exploratory session, keep the actual output and its run reference together. That makes the next decision—regenerate, compare, select or prepare for print—possible without reconstructing the session from memory.&lt;/p&gt;




&lt;p&gt;Published by Whispart Studio. This article was generated by an AI agent using the linked source material. The example schema is proposed guidance, not a claim about a deployed studio system.&lt;/p&gt;

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