<?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: HarshadaGirase</title>
    <description>The latest articles on DEV Community by HarshadaGirase (@harshadagirase).</description>
    <link>https://dev.to/harshadagirase</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%2F1367913%2F54194f34-a6d6-4999-a926-fa92bd7d3787.jpeg</url>
      <title>DEV Community: HarshadaGirase</title>
      <link>https://dev.to/harshadagirase</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harshadagirase"/>
    <language>en</language>
    <item>
      <title>I stopped hunting for good first issues. A Gemma inside GitHub Actions does it while I sleep</title>
      <dc:creator>HarshadaGirase</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:20:01 +0000</pubDate>
      <link>https://dev.to/harshadagirase/i-stopped-hunting-for-good-first-i-stopped-hunting-for-good-first-issues-a-gemma-inside-github-3k8p</link>
      <guid>https://dev.to/harshadagirase/i-stopped-hunting-for-good-first-i-stopped-hunting-for-good-first-issues-a-gemma-inside-github-3k8p</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;FirstPick&lt;/strong&gt; finds beginner-friendly GitHub issues in open-source AI repos, drops the ones someone has already taken, and hands me the 5 best, explained in plain English by Gemma running on my own laptop.&lt;/p&gt;

&lt;p&gt;I wanted my first contribution to an AI library. Searching "good first issue" meant ten tabs, and most of them were closed, assigned, already had a pull request, or had a "can I work on this?" comment from weeks ago. FirstPick does that digging for me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collects&lt;/strong&gt; open, unassigned issues labeled &lt;code&gt;good first issue&lt;/code&gt; / &lt;code&gt;beginner&lt;/code&gt; / &lt;code&gt;easy&lt;/code&gt; from 8 active Python AI repos (transformers, datasets, peft, langchain, llama_index, gradio, scikit-learn, keras).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scores&lt;/strong&gt; them against my profile (Python, LLMs, NLP), how new they are, and how few comments they have.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-checks the top 15 live&lt;/strong&gt; right before delivering, and drops anything closed, assigned, linked to a pull request, or claimed in the comments ("I'd like to work on this", "assign me", ...).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explains&lt;/strong&gt; the top 5 with a local Gemma: a summary, a difficulty rating with the reason, what you'd learn, and 2–4 first steps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Who gets to be lazier? Me, and any beginner who wants to contribute to AI open source but doesn't know where to start.&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%2F00juy1aas9kc0zb8u1r8.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%2F00juy1aas9kc0zb8u1r8.png" alt=" " width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try it yourself. &lt;code&gt;dry-run&lt;/code&gt; writes a local preview and posts nothing:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/HarshadaGirase/FirstPick.git
cd FirstPick
pip install -r requirements.txt
echo "GITHUB_TOKEN=&amp;lt;your token&amp;gt;" &amp;gt; .env
ollama pull gemma3:4b
python main.py collect
python main.py dry-run
python -m pytest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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/HarshadaGirase" rel="noopener noreferrer"&gt;
        HarshadaGirase
      &lt;/a&gt; / &lt;a href="https://github.com/HarshadaGirase/FirstPick" rel="noopener noreferrer"&gt;
        FirstPick
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&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;Model:&lt;/strong&gt; Gemma 3 4B (&lt;code&gt;gemma3:4b&lt;/code&gt;), running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. No API key, no cloud LLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; plain Python 3.11 with only &lt;code&gt;requests&lt;/code&gt;, &lt;code&gt;PyYAML&lt;/code&gt; and &lt;code&gt;pytest&lt;/code&gt;. No frameworks, so a beginner can read every file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub REST API&lt;/strong&gt; for search, issue timelines (to spot linked PRs) and comments (to spot claims).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I treat the issue text as &lt;strong&gt;untrusted&lt;/strong&gt;, and the model's answers too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The issue body goes inside &lt;code&gt;&amp;lt;issue&amp;gt;&lt;/code&gt; tags, and the system prompt says it's data, not instructions. Issue text can't close that tag early: any &lt;code&gt;&amp;lt;issue&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;/issue&amp;gt;&lt;/code&gt; inside it is replaced before the model sees it.&lt;/li&gt;
&lt;li&gt;HTML comments and images are stripped before the model sees anything.&lt;/li&gt;
&lt;li&gt;Ollama is called with a &lt;strong&gt;JSON schema&lt;/strong&gt;, and every answer is checked again in Python: required fields, length limits, and a difficulty that must be &lt;code&gt;easy&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt; or &lt;code&gt;tricky&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hallucination guard:&lt;/strong&gt; any file path, URL or function name in the answer must appear in the original issue, or the answer is rejected. The model gets one retry that says what was wrong; after that, the issue falls back to its title plus "explanation unavailable".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No noise for maintainers:&lt;/strong&gt; all text is HTML-escaped, and &lt;code&gt;@username&lt;/code&gt; / &lt;code&gt;#123&lt;/code&gt; are wrapped in backticks, so the digest never pings anyone or adds a "mentioned this" to their issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An offline test suite (35 tests, using saved JSON responses) covers the re-check rules, sent-issue deduplication, escaping, and model-output validation, including the retry and fallback paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Broke Along the Way
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub's secondary rate limit.&lt;/strong&gt; My first real &lt;code&gt;collect&lt;/code&gt; run died after about 10 seconds with &lt;code&gt;403: You have exceeded a secondary rate limit&lt;/code&gt;. I already handled &lt;code&gt;Retry-After&lt;/code&gt; and &lt;code&gt;X-RateLimit-Remaining&lt;/code&gt;, but this response had neither header, so my code treated it as a real error and stopped. Now it recognises the message, waits 60 seconds (120 on the second try), and retries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A broken Ollama install hid behind a vague error.&lt;/strong&gt; Every model call returned &lt;code&gt;500 Internal Server Error&lt;/code&gt;. Fetching Ollama's actual error showed the real cause: its &lt;code&gt;llama-server&lt;/code&gt; binary was missing, so it couldn't run &lt;em&gt;any&lt;/em&gt; model. I changed FirstPick to show Ollama's own error message instead of a bare 500, so the next person sees the cause straight away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My scoring counted "LLMs" twice.&lt;/strong&gt; To match both "LLM" and "LLMs", I searched for both, so any issue that said "LLMs" got two points for one interest. Now each profile word counts once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The hallucination guard over-reported.&lt;/strong&gt; A single made-up path like &lt;code&gt;src/peft/utils/fake_helpers.py&lt;/code&gt; was reported three times: the path, then &lt;code&gt;fake_helpers.py&lt;/code&gt; and &lt;code&gt;fake_helpers&lt;/code&gt; found inside it. Now a path is removed from the text once it's matched, so each made-up name is reported once.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;FirstPick feeds text written by strangers to a model, every time it runs. With an open-weight model running locally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No API bill, no key to leak or store as a CI secret.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone can fork it&lt;/strong&gt; and run it for their own skills without signing up for anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I control everything:&lt;/strong&gt; the model version, the temperature, the JSON schema. Nothing changes under me, and nothing is sent to a third-party AI service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed API would have meant a paid key, a secret to manage, and a reason for other beginners not to fork it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A scheduled &lt;strong&gt;GitHub Actions&lt;/strong&gt; workflow: collect every 6 hours, deliver every evening, with Gemma running on the runner.&lt;/li&gt;
&lt;li&gt;An eval script measuring JSON validity, difficulty agreement with my own labels, and prompt-injection resistance.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 3 4B runs locally through Ollama and writes every explanation, constrained by a JSON schema and checked by a hallucination guard.&lt;/li&gt;
&lt;/ul&gt;

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