<?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: Jessica Doering</title>
    <description>The latest articles on DEV Community by Jessica Doering (@sizzlebop).</description>
    <link>https://dev.to/sizzlebop</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%2F2676985%2Fa7882ab0-e15a-497b-9151-aeb4899fcc0f.png</url>
      <title>DEV Community: Jessica Doering</title>
      <link>https://dev.to/sizzlebop</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sizzlebop"/>
    <language>en</language>
    <item>
      <title>I Gave My AI Agents Their Own Documentation Crawler, and Pulled 60 Pages of Clean Markdown in 49 Seconds</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Mon, 05 Oct 2026 07:40:48 +0000</pubDate>
      <link>https://dev.to/sizzlebop/i-gave-my-ai-agents-their-own-documentation-crawler-and-pulled-60-pages-of-clean-markdown-in-49-2cl7</link>
      <guid>https://dev.to/sizzlebop/i-gave-my-ai-agents-their-own-documentation-crawler-and-pulled-60-pages-of-clean-markdown-in-49-2cl7</guid>
      <description>&lt;p&gt;It's not just that I made a crawler, but it's how the docs actually look that makes me love this so much.&lt;/p&gt;

&lt;p&gt;I made an MCP server this weekend, and I am kind of in awe of how well this thing works.&lt;/p&gt;

&lt;p&gt;It's called &lt;strong&gt;pulpie-mcp&lt;/strong&gt;, and the basic idea is pretty simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give AI coding agents their own tool for pulling full web pages and documentation into clean Markdown.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not summarized documentation. Not chopped-up search results. Not "here are the important parts I think you need."&lt;/p&gt;

&lt;p&gt;The actual content.&lt;/p&gt;

&lt;p&gt;Tables, links, images, code, headings, all turned into Markdown and saved somewhere the agent can use again later.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pinkpixel-dev" rel="noopener noreferrer"&gt;
        pinkpixel-dev
      &lt;/a&gt; / &lt;a href="https://github.com/pinkpixel-dev/pulpie-mcp" rel="noopener noreferrer"&gt;
        pulpie-mcp
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;pulpie-mcp&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/pinkpixel-dev/pulpie-mcp/pulpie.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpinkpixel-dev%2Fpulpie-mcp%2FHEAD%2Fpulpie.png" alt="pulpie-mcp"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An MCP server that gives AI agents their own tools for turning web pages into clean Markdown. It runs the &lt;a href="https://github.com/feyninc/pulpie" rel="noopener noreferrer"&gt;Pulpie&lt;/a&gt; content extraction model locally, so tables, code blocks, links, and images come through intact instead of getting summarized away.&lt;/p&gt;
&lt;p&gt;The agent can read a page inline, save it as a &lt;code&gt;.md&lt;/code&gt; file, crawl a whole docs section into a folder, and check what it already saved before fetching again.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why I made it&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;I already had a little local UI for Pulpie that I used to pull docs and articles into Markdown, and it works really well. But I was still the one doing the pulling. Most agent fetch tools run pages through a small model that summarizes or trims them, which is not what you want when the agent needs the actual API reference.&lt;/p&gt;
&lt;p&gt;So this gives the agent the same thing I was using. It can…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/pinkpixel-dev/pulpie-mcp" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  The test that kind of blew my mind
&lt;/h2&gt;

&lt;p&gt;I had Claude test &lt;code&gt;crawl_docs&lt;/code&gt; against a documentation site with &lt;strong&gt;60 pages&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The backend wasn't already running, so this included starting the server and loading the extraction model onto my GPU.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backend cold start&lt;/td&gt;
&lt;td&gt;~10s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crawling and saving 60 pages&lt;/td&gt;
&lt;td&gt;~37s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~49s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So in under a minute, Claude went from having none of those docs locally to having &lt;strong&gt;60 clean Markdown files&lt;/strong&gt; it could search, read, and reference.&lt;/p&gt;

&lt;p&gt;I just thought this was so awesome.&lt;/p&gt;

&lt;p&gt;And once the model is already loaded, obviously that initial ~10-second startup cost disappears.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;I've already been using &lt;a href="https://github.com/feyninc/pulpie" rel="noopener noreferrer"&gt;Pulpie&lt;/a&gt; locally to turn web pages into Markdown.&lt;/p&gt;

&lt;p&gt;It uses a small content extraction model rather than just grabbing the raw page or trying to summarize it, and I've been really impressed with the results.&lt;/p&gt;

&lt;p&gt;But there was one annoying part:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I was still the one pulling the documentation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If I wanted an agent to work with a library or framework, I might grab some docs, save them into the project, point the agent toward them, and then let it work.&lt;/p&gt;

&lt;p&gt;Which is fine.&lt;/p&gt;

&lt;p&gt;But also... why am &lt;em&gt;I&lt;/em&gt; doing that?&lt;/p&gt;

&lt;p&gt;The agent has MCP tools. It knows what documentation it needs. It knows what project it's working on.&lt;/p&gt;

&lt;p&gt;So I built an MCP server that lets it do the whole thing itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What pulpie-mcp gives the agent
&lt;/h2&gt;

&lt;p&gt;There are currently four tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fetch_markdown&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetch a page and return clean Markdown directly to the agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;save_markdown&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetch a page and save it as a Markdown file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;crawl_docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Crawl an entire documentation section and save it locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_library&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check which documentation has already been saved&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The distinction between fetching and saving turned out to be especially useful.&lt;/p&gt;

&lt;p&gt;Sometimes an agent just needs to quickly read one page.&lt;/p&gt;

&lt;p&gt;Other times I'm working on a project where I want it to pull an entire section of documentation and keep it around.&lt;/p&gt;

&lt;p&gt;For example, I can basically tell Claude:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pull the uv docs into this project's DOCS/reference folder.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it handles the rest.&lt;/p&gt;

&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do we already have the FastAPI docs saved somewhere?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No elaborate prompts required.&lt;/p&gt;

&lt;h2&gt;
  
  
  It doesn't shove 60 pages into the context window
&lt;/h2&gt;

&lt;p&gt;This part was important to me.&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;crawl_docs&lt;/code&gt; saves documentation, it doesn't return the contents of every page to the agent.&lt;/p&gt;

&lt;p&gt;That would be completely insane.&lt;/p&gt;

&lt;p&gt;Instead, the docs are written to disk and the agent gets useful metadata back. Each file also includes frontmatter with the source URL, title, and fetch time.&lt;/p&gt;

&lt;p&gt;So the agent can grab a whole documentation section once and then read only the files it actually needs.&lt;/p&gt;

&lt;p&gt;That turns the local filesystem into a pretty nice little documentation library.&lt;/p&gt;

&lt;p&gt;For project-specific docs, the agent can save them inside the project.&lt;/p&gt;

&lt;p&gt;For general research, pulpie-mcp has a global library at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.pulpie/library/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Crawling is actually fairly smart too
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;crawl_docs&lt;/code&gt; doesn't just blindly click every link it sees.&lt;/p&gt;

&lt;p&gt;It looks for sitemap information first:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;robots.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;a sitemap under the documentation path&lt;/li&gt;
&lt;li&gt;the site's root sitemap&lt;/li&gt;
&lt;li&gt;link crawling as a fallback&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It stays on the same host and underneath the documentation path you started with.&lt;/p&gt;

&lt;p&gt;There are four concurrent crawling workers, so network requests can overlap while extraction is happening.&lt;/p&gt;

&lt;p&gt;That's how it managed to tear through those 60 pages so quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model runs locally
&lt;/h2&gt;

&lt;p&gt;This is probably my favorite part.&lt;/p&gt;

&lt;p&gt;pulpie-mcp uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feyninc/pulpie-orange-small
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's only a &lt;strong&gt;210M parameter encoder model&lt;/strong&gt;, and on my machine it uses around &lt;strong&gt;420 MB of VRAM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The MCP process itself doesn't load PyTorch or the model.&lt;/p&gt;

&lt;p&gt;Instead, there's a tiny MCP server and a separate local backend.&lt;/p&gt;

&lt;p&gt;When the agent uses one of the tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent
  ↓
MCP server
  ↓
Local Pulpie backend
  ↓
Web page
  ↓
Clean Markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the backend isn't running yet, the MCP server starts it automatically.&lt;/p&gt;

&lt;p&gt;Once it's running, every agent session shares the same backend, so I don't end up with Claude, Codex, and whatever else I'm abusing that day each loading their own copy of the model.&lt;/p&gt;

&lt;p&gt;After 30 minutes without a request, it shuts itself down and releases the memory.&lt;/p&gt;

&lt;p&gt;That was one of those little implementation details that took this from "neat experiment" to something I can actually leave installed and forget about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding it to Claude Code
&lt;/h2&gt;

&lt;p&gt;Install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv tool &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/pinkpixel-dev/pulpie-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--scope&lt;/span&gt; user pulpie &lt;span class="nt"&gt;--&lt;/span&gt; pulpie-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's basically it.&lt;/p&gt;

&lt;p&gt;The first time it runs, the Pulpie model downloads from Hugging Face.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codex
&lt;/h2&gt;

&lt;p&gt;Add this to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.codex/config.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mcp_servers.pulpie]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"pulpie-mcp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And other MCP clients can use a normal MCP server configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  There are still some limitations
&lt;/h2&gt;

&lt;p&gt;I haven't come across any pages that haven't worked yet, but it's possible that some completely client-rendered pages could come back empty. And it doesn't handle PDFs.&lt;/p&gt;

&lt;p&gt;I've only personally tested it on Linux with NVIDIA/CUDA so far. &lt;/p&gt;

&lt;p&gt;There is also one license note: the pulpie-mcp code is Apache 2.0, but the &lt;code&gt;pulpie-orange-small&lt;/code&gt; model is licensed &lt;strong&gt;CC BY-NC 4.0&lt;/strong&gt;, so the model is for non-commercial use unless you arrange something different with its creator.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is exactly what I want MCP to be used for
&lt;/h2&gt;

&lt;p&gt;I think that's what has me so excited about this project.&lt;/p&gt;

&lt;p&gt;MCP gets discussed a lot in terms of connecting agents to giant services and APIs.&lt;/p&gt;

&lt;p&gt;But I really like this smaller category of MCP tools:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give the agent one very specific capability that removes a repetitive step from my workflow.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I used to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the documentation.&lt;/li&gt;
&lt;li&gt;Pull the relevant pages.&lt;/li&gt;
&lt;li&gt;Clean them up.&lt;/li&gt;
&lt;li&gt;Save them somewhere.&lt;/li&gt;
&lt;li&gt;Tell the coding agent where they are.&lt;/li&gt;
&lt;li&gt;Finally start working.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now I can basically say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Grab the docs you need and figure this out.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it does.&lt;/p&gt;

&lt;p&gt;Seeing it pull &lt;strong&gt;60 pages in about 49 seconds&lt;/strong&gt;, save them as clean Markdown, build an index, and then immediately start using them was one of those wonderful little:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Oh. Damn. This is actually really useful."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;moments.&lt;/p&gt;

&lt;p&gt;And those are my favorite kinds of projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/pinkpixel-dev/pulpie-mcp" rel="noopener noreferrer"&gt;pulpie-mcp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>I built my husband a vim trainer with a Gemma coach that runs in the browser</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Sun, 04 Oct 2026 05:16:41 +0000</pubDate>
      <link>https://dev.to/sizzlebop/i-built-my-husband-a-vim-trainer-with-a-gemma-coach-that-runs-in-the-browser-5fmh</link>
      <guid>https://dev.to/sizzlebop/i-built-my-husband-a-vim-trainer-with-a-gemma-coach-that-runs-in-the-browser-5fmh</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;A lot of my friends build their own tools. They hit a problem and just make the thing they want. I wanted to build something for someone else this time, and the answer was sitting right next to me.&lt;/p&gt;

&lt;p&gt;My husband has wanted to learn vim for a long time. He's tried a bunch of times, and it always ends the same way: he gives up. When I asked him why, it came down to two things. There are too many commands to memorize, and everything feels slow and awkward compared to what he's used to.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;hjkl&lt;/strong&gt;, a browser app that teaches vim in tiny drills.&lt;/p&gt;

&lt;p&gt;Each drill gives you a small buffer, a goal, and a keystroke "par" to beat. You solve it in a real vim editor, not a simulation. A few things I designed around his actual problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Only a few commands at a time.&lt;/strong&gt; Each lesson introduces a small set of commands, with a cheat sheet always on screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every command shows the VS Code habit it replaces.&lt;/strong&gt; &lt;code&gt;dd&lt;/code&gt; is Ctrl+Shift+K, &lt;code&gt;o&lt;/code&gt; is Ctrl+Enter, &lt;code&gt;ciw&lt;/code&gt; is roughly Ctrl+D and type. If there isn't a real equivalent (like &lt;code&gt;.&lt;/code&gt; or &lt;code&gt;f&lt;/code&gt;), it just says so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Par instead of pass/fail.&lt;/strong&gt; You always finish the drill. If you took the long way, you see the shorter answer right there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Review list.&lt;/strong&gt; Any drill you solved over par goes into Review, worst first, and drops off once you hit par. Those are exactly the commands that haven't stuck yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A full Vim reference.&lt;/strong&gt; The lesson cheat sheet only shows what you're currently learning, but there's also an All Commands reference with everything covered in the app. You can search it by key, action, or the VS Code shortcut you're used to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plain names under weird keys.&lt;/strong&gt; &lt;code&gt;&amp;lt;CR&amp;gt;&lt;/code&gt; shows "Enter" underneath and &lt;code&gt;&amp;lt;Esc&amp;gt;&lt;/code&gt; shows "Escape". I added this after I had to ask what &lt;code&gt;&amp;lt;CR&amp;gt;&lt;/code&gt; meant myself while testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Right now there are &lt;strong&gt;17 lessons and 124 hand-written drills&lt;/strong&gt;, starting with basic movement and insert mode and working up through text objects, counts and combos, search, visual mode, substitutions, macros, registers, and more.&lt;/p&gt;

&lt;p&gt;Then there's the AI part, which runs entirely in the browser.&lt;/p&gt;

&lt;p&gt;When I handed it over to him, he actually sat there and worked through it for a while, which felt like a pretty good sign considering every previous attempt at learning vim had ended with him giving up. He liked the short drills and being able to see the more efficient answer when he took the long way. More importantly, he kept going without me having to convince him to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://hjkl.pinkpixel.dev" rel="noopener noreferrer"&gt;https://hjkl.pinkpixel.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll want a desktop browser with a physical keyboard (vim on a phone keyboard is not a good time). The AI coach needs WebGPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pinkpixel-dev" rel="noopener noreferrer"&gt;
        pinkpixel-dev
      &lt;/a&gt; / &lt;a href="https://github.com/pinkpixel-dev/hjkl" rel="noopener noreferrer"&gt;
        hjkl
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/pinkpixel-dev/hjkl/main/hjkl.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpinkpixel-dev%2Fhjkl%2Fmain%2Fhjkl.png" alt="hjkl" width="400"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;hjkl is a browser app for learning vim through short drills. Each drill gives you a tiny buffer, a goal, and a keystroke par to beat, and you solve it in a real vim editor.&lt;/p&gt;

&lt;p&gt;I'm building it for my husband. He's tried to learn vim a few times, but it always ends the same way: too many commands to remember, and everything feels slow and awkward compared to what his hands already know. So instead of one long tutorial, hjkl teaches two or three commands at a time, shows the VS Code style habit each one replaces, and lets you practice until it sticks.&lt;/p&gt;

