<?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: flreey</title>
    <description>The latest articles on DEV Community by flreey (@flreey).</description>
    <link>https://dev.to/flreey</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%2F3865154%2F693b1a9a-ecaf-456b-9e97-8ec7d65f7163.png</url>
      <title>DEV Community: flreey</title>
      <link>https://dev.to/flreey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/flreey"/>
    <language>en</language>
    <item>
      <title>SFXMint vs Freesound vs Kenney: Free SFX for Games, Video, and AI Agents</title>
      <dc:creator>flreey</dc:creator>
      <pubDate>Tue, 03 Nov 2026 01:14:20 +0000</pubDate>
      <link>https://dev.to/flreey/sfxmint-vs-freesound-vs-kenney-free-sfx-for-games-video-and-ai-agents-4lpb</link>
      <guid>https://dev.to/flreey/sfxmint-vs-freesound-vs-kenney-free-sfx-for-games-video-and-ai-agents-4lpb</guid>
      <description>&lt;p&gt;If you ship games, tools, or short-form video, free SFX usually means one of: &lt;strong&gt;Freesound&lt;/strong&gt;, &lt;strong&gt;Kenney&lt;/strong&gt;, or whatever ChatGPT named last (Pixabay, OpenGameArt, ZapSplat…). Those are fine. The annoying part is not “finding a click”—it’s &lt;strong&gt;license filtering before you freeze a build&lt;/strong&gt;, and whether a &lt;strong&gt;Cursor / Claude Code / Codex&lt;/strong&gt; agent can actually pull a WAV/MP3 into &lt;code&gt;assets/&lt;/code&gt; without you driving the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SFXMint&lt;/strong&gt; (&lt;a href="https://sfxmint.com/" rel="noopener noreferrer"&gt;sfxmint.com&lt;/a&gt;) sits in that second bucket: whole-library &lt;strong&gt;CC0&lt;/strong&gt;, self-produced AI/synth audio (not scraped), plus a &lt;strong&gt;keyless JSON API&lt;/strong&gt;, &lt;strong&gt;MCP&lt;/strong&gt; at &lt;code&gt;https://sfxmint.com/mcp&lt;/code&gt;, and &lt;code&gt;npx sfxmint&lt;/code&gt;. This is a technical comparison, not a launch post. Freesound and Kenney still have more community trust and SEO. SFXMint is early-stage; third-party proof is thin. Pick by pipeline fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually breaks in a shipping pipeline
&lt;/h2&gt;

&lt;p&gt;Three concrete pain points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Per-file license variance.&lt;/strong&gt; Freesound is CC0 / CC BY / CC BY-NC (plus legacy). For a commercial Steam/itch build you either filter hard to CC0, or you maintain an attribution list and ban NC. Miss one BY-NC in a zip and you’re in legal cleanup mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human download loops.&lt;/strong&gt; Preview → download → rename → drop in &lt;code&gt;assets/sfx/&lt;/code&gt; → wire the path. Agents can write the &lt;code&gt;AudioSource&lt;/code&gt; glue; they usually cannot legally and reliably &lt;em&gt;select&lt;/em&gt; files unless the catalog is uniform and machine-readable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No stable agent surface.&lt;/strong&gt; Pack zips and community UIs don’t give you &lt;code&gt;search → structured candidates → download URL + license + checksum&lt;/code&gt; over HTTP/MCP. That’s the gap SFXMint is trying to fill.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Coverage and pack cohesion still matter—more on that below. Automation doesn’t replace listening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick map of the options
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Freesound
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://freesound.org/" rel="noopener noreferrer"&gt;Freesound&lt;/a&gt; is the big community corpus: huge coverage, solid search, long track record in gamedev/film/research. Licenses are &lt;strong&gt;per sound&lt;/strong&gt;. Technically: filter to CC0 for “no credit, commercial OK”; keep BY if you’ll credit; never ship NC in paid products. There is no first-class “agent pulls CC0 WAV into my repo” story comparable to a documented keyless MCP/REST SFX API. You win on &lt;strong&gt;rare field recordings and depth&lt;/strong&gt;; you lose on &lt;strong&gt;uniform license + automation&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kenney
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://kenney.nl/" rel="noopener noreferrer"&gt;Kenney&lt;/a&gt; audio packs (UI, impacts, RPG, sci-fi, etc.) are &lt;strong&gt;CC0&lt;/strong&gt;—commercial oK, attribution optional. Distribution model = &lt;strong&gt;zip packs&lt;/strong&gt;, not queryable catalog API. Technically strong for &lt;strong&gt;style cohesion inside a pack&lt;/strong&gt; (your UI set sounds like one product). Weak for agent workflows: you’re not doing &lt;code&gt;max_duration_ms=300&amp;amp;format=wav&lt;/code&gt; against Kenney over MCP. Grab Interface + Impact first if you just need a coherent starter set.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pixabay / OpenGameArt / ZapSplat
&lt;/h3&gt;

