<?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: Rocky</title>
    <description>The latest articles on DEV Community by Rocky (@nichetools).</description>
    <link>https://dev.to/nichetools</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%2F4172593%2F7002f8e8-236b-42d3-8c6f-fb02c350626e.png</url>
      <title>DEV Community: Rocky</title>
      <link>https://dev.to/nichetools</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nichetools"/>
    <language>en</language>
    <item>
      <title>Three things that cost me an evening installing MOSS-Image in ComfyUI, and none of them was the model</title>
      <dc:creator>Rocky</dc:creator>
      <pubDate>Fri, 30 Oct 2026 04:41:17 +0000</pubDate>
      <link>https://dev.to/nichetools/three-things-that-cost-me-an-evening-installing-moss-image-in-comfyui-and-none-of-them-was-the-5bm2</link>
      <guid>https://dev.to/nichetools/three-things-that-cost-me-an-evening-installing-moss-image-in-comfyui-and-none-of-them-was-the-5bm2</guid>
      <description>&lt;p&gt;MOSS-Image is a 5B-parameter text-to-image model from OpenMOSS, released 16 October 2026 under Apache 2.0. It's a single-stream diffusion transformer, and the reason to care about it is layout control: you can tell it where things go, with bounding boxes or a JSON layout, instead of describing the composition in prose and hoping.&lt;/p&gt;

&lt;p&gt;Everyone's writeup covers the interesting part — the layout control. Nobody covers the part that actually eats your evening, which is file placement. Here is what cost me the time, in the order it cost me.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The text encoders are separate files, and a missing one gives you garbage instead of an error
This is the one that broke me. With a single-checkpoint model you drop one file in and you're done. MOSS-Image ships its text encoders as their own files, both of them required. If one is missing or mismatched, ComfyUI does not tell you a file is missing. It runs, and produces noise.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That sentence is the whole reason this post exists. When a tool fails loudly you fix it in two minutes. When it fails by producing plausible-looking garbage, you start suspecting your prompt, then your sampler, then your step count, and you've burned an hour before you go back and check whether the files are actually where you think they are.&lt;/p&gt;

&lt;p&gt;Folder layout, for reference:&lt;/p&gt;

&lt;p&gt;ComfyUI/models/&lt;/p&gt;

&lt;p&gt;├── diffusion_models/ ← MOSS-Image checkpoint&lt;/p&gt;

&lt;p&gt;├── text_encoders/ ← text encoder files&lt;/p&gt;

&lt;p&gt;└── vae/ ← VAE, if distributed separately&lt;/p&gt;

&lt;p&gt;Comfy-Org publishes a repack of the same weights already arranged in this structure. If you'd rather not think about placement at all, use the repack. The official OpenMOSS repo is the source of truth and is what you want if you care about getting the newest unmodified files, but you place them yourself.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;It is a DiT, not a UNet, so your SDXL workflow does not transfer&lt;br&gt;
I assumed I could take an SDXL graph, swap the loader, and be most of the way there. You can't. A single-stream transformer doesn't split work between separate text and image streams the way SD 1.5 or SDXL do, so the graph expects the model's own loader. Pair it with an SDXL checkpoint loader and you get an error that doesn't explain itself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The node pack needs a restart, and "the node does not exist" usually isn't about the node&lt;br&gt;
Install the node pack from the manager or clone it into custom_nodes/, then restart ComfyUI. A pack that hasn't been picked up on restart produces exactly the same error as a pack that isn't installed, which sends you looking in the wrong place.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two more that bit me later, in descending order of wasted time&lt;br&gt;
Variant mismatch. There are two: SFT (base) and Turbo (a LoRA, far fewer steps). The sampler settings differ. A Turbo workflow run against SFT weights gives you noise, not an image — and it looks the same as a broken install. SFT is better fidelity at 20–30 steps; Turbo is usable at roughly 4–8. I started with Turbo because I wanted fast iteration and then forgot which one I'd installed.&lt;/p&gt;