&lt;p&gt;Try it at &lt;strong&gt;&lt;a href="https://hjkl.pinkpixel.dev" rel="nofollow noopener noreferrer"&gt;https://hjkl.pinkpixel.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What's in it right now&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;17 lessons and 124 hand-written drills. They start with movement and insert mode, then work through word and line jumps, file jumps (&lt;code&gt;gg&lt;/code&gt;, &lt;code&gt;G&lt;/code&gt;, &lt;code&gt;%&lt;/code&gt;, &lt;code&gt;{&lt;/code&gt;/&lt;code&gt;}&lt;/code&gt;), small fixes (…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/pinkpixel-dev/hjkl" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The app itself is Vite and plain TypeScript, no framework. The editor is CodeMirror 6 with &lt;code&gt;@replit/codemirror-vim&lt;/code&gt;, so it's real vim behavior: motions, operators, text objects, dot-repeat, registers, search.&lt;/p&gt;
&lt;h3&gt;
  
  
  Every drill is checked in real vim
&lt;/h3&gt;

&lt;p&gt;Every drill has a reference solution, and par is just its length. The test suite runs every reference solution through the actual vim engine and checks that it really produces the goal. That turned out to matter a lot. My first pass had a few pars that couldn't be hit, and the tests caught them immediately. There are 182 tests now.&lt;/p&gt;

&lt;p&gt;It also caught some fun bugs. My favorite: search drills worked fine on their own but broke after pressing Next. The vim plugin keeps search history and jump positions globally, so the second search tried to jump to a position from the previous, longer buffer and crashed. Now vim's global state resets for every drill.&lt;/p&gt;
&lt;h3&gt;
  
  
  The coach: Gemma running on your GPU
&lt;/h3&gt;

&lt;p&gt;The AI coach is optional and off by default. When you turn it on, it downloads &lt;strong&gt;Gemma 4 E2B&lt;/strong&gt; once and runs it in a Web Worker on WebGPU with &lt;strong&gt;Transformers.js&lt;/strong&gt;. Your keystrokes and prompts never leave the browser. The model files come from Hugging Face, and after that everything is local.&lt;/p&gt;

&lt;p&gt;A few details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It loads Gemma 4 through the text-only path, so it only downloads the text model and skips the vision and audio encoders.&lt;/li&gt;
&lt;li&gt;It uses &lt;code&gt;q4f16&lt;/code&gt; when the GPU supports fp16 shaders and falls back to &lt;code&gt;q4&lt;/code&gt; otherwise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 1B&lt;/strong&gt; is there as a lighter option you can switch to without turning the coach off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On my machine, Gemma 4 E2B writes about 6 to 7 tokens a second, so a one-sentence explanation takes a few seconds. Gemma 3 1B is faster (about 10 tokens a second), but when I tested both on the same drills, 1B kept getting the commands wrong, and once it just greeted him instead of giving feedback. So Gemma 4 is the default.&lt;/p&gt;

&lt;p&gt;The coach does two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;After an over-par solve&lt;/strong&gt;, it explains what the shorter answer does differently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Hint button&lt;/strong&gt; nudges you toward the right command without giving away the whole sequence.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Getting the feedback accurate took some work. My first version sent the model the raw keystrokes, and after a drill solved with &lt;code&gt;x&lt;/code&gt; seven times, it confidently told him he'd used &lt;code&gt;dd&lt;/code&gt;. A small model reading &lt;code&gt;xxxxxxx&lt;/code&gt; doesn't really see seven presses of one key.&lt;/p&gt;

&lt;p&gt;The fix was to stop making the model parse vim. Before the keys go into the prompt, the app groups them the way vim reads them and labels each one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x ×7 (delete character)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of &lt;code&gt;xxxxxxx&lt;/code&gt;, and&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cw (change to word end), typed "blue", &amp;lt;Esc&amp;gt; (back to normal mode)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of &lt;code&gt;cwblue&amp;lt;Esc&amp;gt;&lt;/code&gt;. After that change, all of my test cases came back accurate, like: "&lt;code&gt;dw&lt;/code&gt; deletes the word under the cursor, which is much faster than deleting each character individually."&lt;/p&gt;

&lt;h3&gt;
  
  
  AI-generated drills
&lt;/h3&gt;

&lt;p&gt;The part I'm happiest with is the &lt;strong&gt;5 more&lt;/strong&gt; button on each lesson.&lt;/p&gt;

&lt;p&gt;My first attempt let Gemma write whole drills: the text, the starting cursor, the solution keys. Only 2 of 12 drafts survived validation. The rest had missing cursor marks, keys that didn't do what the instruction said, or text glued onto other words. I kept adding filters and kept finding new kinds of mistakes.&lt;/p&gt;

&lt;p&gt;So I split the job up based on what each side is good at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma writes a short snippet&lt;/strong&gt; of text (a SQL query, a shopping list, a CSS rule), plus a short instruction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The app supplies the keys&lt;/strong&gt; by reusing the key patterns from that lesson's hand-written drills on the new text. Then it plays them in real vim to get the goal and par.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The instruction gets checked.&lt;/strong&gt; If Gemma's wording doesn't name what actually changes, the app swaps in a plain one like &lt;code&gt;Change "milk" to "eggs"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now every batch keeps 5 out of 5, in about 15 seconds. Every generated drill is solvable at par, because the app played it before showing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying
&lt;/h3&gt;

&lt;p&gt;It's a static site on Cloudflare Workers static assets. The only wrinkle was ONNX Runtime's wasm file, which is about 27 MB, over Cloudflare's 25 MiB per-file limit. Transformers.js already loads it from jsDelivr pinned to the exact version, so I just left it out of the build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;For this project it's pretty concrete. An open-weight model is the reason the coach can run in his browser at all.&lt;/p&gt;

&lt;p&gt;With a closed API, every hint and every generated drill would be a paid request, plus a server and an API key to manage. For a gift that's supposed to stick around, that's a bad fit. Running Gemma locally means it costs nothing per use, it works without an account, and his keystrokes and mistakes stay on his machine.&lt;/p&gt;

&lt;p&gt;It also means I could do things a hosted API would make awkward. I picked a model size that fits a laptop GPU, compared two Gemma models side by side on the same drills, and swapped between them with one click. The rest of the stack is open too: Transformers.js, ONNX Runtime Web, CodeMirror, and the vim plugin that made "use real vim" possible in the first place.&lt;/p&gt;

&lt;p&gt;If I keep working on it, I’d like to add more lessons and keep improving the generated drills, but I also want to see what happens after he’s used it for a while. The whole point was to build something around the way one actual person was struggling to learn, so whether it really helps those commands stick is probably the best test I could give it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gemma&lt;/strong&gt;: the coach and the AI drill generator both run Gemma 4 E2B locally in the browser through Transformers.js on WebGPU, with Gemma 3 1B as a lighter option.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Turn Your GitHub Contribution Graph Into an ASCII City</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Sat, 03 Oct 2026 18:26:18 +0000</pubDate>
      <link>https://dev.to/sizzlebop/turn-your-github-contribution-graph-into-an-ascii-city-ic5</link>
      <guid>https://dev.to/sizzlebop/turn-your-github-contribution-graph-into-an-ascii-city-ic5</guid>
      <description>&lt;p&gt;I decided that a normal GitHub contribution graph is not enough.&lt;/p&gt;

&lt;p&gt;So I turned mine into a city.&lt;/p&gt;

&lt;p&gt;And I wanted to share it so you can too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9pyv8h69hfi2wfpal6gj.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%2F9pyv8h69hfi2wfpal6gj.png" alt="Skyline" width="799" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I made &lt;strong&gt;&lt;a href="https://github.com/pinkpixel-dev/skyline" rel="noopener noreferrer"&gt;Skyline&lt;/a&gt;&lt;/strong&gt;, a small Go CLI that takes your GitHub contribution history and turns it into an ASCII city.&lt;/p&gt;

&lt;p&gt;Each week becomes a building.&lt;/p&gt;

&lt;p&gt;Each day becomes a window.&lt;/p&gt;

&lt;p&gt;If you contributed that day, the window lights up. Busier days get brighter colors, your biggest week gets a little antenna, and the whole thing ends up looking like a tiny city built from your coding activity.&lt;/p&gt;

&lt;p&gt;It can render directly in your terminal, but my favorite part is that it can also generate an animated SVG for your GitHub profile README.&lt;/p&gt;

&lt;p&gt;I mean my GitHub profile definitely needed infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The contribution graph maps surprisingly well to a skyline.&lt;/p&gt;

&lt;p&gt;Each building represents one week of activity, and the height is based on the total contributions from that week.&lt;/p&gt;

&lt;p&gt;The windows represent the seven days inside it.&lt;/p&gt;

&lt;p&gt;A day with no activity stays dark:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A day with contributions lights up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;▪
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The color intensity follows GitHub's contribution levels, so more active days get brighter windows.&lt;/p&gt;

&lt;p&gt;There are also a few purely decorative bits because I couldn't resist.&lt;/p&gt;

&lt;p&gt;Stars are scattered through the sky, some windows flicker in the SVG version, and the brightest stars twinkle.&lt;/p&gt;

&lt;p&gt;The animations are deterministic, so regenerating the same contribution data doesn't completely rearrange your city every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  There are themes of course
&lt;/h2&gt;

&lt;p&gt;I started with neon and then immediately did the completely predictable thing and added more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fklv1tl9ijktsxjf7y4xn.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%2Fklv1tl9ijktsxjf7y4xn.png" alt="Skyline themes" width="552" height="3264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are currently 12:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;neon&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;synthwave&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;matrix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;amber&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ice&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sunset&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toxic&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vapor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crimson&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mono&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prism&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rainbow&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can preview them right in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;skyline &lt;span class="nt"&gt;-themes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And choose one with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;skyline &lt;span class="nt"&gt;-theme&lt;/span&gt; synthwave your-username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Personally, I am incapable of making terminal software without eventually adding neon colors to it, so this was inevitable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running it locally
&lt;/h2&gt;

&lt;p&gt;You'll need Go 1.25 or newer.&lt;/p&gt;

&lt;p&gt;Install Skyline with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/pinkpixel-dev/skyline@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;skyline your-username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skyline needs access to the GitHub API, but it tries to make authentication fairly painless.&lt;/p&gt;

&lt;p&gt;It checks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GITHUB_TOKEN
GH_TOKEN
gh auth token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So if you're already authenticated with the GitHub CLI, there's a good chance you don't need to configure anything else.&lt;/p&gt;

&lt;p&gt;The full city is 106 columns wide. If your terminal is a little less enthusiastic about this arrangement, you can render fewer weeks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;skyline &lt;span class="nt"&gt;-weeks&lt;/span&gt; 30 your-username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also change the maximum building height:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;skyline &lt;span class="nt"&gt;-height&lt;/span&gt; 10 your-username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Generating the SVG
&lt;/h2&gt;

&lt;p&gt;To create the version you can use on a website or GitHub profile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;skyline &lt;span class="nt"&gt;-svg&lt;/span&gt; skyline.svg your-username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or combine options:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;skyline &lt;span class="nt"&gt;-theme&lt;/span&gt; prism &lt;span class="nt"&gt;-svg&lt;/span&gt; skyline.svg your-username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That generates the animated SVG version instead of printing the city to the terminal.&lt;/p&gt;

&lt;p&gt;The animation also respects &lt;code&gt;prefers-reduced-motion&lt;/code&gt;, so it stays static for anyone who has reduced motion enabled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting it on your GitHub profile
&lt;/h2&gt;

&lt;p&gt;This is probably my favorite use for it.&lt;/p&gt;

&lt;p&gt;You can have GitHub Actions regenerate your city automatically every night so your skyline changes along with your contribution graph.&lt;/p&gt;

&lt;p&gt;Your GitHub profile README lives in a repository with the same name as your username:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;github.com/your-username/your-username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside that repository, create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.github/workflows/skyline.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;skyline&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;17&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;skyline&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-go@v7&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;go-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stable&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Draw skyline&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SKYLINE_TOKEN || secrets.GITHUB_TOKEN }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go run github.com/pinkpixel-dev/skyline@latest -theme neon -svg skyline.svg "${{ github.repository_owner }}"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish to output branch&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;mkdir out &amp;amp;&amp;amp; mv skyline.svg out/ &amp;amp;&amp;amp; cd out&lt;/span&gt;
          &lt;span class="s"&gt;git init -q -b output&lt;/span&gt;
          &lt;span class="s"&gt;git add skyline.svg&lt;/span&gt;
          &lt;span class="s"&gt;git -c user.name="github-actions[bot]" \&lt;/span&gt;
              &lt;span class="s"&gt;-c user.email="41898282+github-actions[bot]@users.noreply.github.com" \&lt;/span&gt;
              &lt;span class="s"&gt;commit -qm "Update skyline"&lt;/span&gt;
          &lt;span class="s"&gt;git push -qf "https://x-access-token:${TOKEN}@github.com/${{ github.repository }}.git" output&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can swap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-theme neon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for whichever theme you want.&lt;/p&gt;

&lt;p&gt;Commit the workflow, open the &lt;strong&gt;Actions&lt;/strong&gt; tab on GitHub, and run the &lt;code&gt;skyline&lt;/code&gt; workflow manually once.&lt;/p&gt;

&lt;p&gt;That creates the &lt;code&gt;output&lt;/code&gt; branch containing &lt;code&gt;skyline.svg&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then add this to your profile README:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;My skyline&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://raw.githubusercontent.com/YOUR-USERNAME/YOUR-USERNAME/output/skyline.svg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;YOUR-USERNAME&lt;/code&gt; with your actual GitHub username.&lt;/p&gt;

&lt;p&gt;After that, the workflow redraws it automatically every night.&lt;/p&gt;

&lt;p&gt;The generated SVG lives on the separate &lt;code&gt;output&lt;/code&gt; branch, so you also don't end up with a year's worth of &lt;code&gt;"update skyline"&lt;/code&gt; commits cluttering the main branch of your profile repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about private contributions?
&lt;/h2&gt;

&lt;p&gt;The workflow uses GitHub's built-in Actions token by default.&lt;/p&gt;

&lt;p&gt;Depending on what contribution data GitHub exposes through that token, you might notice that your skyline looks a little emptier than the contribution graph you see while logged in.&lt;/p&gt;

&lt;p&gt;If that happens, you can create a classic personal access token with the &lt;code&gt;read:user&lt;/code&gt; scope and add it to the profile repository as a secret named:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SKYLINE_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow will automatically use that instead when it's available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unnecessary?
&lt;/h2&gt;

&lt;p&gt;I suppose. But it's fun.&lt;/p&gt;

&lt;p&gt;Why not take the data we already look at constantly and turn it into something a little more interesting? Contribution graphs are useful, but seeing an entire year transformed into this little glowing city makes it feel much more personal.&lt;/p&gt;

&lt;p&gt;And because it's just an SVG, once the Action is configured there really isn't anything else to maintain. Your skyline just keeps changing as you work.&lt;/p&gt;

&lt;p&gt;So yeah,  you make one for your profile, I'd genuinely love to see it!&lt;/p&gt;

&lt;p&gt;The project is open source here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/pinkpixel-dev/skyline" rel="noopener noreferrer"&gt;github.com/pinkpixel-dev/skyline&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>go</category>
      <category>showdev</category>
    </item>
    <item>
      <title>AI Coding Has Made Project-Switching Way Too Easy</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Sat, 03 Oct 2026 01:16:40 +0000</pubDate>
      <link>https://dev.to/sizzlebop/ai-coding-has-made-project-switching-way-too-easy-1bef</link>
      <guid>https://dev.to/sizzlebop/ai-coding-has-made-project-switching-way-too-easy-1bef</guid>
      <description>&lt;p&gt;I have a problem.&lt;/p&gt;

&lt;p&gt;Actually, I have 84 public GitHub repositories.&lt;/p&gt;

&lt;p&gt;I checked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eighty-four.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that's just the public ones.&lt;/p&gt;

&lt;p&gt;To be fair, they aren't all active projects. Some are old. Some are experiments. Some are tiny tools. Some have been abandoned, resurrected, renamed, rebuilt, or replaced by another project that I apparently decided absolutely needed to exist.&lt;/p&gt;

&lt;p&gt;But still.&lt;/p&gt;

