<?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: Jim L</title>
    <description>The latest articles on DEV Community by Jim L (@jim_l_efc70c3a738e9f4baa7).</description>
    <link>https://dev.to/jim_l_efc70c3a738e9f4baa7</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%2F3766233%2F709db6b4-8669-45ab-9e00-5fd8f0a97aba.png</url>
      <title>DEV Community: Jim L</title>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jim_l_efc70c3a738e9f4baa7"/>
    <language>en</language>
    <item>
      <title>Why My Bongo Cat Drop-Rate Tool Refuses to Give You a Single Legendary Percentage</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Wed, 29 Jul 2026 05:32:16 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/why-my-bongo-cat-drop-rate-tool-refuses-to-give-you-a-single-legendary-percentage-282b</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/why-my-bongo-cat-drop-rate-tool-refuses-to-give-you-a-single-legendary-percentage-282b</guid>
      <description>&lt;p&gt;I write small calculators for a Roblox fan-wiki as a side project, and the Bongo Cat drop-rate tool is the one where I almost shipped a number I couldn't actually back up. The naive version is easy: take the community-reported Legendary chest rate (roughly 1 in 500,000, since the developer has never published an official table) and divide it by 12, because there are 12 base-pool Legendary items, and print "1 in 41,666 chance of this specific hat." It reads clean. It's also fabricated precision, because nobody has published the individual weight on any of those 12 items, and averaging assumes they're evenly weighted, which is an assumption, not a fact.&lt;/p&gt;

&lt;p&gt;So the tool only ever reports per-rarity-tier odds, never per-item. Common 90 percent, Uncommon 9.5 percent, Rare 0.49 percent, Epic 0.01 percent, Legendary about 1 in 500,000, as a tier, full stop. If a player wants a specific Legendary, the honest answer is "somewhere between 1 in 500,000 and 1 in 6,000,000 depending on how the game actually weights them, and nobody outside the dev team knows which end it's closer to." That's a worse-feeling answer than a clean percentage. It's also the true one.&lt;/p&gt;

&lt;p&gt;The other thing I left alone on purpose: add up the five community-reported rarity percentages and you get roughly 100.0002 percent, not a clean 100. That's rounding noise from wherever the original community data was collected, not my error. I could silently normalize it to exactly 100 and nobody would notice. I didn't, because doing that would make the numbers look more precise than the source data actually is, and the entire point of the tool is not doing that.&lt;/p&gt;

&lt;p&gt;Chest cadence is the third assumption I left exposed instead of hardcoding. The community estimate is roughly one chest per 30 minutes of active keyboard and mouse use, but the developer has never published the real cadence either, so the tool treats it as an editable input the player sets themselves rather than a baked-in constant.&lt;/p&gt;

&lt;p&gt;None of this is complicated engineering. It's three small refusals: don't divide by an unknown weight distribution, don't silently normalize rounding noise, don't hardcode an unpublished rate as fact. The calculator itself is live at &lt;a href="https://bongocat.wiki/tools/drop-rates?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=drop-rates-honest-math" rel="noopener noreferrer"&gt;bongocat.wiki/tools/drop-rates&lt;/a&gt; if you want to see what "honestly uncertain" looks like as an actual UI instead of a caveat paragraph nobody reads.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Needed a Signature Stamp by 9 AM. The Print Shop Wanted 3 Days.</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Mon, 27 Jul 2026 02:00:09 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/i-needed-a-signature-stamp-by-9-am-the-print-shop-wanted-3-days-1104</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/i-needed-a-signature-stamp-by-9-am-the-print-shop-wanted-3-days-1104</guid>
      <description>&lt;p&gt;The stamp shop wanted 3 business days and $38 for a signature stamp I needed by 9am the next morning, for a stack of paper contracts a client's compliance team insisted on printing and physically signing. I called two more shops. Same answer: 2 to 3 days, because the die gets cut by hand and neither branch had my exact size in stock.&lt;/p&gt;

&lt;p&gt;I ended up making one myself from my laptop instead, using an online stamp generator (&lt;a href="https://stampmakertool.com" rel="noopener noreferrer"&gt;stampmakertool.com&lt;/a&gt;) that lets you draw or upload a signature, pick a stamp style, and export a transparent PNG at print resolution. Four minutes, most of which was me redrawing my own signature three times because the first two looked like someone else forged it.&lt;/p&gt;

