<?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: dylan yu</title>
    <description>The latest articles on DEV Community by dylan yu (@dylan_yu_7ffff00b5355942d).</description>
    <link>https://dev.to/dylan_yu_7ffff00b5355942d</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%2F4028400%2Fdac3210c-01da-48e4-93e3-fba394abe9e2.png</url>
      <title>DEV Community: dylan yu</title>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dylan_yu_7ffff00b5355942d"/>
    <language>en</language>
    <item>
      <title>Checking AI image metadata: 20 useful reads and listings</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Wed, 21 Oct 2026 23:44:30 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/checking-ai-image-metadata-20-useful-reads-and-listings-23k6</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/checking-ai-image-metadata-20-useful-reads-and-listings-23k6</guid>
      <description>&lt;p&gt;Before you post an AI-assisted image, it is worth knowing what the file says about itself. Generators and editors can leave a signed C2PA manifest (what LinkedIn's "CR" icon reads), XMP or IPTC tags marking the image as AI-generated, prompt text in PNG chunks, and ordinary EXIF such as GPS. None of it shows in the preview.&lt;/p&gt;

&lt;p&gt;The pages below explain those layers, and each one points to &lt;a href="https://removeaimeta.com/" rel="noopener noreferrer"&gt;Remove AI Meta&lt;/a&gt; as a way to inspect and strip them in the browser. If you want to go straight to the tool, the &lt;a href="https://removeaimeta.com/ai-metadata-cleaner" rel="noopener noreferrer"&gt;AI metadata cleaner&lt;/a&gt; handles one image at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the labels
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dylan_yu_7ffff00b5355942d/why-instagram-adds-an-ai-info-label-to-your-photo-and-how-to-check-the-file-first-45ch"&gt;Why Instagram Adds an "AI info" Label to Your Photo&lt;/a&gt;: how a small generative edit can trigger the label.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/removeaimeta/the-linkedin-cr-icon-is-a-manifest-not-a-sticker-31he"&gt;The LinkedIn CR icon is a manifest, not a sticker&lt;/a&gt;: what the icon actually reflects.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://removeaimeta.hashnode.dev/does-a-screenshot-remove-c2pa-data-from-a-chatgpt-image" rel="noopener noreferrer"&gt;Does a screenshot remove C2PA data from a ChatGPT image?&lt;/a&gt;: a plain answer, with its limits.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/removeaimeta/clean-a-jpeg-in-the-tab-you-already-have-open-3en"&gt;Clean a JPEG in the tab you already have open&lt;/a&gt;: why cleaning a file is not a promise about platform labels.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hands-on how-tos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/removeaimeta/strip-c2pa-and-iptc-metadata-from-ai-images-before-you-publish-79d"&gt;Strip C2PA and IPTC Metadata From AI Images Before You Publish&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://removeaimeta.hashnode.dev/inspecting-and-removing-c2pa-and-iptc-metadata-from-images" rel="noopener noreferrer"&gt;Inspecting and Removing C2PA and IPTC Metadata from Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://removeaimeta.hashnode.dev/stable-diffusion-and-comfyui-pngs-carry-your-prompt-how-to-see-what-s-inside" rel="noopener noreferrer"&gt;Stable Diffusion and ComfyUI PNGs carry your prompt&lt;/a&gt;: finding the saved generation recipe in a PNG.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://practicalwebtoolsnotes.blogspot.com/2026/10/what-your-ai-images-quietly-say-about.html" rel="noopener noreferrer"&gt;What Your AI Images Quietly Say About Themselves&lt;/a&gt;: three layers to check, with an exiftool command.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dylan_yu_7ffff00b5355942d/whats-actually-inside-your-image-and-pdf-before-you-upload-it-3j8l"&gt;What's actually inside your image (and PDF) before you upload it&lt;/a&gt;: covers PDFs as well as images.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://slides.com/removeaimeta/where-ai-metadata-hides-in-a-jpeg-png-and-webp-and-how-to-confirm-it-is-gone" rel="noopener noreferrer"&gt;Where AI metadata hides in a JPEG, PNG and WebP&lt;/a&gt;: a slide deck on locations and verification.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For developers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/kibovrwa/ai-image-metadata-checklist" rel="noopener noreferrer"&gt;ai-image-metadata-checklist&lt;/a&gt;: a GitHub checklist of metadata locations with exiftool commands.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://registry.modelcontextprotocol.io/v0/servers/com.removeaimeta%2Fremoveaimeta/versions/1.0.0" rel="noopener noreferrer"&gt;MCP registry entry&lt;/a&gt;: the tool as a Model Context Protocol server.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/dylan_yu_7ffff00b5355942d/troubleshooting-remove-ai-meta-real-error-messages-and-what-to-do-1c10"&gt;Troubleshooting Remove AI Meta&lt;/a&gt;: error messages and fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it is listed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aitoolfinder.ai/tools/remove-ai-meta" rel="noopener noreferrer"&gt;AI Tool Finder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.withaitools.com/tools/remove-instagram-ai-info" rel="noopener noreferrer"&gt;WithAITools&lt;/a&gt;: the Instagram-focused page.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://productwatch.io/products/remove-ai-meta" rel="noopener noreferrer"&gt;Product Watch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://buildvoyage.com/products/remove-ai-meta" rel="noopener noreferrer"&gt;BuildVoyage&lt;/a&gt;: includes the tech stack.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.uneed.best/tool/remove-ai-meta" rel="noopener noreferrer"&gt;Uneed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://newname.ai/products/remove-ai-meta" rel="noopener noreferrer"&gt;newname.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.directree.io/tool/remove-ai-meta" rel="noopener noreferrer"&gt;directree&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A note on limits
&lt;/h2&gt;

&lt;p&gt;Removing metadata changes what the file declares. It does not remove pixel watermarks such as SynthID, and platforms may still label content based on other signals or on your own disclosure. To check and clean a file, use the &lt;a href="https://removeaimeta.com/ai-metadata-cleaner" rel="noopener noreferrer"&gt;AI metadata cleaner&lt;/a&gt; on &lt;a href="https://removeaimeta.com/" rel="noopener noreferrer"&gt;Remove AI Meta&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Test Hair Colors Before You Dye Your Hair</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Tue, 20 Oct 2026 23:09:30 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/how-to-test-hair-colors-before-you-dye-your-hair-7n0</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/how-to-test-hair-colors-before-you-dye-your-hair-7n0</guid>
      <description>&lt;p&gt;Dyeing your hair is a big commitment, and a color that looks great on a swatch can look very different on you. Here is a simple process for testing hair colors first.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Know your skin undertone
&lt;/h2&gt;

&lt;p&gt;Blue or purple wrist veins suggest a cool undertone; green suggests warm. Cool tones suit ash and burgundy; warm tones suit copper and honey blonde.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Preview colors on your own photo
&lt;/h2&gt;

&lt;p&gt;Take a clear, evenly lit selfie, then use an AI tool such as &lt;a href="https://easyfaceai.com/hair-color" rel="noopener noreferrer"&gt;this AI hair color try-on&lt;/a&gt; to see different shades and styles on your own face in seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Check the color in different light
&lt;/h2&gt;

&lt;p&gt;Look at previews on a phone and a computer.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Do a strand test
&lt;/h2&gt;

&lt;p&gt;Test the real dye on a hidden strand and check it when dry.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Plan the whole look
&lt;/h2&gt;

&lt;p&gt;If you want to see outfits next to your new shade, an &lt;a href="https://easyfaceai.com/ai-clothes-changer" rel="noopener noreferrer"&gt;AI clothes changer&lt;/a&gt; can help you preview complementary clothing colors.&lt;/p&gt;

&lt;p&gt;Test digitally first, strand test second, and dye with confidence.&lt;/p&gt;

</description>
      <category>beauty</category>
    </item>
    <item>
      <title>Why Instagram Adds an "AI info" Label to Your Photo, and How to Check the File First</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Tue, 20 Oct 2026 12:54:48 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/why-instagram-adds-an-ai-info-label-to-your-photo-and-how-to-check-the-file-first-45ch</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/why-instagram-adds-an-ai-info-label-to-your-photo-and-how-to-check-the-file-first-45ch</guid>
      <description>&lt;p&gt;A photo with one small generative edit, like removing a stray sign with Photoshop's Generative Fill, can come out of the editor marked as AI media. Upload it to Instagram and you may get the "AI info" label, which is the same family as Meta's older "Made with AI" label. In many of these cases the signal is not in the pixels. It is in the metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  What triggers the label
&lt;/h2&gt;

&lt;p&gt;Meta has said it reads industry-standard markers that tools write into the file. Three are worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;C2PA Content Credentials.&lt;/strong&gt; A signed manifest describing how the image was made. In a JPEG it lives in JUMBF boxes inside APP11 segments. Adobe Firefly, Photoshop generative tools, and several image generators write it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IPTC DigitalSourceType.&lt;/strong&gt; A field whose values include &lt;code&gt;trainedAlgorithmicMedia&lt;/code&gt; (fully generated) and &lt;code&gt;compositeWithTrainedAlgorithmicMedia&lt;/code&gt; (a real photo with generated parts).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XMP history.&lt;/strong&gt; Editors record tool names and edit steps in XMP. Generative Fill and Firefly leave a clear trail here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check the file before you change anything
&lt;/h2&gt;

&lt;p&gt;ExifTool shows every tag group, including duplicates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool &lt;span class="nt"&gt;-G1&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; photo.jpg | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'c2pa|jumbf|DigitalSourceType|Credit'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No output means none of those markers are present. A JUMBF or C2PA group means a Content Credentials manifest is embedded. A DigitalSourceType line tells you how the file describes itself. &lt;code&gt;Credit&lt;/code&gt; sometimes holds a generator name.&lt;/p&gt;

&lt;p&gt;If you don't want to install anything, you can &lt;a href="https://removeaimeta.com/remove-ai-info" rel="noopener noreferrer"&gt;remove Instagram AI info&lt;/a&gt; in the browser instead. It reads and cleans the file on your device, so the image isn't uploaded anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strip it
&lt;/h2&gt;

&lt;p&gt;Write a new file and keep the original:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool &lt;span class="nt"&gt;-all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; clean.jpg photo.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-all=&lt;/code&gt; deletes all metadata, and &lt;code&gt;-o&lt;/code&gt; writes to a separate file. This is blunt. It removes copyright, camera and lens data, GPS, and the ICC color profile. Without the profile, colors can shift slightly in some viewers, and dropping the Orientation tag can make a portrait display sideways.&lt;/p&gt;

&lt;p&gt;To keep color, copy the profile back from the source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool &lt;span class="nt"&gt;-all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-tagsfromfile&lt;/span&gt; @ &lt;span class="nt"&gt;-icc_profile&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; clean.jpg photo.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;@&lt;/code&gt; means the source file. Copy copyright or orientation back the same way if you need them.&lt;/p&gt;

&lt;p&gt;If you only want the Content Credentials manifest gone and the rest left alone, a dedicated tool to &lt;a href="https://removeaimeta.com/remove-c2pa" rel="noopener noreferrer"&gt;remove C2PA&lt;/a&gt; does just that, also on-device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check again, then upload
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool &lt;span class="nt"&gt;-G1&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; clean.jpg | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'c2pa|jumbf|DigitalSourceType|Credit'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Empty output is the goal. Upload that exact file. Don't open it in another editor first, because many apps write their own XMP on save.&lt;/p&gt;

&lt;h2&gt;
  
  
  What stripping can't do
&lt;/h2&gt;

&lt;p&gt;Metadata is only one signal. Some generators also embed an invisible watermark in the pixels (Google's SynthID is one example), and stripping EXIF, XMP, and C2PA leaves that in place. Meta also runs its own detection. So a file with an empty grep can still be labeled.&lt;/p&gt;

&lt;p&gt;The label exists for disclosure. If an image is substantially AI-generated, keep the label or say so in the caption. Cleaning metadata makes most sense when the mark is a side effect of a small fix on a photo you took.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The label still appears.&lt;/strong&gt; Run the check on the exact file you uploaded. If markers are still there, you uploaded the wrong copy. If the output is empty and the label stays, another signal was used, and stripping again won't change it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saving or exporting brings the data back.&lt;/strong&gt; Phone galleries and many editing apps rewrite XMP on export, and Photoshop or Lightroom can write a new manifest if the edit history still includes a generative step. Strip as the last step, or re-check after every save.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshots.&lt;/strong&gt; A screenshot usually drops all metadata, but it also resamples the image and can catch UI around the edges. It won't remove a pixel watermark. Treat it as a last resort, not a fix.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
    <item>
      <title>Shipping Work Through a Desktop Agent: First Bot, Computer, Then Routines</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Thu, 15 Oct 2026 10:59:58 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/shipping-work-through-a-desktop-agent-first-bot-computer-then-routines-399g</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/shipping-work-through-a-desktop-agent-first-bot-computer-then-routines-399g</guid>
      <description>&lt;p&gt;"AI agent" posts usually skip the boring part: how a desktop agent actually holds a computer, asks for approval, and runs again tomorrow without you re-explaining the job. If you are evaluating Grok Bot-style setups, the useful mental model is three layers — &lt;strong&gt;identity&lt;/strong&gt;, &lt;strong&gt;computer&lt;/strong&gt;, &lt;strong&gt;routines&lt;/strong&gt; — not a chat demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 1: know what the product is (and is not)
&lt;/h2&gt;

&lt;p&gt;Start with a plain definition page before you install anything. &lt;a href="https://grokbot.run/learn/what-is-grok-bot/" rel="noopener noreferrer"&gt;What is Grok Bot&lt;/a&gt; is the right altitude: an agent that can use a computer and tools on your behalf, with approvals, not a magic autopilot that silently spends money and posts as you.&lt;/p&gt;

&lt;p&gt;Read that before comparison charts. Feature matrices are useless if you still think the product is "ChatGPT with a sidebar."&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 2: first bot as a scoped employee
&lt;/h2&gt;

&lt;p&gt;Your first bot should have a job description, not a personality. Good first jobs are narrow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Draft a weekly changelog from merged PRs&lt;/li&gt;
&lt;li&gt;Triage inbound email into labels + draft replies you still send&lt;/li&gt;
&lt;li&gt;Watch a folder and summarize new PDFs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A practical &lt;a href="https://grokbot.run/learn/first-bot/" rel="noopener noreferrer"&gt;first bot&lt;/a&gt; path matters more than a tour of every plugin. Scope equals safety. Wide open "do whatever" agents are how people discover irreversible actions the hard way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 3: the computer is the real API
&lt;/h2&gt;

&lt;p&gt;Chat is the interface. The computer is the capability. Files, browser, shell, and connected apps only matter if you understand what the agent can touch and what still needs your click.&lt;/p&gt;

&lt;p&gt;Skim &lt;a href="https://grokbot.run/learn/computer/" rel="noopener noreferrer"&gt;computer&lt;/a&gt; with the same seriousness you would give IAM docs. Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this run on a remote box, my machine, or both?&lt;/li&gt;
&lt;li&gt;Which actions are reversible vs. externally visible?&lt;/li&gt;
&lt;li&gt;Where do approvals show up, and can a routine bypass them?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those answers are fuzzy, do not wire production credentials yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Routines and skills turn demos into ops
&lt;/h2&gt;

&lt;p&gt;One-shot prompts are toys. Recurring work needs schedules, skills, and failure modes. &lt;a href="https://grokbot.run/learn/skills-routines/" rel="noopener noreferrer"&gt;Skills and routines&lt;/a&gt; is where an agent stops being a chat novelty and starts looking like a junior operator: same brief, same tools, logged outcomes.&lt;/p&gt;

&lt;p&gt;Ops hygiene that actually helps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Name the routine after the outcome (&lt;code&gt;weekly-changelog&lt;/code&gt;), not the model.&lt;/li&gt;
&lt;li&gt;Keep secrets out of the prompt; use connected accounts and approvals.&lt;/li&gt;
&lt;li&gt;Log failures with the step that died (auth, timeout, empty input).&lt;/li&gt;
&lt;li&gt;Prefer read → draft → human send over silent send for anything external.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For team-shaped usage, &lt;a href="https://grokbot.run/learn/ops/" rel="noopener noreferrer"&gt;ops&lt;/a&gt; notes on handoff and ownership prevent the classic failure: five people sharing one bot and nobody knowing who approved the outbound message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare on jobs, not logos
&lt;/h2&gt;

&lt;p&gt;When you stack Grok Bot against other agent products, compare &lt;strong&gt;job completion under approval constraints&lt;/strong&gt;, not homepage adjectives. A grounded &lt;a href="https://grokbot.run/compare/" rel="noopener noreferrer"&gt;compare&lt;/a&gt; page plus concrete &lt;a href="https://grokbot.run/use-cases/" rel="noopener noreferrer"&gt;use cases&lt;/a&gt; beats another "10 AI agents in 2026" listicle.&lt;/p&gt;

&lt;p&gt;Checklist before you commit a workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can I state the job in one sentence?&lt;/li&gt;
&lt;li&gt;Does the agent have only the computer access that job needs?&lt;/li&gt;
&lt;li&gt;Is every externally visible action behind an approval I understand?&lt;/li&gt;
&lt;li&gt;Can the same job rerun next week as a routine without rewriting the brief?&lt;/li&gt;
&lt;li&gt;Do I know how to recover when a step sticks or a login expires?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Desktop agents are less about clever prompts and more about boring operational design. Get the first bot narrow, the computer boundaries explicit, and the routine repeatable — then the chat UI finally earns its keep.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>First-Session Design for Browser Mech Games: Controls, Upgrades, Boss Gates</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Thu, 15 Oct 2026 10:58:36 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/first-session-design-for-browser-mech-games-controls-upgrades-boss-gates-534p</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/first-session-design-for-browser-mech-games-controls-upgrades-boss-gates-534p</guid>
      <description>&lt;p&gt;Browser mech fighters look casual until the first boss. Then the session splits into people who learned the control model and people who spent the whole run buying the wrong upgrades. If you build or document these games, treat the first session as a product surface: controls literacy, upgrade priority, and a boss gate that teaches — not punishes.&lt;/p&gt;

&lt;p&gt;I have been reverse-engineering what good first-session pages do for titles like Mechangelion. The pattern is consistent whether you are writing a guide or shipping a tutorial overlay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minute 0–3: teach the control model, not the lore
&lt;/h2&gt;

&lt;p&gt;Players forgive thin story. They do not forgive unclear movement, aim, and special triggers. A first-session page should name:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move / look / fire / skill cooldowns&lt;/li&gt;
&lt;li&gt;What "stun," "overheat," or "guard break" means in &lt;em&gt;this&lt;/em&gt; game&lt;/li&gt;
&lt;li&gt;One safe drill (strafe + fire on a weak enemy) before the map opens up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A dedicated &lt;a href="https://www.mechangelion.com/guides/mech-controls/" rel="noopener noreferrer"&gt;mech controls&lt;/a&gt; note beats burying binds inside a 2,000-word lore dump. Same for a &lt;a href="https://www.mechangelion.com/guides/mechangelion-first-session/" rel="noopener noreferrer"&gt;first session&lt;/a&gt; guide: the job is a clean loop, not a completionist checklist.&lt;/p&gt;

&lt;p&gt;If someone lands from search wanting to play immediately, send them to the playable shell — for example the &lt;a href="https://www.mechangelion.com/mechangelion/" rel="noopener noreferrer"&gt;Mechangelion play page&lt;/a&gt; — and keep the guide one tab away, not as a wall before the canvas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upgrade priority is a curriculum
&lt;/h2&gt;

&lt;p&gt;Random shops teach learned helplessness. Early currency should buy &lt;strong&gt;survivability and clarity&lt;/strong&gt; before vanity DPS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mobility or shield that reduces wipe chance on misplays&lt;/li&gt;
&lt;li&gt;A primary weapon upgrade that shortens time-to-kill on trash&lt;/li&gt;
&lt;li&gt;One utility that makes the upcoming boss readable (interrupt window, armor shred, heal on stagger)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A public &lt;a href="https://www.mechangelion.com/guides/mechangelion-upgrade-priority/" rel="noopener noreferrer"&gt;upgrade priority&lt;/a&gt; page is content marketing that doubles as design documentation. If your live economy contradicts the guide after a patch, update the guide the same day — stale priority lists destroy trust faster than a hard boss.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boss gates should examine the lesson
&lt;/h2&gt;

&lt;p&gt;The first boss is a unit test for the tutorial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the player learn the dodge / block / interrupt?&lt;/li&gt;
&lt;li&gt;Does the telegraph read at browser latency?&lt;/li&gt;
&lt;li&gt;Is failure informative (wrong upgrade, missed interrupt) or opaque (one-shot from offscreen)?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Document the gate the same way QA would: phases, tells, common wipe reasons. A focused &lt;a href="https://www.mechangelion.com/guides/mechangelion-boss-fights/" rel="noopener noreferrer"&gt;boss fights&lt;/a&gt; write-up helps returning players more than a spoiler-heavy full walkthrough, and it gives you a place to patch notes when telegraphs change.&lt;/p&gt;

&lt;p&gt;Pair that with a short &lt;a href="https://www.mechangelion.com/guides/mechangelion-beginner-guide/" rel="noopener noreferrer"&gt;beginner guide&lt;/a&gt; that stops before midgame nesting. Beginner ≠ encyclopedia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ops checklist for guide maintainers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Controls page&lt;/strong&gt; updates when binds or mobile gestures change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First-session page&lt;/strong&gt; updates when the opening map or economy changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade priority&lt;/strong&gt; updates on balance patches that touch early shops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boss page&lt;/strong&gt; updates when phase order or tells change — not when a cosmetic skin ships.&lt;/li&gt;
&lt;li&gt;Cross-link play → first session → upgrades → boss as a path, not a footer farm.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why this matters for browser games specifically
&lt;/h2&gt;

&lt;p&gt;HTML5 / WebGL titles compete with tab fatigue. A player who dies confused closes the tab; a player who dies understanding the mistake queues another run. Guides that mirror the real curriculum (controls → economy → boss exam) reduce bounce for the same reason good onboarding reduces churn in SaaS.&lt;/p&gt;

&lt;p&gt;If you only publish one new page this month, make it the first-session spine. Everything else is a satellite.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Content Ops for a Small Game Wiki: Codes, Beginner, Walkthrough as Three Products</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Thu, 15 Oct 2026 10:58:08 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/content-ops-for-a-small-game-wiki-codes-beginner-walkthrough-as-three-products-40ij</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/content-ops-for-a-small-game-wiki-codes-beginner-walkthrough-as-three-products-40ij</guid>
      <description>&lt;p&gt;A fan wiki for a live game is not one article with three URLs. It is three products that share a domain: a &lt;strong&gt;status table&lt;/strong&gt;, an &lt;strong&gt;onboarding spine&lt;/strong&gt;, and a &lt;strong&gt;gated progression doc&lt;/strong&gt;. Mixing them is how pages go stale, spoil new players, and burn editor time on the wrong refresh cycle.&lt;/p&gt;

&lt;p&gt;I have been looking at how small teams keep &lt;em&gt;100 Days at Sea&lt;/em&gt; style sites honest without a newsroom. The workable pattern is to give each page type a job, a refresh SLA, and a hard rule about what it must not contain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product 1: the codes page is a status API in HTML
&lt;/h2&gt;

&lt;p&gt;Promo codes rot on a weekly (sometimes daily) clock. The page's job is not inspiration. It is &lt;strong&gt;Active / Contested / Expired&lt;/strong&gt; with a checked date. Redeem steps change rarely; status cells change often. Ops rule: rewrite cells, not essays.&lt;/p&gt;

&lt;p&gt;That is why a maintained &lt;a href="https://www.100daysatsea.com/codes" rel="noopener noreferrer"&gt;codes&lt;/a&gt; list should look boring on purpose. Flashy "NEW CODES!!!" banners train readers to distrust you when last week's string is still glowing. Keep Expired rows visible so dead codes stop getting reposted as fresh. If you need the method behind the labels, the verification note on &lt;a href="https://www.100daysatsea.com/guides/how-we-verify-codes" rel="noopener noreferrer"&gt;how we verify codes&lt;/a&gt; is the editorial contract — not a second redeem tutorial.&lt;/p&gt;

&lt;p&gt;Refresh SLA: short. Touch this page whenever a dump hits Discord or a major tracker updates. Do not wait for a "content calendar."&lt;/p&gt;

&lt;h2&gt;
  
  
  Product 2: the beginner guide is a Day-1 spine
&lt;/h2&gt;

&lt;p&gt;Beginner pages fail when they try to be walkthroughs. New players need a &lt;strong&gt;resource triage and unlock order&lt;/strong&gt;, not boss mechanics from week three. The job is: stabilize the raft, name the first stations, set a night-1 exit plan, then stop.&lt;/p&gt;

&lt;p&gt;A focused &lt;a href="https://www.100daysatsea.com/beginner-guide" rel="noopener noreferrer"&gt;beginner guide&lt;/a&gt; should refuse midgame spoilers the way a codes page refuses vibes. If a paragraph only helps after the first boss gate, it belongs elsewhere. Ops rule: update when the early economy or tutorial flow changes — not when a new late island ships.&lt;/p&gt;

&lt;p&gt;Refresh SLA: medium. Patch notes that touch Day 1–3 matter; cosmetic seasons usually do not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product 3: the walkthrough is gated chapters
&lt;/h2&gt;

&lt;p&gt;Walkthroughs exist for &lt;strong&gt;gates&lt;/strong&gt;: prep checklists, failure modes, "you are blocked until X." They should be chaptered so a returning player can open one stretch without swallowing the whole plot. Spoiler boundaries are a product feature, not a courtesy.&lt;/p&gt;

&lt;p&gt;Structure a &lt;a href="https://www.100daysatsea.com/walkthrough" rel="noopener noreferrer"&gt;walkthrough&lt;/a&gt; as spine mode documentation: when to follow, when to explore, what prep the next gate demands. Ops rule: update per gate when the encounter or recipe changes; do not reshuffle the whole TOC every week for SEO theater.&lt;/p&gt;

&lt;p&gt;Refresh SLA: long per chapter, event-driven per patch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shared editorial rules that keep the three from collapsing
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One primary job per URL.&lt;/strong&gt; Codes do not teach Day-1 builds. Beginner does not list contested promo strings. Walkthrough does not bury a redeem form in chapter 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timestamps match the job.&lt;/strong&gt; Codes need a "checked" stamp. Beginner needs a "early-game verified as of" line. Walkthrough needs per-chapter patch notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-link as handoffs, not keyword stuffing.&lt;/strong&gt; Beginner → walkthrough when the raft is stable. Codes → beginner when someone is redeeming instead of eating. Walkthrough → codes only if a chapter is gated behind a seasonal reward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source methodology is public.&lt;/strong&gt; A short &lt;a href="https://www.100daysatsea.com/source-methodology" rel="noopener noreferrer"&gt;source methodology&lt;/a&gt; page turns "trust us" into a checklist outsiders can audit.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why this split helps SEO and humans
&lt;/h2&gt;

&lt;p&gt;Search queries cluster by job: "codes," "beginner," "walkthrough / how to beat." One mega-page ranking for all three usually ranks cleanly for none after the first month, because refresh noise and spoiler complaints fight each other. Three products, three SLAs, one domain — that is content ops for a small game wiki, not a content calendar cosplay.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>gamedev</category>
      <category>contentwriting</category>
    </item>
    <item>
      <title>GAI vs FSIQ: How to Read the Gap Without Inventing a Story</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Thu, 15 Oct 2026 10:56:44 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/gai-vs-fsiq-how-to-read-the-gap-without-inventing-a-story-228k</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/gai-vs-fsiq-how-to-read-the-gap-without-inventing-a-story-228k</guid>
      <description>&lt;p&gt;A cognitive report that shows both a General Ability Index (GAI) and a Full Scale IQ (FSIQ) invites a tempting narrative: "I'm smarter than my IQ says" or "something is wrong with me." Most of the time the gap is a measurement pattern, not a personality plot. Here is how to read it without turning two numbers into a myth.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each score is actually summarizing
&lt;/h2&gt;

&lt;p&gt;FSIQ on a Wechsler battery folds in a broad set of index scores. GAI is built from a narrower set that leans harder on verbal and visual reasoning and usually puts less weight on working memory and processing speed. That is why GAI can sit above FSIQ when those secondary indexes are the drag — and why the reverse can happen too.&lt;/p&gt;

&lt;p&gt;If you only remember one framing, use this: &lt;strong&gt;GAI is not a "true IQ" that FSIQ secretly underreports.&lt;/strong&gt; It is a different composite with different inputs. A clear comparison of that design choice is in &lt;a href="https://gaivsiq.com/guides/gai-iq-test-vs-a-wechsler" rel="noopener noreferrer"&gt;GAI IQ test vs a Wechsler&lt;/a&gt;, which is worth reading before you trust any online "GAI calculator" that never names its subtests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why GAI often looks higher
&lt;/h2&gt;

&lt;p&gt;When working memory or processing speed are relatively weak, FSIQ drops more than GAI. The gap is then a signal about profile shape, not a prize. Parents and adults both over-index on the higher number because it feels kinder. Clinicians care about the shape because accommodations, pacing, and follow-up testing hang on it.&lt;/p&gt;

&lt;p&gt;A practical explanation of that pattern — without cheerleading — is &lt;a href="https://gaivsiq.com/guides/why-gai-is-higher-than-iq" rel="noopener noreferrer"&gt;why GAI is higher than IQ&lt;/a&gt;. Pair it with the complementary piece on &lt;a href="https://gaivsiq.com/guides/working-memory-processing-speed-and-gai" rel="noopener noreferrer"&gt;working memory, processing speed, and GAI&lt;/a&gt; if your report already shows those indexes. Reading both beats Googling "is a 12-point gap significant" in isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to calculate (and when not to)
&lt;/h2&gt;

&lt;p&gt;If you have the scaled scores and a published conversion table for the exact battery and norms, you can compute GAI yourself. If you have only a marketing PDF and no table, you cannot. Wrong edition, wrong age band, or wrong combination of subtests produces a confident wrong number.&lt;/p&gt;

&lt;p&gt;Use a transparent &lt;a href="https://gaivsiq.com/guides/how-to-calculate-gai" rel="noopener noreferrer"&gt;how to calculate GAI&lt;/a&gt; walkthrough when you want the arithmetic spelled out, then plug the same inputs into a &lt;a href="https://gaivsiq.com/calculator" rel="noopener noreferrer"&gt;GAI vs IQ calculator&lt;/a&gt; only as a check — never as a substitute for the official report. If the calculator and the report disagree, trust the report and ask the examiner which composite they used.&lt;/p&gt;

&lt;h2&gt;
  
  
  A sober reading checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Name the battery and edition.&lt;/strong&gt; WAIS-IV / WISC-V / etc. are not interchangeable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List which indexes feed GAI vs FSIQ on that edition.&lt;/strong&gt; Do not assume last year's blog post matches your booklet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look at the gap direction and size, then at the indexes that explain it.&lt;/strong&gt; A high GAI with slow processing speed is a different story from a flat profile with a tiny gap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refuse single-number identity.&lt;/strong&gt; Neither GAI nor FSIQ is a career destiny or a moral score.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask what decision the score is for.&lt;/strong&gt; Educational placement, clinical follow-up, and curiosity hobbyists need different levels of precision.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What "good" means in this context
&lt;/h2&gt;

&lt;p&gt;People ask for a good GAI the way they ask for a good credit score. Composites are relative to a norm group, and "good" only makes sense relative to a purpose: gifted screening thresholds, discrepancy analysis, or simply understanding a classroom struggle. Absolute bragging rights are the least useful use of the page.&lt;/p&gt;

&lt;p&gt;If you are staring at two numbers and feel the urge to pick a favorite, slow down. Read the composite definitions, check the calculation path, and treat the gap as a prompt to inspect working memory and speed — not as a plot twist about who you really are.&lt;/p&gt;

</description>
      <category>psychology</category>
      <category>testing</category>
      <category>education</category>
    </item>
    <item>
      <title>Retention Math for Ranking Shorts: Why the Order Beats the Template</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Thu, 15 Oct 2026 10:55:16 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/retention-math-for-ranking-shorts-why-the-order-beats-the-template-3dmh</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/retention-math-for-ranking-shorts-why-the-order-beats-the-template-3dmh</guid>
      <description>&lt;p&gt;Countdown Shorts look simple: five clips, big numbers, a beat drop. Most of them die in the first two seconds anyway. The failure is rarely the font. It is the order of the ranks and how much proof you put on screen before the viewer decides the list is fake.&lt;/p&gt;

&lt;p&gt;I have been watching ranking Shorts the way a product person watches onboarding funnels. Same funnel, shorter clock. Here is the retention math that actually moves the needle, and where a purpose-built ranking workflow helps more than another CapCut template.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second 0–2 is a claim, not a montage
&lt;/h2&gt;

&lt;p&gt;Viewers do not "settle in." They ask: is this list going to be worth my thumb? A cold open that starts on Rank 5 with no claim wastes the only free attention you get. Lead with the promise: "Top 5 product fails from this week" or "Top 3 moments from one match." Then show Rank 5 or Rank 3 as evidence, not as throat-clearing.&lt;/p&gt;

&lt;p&gt;A practical walkthrough of that claim-first structure lives in &lt;a href="https://shortsrank.com/how-to-make-a-ranking-short/" rel="noopener noreferrer"&gt;how to make a ranking short&lt;/a&gt;. Treat it as a checklist for the hook, not as decoration for the mid-roll.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rank order is an information architecture problem
&lt;/h2&gt;

&lt;p&gt;People argue about whether to count up or count down. Both can work. What kills retention is &lt;strong&gt;opaque criteria&lt;/strong&gt;. If Rank 2 and Rank 1 look interchangeable, the audience stops caring who "won."&lt;/p&gt;

&lt;p&gt;Write the ranking rule in one line before you edit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most rewatched moment in my own footage&lt;/li&gt;
&lt;li&gt;Highest sales lift after a demo&lt;/li&gt;
&lt;li&gt;Clearest skill expression in under four seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then cut so that each rank visibly satisfies that rule. The on-screen number is a label. The clip has to earn it. When you are building a YouTube-facing countdown specifically, the platform habits differ slightly from Reels — pacing, end screens, and series hooks — which is why a dedicated &lt;a href="https://shortsrank.com/youtube-shorts-countdown/" rel="noopener noreferrer"&gt;YouTube Shorts countdown&lt;/a&gt; page is more useful than a generic "vertical video tips" post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retention is earned between ranks, not only at Rank 1
&lt;/h2&gt;

&lt;p&gt;Creators obsess over the #1 slot and under-invest in the transitions. Drop-offs cluster when:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The next clip looks like the previous one (same angle, same length, same energy).&lt;/li&gt;
&lt;li&gt;The lower ranks feel like filler so the top can look dramatic.&lt;/li&gt;
&lt;li&gt;Text on screen contradicts what the clip shows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A retention-oriented cut varies shot scale and proof type: reaction, result metric, before/after, failure, then payoff. If every rank is a 1.5-second slam cut of the same UI, the algorithm and the human both get bored. Notes on that mid-list retention pattern are collected in &lt;a href="https://shortsrank.com/blog/ranking-short-retention/" rel="noopener noreferrer"&gt;ranking short retention&lt;/a&gt; — useful when you already have clips and need a second pass on order, not another export preset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Templates vs. ranking-native editors
&lt;/h2&gt;

&lt;p&gt;CapCut-style templates give you motion. They do not give you a ranking model. If your workflow is "drop five clips into numbered slots, adjust labels, export," a &lt;a href="https://shortsrank.com/ranking-shorts-maker/" rel="noopener noreferrer"&gt;ranking Shorts maker&lt;/a&gt; that treats ranks as first-class objects beats fighting a general timeline every time you reorder #4 and #2.&lt;/p&gt;

&lt;p&gt;Reorder cost is the hidden tax. Every time you swap ranks in a linear timeline, you risk breaking transitions and captions. Ranking-native tools keep the claim, the number, and the clip bound together so reordering is a product action, not a re-edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short production checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Write the one-line ranking rule.&lt;/li&gt;
&lt;li&gt;Cut the cold open as a claim + Rank N evidence.&lt;/li&gt;
&lt;li&gt;Make each rank satisfy the rule on screen, not only in your head.&lt;/li&gt;
&lt;li&gt;Vary proof type between ranks.&lt;/li&gt;
&lt;li&gt;Reorder in a ranking-aware editor before you polish motion graphics.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Countdown Shorts are not a genre of decoration. They are a tiny ranked list with a soundtrack. Get the list right first; the template will look smarter than it is.&lt;/p&gt;

</description>
      <category>youtube</category>
      <category>seo</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I Evaluate Free Web Tools Before I Trust a List</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Thu, 15 Oct 2026 10:38:16 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/how-i-evaluate-free-web-tools-before-i-trust-a-list-27if</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/how-i-evaluate-free-web-tools-before-i-trust-a-list-27if</guid>
      <description>&lt;p&gt;A free web tool is easy to open and easy to regret. Search "compress image" or "merge PDF" and you get lookalike sites: a thin form over someone else's API, or a signup wall on the third click. A directory only helps if it shrinks that choice. Here is the filter I use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the job, not the brand
&lt;/h2&gt;

&lt;p&gt;Before I open a tab I write the task in one sentence: shrink this PNG under 200 KB, split a 40-page PDF, check contrast on a button, convert a HEIC from a phone. If a page cannot say which job it does, I close it. "Best tools" roundups fail that test.&lt;/p&gt;

&lt;p&gt;I judge directories the same way. Categories named after the work beat a grid of logos. When I need one format turned into another, I open a &lt;a href="https://webtoolslist.com/converters" rel="noopener noreferrer"&gt;converters&lt;/a&gt; list and compare options that claim the same job, instead of trusting the result that bought the top ad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five checks before a file goes in
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Where the bytes go.&lt;/strong&gt; If the file is not already public, I want it processed in the tab. When a tool uploads, I look for who receives it, how long they keep it, and whether the privacy page says so plainly. "We may use your content to improve our services" is a no for contracts, IDs, and unreleased designs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whether "free" survives one real run.&lt;/strong&gt; I use my own file, not the demo. Watermarks, page caps, a download locked behind an account, and a quota that appears after the progress bar are part of the product. Holding the file hostage is not free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output I can ship.&lt;/strong&gt; Compression that smears UI text, a merge that drops bookmarks, or a converter that strips the color profile can still "succeed." I compare size and a quick look at the original. If I cannot see what changed, I do not keep the tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No surprise install.&lt;/strong&gt; A browser tool should stay in the browser. A desktop download, or an extension asking for broad permissions to convert one file, is a different product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Someone still maintains it.&lt;/strong&gt; A broken layout, a certificate warning, or a site untouched for years means it is rotting. Lists that never date their links become junk drawers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a useful list adds
&lt;/h2&gt;

&lt;p&gt;A name and a favicon are not a review. A list I reuse names the constraint that matters — file size, local versus upload, account or not — and walks through one real task.&lt;/p&gt;

&lt;p&gt;Before a hero image goes into a CMS I want that tradeoff spelled out: how hard to push quality, which format to leave with, and which sites stay in the tab. &lt;a href="https://webtoolslist.com/guides/compress-images-online" rel="noopener noreferrer"&gt;Compress images online without installing an app&lt;/a&gt; is more useful than a row of identical compressor cards, because it starts from the upload limit and only then names tools.&lt;/p&gt;

&lt;p&gt;PDFs raise the bar. I will not install an app just to merge or shrink one, and I will not drop a client file on a random uploader. &lt;a href="https://webtoolslist.com/guides/free-pdf-tools-in-the-browser" rel="noopener noreferrer"&gt;Free PDF tools you can use in the browser&lt;/a&gt; is the page I want: the task, why the tab is enough, and a few tools that claim to do it, with a reminder to check where the file goes.&lt;/p&gt;

&lt;p&gt;The guide teaches the check. The category lets me swap tools when the first one fails. If a list never says when a link was last reviewed, I treat the top results as stale and re-test two of them myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  A pocket checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;One-sentence task.&lt;/li&gt;
&lt;li&gt;Does the file stay in the browser? If not, would I send a non-sensitive sample?&lt;/li&gt;
&lt;li&gt;Can I leave with the file after one run, with no second paid step?&lt;/li&gt;
&lt;li&gt;Is the output good enough to ship, and can I see what changed?&lt;/li&gt;
&lt;li&gt;Is the page maintained, and does the directory date its check?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a directory helps me answer those without a dozen extra tabs, it has earned the bookmark. Web Tools List is organized as job categories plus short task guides, which is why I keep it bookmarked. Run the checklist on two tools the next time you convert a file.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building an AI hairstyle try-on on third-party models: honest notes from EasyFace AI</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Thu, 15 Oct 2026 00:14:57 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/building-an-ai-hairstyle-try-on-on-third-party-models-honest-notes-from-easyface-ai-g7i</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/building-an-ai-hairstyle-try-on-on-third-party-models-honest-notes-from-easyface-ai-g7i</guid>
      <description>&lt;p&gt;I build EasyFace AI (&lt;a href="https://easyfaceai.com" rel="noopener noreferrer"&gt;https://easyfaceai.com&lt;/a&gt;), an AI hairstyle changer: upload one photo and preview a hairstyle, hair color, beard, face edit, headshot, outfit, or photo effect on that same person. This is a short note on how it is put together and what it honestly is and is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Third-party models, not a self-trained one
&lt;/h2&gt;

&lt;p&gt;EasyFace does not train its own look model. Each feature routes to a third-party image model chosen for that job, and the feature names are listed publicly on the &lt;a href="https://easyfaceai.com/models" rel="noopener noreferrer"&gt;models page&lt;/a&gt;. I think being upfront about this matters more than sounding impressive. If you are deciding between this, a filter app, a photo editor, or a salon consult, I keep an &lt;a href="https://easyfaceai.com/compare" rel="noopener noreferrer"&gt;honest comparison page&lt;/a&gt; that says when each option is the better pick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product decisions worth sharing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One free watermarked preview per visitor.&lt;/strong&gt; It does not refresh daily, and creating an account does not add a second one. Simple rule, easy to explain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failed generations refund.&lt;/strong&gt; A failed run returns the reserved credits and does not consume the free preview.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short retention.&lt;/strong&gt; The uploaded photo is deleted when the run finishes. Unpaid previews are deleted after 7 days, paid results after 30 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Face blur runs in the browser&lt;/strong&gt;, so that photo is never uploaded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is a preview, not a promise.&lt;/strong&gt; The result is a generated preview of one edit, not a haircut and not a medical image.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Content that answers the real question
&lt;/h2&gt;

&lt;p&gt;Most people do not start with "AI hairstyle changer"; they start with "which haircut suits my face shape?". So I wrote a plain &lt;a href="https://easyfaceai.com/face-shape-hairstyles" rel="noopener noreferrer"&gt;face shape and hairstyles table&lt;/a&gt; that maps oval, round, square, heart, long and diamond faces to cuts worth trying, which you can then try on your own photo.&lt;/p&gt;

&lt;p&gt;Feedback welcome, especially on the comparison page: if something there is unfair to another option, tell me and I will fix it.&lt;/p&gt;

</description>
      <category>showdev</category>
    </item>
    <item>
      <title>Content Ops for Seasonal Promo Codes on a Small Fan Site</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:53:38 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/content-ops-for-seasonal-promo-codes-on-a-small-fan-site-35mm</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/content-ops-for-seasonal-promo-codes-on-a-small-fan-site-35mm</guid>
      <description>&lt;p&gt;Seasonal and weekly promo codes look like a content problem. They are really a publishing-ops problem: high churn, conflicting sources, and readers who punish you the first time a "working" string fails.&lt;/p&gt;

&lt;p&gt;I have been reverse-engineering how small fan sites keep those pages useful without turning the author into a full-time list scraper. The pattern that works is a thin codes product, strict status rules, and deliberate links into the rest of the IA — not a weekly essay about the same redeem button.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define the codes page as a status product
&lt;/h2&gt;

&lt;p&gt;A codes URL should answer three questions and stop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is Active &lt;em&gt;right now&lt;/em&gt;?&lt;/li&gt;
&lt;li&gt;What is Contested, and why do sources disagree?&lt;/li&gt;
&lt;li&gt;How do I redeem without getting scammed?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything else — early build order, island routes, Day-100 pacing — belongs on sibling pages. When a codes article grows a craft guide in the middle, both intents suffer: the status table gets buried, and the guide bits go stale on a different clock.&lt;/p&gt;

&lt;p&gt;A clean example of the thin product is a dedicated &lt;a href="https://www.100daysatsea.com/codes" rel="noopener noreferrer"&gt;Active / Contested / Expired codes table&lt;/a&gt;: short answer up top, full source-backed archive below, redeem steps once, FAQ for failure modes. No homepage funnel required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a verification rubric you can defend
&lt;/h2&gt;

&lt;p&gt;Readers do not need your vibes. They need a rubric you can repeat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Active&lt;/strong&gt; — ≥2 independent current lists agree live; none mark expired.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contested&lt;/strong&gt; — lists disagree; show each verdict in the row.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expired&lt;/strong&gt; — dated end from a source, with no later successful redeem reports.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write the rubric on the page. When someone complains that Site A still shows a string as live, you point at Contested instead of arguing in comments. That single move turns drama into documentation.&lt;/p&gt;

&lt;p&gt;Also record scope: "we reconcile public lists; we have not redeemed in-game" is a legitimate boundary. Over-claiming is how small sites lose the only asset they have — trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run a fixed ops loop, not inspiration
&lt;/h2&gt;

&lt;p&gt;Promo codes are calendar work. Pick a check window that matches the release pattern you observe (many games cluster drops on a weekday). Then run the same five steps every cycle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the previous status table.&lt;/li&gt;
&lt;li&gt;Diff against the trackers named in your Sources section.&lt;/li&gt;
&lt;li&gt;Move rows between buckets with a one-line reason.&lt;/li&gt;
&lt;li&gt;Bump the &lt;strong&gt;checked&lt;/strong&gt; date (separate from publish date).&lt;/li&gt;
&lt;li&gt;Refresh the short-answer blurb if the Active set changed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not rewrite redeem steps weekly. Do not rewrite the FAQ unless the client UI changed. The diff is the article.&lt;/p&gt;

&lt;p&gt;Keep a tiny changelog at the bottom ("Oct 14: added RIVAL to Active; SKELLY remains Contested because GamesRadar and RoCodes disagree"). Changelogs are cheap SEO and expensive trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wire codes into the rest of the site without cannibalizing it
&lt;/h2&gt;

&lt;p&gt;Codes pages get the spike traffic. Beginner and walkthrough pages get the depth. Link &lt;em&gt;out&lt;/em&gt; from codes only where free currency changes a decision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One line on the beginner page: claim an unused Active code before spending premium currency — then point at the &lt;a href="https://www.100daysatsea.com/beginner-guide" rel="noopener noreferrer"&gt;early-build beginner guide&lt;/a&gt; for the spine that actually saves the first nights.&lt;/li&gt;
&lt;li&gt;One line on the walkthrough: do not stall a run inside the redeem UI — then return to the &lt;a href="https://www.100daysatsea.com/walkthrough" rel="noopener noreferrer"&gt;checkpoint walkthrough&lt;/a&gt; for phase order.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Never paste the full status table onto those pages. Duplication guarantees drift. One canonical codes URL; everyone else deep-links.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO that survives churn
&lt;/h2&gt;

&lt;p&gt;Head terms ("… codes October 2026") want a fresh checked date and an Active-only table above the fold. Long-tail terms ("why lists disagree", "contested vs expired", "code failed already used") want the method note and FAQ. Structure the HTML so both win:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H1 names the game + codes + month.&lt;/li&gt;
&lt;li&gt;First screen answers Active count in plain language.&lt;/li&gt;
&lt;li&gt;Tables for machines; paragraphs for disagreements.&lt;/li&gt;
&lt;li&gt;FAQ mirrors the angry search queries people type after a failed redeem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid doorway pages that only exist to host affiliate junk or "code generators." Those patterns get you short spikes and long bans — on search engines and in community trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  What good looks like after three months
&lt;/h2&gt;

&lt;p&gt;Checked date stays within one release cycle. Contested rows still exist (if everything is Active, the rubric is fake). Beginner and walkthrough pages each deep-link to codes once — not the other way around as a dumping ground. Analytics show codes traffic converting into beginner sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Seasonal promo codes are a status product with an ops loop: thin page, three-bucket rubric, checked timestamps, and deep links into beginner and walkthrough pages. Freshness is a process, not a vibe.&lt;/p&gt;

</description>
      <category>writing</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>Information Architecture for Beginner vs Walkthrough Pages</title>
      <dc:creator>dylan yu</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:50:10 +0000</pubDate>
      <link>https://dev.to/dylan_yu_7ffff00b5355942d/information-architecture-for-beginner-vs-walkthrough-pages-4173</link>
      <guid>https://dev.to/dylan_yu_7ffff00b5355942d/information-architecture-for-beginner-vs-walkthrough-pages-4173</guid>
      <description>&lt;p&gt;Fan wikis keep shipping the same mistake: one giant "guide" that tries to be Day 1, mid-game, and endgame at once. Readers bounce. Authors dread updates. Search engines cannot tell which intent the URL serves.&lt;/p&gt;

&lt;p&gt;The fix is boring and powerful. Split &lt;strong&gt;beginner&lt;/strong&gt; from &lt;strong&gt;walkthrough&lt;/strong&gt; as two products with different jobs, different tables, and different update cadences — then cross-link them on purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two jobs, two pages
&lt;/h2&gt;

&lt;p&gt;A beginner page answers: &lt;em&gt;what do I do in the first ten minutes so I do not wipe?&lt;/em&gt;&lt;br&gt;
A walkthrough page answers: &lt;em&gt;what are the checkpoints from stabilized start to the long milestone?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mixing those jobs produces a scroll of tips with no spine. Separating them lets each page own one question and one primary table.&lt;/p&gt;

&lt;p&gt;On a well-structured wiki you will see an &lt;a href="https://www.100daysatsea.com/beginner-guide" rel="noopener noreferrer"&gt;early-build beginner guide&lt;/a&gt; that leads with a priority-ordered craft table (Bonfire tier → production building → passive food → map unlock), and a separate &lt;a href="https://www.100daysatsea.com/walkthrough" rel="noopener noreferrer"&gt;checkpoint walkthrough&lt;/a&gt; that leads with phase rows (stabilize → raft spine → short loops → boss prep → long push). Same site, different contracts with the reader.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design the beginner page around executable order
&lt;/h2&gt;

&lt;p&gt;Beginner IA should optimize for &lt;em&gt;sequence&lt;/em&gt;, not lore.&lt;/p&gt;

&lt;p&gt;Useful blocks, in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Short answer&lt;/strong&gt; — one paragraph naming the spine builds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority table&lt;/strong&gt; — build / unlock, approximate cost, why it comes first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day-1 checklist&lt;/strong&gt; — numbered, boring, doable without a map.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threat callouts&lt;/strong&gt; — only the early killers that punish skipping the spine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where &lt;em&gt;not&lt;/em&gt; to go yet&lt;/strong&gt; — a hold list is as valuable as a go list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAQ&lt;/strong&gt; keyed to first-session anxiety (what first, how to survive night one).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Costs belong in the table as &lt;em&gt;community consensus&lt;/em&gt;, with an explicit "confirm in the craft menu" note. That single disclaimer keeps the page honest when patches move prices, and it teaches readers to trust the UI over any article — including yours.&lt;/p&gt;

&lt;p&gt;What does &lt;em&gt;not&lt;/em&gt; belong on the beginner page: full region lists, boss HP notes, or a Day-100 narrative. Those inflate the page and force weekly rewrites for content the early player will never reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design the walkthrough as a checkpoint map
&lt;/h2&gt;

&lt;p&gt;Walkthrough IA should optimize for &lt;em&gt;phases&lt;/em&gt;, not recipes.&lt;/p&gt;

&lt;p&gt;Useful blocks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Checkpoint table&lt;/strong&gt; — phase name, focus, do-this, skip-until-ready.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase path&lt;/strong&gt; — each row links to the chapter that owns the detail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Common wipe mistakes&lt;/strong&gt; — negative space that prevents cargo-culting a YouTube full run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAQ&lt;/strong&gt; about milestone timing, not Day-1 controls.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The walkthrough should &lt;em&gt;point at&lt;/em&gt; the beginner spine instead of duplicating craft costs. When both pages list the same Sawmill recipe, one of them will drift after a patch and the site looks unreliable. Single source of truth for costs; walkthrough owns sequencing across the whole run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-links that respect intent
&lt;/h2&gt;

&lt;p&gt;Linking is part of the architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Beginner → walkthrough when the raft is stable and the reader asks "what next?"&lt;/li&gt;
&lt;li&gt;Walkthrough → beginner for the Day-1 checklist and craft spine.&lt;/li&gt;
&lt;li&gt;Both → a &lt;a href="https://www.100daysatsea.com/codes" rel="noopener noreferrer"&gt;codes status page&lt;/a&gt; only where free currency actually changes early choices — usually a one-line aside, not a pasted table.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid homepage dumps. Deep links to the page that owns the answer keep bounce low and make analytics readable: if &lt;code&gt;/beginner-guide&lt;/code&gt; spikes after a patch that changed early unlocks, you know exactly which table to refresh.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update cadence follows the split
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page type&lt;/th&gt;
&lt;th&gt;Triggers a rewrite&lt;/th&gt;
&lt;th&gt;Usually leave alone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Beginner&lt;/td&gt;
&lt;td&gt;Craft costs, early unlock order, Day-1 threats&lt;/td&gt;
&lt;td&gt;Late-region notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Walkthrough&lt;/td&gt;
&lt;td&gt;Phase ordering, raid windows, milestone rules&lt;/td&gt;
&lt;td&gt;Exact recipe lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codes&lt;/td&gt;
&lt;td&gt;Source disagreement, new/expired strings&lt;/td&gt;
&lt;td&gt;Build order&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is content ops, not vibes. Smaller blast radius means you can ship a patch-day fix in twenty minutes instead of rewriting a 3,000-word mega-guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Naming and URL hygiene
&lt;/h2&gt;

&lt;p&gt;Name pages after the job: &lt;code&gt;/beginner-guide&lt;/code&gt;, &lt;code&gt;/walkthrough&lt;/code&gt;, &lt;code&gt;/codes&lt;/code&gt;. Avoid &lt;code&gt;/guide&lt;/code&gt; and &lt;code&gt;/tips&lt;/code&gt; — those collide in search and in the author's head. H1 should restate the job ("Early build order", "Checkpoints to Day 100") so both humans and crawlers know which intent won.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Beginner pages sell a first-session spine. Walkthrough pages sell a multi-phase map. Keep costs on one page, phases on the other, and use cross-links instead of copy-paste. The information architecture is the product; the tips are just cells in the tables.&lt;/p&gt;

</description>
      <category>writing</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