&lt;p&gt;84.&lt;/p&gt;

&lt;p&gt;I have always been the kind of person who gets excited about a new idea before I've finished the last one. AI coding tools did not create that problem.&lt;/p&gt;

&lt;p&gt;They did, however, remove basically every obstacle that used to keep it under control.&lt;/p&gt;

&lt;h2&gt;
  
  
  It used to be harder to start something
&lt;/h2&gt;

&lt;p&gt;Not necessarily &lt;em&gt;hard&lt;/em&gt;, but there was friction.&lt;/p&gt;

&lt;p&gt;You'd have an idea.&lt;/p&gt;

&lt;p&gt;Maybe you'd think about it for a while. Research a library. Read some documentation. Figure out how you wanted to structure it. Decide whether learning an unfamiliar framework was worth the trouble.&lt;/p&gt;

&lt;p&gt;Sometimes somewhere in that process you'd realize:&lt;/p&gt;

&lt;p&gt;You know what? I don't actually care enough about this.&lt;/p&gt;

&lt;p&gt;And that was probably healthy.&lt;/p&gt;

&lt;p&gt;Now I can have a thought like:&lt;/p&gt;

&lt;p&gt;It would be cool if there were a terminal MIDI player.&lt;/p&gt;

&lt;p&gt;And ten minutes later I have a Rust project, a Ratatui interface, MIDI playback partially working, a name, a logo idea, and opinions about the layout.&lt;/p&gt;

&lt;p&gt;The responsible part of my brain never even got a meeting invite.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI destroyed the activation energy
&lt;/h2&gt;

&lt;p&gt;This might be one of the biggest ways AI coding tools have changed how I build software.&lt;/p&gt;

&lt;p&gt;They didn't just make programming faster.&lt;/p&gt;

&lt;p&gt;They made &lt;strong&gt;starting&lt;/strong&gt; dramatically easier.&lt;/p&gt;

&lt;p&gt;A new language isn't as intimidating because I can ask questions while I work.&lt;/p&gt;

&lt;p&gt;An unfamiliar library isn't a weekend of documentation before I can touch anything.&lt;/p&gt;

&lt;p&gt;Boilerplate barely matters.&lt;/p&gt;

&lt;p&gt;I don't have to remember the exact configuration for every framework I've ever used.&lt;/p&gt;

&lt;p&gt;If I want to know whether some weird idea is technically possible, I don't necessarily have to spend three hours researching it first.&lt;/p&gt;

&lt;p&gt;I can just try it.&lt;/p&gt;

&lt;p&gt;And honestly, that's pretty incredible.&lt;/p&gt;

&lt;p&gt;I've built things with Rust that I probably wouldn't have touched yet otherwise. I've experimented with terminal UIs, local AI models, MCP servers, desktop apps, browser APIs, image tools, audio tools, little utilities, developer tools, and an unreasonable assortment of other things.&lt;/p&gt;

&lt;p&gt;Some became real projects.&lt;/p&gt;

&lt;p&gt;Some taught me something useful.&lt;/p&gt;

&lt;p&gt;Some lasted approximately one evening.&lt;/p&gt;

&lt;p&gt;I don't think any of that time was wasted.&lt;/p&gt;

&lt;p&gt;But there is definitely a side effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every idea can become a project now
&lt;/h2&gt;

&lt;p&gt;This is where things get dangerous for people like me.&lt;/p&gt;

&lt;p&gt;Previously, there was a natural filter between:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"That would be neat."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I'm building that."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI has made that filter extremely thin.&lt;/p&gt;

&lt;p&gt;Sometimes nonexistent.&lt;/p&gt;

&lt;p&gt;I'll be working on one project and run into a tiny annoyance.&lt;/p&gt;

&lt;p&gt;That annoyance gives me an idea for a tool.&lt;/p&gt;

&lt;p&gt;I ask an AI coding agent whether the idea would work.&lt;/p&gt;

&lt;p&gt;It says yes.&lt;/p&gt;

&lt;p&gt;Obviously this is unacceptable.&lt;/p&gt;

&lt;p&gt;Now I need to build it.&lt;/p&gt;

&lt;p&gt;Two hours later the original project is sitting abandoned in another terminal tab wondering where I went.&lt;/p&gt;

&lt;p&gt;It's not even always a big idea.&lt;/p&gt;

&lt;p&gt;Sometimes it's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I wish this command did one extra thing.&lt;/li&gt;
&lt;li&gt;It would be nice if I had a little UI for this.&lt;/li&gt;
&lt;li&gt;Why doesn't this tool show this information?&lt;/li&gt;
&lt;li&gt;I bet I could make this work in the terminal.&lt;/li&gt;
&lt;li&gt;What if this accepted pasted images directly?&lt;/li&gt;
&lt;li&gt;Could I make this local instead?&lt;/li&gt;
&lt;li&gt;I wonder if this model would run in the browser.&lt;/li&gt;
&lt;li&gt;This existing tool is almost what I want, except...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is particularly dangerous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Except.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nothing has generated more repositories on my GitHub account than "this is almost what I want, except..."&lt;/p&gt;

&lt;h2&gt;
  
  
  Prototyping has become ridiculously cheap
&lt;/h2&gt;

&lt;p&gt;And I mean cheap in more than just money.&lt;/p&gt;

&lt;p&gt;The cost in time, effort, and mental energy has dropped.&lt;/p&gt;

&lt;p&gt;I can test an idea before I've fully committed to it.&lt;/p&gt;

&lt;p&gt;That's a huge advantage.&lt;/p&gt;

&lt;p&gt;There are projects I've started where I realized pretty quickly that the idea wasn't as interesting as I thought. In the past, I might have spent days figuring that out.&lt;/p&gt;

&lt;p&gt;Now I can sometimes figure it out in an hour.&lt;/p&gt;

&lt;p&gt;Delete it. Archive it. Move on.&lt;/p&gt;

&lt;p&gt;That's not failure.&lt;/p&gt;

&lt;p&gt;That's a prototype doing its job.&lt;/p&gt;

&lt;p&gt;The problem is that the exact same thing also makes it very easy to chase the next shiny idea.&lt;/p&gt;

&lt;p&gt;And the next one.&lt;/p&gt;

&lt;p&gt;And the one after that.&lt;/p&gt;

&lt;p&gt;AI makes getting from 0% to 30% incredibly fast.&lt;/p&gt;

&lt;p&gt;Unfortunately, 30% is also right around where another idea starts looking very exciting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting and finishing are completely different skills
&lt;/h2&gt;

&lt;p&gt;This is the part AI hasn't magically solved.&lt;/p&gt;

&lt;p&gt;Starting a project is exciting.&lt;/p&gt;

&lt;p&gt;You're creating everything from scratch. Every hour produces something visible. The architecture is clean because you haven't had enough time to ruin it yet. There are no users. There are no weird edge cases. Nobody has opened an issue explaining that your perfectly reasonable code breaks when their username contains an emoji and they're running Linux on a refrigerator.&lt;/p&gt;

&lt;p&gt;Everything is possibility.&lt;/p&gt;

&lt;p&gt;Finishing is different.&lt;/p&gt;

&lt;p&gt;Finishing means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fixing boring bugs&lt;/li&gt;
&lt;li&gt;handling edge cases&lt;/li&gt;
&lt;li&gt;writing documentation&lt;/li&gt;
&lt;li&gt;testing things you already thought worked&lt;/li&gt;
&lt;li&gt;cleaning up shortcuts you took during the prototype&lt;/li&gt;
&lt;li&gt;packaging&lt;/li&gt;
&lt;li&gt;deployment&lt;/li&gt;
&lt;li&gt;accessibility&lt;/li&gt;
&lt;li&gt;updating dependencies&lt;/li&gt;
&lt;li&gt;realizing the feature you added three weeks ago broke something completely unrelated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI can help with all of that.&lt;/p&gt;

&lt;p&gt;But it doesn't make that stage feel like a shiny new project.&lt;/p&gt;

&lt;p&gt;And that's the actual trap.&lt;/p&gt;

&lt;p&gt;When starting becomes nearly frictionless, &lt;strong&gt;finishing has more competition than it ever did before.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  But I don't actually want the friction back
&lt;/h2&gt;

&lt;p&gt;This is the weird part.&lt;/p&gt;

&lt;p&gt;I don't think the solution is to force myself to stop starting things.&lt;/p&gt;

&lt;p&gt;I like experimenting.&lt;/p&gt;

&lt;p&gt;A lot.&lt;/p&gt;

&lt;p&gt;Some of the most useful things I've learned came from projects I had absolutely no business starting.&lt;/p&gt;

&lt;p&gt;Sometimes I'll build something mostly because I want to learn a library.&lt;/p&gt;

&lt;p&gt;Sometimes I want to see whether an idea works.&lt;/p&gt;

&lt;p&gt;Sometimes existing software annoys me.&lt;/p&gt;

&lt;p&gt;Sometimes I just think something would be fun.&lt;/p&gt;

&lt;p&gt;Not every repository needs to become a product.&lt;/p&gt;

&lt;p&gt;Not every side project needs users.&lt;/p&gt;

&lt;p&gt;Not everything needs a roadmap, monetization strategy, launch plan, or compelling answer to "What problem does this solve?"&lt;/p&gt;

&lt;p&gt;Sometimes the answer is:&lt;/p&gt;

&lt;p&gt;I wanted to see if I could make it.&lt;/p&gt;

&lt;p&gt;That's still one of my favorite reasons to program.&lt;/p&gt;

&lt;p&gt;AI has made that kind of experimentation ridiculously accessible.&lt;/p&gt;

&lt;p&gt;I don't want to lose that.&lt;/p&gt;

&lt;p&gt;I just need to occasionally remember that GitHub also allows you to work on repositories that already exist.&lt;/p&gt;

&lt;p&gt;Apparently.&lt;/p&gt;

&lt;h2&gt;
  
  
  I'm trying to separate experiments from commitments
&lt;/h2&gt;

&lt;p&gt;The distinction I've started thinking about more is whether I'm &lt;strong&gt;exploring an idea&lt;/strong&gt; or &lt;strong&gt;starting a project&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Those don't have to mean the same thing.&lt;/p&gt;

&lt;p&gt;I can spend an evening testing some strange concept without mentally adding it to my collection of Things I Must Finish Someday.&lt;/p&gt;

&lt;p&gt;That's harder than it sounds.&lt;/p&gt;

&lt;p&gt;Especially when you've already named it.&lt;/p&gt;

&lt;p&gt;Naming it is usually where I'm screwed.&lt;/p&gt;

&lt;p&gt;Once it has a cute name and an icon, we're in dangerous territory.&lt;/p&gt;

&lt;p&gt;But I think there's something useful about allowing yourself to prototype freely while being more selective about what gets promoted into an actual ongoing project.&lt;/p&gt;

&lt;p&gt;Maybe the experiment taught me what I wanted to know.&lt;/p&gt;

&lt;p&gt;Maybe the idea isn't strong enough.&lt;/p&gt;

&lt;p&gt;Maybe another project already solves it.&lt;/p&gt;

&lt;p&gt;Maybe it's fun enough to continue.&lt;/p&gt;

&lt;p&gt;Maybe I open the repo three days later and immediately think:&lt;/p&gt;

&lt;p&gt;Oh hell yes. I still want this.&lt;/p&gt;

&lt;p&gt;That's probably a better signal than the initial burst of excitement.&lt;/p&gt;

&lt;h2&gt;
  
  
  This might be one of AI coding's strangest effects
&lt;/h2&gt;

&lt;p&gt;We talk constantly about whether AI makes developers more productive.&lt;/p&gt;

&lt;p&gt;How much faster can it write code?&lt;/p&gt;

&lt;p&gt;How many tasks can an agent complete?&lt;/p&gt;

&lt;p&gt;Which model gets the highest score?&lt;/p&gt;

&lt;p&gt;Those things matter.&lt;/p&gt;

&lt;p&gt;But I think there's another effect that's harder to measure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI changes what we're willing to try.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ideas that previously weren't worth the setup cost suddenly are.&lt;/p&gt;

&lt;p&gt;Technologies that felt too unfamiliar become approachable.&lt;/p&gt;

&lt;p&gt;Tiny personal tools become worth building.&lt;/p&gt;

&lt;p&gt;Ridiculous experiments become a Tuesday night.&lt;/p&gt;

&lt;p&gt;The distance between curiosity and working code has gotten incredibly short.&lt;/p&gt;

&lt;p&gt;For developers who already suffer from chronic "I could build that" syndrome, this is both wonderful and absolutely terrible.&lt;/p&gt;

&lt;p&gt;I have learned more because of it.&lt;/p&gt;

&lt;p&gt;I've tried things I wouldn't have tried before.&lt;/p&gt;

&lt;p&gt;I've built tools I genuinely use.&lt;/p&gt;

&lt;p&gt;I've also accumulated enough repositories that GitHub probably thinks I'm several people.&lt;/p&gt;

&lt;p&gt;So no, I don't think AI made me a chronic project starter.&lt;/p&gt;

&lt;p&gt;I was perfectly capable of doing that myself.&lt;/p&gt;

&lt;p&gt;It just gave me a much faster shovel.&lt;/p&gt;

&lt;p&gt;And apparently I have been digging.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Managing the Hidden Overhead of AI Software Engineering</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Tue, 22 Sep 2026 04:43:03 +0000</pubDate>
      <link>https://dev.to/sizzlebop/managing-the-hidden-overhead-of-ai-software-engineering-179a</link>
      <guid>https://dev.to/sizzlebop/managing-the-hidden-overhead-of-ai-software-engineering-179a</guid>
      <description>&lt;p&gt;There is a scene that is becoming more and more common in software development right now.&lt;/p&gt;

&lt;p&gt;You have one AI coding agent refactoring something.&lt;/p&gt;

&lt;p&gt;Another one is writing tests.&lt;/p&gt;

&lt;p&gt;A third is handling some annoying migration you did not want to touch yourself.&lt;/p&gt;

&lt;p&gt;You are bouncing between terminals, checking progress, answering questions, approving changes, and generally supervising a tiny army of extremely enthusiastic robot developers.&lt;/p&gt;

&lt;p&gt;And then the thought hits you:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I could open another terminal.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I have absolutely done this.&lt;/p&gt;

&lt;p&gt;The problem is not that running multiple agents is automatically bad. Parallel work can be incredibly useful. The problem is that the second AI gives us more capacity, our first instinct is often to immediately fill that capacity with even more AI work.&lt;/p&gt;

&lt;p&gt;Instead of asking, “What should I do with the time this just gave me?” we ask, “How much more stuff can I cram into this workflow?”&lt;/p&gt;

&lt;p&gt;That works for a while.&lt;/p&gt;

&lt;p&gt;Then things start getting weird.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Coding Tools Really Do Make You Faster
&lt;/h2&gt;

&lt;p&gt;I do not think there is much point pretending otherwise.&lt;/p&gt;

&lt;p&gt;AI coding tools can make development dramatically faster, especially for certain kinds of work.&lt;/p&gt;

&lt;p&gt;Boilerplate that used to take half an hour can appear in seconds. Setting up basic project scaffolding is almost trivial. Stupid syntax mistakes disappear faster. Tests, utility functions, repetitive components, documentation, migrations, and all kinds of boring little tasks can be delegated.&lt;/p&gt;

&lt;p&gt;So naturally, developers start doing more.&lt;/p&gt;

&lt;p&gt;That feature you were going to put off until next week? Might as well do it now.&lt;/p&gt;

&lt;p&gt;That weird side project idea? Fire up another agent.&lt;/p&gt;

&lt;p&gt;That one annoying task nobody wants to do? Toss it at the AI.&lt;/p&gt;

&lt;p&gt;Suddenly the amount of work you can &lt;em&gt;start&lt;/em&gt; feels almost unlimited.&lt;/p&gt;

&lt;p&gt;The amount of work you can actually understand, review, and maintain is another story.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed Creates Its Own Problems
&lt;/h2&gt;

