<?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: vyxordev</title>
    <description>The latest articles on DEV Community by vyxordev (@vyxordev).</description>
    <link>https://dev.to/vyxordev</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%2F4204194%2F3f748b3c-695d-4da9-81d9-088100b0771e.png</url>
      <title>DEV Community: vyxordev</title>
      <link>https://dev.to/vyxordev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vyxordev"/>
    <language>en</language>
    <item>
      <title>Your good first issue queue might be lying to contributors — so I built StarterQueue</title>
      <dc:creator>vyxordev</dc:creator>
      <pubDate>Sat, 24 Oct 2026 08:17:43 +0000</pubDate>
      <link>https://dev.to/vyxordev/your-good-first-issue-queue-might-be-lying-to-contributors-so-i-built-starterqueue-2bc0</link>
      <guid>https://dev.to/vyxordev/your-good-first-issue-queue-might-be-lying-to-contributors-so-i-built-starterqueue-2bc0</guid>
      <description>&lt;p&gt;A good first issue label looks like an invitation.&lt;/p&gt;

&lt;p&gt;But sometimes you open the issue and find out it was assigned weeks ago. Or it has been inactive for months. Or it is blocked by another issue. Or there is already an open pull request that will close it.&lt;/p&gt;

&lt;p&gt;None of those things necessarily remove the good first issue label.&lt;/p&gt;

&lt;p&gt;So the label slowly stops meaning what contributors think it means.&lt;/p&gt;

&lt;p&gt;I kept wondering: could this be checked automatically without trying to guess whether an issue is “easy”?&lt;/p&gt;

&lt;p&gt;That question turned into &lt;strong&gt;StarterQueue&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem wasn't finding issues. It was trusting them.
&lt;/h2&gt;

&lt;p&gt;For someone trying to make their first contribution, a &lt;code&gt;good first issue&lt;/code&gt; label carries a lot of weight.&lt;/p&gt;

&lt;p&gt;You assume someone has already looked at the issue and decided:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it is still available;&lt;/li&gt;
&lt;li&gt;nobody else is actively working on it;&lt;/li&gt;
&lt;li&gt;it is not blocked;&lt;/li&gt;
&lt;li&gt;the conversation is still open;&lt;/li&gt;
&lt;li&gt;and the issue is actually ready for a contributor to pick up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But GitHub labels don't update themselves when the state around an issue changes.&lt;/p&gt;

&lt;p&gt;An issue can still say &lt;code&gt;good first issue&lt;/code&gt; even after somebody gets assigned to it.&lt;/p&gt;

&lt;p&gt;It can sit untouched for months.&lt;/p&gt;

&lt;p&gt;It can depend on another unfinished issue.&lt;/p&gt;

&lt;p&gt;It can belong to an old milestone.&lt;/p&gt;

&lt;p&gt;And, probably the most frustrating case, there can already be an open pull request that is going to close it.&lt;/p&gt;

&lt;p&gt;The label isn't technically wrong because of any one of these things. Different projects have different workflows.&lt;/p&gt;

&lt;p&gt;But they are all signals a contributor should probably know about &lt;strong&gt;before spending time understanding the issue, setting up the project, and preparing a change&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That distinction became important when I started designing StarterQueue.&lt;/p&gt;

&lt;p&gt;I didn't want to build a tool that says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“AI thinks this issue is too difficult for a beginner.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That would be subjective, difficult to verify, and very easy to get wrong.&lt;/p&gt;

&lt;p&gt;I wanted something much more boring — and much more defensible:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;look at GitHub's actual state, detect objective signals, and explain exactly what was found.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning that into rules
&lt;/h2&gt;

&lt;p&gt;StarterQueue currently has nine rules, each with a stable code from &lt;code&gt;SQ001&lt;/code&gt; to &lt;code&gt;SQ009&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The important part is that each rule maps to something GitHub can actually verify.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SQ001&lt;/code&gt; checks whether the issue is already assigned.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SQ003&lt;/code&gt; checks whether it has been inactive for too long.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SQ004&lt;/code&gt; checks whether GitHub already knows about an open pull request that will close the issue.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SQ006&lt;/code&gt; checks whether GitHub reports open issue dependencies blocking it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SQ007&lt;/code&gt; checks whether the conversation is locked.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SQ008&lt;/code&gt; and &lt;code&gt;SQ009&lt;/code&gt; look at milestone state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not every signal deserves the same severity.&lt;/p&gt;