&lt;p&gt;It's not a real rubber stamp, and I want to be upfront about that. If you need an actual embossed stamp for a notarized document or a company chop a bank teller can feel with their thumb, this doesn't replace that. It's a flat image you print or place digitally. For me it was fine: the client just wanted a scanned PDF back with a stamp graphic in the signature block, not a wet-ink original.&lt;/p&gt;

&lt;p&gt;What I didn't expect was how often I'd reuse the file afterward. I've since used the same PNG on two invoice templates and one grant cover sheet, because once it exists as a transparent image, dropping it into a doc takes ten seconds instead of hunting down the physical stamp, finding the ink pad, and pressing it straight the first time.&lt;/p&gt;

&lt;p&gt;If your stamp need is one-off and not legally binding (invoices, internal paperwork, personal projects) the online version is faster and cheaper than reordering the physical one. If it has to survive a notary or a bank counter, call the shop and budget the 3 days.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The One Feature I Shipped That Doesn't Get a Second Try</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Sat, 25 Jul 2026 02:09:52 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/the-one-feature-i-shipped-that-doesnt-get-a-second-try-1ai8</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/the-one-feature-i-shipped-that-doesnt-get-a-second-try-1ai8</guid>
      <description>&lt;p&gt;Every feature I've shipped has a quiet second chance built into it. Ship it Monday, notice the copy is confusing, fix it Tuesday, nobody remembers by Friday. Then a customer wrote in asking for a song to play the second he got down on one knee, and I realized I'd never built anything before that only gets to work once.&lt;/p&gt;

&lt;p&gt;I run a small AI custom-song generator. Most of what people order is birthday songs, anniversary songs, the occasional "get well soon" for a grandparent. Those are forgiving in a way I didn't appreciate until I started getting proposal requests. A birthday song can be a little corny and still land fine, because the room already knows why everyone's there and the bar is "nice surprise," not "life-altering moment." If the song is slightly off-key on the emotional register, someone laughs, someone claps, the cake still gets eaten.&lt;/p&gt;

&lt;p&gt;A proposal song has none of that slack. It plays once, in front of one person, at the exact second someone's future either does or doesn't change. There's no changelog. If the tone is wrong, if it comes off cheesy instead of sincere, or sincere in a generic way instead of sincere about these two specific people, that's the whole experience. You can't push a hotfix to a moment that already happened.&lt;/p&gt;

&lt;p&gt;That constraint changed how I had to think about the generation pipeline, not just the marketing copy. A normal feature I can ship at 80% and learn from real usage. With this one, "learn from real usage" means learning from someone's actual proposal, which is not a data source I get to iterate against. So the work moved upstream: instead of generating a song and hoping the tone lands, I had to get much more aggressive about constraining the input before generation even starts. More specific prompts about how the couple actually talks to each other, not generic "romantic" adjectives. A pacing structure that builds instead of front-loading the big swell, because in real proposals the emotional peak is a spoken sentence, not a chorus, and the song has to make room for that instead of competing with it. I also started defaulting to slightly less polished, more conversational lyrics over anything that sounded like a greeting card, because "sincere but plain" survives a live moment much better than "polished but generic."&lt;/p&gt;

&lt;p&gt;Here's a composite version of the kind of request that made this obvious (details changed, but the shape is real): a guy wanted a song for a proposal at the restaurant where he'd had his first date, and his first draft of a description was basically "make it romantic, upbeat, something like a wedding song." That's exactly the input that produces the generic result I was worried about. What actually worked was pushing him to describe one specific dumb thing they do together, a joke only the two of them would get, and building the song around that instead of around "romantic" as a mood. The version with the inside joke in the second verse is the one he said made her cry before he even got the ring out. The version without it would have been a perfectly fine song that happened to play during the most important five minutes of his year.&lt;/p&gt;

&lt;p&gt;That's the part of building this that I didn't expect going in: most AI-generated content gets forgiven for being a little generic, because there's always a next post, a next draft, a next version. A proposal song doesn't get that forgiveness, and building for zero forgiveness turned out to be a genuinely different design problem than building for "good enough, iterate later."&lt;/p&gt;

&lt;p&gt;I laid out the actual constraints I build around now, prompt structure and all, on &lt;a href="https://songmemento.com/song-to-propose" rel="noopener noreferrer"&gt;the proposal-song page&lt;/a&gt;, if you want to see what changed after I started treating this as a one-shot problem instead of a normal feature.&lt;/p&gt;