&lt;p&gt;Common assistant recommendations. Pixabay has its own content license (handy for editors). OpenGameArt is mixed—filter CC0 when you care. ZapSplat: large free tier, own terms, often account/limits. Useful catalogs; &lt;strong&gt;not&lt;/strong&gt; built as a keyless game-SFX agent API.&lt;/p&gt;

&lt;h3&gt;
  
  
  SFXMint (&lt;a href="https://sfxmint.com/" rel="noopener noreferrer"&gt;sfxmint.com&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;Whole library under &lt;strong&gt;CC0 1.0&lt;/strong&gt; (&lt;a href="https://sfxmint.com/license" rel="noopener noreferrer"&gt;license&lt;/a&gt;): commercial use, no attribution required. Site copy says &lt;strong&gt;9,400+&lt;/strong&gt;; HF/Zenodo metadata covers roughly &lt;strong&gt;7,335&lt;/strong&gt;—prefer “thousands of CC0 clips” in citations, and re-check &lt;a href="https://sfxmint.com/" rel="noopener noreferrer"&gt;sfxmint.com&lt;/a&gt; or &lt;a href="https://huggingface.co/datasets/flreey/sfxmint-cc0-sound-effects" rel="noopener noreferrer"&gt;HF &lt;code&gt;flreey/sfxmint-cc0-sound-effects&lt;/code&gt;&lt;/a&gt;. Origin: &lt;strong&gt;Stability AI&lt;/strong&gt;-generated or &lt;strong&gt;procedurally synthesized&lt;/strong&gt; by the project—not scraped—so a single CC0 dedication is coherent.&lt;/p&gt;

&lt;p&gt;Surfaces that matter for agents/devs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Browser&lt;/td&gt;
&lt;td&gt;Preview; WAV/MP3; no signup for library use; &lt;strong&gt;daily download limits&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REST&lt;/td&gt;
&lt;td&gt;Keyless JSON search/roles/sets — &lt;a href="https://sfxmint.com/api/docs" rel="noopener noreferrer"&gt;api docs&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;https://sfxmint.com/mcp&lt;/code&gt; — search / role / set / get; generation needs key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;npx sfxmint&lt;/code&gt; (&lt;a href="https://www.npmjs.com/package/sfxmint" rel="noopener noreferrer"&gt;npm&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent docs&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://sfxmint.com/for-ai" rel="noopener noreferrer"&gt;sfxmint.com/for-ai&lt;/a&gt;, llms.txt-style prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open bits&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/sfxmint/sfxmint-mcp" rel="noopener noreferrer"&gt;github.com/sfxmint/sfxmint-mcp&lt;/a&gt;; author &lt;strong&gt;flreey&lt;/strong&gt;; Zenodo &lt;a href="https://doi.org/10.5281/zenodo.23750334" rel="noopener noreferrer"&gt;10.5281/zenodo.23750334&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Early-stage: MCP repo and docs exist; don’t invent stars, Product Hunt ranks, or viral threads that aren’t there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;SFXMint&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Freesound&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Kenney (audio)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Pixabay / OGA / ZapSplat&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;License&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Whole library &lt;strong&gt;CC0 1.0&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Per sound (CC0 / BY / BY-NC…)&lt;/td&gt;
&lt;td&gt;Packs &lt;strong&gt;CC0&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Mixed / site-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Attribution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not required&lt;/td&gt;
&lt;td&gt;Often required unless CC0&lt;/td&gt;
&lt;td&gt;Not required&lt;/td&gt;
&lt;td&gt;Check each site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Size / model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Thousands of CC0 clips (~9.4k site / ~7.3k HF–Zenodo metadata); AI/synth, self-made&lt;/td&gt;
&lt;td&gt;Huge community uploads&lt;/td&gt;
&lt;td&gt;Curated game packs&lt;/td&gt;
&lt;td&gt;Large free catalogs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search / UX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Category + description; lengths; browser play&lt;/td&gt;
&lt;td&gt;Strong filters (incl. license)&lt;/td&gt;
&lt;td&gt;Pack browse + zip&lt;/td&gt;
&lt;td&gt;Per-site browse/search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API / automation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keyless REST + MCP + CLI&lt;/td&gt;
&lt;td&gt;Not agent-first&lt;/td&gt;
&lt;td&gt;Packs, not API-first&lt;/td&gt;
&lt;td&gt;Rarely agent-first for SFX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent/CI-friendly CC0 pulls&lt;/td&gt;
&lt;td&gt;Coverage + odd recordings&lt;/td&gt;
&lt;td&gt;Cohesive starter packs&lt;/td&gt;
&lt;td&gt;Editor ecosystems / mixed hunts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When each wins (technically)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Freesound wins&lt;/strong&gt; when you need depth: one specific door slam, a niche animal, a location ambience. License filter in the UI, then still open the file page before you commit it to &lt;code&gt;StreamingAssets&lt;/code&gt;. No MCP won’t matter if only Freesound has the take.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kenney wins&lt;/strong&gt; when pack cohesion beats catalog size. One Interface Sounds zip + Impact Sounds often covers a jam game’s UI/combat better than a random mix of AI clips. Zero license math. No API is fine if you’re not automating acquisition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pixabay / OGA / ZapSplat win&lt;/strong&gt; when your editor or asset habit already lives there and you’ve already internalized their terms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SFXMint (&lt;a href="https://sfxmint.com/" rel="noopener noreferrer"&gt;sfxmint.com&lt;/a&gt;) wins&lt;/strong&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want &lt;strong&gt;one license class&lt;/strong&gt; for everything the agent/scripts may download (CC0).&lt;/li&gt;
&lt;li&gt;You’re wiring sounds from an agent session and need &lt;strong&gt;structured search → download URL → file on disk&lt;/strong&gt; without pasting keys for library reads.&lt;/li&gt;
&lt;li&gt;You’ll disclose AI-generated audio on Steam/itch if those sounds ship (plan for that; don’t skip the listening pass).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hybrid is normal: Kenney for UI baseline, Freesound for one irreplaceable foley, SFXMint for the rest of the event map an agent can fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent / API path (when it can pull WAV/MP3)
&lt;/h2&gt;

&lt;p&gt;Library &lt;strong&gt;search / role / set / get&lt;/strong&gt; on SFXMint is designed to work &lt;strong&gt;without an API key&lt;/strong&gt;. Generation (&lt;code&gt;generate_sound&lt;/code&gt;, etc.) needs a key and credits/plan—don’t let an agent burn paid calls unprompted. Free tiers have &lt;strong&gt;daily download allowances&lt;/strong&gt; (browser and API/MCP differ; see current site/docs). Listening in-browser isn’t the same meter as downloading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP (Claude Code):&lt;/strong&gt;&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;--transport&lt;/span&gt; http sfxmint https://sfxmint.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; (&lt;code&gt;.cursor/mcp.json&lt;/code&gt; or user config):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sfxmint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://sfxmint.com/mcp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Codex CLI:&lt;/strong&gt; &lt;code&gt;codex mcp add sfxmint --url https://sfxmint.com/mcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx sfxmint add coin jump hit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;REST sketch&lt;/strong&gt; (no key for search):&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="s1"&gt;'https://sfxmint.com/api/v1/search?q=click&amp;amp;max_duration_ms=300&amp;amp;format=wav&amp;amp;response=structured&amp;amp;limit=3'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Typical agent loop that stays honest: discover roles/sets → &lt;code&gt;search_sounds&lt;/code&gt; / &lt;code&gt;get_sound_set&lt;/code&gt; → download chosen format URLs into the repo → write &lt;code&gt;SOUNDS.md&lt;/code&gt; with page URL, CC0, checksum → wire events → &lt;strong&gt;you&lt;/strong&gt; preview in-game. If nothing matches, stop or open AI Studio; don’t silently weaken constraints. More prompt templates: &lt;a href="https://sfxmint.com/for-ai" rel="noopener noreferrer"&gt;sfxmint.com/for-ai&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;60-second human check:&lt;/strong&gt; open &lt;a href="https://sfxmint.com/" rel="noopener noreferrer"&gt;sfxmint.com&lt;/a&gt;, play a clip, download WAV or MP3 within the daily allowance, drop it in the project. License: &lt;a href="https://sfxmint.com/license" rel="noopener noreferrer"&gt;sfxmint.com/license&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats (keep these)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trust/SEO:&lt;/strong&gt; Freesound and Kenney dominate discovery. SFXMint is newer—evaluate the API yourself, don’t wait for folklore.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio origin:&lt;/strong&gt; AI/synth. Listen in context. Storefronts may ask you to disclose AI-made shipping content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limits:&lt;/strong&gt; Daily library download caps keep the free path alive; purchases raise limits. Generation commercial rules follow the site’s credit/plan text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coverage:&lt;/strong&gt; Good for UI, hits, whooshes, many game events—not a drop-in for every Freesound field recording. Kenney packs can still sound more “designed as a set.”&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Need &lt;strong&gt;coverage / weird real recordings&lt;/strong&gt; → Freesound (filter licenses).&lt;/li&gt;
&lt;li&gt;Need &lt;strong&gt;cohesive CC0 packs tonight&lt;/strong&gt; → Kenney.&lt;/li&gt;
&lt;li&gt;Already in &lt;strong&gt;Pixabay/OGA/ZapSplat&lt;/strong&gt; → stay, but read terms.&lt;/li&gt;
&lt;li&gt;Need &lt;strong&gt;uniform CC0 + keyless REST/MCP/CLI&lt;/strong&gt; so agents can pull WAV/MP3 → try &lt;a href="https://sfxmint.com/" rel="noopener noreferrer"&gt;SFXMint&lt;/a&gt; / &lt;a href="https://sfxmint.com/for-ai" rel="noopener noreferrer"&gt;for-ai&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use more than one source if the build needs it. Document license + SHA in-repo. Don’t ship unheard takes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Links:&lt;/em&gt; &lt;a href="https://sfxmint.com/" rel="noopener noreferrer"&gt;sfxmint.com&lt;/a&gt; · &lt;a href="https://sfxmint.com/license" rel="noopener noreferrer"&gt;license&lt;/a&gt; · &lt;a href="https://sfxmint.com/api/docs" rel="noopener noreferrer"&gt;API&lt;/a&gt; · &lt;a href="https://github.com/sfxmint/sfxmint-mcp" rel="noopener noreferrer"&gt;MCP GitHub&lt;/a&gt; · &lt;a href="https://www.npmjs.com/package/sfxmint" rel="noopener noreferrer"&gt;npm sfxmint&lt;/a&gt; · &lt;a href="https://huggingface.co/datasets/flreey/sfxmint-cc0-sound-effects" rel="noopener noreferrer"&gt;HF dataset&lt;/a&gt; · &lt;a href="https://doi.org/10.5281/zenodo.23750334" rel="noopener noreferrer"&gt;Zenodo 10.5281/zenodo.23750334&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>opensource</category>
      <category>ai</category>
      <category>sound</category>
    </item>
    <item>
      <title>I haven't written code in a year. Last week I forgot to git push and panicked</title>
      <dc:creator>flreey</dc:creator>
      <pubDate>Tue, 07 Apr 2026 07:56:00 +0000</pubDate>
      <link>https://dev.to/flreey/i-havent-written-code-in-a-year-last-week-i-forgot-to-git-push-and-panicked-16f5</link>
      <guid>https://dev.to/flreey/i-havent-written-code-in-a-year-last-week-i-forgot-to-git-push-and-panicked-16f5</guid>
      <description>&lt;p&gt;I lost my job two years ago.&lt;/p&gt;

&lt;p&gt;I have been a developer for ten years. So I did what a lot of out-of-work devs do. I started a side project to make some money.&lt;/p&gt;

&lt;p&gt;It's called &lt;a href="https://randtools.com" rel="noopener noreferrer"&gt;RandTools&lt;/a&gt;. It's a free website with 65 random generators. Random names, fake addresses, mock data for testing, dice rolls, color palettes. Boring stuff people Google when they need a quick answer. I built it pretty fast. I also didn't write a single line of the code. The AI wrote all of it.&lt;/p&gt;

&lt;p&gt;This is the part where I should feel weird. I don't really. I just describe what I want, the AI writes it, I read the diff, I check the build, I push. It works. About a year ago the AI got good enough that I stopped fighting it. After ten years of writing code by hand, I had quietly stopped writing it by hand. And I felt fine about it.&lt;/p&gt;

&lt;p&gt;Until last Tuesday morning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The coffee
&lt;/h2&gt;

&lt;p&gt;I had pushed a small update the night before. Some new combo generators. I went to bed.&lt;/p&gt;

&lt;p&gt;In the morning I made coffee and opened the site on my phone. I clicked around. Something felt off. The pages were loading slower than I remembered. Not broken slow. Just heavy.&lt;/p&gt;

&lt;p&gt;I ran PageSpeed Insights.&lt;/p&gt;

&lt;p&gt;Score: &lt;strong&gt;70&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The site used to be in the 90s. Always. I had checked it before. Now it was 70 and the report was a wall of red warnings. "222 KiB of unused JavaScript." "Render blocking requests." "Network dependency tree."&lt;/p&gt;

&lt;p&gt;I sat there with my coffee and thought, what the hell.&lt;/p&gt;

&lt;h2&gt;
  
  
  I blamed Cloudflare first
&lt;/h2&gt;

&lt;p&gt;My site runs on Cloudflare Workers. So my first guess was: it must be Cloudflare. Maybe their network had a bad day. Maybe my plan was too small. Maybe the cache was broken.&lt;/p&gt;

&lt;p&gt;I opened the Cloudflare dashboard. I read pages I had never read before. I looked at graphs I did not understand. I could not find anything obviously wrong, but by then I was already sure something was wrong with them, not with me.&lt;/p&gt;

&lt;p&gt;So I did the dumbest thing. I upgraded my plan. I gave them five dollars. I thought, maybe this will fix it.&lt;/p&gt;

&lt;p&gt;It did not fix it.&lt;/p&gt;

&lt;p&gt;I want to tell you I did this calmly. I did not. I was annoyed. I built this thing to make a little money and now it was slow for no reason and I no longer remembered how to debug a Next.js app.&lt;/p&gt;

&lt;h2&gt;
  
  
  I asked the AI
&lt;/h2&gt;

&lt;p&gt;I gave up trying to figure it out myself. I opened the AI chat I use for this project and pasted the PageSpeed screenshot. I said something like, "this is bad. what is it."&lt;/p&gt;

&lt;p&gt;The AI looked at the report and said: it's not Cloudflare. It's your own code. Your Header component is a client component. It imports something from a giant file with all your generator data. So every visitor downloads that giant file on every page, even though they only need one tiny piece of it.&lt;/p&gt;

&lt;p&gt;I read this and felt my face go warm.&lt;/p&gt;

&lt;p&gt;In my old life, before I let the AI write all my code, I would have known to check for this exact thing. The &lt;code&gt;'use client'&lt;/code&gt; boundary in Next.js has traps like this. Any senior Next.js dev knows about it. I knew about it once. Apparently I had stopped paying attention.&lt;/p&gt;

&lt;p&gt;The AI walked me through the fix. It was three small changes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Move the small piece (a list of category names) into its own tiny file.&lt;/li&gt;
&lt;li&gt;Change one import from &lt;code&gt;import&lt;/code&gt; to &lt;code&gt;import type&lt;/code&gt;. This single keyword tells TypeScript not to actually ship the file at runtime.&lt;/li&gt;
&lt;li&gt;Make some heavy data files lazy-loaded so they only download when you actually use them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That was the entire fix. The whole problem boiled down to one missing keyword and a few imports that should have been moved months ago.&lt;/p&gt;

&lt;p&gt;The AI did all of it. I read the diffs. They looked right. The build passed. I refreshed PageSpeed.&lt;/p&gt;

&lt;p&gt;Still 70.&lt;/p&gt;

&lt;h2&gt;
  
  
  I sat there for an hour
&lt;/h2&gt;

&lt;p&gt;I assumed the AI was wrong. I read the diffs again. The code looked correct. I ran the build again. It passed. I purged the Cloudflare cache. Twice. I tried PageSpeed in incognito mode.&lt;/p&gt;

&lt;p&gt;Still 70.&lt;/p&gt;

&lt;p&gt;I started to think maybe Next.js 16 itself had a real problem. Maybe I had to roll the project back. I thought about going back to bed and pretending none of this was happening.&lt;/p&gt;

&lt;p&gt;After about an hour of this, I went to my terminal and ran &lt;code&gt;git status&lt;/code&gt;. It said: &lt;code&gt;nothing to commit, working tree clean&lt;/code&gt;. I ran &lt;code&gt;git log&lt;/code&gt;. The latest commit was from that morning. The fix was committed.&lt;/p&gt;

&lt;p&gt;Then I ran &lt;code&gt;git ls-remote origin main&lt;/code&gt; to check what was on the server.&lt;/p&gt;

&lt;p&gt;The latest commit on the server was from the night before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I had never pushed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had spent an hour debugging a problem that didn't exist. The AI's fix was perfect. It just wasn't on the server. Because I forgot to type &lt;code&gt;git push&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I typed &lt;code&gt;git push&lt;/code&gt;. I waited two minutes for Cloudflare to deploy. I refreshed PageSpeed.&lt;/p&gt;

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

&lt;p&gt;I didn't celebrate. I just stared at the screen. The whole episode had taken most of my morning. Half of that was me being sure Cloudflare was the problem. Most of the rest was me being sure the AI was the problem. The actual time the fix took was maybe thirty minutes, and I hadn't personally written any of it.&lt;/p&gt;

&lt;p&gt;I opened my notes file and added a single line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-04-07 — PageSpeed back to 91. Header was importing
generators.ts in a 'use client' component. Forgot to push
for an hour like an idiot.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I went back to the Cloudflare dashboard and looked at the upgrade I had paid for that morning. It sat there quietly. It hadn't done anything. It was never going to do anything. I'd paid for it because I was too embarrassed to admit I no longer knew how to debug my own site.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing I did not expect to write
&lt;/h2&gt;

&lt;p&gt;I want to talk about the part of this that has been bothering me all week.&lt;/p&gt;

&lt;p&gt;For ten years, I was paid for what I knew. I knew which patterns to use. I knew where bugs hide. I knew the difference between &lt;code&gt;import&lt;/code&gt; and &lt;code&gt;import type&lt;/code&gt; without thinking. I could trace a webpack bundle in my head if I had to.&lt;/p&gt;

&lt;p&gt;That knowledge is still in my head. But I don't use it the way I used to.&lt;/p&gt;

&lt;p&gt;When the bug showed up on Tuesday, I did not investigate it the way ten-years-ago me would have. I did not open the Coverage tab in DevTools. I did not read my own build output. I did not trace any imports. I took a screenshot, sent it to the AI, and let the AI tell me what was wrong.&lt;/p&gt;

&lt;p&gt;Worse: the AI was right, and it was faster than I would have been.&lt;/p&gt;

&lt;p&gt;I have been thinking about this all week. I keep coming back to one feeling: &lt;strong&gt;the value of everything I learned in those ten years is dropping toward zero, and dropping fast&lt;/strong&gt;. I used to think my edge was knowing how to write code. Then I thought my edge was knowing what to ask the AI. Now I am not sure I can even tell when the AI is wrong — because when I forgot to push, my first instinct was that the AI was wrong, not that I had made a stupid mistake. I trusted my own broken intuition more than the tool. The tool was right. I was wrong.&lt;/p&gt;

&lt;p&gt;I don't have a clean ending for this. I can only tell you what Tuesday felt like after the panic was over.&lt;/p&gt;

&lt;p&gt;Ten years of writing code did not catch this bug. The AI caught it. The thing my ten years of experience was actually useful for was what came after the AI fixed it: knowing the fix made sense, knowing why it would work, and — eventually, after an hour — knowing to check the obvious dumb thing. Like whether I had run &lt;code&gt;git push&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That is not nothing. But it is also not what I trained for.&lt;/p&gt;

&lt;p&gt;If you are a senior dev right now and you feel like your skills are slowly turning into a hobby, I get it. Mine feel that way too. The code is not yours anymore. The bugs are not the kind of bugs you used to catch. Your job — if you still have one — is mostly about deciding which of the AI's answers are real and which look real but are not. That is a useful skill. It just is not the skill anyone hired you for.&lt;/p&gt;

&lt;p&gt;If you want to see the site this whole post is about, it's at &lt;a href="https://randtools.com" rel="noopener noreferrer"&gt;randtools.com&lt;/a&gt;. It's back to 91. I &lt;a href="https://github.com/flreey/randtools" rel="noopener noreferrer"&gt;open-sourced the landing page on GitHub&lt;/a&gt; if you want to look at the README. The actual project source is still private, mostly because I'm embarrassed about how little of it I wrote.&lt;/p&gt;

&lt;p&gt;And if you ever pay for a Cloudflare upgrade because your site is slow, please run &lt;code&gt;git status&lt;/code&gt; first. You will save yourself five dollars. And maybe a small piece of your dignity.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>ai</category>
      <category>career</category>
    </item>
  </channel>
</rss>