&lt;p&gt;If you generate code five times faster, you can also lose track of what the hell is happening five times faster.&lt;/p&gt;

&lt;p&gt;One of the strangest signs of this is when you find yourself reading an AI-generated summary of a change just to remember what your own project is doing.&lt;/p&gt;

&lt;p&gt;I have caught myself doing this.&lt;/p&gt;

&lt;p&gt;The agent finishes some task, gives me a neat little summary, and I am reading it thinking, “Oh right. That is what we were changing.”&lt;/p&gt;

&lt;p&gt;That is probably not a great sign.&lt;/p&gt;

&lt;p&gt;At that point, you are no longer really engineering the system. You are managing a queue of things being engineered around you.&lt;/p&gt;

&lt;p&gt;And that becomes dangerous when the mistake is not obvious.&lt;/p&gt;

&lt;p&gt;Imagine you ask an agent to implement a permission system.&lt;/p&gt;

&lt;p&gt;The code looks clean.&lt;/p&gt;

&lt;p&gt;The naming matches the rest of the project.&lt;/p&gt;

&lt;p&gt;The tests pass.&lt;/p&gt;

&lt;p&gt;Nothing immediately looks broken, so you approve it and move on.&lt;/p&gt;

&lt;p&gt;Except maybe your prompt never clearly defined how restrictive the permissions were supposed to be. The model filled in the missing details itself and chose something more permissive than you intended.&lt;/p&gt;

&lt;p&gt;The tests still pass because they only verify that permissions work.&lt;/p&gt;

&lt;p&gt;They do not verify that the permissions match the security model you had in your head.&lt;/p&gt;

&lt;p&gt;That distinction matters a lot:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passing tests does not automatically mean the software is doing what you actually intended.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Did Not Remove the Bottleneck
&lt;/h2&gt;

&lt;p&gt;It moved it.&lt;/p&gt;

&lt;p&gt;For a long time, one of the slowest parts of programming was simply turning an idea into working code.&lt;/p&gt;

&lt;p&gt;You had to write the implementation yourself, debug it, fix syntax errors, wire everything together, and slowly turn the design into something executable.&lt;/p&gt;

&lt;p&gt;AI can now blast through a lot of that work.&lt;/p&gt;

&lt;p&gt;Great.&lt;/p&gt;

&lt;p&gt;But now we have a different bottleneck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding and verification.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The faster code gets generated, the more code somebody has to review.&lt;/p&gt;

&lt;p&gt;And generated code still needs review.&lt;/p&gt;

&lt;p&gt;Heavy AI adoption among developers correlates with significantly longer PR review times. That makes sense. If everyone suddenly starts producing dramatically more code, human review capacity does not magically increase along with it.&lt;/p&gt;

&lt;p&gt;This gets even more interesting with experienced developers working in large, complicated codebases.&lt;/p&gt;

&lt;p&gt;AI can feel faster because you are typing less, while actually making the overall task slower because you now have to carefully inspect a bunch of generated code interacting with years of existing architecture.&lt;/p&gt;

&lt;p&gt;That is one of the things I think gets lost in a lot of AI productivity discussions.&lt;/p&gt;

&lt;p&gt;AI is amazing at some kinds of development.&lt;/p&gt;

&lt;p&gt;Small isolated features? Great.&lt;/p&gt;

&lt;p&gt;Boilerplate? Fantastic.&lt;/p&gt;

&lt;p&gt;A giant legacy system where changing one innocent-looking function somehow breaks seven unrelated things and awakens a forgotten service from 2014?&lt;/p&gt;

&lt;p&gt;Different story.&lt;/p&gt;

&lt;p&gt;And this creates a strange contradiction.&lt;/p&gt;

&lt;p&gt;AI is writing more and more production code, while developers still regularly report hallucinations, incorrect output, and limited trust in what the models produce.&lt;/p&gt;

&lt;p&gt;We are delegating faster than we are learning how to verify.&lt;/p&gt;

&lt;p&gt;That creates &lt;strong&gt;verification debt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You save time during generation, but some of that time has not really disappeared.&lt;/p&gt;

&lt;p&gt;It has just been moved somewhere else.&lt;/p&gt;

&lt;p&gt;Maybe into code review.&lt;/p&gt;

&lt;p&gt;Maybe into debugging.&lt;/p&gt;

&lt;p&gt;Maybe into production incidents six weeks later when somebody finally discovers the assumption the model quietly made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Do We Keep Opening More Agents?
&lt;/h2&gt;

&lt;p&gt;Part of this is technical.&lt;/p&gt;

&lt;p&gt;Part of it is also very human.&lt;/p&gt;

&lt;p&gt;There is a weird little dopamine hit that comes from watching AI agents crank through tasks.&lt;/p&gt;

&lt;p&gt;Feature finished.&lt;/p&gt;

&lt;p&gt;Another PR.&lt;/p&gt;

&lt;p&gt;Another commit.&lt;/p&gt;

&lt;p&gt;Another task crossed off the list.&lt;/p&gt;

&lt;p&gt;Visible output feels productive.&lt;/p&gt;

&lt;p&gt;Meanwhile, spending two hours understanding an architecture diagram or reading framework documentation might produce exactly zero commits.&lt;/p&gt;

&lt;p&gt;Even if it saves you ten hours later.&lt;/p&gt;

&lt;p&gt;There is also a measurement problem.&lt;/p&gt;

&lt;p&gt;It is easy to count closed PRs.&lt;/p&gt;

&lt;p&gt;It is harder to measure “developer now understands the system well enough to prevent three terrible architectural decisions.”&lt;/p&gt;

&lt;p&gt;And then there is the career anxiety around AI.&lt;/p&gt;

&lt;p&gt;A lot of developers are understandably wondering what all of this means for their jobs.&lt;/p&gt;

&lt;p&gt;That creates pressure to become the person running more agents, producing more code, and moving faster.&lt;/p&gt;

&lt;p&gt;Almost like we need to prove we can keep up with the machines by becoming extremely efficient machine supervisors.&lt;/p&gt;

&lt;p&gt;The irony is that blindly maximizing AI output may make us worse at the exact skills we are going to need most.&lt;/p&gt;

&lt;h2&gt;
  
  
  So What Should We Do With the Time AI Gives Us?
&lt;/h2&gt;

&lt;p&gt;This is the part I think matters most.&lt;/p&gt;

&lt;p&gt;If AI saves you two hours, you do not necessarily need to spend those two hours generating another two hours worth of code.&lt;/p&gt;

&lt;p&gt;Use some of that time for the stuff developers never had enough time for before.&lt;/p&gt;

&lt;h3&gt;
  
  
  Actually Read the Documentation
&lt;/h3&gt;

&lt;p&gt;Not skim it looking for the one code snippet that solves your immediate problem.&lt;/p&gt;

&lt;p&gt;Actually read it.&lt;/p&gt;

&lt;p&gt;Understand how the framework works.&lt;/p&gt;

&lt;p&gt;Read the architecture docs.&lt;/p&gt;

&lt;p&gt;Look at the edge cases.&lt;/p&gt;

&lt;p&gt;Understand why the API behaves the way it does.&lt;/p&gt;

&lt;p&gt;The better your mental model of the system is, the better your prompts become too.&lt;/p&gt;

&lt;p&gt;AI works a hell of a lot better when the person steering it understands what they are steering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write Better Specs Before You Generate Anything
&lt;/h3&gt;

&lt;p&gt;This is probably one of the biggest workflow improvements you can make.&lt;/p&gt;

&lt;p&gt;Before launching an agent, clearly define what the thing should do.&lt;/p&gt;

&lt;p&gt;Also define what it should &lt;strong&gt;not&lt;/strong&gt; do.&lt;/p&gt;

&lt;p&gt;Write down important constraints.&lt;/p&gt;

&lt;p&gt;Define security boundaries.&lt;/p&gt;

&lt;p&gt;Mention the ugly edge cases.&lt;/p&gt;

&lt;p&gt;Tell the model what must remain unchanged.&lt;/p&gt;

&lt;p&gt;A prompt like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add a permission system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;leaves a massive amount of room for interpretation.&lt;/p&gt;

&lt;p&gt;A specification that explains permission scopes, forbidden wildcard access, role inheritance, failure behavior, expected tests, and review requirements leaves considerably less.&lt;/p&gt;

&lt;p&gt;Models are very good at filling gaps.&lt;/p&gt;

&lt;p&gt;Unfortunately, they do not always fill them with what you meant.&lt;/p&gt;

&lt;h3&gt;
  
  
  Talk to Humans
&lt;/h3&gt;

&lt;p&gt;Wild concept, I know.&lt;/p&gt;

&lt;p&gt;Sometimes the best thing you can do with your newly reclaimed development time is talk to the product person, designer, teammate, user, or whoever actually understands the requirement you are about to implement.&lt;/p&gt;

&lt;p&gt;AI can generate twenty implementations of an unclear requirement.&lt;/p&gt;

&lt;p&gt;It cannot magically make the requirement less unclear.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep Useful Technical Documentation
&lt;/h3&gt;

&lt;p&gt;Architecture decisions.&lt;/p&gt;

&lt;p&gt;Important tradeoffs.&lt;/p&gt;

&lt;p&gt;Why something was implemented a certain way.&lt;/p&gt;

&lt;p&gt;What absolutely should not be changed without understanding some weird dependency.&lt;/p&gt;

&lt;p&gt;This stuff becomes even more valuable when AI agents are touching the codebase.&lt;/p&gt;

&lt;p&gt;Good documentation gives both humans and agents better context.&lt;/p&gt;

&lt;p&gt;And unlike yet another generated feature, it keeps paying off later.&lt;/p&gt;

&lt;p&gt;The basic idea is pretty simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The time AI gives you is often more valuable when you spend it doing things AI cannot do well than when you immediately throw another agent at another task.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Few Rules I Have Started Thinking About
&lt;/h2&gt;

&lt;p&gt;I do not think there is one perfect AI coding workflow, but there are a few principles that make a lot of sense to me.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. If you cannot explain the feature, do not prompt it yet
&lt;/h3&gt;

&lt;p&gt;If the requirement is fuzzy in your own head, the model is going to fill in the blanks.&lt;/p&gt;

&lt;p&gt;Sometimes it will guess correctly.&lt;/p&gt;

&lt;p&gt;Sometimes it absolutely will not.&lt;/p&gt;

&lt;p&gt;Figure out the boundaries first.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Do not merge code you cannot explain
&lt;/h3&gt;

&lt;p&gt;You do not need to memorize every line.&lt;/p&gt;

&lt;p&gt;But if an agent gives you a giant diff and you cannot explain what it changed, why it changed it, and how the important pieces work, that is probably not ready to merge.&lt;/p&gt;

&lt;p&gt;“Tests passed” is not enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Be extremely suspicious around high-risk code
&lt;/h3&gt;

&lt;p&gt;Authentication.&lt;/p&gt;

&lt;p&gt;Authorization.&lt;/p&gt;

&lt;p&gt;Payments.&lt;/p&gt;

&lt;p&gt;Database mutations.&lt;/p&gt;

&lt;p&gt;Encryption.&lt;/p&gt;

&lt;p&gt;Permission systems.&lt;/p&gt;

&lt;p&gt;Anything where a mistake could expose data or seriously break something deserves much more careful review.&lt;/p&gt;

&lt;p&gt;Those are not great places for the old:&lt;/p&gt;

&lt;p&gt;“Looks good from here.”&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Stop treating maximum parallelism as the goal
&lt;/h3&gt;

&lt;p&gt;Sometimes one agent working on one clearly defined problem is better than four agents generating four separate review queues.&lt;/p&gt;

&lt;p&gt;Every additional task has a context cost.&lt;/p&gt;

&lt;p&gt;Eventually you become the bottleneck.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Count review time as part of the task
&lt;/h3&gt;

&lt;p&gt;If an agent writes something in four minutes and you spend forty minutes verifying it, the task did not take four minutes.&lt;/p&gt;

&lt;p&gt;It took forty-four.&lt;/p&gt;

&lt;p&gt;That does not make AI useless.&lt;/p&gt;

&lt;p&gt;It just means we should stop measuring productivity by generation speed alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Ask the AI why
&lt;/h3&gt;

&lt;p&gt;Do not only ask for code.&lt;/p&gt;

&lt;p&gt;Ask why it chose that approach.&lt;/p&gt;

&lt;p&gt;Ask what alternatives it considered.&lt;/p&gt;

&lt;p&gt;Ask what assumptions it made.&lt;/p&gt;

&lt;p&gt;Ask where the implementation might fail.&lt;/p&gt;

&lt;p&gt;Ask what part it is least confident about.&lt;/p&gt;

&lt;p&gt;Using AI as something you interrogate is very different from using it as a code vending machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Still write code yourself sometimes
&lt;/h3&gt;

&lt;p&gt;I am very pro-AI coding tools, obviously.&lt;/p&gt;

&lt;p&gt;But I also think there is value in occasionally turning them off and actually building something yourself.&lt;/p&gt;

&lt;p&gt;You need enough hands-on understanding to recognize when generated code is bullshit.&lt;/p&gt;

&lt;p&gt;That skill gets harder to maintain if you never exercise it.&lt;/p&gt;

&lt;h2&gt;
  
  
  We Have Been Through This Kind of Shift Before
&lt;/h2&gt;

&lt;p&gt;Software development is basically a long history of building abstractions on top of other abstractions.&lt;/p&gt;

&lt;p&gt;Assembly languages gave way to higher-level languages.&lt;/p&gt;

&lt;p&gt;Infrastructure became cloud services.&lt;/p&gt;

&lt;p&gt;Libraries replaced mountains of custom implementation.&lt;/p&gt;

&lt;p&gt;Frameworks automated huge parts of application development.&lt;/p&gt;

&lt;p&gt;Every time this happens, somebody announces that programmers are about to become obsolete.&lt;/p&gt;

&lt;p&gt;Instead, the job changes.&lt;/p&gt;

&lt;p&gt;Developers stop spending as much time on one layer and start working at another.&lt;/p&gt;

&lt;p&gt;AI looks like another massive abstraction layer.&lt;/p&gt;

&lt;p&gt;The ability to manually type code is becoming less important than it used to be.&lt;/p&gt;

&lt;p&gt;But knowing what code should exist, how systems fit together, what tradeoffs matter, and whether the implementation is actually correct becomes more important.&lt;/p&gt;

&lt;p&gt;That is not less engineering.&lt;/p&gt;

&lt;p&gt;It is engineering happening at a different level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maybe You Do Not Need Another Terminal
&lt;/h2&gt;

&lt;p&gt;I started noticing that when I reduced the number of parallel AI sessions I was running, I actually felt more in control of my projects.&lt;/p&gt;

&lt;p&gt;I spent more time defining what I wanted before generating it.&lt;/p&gt;

&lt;p&gt;I read more of the code afterward.&lt;/p&gt;

&lt;p&gt;I documented decisions.&lt;/p&gt;

&lt;p&gt;I caught more questionable assumptions.&lt;/p&gt;

&lt;p&gt;Did that sometimes make the first thirty minutes of a task slower?&lt;/p&gt;

&lt;p&gt;Yep.&lt;/p&gt;

&lt;p&gt;But the software usually came out better.&lt;/p&gt;

&lt;p&gt;And more importantly, I actually understood what I had built.&lt;/p&gt;

&lt;p&gt;AI gives developers an absurd amount of leverage.&lt;/p&gt;

&lt;p&gt;I love that.&lt;/p&gt;

&lt;p&gt;But leverage works in both directions.&lt;/p&gt;

&lt;p&gt;It can help you build faster, or it can help you create an enormous pile of code you barely understand at record speed.&lt;/p&gt;

&lt;p&gt;There will always be another terminal you can open.&lt;/p&gt;

&lt;p&gt;Another agent you can launch.&lt;/p&gt;

