<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Trellis 2 Journal]]></title><description><![CDATA[Trellis 2 Journal]]></description><link>https://trellis2app.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Trellis 2 Journal</title><link>https://trellis2app.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 17:23:21 GMT</lastBuildDate><atom:link href="https://trellis2app.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[The Audit Habit That Saved Our Product Photos]]></title><description><![CDATA[I review every 3D model before it goes near a product page. Last month, fourteen models came out of generation for our spring catalog refresh. Six went live. Five went back for one more pass. Three ne]]></description><link>https://trellis2app.hashnode.dev/the-audit-habit-that-saved-our-product-photos</link><guid isPermaLink="true">https://trellis2app.hashnode.dev/the-audit-habit-that-saved-our-product-photos</guid><category><![CDATA[ecommerce]]></category><category><![CDATA[MachineLearning]]></category><category><![CDATA[web]]></category><dc:creator><![CDATA[Trellis 2]]></dc:creator><pubDate>Sat, 03 Oct 2026 12:36:51 GMT</pubDate><content:encoded><![CDATA[<p>I review every 3D model before it goes near a product page. Last month, fourteen models came out of generation for our spring catalog refresh. Six went live. Five went back for one more pass. Three never left the shared drive â and those three were the most important work of the month, because each of them nearly shipped.</p>
<p>Some context. We generate in <a href="https://trellis2.app">an image-to-3D tool our team runs in the browser</a>: a photo in, a GLB out, usually inside two minutes. The speed is real and it ruined us for a while, because at two minutes a model, nobody audits anything. You drag, you drop, you upload. The first complaint email taught me to slow down.</p>
<p>The uncomfortable truth about image-to-3D is that the generator is honest about what it saw and inventive about what it didn't. Your photo shows three sides of a pitcher. Your product page promises all of them. So before anything goes live, every model walks through three gates. The whole inspection runs about 90 seconds per model, and it has caught problems in five of the last fourteen.</p>
<p>Gate one: the back-half audit. I don't admire the front â the front is the photo, it'll be fine. I spin straight to the back. If I want to be thorough, I drop the file into an <a href="https://trellis2.app/3d-viewer/stl-viewer">STL viewer</a> and rotate it under flat lighting, where melted seams and invented geometry have nowhere to hide. A ceramic pitcher from this batch had a beautiful, correct handle on the left side. The photo only ever showed the left side. The right handle came out mirrored â a subtle mirror, the kind you only catch at the second glance. Customers take the second glance. That's the whole job.</p>
<p>Gate two: material honesty. Generated textures can run up to 4K, and at 4K the glaze has genuine depth. Beautiful. But my rule is the model may be less detailed than the product, never different. So I zoom to wherever a customer will zoom â the glaze line, the wood grain, the stitching â and check the texture against the physical sample on my desk. If the generated surface implies a material we don't sell, that's a return ticket wearing a hero render.</p>
<p>Gate three: hand it to a stranger. Someone who doesn't know the product picks up the laptop, and I watch where they drag first. People rotate toward the most interesting face. If the most interesting face is one the generator invented, the model is teaching customers something wrong about something they can still return. That's not a visualization problem; that's a refund queue.</p>
<p>Then the verdict, one of three letters. A means live â six this month. B means one regeneration away: wrong detail, but the input was sound, and a re-run costs one credit and roughly three minutes, so B is a queue item, not a crisis â all five Bs cleared the same afternoon. C means internal only. Three models sit in that bucket, and their jobs are real: packaging mockups, design reviews, the deck where I show the team how far a single photo gets us. C isn't failure. It's a model whose audience is employees.</p>
<p>I used to think the hard part of 3D commerce would be generating the models. It turns out generation is the cheap, fast, solved part. Publishing a wrong one is the expensive part, and it stays expensive in ways that outlive the launch â screenshots, reviews, the customer who tells the group chat the product looked nothing like the spin. So the review gate stays, ninety seconds at a time. The generator makes fourteen. I decide which six the customers meet.</p>
]]></content:encoded></item><item><title><![CDATA[The Math on Self-Hosting Your Image-to-3D Pipeline]]></title><description><![CDATA[Every few weeks another engineering lead asks me the same question: at what volume do we stop renting image-to-3D inference and just buy the GPU? I finally built the spreadsheet. Assumptions are on th]]></description><link>https://trellis2app.hashnode.dev/the-math-on-self-hosting-your-image-to-3d-pipeline</link><guid isPermaLink="true">https://trellis2app.hashnode.dev/the-math-on-self-hosting-your-image-to-3d-pipeline</guid><category><![CDATA[webdev]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Cloud Computing]]></category><dc:creator><![CDATA[Trellis 2]]></dc:creator><pubDate>Sat, 03 Oct 2026 10:44:02 GMT</pubDate><content:encoded><![CDATA[<p>Every few weeks another engineering lead asks me the same question: at what volume do we stop renting image-to-3D inference and just buy the GPU? I finally built the spreadsheet. Assumptions are on the table. Hardware street prices move monthly, so treat my column as ballparks and redo the last row with your own quotes.</p>
<h2>The rental column</h2>
<p>Cloud pricing for this category is subscription-per-credits. <a href="https://trellis2.app/pricing">trellis2.app</a>, for reference, runs \(19/month for 15 credits, \)49 for 50, and \(99 for 120. Assume one credit per generation and the per-model cost lands at \)1.27, $0.98, and $0.83. The launch-window discount on credit packs shaves roughly 20% off while it lasts; don't build a permanent cost model on a sale. At 40 models a month you never leave the $19 tier. At 200 you are stacking two Business plans and asking the GPU question seriously.</p>
<p>What the subscription actually buys is wider than inference: 25+ style presets, a 4K texture pass, automatic cloud storage, the whole upload-preview-download surface. None of that appears on the invoice as a line item. All of it is engineering weeks you never spend.</p>
<h2>The ownership column</h2>
<p>Self-hosting starts with a 24GB-class GPU. The architecture behind this generation of tools scales up to 2B parameters, and you want VRAM headroom rather than a laptop card; call it $2,000. Power is the line everybody overestimates. At roughly 400W under load, a two-minute generation burns about 0.013 kWh, which is pennies a month and honest to ignore.</p>
<p>The real cost is people. A serving endpoint, a queue, storage, retries, monitoring: five to eight engineer-days to stand up, plus a maintenance drip that never fully stops. Price internal time conservatively at $600 a day and year one runs about $5,000 to $7,000 all-in before your first model generates.</p>
<h2>Where they cross</h2>
<p>At $0.83 to $0.98 per model, the rental column crosses the ownership column somewhere around 5,000 to 8,000 generations in year one. That is roughly 400 to 650 models a month, steady, all year. Below that line, an idle GPU quietly becomes the most expensive furniture in the office. If the person standing up the pipeline is a founder whose evenings are "free," the crossover drops toward 200 a month, and that number seduces people into side projects they abandon in March. Price the time anyway.</p>
<p>Year two changes shape. Hardware is sunk, the maintenance drip remains, and ownership gets cheaper at high steady volume. The crossover moves down. Whether it moves enough depends almost entirely on whether your volume is flat or spiky.</p>
<h2>The tiebreakers off the spreadsheet</h2>
<p>Burst capacity first. A launch week doing ten times normal volume gets absorbed by cloud; behind your single GPU, it queues. Second, product surface. The underlying SLAT architecture came out of published Microsoft Research work, which gets you geometry, but the style system, the 4K texture pass, and the preview UI are finished product features you would be rebuilding from scratch; <a href="https://trellis2.app/blog/how-to-use-trellis-2-online-free">Trellis 2</a> ships all three today. Owning the model often means inheriting a second product to maintain, and a security review of a self-hosted endpoint is its own afternoon.</p>
<h2>The decision rule</h2>
<p>Under about 50 models a month: rent, and stop revisiting the question. Steady volume above roughly 400 a month, existing GPU infrastructure, and a team that genuinely likes running inference: self-hosting starts to earn its keep. The 100-to-400 middle band: rent, watch the monthly number, re-run this spreadsheet quarterly, because volume is the only input that moves and everything else follows it.</p>
<p>My own column reads about 40 a month and zero ops appetite, so I rent. The GPU question is really a volume question. Check the number first; the hardware decision sits downstream of it, never upstream.</p>
]]></content:encoded></item><item><title><![CDATA[Automating Image-to-GLB in an Asset Pipeline]]></title><description><![CDATA[We generate a lot of 3D props from reference images, and after the tenth manually-named download landed in the wrong folder, I sat down and wired the surrounding steps into something reproducible. The]]></description><link>https://trellis2app.hashnode.dev/automating-image-to-glb-in-an-asset-pipeline</link><guid isPermaLink="true">https://trellis2app.hashnode.dev/automating-image-to-glb-in-an-asset-pipeline</guid><dc:creator><![CDATA[Trellis 2]]></dc:creator><pubDate>Fri, 02 Oct 2026 10:48:54 GMT</pubDate><content:encoded><![CDATA[<p>We generate a lot of 3D props from reference images, and after the tenth manually-named download landed in the wrong folder, I sat down and wired the surrounding steps into something reproducible. The generation itself stays a browser session for now — the automation starts the moment GLBs hit disk. Here's the layout that survived contact with real work.</p>
<h2>Directory convention</h2>
<pre><code class="language-plaintext">assets/
  raw/                  # source photos, immutable, never edited in place
  models/
    sku-0042/
      src.jpg           # the exact image used
      v01.glb
      v02.glb