</description>
      <category>indiehacker</category>
      <category>ai</category>
      <category>sideprojects</category>
      <category>product</category>
    </item>
    <item>
      <title>I Got Tired of AI Quiz Tools Making Up Facts That Weren't In My Notes, So I Built One That Can't</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Fri, 17 Jul 2026 21:34:11 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/i-got-tired-of-ai-quiz-tools-making-up-facts-that-werent-in-my-notes-so-i-built-one-that-cant-3c99</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/i-got-tired-of-ai-quiz-tools-making-up-facts-that-werent-in-my-notes-so-i-built-one-that-cant-3c99</guid>
      <description>&lt;p&gt;Two nights before a chemistry final, I pasted my notes into an AI quiz generator to test myself. One question asked about a reaction I never studied. I got it wrong, looked it up afterward, and it wasn't in my notes at all. The tool had just made it up.&lt;/p&gt;

&lt;p&gt;I went looking for a better one and hit the same wall three more times with three different tools. Paste your notes, get a quiz, and somewhere in the output is a question built on a fact your source material never mentioned. Nobody flags it. You just find out when you're wrong about something you were sure you'd studied.&lt;/p&gt;

&lt;p&gt;The failure mode makes sense once you think about how these tools are built. Most of them prompt an LLM with something like "generate 10 quiz questions from this text" and print whatever comes back. The model is good at sounding right. It is not naturally good at staying inside the boundary of what you actually gave it, and a prompt that says "don't hallucinate" is a request, not a constraint. The model can ignore it and you'd never know from the output alone.&lt;/p&gt;