&lt;p&gt;An assigned issue, for example, might still be open to collaboration in one repository and completely unavailable in another.&lt;/p&gt;

&lt;p&gt;So StarterQueue separates &lt;strong&gt;detection&lt;/strong&gt; from &lt;strong&gt;judgment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The default &lt;code&gt;balanced&lt;/code&gt; policy treats some signals as warnings and stronger contradictions as failures. A stricter policy is available for repositories that want assignment and dependencies to count as failures too.&lt;/p&gt;

&lt;p&gt;And if a maintainer disagrees with just one rule, they can override that rule's severity without inventing a whole new policy.&lt;/p&gt;

&lt;p&gt;That was one of the design decisions I cared about most:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the tool should tell you what GitHub says, not pretend it understands your repository better than you do.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing it on a real repository
&lt;/h2&gt;

&lt;p&gt;A rules engine is easy to make look good with fake examples.&lt;/p&gt;

&lt;p&gt;So I wanted to see what happened when StarterQueue met a real, large starter-issue queue.&lt;/p&gt;

&lt;p&gt;I ran it against &lt;code&gt;rust-lang/rust-clippy&lt;/code&gt;.&lt;br&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%2Fw3q0y9b9pdbrk116mo08.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%2Fw3q0y9b9pdbrk116mo08.png" alt="StarterQueue audit results for rust-lang/rust-clippy showing 2 PASS, 76 WARN, and 39 FAIL out of 117 issues." width="800" height="660"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  117 issues later
&lt;/h2&gt;

&lt;p&gt;The audit found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2 PASS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;76 WARN&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;39 FAIL&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That doesn't mean 115 issues were “bad”.&lt;/p&gt;

&lt;p&gt;It means 115 issues had at least one signal worth showing to someone before they started working on them.&lt;/p&gt;

&lt;p&gt;Some warnings were relatively mild — things like assignment or long inactivity.&lt;/p&gt;

&lt;p&gt;Some failures were much stronger.&lt;/p&gt;

&lt;p&gt;For example, I opened one of the failing issues and StarterQueue showed three separate findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SQ001&lt;/code&gt; — the issue was already assigned;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SQ003&lt;/code&gt; — it had seen no activity for 358 days;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SQ004&lt;/code&gt; — there was already an open pull request linked by GitHub to close the issue.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is exactly the kind of thing I wanted StarterQueue to catch.&lt;/p&gt;

&lt;p&gt;A contributor could otherwise discover the issue through the &lt;code&gt;good first issue&lt;/code&gt; label, spend time reading it, clone the repository, understand the codebase — and only later realize somebody already has an open PR solving it.&lt;/p&gt;

&lt;p&gt;StarterQueue surfaces that information before the contributor invests that time.&lt;/p&gt;

&lt;p&gt;And because the finding comes from GitHub's structured closing-PR relationship, it isn't guessing based on a random mention in a comment.&lt;/p&gt;

&lt;p&gt;One important caveat: this audit is a snapshot of repository state, not a judgment of the Rust Clippy project or its maintainers. Large open-source repositories change constantly, and different projects intentionally manage starter issues in different ways.&lt;/p&gt;

&lt;p&gt;The point of the test was simply to see whether the rules produced useful information on a real queue.&lt;/p&gt;

&lt;p&gt;They did.&lt;/p&gt;
&lt;h2&gt;
  
  
  I didn't want another CLI that only works in screenshots
&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%2Fe8r68263ds8rqmkjqdxa.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%2Fe8r68263ds8rqmkjqdxa.png" alt="StarterQueue issue detail showing SQ001 assignment, SQ003 inactivity, and SQ004 open closing pull request findings." width="800" height="661"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first, StarterQueue was mostly a traditional CLI.&lt;/p&gt;

&lt;p&gt;You ran an audit, got a list of results, and that was it.&lt;/p&gt;

&lt;p&gt;That worked well for automation, but it wasn't great for actually exploring a repository with dozens — or hundreds — of starter issues.&lt;/p&gt;

&lt;p&gt;So for v0.5.0, I built an interactive terminal interface.&lt;/p&gt;

&lt;p&gt;Running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;starterqueue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;opens a keyboard-driven TUI where you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enter any GitHub repository;&lt;/li&gt;
&lt;li&gt;watch the audit run;&lt;/li&gt;
&lt;li&gt;browse PASS, WARN, and FAIL results;&lt;/li&gt;
&lt;li&gt;filter by severity;&lt;/li&gt;
&lt;li&gt;search across issues;&lt;/li&gt;
&lt;li&gt;open an issue's detailed findings;&lt;/li&gt;
&lt;li&gt;and jump directly to the issue in your browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CLI and TUI use the same audit engine.&lt;/p&gt;

