Issues & PRs
Raising Issues

How to Raise a Good Issue

Good issues save maintainer time and get triaged fast. Bad issues get closed or ignored.

⚠️

The 5-Minute Rule

If a maintainer can't understand and reproduce your issue in 5 minutes, it's not a good issue.

Pre-Issue Checklist

ALWAYS do this before opening an issue:

  • Search existing issues (open AND closed)
  • Check discussions and FAQ
  • Search recent PRs (might be fixed, not yet released)
  • Reproduce on latest version/commit
  • Read CONTRIBUTING.md for issue guidelines

The Anatomy of a Great Issue

┌─────────────────────────────────────────────────────────────────────────────┐
│                        PERFECT ISSUE STRUCTURE                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  1. TITLE (50-60 chars)                                                     │
│     ├─ Component: [API]                                                     │
│     ├─ Symptom: "500 error"                                                 │
│     └─ Context: "on POST /users with empty email"                           │
│                                                                             │
│  2. ENVIRONMENT                                                             │
│     ├─ Version/commit: v2.3.1 or commit abc123                              │
│     ├─ OS: Ubuntu 22.04, macOS 14, Windows 11                               │
│     ├─ Runtime: Node 20.x, Python 3.11, etc                                 │
│     └─ Browser (if web): Chrome 120, Firefox 121                            │
│                                                                             │
│  3. CURRENT BEHAVIOR                                                        │
│     └─ What actually happens (with evidence)                                │
│                                                                             │
│  4. EXPECTED BEHAVIOR                                                       │
│     └─ What should happen instead                                           │
│                                                                             │
│  5. REPRODUCTION STEPS                                                      │
│     ├─ Step 1: Clone repo                                                   │
│     ├─ Step 2: Run command X                                                │
│     ├─ Step 3: Observe result Y                                             │
│     └─ Result: Error Z occurs                                               │
│                                                                             │
│  6. EVIDENCE                                                                │
│     ├─ Error logs (trimmed, formatted)                                      │
│     ├─ Screenshots (if UI)                                                  │
│     └─ Network traces (if API)                                              │
│                                                                             │
│  7. ADDITIONAL CONTEXT                                                      │
│     ├─ Frequency: always/sometimes/rare                                     │
│     ├─ User impact: blocks X users                                          │
│     └─ Workarounds tried (if any)                                           │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

Title Examples

✅ Good Titles

TitleWhy It's Good
[API] 500 error on POST /users with null emailComponent + symptom + trigger
[UI] Button click fails on mobile Safari iOS 17Platform-specific + clear
[Docs] Broken link in installation guide section 3Location + specific
[Build] TypeScript compilation fails with strict modeBuild stage + condition

❌ Bad Titles

TitleWhy It's BadFix
It doesn't workNo informationSpecify what doesn't work
BugUselessDescribe the bug
Help neededNot descriptiveExplain what you need
Is this a bug?UncertainInvestigate first
URGENT!!!NoiseJust describe it

Reproduction Steps Template

## Steps to Reproduce
 
1. Clone the repo
   ```bash
   git clone https://github.com/org/repo
   cd repo
  1. Install dependencies

    npm install
  2. Run the application

    npm run dev
  3. Navigate to http://localhost:3000 (opens in a new tab)

  4. Click the "Submit" button

Expected: Form submits successfully Actual: Console shows TypeError: Cannot read property 'value' of null


**Why this works:**
- Copy-paste ready commands
- Numbered steps
- Clear expected vs actual
- Environment implicitly shown (npm = Node.js project)

---

## Environment Information

### Minimal Example

```markdown
## Environment

- **Version:** v1.2.3 (commit abc1234)
- **OS:** Ubuntu 22.04
- **Node:** 20.10.0
- **npm:** 10.2.3

Comprehensive Example (when needed)

## Environment
 
- **Project Version:** v2.5.0
- **Commit Hash:** `a1b2c3d4e5f6`
- **OS:** macOS 14.2 (23C64)
- **Architecture:** arm64 (M2)
- **Runtime:** Node.js 20.10.0
- **Package Manager:** pnpm 8.14.0
- **Browser:** Chrome 120.0.6099.129
- **Extensions:** React DevTools, Redux DevTools

Evidence Pack

Logs

❌ Don't do this:

[giant wall of unformatted logs with 500 lines]

