<?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: qxmcu</title>
    <description>The latest articles on DEV Community by qxmcu (@qxmcu).</description>
    <link>https://dev.to/qxmcu</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%2F4013396%2F70562d9b-4e35-4d5c-af39-0434cc5ff432.jpg</url>
      <title>DEV Community: qxmcu</title>
      <link>https://dev.to/qxmcu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qxmcu"/>
    <language>en</language>
    <item>
      <title>I Built a Bot That Reproduces GitHub Bugs Automatically — Here's What Broke (and What I Learned)</title>
      <dc:creator>qxmcu</dc:creator>
      <pubDate>Fri, 28 Aug 2026 10:35:36 +0000</pubDate>
      <link>https://dev.to/qxmcu/i-built-a-bot-that-reproduces-github-bugs-automatically-heres-what-broke-and-what-i-learned-3b12</link>
      <guid>https://dev.to/qxmcu/i-built-a-bot-that-reproduces-github-bugs-automatically-heres-what-broke-and-what-i-learned-3b12</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;As a maintainer, even a solo one on a small project, the most time-consuming part of fixing a bug usually isn't writing the fix. It's &lt;em&gt;reproducing&lt;/em&gt; it. Someone files an issue, the description is vague, and you spend twenty minutes just trying to get your machine into the same broken state theirs is in before you can even start debugging.&lt;/p&gt;

&lt;p&gt;I wanted that step gone.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Ghost Hunter&lt;/strong&gt; is an open-source CLI + webhook bot that automates bug reproduction on GitHub. Comment &lt;code&gt;bot/reproduce&lt;/code&gt; on any issue, and it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parses the issue text with an LLM to extract environment details and repro steps&lt;/li&gt;
&lt;li&gt;Spins up an isolated Docker container matching that environment&lt;/li&gt;
&lt;li&gt;Actually runs the reproduction steps inside the sandbox&lt;/li&gt;
&lt;li&gt;Posts the crash logs back to the issue automatically&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No more "can you share more details?" back and forth. No more manually setting up an environment just to confirm a bug is real.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ghost init      &lt;span class="c"&gt;# set up auth + LLM keys&lt;/span&gt;
ghost serve     &lt;span class="c"&gt;# start the webhook listener&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comment &lt;code&gt;bot/reproduce&lt;/code&gt; on an issue, and Ghost Hunter takes it from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I didn't expect: the community feedback
&lt;/h2&gt;

&lt;p&gt;This is my first real solo open-source project, and I underestimated how valuable &lt;em&gt;critical&lt;/em&gt; feedback would be the moment it went public.&lt;/p&gt;

&lt;p&gt;Within the first day, two commenters independently flagged real security concerns I hadn't fully thought through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection risk&lt;/strong&gt;: since the LLM parses raw, untrusted issue text into commands that run inside the container, a maliciously crafted issue could try to manipulate what actually executes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network isolation&lt;/strong&gt;: Docker's container isolation protects the host filesystem and processes — but by default, it doesn't restrict &lt;em&gt;network&lt;/em&gt; access. A poisoned issue could still reach out to arbitrary hosts or scan a local network unless egress is explicitly locked down.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My first instinct was mild panic. My second was: this is exactly the kind of feedback that makes a project better before it gets a chance to actually hurt someone. I dug in, understood the actual attack surface in my sandbox code, and shipped fixes rather than brushing the comments aside.&lt;/p&gt;

&lt;p&gt;Turns out I wasn't the only one who's had to think about this — &lt;a href="https://www.metabase.com/blog/reprobot-github-issue-triage-agent" rel="noopener noreferrer"&gt;Metabase's own internal bug-reproduction tool&lt;/a&gt; deliberately requires a human-in-the-loop trigger specifically to prevent this exact class of attack on public repos. That was a useful gut-check: a team with real security resources treated this as a hard requirement, not an afterthought.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's still a work in progress
&lt;/h2&gt;

&lt;p&gt;I'd rather be upfront about this than pretend the README says everything's perfect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub App authentication (as opposed to Personal Access Token auth) is documented but not yet battle-tested end-to-end.&lt;/li&gt;
&lt;li&gt;Free-tier LLMs on OpenRouter vary a lot in reliability for the structured JSON output this tool depends on — I hit this myself with a model that would occasionally hallucinate a false "internal error" even when the underlying reproduction actually succeeded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are called out explicitly in the repo's README rather than hidden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it / break it
&lt;/h2&gt;

&lt;p&gt;It's fully open-source (MIT licensed): &lt;strong&gt;&lt;a href="https://github.com/qxmcu/ghost-hunter" rel="noopener noreferrer"&gt;github.com/qxmcu/ghost-hunter&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(It's also on &lt;a href="https://www.producthunt.com/products/ghost-hunter-2?utm_source=other&amp;amp;utm_medium=social" rel="noopener noreferrer"&gt;Product Hunt&lt;/a&gt; do check out :) )&lt;/p&gt;

&lt;p&gt;I'd genuinely welcome more of the kind of feedback I got this week — bug reports, security concerns, "this is a bad idea because X," all of it. That back-and-forth is the best part of building in the open. Plus I have been working on my README a LOT. Be sure to check it out :)&lt;/p&gt;

</description>
      <category>devops</category>
      <category>opensource</category>
      <category>cli</category>
      <category>python</category>
    </item>
  </channel>
</rss>
