<?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: Shreyas</title>
    <description>The latest articles on DEV Community by Shreyas (@kilqwe).</description>
    <link>https://dev.to/kilqwe</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%2F4164147%2F846dcca2-ba45-4ff8-8508-cfb1a20d512d.png</url>
      <title>DEV Community: Shreyas</title>
      <link>https://dev.to/kilqwe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kilqwe"/>
    <language>en</language>
    <item>
      <title>git-catchup CLI Tool</title>
      <dc:creator>Shreyas</dc:creator>
      <pubDate>Mon, 26 Oct 2026 06:39:05 +0000</pubDate>
      <link>https://dev.to/kilqwe/git-catchup-cli-tool-2jp</link>
      <guid>https://dev.to/kilqwe/git-catchup-cli-tool-2jp</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;git-catchup&lt;/strong&gt; is a command-line tool that gives you a short briefing on a git repository so you can pick up where you left off.&lt;/p&gt;

&lt;p&gt;When you return to a project after some time away, it takes effort to remember where you stopped. You typically have to read through recent commits, check what is uncommitted, and look for the TODO comments you left, just to rebuild the context before you can continue.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git catchup&lt;/code&gt; reduces that to a single command. Run it inside any repo and it prints a short briefing on the project and where you left off, so you can start working without reviewing the history first. It shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Done so far&lt;/strong&gt;: recent commit subjects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uncommitted&lt;/strong&gt;: what has changed in your working tree&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open&lt;/strong&gt;: TODO/FIXME comments, grouped by file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notes&lt;/strong&gt;: from your README and TODO/NOTES/ROADMAP files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start here&lt;/strong&gt;: one concrete next step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is useful for anyone who works on side projects, open-source contributions, or several repos at once, and who would rather run one command than reread the history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fc9s34tquj949pbjf1ntj.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%2Fc9s34tquj949pbjf1ntj.png" alt=" " width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Summary of the repo state.&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%2Fhgytvwhb7ksuhc2omrye.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%2Fhgytvwhb7ksuhc2omrye.png" alt=" " width="799" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git catchup --dry-run&lt;/code&gt; prints exactly what the model receives.&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/kilqwe" rel="noopener noreferrer"&gt;
        kilqwe
      &lt;/a&gt; / &lt;a href="https://github.com/kilqwe/hacktoberfest-week-3" rel="noopener noreferrer"&gt;
        hacktoberfest-week-3
      &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;git-catchup&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Catch up on where you left off.&lt;/strong&gt; Come back to any repo, finished or not, and one command tells you what the project is, what's done, what's still open, and what you'd planned next. It reads your commits, uncommitted work, TODO/FIXME comments, README and notes files (&lt;code&gt;TODO.md&lt;/code&gt;, &lt;code&gt;NOTES.md&lt;/code&gt;, &lt;code&gt;ROADMAP.md&lt;/code&gt;...), and a local open-weight model writes the briefing. Nothing leaves your machine.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ git catchup

 git catchup | branch: feature/discount-codes (base: main)
 Last commit: 10 days ago | uncommitted edits: 2 days ago
 Uncommitted files: 3 | secrets redacted: 1

**Where you left off** ...
**State of the work** ...
**Next step** ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dates, counts and branch names come straight from git. The model only writes the narrative, because small models are bad at facts they can simply look up.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install (Windows / macOS / Linux)&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; and pull a model: &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pip&lt;/code&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kilqwe/hacktoberfest-week-3" 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;&lt;strong&gt;Open-source AI used&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Models:&lt;/strong&gt; open-weight &lt;code&gt;gemma3:4b&lt;/code&gt; by default. I also tested &lt;code&gt;qwen2.5:3b&lt;/code&gt; and &lt;code&gt;llama3.2:3b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local inference:&lt;/strong&gt; &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, called over local HTTP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack:&lt;/strong&gt; Python 3.11+, standard library only, no dependencies. The model is selected with &lt;code&gt;--model&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How the project is built around the model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The model has a deliberately small job, and everything that can be checked is handled by plain code:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Python collects the facts.&lt;/strong&gt; Commits, uncommitted files, TODO/FIXME comments and notes are read from git and printed directly. None of that comes from the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secrets are removed before prompting.&lt;/strong&gt; Secret-looking lines are replaced with &lt;code&gt;[line omitted]&lt;/code&gt;, and &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.pem&lt;/code&gt; and key files are dropped from diffs. This is regex-based and best-effort.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python picks the "Start here" item.&lt;/strong&gt; Priority is a failing test, then a TODO/FIXME (edited files first), then the first line of a notes file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model writes three short fields only:&lt;/strong&gt; &lt;code&gt;project&lt;/code&gt;, &lt;code&gt;left_off&lt;/code&gt; and &lt;code&gt;next_step&lt;/code&gt;. The prompt is built conditionally, so the model only sees instructions that apply to the repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The output is validated.&lt;/strong&gt; It is checked against a JSON schema, retried once with the reasons if a check fails, and replaced per field by a Python fallback if it still fails. Checks include no secret-related words, no backticked filenames that don't exist in the repo, and &lt;code&gt;next_step&lt;/code&gt; must be an action, not a question or a list.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;git catchup --dry-run&lt;/code&gt; prints exactly what the model would see, so the prompt can be audited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparing models&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Same branch, three models, one flag. Everything above the divider is identical because plain code writes it from git. Gemma's briefing was cleanest, Llama's accurate but vague, and Qwen said a discount code had been added when it was already committed. Model quality also varies from run to run, which is why facts never come from the model.&lt;/p&gt;