&lt;p&gt;Another task you can parallelize.&lt;/p&gt;

&lt;p&gt;The harder skill might be recognizing when you already have enough code being generated and the most productive thing you can do is stop generating for a minute and actually think.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>I Built a Local AI Music Studio</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Sun, 20 Sep 2026 21:30:07 +0000</pubDate>
      <link>https://dev.to/sizzlebop/i-built-a-local-ai-music-studio-3fb9</link>
      <guid>https://dev.to/sizzlebop/i-built-a-local-ai-music-studio-3fb9</guid>
      <description>&lt;p&gt;I have a habit of starting projects because I want one very specific thing.&lt;/p&gt;

&lt;p&gt;Then somewhere along the way I apparently decide, "Well, if I'm already doing this..."&lt;/p&gt;

&lt;p&gt;And suddenly the tiny experiment has a database, Docker Compose stack, job queue, model manager, audio editor, waveform player, and enough GPU models to eat 40 GB of disk space.&lt;/p&gt;

&lt;p&gt;So, anyway.&lt;/p&gt;

&lt;p&gt;I made &lt;strong&gt;Miso&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://miso.pinkpixel.dev/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;miso.pinkpixel.dev&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Miso is a self-hosted local music generation and remix studio built on top of &lt;a href="https://github.com/0xShugo/audio.cpp" rel="noopener noreferrer"&gt;audio.cpp&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F16qujxncky2f6ozw1083.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%2F16qujxncky2f6ozw1083.png" alt="Miso screenshot" width="799" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The original idea was pretty simple: I wanted a nice interface for experimenting with local music models without constantly dropping back to command-line tools, juggling generated files, or trying to remember which ridiculous combination of parameters made the song I actually liked.&lt;/p&gt;

&lt;p&gt;It got slightly out of hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  I didn't just want "type prompt, get song"
&lt;/h2&gt;

&lt;p&gt;There are already plenty of ways to generate a song from a text box.&lt;/p&gt;

&lt;p&gt;That part is fun, but the thing I kept wanting was everything that comes &lt;strong&gt;after&lt;/strong&gt; generation.&lt;/p&gt;

&lt;p&gt;What if I like the song except for eight seconds in the middle?&lt;/p&gt;

&lt;p&gt;What if I want the vocals by themselves?&lt;/p&gt;

&lt;p&gt;What if I want to change the singer?&lt;/p&gt;

&lt;p&gt;What if I want the same melody arranged in a completely different style?&lt;/p&gt;

&lt;p&gt;What if I want to turn something into MIDI and keep screwing with it somewhere else?&lt;/p&gt;

&lt;p&gt;That became the real idea behind Miso.&lt;/p&gt;

&lt;p&gt;A project doesn't just hold the final song. It keeps the takes, prompts, lyrics, stems, scores, transcriptions, and the lineage between them, so I can experiment without losing track of how I got there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzs9dv8nd8jcliutgr05d.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%2Fzs9dv8nd8jcliutgr05d.png" alt="Miso screenshot" width="799" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  There are a ridiculous number of models involved
&lt;/h2&gt;

&lt;p&gt;Miso currently exposes several different music and audio model families through audio.cpp because they are good at very different things.&lt;/p&gt;

&lt;p&gt;ACE-Step 1.5 is the main workhorse. It handles full song generation, covers, and repainting sections of existing tracks.&lt;/p&gt;

&lt;p&gt;YuE2 can generate songs too, but it does something I find especially interesting: it plans an ABC music score first and can give that score back to you.&lt;/p&gt;

&lt;p&gt;MiniMax Music 3 and HeartMuLa are alternate song generators with their own prompting styles.&lt;/p&gt;

&lt;p&gt;Stable Audio 3 handles instrumental generation and sound effects.&lt;/p&gt;

&lt;p&gt;Then there are separate models for stem separation, voice conversion, and audio-to-MIDI transcription.&lt;/p&gt;

&lt;p&gt;The funny part is that they absolutely do &lt;strong&gt;not&lt;/strong&gt; accept prompts the same way.&lt;/p&gt;

&lt;p&gt;One model wants a production-style caption.&lt;/p&gt;

&lt;p&gt;Another wants a short description plus comma-separated tags.&lt;/p&gt;

&lt;p&gt;ACE-Step wants style information in one place, BPM and key as separate parameters, and lyrics somewhere else.&lt;/p&gt;

&lt;p&gt;So Miso has a guided builder that translates the same set of UI controls into whatever syntax the selected model actually expects.&lt;/p&gt;

&lt;p&gt;I wanted to be able to think about "upbeat synthpop, female vocal, 120 BPM" instead of remembering which API field each model decided should contain "120 BPM."&lt;/p&gt;

&lt;h2&gt;
  
  
  Repainting is interesting
&lt;/h2&gt;

&lt;p&gt;One of the features Miso is most built around is repainting.&lt;/p&gt;

&lt;p&gt;You load a take, drag across part of its waveform, and replace only that section.&lt;/p&gt;

&lt;p&gt;So instead of regenerating a whole song because one chorus went weird, you can select that section and try again.&lt;/p&gt;

&lt;p&gt;ACE-Step's repaint route turned out to have some quirks that were interesting to figure out, too.&lt;/p&gt;

&lt;p&gt;The surrounding music influences the replacement much more strongly than the text prompt does. Lyrics have more control over a vocal repaint than telling the prompt to suddenly turn the section into something wildly different.&lt;/p&gt;

&lt;p&gt;That wasn't something I wanted to guess about, so I ended up testing it.&lt;/p&gt;

&lt;p&gt;At one point I ran deliberately opposite prompts through the route and compared the results. The normal text-to-music route reacted dramatically. Repaint barely cared.&lt;/p&gt;

&lt;p&gt;Which is one of the reasons I enjoy projects like this. Half of building the interface becomes figuring out what these models &lt;em&gt;actually&lt;/em&gt; do rather than what I assume they do from an API description.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I started pulling songs apart
&lt;/h2&gt;

&lt;p&gt;Miso can also split a track into stems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftll2s6mfhv72xtaz11xk.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%2Ftll2s6mfhv72xtaz11xk.png" alt="Miso screenshot" width="799" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depending on the model, that can mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vocals + instrumental&lt;/li&gt;
&lt;li&gt;vocals + drums + bass + everything else&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the stems exist, they get their own mixer.&lt;/p&gt;

&lt;p&gt;You can solo them, mute them, change their levels, swap a vocal using a voice conversion model, mix everything back together, and save the result as another take.&lt;/p&gt;

&lt;p&gt;That led to another rabbit hole: voice conversion.&lt;/p&gt;

&lt;p&gt;RVC sounds better but only has a small set of packaged voices.&lt;/p&gt;

&lt;p&gt;Vevo2 has lower output bandwidth, but it can use basically any other vocal reference in the project.&lt;/p&gt;

&lt;p&gt;So both stayed.&lt;/p&gt;

&lt;p&gt;I would rather expose two tools with different tradeoffs than pretend one is objectively the "correct" choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I just finished is more interesting
&lt;/h2&gt;

&lt;p&gt;The current release, 1.4.0, connects MIDI transcription to YuE2's score support.&lt;/p&gt;

&lt;p&gt;Previously, Miso could already:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;split a song into stems&lt;/li&gt;
&lt;li&gt;transcribe audio into MIDI notes&lt;/li&gt;
&lt;li&gt;give YuE2 an ABC score and tell it to sing that melody&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The pieces just weren't connected.&lt;/p&gt;

&lt;p&gt;Now they are.&lt;/p&gt;

&lt;p&gt;You can separate a song, transcribe the vocal stem, turn those note events into an ABC melody, inspect the detected tempo and key, correct them if necessary, and feed the score into YuE2 with a completely different style.&lt;/p&gt;

&lt;p&gt;So you can take the melody from a recording and use it as the basis for a new arrangement.&lt;/p&gt;

&lt;p&gt;I tested that path with a known melody instead of just listening and declaring, "yeah, sounds about right."&lt;/p&gt;

&lt;p&gt;I generated a simple version of &lt;em&gt;Twinkle Twinkle Little Star&lt;/em&gt;, ran it back through separation, transcription, and score conversion, and recovered the expected pitches across the recording.&lt;/p&gt;

&lt;p&gt;Rhythm is less perfect than pitch, and real vocals can produce odd little tied or split notes, but the result is usable by the model.&lt;/p&gt;

&lt;p&gt;That was one of those features where suddenly several earlier pieces of the project made much more sense together.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pinkpixel-dev" rel="noopener noreferrer"&gt;
        pinkpixel-dev
      &lt;/a&gt; / &lt;a href="https://github.com/pinkpixel-dev/miso" rel="noopener noreferrer"&gt;
        miso
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A local music generation and remix studio built on audio.cpp. Generate, repaint, split into stems and swap voices, with every take kept and traceable.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/pinkpixel-dev/miso/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpinkpixel-dev%2Fmiso%2FHEAD%2Flogo.png" alt="Miso logo" width="300"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/pinkpixel-dev/miso/cover.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpinkpixel-dev%2Fmiso%2FHEAD%2Fcover.png" alt="Miso" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;A local music generation and remix studio. You bring a prompt or a song, and Miso gives you
a real workspace for generating, remixing, splitting, and finishing music with models that
run on your own machine. Nothing is sent anywhere.&lt;/p&gt;
&lt;p&gt;Miso runs on &lt;a href="https://github.com/0xShug0/audio.cpp" rel="noopener noreferrer"&gt;audio.cpp&lt;/a&gt;, a C++ inference runtime for
audio models. Miso is the studio around it: projects that persist, a history of every take
and a record of exactly how each clip was made so you can change one thing and try again.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/pinkpixel-dev/miso/screenshots/screenshot1.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpinkpixel-dev%2Fmiso%2FHEAD%2Fscreenshots%2Fscreenshot1.png" alt="Miso Project page" width="85%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Miso installs models, keeps your projects and audio, generates with ACE-Step from a guided prompt builder with lyrics written for you if you want them, repaints a section of a track, covers a take, holds any two takes against each other, splits a song into stems you can mix and export, writes full 48 kHz stereo songs with YuE2 and hands back the score it…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/pinkpixel-dev/miso" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Miso is local-first
&lt;/h2&gt;

&lt;p&gt;The whole thing runs as two Docker containers.&lt;/p&gt;

&lt;p&gt;One runs Miso itself.&lt;/p&gt;

&lt;p&gt;The other runs audio.cpp and owns the GPU models.&lt;/p&gt;

&lt;p&gt;The browser never talks directly to audio.cpp. It talks to Miso, and Miso talks to the inference backend.&lt;/p&gt;

&lt;p&gt;That separation became useful almost immediately.&lt;/p&gt;

&lt;p&gt;Projects, imports, playback, exports, and editing still work if the model backend is stopped.&lt;/p&gt;

&lt;p&gt;It also means the audio.cpp server can live on another machine with the GPU while Miso runs somewhere else.&lt;/p&gt;

&lt;p&gt;The app itself uses React, TypeScript, Vite, Node, Hono, and SQLite.&lt;/p&gt;

&lt;p&gt;I deliberately kept most ordinary audio editing in the browser rather than turning everything into another server job.&lt;/p&gt;

&lt;p&gt;Things like trimming, fading, gain changes, normalization, splitting, WAV conversion, and MP3 export do not need a giant AI model involved.&lt;/p&gt;

&lt;p&gt;Sometimes software can just... do the normal thing.&lt;/p&gt;

&lt;p&gt;Wild concept, I know.&lt;/p&gt;

&lt;h2&gt;
  
  
  There's an optional AI assistant too
&lt;/h2&gt;

&lt;p&gt;I did sneak one language model feature in.&lt;/p&gt;

&lt;p&gt;Miso can optionally connect to an OpenAI-compatible API or a local llama.cpp server to help write lyrics or expand a music prompt.&lt;/p&gt;

&lt;p&gt;But it is completely separate from the music models.&lt;/p&gt;

&lt;p&gt;Nothing gets silently rewritten.&lt;/p&gt;

&lt;p&gt;It gives you a suggestion, shows it to you, and you decide whether to use it.&lt;/p&gt;

&lt;p&gt;That was important to me because I don't want an assistant "improving" a prompt behind my back and then making it impossible to figure out why two generations were different.&lt;/p&gt;

&lt;p&gt;If you accept an expanded prompt, Miso keeps both the original and the version that actually ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  This project taught me a lot about building around AI models
&lt;/h2&gt;

&lt;p&gt;Not really about calling them.&lt;/p&gt;

&lt;p&gt;That part is usually the easy bit.&lt;/p&gt;

&lt;p&gt;The interesting problems were things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;models that require different sample rates&lt;/li&gt;
&lt;li&gt;models that return multiple huge audio files&lt;/li&gt;
&lt;li&gt;models that need several components loaded in sequence to fit in VRAM&lt;/li&gt;
&lt;li&gt;jobs that can run for several minutes&lt;/li&gt;
&lt;li&gt;uploads that need to survive browser tabs closing&lt;/li&gt;
&lt;li&gt;model APIs that technically accept a parameter but quietly ignore it if you put it in the wrong part of the request&lt;/li&gt;
&lt;li&gt;keeping enough generation history to reproduce something useful&lt;/li&gt;
&lt;li&gt;dealing with a backend that can only run one expensive job at a time&lt;/li&gt;
&lt;li&gt;determining which behavior belongs in the UI versus the server versus the inference runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And, of course, learning that "the documentation says this option does X" and "the model meaningfully responds to X" are not always the same statement.&lt;/p&gt;

&lt;p&gt;That last one is probably applicable to a lot more than music models.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's still very much a project
&lt;/h2&gt;

&lt;p&gt;Miso is open source, and right now it has mostly been tested on my own Linux machine with an RTX 4090 laptop GPU.&lt;/p&gt;

&lt;p&gt;So I am absolutely not going to pretend I have tested every GPU, driver, operating system, or model combination in existence.&lt;/p&gt;

&lt;p&gt;But it has grown from "I want a good way to play around with local music models" into something I actually think is pretty awesome.&lt;/p&gt;

&lt;p&gt;And that is my favorite kind of project.&lt;/p&gt;

&lt;p&gt;The kind where I started building a tool because I wanted to experiment with something...&lt;/p&gt;

&lt;p&gt;...and then ended up building the experiment itself.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>music</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Bookmarks for Your Terminal</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Fri, 18 Sep 2026 20:13:23 +0000</pubDate>
      <link>https://dev.to/sizzlebop/bookmarks-for-your-terminal-efh</link>
      <guid>https://dev.to/sizzlebop/bookmarks-for-your-terminal-efh</guid>
      <description>&lt;p&gt;If you use Linux and spend a decent amount of time in the terminal, &lt;strong&gt;zoxide is one of those little tools that's absolutely worth trying if you haven't already&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It makes jumping between directories ridiculously fast by remembering the places you visit most often.&lt;/p&gt;

&lt;p&gt;Instead of typing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Projects/my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can usually just type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;z my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and you're there.&lt;/p&gt;

&lt;p&gt;The easiest way I can describe it is &lt;strong&gt;bookmarks for your terminal, except you don't have to create the bookmarks yourself&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What zoxide actually does
&lt;/h2&gt;

&lt;p&gt;zoxide is a smarter replacement for &lt;code&gt;cd&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As you move around your filesystem, it remembers which directories you visit and how often you use them.&lt;/p&gt;

&lt;p&gt;Then instead of typing the full path, you can jump back to a directory using only part of its name.&lt;/p&gt;

&lt;p&gt;For example, maybe I have a project here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/home/username/Projects/my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Normally I would type something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Projects/my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With zoxide, after I've visited it before, I can usually just type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;z my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And I'm there.&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;No aliases to maintain. No giant list of paths. No remembering exactly where I put the damn thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  It gets better the more you use it
&lt;/h2&gt;

&lt;p&gt;The nice thing about zoxide is that you don't really have to organize anything.&lt;/p&gt;