&lt;p&gt;Starting with the layout graph. The layout workflow is the reason to use this model, so it's tempting to start there. Don't. Build the minimal text-to-image graph first — checkpoint, encoder, short prompt, 1024×1024 — and confirm you get a picture. When a complex graph breaks you cannot tell whether the fault is installation or prompt structure, and you end up debugging both at once.&lt;/p&gt;

&lt;p&gt;What's actually good about it, once it runs&lt;br&gt;
Layout control is real and it changes how you write prompts. Plan the arrangement first, then describe what goes in each region. If you write the descriptive prompt first and then try to force positions onto it, the two fight each other and the result looks like neither.&lt;/p&gt;

&lt;p&gt;The 5B parameter count is modest, and that's the point at this resolution — it's fast enough to iterate rather than queue and wait.&lt;/p&gt;

&lt;p&gt;I keep the fuller version of this — the exact file tree, both variants' step counts, and the layout workflow notes — at AI Handbook, linked here: aihandbook.app/tutorials/moss-image-comfyui-setup/ , updated in place when I get something wrong.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>tutorial</category>
      <category>python</category>
    </item>
    <item>
      <title>I built a Valheim seed tool that reads the seed straight out of your save</title>
      <dc:creator>Rocky</dc:creator>
      <pubDate>Fri, 23 Oct 2026 02:24:10 +0000</pubDate>
      <link>https://dev.to/nichetools/i-built-a-valheim-seed-tool-that-reads-the-seed-straight-out-of-your-save-ljf</link>
      <guid>https://dev.to/nichetools/i-built-a-valheim-seed-tool-that-reads-the-seed-straight-out-of-your-save-ljf</guid>
      <description>&lt;p&gt;The first ten minutes of a Valheim run are the most expensive ones. You pick a seed, you spawn, and only then do you find out whether the starting island has the resources you wanted. By that point you have already committed.&lt;br&gt;
So I built a small tool that draws the map before you commit. Type a seed, get the map. That part is not novel — there are several seed viewers around. The part I actually wanted was different: reading the seed out of a save you already have.&lt;br&gt;
If you have a world you have been playing for months and you no longer remember the seed, the world folder contains it. Drop the folder in and the tool reads the exact seed, then draws the map for it. It handles both .fwl files from before 1.0 and _main.N.fwl2 from 1.0. It also lists what it can find in the save — dungeons, altars, traders — so you can see what is left to visit.&lt;br&gt;
Two decisions worth mentioning:&lt;br&gt;
Nothing is uploaded. The save file is parsed in the browser; the file never leaves your machine. A world save is a personal thing and I did not want to be in the position of storing anyone's.&lt;br&gt;
No account, no install. It is a static page. Open it, use it, close it.&lt;br&gt;
Honest limits: it is a viewer, not an editor. It will not modify your world, and it cannot tell you whether a seed is "good" — that depends entirely on what you are trying to do (a speedrun start and a base-building start want opposite things).&lt;br&gt;
It is free and it will stay free: &lt;a href="https://valheimworldgenerator.com" rel="noopener noreferrer"&gt;https://valheimworldgenerator.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>valheim</category>
      <category>tools</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I grade every game fact A, B or C before it goes live</title>
      <dc:creator>Rocky</dc:creator>
      <pubDate>Tue, 20 Oct 2026 02:20:57 +0000</pubDate>
      <link>https://dev.to/nichetools/i-grade-every-game-fact-a-b-or-c-before-it-goes-live-1964</link>
      <guid>https://dev.to/nichetools/i-grade-every-game-fact-a-b-or-c-before-it-goes-live-1964</guid>
      <description>&lt;p&gt;I once published a description of a feature that did not exist.&lt;/p&gt;

&lt;p&gt;It was a small thing — a paragraph explaining that a tool accepted a URL parameter it had never accepted. Nobody complained. I found it myself, three days later, while reading my own page trying to remember why I had written it. The feature was plausible. It fit the rest of the product. I had clearly assumed it into existence somewhere between "this would be useful" and "this is how it works."&lt;/p&gt;

&lt;p&gt;That was the moment I stopped trusting my own drafting process for factual claims, and started grading them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Game guides are unusually good at generating wrong facts
&lt;/h2&gt;