&lt;p&gt;In all three runs the guard log was empty, so no guard fired.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;git catchup&lt;/code&gt; runs on unpushed, half-finished work, which is the code you are least likely to want to send to a third party. Open-weight models run through Ollama made that possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your code stays on your machine.&lt;/strong&gt; The briefing is generated locally, so work in progress is never uploaded anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline.&lt;/strong&gt; There is no network dependency, so it runs on a plane or with Wi-Fi off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swapping models takes one flag.&lt;/strong&gt; I compared Gemma, Llama and Qwen on the same branch with &lt;code&gt;--model&lt;/code&gt;, with no new account, API key or billing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is free to run.&lt;/strong&gt; There is no per-use cost, so it can be run every time you open a repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The prompt is fully visible.&lt;/strong&gt; &lt;code&gt;--dry-run&lt;/code&gt; prints exactly what the model receives, so nothing is hidden between the repo and the model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Closed APIs can also do this task, and many support structured output. For a command you run often on private code, local open-weight models were the better fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;On the demo branch I last touched 15 days ago, the manual route to get back into context is: read four commits, check &lt;code&gt;git status&lt;/code&gt;, search for TODOs and open the notes file. &lt;code&gt;git catchup&lt;/code&gt; gives all of that in one screen, plus a suggested starting point (&lt;code&gt;discounts.py&lt;/code&gt;, the TODO about unknown codes).&lt;/p&gt;

&lt;p&gt;The cost of running it is a single command.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; &lt;code&gt;git catchup&lt;/code&gt; uses &lt;code&gt;gemma3:4b&lt;/code&gt; as its default model, run locally through Ollama. In my three-model comparison on the same branch, Gemma's briefing was the cleanest: accurate, with a concrete next step taken from the TODO in the code.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Cred_Pred (A Credit Burn Analyzer)</title>
      <dc:creator>Shreyas</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:37:26 +0000</pubDate>
      <link>https://dev.to/kilqwe/credpred-a-credit-burn-analyzer-1e1g</link>
      <guid>https://dev.to/kilqwe/credpred-a-credit-burn-analyzer-1e1g</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Cred_Pred tells startups and solo developers when their cloud credits will run out, before they do.&lt;/p&gt;

&lt;p&gt;Founders on AWS Activate and similar programs get thousands of dollars in credits and then never track the burn. The credits vanish months early, or they expire half unused. cred_pred reads your Terraform (a file, a folder, or terraform show -json plan output) or a plain-English description. It prices the resources live through the Infracost API and reports monthly burn, runway in months, the run-out date, and how many credits will expire unused. A local open model writes a one-line cost saving tip.&lt;/p&gt;

&lt;p&gt;A GitHub Action runs it on every pull request and comments with how the PR changes your burn and runway. For example, a PR that moved a t3.large to a t3.xlarge and added a load balancer got this comment: &lt;br&gt;
burn $279.03 to $356.19 (+$77.16/mo), runway 17.9 to 14.0 months.&lt;/p&gt;