&lt;p&gt;It builds its own database based on the directories you actually visit.&lt;/p&gt;

&lt;p&gt;So if you constantly jump into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/Projects/my_project
~/Documents/School
~/Projects/random-experiment-number-847
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eventually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;z my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;z school
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or even something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;z random
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can take you straight there.&lt;/p&gt;

&lt;p&gt;zoxide ranks directories based on things like how often and how recently you've visited them, so it tends to get better at guessing where you want to go over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing it
&lt;/h2&gt;

&lt;p&gt;On Arch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; zoxide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ubuntu/Debian users:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;zoxide &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OR&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSfL&lt;/span&gt; https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you add the initialization command for your shell.&lt;/p&gt;

&lt;p&gt;For Fish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zoxide init fish | source
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Bash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;zoxide init bash&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Zsh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;zoxide init zsh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put that in your shell config so it loads automatically.&lt;/p&gt;

&lt;p&gt;Then just use your terminal normally.&lt;/p&gt;

&lt;h2&gt;
  
  
  You don't have to stop using &lt;code&gt;cd&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;One thing I like about zoxide is that it doesn't force you into some completely different way of navigating.&lt;/p&gt;

&lt;p&gt;You can still use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Downloads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;whenever that makes sense.&lt;/p&gt;

&lt;p&gt;I tend to use normal &lt;code&gt;cd&lt;/code&gt; for directories that are nearby and &lt;code&gt;z&lt;/code&gt; for jumping across my filesystem.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;z my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is a lot nicer than remembering whether the project is currently hiding under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/Projects/apps/my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/Code/projects/my_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or whatever organizational system I was apparently convinced was brilliant three months ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interactive searching is even nicer
&lt;/h2&gt;

&lt;p&gt;zoxide also supports interactive selection when paired with a fuzzy finder like &lt;code&gt;fzf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;zi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and get an interactive list of directories zoxide knows about.&lt;/p&gt;

&lt;p&gt;Start typing part of a directory name, pick the one you want, hit Enter, and you're there.&lt;/p&gt;

&lt;p&gt;This is especially handy when you know you worked on &lt;em&gt;something&lt;/em&gt; with a certain name but have absolutely no clue where you put it.&lt;/p&gt;

&lt;p&gt;Which, if you create a ridiculous number of projects, happens a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tiny tools like this are my favorite
&lt;/h2&gt;

&lt;p&gt;zoxide isn't some enormous productivity system.&lt;/p&gt;

&lt;p&gt;It doesn't require accounts.&lt;/p&gt;

&lt;p&gt;It doesn't want me to organize my entire life.&lt;/p&gt;

&lt;p&gt;It doesn't have a dashboard.&lt;/p&gt;

&lt;p&gt;It just notices where I go and makes getting back there easier.&lt;/p&gt;

&lt;p&gt;After using it for a while, typing long directory paths starts to feel strangely unnecessary.&lt;/p&gt;

&lt;p&gt;So if you spend much time in a Linux terminal and haven't tried zoxide yet, it's worth checking out.&lt;/p&gt;

&lt;p&gt;Your filesystem can remain an organizational disaster.&lt;/p&gt;

&lt;p&gt;You just don't have to remember where everything is anymore.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>terminal</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Programming Is Mostly Learning How to Investigate Things</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Fri, 18 Sep 2026 00:47:32 +0000</pubDate>
      <link>https://dev.to/sizzlebop/programming-is-mostly-learning-how-to-investigate-things-2hf6</link>
      <guid>https://dev.to/sizzlebop/programming-is-mostly-learning-how-to-investigate-things-2hf6</guid>
      <description>&lt;p&gt;When I first started learning programming, I thought getting better at it meant knowing more stuff.&lt;/p&gt;

&lt;p&gt;More syntax.&lt;/p&gt;

&lt;p&gt;More commands.&lt;/p&gt;

&lt;p&gt;More frameworks.&lt;/p&gt;

&lt;p&gt;More things I could remember without having to look them up.&lt;/p&gt;

&lt;p&gt;And yeah, obviously knowing things helps.&lt;/p&gt;

&lt;p&gt;But the longer I do this, the more I think a huge part of programming is just learning how to investigate things.&lt;/p&gt;

&lt;p&gt;Because half the time, the situation is basically:&lt;/p&gt;

&lt;p&gt;Something is broken.&lt;/p&gt;

&lt;p&gt;I don't know why.&lt;/p&gt;

&lt;p&gt;Cool.&lt;/p&gt;

&lt;p&gt;Now what?&lt;/p&gt;

&lt;h2&gt;
  
  
  You start poking at it
&lt;/h2&gt;

&lt;p&gt;Maybe there's an error message.&lt;/p&gt;

&lt;p&gt;Maybe there isn't, which is always fun.&lt;/p&gt;

&lt;p&gt;Maybe a function is returning something weird.&lt;/p&gt;

&lt;p&gt;Maybe the app works locally and breaks the second you deploy it.&lt;/p&gt;

&lt;p&gt;Maybe a library is doing something that makes absolutely no sense based on the docs.&lt;/p&gt;

&lt;p&gt;So you start poking around.&lt;/p&gt;

&lt;p&gt;Check the logs.&lt;/p&gt;

&lt;p&gt;Print some values.&lt;/p&gt;

&lt;p&gt;Read the error again.&lt;/p&gt;

&lt;p&gt;Actually read the error this time instead of immediately deciding what you think it means.&lt;/p&gt;

&lt;p&gt;Look at the data.&lt;/p&gt;

&lt;p&gt;Check the docs.&lt;/p&gt;

&lt;p&gt;Search GitHub issues.&lt;/p&gt;

&lt;p&gt;Change one thing.&lt;/p&gt;

&lt;p&gt;Run it again.&lt;/p&gt;

&lt;p&gt;Break something else.&lt;/p&gt;

&lt;p&gt;Undo that.&lt;/p&gt;

&lt;p&gt;Eventually you start collecting enough little pieces that the problem stops feeling like one giant mystery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging is basically narrowing things down
&lt;/h2&gt;

&lt;p&gt;Usually the first version of the problem is:&lt;/p&gt;

&lt;p&gt;"Why the hell isn't this working?"&lt;/p&gt;

&lt;p&gt;Which is not exactly actionable.&lt;/p&gt;

&lt;p&gt;So you make the question smaller.&lt;/p&gt;

&lt;p&gt;Is this function actually running?&lt;/p&gt;

&lt;p&gt;Is the request being sent?&lt;/p&gt;

&lt;p&gt;Did the server get it?&lt;/p&gt;

&lt;p&gt;Is the data shaped the way I think it is?&lt;/p&gt;

&lt;p&gt;Did this value become &lt;code&gt;undefined&lt;/code&gt; five steps earlier?&lt;/p&gt;

&lt;p&gt;Am I even looking in the right place?&lt;/p&gt;

&lt;p&gt;Is this actually my bug, or am I misunderstanding how the library works?&lt;/p&gt;

&lt;p&gt;Every answer knocks out a few possibilities.&lt;/p&gt;

&lt;p&gt;Then eventually you're not debugging "the app."&lt;/p&gt;

&lt;p&gt;You're debugging one function.&lt;/p&gt;

&lt;p&gt;Then one condition.&lt;/p&gt;

&lt;p&gt;Then one stupid value.&lt;/p&gt;

&lt;p&gt;And suddenly there it is.&lt;/p&gt;

&lt;p&gt;Some tiny ridiculous thing that caused all of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowing what to search for matters more than I realized
&lt;/h2&gt;

&lt;p&gt;Searching for technical answers is its own skill.&lt;/p&gt;

&lt;p&gt;Sometimes you can paste an error message into Google and get the exact answer in thirty seconds.&lt;/p&gt;

&lt;p&gt;Sometimes the error is basically useless.&lt;/p&gt;

&lt;p&gt;Sometimes the answer depends on your operating system, browser, package version, GPU, runtime, build tool, phase of the moon, whatever.&lt;/p&gt;

&lt;p&gt;The better you get at figuring out what part of the problem actually matters, the better your searches get.&lt;/p&gt;

&lt;p&gt;That was a big shift for me.&lt;/p&gt;

&lt;p&gt;Instead of searching:&lt;/p&gt;

&lt;p&gt;"Why is this broken?"&lt;/p&gt;

&lt;p&gt;You start searching something much more specific.&lt;/p&gt;

&lt;p&gt;And suddenly you stop finding ten pages about completely unrelated problems that happen to contain the same error message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docs help, but they're not always the whole story
&lt;/h2&gt;

&lt;p&gt;I probably read documentation more now than I did when I was first learning.&lt;/p&gt;

&lt;p&gt;Not because I've become some kind of responsible documentation-reading adult.&lt;/p&gt;

&lt;p&gt;Usually because something has gone wrong.&lt;/p&gt;

&lt;p&gt;Sometimes the docs give you the answer immediately.&lt;/p&gt;

&lt;p&gt;Sometimes they give you enough information to realize you've been thinking about the problem wrong.&lt;/p&gt;

&lt;p&gt;Sometimes they're outdated.&lt;/p&gt;

&lt;p&gt;Sometimes the answer is buried in a GitHub issue where somebody casually mentions:&lt;/p&gt;

&lt;p&gt;"Yeah, this doesn't work when that option is enabled."&lt;/p&gt;

&lt;p&gt;Ah.&lt;/p&gt;

&lt;p&gt;Cool.&lt;/p&gt;

&lt;p&gt;Would have loved to know that an hour ago.&lt;/p&gt;

&lt;p&gt;And sometimes I end up reading the source code because at a certain point I just want to know what the damn thing is actually doing.&lt;/p&gt;

&lt;p&gt;You don't have to understand the entire library.&lt;/p&gt;

&lt;p&gt;Sometimes you just need to follow one function far enough to answer one question.&lt;/p&gt;

&lt;h2&gt;
  
  
  I think beginners get the wrong idea about experienced developers
&lt;/h2&gt;

&lt;p&gt;When you're new, it's really easy to think experienced developers just know everything.&lt;/p&gt;

&lt;p&gt;They look at a problem and immediately understand it.&lt;/p&gt;

&lt;p&gt;They know which function to use.&lt;/p&gt;

&lt;p&gt;They remember every command.&lt;/p&gt;

&lt;p&gt;They never have to search anything.&lt;/p&gt;

&lt;p&gt;Meanwhile you're sitting there thinking, "Why do I have to look up the same thing for the fourth time?"&lt;/p&gt;

&lt;p&gt;But I don't think that's really what experience looks like.&lt;/p&gt;

&lt;p&gt;A lot of it seems more like being better at getting unstuck.&lt;/p&gt;

&lt;p&gt;Knowing where to look.&lt;/p&gt;

&lt;p&gt;Knowing what information matters.&lt;/p&gt;

&lt;p&gt;Knowing how to make a big confusing problem smaller.&lt;/p&gt;

&lt;p&gt;Knowing when your assumption is probably wrong.&lt;/p&gt;

&lt;p&gt;And being willing to keep digging instead of staring at the code hoping it suddenly explains itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI didn't really remove this part
&lt;/h2&gt;

&lt;p&gt;AI definitely makes investigating things faster.&lt;/p&gt;

&lt;p&gt;I use it constantly.&lt;/p&gt;

&lt;p&gt;It can explain a weird error.&lt;/p&gt;

&lt;p&gt;Help trace through unfamiliar code.&lt;/p&gt;

&lt;p&gt;Suggest what to check next.&lt;/p&gt;

&lt;p&gt;Point out something obvious that I've somehow looked directly at six times without seeing.&lt;/p&gt;

&lt;p&gt;But it can also be wrong.&lt;/p&gt;

&lt;p&gt;Sometimes very confidently wrong.&lt;/p&gt;

&lt;p&gt;It can give you an answer for the wrong version of a library.&lt;/p&gt;

&lt;p&gt;Invent an API.&lt;/p&gt;

&lt;p&gt;Miss the actual cause.&lt;/p&gt;

&lt;p&gt;Fix the symptom and leave the underlying problem sitting there waiting for you.&lt;/p&gt;

&lt;p&gt;So I don't think AI replaced the investigation part.&lt;/p&gt;

&lt;p&gt;It just became another thing I use while investigating.&lt;/p&gt;

&lt;p&gt;A very useful thing.&lt;/p&gt;

&lt;p&gt;But still not something I trust blindly.&lt;/p&gt;

&lt;h2&gt;
  
  
  I think this might be one of the biggest programming skills
&lt;/h2&gt;

&lt;p&gt;You're never going to know everything.&lt;/p&gt;

&lt;p&gt;There is always going to be another library, another framework, another weird edge case, another error message you've never seen before.&lt;/p&gt;

&lt;p&gt;And honestly, that used to bother me more than it does now.&lt;/p&gt;

&lt;p&gt;Because I don't think the goal is to know everything anymore.&lt;/p&gt;

&lt;p&gt;It's being able to hit something you don't understand and think:&lt;/p&gt;

&lt;p&gt;"Okay. I don't know what's happening yet. But I can probably figure it out."&lt;/p&gt;

&lt;p&gt;Then you start narrowing it down.&lt;/p&gt;

&lt;p&gt;Check assumptions.&lt;/p&gt;

&lt;p&gt;Collect clues.&lt;/p&gt;

&lt;p&gt;Test things.&lt;/p&gt;

&lt;p&gt;Read.&lt;/p&gt;

&lt;p&gt;Search.&lt;/p&gt;

&lt;p&gt;Break stuff on purpose sometimes.&lt;/p&gt;

&lt;p&gt;And eventually the weird thing stops being weird.&lt;/p&gt;

&lt;p&gt;At least until the next weird thing.&lt;/p&gt;

&lt;p&gt;Which is apparently most of programming.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>debugging</category>
      <category>career</category>
    </item>
    <item>
      <title>Claude Code Skills Worth Trying: From Vague Idea to Finished Feature</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Mon, 14 Sep 2026 22:36:57 +0000</pubDate>
      <link>https://dev.to/sizzlebop/claude-code-skills-worth-trying-from-vague-idea-to-finished-feature-1nhe</link>
      <guid>https://dev.to/sizzlebop/claude-code-skills-worth-trying-from-vague-idea-to-finished-feature-1nhe</guid>
      <description>&lt;p&gt;I’ve tried out a lot of Claude Code skills, and a few of them are especially useful when you combine them into a workflow.&lt;/p&gt;

&lt;p&gt;Not because they magically make the model better at coding, but because they help with the annoying parts around coding: figuring out what you actually want, avoiding unnecessary complexity, keeping a design consistent, and remembering where you left off.&lt;/p&gt;

&lt;p&gt;So instead of just listing the skills, I wanted to put together a practical example.&lt;/p&gt;

&lt;p&gt;Imagine we’re adding AI-generated collections to a bookmark manager. The user pastes a link, the app figures out where it belongs, and maybe creates a collection if there isn’t a good one already.&lt;/p&gt;

&lt;p&gt;Simple idea. Plenty of decisions hiding underneath it.&lt;/p&gt;

&lt;p&gt;We’ll use a few skills to work through those decisions, build the feature, and make it easier to come back to later.&lt;/p&gt;

&lt;p&gt;You’ll need Claude Code and the skills you want to use installed. Each repository has its own installation instructions, so follow those rather than assuming they all use the same setup.&lt;/p&gt;

&lt;p&gt;The skills covered here are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/mattpocock/skills" rel="noopener noreferrer"&gt;Matt Pocock’s skills&lt;/a&gt; for grilling, domain modeling, and handoffs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/DietrichGebert/ponytail" rel="noopener noreferrer"&gt;Ponytail&lt;/a&gt; for keeping implementations simple.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill" rel="noopener noreferrer"&gt;UI/UX Pro Max&lt;/a&gt; for design guidance and a persistent design system.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Nutlope/hallmark" rel="noopener noreferrer"&gt;Hallmark&lt;/a&gt; for more distinctive interface structure.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ayghri/i-have-adhd" rel="noopener noreferrer"&gt;i-have-adhd&lt;/a&gt; for making the current task and next action easier to follow.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/JuliusBrussee/caveman" rel="noopener noreferrer"&gt;Caveman&lt;/a&gt; for more concise working conversations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need all of them. The point is to give each one a specific job.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Figure out what you actually want with &lt;code&gt;grill-me&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The first thing I’d do is &lt;strong&gt;not ask Claude to implement the feature&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;“Add AI-generated collections” sounds specific enough until you start thinking about what should happen when the AI isn’t sure, when a collection already exists, or when the user has manually organized something.&lt;/p&gt;