&lt;p&gt;That matters because I didn't want the interactive interface to become a separate “pretty demo” with different behavior. The same rules, policies, and GitHub data power both the human-facing interface and automation.&lt;/p&gt;

&lt;p&gt;For CI, StarterQueue still works as a normal command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;starterqueue audit owner/repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And for repositories that want the audit to run automatically, it also ships as a GitHub Action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it useful without making it invasive
&lt;/h2&gt;

&lt;p&gt;One constraint has stayed in place from the beginning:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;StarterQueue is read-only.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It doesn't remove labels, close issues, assign contributors, post comments, or try to “clean up” a repository automatically.&lt;/p&gt;

&lt;p&gt;It only audits what already exists and reports what it finds.&lt;/p&gt;

&lt;p&gt;That makes it much easier to try on a real project without handing a new tool permission to start changing things.&lt;/p&gt;

&lt;p&gt;For maintainers, StarterQueue can also run automatically as a GitHub Action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
  &lt;span class="na"&gt;issues&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
  &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;

&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Audit starter queue&lt;/span&gt;
    &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;VyxorDev/starterqueue@v0.5.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, the Action can fail a workflow when StarterQueue finds a &lt;code&gt;FAIL&lt;/code&gt;, which means it can act as a lightweight health check for a repository's starter queue.&lt;/p&gt;

&lt;p&gt;Or maintainers can make it less strict, change the stale threshold, use a different starter label, or override individual rule severities.&lt;/p&gt;

&lt;p&gt;There is one authenticated check worth mentioning.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SQ004&lt;/code&gt; — detecting an open pull request that GitHub has registered as closing an issue — requires a GitHub token when using the CLI.&lt;/p&gt;

&lt;p&gt;I chose to make that explicit rather than silently replacing structured GitHub data with unreliable text matching.&lt;/p&gt;

&lt;p&gt;Without a token, StarterQueue still runs the other rules and tells you that &lt;code&gt;SQ004&lt;/code&gt; was skipped.&lt;/p&gt;

&lt;p&gt;I'd rather show an incomplete audit honestly than present a false-clean result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I want to take this next
&lt;/h2&gt;

&lt;p&gt;I don't want StarterQueue to grow by adding rules just because they sound clever.&lt;/p&gt;

&lt;p&gt;The useful next steps are going to come from running it against more real repositories.&lt;/p&gt;

&lt;p&gt;I'm especially interested in cases where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;StarterQueue reports something that isn't actually useful;&lt;/li&gt;
&lt;li&gt;a rule produces a false positive;&lt;/li&gt;
&lt;li&gt;a clearly unavailable starter issue passes the audit;&lt;/li&gt;
&lt;li&gt;a repository uses &lt;code&gt;good first issue&lt;/code&gt; in a way I haven't accounted for;&lt;/li&gt;
&lt;li&gt;or GitHub exposes another objective signal that would make a good deterministic rule.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you maintain an open-source project with a starter-issue queue, I'd genuinely like to know what StarterQueue finds.&lt;/p&gt;

&lt;p&gt;And if you're looking to contribute, there is plenty of room for work around audit rules, GitHub API edge cases, tests, documentation, and the terminal interface.&lt;/p&gt;

&lt;p&gt;You can find the project here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/VyxorDev/starterqueue" rel="noopener noreferrer"&gt;https://github.com/VyxorDev/starterqueue&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The current release is &lt;strong&gt;v0.5.0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you want to try the CLI on Windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/VyxorDev/starterqueue/releases/download/v0.5.0/starterqueue-0.5.0.tgz"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-OutFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"starterqueue-0.5.0.tgz"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--global&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\starterqueue-0.5.0.tgz&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;GH_TOKEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;starterqueue&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if you're a maintainer, the GitHub Action is probably the easiest way to try it without changing your existing workflow.&lt;/p&gt;

&lt;p&gt;If you test StarterQueue on your repository, I'd especially appreciate hearing about the &lt;strong&gt;wrong results&lt;/strong&gt;, not just the correct ones.&lt;/p&gt;

&lt;p&gt;Those are the cases that will make the project better.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>typescript</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