&lt;p&gt;If you write about a game, you are working with four sources that look interchangeable and are not:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The store page&lt;/strong&gt; — price, release date, platforms, player count. Authoritative, but sparse and occasionally stale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-game testing&lt;/strong&gt; — the truth, if you actually did it, on the build you actually ran.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other guide sites&lt;/strong&gt; — fast, plentiful, and frequently copied from each other, so "three sources agree" can mean one source repeated three times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community chatter&lt;/strong&gt; — ahead of everything else and wrong maybe a third of the time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The dangerous mix is 2 and 3. A number you measured yourself and a number you read on another fan site feel identical by the time they reach your draft. One is evidence. The other is a rumour with good formatting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three tiers
&lt;/h2&gt;

&lt;p&gt;Every claim on the site now gets sorted before it gets published.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier A — hard facts.&lt;/strong&gt; Checkable against a primary source. I write the source and the date I checked it, on the page, visible to readers.&lt;/p&gt;

&lt;p&gt;What lives here: price, release date, platforms, player count, module counts, review score. All of it traces back to the store page or the store's API, with a re-check date attached.&lt;/p&gt;

&lt;p&gt;The rule that actually matters: &lt;strong&gt;a Tier A claim without a date is not a Tier A claim.&lt;/strong&gt; It is a memory. Prices change, platforms get added, review scores move. An undated fact is a fact about the past that the reader will apply to the present.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier B — how-to content.&lt;/strong&gt; Needs at least two independent sources agreeing before it gets published as fact.&lt;/p&gt;

&lt;p&gt;What lives here: solving rules, role techniques, which modules appear together on which level, timing behaviour. This is the bulk of a guide site, and it is where the copying problem bites hardest. Two sites agreeing is not two sources if one of them is reading the other. So "independent" is doing real work in that sentence — I have to be able to say where each of the two came from, and they cannot share an ancestor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier C — unconfirmed.&lt;/strong&gt; Not published as fact. Either left out entirely, or written explicitly as "unannounced" or "not confirmed."&lt;/p&gt;

&lt;p&gt;This is the tier that took me longest to accept, because it is the one that costs traffic. Console release dates. Mobile crossplay. Per-level walkthroughs. Unreleased content. All of it is high-volume search demand, and all of it is speculation wearing a headline. The honest version of those pages is a paragraph saying we do not know yet, which ranks for nothing.&lt;/p&gt;

&lt;p&gt;So most of Tier C simply does not get written.&lt;/p&gt;

&lt;h2&gt;
  
  
  What grading actually changed
&lt;/h2&gt;

&lt;p&gt;Three things, in order of how much they surprised me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The site got smaller.&lt;/strong&gt; Fewer pages, shorter pages. Several drafts I was happy with got cut down to a sentence or dropped, because I could not get a second independent source for the part that made them interesting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Errors got cheaper to fix.&lt;/strong&gt; When a claim carries a tier and a source, a correction is a two-minute edit: change the number, change the date. When a claim is buried in flowing prose with no provenance, a correction means re-reading the whole page and wondering what else came from the same unreliable place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I don't know" turned out to be a usable answer.&lt;/strong&gt; Not as a cop-out — as a labelled state. A reader who is told "this is confirmed" and "this is unconfirmed" can make their own call. A reader who is told everything in the same confident voice cannot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that does not scale
&lt;/h2&gt;

&lt;p&gt;Grading is slow, and it does not get faster with volume. Every Tier A number needs a re-check eventually. Every Tier B claim needs its two sources named. The maintenance cost is permanent, because the underlying facts move whether or not you touch the page.&lt;/p&gt;

&lt;p&gt;There is a temptation to relax the rules once traffic arrives — to let a plausible number through because the page is already written and the keyword is already targeted. That is exactly the moment the tiers stop meaning anything. A grading system you override when it is inconvenient is not a system, it is a style.&lt;/p&gt;

&lt;p&gt;The rules I use, including the exact wording of each tier and what falls into it, are written down on the site rather than kept in my head: &lt;a href="https://bombananaguide.xyz/about/" rel="noopener noreferrer"&gt;the fact-grading rules in full&lt;/a&gt;. Publishing them turned out to be useful in a way I did not expect — it makes overriding them a visible decision rather than a quiet one.&lt;/p&gt;