&lt;p&gt;That’s where &lt;code&gt;grill-me&lt;/code&gt; comes in.&lt;/p&gt;

&lt;p&gt;It uses the underlying &lt;code&gt;grilling&lt;/code&gt; skill to turn the discussion into a decision tree. Instead of asking a giant list of unrelated questions, it asks the questions that can be answered now, then uses those answers to determine what needs to be asked next.&lt;/p&gt;

&lt;p&gt;Start with something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/grill-me

I want to add AI-generated collections to my bookmark manager.

The user should be able to paste a URL and have the app suggest
or choose an appropriate collection.

Help me work out the behavior before we implement anything.
Inspect the existing codebase for facts you can determine yourself.
Ask me about product decisions, not things you can find in the code.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is that Claude should inspect the project rather than making you explain every existing function.&lt;/p&gt;

&lt;p&gt;It might discover that collections already have a creation function, that bookmarks can belong to multiple collections, or that there’s an existing metadata-fetching pipeline.&lt;/p&gt;

&lt;p&gt;Those are &lt;strong&gt;facts about the codebase&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The questions for you are things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Should the AI apply suggestions automatically or ask first?&lt;/li&gt;
&lt;li&gt;Should it prefer existing collections?&lt;/li&gt;
&lt;li&gt;Is it allowed to create new collections?&lt;/li&gt;
&lt;li&gt;Should it ever reorganize bookmarks the user already sorted?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are &lt;strong&gt;product decisions&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let the questions happen in rounds
&lt;/h3&gt;

&lt;p&gt;Suppose you decide that the AI should prefer existing collections and only create a new one when there isn’t a reasonable match.&lt;/p&gt;

&lt;p&gt;Now there’s a new question: what counts as a reasonable match?&lt;/p&gt;

&lt;p&gt;Maybe you want a confidence threshold. Maybe you’d rather have the AI suggest a new collection and let you approve it. Maybe the user should be able to turn automatic creation off entirely.&lt;/p&gt;

&lt;p&gt;The grilling workflow is useful because those questions depend on the earlier decision. There’s no reason to spend ten minutes discussing deletion behavior for automatically created collections before deciding whether automatic creation is even allowed.&lt;/p&gt;

&lt;p&gt;Keep going until the important branches are resolved.&lt;/p&gt;

&lt;p&gt;For a tiny utility, this may be more process than you need. For a feature with several possible behaviors, it can save a lot of “well, that’s not what I meant” halfway through implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Preserve the important decisions with &lt;code&gt;grill-with-docs&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If the feature is going to be more than a quick experiment, I’d use &lt;code&gt;grill-with-docs&lt;/code&gt; instead of a plain grilling session.&lt;/p&gt;

&lt;p&gt;This combines the structured interview with &lt;code&gt;domain-modeling&lt;/code&gt;, so the important terminology and decisions don’t just disappear into chat history.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/grill-with-docs

Help me define the AI collection feature for this bookmark manager.

Inspect the existing code and documentation first.
Clarify the important domain concepts and behavior.
Keep the documentation focused on decisions and terminology
that will matter when I return to this project later.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One thing I like about the domain-modeling approach is that it challenges vague terminology.&lt;/p&gt;

&lt;p&gt;For example, what does “collection” actually mean in this app?&lt;/p&gt;

&lt;p&gt;Is it a folder for bookmarks? A tag-like grouping? Can a bookmark belong to more than one? Is an AI-generated collection different from a manually created one, or is the only difference how it was created?&lt;/p&gt;

&lt;p&gt;Those distinctions matter because they affect the data model and the behavior.&lt;/p&gt;

&lt;p&gt;The skill can maintain a &lt;code&gt;CONTEXT.md&lt;/code&gt; glossary for domain terminology. That file is meant to explain &lt;strong&gt;what things mean&lt;/strong&gt;, not become a giant implementation spec.&lt;/p&gt;

&lt;p&gt;It can also create ADRs, or architecture decision records, for decisions that are genuinely worth preserving.&lt;/p&gt;

&lt;p&gt;For example, if you decide:&lt;/p&gt;

&lt;p&gt;AI suggestions never modify manually organized bookmarks without approval.&lt;/p&gt;

&lt;p&gt;That might be worth documenting if it affects several parts of the system and would be surprising to someone reading the code later.&lt;/p&gt;

&lt;p&gt;The distinction is useful:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Glossary:&lt;/strong&gt; What does “collection” mean?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ADR:&lt;/strong&gt; Why did we decide AI should not reorganize manually sorted bookmarks automatically?&lt;/p&gt;

&lt;p&gt;Not every little choice needs an ADR. The idea is to preserve the reasoning that would otherwise be easy to lose.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Ask Ponytail to find the smallest implementation
&lt;/h2&gt;

&lt;p&gt;Now that the behavior is clearer, it’s tempting to tell Claude to build the whole thing.&lt;/p&gt;

&lt;p&gt;Before doing that, I’d bring in &lt;a href="https://github.com/DietrichGebert/ponytail" rel="noopener noreferrer"&gt;Ponytail&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Its general philosophy is to think like the laziest competent senior developer.&lt;/p&gt;

&lt;p&gt;Not lazy as in “do a shitty job.” Lazy as in:&lt;/p&gt;

&lt;p&gt;Why are we creating six abstractions and a new service when the project already has most of what we need?&lt;/p&gt;

&lt;p&gt;Ask it to review the plan first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use Ponytail to review the implementation plan for this feature.

Look for existing code, platform features, or dependencies we can reuse.
Identify unnecessary abstractions or infrastructure.
Recommend the smallest implementation that satisfies the requirements.

Do not simplify away validation, security, error handling, or
the behavior we agreed on.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For our bookmark manager, maybe the app already has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A URL metadata fetcher.&lt;/li&gt;
&lt;li&gt;A collection creation function.&lt;/li&gt;
&lt;li&gt;A bookmark-to-collection relationship.&lt;/li&gt;
&lt;li&gt;An existing AI provider abstraction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If so, we probably don’t need a separate “AI Collection Orchestration Service” with its own plugin architecture and twelve interfaces.&lt;/p&gt;

&lt;p&gt;Maybe we just need to add a classification step to the existing save flow.&lt;/p&gt;

&lt;p&gt;That’s the kind of simplification I want.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use the review skills after implementation
&lt;/h3&gt;

&lt;p&gt;Ponytail also includes related skills such as &lt;code&gt;ponytail-review&lt;/code&gt;, &lt;code&gt;ponytail-audit&lt;/code&gt;, and &lt;code&gt;ponytail-debt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After implementing the feature, I’d use the review to look for unnecessary complexity in the diff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use ponytail-review on the changes for the AI collection feature.

Look for unnecessary abstractions, duplicated logic, and code
that could be replaced with existing project functionality.

Preserve the agreed behavior and correctness requirements.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The debt skill is interesting for deliberate shortcuts.&lt;/p&gt;

&lt;p&gt;Maybe we decide that a simple classification call is enough for now, but we know we might need a more sophisticated system if the library grows to tens of thousands of bookmarks.&lt;/p&gt;

&lt;p&gt;That doesn’t mean we need to build the sophisticated system today. It means we can record why the simple approach was chosen and what would make us revisit it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Establish the design direction with UI/UX Pro Max
&lt;/h2&gt;

&lt;p&gt;Once the behavior is settled, I’d work on the interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill" rel="noopener noreferrer"&gt;UI/UX Pro Max&lt;/a&gt; gives Claude a searchable design knowledge base covering styles, palettes, typography, UX guidance, chart choices, and stack-specific implementation recommendations.&lt;/p&gt;

&lt;p&gt;For our example, I’d ask it to establish the design direction before touching the UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use ui-ux-pro-max to establish a design direction for
the AI collection feature in this bookmark manager.

The app uses React and Tailwind and supports dark mode.

I want the feature to feel like a natural part of the existing app,
not a separate AI dashboard.

Recommend the interaction pattern, typography, colors, spacing,
and component guidance. Do not implement anything yet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The part I find especially useful is the ability to persist a design system.&lt;/p&gt;

&lt;p&gt;UI/UX Pro Max can generate a project-level &lt;code&gt;MASTER.md&lt;/code&gt; containing the overall design direction, with page-specific overrides where needed.&lt;/p&gt;

&lt;p&gt;That gives Claude something to refer back to instead of reinventing the visual style every time you work on another page.&lt;/p&gt;

&lt;p&gt;For example, the bookmark manager’s main page, settings page, and collection editor should all feel like the same product.&lt;/p&gt;

&lt;p&gt;The goal is to avoid the classic AI frontend situation where one page looks great and the next looks like it came from a completely different app.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Use Hallmark for the page structure
&lt;/h2&gt;

&lt;p&gt;This is where I’d bring in &lt;a href="https://github.com/Nutlope/hallmark" rel="noopener noreferrer"&gt;Hallmark&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hallmark focuses on structural variety, not just changing colors and fonts. Its goal is to avoid the same generic AI-generated page composition being reused for everything.&lt;/p&gt;

&lt;p&gt;It has workflows for building, auditing, redesigning, and studying designs.&lt;/p&gt;

&lt;p&gt;For our bookmark manager, I’d give it a different job from UI/UX Pro Max:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use Hallmark to design the AI collection interaction using
the design direction we just established.

Keep the agreed palette and typography.

Focus on a clear, distinctive layout and interaction flow
that fits the existing bookmark manager.

Do not replace the design system with a different theme.
Do not redesign unrelated parts of the app.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;UI/UX Pro Max&lt;/strong&gt; establishes the practical design foundation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hallmark&lt;/strong&gt; works on the actual composition and structure.&lt;/p&gt;

&lt;p&gt;We don't want both skills independently deciding what the app should look like and fighting over the design system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;study&lt;/code&gt; when you have a reference
&lt;/h3&gt;

&lt;p&gt;Hallmark’s &lt;code&gt;study&lt;/code&gt; mode is also interesting if you have a screenshot or URL of an interface you like.&lt;/p&gt;

&lt;p&gt;You can ask it to analyze the design “DNA”: the layout structure, typography, color direction, and visual hierarchy.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use Hallmark study mode on this screenshot.

Explain the layout structure, spacing, typography, and visual hierarchy
that make it work.

I want to use those principles for my bookmark manager,
not copy the original design.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a useful way to learn from a reference without just asking Claude to recreate it.&lt;/p&gt;

&lt;p&gt;Hallmark also has a component-specific workflow, so you can ask it to improve a modal or button without turning the request into a full-page redesign.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Keep the working conversation manageable
&lt;/h2&gt;

&lt;p&gt;At this point, the feature is being implemented, and this is where a couple of smaller skills could make the day-to-day experience nicer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;i-have-adhd&lt;/code&gt; to keep the next action obvious
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/ayghri/i-have-adhd" rel="noopener noreferrer"&gt;i-have-adhd&lt;/a&gt; is an output-style skill that changes how Claude presents work.&lt;/p&gt;

&lt;p&gt;It tries to lead with the next action, break multi-step work into smaller tasks, keep the current state visible, and suppress unrelated tangents.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/i-have-adhd

Help me finish this feature.

Show the current task, what is already complete, and the
single next action. Keep unrelated ideas in a later section.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of getting a giant explanation about everything that could possibly happen next, you get something closer to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 of 5 complete:&lt;/strong&gt; Collection classification is implemented. Next: test what happens when the AI returns an invalid collection ID. Dependency cleanup can wait.&lt;/p&gt;

&lt;p&gt;That’s the kind of thing I find useful when I’m bouncing between projects and need to know what to do right now.&lt;/p&gt;

&lt;p&gt;It still allows fuller explanations when you ask for them, so it isn’t supposed to make every answer tiny at the expense of being useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Caveman when Claude gets too wordy
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/JuliusBrussee/caveman" rel="noopener noreferrer"&gt;Caveman&lt;/a&gt; is for a slightly different problem: reducing unnecessary prose.&lt;/p&gt;

&lt;p&gt;Its basic skill compresses Claude’s explanations while preserving important technical details like code, commands, error messages, exact names, numbers, and words that change the meaning of instructions.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use Caveman lite for this implementation session.

Keep explanations concise, but preserve exact commands,
error messages, and important technical details.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So instead of an essay explaining a small React issue, you might get:&lt;/p&gt;

&lt;p&gt;New object ref each render. Prop identity changes. Memoize stable value.&lt;/p&gt;

&lt;p&gt;The project has different modes, including lite, full, and ultra, and can switch back to clearer prose when something is ambiguous, safety-critical, or needs a proper explanation.&lt;/p&gt;

&lt;p&gt;It also has related skills for concise commits, reviews, memory-file compression, and token statistics.&lt;/p&gt;

&lt;p&gt;One thing worth keeping in mind: &lt;strong&gt;fewer output tokens doesn’t automatically mean the same percentage reduction in total session cost&lt;/strong&gt;. The instructions have overhead, and input and reasoning tokens still count.&lt;/p&gt;

&lt;p&gt;The basic concise-output skill is also separate from the repo’s larger optional proxy/engine and Cloud-related tooling. I’d distinguish those before installing the whole stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Create a handoff before ending the session
&lt;/h2&gt;

&lt;p&gt;Now imagine the feature is mostly done, but the integration tests are failing and you’re done for the day.&lt;/p&gt;

&lt;p&gt;This is where Matt Pocock’s &lt;code&gt;handoff&lt;/code&gt; skill comes in.&lt;/p&gt;

&lt;p&gt;It creates a Markdown handoff document in the OS temporary directory so another session or agent can pick up the important context.&lt;/p&gt;

&lt;p&gt;I’d use something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/handoff

The AI collection feature is mostly implemented.

Preserve:
- The current task and completed work.
- The decisions we made about collection behavior.
- The data model and why we chose it.
- The failing integration tests.
- The single next action.

Reference existing plans, specs, ADRs, or commits where useful
instead of copying everything into the handoff.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea is to preserve the important state without dumping the entire chat into the next session.&lt;/p&gt;

&lt;p&gt;It’s &lt;strong&gt;context portability&lt;/strong&gt;, not magic context-window compression.&lt;/p&gt;

&lt;p&gt;A handoff can still lose details, so if the reasoning behind a rejected approach matters, I’d explicitly ask it to preserve that. I’d also check the file before sharing it elsewhere if the conversation contained anything sensitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Resume with &lt;code&gt;handoff&lt;/code&gt; + &lt;code&gt;i-have-adhd&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;handoff&lt;/code&gt; preserves the important context.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;i-have-adhd&lt;/code&gt; makes that context easier to act on when you come back.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the next session, I’d point Claude at the generated handoff file and say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/i-have-adhd

Read the handoff file and help me resume.

Show the current state, then give me the first concrete action.
Keep unrelated ideas in a later section.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That should make it easier to reopen a project and avoid spending the first part of the session reconstructing what happened yesterday.&lt;/p&gt;

&lt;p&gt;For someone who has several projects going at once, that sounds pretty damn useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow, all together
&lt;/h2&gt;

