Labels, Milestones, and Projects
Organizing and tracking work with labels, milestones, and GitHub Projects.
Listen
Transcript
Alex: Welcome back. Today we're looking at the part of GitHub that keeps work from turning into a pile of mystery tabs: labels, milestones, projects, and cross-references.
Jamie: I love this topic because it sounds small at first. A label is just a tag, right? But then suddenly it's how a team decides what needs attention, what belongs in a release, and who can help.
Alex: Exactly. Labels, milestones, and projects are the organizing layer on top of issues and pull requests. They help a team sort work by type, status, priority, goal, and timeline. Cross-references connect related conversations so people do not have to hunt through the repository to understand the story.
Jamie: And for learners using a screen reader, that organization is not just nice. If the issue list announces labels and status clearly, you can scan with more confidence instead of opening every issue one by one.
Alex: Yes. The goal is not to decorate issues. The goal is to make the work understandable enough that another person, or even an automated workflow later, can act on it.
Jamie: So where does this show up in the course workflow?
Alex: Chapter 9 is a guided triage chapter. You're working in your Learning Room repository, which is the per-learner repository used for the Day 1 contribution flow. The challenge asks you to inspect an open issue, decide what labels, milestone, and project placement would make sense, and then post a recommendation in your assigned Chapter 9 challenge issue.
Jamie: So learners might not be changing the real labels themselves?
Alex: Right. If you have write access, you can apply the labels and milestone directly. But the required evidence is a structured issue comment that a maintainer could use immediately. That matters because triage is a contribution even when you do not have permission to click every control.
Jamie: What does that comment need to include?
Alex: It starts with the issue number you reviewed. Then you suggest one to three labels, such as documentation, bug, accessibility, enhancement, or good first issue. You recommend a milestone, or you write none with a reason. You choose a project board column such as To Do, In Progress, or Needs Triage. Then you add one sentence explaining why those choices fit the issue.
Jamie: I can imagine getting stuck on the milestone piece. What if I honestly cannot tell where it belongs?
Alex: Then say none, and explain why. That is valid triage. If the project placement is unknown, Needs Triage is the safe default. If the issue itself is unclear, your recommendation can say that the description needs more detail. The learning pattern here is inspect the issue, classify it with shared vocabulary, and explain your reasoning in writing.
Jamie: That also connects nicely to Challenge 08, the Day 1 stretch around the culture layer. Labels and triage are technical, but the way you communicate your recommendation is part of respectful collaboration.
Alex: Exactly. A good triage note does not scold the reporter. It helps the maintainer understand the work faster.
Alex: Let's start with labels. A label is a colored tag applied to an issue or pull request. It communicates a category, status, priority, or audience at a glance.
Jamie: And screen readers announce them with the issue, right? Something like, "Label: bug," or "Labels: accessibility, good first issue."
Alex: That's right. Most repositories begin with a familiar set. Bug means something is not working as expected. Enhancement means a new feature or improvement. Documentation is for docs-only work. Good first issue signals that a task may be suitable for a new contributor. Help wanted means maintainers are inviting community help.
Jamie: And then there are labels that say more about the decision state, like question, invalid, wontfix, duplicate, and needs triage.
Alex: Yes. Question means more information is needed. Invalid means the issue does not fit the project's criteria. Wontfix means the project will not address it, usually because it is out of scope or intentional behavior. Duplicate points to another issue that already covers the same topic. Accessibility is often added as a custom or project-specific label for accessibility-related work.
Jamie: If accessibility is not already there, that does not mean the project cannot track accessibility work. It may mean the team needs to create the label.
Alex: Exactly. A custom label should have a clear name, a useful description, and a color. The color helps visual scanning, but the name and description are what make the label understandable across tools.
Jamie: How do learners find the full label list without guessing from the issue page?
Alex: Open the repository on GitHub.com, go to the Issues tab, and find the Labels link near Milestones in the issue toolbar. In Windows screen readers like NVDA or JAWS, you can move through links with K until you hear Labels, then press Enter. With VoiceOver on macOS, Quick Nav K can find the link, and VO+Space activates it. The Labels page shows each label name, description, and color.
Jamie: And the command line version is pretty direct too.
Alex: Yes. In the repository folder, gh label list shows the labels. If you want names and descriptions in a structured format, you can run gh label list --json name,description. That can be useful if you want your screen reader to read a clean list from the terminal.
Jamie: Once I know which label I want, how do I apply it to an issue or pull request?
Alex: On GitHub.com, open the issue or pull request and move to the right sidebar. Find the Labels heading, activate the edit or gear button, choose labels from the dropdown, and close the dropdown with Escape when you're done. Selections save automatically. You can type part of a label name, like access, to filter the list.
Jamie: What about the other tools people use in this series?
Alex: github.dev, the web editor, is for editing files, so it does not manage issue labels. In VS Code Desktop, the GitHub Pull Requests extension can show issues and let you add or remove labels from the GitHub side panel. GitHub Desktop does not directly manage labels, so use Repository, then View on GitHub, and do the label work in the browser.
Jamie: And with the GitHub CLI, it is gh issue edit or gh pr edit?
Alex: Exactly. For example, gh issue edit 42 --add-label "accessibility,good first issue" adds two labels to issue 42. gh issue edit 42 --remove-label "needs triage" removes one. For a pull request, gh pr edit 15 --add-label "documentation" applies the documentation label to PR 15.
Alex: Filtering is where labels become really useful. If you want only accessibility issues, you do not need to scan the full issue list. You filter by label.
Jamie: In the browser, that can happen from the issue search field or by activating a label link, depending on where you are.
Alex: Right. In the GitHub CLI, gh issue list --label "accessibility" lists issues with that label. To combine labels, you can use more than one label filter, such as gh issue list --label "accessibility" --label "good first issue". Add --state open if you only want open issues. You can also search text across labeled issues with gh issue list --label "bug" --search "keyboard".
Jamie: That is a nice way to answer practical questions. What accessibility bugs are still open? Which documentation issues are good for a first contribution? What is still marked needs triage?
Alex: Yes, and that is why consistent labels matter. If every maintainer labels differently, filtering becomes unreliable. If the vocabulary is shared, the issue list becomes a useful map.
Alex: Milestones organize issues and pull requests around a release, deadline, sprint, or shared goal. A label tells you what kind of work something is. A milestone tells you what goal or time period it belongs to.
Jamie: So a bug label might tell me the type of issue, while a milestone like Version 1.2 or Workshop launch tells me when the team wants it finished.
Alex: Exactly. To find milestones, open the Issues tab and activate Milestones near the Labels link. A milestone usually has a title, description, due date if one is set, and progress information. GitHub shows how many linked issues or pull requests are open or closed, so the milestone becomes a progress tracker.
Jamie: What should I listen for when reading one?
Alex: Listen for the milestone title first, then the due date, then the open and closed counts. The description often tells you the goal. If the due date is close and several blocking issues are still open, that changes the triage conversation.
Jamie: How do you create one?
Alex: In the browser, go to Issues, then Milestones, then New milestone. Give it a short title, add a description, and set a due date if the team has one. From the command line, GitHub CLI can create a milestone through the GitHub API, for example: gh api repos/OWNER/REPO/milestones -f title="Workshop launch" -f due_on="2026-06-30T00:00:00Z". Replace OWNER and REPO with the repository owner and name.
Jamie: And adding an issue to a milestone is similar to labels?
Alex: Very similar. On the issue page, use the Milestone control in the right sidebar and choose the milestone. With the CLI, gh issue edit 42 --milestone "Workshop launch" assigns issue 42. gh issue edit 42 --remove-milestone removes it. To list issues in a milestone, use gh issue list --milestone "Workshop launch".
Jamie: Cross-references feel related, but they are not labels or milestones. What are they doing?
Alex: A cross-reference is a link between GitHub items, usually created when you mention another issue, pull request, or commit. If you type #42 in the same repository, GitHub links to issue or PR 42. If the item is in another repository, you can use OWNER/REPO#42.
Jamie: So if an issue report mentions that it is related to another bug, I can type the number instead of copying the whole URL.
Alex: Yes. You can cross-reference from an issue comment, a pull request description, a commit message, or another discussion area where GitHub supports it. The linked item may also show a timeline event, so people can follow the relationship in both places.
Jamie: Then there are the magic words: closes, fixes, and resolves. I always worry about using those accidentally.
Alex: Good instinct. Closing keywords are powerful. If a pull request description says Closes #42, GitHub will close issue 42 when that pull request is merged into the default branch. A normal comment saying Closes #42 does not close it by itself. Use closing keywords when the work truly completes the issue; otherwise, say related to #42 or see #42.
Alex: GitHub Projects are the planning boards for organizing issues, pull requests, and notes across a team. The current GitHub Projects experience is flexible: you can view the same work as a table, a board, or a roadmap.
Jamie: So the project is not replacing labels or milestones. It is another layer that helps people see status and coordination.
Alex: Exactly. In table view, items are rows, and fields like status, assignee, labels, milestone, repository, or priority appear as columns. Screen readers may announce the row information as you move cell by cell, so column names matter. In board view, work is grouped into columns such as To Do, In Progress, and Done. Roadmap view is timeline-oriented, useful when date fields are part of the project.
Jamie: Where do learners find a project?
Alex: A repository may have a Projects tab, and organizations or user profiles can have projects too. If a project is linked from an issue, you may also find it in the issue sidebar. Permissions matter here: some learners can recommend project placement even if they cannot add the issue directly.
Jamie: And if they can add it?
Alex: Open the issue, find the Projects area in the sidebar, and choose the project. After the issue is in the project, fields like Status can place it in a board column. For the Chapter 9 recommendation, naming a column like Needs Triage, To Do, or In Progress is enough when you do not have direct access.
Jamie: Let's put the pieces together. If I am helping organize work during a hackathon, what would a practical setup look like?
Alex: Start with a small label set people can actually use. Documentation, bug, accessibility, enhancement, good first issue, help wanted, and needs triage are a solid base. If the team has agentic workflows later, labels like needs-review or accessibility-check can also be useful because an automation or agent can watch for them and respond.
Jamie: Then create a milestone for the shared goal, not for every tiny task.
Alex: Right. A milestone such as Hackathon MVP, Workshop launch, or Day 1 cleanup gives the team a target. Issues in that milestone should all support that target. The project board then shows movement: Needs Triage for unclear work, To Do for accepted work, In Progress for active work, and Done when it is complete.
Jamie: That gives maintainers a quick read. The label says what it is, the milestone says where it belongs, and the project says what is happening with it.
Alex: Yes. A simple practice exercise is to open an issue, add or recommend one label, link a related issue with #number if there is one, and write a short triage comment. If you can change the issue, make the update. If you cannot, leave a clear recommendation.
Jamie: And the evidence for Chapter 9 is still the comment in the assigned challenge issue.
Alex: Correct. Close your Chapter 9 challenge issue when the recommendation is posted, and mention whether you also applied labels or a milestone directly. By the end, you should be able to read an issue, classify it thoughtfully, explain your reasoning, and leave a note a maintainer can act on.
Jamie: I like that this chapter makes organization feel like contribution, not admin busywork.
Alex: It really is contribution. Open source depends on people making work easier to understand. If you want more practice after this, GitHub's official documentation covers labels, milestones, and Projects in detail, and the GitHub Skills course on repository management gives an interactive path through related settings. But the core habit starts here: read carefully, choose clear categories, and explain your reasoning kindly.
Workshop Content
Companion Podcast and Transcript
Use audio and transcript companions to review concepts in a conversational format.
Labels, Milestones, and Projects
Companion audio: this episode reinforces key ideas and may not be a word-for-word reading of this page.
Open audio file (external) Full transcript source (external)
Transcript preview
Alex: Welcome back. Today we're looking at the part of GitHub that keeps work from turning into a pile of mystery tabs: labels, milestones, projects, and cross-references.
Jamie: I love this topic because it sounds small at first. A label is just a tag, right? But then suddenly it's how a team decides what needs attention, what belongs in a release, and who can help.
Alex: Exactly. Labels, milestones, and projects are the organizing layer on top of issues and pull requests. They help a team sort work by type, status, priority, goal, and timeline. Cross-references connect related conversations so people do not have to hunt through the repository to understand the story.
Jamie: And for learners using a screen reader, that organization is not just nice. If the issue list announces labels and status clearly, you can scan with more confidence instead of opening every issue one by one.
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.
Related appendices: Appendix R: Projects Deep Dive | Appendix A: Glossary Authoritative sources: GitHub Docs: About labels | GitHub Docs: About milestones | GitHub Docs: About Projects
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 9)
Chapter 9 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 9 Challenge Set
- Post a triage recommendation - read an issue, recommend labels/milestone/project placement, and explain your reasoning.
Challenge 9.1 Step-by-Step: Triage Recommendation Comment
Goal: Read the details of a Learning Room issue and post a structured triage recommendation that a maintainer could act on immediately.
Agentic strategy: Labels and issue states are how we wake up agents. In the Day 2 capstone, you can design an agent that only activates when an issue gets a specific label, such as
needs-revieworaccessibility-check.
Where you are working: your assigned Chapter 9 challenge issue in your Learning Room repository on GitHub.com, plus one other open issue you will triage.
- Open the Issues tab in your Learning Room repository.
- Find any open issue that does not already have labels applied (or pick one your facilitator assigns).
- Read the issue title and full description carefully. Note:
- What type of work is it? (documentation fix, bug report, accessibility improvement, new content)
- How urgent does it seem? (blocking other work, nice-to-have, unclear)
- Which file or area of the repo does it affect?
- Open your assigned Chapter 9 challenge issue (the one titled "Chapter 9.1: Triage Recommendation (@yourname)").
- Scroll to the comment box and post a triage recommendation using this format:
Chapter 9 triage recommendation for issue #[number]:
- Suggested labels: [pick 1-3 from: documentation, bug, accessibility, enhancement, good first issue]
- Suggested milestone: [pick one or write "none - reason"]
- Suggested project board column: [To Do, In Progress, or Needs Triage]
- One-sentence reason: [why you chose these categories]
- If you have write access to the repository, apply the recommended labels and milestone directly on the issue you triaged.
- Activate the Comment button.
Screen reader tip: When browsing available labels, open the Labels page (/labels path on the repo) to see all label names and descriptions. Your screen reader will read each label name and its description text.
You are done when: Your triage recommendation comment appears on your assigned challenge issue with all four fields filled in.
Completing Chapter 9: Submit Your Evidence
Your triage recommendation comment is your evidence. Close your Chapter 9 challenge issue when done. If you also applied labels directly, mention that in your comment.
Expected Outcomes
- Student can read an issue and recommend appropriate labels, milestone, and project placement.
- Student understands triage reasoning even without maintainer permissions.
- Student leaves a clear, reusable triage note that a maintainer could act on immediately.
If You Get Stuck
- Not sure which label to pick? Start with just one:
documentation,bug, oraccessibility. You can always add more. - Milestone is unclear? Write
noneand explain why - that is a valid triage decision. - Project board is unknown? Write
Needs Triage- that is the correct default. - Not sure what the issue is about? Re-read the title and first paragraph. If still unclear, that itself is useful triage feedback ("Issue description is unclear - needs more detail").
- Ask facilitator to review your one-sentence reason before posting.
Learning Moment
Triage is about clarity, not authority. You do not need maintainer permissions to help organize work. A clear recommendation saves maintainers time and speeds up collaboration. This is a skill used daily in open source.
Continue learning: The GitHub Skills course Introduction to Repository Management covers labels, milestones, and contributor settings in an interactive, self-paced format. See Appendix Z for the full catalog.
Learning Pattern Used in This Chapter
- Inspect an issue carefully before acting (read before you write).
- Classify work using a consistent vocabulary (labels, milestones).
- Explain your reasoning in writing (one-sentence justification).
- Build triage instincts that transfer to any open source project.
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
Tool Cards: Apply a Label
github.com (browser):
- Open the issue or PR.
- In the right sidebar, click the gear icon next to Labels.
- Select labels from the dropdown, then click outside to apply.
github.dev (web editor): Not available -- labels are managed on the issue/PR page, not in the code editor.
VS Code Desktop (GitHub Pull Requests extension):
- Open the issue in the GitHub sidebar panel.
- Click the label area to add or remove labels.
GitHub Desktop: Not directly supported. Use Repository > View on GitHub to manage labels in the browser.
Git CLI / GitHub CLI:
gh issue edit 42 --add-label "accessibility,good first issue"
gh pr edit 15 --add-label "documentation"
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.
Learning Cards: Labels
Screen reader users
- On the Issues list, labels are announced alongside each issue title: "Label: bug" or "Labels: accessibility, good first issue"
- Press
Lon an open issue (Focus Mode) to open the label picker directly; type to filter,Down Arrowto navigate,Enterto select - When filtering issues by label, type
is:open label:accessibilityin the search bar and pressEnter; the list updates to show only matching issues
Low vision users
- Labels appear as colored rounded rectangles next to issue titles in the list; in Windows High Contrast mode, labels use system border colors with readable text
- The Label dropdown from the sidebar gear icon is searchable: type the first few letters of a label name to filter the long list
- On the Labels management page (Issues tab, then Labels link), each label row shows its color swatch, name, and description in a table-like layout
Sighted users
- Labels appear as small colored pills next to issue titles in the Issues list; hover over a label to see its description in a tooltip
- Click the gear icon next to Labels in the issue sidebar to open a searchable dropdown; a checkmark appears next to selected labels
- The filter bar shows active label filters as text (e.g.,
label:accessibility); remove a filter by clicking the X next to it or clearing the search text
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.
Learning Cards: Milestones
Screen reader users
- On the Milestones page, each milestone is an H3 heading link; it announces the title, progress ("3 of 8 issues closed"), and due date
- Press
Enteron a milestone heading to open it; the detail page lists all assigned issues, navigable with3for titles orIfor list items - To assign an issue to a milestone, navigate to the sidebar "Milestone" heading (
H), activate the gear button, then useUp/Down Arrowto select
Low vision users
- Each milestone row shows a progress bar (green fill) and a fraction like "3 / 8" next to the title; the bar is visible at any zoom level
- The due date appears as grey text to the right of the progress bar; at high zoom it may wrap below the title
- The due date field when creating a milestone accepts typed input in YYYY-MM-DD format, which is more reliable than using the date picker at high magnification
Sighted users
- Milestones are listed on the Milestones page (accessible from the Issues tab, via the "Milestones" link in the toolbar)
- Each milestone shows a green progress bar, an issue count (e.g., "3 of 8"), an optional due date, and a description
- When viewing an issue, the assigned milestone appears in the right sidebar; click the milestone name to see all issues in that milestone
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.
Learning Cards: Cross-References
Screen reader users
- Type
#in any comment box (Focus Mode) to trigger a live-search dropdown of issues and PRs; pressDown Arrowto navigate,Enterto insert the reference - Type
@followed by a username to trigger user autocomplete; pressDown ArrowandEnterto insert the mention - After a PR merges with
Closes #42in the description, navigate to issue 42 and press3to find the "Closed by #XX" cross-reference comment
Low vision users
- Cross-reference links (
#42,@username) render as blue clickable text in comments; they are distinct from surrounding text at any zoom level - GitHub adds automatic back-links when you reference an issue or PR; look for them as timeline events (small text between comments) on the referenced item
- The
Closes #42keyword in a PR description renders as a clickable link to the issue, with a small icon showing the issue's current state
Sighted users
- Typing
#in a comment box opens a dropdown showing matching issues and PRs with their number, title, and open/closed state - Cross-references create bidirectional links: issue 42 gets a timeline event "Referenced in PR #25" and the PR shows "Closes #42" as a clickable link
- Use
Closes #42,Fixes #42, orResolves #42in the PR description body (not in comments) to trigger automatic issue closure on merge
GitHub Projects
See also: Appendix R: Projects Deep Dive covers advanced project board configuration, custom fields, and automation.
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
Learning Cards: GitHub Projects
Screen reader users
- In Table view, press
Tto jump to the project table, then useCtrl+Alt+Down Arrowfor rows andCtrl+Alt+Right Arrowfor columns (Title, Status, Priority, Assignee) - In Board view, press
Dto navigate between column landmarks (Todo, In Progress, Done), then3to jump between card titles within a column - Press
Enteron any card or table row to open the issue/PR detail panel without leaving the project view
Low vision users
- Board view shows issues as cards in vertical columns (Todo, In Progress, Done); each card displays the title, assignee avatar, and labels
- Table view is wider and has more columns; at high zoom, use horizontal scrolling to see columns like Priority and Assignee
- The view selector button (Table/Board/Roadmap) is near the top of the project page; it uses icon buttons that have text labels on hover
Sighted users
- Switch between Table, Board, and Roadmap views using the view selector buttons at the top of the project page
- Board view: drag and drop cards between columns, or click the Status field on a card to change it without dragging
- Table view: click column headers to sort, use the "+" button to add custom fields (Priority, Estimate, etc.), and click a row to open the issue detail panel
Practical Organization Strategy for the Hackathon
Here is a recommended structure for your 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 Step: Move on to Chapter 10: Notifications to finish Day 1.
Next: Chapter 10: Notifications and Day 1 Close
Back: Chapter 08: Open Source Culture
Related appendices: Appendix R: Projects Deep Dive
Authoritative Sources
Use these official references when you need the current source of truth for facts in this chapter.
- GitHub Docs, home
- GitHub Changelog
- GitHub Projects docs
- Labels docs
- Milestones docs
- About Git
- GitHub flow
- About pull requests
- About issues
- Contributing to a project
Section-Level Source Map
Use this map to verify facts for each major section in this file.
- Organizing Work and Cross-Referencing on GitHub: GitHub Docs, home, GitHub Changelog, GitHub Projects docs, Labels docs, Milestones docs
- Workshop Recommendation (Chapter 9): GitHub Docs, home, GitHub Changelog, GitHub Projects docs, Labels docs, Milestones docs
- Labels: GitHub Docs, home, GitHub Changelog, GitHub Projects docs, Labels docs, Milestones docs
- Milestones: GitHub Docs, home, GitHub Changelog, GitHub Projects docs, Labels docs, Milestones docs
- Cross-References: GitHub Docs, home, GitHub Changelog, GitHub Projects docs, Labels docs, Milestones docs
- GitHub Projects: GitHub Docs, home, GitHub Changelog, GitHub Projects docs, Labels docs, Milestones docs
- Practical Organization Strategy for the Hackathon: GitHub Docs, home, GitHub Changelog, GitHub Projects docs, Labels docs, Milestones docs
- Try It: Label and Link: GitHub Docs, home, GitHub Changelog, GitHub Projects docs, Labels docs, Milestones docs