&lt;p&gt;So I built QuizPaste around a different idea: don't ask the model to be honest, check it. When it generates a question, it has to also point at the sentence in your source text the question came from. Before that question ever gets shown to you, the code tries to actually locate that sentence in your original text. If it can't find it (wrong wording, a made-up detail, or the line just isn't there), the question gets thrown out silently and never reaches you. You only ever see questions the tool can prove came from your own material. Open any question and you can see the exact line highlighted.&lt;/p&gt;

&lt;p&gt;Using it is the boring part, on purpose. Paste lecture notes or a block of text, or grab a YouTube video's transcript (open the video, three dots, "Show transcript," copy the panel text, paste it in). There's no scraping involved, so it doesn't break when YouTube changes something on their end. You get a practice quiz plus flashcards in about five seconds. You don't need an account for your first two runs a day. If you want more than that or want your history saved across devices, that's what the free account is for. Everything you generate exports to a tab-separated file Anki imports directly, plus a CSV if you'd rather handle it yourself, no watermark either way.&lt;/p&gt;

&lt;p&gt;What it doesn't do yet: there's no spaced-repetition scheduling built in. That's what exporting to Anki is for; I'm not trying to rebuild Anki's scheduler badly. No packaged .apkg file yet, just the .tsv/CSV, though a real .apkg is on the list. No account sync unless you actually make an account. I'd rather ship the honest version of a feature than a half version that looks finished.&lt;/p&gt;

&lt;p&gt;The site's about four days old as I'm writing this. I don't have user numbers worth quoting and I'm not going to make any up. What I do have is a specific, fixable problem I kept hitting personally, and a fix that's a real constraint in the code rather than a line in the marketing copy. If you study from your own notes or a lecture recording and want to self-test without wondering whether a question is testing something you never actually wrote down, it's free to try at &lt;a href="https://quizpaste.com/" rel="noopener noreferrer"&gt;https://quizpaste.com/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>sideprojects</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The My Dino Park Offline Earnings Formula Everyone Uses Is Wrong</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Mon, 13 Jul 2026 08:50:44 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/the-my-dino-park-offline-earnings-formula-everyone-uses-is-wrong-4noe</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/the-my-dino-park-offline-earnings-formula-everyone-uses-is-wrong-4noe</guid>
      <description>&lt;p&gt;I did the multiplication before I went to bed. Income per minute times eight hours, and the number on my screen said I'd wake up rich. I woke up with maybe a third of that. Turns out the formula I used is the one everyone uses, and it's missing a piece nobody has published yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The formula that's technically right and practically wrong
&lt;/h2&gt;

&lt;p&gt;Offline earnings in My Dino Park work off a simple idea: your roster keeps earning Cash from visitor tours while you're away, calculated as income per minute times hours away. Each dino has a fixed rate. A T-Rex pulls around 2,500 per minute, a Spinosaurus or Triceratops sits in the 1,200 to 1,400 range, and Commons through Rares run anywhere from 50 to 700. Own two of the same dino and that rate doubles.&lt;/p&gt;

&lt;p&gt;Multiply that out for a full night offline and you get a big, satisfying number. The problem is that number is a ceiling, not a forecast, and the game almost certainly doesn't pay it out in full.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number nobody has confirmed
&lt;/h2&gt;

&lt;p&gt;Here's the part that's actually missing: no patch notes, no dev post, nothing official states what multiplier or time cap gets applied to your offline period. The straight-line formula assumes zero throttling, and that assumption is very likely wrong based on how offline systems work in comparable games. I say "almost certainly throttles" because that's the honest level of confidence available right now. Nobody outside the dev team has the real number.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to find your actual rate in 15 minutes
&lt;/h2&gt;

&lt;p&gt;Rather than trust a formula that's probably optimistic, run your own test. Check your Cash total, close the game (or let it sit idle) for 10 to 15 minutes, then check again. Subtract the difference and divide by minutes elapsed. That gives you your real offline rate for your current roster, throttle included, no guessing required.&lt;/p&gt;

&lt;p&gt;It's a small hassle, but it's the only way to get a number you can actually plan around instead of one that just looks good on paper. I keep the full formula, the per-dino rates, and the test method laid out on the &lt;a href="https://mydinopark.com/offline-earnings-calculator" rel="noopener noreferrer"&gt;offline earnings calculator&lt;/a&gt; page if you want to run it against your own roster instead of redoing the arithmetic by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth saying plainly
&lt;/h2&gt;

&lt;p&gt;This isn't a complete answer, and it won't be until someone at the studio confirms the real cap. What we have is verified as of today (2026-07-13), and dino games patch often enough that a rate confirmed this week could shift by next month. If you've already run the 15-minute test and gotten a number that doesn't match what I've described, that's useful data too. Until there's an official number, self-testing beats trusting a formula that was never designed to account for a throttle nobody's seen documented.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Your 200th Kraken Reroll Has the Same Odds as Your First</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Mon, 13 Jul 2026 08:50:11 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/why-your-200th-kraken-reroll-has-the-same-odds-as-your-first-8dn</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/why-your-200th-kraken-reroll-has-the-same-odds-as-your-first-8dn</guid>
      <description>&lt;p&gt;I used to keep a tally on a sticky note. Reroll count on the left, hope on the right. By reroll 80 I was convinced the Kraken owed me one. It doesn't work like that, and once I actually looked at the numbers I understood why my sticky note was lying to me the whole time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every reroll forgets the last one
&lt;/h2&gt;

&lt;p&gt;Kraken sits at 0.8% per reroll, pulled from the same weighted table as every other aura in the game. There's no hidden counter tracking your bad luck, no pity timer quietly filling up in the background. Each reroll is an independent event, which means your 200th attempt has exactly the same 0.8% shot as your 1st. The game has no memory of your streak, good or bad.&lt;/p&gt;

&lt;p&gt;That's a hard thing to sit with when you're deep into a grind, because it means there's no light at the end of a specific tunnel. There's just the same coin flip, over and over, weighted against you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the average actually tells you
&lt;/h2&gt;

&lt;p&gt;Run the math and you get roughly 125 rerolls to hit Kraken on average. That's an average, not a guarantee. Some players get it on reroll 12. Some are still going at reroll 600. If you want a number you can actually plan around, the 90% confidence threshold lands closer to 287 rerolls, meaning nine out of ten players will have it by then, and one out of ten is still grinding well past it.&lt;/p&gt;

&lt;p&gt;For comparison, Solar Fin (the other Legendary) sits at 0.5% per reroll, about 1 in 200 on average, so it's the rarer of the two. Go for either Legendary and your combined odds jump to 1.3% per reroll, roughly 1 in 77. If you're chasing Leviathan instead, that's Mythic tier and roughly 4x rarer than Kraken, so budget your patience accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where rerolls actually come from
&lt;/h2&gt;

&lt;p&gt;Codes are the fastest source, tied to milestones like BAITAURA or CCU thresholds, and new ones tend to drop roughly every 500 likes on the game's social pages. Outside of codes, you're generating rerolls more slowly through normal play. Neither path changes the underlying odds. A code-farmed reroll and a grind-farmed reroll are worth exactly the same 0.8%.&lt;/p&gt;

&lt;p&gt;I put the full breakdown, including the Solar Fin and Leviathan comparisons and how the reroll table is weighted, into a &lt;a href="https://beafishbait.com/how-to-get-kraken" rel="noopener noreferrer"&gt;Kraken drop rate guide&lt;/a&gt; if you want the numbers without doing your own spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest downside
&lt;/h2&gt;

&lt;p&gt;None of this makes the grind faster. Knowing the odds doesn't buy you a single extra percentage point, and there's a real chance you're the unlucky one out past 287 rerolls even after doing everything right. What it does buy you is knowing when to stop torturing yourself with a running tally that was never actually going somewhere. Track your reroll count if it helps you feel in control. Just don't expect reroll 300 to feel any different than reroll 1, because to the game, it doesn't.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Rejecting Anomalies Faster Protects Sanity Better Than Coffee in Animal Hospital</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Mon, 13 Jul 2026 08:45:51 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/why-rejecting-anomalies-faster-protects-sanity-better-than-coffee-in-animal-hospital-5hco</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/why-rejecting-anomalies-faster-protects-sanity-better-than-coffee-in-animal-hospital-5hco</guid>
      <description>&lt;p&gt;Most Animal Hospital teams die by coffee. They keep patching sanity that a single cursed photo already tore ten points out of, then act surprised when the desk turns frantic by the last shift. The part new players miss: your biggest sanity drain isn't the scares, it's the anomalies you wave through the desk.&lt;/p&gt;

&lt;p&gt;Sanity is the quiet timer running behind every decision in a run. Nobody shows you a scary number, but the whole team gets slower and jumpier as it slides, and once it gets low people start making desperate calls that cost you the round.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where your sanity actually goes
&lt;/h2&gt;

&lt;p&gt;The drains are not evenly sized. Some are small taxes you barely notice. One or two are muggings.&lt;/p&gt;

&lt;p&gt;A cursed photo is the big one. Check a photo that turns out cursed and you can lose around 10 sanity in a single instant, which is a rough amount to eat for one mistake. Distorted-looking photos are a smaller, steadier bleed every time you inspect them. Then there are the appearance events, like a Head Banger going off, plus the CCTV anomalies. A Black Eyes Red Eyes body or a hostile Skinwalker showing up on the cameras hits everyone, not just whoever is watching the feed.&lt;/p&gt;

&lt;p&gt;Look at what those have in common. Almost every one of them is a problem that already got past the desk and is now loose inside the hospital.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why correct rejection beats recovery items
&lt;/h2&gt;

&lt;p&gt;Coffee and food refill the bar, but they are finite and they only treat the symptom. The real sanity strategy sits one step upstream: reject the right patients at the desk. Every anomaly you catch and turn away is one fewer hostile thing wandering the halls to scare your team later. Get sharp at reading the desk and half your sanity problem never spawns.&lt;/p&gt;

&lt;p&gt;If you want the full breakdown of every drain and recovery source, the team wrote a &lt;a href="https://animalhospitalanomalies.com/guide/sanity" rel="noopener noreferrer"&gt;detailed sanity mechanics guide&lt;/a&gt; that lists the exact numbers and the recovery timing. The one timing rule worth memorizing: use coffee or food before the bar is almost gone, not after. The last few points of sanity are exactly when people panic and make bad calls, so spending a recovery item to stay out of that zone beats saving it for an emergency the item can't really fix anyway.&lt;/p&gt;

&lt;p&gt;Now the honest limitation. Correct rejection sounds clean written down, but reading anomalies under a shift timer is hard, and you will wave the occasional bad one through no matter how good you get. That's why recovery items still matter as a backstop. Rejection accuracy lowers how much sanity you bleed. Coffee and food buy back the mistakes you couldn't avoid. Lean on the first, keep the second in reserve, and the last shift stops feeling like a scramble.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I built a YouTube-to-blog tool. Here's what broke and what a 'credit' actually costs.</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Sun, 12 Jul 2026 11:18:51 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/i-built-a-youtube-to-blog-tool-heres-what-broke-and-what-a-credit-actually-costs-4kfe</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/i-built-a-youtube-to-blog-tool-heres-what-broke-and-what-a-credit-actually-costs-4kfe</guid>
      <description>&lt;p&gt;The first working version took a YouTube URL, waited about 40 seconds, and handed me an SEO blog draft. Then I looked at the token bill for that one run and it reorganized how I built everything after it.&lt;/p&gt;

&lt;p&gt;Here is the Day 2 build log. No users yet besides me and a testing account, so nothing here is a growth story. It's just what happened when I tried to turn a link into a post that ranks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I even started
&lt;/h2&gt;

&lt;p&gt;I record a podcast. A 52 minute episode, decent ideas, and my whole distribution was pasting the link into one feed. By lunch the good part was three screens down and gone. I kept telling myself I'd write it up later. Later never has time in it.&lt;/p&gt;

&lt;p&gt;I'm a developer, so instead of hiring that discipline I scripted it. Pull the transcript, restructure it into something a search engine and an AI answer engine will both pick up, and stop pretending I'll do it by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a "credit" actually costs
&lt;/h2&gt;

&lt;p&gt;One generation is one credit. Under the hood that credit is two model passes over the transcript, not one.&lt;/p&gt;

&lt;p&gt;A long episode transcript runs 15k to 20k tokens. The first pass does the structural work: a keyword-first title, a TL;DR that answers the query in the first two sentences, question-shaped H2s, and an FAQ block. The second pass is the part I care about most, and I'll get to it.&lt;/p&gt;

&lt;p&gt;Two passes over 20k tokens of context is a few cents of compute per generation, not a fraction of a cent. That number is why the free tier is 5 credits a month and not unlimited. I'd rather say "5 real runs, no card" than promise infinity and quietly throttle you. If you want to see the shape of the output before deciding anything, the &lt;a href="https://audiotopost.com/tools/youtube-to-blog" rel="noopener noreferrer"&gt;free YouTube-to-blog page runs the first generation with no signup&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke
&lt;/h2&gt;

&lt;p&gt;Fetching YouTube transcripts from a datacenter IP fails most of the time. My first deploy pulled captions maybe one run in six, and the failures weren't loud, they just returned empty and produced a confident blog post about nothing. I moved the fetch behind a residential path with retries before it was reliable. Boring infrastructure problem, real cost in hours.&lt;/p&gt;

&lt;p&gt;The second thing that broke was my ego about scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  The features I deliberately did not build
&lt;/h2&gt;

&lt;p&gt;Every competitor in this space does clips and audiograms. For a while I assumed I had to as well. I didn't build them, and that was the right call.&lt;/p&gt;

&lt;p&gt;Podsqueeze and Castmagic already do clips, audiograms, and team seats well. If that's the job, they're the better tool and I'll say so. Chasing them would have meant a worse version of a thing that exists. The one job nobody was doing cleanly for a solo creator was text that actually ranks, so I pointed everything at that and left the video stuff alone. Narrow on purpose beats broad and mediocre.&lt;/p&gt;

&lt;h2&gt;
  
  
  The de-slop pass
&lt;/h2&gt;

&lt;p&gt;That second model pass is a cleanup step, and it's the detail most developers will appreciate.&lt;/p&gt;

&lt;p&gt;AI drafts have tells. Em-dashes everywhere. "At its core." "Let that sink in." Three-item lists where two items were enough. The pass rewrites those out. Concretely, it strips every em-dash and en-dash to plain punctuation, because nothing screams generated like a wall of long dashes. I even verify it in a check rather than trusting the model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# 0x2014 em-dash, 0x2013 en-dash
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dash count:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x2014&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x2013&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that prints anything but zero, the draft doesn't ship. It's a small thing. Small things are the difference between a post a human wrote and a post a human is embarrassed to have their name on.&lt;/p&gt;

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

&lt;p&gt;Day 2. Zero real users. Free first run with no account, 5 credits a month after that. It also writes in Chinese, which the English-only tools don't. It won't cut you video clips or audiograms, and it isn't a podcast host. If you need those, I've already said which tools do them better.&lt;/p&gt;

&lt;p&gt;I built it because my own episodes kept dying in the feed. If yours do the same, that's the whole pitch. If you mainly want video clips, go use the tools that are good at video clips.&lt;/p&gt;

&lt;p&gt;I'll post the next log when something else breaks, which given Day 2 will be soon.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I built a rebirth calculator for Ice Tycoon 2 because I kept doing the math wrong in my head</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Thu, 09 Jul 2026 14:12:48 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/i-built-a-rebirth-calculator-for-ice-tycoon-2-because-i-kept-doing-the-math-wrong-in-my-head-1662</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/i-built-a-rebirth-calculator-for-ice-tycoon-2-because-i-kept-doing-the-math-wrong-in-my-head-1662</guid>
      <description>&lt;p&gt;Ice Tycoon 2 is a Roblox tycoon game where you reset your progress (a "rebirth") in exchange for a permanent income multiplier. The mechanic is simple. Knowing &lt;em&gt;when&lt;/em&gt; to do it is not, because the break-even point depends on your current income rate and how much the next rebirth actually multiplies, and the in-game UI doesn't show you either number clearly.&lt;/p&gt;

&lt;p&gt;I rebirthed too early twice and lost progress I could've kept for another ten minutes of grinding. Third time I just did the math on paper, and then figured I'd never do that again, so I built &lt;a href="https://icetycoon2.com/rebirth-calculator" rel="noopener noreferrer"&gt;a small calculator&lt;/a&gt; that takes your current stats and tells you the actual break-even point instead of a gut guess.&lt;/p&gt;

&lt;p&gt;While I was in there I added two more pages that solved problems I kept hitting:&lt;/p&gt;

&lt;p&gt;An &lt;a href="https://icetycoon2.com/upgrade-tier-list" rel="noopener noreferrer"&gt;upgrade tier list&lt;/a&gt; ranking which upgrades are worth buying first, because the in-game order isn't the efficient order.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://icetycoon2.com/gems" rel="noopener noreferrer"&gt;gem location page&lt;/a&gt; covering all 5 spots, two of which are genuinely easy to miss without a screenshot reference.&lt;/p&gt;

&lt;p&gt;Nothing fancy on the stack, just a static site with the calculator logic running client-side. It's at &lt;a href="https://icetycoon2.com" rel="noopener noreferrer"&gt;icetycoon2.com&lt;/a&gt; if you're playing and want to stop guessing like I did.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Three tiny Roblox helper sites I shipped this month</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Wed, 08 Jul 2026 11:44:50 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/three-tiny-roblox-helper-sites-i-shipped-this-month-4n3a</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/three-tiny-roblox-helper-sites-i-shipped-this-month-4n3a</guid>
      <description>&lt;p&gt;I keep a small habit of building single-purpose sites for the games my nephew and his friends actually play. Nothing ambitious — usually a codes list, a calculator or two, and whatever else saves a kid from digging through a dozen ad-choked wikis. Here's this round's three, in case the pattern is useful to anyone doing the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  A fishing-codes tracker
&lt;/h2&gt;

&lt;p&gt;The first, &lt;a href="https://beafishbait.com" rel="noopener noreferrer"&gt;Be a Fish Bait&lt;/a&gt;, came out of a Roblox fishing game where the promo codes rotate constantly and most listing pages sit weeks out of date. It's a codes page plus a small reroll-odds calculator, kept deliberately light so it loads fast on a phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  A dinosaur-park guide
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mydinopark.com" rel="noopener noreferrer"&gt;My Dino Park&lt;/a&gt; is the dino-collection one. The loop is basically hatch, grow, sell, reinvest, so I bolted on a payback calculator that estimates how long a given dino takes to earn back its cost. That's the question everyone asks in chat anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  An Ice Tycoon 2 hub
&lt;/h2&gt;

&lt;p&gt;The newest, over at &lt;a href="https://icetycoon2.com" rel="noopener noreferrer"&gt;icetycoon2.com&lt;/a&gt;, covers a tycoon game that's all about optimizing a production line. I leaned into interactive tools rather than static text here — a cost-per-upgrade helper and a codes list I re-check against the game most days.&lt;/p&gt;

&lt;p&gt;None of these try to be encyclopedias. One game, one page, a working tool, then get out of the way. If you build small niche sites too, I'd honestly rather trade notes on keeping data fresh than read another "10 best" listicle.&lt;/p&gt;

</description>
      <category>gamedevwebsideprojectdev</category>
    </item>
    <item>
      <title>I Compared 30+ Subscription Prices After Realizing I Was Overpaying by $240 a Year</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Sat, 04 Jul 2026 02:03:41 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/i-compared-30-subscription-prices-after-realizing-i-was-overpaying-by-240-a-year-1c33</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/i-compared-30-subscription-prices-after-realizing-i-was-overpaying-by-240-a-year-1c33</guid>
      <description>&lt;p&gt;I added up my subscriptions in January -- Netflix, Spotify, ChatGPT Plus, a VPN, Adobe -- and the total made no sense until I checked what the same plans cost through a different billing region or a family split. Turned out I was paying full individual price on three things that have a cheaper legitimate path most people never bother checking.&lt;/p&gt;

&lt;p&gt;That comparison turned into &lt;a href="https://subsaver.click" rel="noopener noreferrer"&gt;SubSaver&lt;/a&gt;, a small tool that lines up pricing across 30+ subscriptions side by side so you can see where the gap actually is instead of guessing.&lt;/p&gt;

&lt;p&gt;Nothing here is a workaround or a grey-market trick, it's just regional pricing and family/duo plans that already exist but aren't advertised next to the regular checkout page. Once I saw the numbers laid out I moved two subscriptions and the 40/year gap mostly closed itself.&lt;/p&gt;

&lt;p&gt;Built it because doing this math manually for even five services is annoying enough that most people just don't.&lt;/p&gt;

</description>
      <category>moneysaasproductivity</category>
    </item>
    <item>
      <title>Six Small Roblox Fan Sites I Built This Year</title>
      <dc:creator>Jim L</dc:creator>
      <pubDate>Sat, 04 Jul 2026 00:11:03 +0000</pubDate>
      <link>https://dev.to/jim_l_efc70c3a738e9f4baa7/six-small-roblox-fan-sites-i-built-this-year-5e1p</link>
      <guid>https://dev.to/jim_l_efc70c3a738e9f4baa7/six-small-roblox-fan-sites-i-built-this-year-5e1p</guid>
      <description>&lt;p&gt;Over the past few months I have shipped a handful of small, single-purpose Roblox fan sites. None of them are trying to be everything -- each one covers exactly one game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paint My Keyboard
&lt;/h2&gt;

&lt;p&gt;A companion page for the incremental/simulator-style Roblox game, with notes on upgrade order and what actually moves the needle early on.&lt;br&gt;
&lt;a href="https://paintmykeyboard.net" rel="noopener noreferrer"&gt;paintmykeyboard.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two pages people actually land on: &lt;a href="https://paintmykeyboard.net/rebirth-calculator" rel="noopener noreferrer"&gt;Paint My Keyboard rebirth calculator&lt;/a&gt; and &lt;a href="https://paintmykeyboard.net/best-paints" rel="noopener noreferrer"&gt;Paint My Keyboard paint tier efficiency guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anime Squadron Codes
&lt;/h2&gt;

&lt;p&gt;A running list of active codes for Anime Squadron, checked and pruned as codes expire.&lt;br&gt;
&lt;a href="https://animesquadroncodes.com" rel="noopener noreferrer"&gt;animesquadroncodes.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two pages people actually land on: &lt;a href="https://animesquadroncodes.com/tier-list" rel="noopener noreferrer"&gt;Anime Squadron tier list for the best units&lt;/a&gt; and &lt;a href="https://animesquadroncodes.com/summon-calculator" rel="noopener noreferrer"&gt;Anime Squadron summon calculator for banner odds&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clean The Supermarket
&lt;/h2&gt;

&lt;p&gt;Task-order notes for the supermarket-cleaning simulator -- mostly about not wasting moves.&lt;br&gt;
&lt;a href="https://cleanthesupermarket.com" rel="noopener noreferrer"&gt;cleanthesupermarket.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two pages people actually land on: &lt;a href="https://cleanthesupermarket.com/how-to-play" rel="noopener noreferrer"&gt;Clean the Supermarket beginner walkthrough&lt;/a&gt; and &lt;a href="https://cleanthesupermarket.com/badges" rel="noopener noreferrer"&gt;how to unlock every Clean the Supermarket badge&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clean The Library Roblox
&lt;/h2&gt;

&lt;p&gt;A shelf-lookup hub for the co-op library-sorting game -- type a book, get the shelf.&lt;br&gt;
&lt;a href="https://cleanthelibraryroblox.com" rel="noopener noreferrer"&gt;cleanthelibraryroblox.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two pages people actually land on: &lt;a href="https://cleanthelibraryroblox.com/book-locations" rel="noopener noreferrer"&gt;Clean the Library book locations and shelf map&lt;/a&gt; and &lt;a href="https://cleanthelibraryroblox.com/abilities" rel="noopener noreferrer"&gt;Clean the Library ability unlock order&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage Hunters Roblox
&lt;/h2&gt;

&lt;p&gt;A value tracker and bid calculator for the storage-auction game Storage Hunters Open World.&lt;br&gt;
&lt;a href="https://storagehuntersroblox.com" rel="noopener noreferrer"&gt;storagehuntersroblox.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two pages people actually land on: &lt;a href="https://storagehuntersroblox.com/mutations" rel="noopener noreferrer"&gt;all 23 Storage Hunters mutation multipliers&lt;/a&gt; and &lt;a href="https://storagehuntersroblox.com/value-calculator" rel="noopener noreferrer"&gt;Storage Hunters mutation value calculator&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Animal Hospital Anomalies
&lt;/h2&gt;

&lt;p&gt;An anomaly checklist for the Roblox game Animal Hospital -- cross-reference which variant you have found.&lt;br&gt;
&lt;a href="https://animalhospitalanomalies.com" rel="noopener noreferrer"&gt;animalhospitalanomalies.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;All six are solo-built, free, no accounts required. If you play any of these games I would genuinely like feedback on what is missing.&lt;/p&gt;

</description>
      <category>robloxgamingindie</category>
    </item>
  </channel>
</rss>
