Issue Gate
GitHub issue forms and a chooser config that make "doesn't work" impossible to file without a reproduction. No dependencies, no API keys, no bot.
Why
GitHub already ships this gate, for free: YAML issue forms plus .github/ISSUE_TEMPLATE/config.yml with blank_issues_enabled: false, which removes the blank-issue bypass. The problem is that nobody sets it up, and the default bug form GitHub ships has Steps To Reproduce marked required: false — so a useless report walks straight through the form and lands on a maintainer anyway.
Issue Gate writes those same native files with the fields that actually cost maintainer time marked required, prefills the environment block for the ecosystems your repo uses, and orders the contact links so questions get routed to docs, upstream, or Discussions instead of the tracker.
Nothing to install on the contributor's side. No bot. No AI.
Used on
Running on our own public repos, merged as PRs:
- danyblitz-bit/data-scraper (Rust)
- danyblitz-bit/site-auditor (Python)
- danyblitz-bit/pdf-metaclean (Python)
- danyblitz-bit/photo-metaclean (Python)
Install & Run
No dependencies — Python 3.10+.
Landing page: https://danyblitz-bit.github.io/issue-gate/ · machine-readable summary: llms.txt
git clone https://github.com/danyblitz-bit/issue-gate.git
cd issue-gate
# See the diff, write nothing
python __main__.py /path/to/repo --dry-run
# A Node library, questions routed to Discussions
python __main__.py ~/code/my-lib --discussions
# Add contact links, then write
python __main__.py ~/code/my-lib \
--docs https://mylib.dev/docs \
--upstream https://github.com/vendor/base-lib \
--discussions
# Print the generated files in full
python __main__.py ~/code/my-lib --verbose
# Verify the tool works on your machine
python __main__.py --self-check
Then push and open /issues/new/choose on the repo to see the gate.
Options
| Flag | Description |
|---|---|
--docs URL |
Add a Documentation contact link (first in the chooser) |
--upstream URL |
Add an Upstream project contact link (for wrappers) |
--discussions |
Add a Discussions contact link, URL taken from git origin |
--dry-run |
Print a unified diff and write nothing |
--verbose |
Print the full generated files |
--self-check |
Run a built-in correctness test |
--report |
Open a pre-filled email to report an issue |
What you get
| File | Purpose |
|---|---|
.github/ISSUE_TEMPLATE/config.yml |
blank_issues_enabled: false plus contact links, ordered docs → upstream → Discussions |
.github/ISSUE_TEMPLATE/bug.yml |
Repro steps, expected behaviour and environment are required: true |
.github/ISSUE_TEMPLATE/feature.yml |
Problem before solution, alternatives optional |
.github/ISSUE_TEMPLATE/question.yml |
Only when there is no Discussions link, so nothing is left unrouted |
It never overwrites. An existing file is reported and left alone; merge by hand.
Two manual steps GitHub does not do for you: create the labels (needs-triage, bug, enhancement, question — a form cannot add a label that does not exist) and open /issues/new/choose to confirm the chooser renders.
Why required: true and not a bot
GitHub enforces a required form field at submit time, before the issue exists. A triage bot has to run afterwards, costs money per issue, and is exactly the "hostile gate" maintainers complain about — a comment bot telling someone their issue is invalid. The form just asks once, politely, and GitHub does the rest.
Support the Project
Issue Gate is free and open source. Like it?
- Get your site audited — €49 — I run the audit and send you the fixes
- Buy me a coffee — one-time support
Report a bug
Found a bug or something weird? Run:
python __main__.py --report
This opens a pre-filled email. Send it and I'll get notified automatically.
You can also email danyblitz@googlemail.com directly. Use the subject format:
[TOOL-REPORT] issue-gate <what happened>
License
MIT
Metadata
Release files for issue-gate 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| issue_gate-1.0.0.tar.gz | 8.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| issue_gate-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 18.1 kB
Release files / issue_gate-1.0.0.tar.gz
| Download URL | issue_gate-1.0.0.tar.gz |
|---|---|
| Size | 8.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f4074b1eeecf64717b8ff240b216e69ef28bef9682ae4491afbd1bea4361fb21
|
|
BLAKE2b-256 checksum How to use checksums |
9230bdc6c84d5c1ae2b1d9d0e54585da692e2a0e184ca47c186ca54742cccd75
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / issue_gate-1.0.0-py3-none-any.whl
| Download URL | issue_gate-1.0.0-py3-none-any.whl |
|---|---|
| Size | 9.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b6d259e9944e59a0d94d1df36f5a038882aa716ec7c15b13928884933ecb3050
|
|
BLAKE2b-256 checksum How to use checksums |
66c388788ce4882a138d6a65ecce61ecb8f1960142f54ca41b955fa533b6a03a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|