✅ Do this:

## Error Log
 
```bash
Error: Cannot find module 'missing-package'
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:1077:15)
    at Function.Module._load (node:internal/modules/cjs/loader:922:27)
    at Module.require (node:internal/modules/cjs/loader:1143:19)
Full log (click to expand)
[full log here]

### Screenshots

**For UI issues:**
- Annotate screenshots with arrows/highlights
- Include browser console if relevant
- Show both expected vs actual if possible

**Example structure:**
```markdown
## Screenshots

### Current (Broken)
![broken-ui](url)

### Expected
![expected-ui](url)

Frequency & Impact

Help maintainers prioritize:

FrequencyImpactPriority Example
AlwaysCriticalCan't deploy to production
AlwaysMajorBlocks common workflow
SometimesCriticalData loss for some users
SometimesMinorCosmetic glitch
RareCriticalEdge case crashes system
RareMinorTypo in rarely-seen error
## Impact
 
- **Frequency:** Happens every time on Chrome 120+
- **User Impact:** Blocks checkout flow for ~30% of users
- **Workaround:** Users can switch to Firefox (not ideal)

Tone & Communication

Be Specific

"The button doesn't work" → "Submit button on /checkout page returns 400 error"

Be Humble

"This is broken" → "I'm experiencing unexpected behavior"

Be Helpful

Include what you've already tried. Saves back-and-forth.


Fast Rejections to Avoid

Common rejection reasons:

ReasonFix
Can't reproduceProvide complete steps
Incomplete templateFill out all sections
Already reportedSearch first, comment on existing
Not a bugAsk in discussions first
Unmaintained versionTest on latest
Support questionUse forums/Discord/Stack Overflow

Real Examples

✅ Excellent Issue

Title: [API] POST /api/users returns 500 when email contains + character
 
## Environment
- Version: v1.5.2
- OS: Ubuntu 22.04
- Node: 20.10.0
 
## Current Behavior
Creating a user with an email containing a + character (e.g., user+test@example.com) 
results in a 500 Internal Server Error.
 
## Expected Behavior
Should create the user successfully, as + is valid in email addresses (RFC 5322).
 
## Steps to Reproduce
1. Start the server: `npm run dev`
2. Send POST request:
   ```bash
   curl -X POST http://localhost:3000/api/users \
     -H "Content-Type: application/json" \
     -d '{"email": "user+test@example.com", "name": "Test User"}'
  1. Observe 500 error

Error Log

Error: Invalid email format
    at validateEmail (src/utils/validation.js:15:11)
    at createUser (src/controllers/users.js:42:5)

Impact

  • Affects users with + in email (common for Gmail aliases)
  • Frequency: 100% reproducible
  • Workaround: None

Possible Cause

Email validation regex in src/utils/validation.js line 15 doesn't allow + character.


**Why this is perfect:**
- Clear, specific title
- Complete environment
- Copy-paste reproduction
- Impact assessment
- Even suggests where the bug might be

---

### ❌ Poor Issue

```markdown
Title: Email bug

It doesn't work when I try to create a user. Please fix ASAP!!!

Why this fails:

  • Vague title
  • No details
  • No reproduction steps
  • Demanding tone
  • No environment info

Issue Templates

Most projects provide templates. USE THEM.

**Don't skip sections or write "N/A" everywhere.**
 
If a section truly doesn't apply:
✅ "N/A - This is a documentation issue, no code changes"
❌ "N/A" (with no explanation)

After Opening the Issue

Monitor

Watch for maintainer questions. Respond quickly.

Be Patient

Maintainers are often volunteers. 1-3 days response time is normal.

Update

If you find new information, add it to the issue.

Don't Bump

Avoid "any update?" comments within first week.


Checklist Before Submitting

  • Searched for duplicates
  • Tested on latest version
  • Clear, descriptive title (50-60 chars)
  • Environment details provided
  • Reproduction steps are copy-paste ready
  • Expected vs actual behavior stated
  • Logs/screenshots included (trimmed)
  • Impact and frequency mentioned
  • Professional, respectful tone
  • Template filled out completely

Next Steps

Now that you can write great issues, learn the difference between bug reports and feature requests:

➡️ Bug Reports vs Feature Requests →


Remember: A well-written issue is half the solution. Invest 20 minutes writing a good issue to save hours of back-and-forth.