&lt;p&gt;If you write about anything with moving parts, the tiers do not need to be three, and they do not need to be mine. They need to be written down somewhere before the draft, not reconstructed afterwards.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>writing</category>
      <category>sideprojects</category>
      <category>seo</category>
    </item>
    <item>
      <title>I stopped writing guides for a co-op game and built solvers instead</title>
      <dc:creator>Rocky</dc:creator>
      <pubDate>Sat, 10 Oct 2026 06:10:35 +0000</pubDate>
      <link>https://dev.to/nichetools/i-stopped-writing-guides-for-a-co-op-game-and-built-solvers-instead-5840</link>
      <guid>https://dev.to/nichetools/i-stopped-writing-guides-for-a-co-op-game-and-built-solvers-instead-5840</guid>
      <description>&lt;p&gt;I play BOMBANANA! with two friends. It's a three-player co-op bomb-defusal game, and its entire design premise is that no player can verify anyone else's information. The three roles are labeled Blind, Deaf and Mute — one player can't see the panel, one player can't hear the sequence, one player can't say anything out loud.&lt;/p&gt;

&lt;p&gt;We lost seven runs in a row on the same module. Not because we didn't understand it. We understood it completely. We were each reading our own version of it, differently, and by the time we agreed on what it said the panel had already moved on.&lt;/p&gt;

&lt;p&gt;That's the moment I stopped writing guide pages.&lt;/p&gt;

&lt;p&gt;A guide page assumes the problem is knowledge. You don't know how the module works, so you read about it, then you apply it. That model breaks here, because all three of us already knew how the module worked. The problem was that the three of us were holding three different fragments of the same puzzle, with no shared place to put them.&lt;/p&gt;

&lt;p&gt;A guide can't fix that. A tool can.&lt;/p&gt;

&lt;p&gt;So I built the site the other way around: instead of explaining each module, it resolves each one into a single action. You count the cables, read the LED, get the exact wire to cut. You combine the raised Braille number with the light color and get one arrow. The output is never a paragraph — it's one instruction, because that's the only thing that survives the moment of panic.&lt;/p&gt;

&lt;p&gt;A few things I got wrong on the way, in case you're building something similar.&lt;/p&gt;

&lt;p&gt;A static site was the right call, but not for the reason I expected. I picked it for cost and speed, which was fine, but the real win was that there's no account and no install. The defuser has one hand free and about four seconds. Anything with a login screen is already too slow.&lt;/p&gt;

&lt;p&gt;The page that got used the most wasn't the clever one. I built a resolver that collapses a whole module into one action, and I was proud of it. But the page people actually sit on is a drill for reading Braille digits. The resolver assumes you can already read the input. Most of our failures were in the reading, not the resolving.&lt;/p&gt;

&lt;p&gt;Sharing needs to be built in from the start. The drill pages accept a seed in the URL, so the same set of prompts can be replayed by someone else, and the result can be copied as a short challenge line. Without that, nobody has any reason to send the page to a teammate — and a tool nobody sends is a tool nobody finds.&lt;/p&gt;

&lt;p&gt;The manual changes between patches, and that is the actual maintenance problem. Lookup tables go stale. I'd rather be corrected than be confidently wrong, so every page carries a note asking to be told when something is off.&lt;/p&gt;

&lt;p&gt;If you're building for a game with asymmetric information, the shape I'd reach for is: same inputs as the game, one output, no accounts, shareable state. The content you'd normally put in a guide is still useful — put it next to the tool, not instead of it.&lt;/p&gt;

&lt;p&gt;The tools are at &lt;a href="https://bombananaguide.xyz/tools/" rel="noopener noreferrer"&gt;https://bombananaguide.xyz/tools/&lt;/a&gt; — the module resolvers are there, and the Braille drill I mentioned is linked from that hub.&lt;/p&gt;

