Clean Repos deserve Clean Labels.
A standardized GitHub label convention designed to be consistent, scannable, and universal. Clean Labels defines a curated set of labels organized into 5 clear categories β every label follows the same format so your team always knows what they're looking at.
Note: This is a documented convention refined through real-world open source practice. The github-labels-template CLI tool is the official implementation for applying Clean Labels to any repository.
Default GitHub labels are inconsistent. Across projects you see bug, Bug, bug report, π bug β all meaning the same thing. Labels get bloated, duplicated, and abandoned.
Clean Labels is different:
- π·οΈ Consistent: Every label follows
[Category] Description [scope]format - π― Scannable: 5 logical categories cover every workflow need
- π Opinionated: 21 curated labels β no noise, no gaps
- π Universal: Works for any project type, size, or team
Every Clean Label description follows this structure:
[Category] Description [scope]
Where:
[Category]β One of:Type,Status,Community,Resolution,AreaDescriptionβ Plain English, sentence-style[scope]β Where it applies:[issues],[PRs], or[issues, PRs]
Example:
[Type] Something isn't working [issues, PRs]
| Name | Color | Description |
|---|---|---|
bug |
#d73a4a |
Something isn't working |
enhancement |
#1a7f37 |
New feature or improvement to existing functionality |
documentation |
#0075ca |
Improvements or additions to docs, README, or guides |
refactor |
#8957e5 |
Code improvement without changing functionality |
performance |
#e3795c |
Optimization, speed, or resource usage improvements |
security |
#d4a72c |
Security vulnerability or hardening |
| Name | Color | Description |
|---|---|---|
blocked |
#cf222e |
Waiting on another issue, decision, or external factor |
needs triage |
#e16f24 |
New issue β needs review and categorization |
awaiting response |
#1a7ec7 |
Waiting for more information from the reporter |
ready |
#2da44e |
Triaged and ready to be picked up |
| Name | Color | Description |
|---|---|---|
good first issue |
#7057ff |
Good for newcomers β well-scoped and documented |
help wanted |
#0e8a16 |
Open for community contribution |
maintainer only |
#b60205 |
Reserved for maintainers β not open for external contribution |
| Name | Color | Description |
|---|---|---|
duplicate |
#cfd3d7 |
This issue or pull request already exists |
invalid |
#cfd3d7 |
This doesn't seem right |
wontfix |
#cfd3d7 |
This will not be worked on |
| Name | Color | Description |
|---|---|---|
core |
#0052cc |
Core logic, business rules, and primary functionality |
interface |
#5319e7 |
User-facing layer β UI, CLI, API endpoints, or SDK surface |
data |
#006b75 |
Database, storage, caching, or data models |
infra |
#e16f24 |
Build system, CI/CD, deployment, config, and DevOps |
testing |
#1a7f37 |
Unit tests, integration tests, E2E, and test tooling |
Use the official github-labels-template CLI tool:
# Apply all 21 labels to the current repo
npx github-labels-template apply
# Apply labels from a specific category
npx github-labels-template apply --category type
# Apply to a specific repo
npx github-labels-template apply --repo owner/repo# Example: create the "bug" label
gh label create "bug" --color "d73a4a" --description "[Type] Something isn't working [issues, PRs]"Every issue or PR has a type. Types classify the nature of the work β not its workflow state. A bug is still a bug whether it's open, blocked, or resolved.
Status labels reflect the current state of an item in your workflow. They answer "where is this right now?" β not what it is or who it's for.
Community labels signal contributor-facing intent. They answer "who should work on this?" β helping maintainers and contributors quickly find appropriate work.
Resolution labels explain why an item was closed without being completed. They create a permanent, scannable record of decisions.
Area labels are deliberately broad β they map to universal software layers that apply to any tech stack. They answer "which part of the codebase?" without being project-specific.
Labels from different categories can be combined freely. A typical open issue might have:
- One
Typelabel (what kind of work) - One
Statuslabel (current state) - One
Arealabel (which layer) - Optionally one
Communitylabel (contributor signal)
A typical issue lifecycle:
opened β needs triage β ready β [work begins] β closed
Or with blockers:
needs triage β blocked β ready β [work begins] β closed
Apply resolution labels before closing an issue that isn't being completed:
duplicate β close
invalid β close
wontfix β close
Add Clean Labels awareness to AI coding assistants.
Add to .github/copilot-instructions.md:
## GitHub Labels
This project uses the Clean Labels convention.
See: https://github.com/wgtechlabs/clean-labels
Labels follow the format: [Category] Description [scope]
Categories: Type, Status, Community, Resolution, Area- π SPECIFICATION.md β Full technical specification with format rules and design rationale
- π QUICK-REFERENCE.md β Single-page cheatsheet for quick lookup
- π οΈ github-labels-template β CLI tool to apply Clean Labels to any repo
We welcome contributions! Please read our Contributing Guidelines to get started.
MIT License β see the LICENSE file for details.
Created with β€οΈ by Waren Gonzaga / WG Tech Labs
Clean Repos deserve Clean Labels.