</code></pre>
<p>Two rules make everything else work. First, <code>raw/</code> is append-only: a reference image never gets edited, a bad one gets superseded by a new file. You will want to know later which photo produced which geometry, and the only reliable answer is the untouched original sitting next to the result. Second, regenerated models get a new version number, always. GLB is binary — diffs tell you nothing — so the version history <em>is</em> your history.</p>
<h2>Naming</h2>
<p>Kebab-case SKUs, zero-padded versions. The suffix convention I adopted: <code>v01</code>, <code>v02</code> for regenerations, <code>-lp</code> for decimated low-poly derivatives (<code>v02-lp.glb</code>). Boring, greppable, and it sorts correctly everywhere. The one rule I'd defend in a code review: no version ever overwrites another. Disk space is cheaper than forensic archaeology, and "just replace it and rename the old one old" is how v02 ends up containing v01.</p>
<h2>Batch sessions</h2>
<p>When a set of references is ready, I queue them in one session through <a href="https://trellis2.app">trellis2.app</a> — generations run 1-3 minutes each in the cloud and results autosave — then download the finished GLBs into their SKU folders as <code>v01.glb</code>. The queue rhythm matters more than it sounds: batch the uploads, go do something else, then triage results in a single pass. Per-file context switching is where every past mistake happened.</p>
<h2>Validation gate</h2>
<p>Every GLB passes through a small script before it can be committed:</p>
<pre><code class="language-plaintext">npx gltf-validator assets/models/sku-0042/v01.glb
</code></pre>
<p>The gate checks three things: triangle count against the prop's budget, texture dimensions (4K masters get downscaled to 1K-2K for engine use — the 4K original stays in cloud storage, retrievable if a hero page ever needs it), and that materials reference embedded textures rather than dangling paths. Failures print the reason and exit 1, so it can run locally and in CI with zero ceremony.</p>
<h2>Version control</h2>
<p>GLBs live in Git LFS; the source photos are small enough for plain Git. Every commit touching a model references the source image hash in the message:</p>
<pre><code class="language-plaintext">feat(assets): sku-0042 v02 — regenerated from raw/sku-0042-b.jpg (a3f9c1e), low-poly preset
</code></pre>
<p>That one line answers the question that used to eat an afternoon: "which photo did this model come from, and what settings produced it?" When we regenerate six months later, we start from a recorded style preset instead of somebody's memory of one. We alternate mostly between a low-poly preset for background props and photoreal for hero assets, and both are now vocabulary in the commit log, not tribal knowledge.</p>
<h2>What's still manual</h2>
<p>Two things: the upload-queue step, and the keep-or-regenerate judgment call. Those are the parts where taste operates, and fencing them off from the mechanical parts is deliberate. I'd rather review twenty previews in one sitting than interleave them with file juggling.</p>
<p>The honest measure of this setup: a 20-prop batch that used to take an error-prone afternoon now takes about an hour, and the boring parts — naming, validation, provenance — stopped producing surprises. That's what automation is for. It doesn't replace judgment; it makes sure judgment gets spent on the calls that deserve it.</p>
]]></content:encoded></item></channel></rss>