&lt;p&gt;Who pays: the CLI and the Action are free and open source. The side hustle is a hosted or scheduled version (weekly runway emails, Slack alerts, live spend tracking) as the paid tier.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fvox1abdefpob246uaj9n.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%2Fvox1abdefpob246uaj9n.png" alt="Github Actions Comment" width="799" height="446"&gt;&lt;/a&gt;&lt;br&gt;
Github Actions Comment&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%2F2ma1pqrb0uoz5k2u8rcf.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%2F2ma1pqrb0uoz5k2u8rcf.png" alt="Report Generated for the startup's terraform files" width="799" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Report Generated for the startup's terraform files&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/kilqwe" rel="noopener noreferrer"&gt;
        kilqwe
      &lt;/a&gt; / &lt;a href="https://github.com/kilqwe/hacktober-week-2" rel="noopener noreferrer"&gt;
        hacktober-week-2
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Credit burn predictor for startups and solo devs: feed it your Terraform, get live-priced monthly costs, how many months your cloud credits will last, and a cost-saving tip from a local open-source AI model. Runs in CI and comments on PRs. Hacktoberfest Week 2: Side Hustle.
    &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;Cred_Pred (A Credit Burn Analyzer)&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Know when your cloud credits will run out before they do.&lt;/p&gt;
&lt;p&gt;cred_pred reads your Terraform (or a plain-English description), prices the resources live through the Infracost API, and tells you your monthly burn, your runway in months, the date the credits run out, and how many credits will expire unused. A local open model (Ollama) writes a one-line cost-saving tip. A GitHub Action runs it on every pull request and comments with how the PR changes your burn and runway.&lt;/p&gt;
&lt;p&gt;Built for startups and solo developers with cloud credits (for example AWS Activate) who never track the burn. Hacktoberfest Week 2, theme: Side Hustle.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;this repo&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt;
cd &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;this repo&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt;
pip install &lt;span class="pl-k"&gt;-&lt;/span&gt;r requirements.txt
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; a free key from https://www.infracost.io&lt;/span&gt;
&lt;span class="pl-smi"&gt;$&lt;span class="pl-c1"&gt;env:&lt;/span&gt;INFRACOST_API_KEY&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;your-key&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or put it in a .env file&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; local&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kilqwe/hacktober-week-2" 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 rule behind the design: &lt;strong&gt;the model never does arithmetic and never prices anything.&lt;/strong&gt; Every dollar figure comes from live Infracost pricing, a local cache, or a flat estimate labelled as one. Local open models (via Ollama) have two jobs only:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Turn plain English into a resource inventory.&lt;/strong&gt; Python validates every entry (allowed kinds, instance-type pattern, sane quantity) before trusting it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write the advisor tip, behind a guard.&lt;/strong&gt; The guard rejects a tip that contains a dollar or percentage figure that was not in the facts it was given, or that names an instance type the user doesn't have. The model gets one retry, then the tool falls back to a rule-based tip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Models:&lt;/strong&gt; Gemma 3 (&lt;code&gt;gemma3:4b&lt;/code&gt;) is the default everywhere: the CLI, and the GitHub Action on the Actions runner. Swapping models takes one flag (&lt;code&gt;--model&lt;/code&gt;) or one GitHub variable (&lt;code&gt;CRED_MODEL&lt;/code&gt;). Temperature 0 and a fixed seed make runs repeatable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I benchmarked three models on 8 plain-English descriptions with known answers, and 3 advisor tips each, with prices fixed so every model saw identical facts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Inventories exactly right&lt;/th&gt;
&lt;th&gt;Item F1&lt;/th&gt;
&lt;th&gt;Extraction errors&lt;/th&gt;
&lt;th&gt;Avg extract time&lt;/th&gt;
&lt;th&gt;Tip passed 1st try&lt;/th&gt;
&lt;th&gt;Tip needed retry&lt;/th&gt;
&lt;th&gt;Tip fell back to rules&lt;/th&gt;
&lt;th&gt;Avg tip time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gemma3:4b&lt;/td&gt;
&lt;td&gt;5/8&lt;/td&gt;
&lt;td&gt;91%&lt;/td&gt;
&lt;td&gt;0 failed, 3 dropped&lt;/td&gt;
&lt;td&gt;3.4s&lt;/td&gt;
&lt;td&gt;3/3&lt;/td&gt;
&lt;td&gt;0/3&lt;/td&gt;
&lt;td&gt;0/3&lt;/td&gt;
&lt;td&gt;3.0s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen2.5:3b&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;0 failed, 0 dropped&lt;/td&gt;
&lt;td&gt;2.9s&lt;/td&gt;
&lt;td&gt;2/3&lt;/td&gt;
&lt;td&gt;0/3&lt;/td&gt;
&lt;td&gt;1/3&lt;/td&gt;
&lt;td&gt;3.6s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama3.2:3b&lt;/td&gt;
&lt;td&gt;4/8&lt;/td&gt;
&lt;td&gt;86%&lt;/td&gt;
&lt;td&gt;0 failed, 2 dropped&lt;/td&gt;
&lt;td&gt;3.0s&lt;/td&gt;
&lt;td&gt;0/3&lt;/td&gt;
&lt;td&gt;3/3&lt;/td&gt;
&lt;td&gt;0/3&lt;/td&gt;
&lt;td&gt;6.0s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What I learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Same numbers, different tips.&lt;/strong&gt; Costs were identical to the cent across models, because the model never touches the math.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The guard caught real hallucinations.&lt;/strong&gt; Earlier in development, one model invented an instance size that doesn't exist (&lt;code&gt;db.r5.xsmall&lt;/code&gt;), and another claimed a made-up size gives more power for the same cost. That is how the instance-name guard got added. In the final run, the guard rejected llama3.2:3b's first attempt on all three tips.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The guard doesn't catch bad advice.&lt;/strong&gt; One tip said to upgrade to a more powerful instance to reduce costs. It had no invented figure or name, so it passed. A Gemma tip said shrinking database storage would "significantly lower" a bill where storage was $2.30 of $279. Guards check facts, not judgment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model size didn't predict quality.&lt;/strong&gt; qwen2.5:3b was the most accurate at extraction. llama3.2:3b, also 3B, was the weakest and the slowest at tips, and its tips ran to two or three sentences when I asked for one line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where Gemma did well:&lt;/strong&gt; gemma3:4b was the only model whose tips all passed the guard on the first try. It was second on extraction, and extraction is the weak spot: it got 5 of 8 inventories exactly right.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limitations:&lt;/strong&gt; flat us-east-1 estimates (labelled in the report) for EBS, RDS storage, NAT, load balancers, Elastic IPs, EKS and Fargate. Usage-based costs (data transfer, load balancer capacity, CloudFront and S3 traffic) are invisible to Terraform, so real burn is higher. Lambda, S3, CloudFront and ECR aren't priced, and the report names them. The &lt;code&gt;.tf&lt;/code&gt; parser can't expand modules or &lt;code&gt;for_each&lt;/code&gt;, so plan JSON is the exact route.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy.&lt;/strong&gt; Infrastructure files describe your network, databases and account layout. With a local model, they never leave your machine or CI runner. With a hosted API, every pull request would send them to a third party.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost.&lt;/strong&gt; Inference is free, so the tool can run on every PR instead of once a month. A per-call fee would push you to run it less.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable models.&lt;/strong&gt; Changing models is one variable, which made the bake-off possible and let me see that the model with the best extraction (qwen) wasn't the one with the safest tips (gemma3).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;A friend who works at a startup let me run the tool on a real Terraform project: 11 files covering an ECS Fargate service, an ALB, an EC2 instance, RDS Postgres, and CloudFront and S3. It's an older project, so I can't compare against a real bill.&lt;/p&gt;