&lt;p&gt;Here’s the order I’d try:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clarify the idea&lt;/td&gt;
&lt;td&gt;&lt;code&gt;grill-me&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Work out the behavior before coding.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preserve decisions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;grill-with-docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Document terminology and important trade-offs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simplify the plan&lt;/td&gt;
&lt;td&gt;Ponytail&lt;/td&gt;
&lt;td&gt;Find the smallest implementation that satisfies the requirements.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Establish design&lt;/td&gt;
&lt;td&gt;UI/UX Pro Max&lt;/td&gt;
&lt;td&gt;Create a consistent visual and UX foundation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Design the interface&lt;/td&gt;
&lt;td&gt;Hallmark&lt;/td&gt;
&lt;td&gt;Improve structure and composition without replacing the design system.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implement&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;i-have-adhd&lt;/code&gt; / Caveman&lt;/td&gt;
&lt;td&gt;Keep the current task clear and the conversation manageable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ponytail-review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Look for unnecessary complexity in the changes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End the session&lt;/td&gt;
&lt;td&gt;&lt;code&gt;handoff&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preserve the important context for next time.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resume&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;handoff&lt;/code&gt; + &lt;code&gt;i-have-adhd&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Reconstruct the state and identify the next action.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You don’t have to use every stage every time.&lt;/p&gt;

&lt;p&gt;If I’m making a tiny utility, I might just use Ponytail and a concise output style.&lt;/p&gt;

&lt;p&gt;If I’m building a feature with complicated behavior, I’d spend more time grilling and documenting the decisions.&lt;/p&gt;

&lt;p&gt;If I’m working on a frontend, I’d use the design skills, but I wouldn’t ask both of them to independently invent the entire visual direction.&lt;/p&gt;

&lt;p&gt;The useful part is giving each skill a clear responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few things to keep in mind
&lt;/h2&gt;

&lt;p&gt;Avoid treating the workflow as a mandatory process. The whole point is to make building things easier, not turn a small feature into a ceremony involving six agents and a stack of documents.&lt;/p&gt;

&lt;p&gt;The combination: &lt;strong&gt;grilling → documentation → simple implementation → handoff&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The result is that you're getting from “I have an idea” to “I know what I’m building,” without losing the decisions or accidentally turning a small project into a giant architecture exercise.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>agentskills</category>
      <category>productivity</category>
    </item>
    <item>
      <title>When Do You Decide a Project Is Done?</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Sun, 13 Sep 2026 20:28:24 +0000</pubDate>
      <link>https://dev.to/sizzlebop/when-do-you-decide-a-project-is-done-343o</link>
      <guid>https://dev.to/sizzlebop/when-do-you-decide-a-project-is-done-343o</guid>
      <description>&lt;p&gt;I make A LOT of things.&lt;/p&gt;

&lt;p&gt;Some turn into bigger projects than I expected. Some are experiments. Some are tiny utilities I made because I wanted one very specific thing and didn't feel like using whatever already existed.&lt;/p&gt;

&lt;p&gt;And lately I've been thinking about when a project is actually &lt;em&gt;done&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Not abandoned. Not sitting in a folder waiting for the mythical day when I suddenly decide to work on it again.&lt;/p&gt;

&lt;p&gt;Just... done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not everything needs a roadmap
&lt;/h2&gt;

&lt;p&gt;There's this weird tendency in software development where the second you build something, your brain starts trying to turn it into more.&lt;/p&gt;

&lt;p&gt;Okay, it works. Cool.&lt;/p&gt;

&lt;p&gt;But what if it had accounts?&lt;/p&gt;

&lt;p&gt;What if it synced across devices?&lt;/p&gt;

&lt;p&gt;What if there was an API?&lt;/p&gt;

&lt;p&gt;What if I turned it into a SaaS?&lt;/p&gt;

&lt;p&gt;What if I added seventeen things I never actually wanted in the first place?&lt;/p&gt;

&lt;p&gt;Sometimes that makes sense. Plenty of good projects start small and grow because you realize there's a lot more you want to do with them.&lt;/p&gt;

&lt;p&gt;But sometimes I wanted a tool that does one thing, and now I have a tool that does that thing.&lt;/p&gt;

&lt;p&gt;Mission accomplished.&lt;/p&gt;

&lt;p&gt;I don't think every project needs twelve integrations, a pricing page, and a five-year roadmap just because technically it &lt;em&gt;could&lt;/em&gt; have them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sometimes the point was just making it
&lt;/h2&gt;

&lt;p&gt;A lot of my projects start with some version of:&lt;/p&gt;

&lt;p&gt;"I wonder if I could make this."&lt;/p&gt;

&lt;p&gt;That's honestly enough motivation for me most of the time.&lt;/p&gt;

&lt;p&gt;Maybe I'm trying a new library. Maybe I want to figure out how something works. Maybe I need some tiny utility. Maybe I just had a dumb idea at 1 AM and now apparently we're doing this.&lt;/p&gt;

&lt;p&gt;If I build it, learn whatever I wanted to learn, and end up with something that does what I wanted, I don't really see that as an unfinished project.&lt;/p&gt;

&lt;p&gt;It means I got what I wanted out of it.&lt;/p&gt;

&lt;p&gt;And I think that's especially important if you're somebody who likes starting new things.&lt;/p&gt;

&lt;p&gt;Because otherwise every experiment slowly turns into another responsibility.&lt;/p&gt;

&lt;p&gt;Now you've got an endless list of things you're supposed to maintain, improve, and maybe eventually monetize.&lt;/p&gt;

&lt;p&gt;That's a great way to make a hobby feel like a job.&lt;/p&gt;

&lt;p&gt;No thanks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some projects do grow
&lt;/h2&gt;

&lt;p&gt;Sometimes I start with a small idea, and then I keep thinking of new features I want to add.&lt;/p&gt;

&lt;p&gt;Sometimes people use something you made and suggest something great to add to it.&lt;/p&gt;

&lt;p&gt;Sometimes you just really like the project and it's fun to keep messing with it.&lt;/p&gt;

&lt;p&gt;Those are great too.&lt;/p&gt;

&lt;p&gt;I love building bigger things when I actually want to.&lt;/p&gt;

&lt;p&gt;I just don't think growth has to be the default measure of whether a project was worth making.&lt;/p&gt;

&lt;p&gt;A tiny utility that saves me five clicks was worth making.&lt;/p&gt;

&lt;p&gt;An experiment that taught me something was worth making.&lt;/p&gt;

&lt;p&gt;A completely ridiculous app that exists mostly because it made me laugh was worth making.&lt;/p&gt;

&lt;p&gt;It doesn't have to become a product or a business or my new personal brand to justify the time I spent making it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maybe "done" just means it did its job
&lt;/h2&gt;

&lt;p&gt;I think I'm getting more comfortable with letting some projects just... exist.&lt;/p&gt;

&lt;p&gt;If I find a bug, I'll probably fix it.&lt;/p&gt;

&lt;p&gt;If six months from now I suddenly think of something I want to add, I can add it.&lt;/p&gt;

&lt;p&gt;But sometimes I made the thing, and the thing works, and I like it.&lt;/p&gt;

&lt;p&gt;That's enough for me.&lt;/p&gt;

&lt;p&gt;And honestly, sometimes the best thing I can do with a project is leave it alone and go make something else.&lt;/p&gt;

&lt;p&gt;Which is good, because I probably already have another idea.&lt;/p&gt;

&lt;p&gt;How do you decide when one of your projects is actually done?&lt;/p&gt;

&lt;p&gt;Do you have a graveyard full of unfinished projects?&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I Found a Tiny Model on Hugging Face and Now I Save Half the Internet as Markdown</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Wed, 09 Sep 2026 23:35:45 +0000</pubDate>
      <link>https://dev.to/sizzlebop/i-found-a-tiny-model-on-hugging-face-and-now-i-save-half-the-internet-as-markdown-2hg3</link>
      <guid>https://dev.to/sizzlebop/i-found-a-tiny-model-on-hugging-face-and-now-i-save-half-the-internet-as-markdown-2hg3</guid>
      <description>&lt;p&gt;I found a small model on Hugging Face recently that looked interesting, so I decided to experiment with it. I converted it to ONNX, got it running in the browser with WebGPU, and somehow it turned into one of those little tools I keep using way more than I expected.&lt;/p&gt;

&lt;p&gt;It’s called &lt;strong&gt;Pulpie&lt;/strong&gt;, and basically it takes a webpage and pulls out the actual useful content as clean Markdown. I’ve been using it to save DEV posts I want to keep, tutorials I want to read later, and especially documentation pages that don’t have a nice copy-to-Markdown option.&lt;/p&gt;

&lt;p&gt;The part I really like is that it doesn’t just dump the whole page into Markdown. The model is only about 210M parameters and is used to classify which parts of the page are actual content and which parts are navigation, sidebars, boilerplate, etc. Then the remaining HTML gets converted normally.&lt;/p&gt;

&lt;p&gt;That means things like headings, code blocks, links, tables, and images stay intact.&lt;/p&gt;

&lt;p&gt;Today I tried it on a huge Claude Code documentation page with a bunch of tables and code examples, and it handled the whole thing really well. I have also saved long DEV posts to read later with all of the images still included.&lt;/p&gt;

&lt;p&gt;I made one version that runs locally in the browser through ONNX Runtime Web and WebGPU. The model is around 800 MB, which sounds chunky for a browser app, but it downloads once, which only took a couple of minutes for me, and then it's stored in browser cache. After that, it loads locally and extraction is almost instant on my machine.&lt;/p&gt;

&lt;p&gt;If you want to try it out:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pulpie.pinkpixel.dev" rel="noopener noreferrer"&gt;Pulpie&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also made a local FastAPI version if you'd rather run it as a local app instead of using the WebGPU browser version. That one can be downloaded from GitHub:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pinkpixel-dev" rel="noopener noreferrer"&gt;
        pinkpixel-dev
      &lt;/a&gt; / &lt;a href="https://github.com/pinkpixel-dev/pulpie-ui" rel="noopener noreferrer"&gt;
        pulpie-ui
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A fast web interface for extracting the main content from web pages and HTML into clean Markdown.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Pulpie Local UI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A fast web interface for extracting the main content from web pages and HTML into clean Markdown. Powered by the &lt;code&gt;feyninc/pulpie-orange-small&lt;/code&gt; 210M EuroBERT encoder model.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Try It Online (No Installation)&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;You can try the in-browser WebGPU version with no local setup required:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://pulpie.pinkpixel.dev" rel="nofollow noopener noreferrer"&gt;pulpie.pinkpixel.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebGPU Space Repository&lt;/strong&gt;: &lt;a href="https://huggingface.co/spaces/sizzlebop/pulpie-webgpu" rel="nofollow noopener noreferrer"&gt;huggingface.co/spaces/sizzlebop/pulpie-webgpu&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Pulpie?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Most modern content extractors either use brittle heuristics (regular expressions and readability rules) or heavy generative models (decoders) that generate text token by token.&lt;/p&gt;
&lt;p&gt;Pulpie takes a different path:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single-pass encoder&lt;/strong&gt;: Instead of generating text from scratch, it tokenizes the page into blocks and classifies every block as content or boilerplate in a single forward pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast and light&lt;/strong&gt;: The recommended 210M model matches state-of-the-art extractors while running up to 20x faster. On an RTX 4090 GPU, extractions take around 15 to 40 milliseconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean Markdown with images&lt;/strong&gt;: It keeps headlines…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/pinkpixel-dev/pulpie-ui" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I think this is actually one of my favorite uses for a small specialized model so far. It isn’t generating Markdown or rewriting anything. It just answers a much simpler question:&lt;/p&gt;

&lt;p&gt;Is this block part of the page I actually care about?&lt;/p&gt;

&lt;p&gt;Once it answers that, regular deterministic tools can handle the rest.&lt;/p&gt;

&lt;p&gt;No API calls, no cloud inference, and no giant model needed just to clean up a webpage.&lt;/p&gt;

&lt;p&gt;This was just a fun little experiment that ended up working so much better than I expected, but since it's been so useful for me, I thought I'd share it. &lt;/p&gt;

&lt;p&gt;I can't be the only one who wants to save everything on the internet!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Maybe AI Doesn't Need to Get Better Right Now</title>
      <dc:creator>Jessica Doering</dc:creator>
      <pubDate>Sun, 06 Sep 2026 17:53:48 +0000</pubDate>
      <link>https://dev.to/sizzlebop/maybe-ai-doesnt-need-to-get-better-right-now-2i53</link>
      <guid>https://dev.to/sizzlebop/maybe-ai-doesnt-need-to-get-better-right-now-2i53</guid>
      <description>&lt;p&gt;I don’t mean AI development should stop forever, or that today’s models are perfect. They absolutely aren’t. There’s still plenty to improve: reliability, hallucinations, efficiency, security, interpretability, memory, agent behavior, and a hundred other things.&lt;/p&gt;

&lt;p&gt;But those improvements don’t necessarily require this constant race toward making AI dramatically more capable at everything.&lt;/p&gt;

&lt;p&gt;At some point, I think we have to ask what exactly we’re racing toward.&lt;/p&gt;

&lt;p&gt;We already have models that can write software, dig through huge amounts of information, generate images and video, research topics, use tools, tutor people, automate workflows, and handle some seriously complicated tasks.&lt;/p&gt;

&lt;p&gt;But the question I keep asking is:&lt;/p&gt;

&lt;p&gt;Do we really need AI to do everything for us? &lt;/p&gt;

&lt;p&gt;We’re already struggling to keep up with how quickly this technology is moving. Companies are already figuring out which jobs can be automated and which parts of people’s work can be handed over to AI. Entry-level roles are changing. Entire industries are trying to work out which skills are still going to matter. Schools barely have time to decide how students should be using these tools before another generation of models shows up.&lt;/p&gt;

&lt;p&gt;And there’s a physical cost to all of this too.&lt;/p&gt;

&lt;p&gt;More capable AI usually means more demand for compute. More compute means more data centers, more electricity, more cooling, more water, and more land.&lt;/p&gt;

&lt;p&gt;Those data centers aren’t floating around in some magical cloud. They’re built in actual communities, and the people living in those communities are the ones dealing with whatever comes with them.&lt;/p&gt;

&lt;p&gt;That doesn’t mean data centers are automatically bad, or that AI shouldn’t exist. Obviously I don’t think that. It just means there’s more to this race than benchmark scores and flashy model launches.&lt;/p&gt;

&lt;p&gt;And while all of that is happening, the attitude still seems to be:&lt;/p&gt;

&lt;p&gt;Bigger. Smarter. Faster. More autonomous.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;There’s another option.&lt;/p&gt;

&lt;p&gt;We could spend some time getting really good at the AI we already have.&lt;/p&gt;

&lt;p&gt;Make it cheaper. Make it more reliable. Make it easier to verify. Make it more energy-efficient. Build better tools around it. Figure out what reasonable rules around this stuff should actually look like. Help workers adapt. Learn where AI actually improves something and where we’re just shoving it in because we can.&lt;/p&gt;

&lt;p&gt;I especially feel this in software development.&lt;/p&gt;

&lt;p&gt;AI-assisted development is already insanely fast when the developer is still thinking, reviewing, testing, and making the decisions. I don’t need AI to replace that part.&lt;/p&gt;

&lt;p&gt;I &lt;em&gt;like&lt;/em&gt; making things.&lt;/p&gt;

&lt;p&gt;I want a ridiculously capable assistant that lets me build more of them.&lt;/p&gt;

&lt;p&gt;I don’t want the end goal to be pressing a button and having AI do absolutely everything for me.&lt;/p&gt;

&lt;p&gt;Maybe progress doesn’t always have to mean removing more humans from the process.&lt;/p&gt;

&lt;p&gt;And maybe when technology starts advancing faster than society can actually absorb the consequences, slowing down isn’t being anti-progress.&lt;/p&gt;

&lt;p&gt;Maybe it’s just being responsible.&lt;/p&gt;

&lt;p&gt;I don’t want weaker AI.&lt;/p&gt;

&lt;p&gt;I just think we need to spend some time figuring out what the hell to do with the incredibly capable AI we already have before we keep flooring the accelerator.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>softwaredevelopment</category>
      <category>career</category>
    </item>
  </channel>
</rss>