&lt;p&gt;It's a fan-made site for a game I just play badly. If a lookup table is wrong for your patch, tell me and I'll fix it the same day.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3c4153iiahq5k56haz8d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3c4153iiahq5k56haz8d.png" alt=" " width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>gamedev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>What actually mattered building a small SEO site from scratch</title>
      <dc:creator>Rocky</dc:creator>
      <pubDate>Fri, 09 Oct 2026 06:10:15 +0000</pubDate>
      <link>https://dev.to/nichetools/what-actually-mattered-building-a-small-seo-site-from-scratch-2ed</link>
      <guid>https://dev.to/nichetools/what-actually-mattered-building-a-small-seo-site-from-scratch-2ed</guid>
      <description>&lt;p&gt;For the last few weeks I've been building a fan wiki for a three-player co-op game — nine pages, English, no backend, no accounts, no CMS. It exists for one reason: when someone gets stuck and searches for the answer, this should be the thing that shows up.&lt;br&gt;
I'm a developer, not an SEO person, so I wrote down what actually seemed to matter. Some of it is obvious in hindsight. Some of it surprised me.&lt;br&gt;
A static site is not a compromise for this&lt;br&gt;
The whole thing is static HTML on a CDN. I generate the pages in a build step and push a directory. There is nothing to scale, nothing to keep warm, and the pages load before anyone can decide to leave.&lt;br&gt;
The reason I'd pick it again isn't speed, though. It's that there is nothing standing between the reader and the answer. No login wall, no cookie interstitial, no modal asking for an email. If a page exists to answer one question, then every click you add before the answer is a click that costs you the visit.&lt;br&gt;
Structured data was the highest-leverage hour of the project&lt;br&gt;
I added JSON-LD before I had a single visitor, which felt premature at the time. It wasn't.&lt;br&gt;
Most of a page is written for a person. Structured data is the only part written for a machine, and if you don't write it, a machine has to guess what your page is about. It will guess worse than you would.&lt;br&gt;
The other half is that almost nobody fills it in properly. That's not an advantage you have to be clever to earn — it's the one you get for doing the boring thing your competitors skipped.&lt;br&gt;
For a page describing a game, that meant marking up the game itself, the organization behind the site, and the questions as questions — not as a heading that happens to end in a question mark.&lt;br&gt;
Title, description and heading order are most of the work and none of the fun&lt;br&gt;
Every page needs a title written for a search result, a description written to be clicked, and exactly one H1. This is unglamorous, and it is the bulk of the actual effort.&lt;br&gt;
The one rule I'd pass on: write the outline before you write the page. If you can't list the H2s, you don't know what the page is about yet, and no amount of prose will fix that afterwards.&lt;br&gt;
The surprise: being late didn't mean the topic was closed&lt;br&gt;
We started about two weeks after the game launched. When I looked at the results page there were already a dozen sites covering it, several of them far bigger than us. My first instinct was that we'd missed it entirely.&lt;br&gt;
Then I actually read the top results. Most of them answered the same first question and stopped. Sitting right next to it was a second question nobody had written up.&lt;br&gt;
Being late to a topic is not the same as being late to every question inside it. A small site doesn't win the head term. It wins the sentence nobody else bothered to finish.&lt;br&gt;
Tools get linked to. Pages don't.&lt;br&gt;
This is the part that changed how I plan content.&lt;br&gt;
A guide page, however good, is something people read and close. A tool is something people keep open, and occasionally send to a friend. If pages are your only asset, search is your only distribution. If you have one small useful tool, you get a second and weaker channel — people passing the thing around.&lt;br&gt;
So I stopped planning more pages and started planning things that do something. The smallest interaction that turns "I think it says five" into "it says five".&lt;br&gt;
What I don't know yet&lt;br&gt;
I want to be clear that this is a process report, not a results report. The site has almost no visibility right now and I genuinely don't know whether any of it will work.&lt;br&gt;
What I can say is that the checklist turned out to be short and unexciting. Static pages. One clear question per page. Real structured data. An outline before prose. Something interactive that's worth keeping open. Then wait.&lt;br&gt;
There's no trick in there. That was the part I wasn't expecting.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>astro</category>
      <category>cloudflarechallenge</category>
    </item>
  </channel>
</rss>