&lt;p&gt;cred_pred priced the stack at &lt;strong&gt;$81.37/mo&lt;/strong&gt;, about 61 months of runway on $5,000 in credits. It named the four resource types it couldn't price (CloudFront, S3 and two ECR types), so the report flags the runway as an upper bound. The EC2 and RDS lines came back from live Infracost pricing. The biggest line, Fargate at 35% of the total, is a labelled flat estimate, and the report notes that Spot would make it cheaper.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma runs the advisor tip and plain-English parsing locally through Ollama. &lt;code&gt;gemma3:4b&lt;/code&gt; is the default model in the CLI and in the GitHub Action on the runner. It was the only model whose tips all passed the guard on the first try in the bake-off.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Trail Echo: An Offline Bird Logger Built on BirdNET</title>
      <dc:creator>Shreyas</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:03:19 +0000</pubDate>
      <link>https://dev.to/kilqwe/trail-echo-an-offline-bird-logger-built-on-birdnet-inh</link>
      <guid>https://dev.to/kilqwe/trail-echo-an-offline-bird-logger-built-on-birdnet-inh</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Trail Echo is an offline bird logger. It listens in 60-second chunks, identifies species with the open BirdNET model, throws away chunks where nothing was heard, and gives you a dashboard of every bird you passed once you're back.&lt;/p&gt;

