Labels, Milestones, and Projects
Listen to Episode 9: Labels, Milestones, and Projects - a conversational audio overview of this chapter. Listen before reading to preview the concepts, or after to reinforce what you learned.
Organizing Work and Cross-Referencing on GitHub
Labels, milestones, and projects are the organizational layer of GitHub. They turn a chaotic list of issues into a structured, navigable, prioritized body of work.
Workshop Recommendation (Chapter 8)
Chapter 8 is a guided triage chapter focused on organization skills.
- Challenge count: 1 guided challenge
- Automation check: none by default
- Evidence: structured issue comment in assigned challenge issue
- Pattern: inspect -> classify -> explain
Chapter 8 Guided Challenge: Triage Recommendation Comment
- Open your assigned challenge issue.
- Review issue title, description, and target file.
- Post a triage recommendation comment using this format:
Chapter 8 triage recommendation:
- Suggested labels:
- Suggested milestone:
- Suggested project board column:
- One-sentence reason:
- If you have write access, apply the recommended labels/milestone directly.
This keeps the task simple and accessible for all students, including those without triage permissions.
Expected Outcomes
- Student can recommend labels/milestone/project placement using issue context.
- Student understands triage even without maintainer permissions.
- Student leaves a clear, reusable triage note for maintainers.
If You Get Stuck
- Start with one label only (
documentation,bug, oraccessibility). - If milestone is unclear, write
noneand explain why. - If project board is unknown, write
needs triageand continue. - Ask facilitator to review your one-sentence reason before posting.
Learning Moment
Triage is about clarity, not authority. Good recommendations reduce maintainer effort and speed up collaboration.
Labels
What Are Labels?
Labels are colored tags applied to issues and pull requests. They communicate at a glance what category, priority, or status an item belongs to. When you scan the issue list with your screen reader, labels are announced alongside each issue title.
Labels are announced as: "Label: bug" or "Labels: accessibility, good first issue" depending on how many are applied.
Standard Labels You Will Find in Most Repos
| Label | Purpose |
|---|---|
bug |
Something isn't working as expected |
enhancement |
A new feature or improvement |
documentation |
Changes or additions to documentation only |
good first issue |
Suitable for first-time contributors |
help wanted |
Maintainers are actively seeking community help |
question |
More information is needed before action |
invalid |
The issue doesn't meet the project's criteria |
wontfix |
The project won't address this (by design or out of scope) |
duplicate |
Another open issue covers the same topic |
accessibility |
Accessibility-related issue or change |
needs triage |
Not yet reviewed by a maintainer |
Navigating to the Labels Page
From a repository:
Visual / mouse users
Go to the Issues tab, then click the Labels link/button (it’s in the filter toolbar above the issue list, next to Milestones). The Labels page shows every label with its colour, name, and description.
Screen reader users (NVDA / JAWS - Windows)
- Navigate to the Issues tab
- Press
Kto find the "Labels" link (near the "Milestones" link in the toolbar) - Press
Enter
Screen reader users (VoiceOver - macOS)
- Navigate to the Issues tab
- Quick Nav
Kto find the "Labels" link (near the "Milestones" link in the toolbar) VO+Spaceto activate
GitHub CLI (gh) alternative - viewing labels
List all labels in a repository from your terminal:
# List all labels with descriptions
gh label list
# List labels in a specific format
gh label list --json name,description
Applying a Label to an Issue or PR
From an open issue or PR:
Visual / mouse users
In the right sidebar, click the gear icon () next to Labels. A dropdown opens showing all labels. Click a label to apply it (a checkmark appears). Click outside to close - the label appears immediately on the issue.
Screen reader users (NVDA / JAWS - Windows)
- Navigate to the sidebar → press
Hor3to find the "Labels" heading - Activate the Labels gear/edit button (
Buntil you hear "Labels" button →Enter) - Dropdown opens showing all available labels: use
↑/↓to navigate Enterto select or deselect a label; type to filter (e.g., type "access" to find "accessibility")- Press
Escapeto close - selections save automatically
Screen reader users (VoiceOver - macOS)
VO+U→ Headings or Quick NavHto find the "Labels" heading in the sidebar- Quick Nav
Bto find the "Labels" gear/edit button →VO+Space - Dropdown opens:
VO+Downor arrow keys to navigate labels VO+Spaceto select or deselect; type to filterEscapeto close - selections save automatically
GitHub CLI (gh) alternative - applying labels
Apply labels to issues or PRs from your terminal:
# Add a label to an issue
gh issue edit 42 --add-label "accessibility"
# Add multiple labels at once
gh issue edit 42 --add-label "bug,good first issue"
# Remove a label
gh issue edit 42 --remove-label "needs triage"
# Add a label to a PR
gh pr edit 42 --add-label "accessibility"
Filtering Issues by Label
Visual / mouse users
- Using the filter button: From the Issues list, click the Label dropdown button above the issue list, choose the label(s) you want, then click outside to apply. The active filter shows in the search bar.
- Using the search bar: Click in the search/filter bar and type
label:accessibility(for example) along with any other filters.
Screen reader users (NVDA / JAWS - Windows)
Option A - Filter bar: Press F → type is:open label:accessibility → Enter
Option B - Filter button: B → "Label" dropdown button → Enter → ↑/↓ to choose → Enter → Esc
Option C - Combining labels: is:open label:accessibility label:"good first issue"
Screen reader users (VoiceOver - macOS)
Option A - Filter bar: Quick Nav F to find the search bar → VO+Shift+Down to interact → type is:open label:accessibility → Return
Option B - Filter button: Quick Nav B → "Label" dropdown button → VO+Space → arrow keys to choose → VO+Space to select → Esc
Option C - Combining labels: is:open label:accessibility label:"good first issue"
GitHub CLI (gh) alternative - filtering by label
Filter issues by label from your terminal:
# List issues with a specific label
gh issue list --label "accessibility"
# Combine multiple labels
gh issue list --label "accessibility" --label "good first issue"
# Combine with state filter
gh issue list --label "accessibility" --state closed
# Search across labels
gh issue list --search "label:accessibility label:\"good first issue\""
Creating a New Label
If you have write access:
- Navigate to Issues → Labels page
- Tab to "New label" button → Enter
- Fill in: Label name (F for form field), Color (use the color picker or hex code), Description
- Tab to "Create label" button → Enter
GitHub CLI (gh) alternative - creating labels
Create labels from your terminal:
# Create a new label
gh label create "accessibility" --description "Accessibility-related issue" --color "0075ca"
# Create with a specific color
gh label create "in progress" --description "Being actively worked on" --color "e4e669"
Accessibility note for color: Labels have color, but they also have a text name and description - the color is supplementary information. Screen readers announce the label name, not the color, so labels are fully accessible.
Milestones
What Are Milestones?
Milestones group issues and PRs toward a shared goal or deadline. Think of a milestone as a sprint, a version release, or an event (like "Hackathon Day 1 Deliverables"). A milestone shows:
- A title and optional description
- An optional due date
- A progress bar (percentage of closed issues vs total)
Navigating to Milestones
From Issues tab:
- Press
Kto find the "Milestones" link → Enter - You see a list of milestones, each with its title, progress, and due date
Reading a milestone
Each milestone is announced as a heading + progress information:
- "Hackathon Day 1 Deliverables, 3 of 8 issues closed, due April 20"
Opening a Milestone
- Press
3to navigate milestone titles (they are h3 links) - Press
Enterto open a milestone - The milestone detail page shows all issues and PRs belonging to it
- Navigate the list with
3(issue titles) orI(list items)
Adding an Issue to a Milestone
Visual / mouse users
From the open issue, find the Milestone section in the right sidebar and click the gear icon. A dropdown lists available milestones - click one to assign it.
Screen reader users (NVDA / JAWS - Windows)
- Navigate to the sidebar → "Milestone" heading (
Hor3) - Activate the Milestone gear button
- Select a milestone from the dropdown (
↑/↓→Enter) Escto close
Screen reader users (VoiceOver - macOS)
- Quick Nav
HorVO+Cmd+Hto find the "Milestone" heading in the sidebar - Quick Nav
Bto find and activate the Milestone gear button (VO+Space) - Select a milestone from the dropdown (
VO+Downor arrow keys →VO+Space) Escto close
GitHub CLI (gh) alternative - milestones
Manage milestones from your terminal:
# Assign an issue to a milestone
gh issue edit 42 --milestone "Hackathon Day 1"
# Remove from a milestone
gh issue edit 42 --milestone ""
# List issues in a milestone
gh issue list --milestone "Hackathon Day 1"
Note: Creating milestones requires the web interface or the GitHub API - the gh CLI does not have a milestone create command. Use gh api for advanced operations:
gh api repos/{owner}/{repo}/milestones -f title="Hackathon Day 1" -f description="Day 1 deliverables"
Creating a Milestone
Requires write access:
- Navigate to Milestones page
- Tab to "New milestone" button → Enter
- Fill in: Title, Description, Due date (optional)
- Tab to "Create milestone" → Enter
Due date field note: The date field may render as a date picker. You can:
- Type the date in
YYYY-MM-DDformat directly (most reliable) - Or use arrow keys to adjust month/day/year if spin buttons are provided
- Or press
SpaceorEnterto open a calendar widget (if your screen reader supports it) and arrow through dates
Screen readers handle date pickers inconsistently - typing the date is most reliable across browsers.
Cross-References
Cross-references are links between issues, PRs, and commits. GitHub automatically renders #42 as a link to issue or PR #42. This creates a web of context so any contributor can trace the history of a decision.
Types of Cross-References
| Syntax | Effect |
|---|---|
#42 |
Links to issue or PR #42 in the same repo |
owner/repo#42 |
Links to issue #42 in a different repository |
a1b2c3d |
Links to a specific commit by its SHA hash |
@username |
Notifies and links to a GitHub user's profile |
Closes #42 |
Closes issue #42 when the PR merges |
Fixes #42 |
Same as Closes - conventional for bugs |
Resolves #42 |
Same as Closes - general use |
Refs #42 |
Links without auto-closing |
Typing a Cross-Reference
Inside any comment or PR description text area (Focus Mode):
- Type
#- a live-search dropdown appears - Continue typing the issue number or title fragment
- Use
↓to navigate the dropdown →Enterto select - The
#42link is inserted automatically
For @mentions:
- Type
@followed by a username - A dropdown of suggestions appears
↓to navigate →Enterto select
When the "Closes" Keyword Fires
The Closes #42 keyword must appear in:
- The PR description (body text)
- A commit message pushed to the default branch
It does not fire from comments on the PR. If you write "Closes #42" in a comment, it creates a reference but does not auto-close the issue on merge.
GitHub Projects
What Is a GitHub Project?
GitHub Projects is a built-in project management tool. It can display issues and PRs from across multiple repositories in one view. Projects support three layouts:
| Layout | Description | Best For |
|---|---|---|
| Table | Spreadsheet-style with custom fields | Tracking detailed status |
| Board | Kanban columns (Todo, In Progress, Done) | Visual workflow |
| Roadmap | Timeline/Gantt view | Planning across time |
Finding a Project
From an organization page or repository:
- Navigate to the "Projects" tab
- Press
3to navigate project titles (they are h3 links) Enterto open a project
Navigating a Project - Table View
Step 1: The main content is a large grid/table
Step 2: T to jump to the table
Step 3: Ctrl+Alt+↓ to navigate rows (each row is an issue or PR)
Step 4: Ctrl+Alt+→ to navigate columns (Title, Status, Priority, etc.)
Step 5: Enter on a row to open the issue/PR detail panel
What is announced per row
"Add keyboard navigation to carousel | Status: In Progress | Assignee: username | Priority: High"
Navigating a Project - Board View
Step 1: Switch to Board view using the view selector button
Step 2: Each column (Todo / In Progress / Done) is a region
Step 3: D to navigate between column landmarks
Step 4: Within a column: 3 to navigate card titles, I for list items
Step 5: Enter on a card to open the issue/PR panel
Adding an Issue to a Project
From an open issue:
- Navigate to the sidebar "Projects" section (
Hor3) - Activate the Projects gear button
- Select the project from the dropdown
Or from within a project:
- Activate "Add item" button at the bottom of a column/table
- Type
#to search for existing issues - Select the issue → it's added to the project
Practical Organization Strategy for the Hackathon
Here is a recommended structure for the learning-room sandbox project:
Labels to create
accessibility - all a11y-related work
documentation - docs-only changes
good first issue - for new contributors
in progress - being actively worked on
needs review - PR is open, review needed
blocked - waiting on something external
help wanted - community assistance requested
Milestone to create
Name: Hackathon Day 1 Deliverables
Due: [Day 1 date]
Description: All contributions made during Day 1 of the Open Source AT Hackathon
Workflow
1. File an issue → add label + milestone
2. Comment "I'll work on this" → add "in progress" label
3. Make changes → open PR → link to issue
4. PR merged → issue closes automatically → milestone progress updates
Try It: Label and Link
Time: 2 minutes | What you need: Browser, signed in to GitHub
Go to the Learning Room repository and do two things:
- Add a label to an issue - Open any issue (press
GthenI, thenEnteron an issue title). PressL(in Focus Mode) to open the label picker. Typedocumentationto filter, then pressEnterto apply it. PressEscto close. - Use a cross-reference - Leave a comment on that issue mentioning another issue number:
Related to #1(or any issue number you've seen). PressCtrl+Enterto submit.
You're done. You just organized work using labels and connected two issues with a cross-reference.
What success feels like: The label now appears on the issue, and your cross-reference is a clickable link that connects the two issues. That's project management on GitHub - and you did it in under two minutes.
Day 2 Amplifier - Accessibility Agents:
@issue-trackerwith LabelsApply labels and milestones manually in today's exercises before using any agent. Labels are the language that automation uses to filter, route, and prioritize work. If you have not designed and applied them yourself, you cannot configure them correctly for automated use - and you cannot tell when automation is applying the wrong ones.
Once you have mastered manual organization:
- In VS Code -
@issue-tracker find open issues labeled accessibility, severity-highuses the exact label vocabulary you configured today, delivering prioritized cross-repository results with community engagement and release-impact scoring- In your repo - Accessibility Agents forks carry the label schema in
.github/ISSUE_TEMPLATE/; your project's organizational language travels with every clone and does not require manual recreation- In the cloud - GitHub Agentic Workflows apply labels automatically when issues are opened, routing work into the right milestone and Project view without manual triage on every item - but only if your labels were designed with clear, consistent intent
Labeling today is not overhead. It is configuring the input layer that every agent downstream depends on.
Next: Notifications Back: Culture and Etiquette Related: Working with Issues | Day 1 Agenda