&lt;p&gt;The touch-grass idea: the screen is for &lt;em&gt;afterwards&lt;/em&gt;. During a walk, the device sits in a bag or pocket and listens, so you can look up at the trees instead of down at an identification app. At the end of the walk you get a species list and a timeline of when each bird was heard. It's for casual walkers and city dwellers who hear birds all the time and never learned their names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current status:&lt;/strong&gt; the live logger is tested with system-audio capture on PC and microphone. Also tested with microphones on phone that connects to the same pipeline after media type conversions (from .m4a to .wav); field audio to be recorded on a phone and run through the same pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2F9ldaeitrekjb4cuaz4az.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%2F9ldaeitrekjb4cuaz4az.png" alt=" " width="782" height="203"&gt;&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%2Ffuw6rklf7aksd4l57o5e.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%2Ffuw6rklf7aksd4l57o5e.png" alt=" " width="799" height="322"&gt;&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%2Frs1prx84ej9h1hmzwd3j.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%2Frs1prx84ej9h1hmzwd3j.png" alt=" " width="800" height="261"&gt;&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%2Fmj1uok3b1leajyyfz0h3.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%2Fmj1uok3b1leajyyfz0h3.png" alt=" " width="799" height="228"&gt;&lt;/a&gt;&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/kilqwe" rel="noopener noreferrer"&gt;
        kilqwe
      &lt;/a&gt; / &lt;a href="https://github.com/kilqwe/hacktoberfest-week-1" rel="noopener noreferrer"&gt;
        hacktoberfest-week-1
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Offline bird logger built on BirdNET. Hacktoberfest 2026, Week 1: Touch Grass.
    &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;Trail Echo&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Offline bird logger built on &lt;a href="https://github.com/birdnet-team/BirdNET-Analyzer" rel="noopener noreferrer"&gt;BirdNET&lt;/a&gt;
It listens in 60-second chunks, identifies species locally, discards chunks with
no detections, and shows everything heard in a Streamlit dashboard.&lt;/p&gt;
&lt;p&gt;Built for Hacktoberfest 2026, Week 1: Touch Grass. The idea is to leave the
device in your pocket during a walk and look at the results afterwards.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;capture audio → BirdNET analysis → CSV per chunk → Streamlit dashboard&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chunks with no detections are deleted automatically (audio and CSV), so
storage only grows when something is heard.&lt;/li&gt;
&lt;li&gt;All inference runs locally. No audio leaves your machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Status&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Tested: The microphone successfully captures the sound of the birds (captured using xeno-canto and youtube).
Using BirdNET-Analyzer the app can successfully identify the bird species with confidence of &amp;gt;95%
Not yet tested: outdoor field recording on a real walk.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python -m venv .venv
.venv&lt;span class="pl-cce"&gt;\S&lt;/span&gt;cripts&lt;span class="pl-cce"&gt;\a&lt;/span&gt;ctivate          &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kilqwe/hacktoberfest-week-1" 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;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open model:&lt;/strong&gt; BirdNET (TensorFlow, Cornell Lab of Ornithology and Chemnitz University of Technology), run locally through &lt;code&gt;birdnet-analyzer&lt;/code&gt;. The species list it loaded had 6,522 species.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture:&lt;/strong&gt; &lt;code&gt;sounddevice&lt;/code&gt; for microphones and WASAPI loopback via
&lt;code&gt;PyAudioWPatch&lt;/code&gt;; &lt;code&gt;soundfile&lt;/code&gt; writes the chunks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline:&lt;/strong&gt; record a chunk, call BirdNET, read the CSV, delete the audio and CSV if there are no detections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard:&lt;/strong&gt; Streamlit and pandas: species table, detections per minute, raw log.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What broke along the way:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BirdNET failed silently because I hid subprocess errors, so the script printed success while writing nothing.&lt;/li&gt;
&lt;li&gt;The laptop mic was near-silent, and audio enhancements gated sustained sounds like chirping after about a second.&lt;/li&gt;
&lt;li&gt;Some device paths returned garbage values in the billions, so I added level checks.&lt;/li&gt;
&lt;li&gt;Storage: 60 s of WAV is about 5 MB, so chunks with no detections are deleted automatically.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A bird logger hears everything around you, including conversations on the trail. Because BirdNET's weights are public, inference runs entirely on my own machine:&lt;br&gt;
no audio leaves the device, nothing needs a signal on a hillside, and there are no per-request fees for hours of recording. I could also read the pipeline and tune it (confidence threshold, chunk length, and later location and week filters) instead of waiting for an API to expose those options. A closed cloud API would have meant uploading hours of ambient audio. One caveat: BirdNET's model is licensed CC BY-NC-SA, so this is a non-commercial project.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
