Working with Issues
Filing, searching, filtering, commenting on, and managing GitHub issues.
Listen
Transcript
Alex: Welcome back. Today we're working with GitHub issues, which are often where collaboration starts.
Jamie: And an issue can be a bug report, but it's not only bugs, right?
Alex: Right. An issue is a trackable unit of work. It might be a bug, a feature request, a question, a documentation chore, or a note that says, something needs attention here.
Jamie: So it is the shared place where people agree on what needs to happen before anyone starts changing files.
Alex: Exactly. In this chapter, that matters because Challenges 2 and 3 happen entirely in your Learning Room repository's issue threads. You file one issue, then you join a conversation on someone else's issue.
Jamie: No branch, no commit, no pull request yet.
Alex: Not yet. Chapter 5 is about getting comfortable with issue work first: finding the Issues tab, reading the page, writing clearly, commenting well, and confirming your work was recorded.
Jamie: Before someone starts clicking around, is there any accessibility setup they should know about?
Alex: Yes. GitHub has an improved Issues experience with better landmarks and screen-reader announcements. For many accounts, it is already the standard interface. If you see a Feature preview area in your user menu, you can check whether "New Issues Experience" is listed and enabled; if it is not listed, that usually means it has already graduated into the regular interface.
Jamie: And for NVDA users, there is that mode switch that can trip people up.
Alex: Yes. Use Browse Mode for reading headings, issue titles, comments, and timelines. Switch to Focus Mode when you're typing in search boxes, title fields, or comment boxes. NVDA+Space toggles the mode, and NVDA+F7 opens a list of headings, links, form fields, buttons, and landmarks, which is a very practical way to reorient.
Jamie: Low-vision learners may be scanning visually instead, especially at high zoom.
Alex: The Issues tab is in the repository navigation, and the New issue button is prominent near the top of the Issues list. At high zoom, you may need to move through the top area carefully, but the list, filters, and button are still part of the same page. You can also go straight to a repository's issues URL if someone gives you the link.
Jamie: And keyboard shortcuts can help if they're enabled.
Alex: Yes. From a repository page, G then I jumps to Issues. Once you're on the list, issue titles are often heading level 3, so pressing 3 can move between issue titles more quickly than arrowing through every control.
Alex: The Issues list is your dashboard. It shows open work, closed work, titles, issue numbers, labels, authors, assignees, comment counts, and sometimes milestones.
Jamie: What should someone listen for when a screen reader lands on an issue in the list?
Alex: Usually the title link, the issue number, the state such as open or closed, who opened it, when it was updated, labels, and comment information. The exact order can vary, so the useful habit is to stop after each title and listen for the details before activating it.
Jamie: That makes the list less like a wall of links and more like a set of work items.
Alex: Yes. And the search or filter bar at the top lets you narrow that set down. GitHub uses search qualifiers, which are short filters typed into the search field.
Jamie: Like is:open label:bug?
Alex: Exactly. is:open shows open issues. is:closed shows closed ones. label:bug shows issues with the bug label. You can combine them, so is:open label:bug assignee:@me means open bug issues assigned to you.
Jamie: What about milestones and authors?
Alex: milestone:"Version 1" filters by a milestone, author:username finds issues opened by a person, and assignee:username finds issues assigned to them. You can also add plain words to search inside titles and descriptions, like keyboard shortcut or broken link.
Jamie: And if typing qualifiers feels like too much at first?
Alex: Use the filter controls. GitHub gives you menus for labels, assignees, milestones, and open or closed state. The search bar and the filter buttons are two paths to the same goal: a smaller, more relevant list.
Jamie: Once I open an issue, what am I actually reading?
Alex: Start with the title. Then read the body, which is the main description written in Markdown. After that, move through the timeline, where comments, label changes, assignments, references, commits, and pull request activity can appear.
Jamie: So the body tells me what the author thought was important, and the timeline tells me what has happened since.
Alex: Yes. The sidebar adds metadata: labels, assignees, milestone, linked pull requests, and sometimes sub-issues. Labels are short tags like bug, documentation, or good first issue. Assignees are the people responsible for working on it. A milestone groups issues toward a larger goal or release.
Jamie: For navigation, headings are useful here too.
Alex: They are. The issue title is usually the first main heading. Comments and timeline items are easier to skim if you move by headings, landmarks, or form fields instead of reading every page element from the top.
Jamie: And the terminal is an option, not a requirement.
Alex: Right. If you're using GitHub CLI, gh issue view 123 renders the issue in the terminal. gh issue view 123 --comments includes the comments. If the Markdown or timeline is easier in the browser, gh issue view 123 --web opens the issue page instead.
Jamie: I like that the rule is read first, then write.
Alex: Yes. Before commenting, assigning, closing, or editing, read the issue enough to understand the request and the current state.
Alex: Now let's talk about filing a new issue, because that is Challenge 2.
Jamie: This is where people often freeze. The blank title field feels surprisingly serious.
Alex: A clear title says what needs attention and where possible. "Broken link" is vague. "Setup guide link to accessibility settings returns 404" is much better because it names the object, the problem, and the impact.
Jamie: And the body is where the detail goes.
Alex: Yes. A strong issue body usually answers five questions: what happened, what you expected, how to reproduce it, what environment you used, and any additional context. For documentation chores, that might become what content is missing, where it belongs, and what the fix should say.
Jamie: Markdown helps make that readable.
Alex: Definitely. Use short paragraphs, numbered steps, bulleted lists, links, and task lists. If you include code, commands, or error messages, put them in fenced code blocks so they are read as code and not mashed into the sentence.
Jamie: What about labels and assignees while creating the issue?
Alex: If you have permission, you can add labels from the sidebar or issue form, assign someone, and place the issue in a milestone. If you do not have permission, that is fine. Maintainers or facilitators can triage it after you submit.
Jamie: And repositories may have issue templates.
Alex: Yes. If a template picker appears, choose the template that fits, or choose a blank issue when the challenge asks for that. Templates are there to guide you, not to trap you.
Jamie: For Challenge 2, learners are doing this in the Learning Room repository.
Alex: Correct. Open the Learning Room repo, go to Issues, activate New issue, choose a blank issue if needed, write a title of at least 12 characters, and write a meaningful body of at least 80 characters. The suggested theme is an accessibility problem or chore you wish an AI agent could help fix later.
Jamie: And you're done when the issue appears in the list with your username, a clear title, and the description you wrote.
Alex: Yes. Copy the URL or note the issue number, like #150, because you'll use that as evidence later.
Jamie: Challenge 3 shifts from filing to participating.
Alex: Exactly. Open a classmate's issue, or a facilitator-provided peer-simulation issue, read it carefully, and leave a helpful comment. The comment should include an @mention of the issue author, like @classmate, so GitHub notifies them.
Jamie: That notification part is easy to overlook.
Alex: It is, but it is central to open source communication. An @mention says, I want this person to see this. Later, when you study notifications, you'll decide how those alerts reach you.
Jamie: What makes a comment helpful instead of noisy?
Alex: It adds context, confirms a detail, asks a focused question, or suggests a next step. "Same" is not very useful. "@classmate I can confirm this link returns a 404 in setup-guide.md, under the accessibility settings heading" gives the author something they can use.
Jamie: And reactions are lighter than comments.
Alex: Yes. Emoji reactions can say thanks, agreement, celebration, or concern without adding another full message to the thread. Use them when you want to acknowledge something but do not need to add new information.
Jamie: After the comment appears and the username becomes a link, Challenge 3 is complete.
Alex: Right. If you're using the web page, Ctrl+Enter often submits a comment from the comment box. If you're using the terminal, gh issue comment 123 --body "Your message" posts inline, and gh issue comment 123 --editor opens your default editor for a longer comment.
Alex: Issues also connect to each other, and to pull requests, through references.
Jamie: That's the #number syntax?
Alex: Yes. If you type #150 in the same repository, GitHub links to issue or pull request number 150. If the issue is in another repository, you can use owner/repo#150.
Jamie: And those references show up in the timeline.
Alex: They do. That makes the history traceable. If a pull request mentions an issue, the issue timeline can show that connection, and the pull request becomes part of the story.
Jamie: What about closing keywords?
Alex: In a pull request description, phrases like fixes #150, closes #150, or resolves #150 can automatically close the issue when the pull request is merged. Those keywords can also appear in some issue comments, but the most common workflow is a pull request that resolves an issue.
Jamie: So issues describe the work, and pull requests propose the change.
Alex: Exactly. They are separate objects, but they work together. An issue can explain the problem, and a pull request can contain the commit history, file changes, discussion, and review that solve it.
Jamie: Where do sub-issues fit?
Alex: Sub-issues are parent-child relationships for breaking a large issue into smaller tracked pieces, when the repository has that feature available. A parent issue can show a progress indicator as child issues are completed.
Jamie: How is that different from a task list in the issue body?
Alex: A task list is a checklist inside one issue. A sub-issue is its own issue, with its own title, comments, labels, assignee, and status. Use sub-issues when each piece deserves separate tracking or discussion.
Jamie: And the optional extension asks learners to add one if the feature is available.
Alex: Yes. Open the issue you created, look for Sub-issues or Add sub-issue, create a new child issue with a specific title and short description, and confirm it appears nested under the parent.
Jamie: Maintainers and triagers have a few extra controls, right?
Alex: They do. They can assign issues, apply and remove labels, set milestones, close issues, reopen issues, and sometimes transfer or delete issues depending on permissions.
Jamie: Assigning yourself means you're taking responsibility for the work.
Alex: Yes, or at least signaling that you're the person currently handling it. Labels communicate type and status, such as bug, enhancement, documentation, help wanted, or needs triage. Milestones group work into a release, sprint, workshop checkpoint, or project goal.
Jamie: What does closed mean?
Alex: Closed means the issue is no longer active as open work. It might be completed, it might be a duplicate, it might be out of scope, or it might be closed as not planned. A good close usually includes a reason or a comment so readers understand what happened.
Jamie: And reopening is allowed when new information changes the situation.
Alex: Exactly. If the bug returns, the fix was incomplete, or the issue was closed by mistake, reopen it and explain why. Reopening without context can confuse people, so add a comment that names the new evidence.
Jamie: Transfer and delete sound more serious.
Alex: They are. Transferring moves an issue to a different repository, which can be useful if it was filed in the wrong place. Deleting removes it from view and is usually reserved for spam, sensitive content, or mistakes that should not remain public.
Jamie: And good first issue is the label new contributors often look for.
Alex: Yes. It marks work that maintainers believe is approachable for someone new to the project. Still read the issue carefully, check recent comments, and make sure nobody else is already actively working on it before you jump in.
Alex: If you prefer the terminal, GitHub CLI can handle much of this issue workflow.
Jamie: But first, make sure you're in the right repository.
Alex: Exactly. Run git remote -v to see what remote your local clone points to, and gh repo view to confirm the GitHub repository context. That prevents you from listing or commenting in the wrong place.
Jamie: Then you can list assigned issues.
Alex: Yes. gh issue list --assignee @me shows issues assigned to you in the current repository. gh issue view 123 lets you read one issue. gh issue comment 123 --body "Thanks, I can reproduce this" posts a comment.
Jamie: And creating an issue can be interactive or inline.
Alex: Right. gh issue create prompts for title, body, labels, and assignees. If you want to provide everything in one command, use options like --title, --body, --label, and --assignee. For example, gh issue create --title "Broken setup link" --body "The accessibility settings link returns 404." --label documentation.
Jamie: What about editing metadata from the terminal?
Alex: gh issue edit 123 --add-assignee @me can assign yourself. You can use --add-label, --remove-label, and --milestone when you have permission. gh issue close 123 closes an issue, gh issue close 123 --comment "Fixed in #151" adds context, and gh issue reopen 123 reopens it.
Jamie: The CLI is powerful, so the safest habit is still read, act, confirm.
Alex: Yes. Read with gh issue view, make one focused change, then confirm with gh issue view or gh issue list. And when in doubt, use gh issue --help or gh issue edit --help rather than guessing at options.
Jamie: Let's talk specifically about accessibility issue writing.
Alex: A strong accessibility issue names the barrier, where it happens, what technology was involved, and what the expected accessible behavior should be. For example: "In welcome.md, the banner image is referenced without alt text. A screen reader user does not receive the same information conveyed visually. Add concise alt text that describes the purpose of the image."
Jamie: That is much more useful than "accessibility is broken."
Alex: Yes. For accessibility reports, include browser, operating system, screen reader or magnification tool if relevant, zoom level if it matters, steps to reproduce, actual behavior, and expected behavior. If you can describe severity without exaggerating, do that too.
Jamie: Feature requests need a slightly different shape.
Alex: They do. A good feature request explains the user need, the proposed behavior, why it helps, and any alternatives you've considered. It should leave room for maintainers to discuss the design instead of demanding one exact implementation.
Jamie: The chapter's learning cards are meant to reinforce these habits.
Alex: Yes. They summarize navigation, filtering, reading, commenting, filing, cross-referencing, sub-issues, managing issues, the good first issue label, and accessibility-specific writing. Use them as quick review prompts after you've practiced the workflow once.
Jamie: What should someone do if they get stuck?
Alex: First, slow down and reorient. On the web, use headings, landmarks, the issue title, and the issue number in the page title or URL. In NVDA, check whether you're in Browse Mode or Focus Mode. In the terminal, confirm the repository with gh repo view before running issue commands.
Jamie: And if the issue did not appear?
Alex: Check whether the form has required fields, whether a template picker is still waiting for a choice, or whether you are in the wrong repository. After submitting, the new issue page should load, the title should be a heading, and the issue number should appear in the URL.
Jamie: How do learners submit evidence for the chapter?
Alex: Go to your assigned Challenge 2 or Challenge 3 issue and post a comment that says Chapter 5 completed, then include the issue number you created, the issue number where you commented with an @mention, and the optional sub-issue number if you made one. After that, close your assigned challenge issues so the facilitator can review your activity.
Jamie: So the expected outcome is not just that an issue exists. It's that the learner can create one clearly, participate respectfully, use metadata and references, and confirm the work is visible.
Alex: Exactly. Manual issue work builds the judgment you'll need later when tools or agents help with triage. If you can read the thread, understand the labels, ask a good question, and verify the result yourself, you're ready for the collaboration that comes next.
Workshop Content
Companion Podcast and Transcript
Use audio and transcript companions to review concepts in a conversational format.
Working with Issues
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 working with GitHub issues, which are often where collaboration starts.
Jamie: And an issue can be a bug report, but it's not only bugs, right?
Alex: Right. An issue is a trackable unit of work. It might be a bug, a feature request, a question, a documentation chore, or a note that says, something needs attention here.
Jamie: So it is the shared place where people agree on what needs to happen before anyone starts changing files.
Working with Issues
Listen to Episode 5: Working with Issues - a conversational audio overview of this chapter. Listen before reading to preview the concepts, or after to reinforce what you learned.
Related appendices: Appendix N: Advanced Search | Appendix V: GitHub Mobile | Appendix B: Screen Reader Cheat Sheet Authoritative sources: GitHub Docs: About issues | GitHub Accessibility Guide: Issues | GitHub Accessibility Lab: CLI Guide
Filing, Managing, and Participating in GitHub Issues
Issues are where open source collaboration begins. This guide covers everything from finding the right issue to file a perfect bug report - all with your keyboard and screen reader.
Official GitHub Accessibility Guide: GitHub publishes an NVDA-focused guide for working with issues using a screen reader at Using GitHub Issues with a Screen Reader. This chapter covers the same material with additional perspectives (VoiceOver, low vision, CLI) and workshop-specific challenges. Use the official guide as a companion reference.
Screen reader note - New Issues Experience: This guide uses GitHub's improved Issues experience, which provides better ARIA landmark structure and live-region announcements for screen readers. This feature may already be active for your account - it has been broadly rolled out and may no longer appear as a Feature Preview toggle at all.
To verify: Activate the User Menu button (top-right of any GitHub page) → activate "Feature preview" → scan the list for "New Issues Experience":
- If listed and the toggle announces "Pressed" (or "Disable") - already enabled, no action needed
- If listed but not Pressed (or "Enable") - activate the toggle to enable it
- If not listed at all - the feature has graduated to the standard interface; it is active automatically
Full step-by-step instructions with per-screen-reader commands are in Pre-Workshop Setup, Step 4.
Browse vs Focus Mode (NVDA): Toggle between modes with
NVDA+Space(NVDA key =InsertorCaps Lock). Use Browse Mode (the default) for reading lists, headings, and issue content. Switch to Focus Mode when typing in text fields and search boxes. UseNVDA+F7at any time to open a list of all headings, links, form fields, buttons, and landmarks on the page - this is your orientation tool.
Workshop Recommendation (Chapter 5 / Challenges 2-3)
Chapter 5 is the first issue-based challenge chapter with short, confidence-building tasks. It supports Challenge 2 (File Your First Issue) and Challenge 3 (Join the Conversation).
- Challenge count: 2 core challenges plus one optional extension
- Time per challenge: under 10 minutes
- Evidence: issue comments and issue metadata
- Pattern: claim -> act -> confirm
CLI getting-started principles for issue work
If you prefer terminal workflows, keep this sequence:
- Confirm repository context first (
git remote -vandgh repo view). - Read before writing (
gh issue view <number>before commenting or editing). - Keep comments focused, specific, and actionable.
- Verify each action from output (
gh issue list --assignee @me). - Use only documented options from
gh --helpand the manual.
Chapter 5 Challenge Set
- Create your first issue - file a new issue with a clear title and description.
- Comment and @mention - leave a comment on a classmate's issue and tag them with an @mention.
- Optional extension: Add a sub-issue - break a larger issue into smaller, trackable pieces if your repository has sub-issues enabled.
Branch guidance for Chapter 5: Chapter 5 focuses on issue skills. You do NOT need to create a branch or edit any files for these challenges. All your work happens in GitHub issue threads. File editing and branches start in Chapter 6.
How completion works: When you finish the issue challenges, post evidence in your assigned challenge issues with links to the issue you created and the comment you posted. The facilitator reviews your issue activity directly. No pull request is required for Chapter 5.
Challenge 2 Step-by-Step: Create Your First Issue
Goal: File a new issue in your Learning Room repository with a specific title and a meaningful description.
Agentic strategy: Issues are the prompts that wake up AI. A clear issue for a human is also a prompt for an agent. For this challenge, log an issue describing an accessibility problem or chore you wish an AI agent could fix for you.
Where you are working: the Issues tab of your Learning Room repository on GitHub.com.
- Open your Learning Room repository in your browser.
- Navigate to the Issues tab (press
GthenIto jump there with keyboard shortcuts, or find the "Issues" link in the repository navigation). - Activate the New issue button.
- If a template picker appears, select Open a blank issue (or choose a template if one fits).
- In the Title field, type a clear, specific title (at least 12 characters). Examples:
- "Agent Request: Add missing contributor background paragraph in welcome.md"
- "Keyboard shortcuts table has incorrect NVDA modifier key"
- "Setup guide link to accessibility settings is broken"
- In the Body field, write a meaningful description (at least 80 characters). Include:
- What the problem is or what content is missing.
- Where in the repository the problem exists (file name and section).
- What you think the fix should be.
- Activate Submit new issue.
- Copy the issue URL or note the issue number (for example,
#150). You will reference this later.
You are done when: Your new issue appears in the Issues list with your username as the author, a clear title, and a detailed description.
Challenge 3 Step-by-Step: Comment and @Mention
Goal: Leave a comment on another student's issue and use an @mention to notify them.
Where you are working: the Issues tab of your Learning Room repository on GitHub.com.
- Open the Issues tab in your Learning Room repository.
- Find an issue created by a classmate (look for recent open issues, or use a facilitator-provided peer-simulation issue).
- Open the issue by activating its title link.
- Read the issue description to understand what they reported.
- Scroll to the comment box at the bottom of the issue.
- Write a helpful comment that @mentions the issue author by username. Examples:
- "@classmate I can confirm this - the link in setup-guide.md goes to a 404 page."
- "@classmate Good catch! I think the correct shortcut is Insert+F7, not Insert+F5."
- "@classmate I'd suggest adding the paragraph right after the 'Who Can Contribute' heading."
- Activate the Comment button (or press
Ctrl+Enter).
Why @mentions matter: When you type @username, GitHub sends that person a notification. This is how real open source teams communicate - you signal who needs to see your message. It also bridges into Chapter 10 (Notifications) where you will configure how you receive these alerts.
You are done when: Your comment appears in the thread and includes an @mention (the username renders as a clickable link).
Optional Extension Step-by-Step: Add a Sub-Issue
Goal: Break a larger issue into smaller, trackable pieces using GitHub's sub-issue feature.
Where you are working: the issue you created in Challenge 2 (or any open issue you have permission to edit).
What are sub-issues? Sub-issues let you decompose a big task into smaller steps, each tracked independently. The parent issue shows a progress bar as sub-issues are completed. This is how teams organize real work - a single "Fix accessibility in welcome.md" issue might have sub-issues for each specific fix.
- Open the issue you created in Challenge 2.
- Look for the Sub-issues section in the issue sidebar (right side on desktop). If you do not see it, look for an Add sub-issue button or the Create sub-issue option below the issue description.
- Activate Add sub-issue and choose Create new sub-issue.
- Give the sub-issue a clear title that describes one specific piece of the parent issue. For example, if the parent is "Fix accessibility in welcome.md":
- Sub-issue: "Add alt text to welcome banner image"
- Sub-issue: "Fix heading hierarchy in Getting Started section"
- Add a short description and activate Create.
- The sub-issue now appears nested under the parent issue with a progress indicator.
You are done when: Your parent issue shows at least one sub-issue in the Sub-issues section.
Completing Chapter 5: Submit Your Evidence
When you have finished the Chapter 5 issue challenges, go to your assigned Challenge 2 or Challenge 3 issue and post a comment with your evidence:
Chapter 5 completed:
- Challenge 2: Created issue #[number]
- Challenge 3: Commented with @mention on issue #[number]
- Optional: Added sub-issue to issue #[number]
Replace [number] with the actual issue numbers. Then close your assigned challenge issues. The facilitator will review your issue activity.
Expected Outcomes
- Student can create an issue with a clear title and description.
- Student can communicate in issue threads using @mentions.
- Student can organize work by breaking issues into sub-issues.
If You Get Stuck
- Can't find a classmate's issue? Filter the Issues tab by
is:openand look for recent ones. - @mention not working? Make sure you type
@immediately followed by the username with no space. - Sub-issue option not visible? Ask a facilitator - the feature may need to be enabled for the repository.
- Still stuck? Ask a facilitator for a direct issue link.
- Finished but not sure you did it right? Compare your work against the Challenge 2 reference solution or the Challenge 3 reference solution.
Learning Moment
Issues are collaborative spaces, not just task lists. An @mention tells someone "I need your attention here." Sub-issues turn vague tasks into clear checklists. Both skills are used daily in real open source projects.
Learning Pattern Used in This Chapter
- Start with a small, safe action (create an issue).
- Practice communication in public issue threads (@mention a peer).
- Organize work into smaller pieces (sub-issues).
- Leave clear evidence in the issue timeline.
- Build momentum for file editing and PR work in Chapter 6.
About Learning Cards in This Chapter
This chapter provides learning cards: expandable blocks that offer perspective-specific guidance for different ways of working. Not every card appears at every step. Open the ones that match how you work.
The following table describes the five learning card types used in this chapter.
| Card | Who it helps | What it covers |
|---|---|---|
| Visual / mouse | Sighted users navigating with a mouse or trackpad | Click targets, visual cues, layout orientation |
| Low vision | Users with magnification, zoom, or high-contrast themes | Zoom-friendly navigation, finding controls at high magnification, high contrast visibility |
| NVDA / JAWS (Windows) | Screen reader users on Windows | Keystroke sequences, Focus and Browse mode, landmark navigation |
| VoiceOver (macOS) | Screen reader users on macOS | VO key sequences, rotor usage, interaction model |
| CLI (gh) | Terminal users on any platform | GitHub CLI commands for issue management |
Local Git Alternative: Working from Your Clone
If you cloned the learning-room in Block 0 and prefer working locally
During Block 0 you cloned the Learning Room repository to your computer. If you are comfortable in a terminal, you can use the GitHub CLI (gh) from inside that clone for every issue operation in this chapter. This is the same workflow covered in depth in Chapter 11: Git and Source Control.
Verify your clone is ready:
cd ~/Documents/learning-room # or wherever you cloned it
git status # should show "On branch main"
Common issue commands from your local terminal:
# List your assigned challenge issues
gh issue list --assignee @me --label challenge
# View a specific issue in the terminal
gh issue view 42
# Leave a comment on an issue
gh issue comment 42 --body "I'd like to try this!"
# Create a new issue interactively
gh issue create
All of these produce the same result as the web interface. The chapter instructions work identically either way - choose whichever is more comfortable for you.
What Is a GitHub Issue?
An issue is a discussion thread attached to a repository. Issues are used for:
- Bug reports - "This feature doesn't work when using a screen reader"
- Feature requests - "It would help if the submit button had an accessible label"
- Questions - "How do I configure X for Y use case?"
- Tasks - "Update the README with screen reader instructions"
- Accessibility reports - "The infinite scroll carousel is not keyboard accessible"
Every issue has a number (#42), a state (Open or Closed), a title, a description, and a comment thread. Issues are public by default on public repositories.
Learning Room connection: In your Learning Room repo, every challenge from
docs/CHALLENGES.mdbecomes an issue. For example, Challenge 1 ("Fix Broken Link") is filed as an issue pointing todocs/welcome.md, describing the broken link and linking to the challenge success criteria. When you open a PR to fix it, you reference the issue withCloses #XXto automatically close it on merge.
Navigating to the Issues List
From a repository page
Visual / mouse users
Click the Issues tab in the repository navigation bar below the repository name. The tab shows the open issue count (e.g., “Issues · 14”).
Screen reader users (NVDA / JAWS - Windows)
- Press
Dto navigate to the "Repository navigation" landmark - Press
KorTabto move through the tab links - Find "Issues" - it will be announced with the count: "Issues, 14 open"
- Press
Enterto open the Issues tab
Screen reader users (VoiceOver - macOS)
VO+U→ Landmarks → navigate to "Repository navigation"VO+Rightor Quick NavKto move through tab links- Find "Issues" - VoiceOver announces the count: "Issues 14"
VO+Spaceto activate the Issues tab
GitHub CLI (gh) alternative
List open issues directly from your terminal:
gh issue list
Filter by label, assignee, or state:
gh issue list --label "good first issue"
gh issue list --assignee @me
gh issue list --state closed
Setup: Install the GitHub CLI from cli.github.com and authenticate with gh auth login. See Appendix D for details.
Direct URL
Navigate directly: https://github.com/[owner]/[repo]/issues
Learning Cards: Navigating to the Issues List
Screen reader users:
- Press
Dto jump to the "Repository navigation" landmark, thenKorTabto find the Issues link -- this is faster than arrowing through the entire page - The Issues tab announces its open count ("Issues, 14 open"), giving you an instant sense of project activity without loading the list
- Use
gh issue listin the terminal to bypass browser navigation entirely; pipe through--labelor--assignee @meto pre-filter results - In Windows Terminal, use mark mode (
Ctrl+Shift+M) to review long issue output line by line before taking action
Low-vision users:
- The Issues tab count badge may be small at default zoom; at 200%+ the tab text reflows but the count remains visible next to the word "Issues"
- Bookmark the direct URL pattern (
github.com/owner/repo/issues) to skip repository page navigation altogether - In high-contrast mode, the active tab is indicated with an underline using system highlight color, not just a subtle background change
Sighted users:
- The Issues tab sits in the repository navigation bar directly below the repo name; the open count badge gives a quick pulse check on project health
- Memorize the
G Ikeyboard shortcut (press G, release, press I) to jump to Issues from anywhere in the repository without scrolling - The direct URL pattern works for any repository: swap
[owner]/[repo]with real values and bookmark your most visited projects
The Issues List Page
Page structure
[Search / filter bar] -- controls at the top
[State tabs: Open / Closed] -- filter by status
[Issues list] -- each issue is one list item or heading
[Pagination] -- at the bottom
Quick orientation tip: Press
NVDA+F7(orVO+Uon macOS) to open a list of all headings, links, form fields, and buttons on the page. This is often faster than tabbing through many elements and helps you understand the full page structure before diving in. UseCtrl+/(Windows) orCmd+/(Mac) to jump directly to the search field from anywhere on the page.
How to read the issue list
Visual / mouse users
The issues list shows each issue as a row with its title, labels, number, assignee avatars, and comment count. Closed issues show a purple merged/closed badge. Click any issue title to open it. Use the Open and Closed toggle links above the list to switch between states.
Low vision users (zoom, high contrast)
Each issue row shows the title, labels (colored badges), number, and comment count. At high magnification:
- Issue titles are the largest text in each row and remain readable at 200%+ zoom.
- Label badges use colored backgrounds with text inside. In Windows High Contrast mode, labels display with system border colors and readable text rather than colored backgrounds.
- The Open and Closed toggle links above the list let you switch views. The active toggle is bold or underlined.
- The comment count icon (a speech bubble) may be small at high zoom. It appears to the right of each issue row. Hover to see "N comments" tooltip.
- Use
Ctrl+F(browser Find) to search for a specific issue title if the list is long.
Screen reader users (NVDA / JAWS)
- Press
Dto reach the “Search Results List” landmark - Press
3(h3) to navigate by issue titles - each issue title is an h3 link - Press
Ito move between list items if you want more detail per item - Press
Enteron a title to open that issue
Screen reader users (VoiceOver)
VO+U→ Landmarks → navigate to “Search Results List”VO+Downto read through itemsH(with Quick Nav on) orVO+U→ Headings to jump by issue title
What is announced per issue
When you navigate to an issue in the list, your screen reader will announce (in some order):
- Issue title (as a link)
- Issue number (
#42) - Labels (e.g., "bug, good first issue")
- Who opened it and when ("Opened 3 days ago by username")
- Number of comments ("5 comments")
Learning Cards: The Issues List Page
Screen reader users
- Press
Dto jump to the "Search Results List" landmark, then press3to navigate issue titles (each is an H3 link) - Press
Ito move between individual list items if you want full detail per issue (number, labels, author, age) - After applying a filter, the issue list updates silently; press
3again to re-navigate the updated list from the top
Low vision users
- Issue titles are the largest text per row and stay readable at 200%+ zoom; labels appear as small colored badges to the right of each title
- The Open/Closed toggle links are near the top of the list; the active state is bold or underlined depending on your theme
- If the comment count icon (speech bubble) is too small at your zoom level, hover over it for a tooltip showing the exact count
Sighted users
- Each issue row shows: open/closed icon (green circle = open, purple merged icon = closed), title, label badges, PR link icon, comment count, and assignee avatar
- Click the Open/Closed tabs above the list to switch between open and closed issues; the count next to each tab updates as you filter
- Issue labels appear as colored rounded rectangles inline with the title; hover over a label to see its description
Filtering and Searching Issues
Filtering lets you narrow the list to find the right issue quickly.
Using the search/filter bar
- Press
ForEto jump to the filter input field (or navigate from the landmark) - Switch to Focus Mode (
NVDA+Space/Insert+Z) if not already in it - Type your filter or search query
- Press
Enterto apply
Useful filter queries
is:open label:"good first issue" ← great for finding your first contribution
is:open label:accessibility ← accessibility-related open issues
is:open assignee:@me ← issues assigned to you
is:open no:assignee ← unassigned issues
is:open author:@me ← issues you filed
mentions:@me ← where you were @mentioned
is:open is:unread ← issues with unread activity
Using the filter buttons
Above the issue list, there is an actions toolbar with filter buttons for Labels, Milestones, Assignees, etc.
Screen reader note: The filter buttons do not indicate the current filter state. After applying a filter, the button text does not change to reflect what is selected. To verify which filters are active, check the search/filter bar text - it updates to show the active filter conditions (for example,
is:open label:accessibility).
Visual / mouse users
The filter bar sits above the issue list. Click Label, Milestone, or Assignee to open a dropdown, select the values you want, then click anywhere outside to close. The issue list updates immediately.
Low vision users (zoom, high contrast)
The filter bar sits above the issue list. At high magnification:
- The Label, Milestone, and Assignee buttons may wrap to a second row. Each button opens a dropdown with searchable options.
- Dropdown menus from filter buttons can extend below the visible viewport at high zoom. Scroll within the dropdown to see all options.
- Type in the search field at the top of each dropdown to narrow the list (for example, type "accessibility" in the Label dropdown).
- In Windows High Contrast mode, the selected filter values are indicated with a checkmark icon and system highlight color, not just a background color change.
Screen reader users (NVDA / JAWS - Windows)
- Press
Tabfrom the search bar (orShift+Tabfrom the issue list) to reach the actions toolbar - Press
←/→to move between toolbar options (Label, Milestone, Assignee, Sort) - Press
Enterto open the selected dropdown - Use
↑/↓to navigate options in the dropdown - Press
EnterorSpaceto select - Press
Escapeto close (filter applies immediately)
Screen reader users (VoiceOver - macOS)
Tabforward from the search bar to reach the filter buttons, or use Quick Nav to find themVO+Left/Rightto move between Label, Milestone, Assignee, Sort buttonsVO+Spaceto open the selected dropdownVO+Downor arrow keys to navigate the dropdown optionsVO+Spaceto select/deselectEscapeto close (filter applies immediately)
GitHub CLI (gh) alternative - filtering
Filter issues by label, milestone, or assignee without navigating dropdown menus:
# Filter by label
gh issue list --label "accessibility"
# Combine filters
gh issue list --label "good first issue" --assignee @me
# Filter by milestone
gh issue list --milestone "Hackathon Day 1"
# Search with keywords
gh issue list --search "screen reader"
Open vs Closed filter
The two state links "Open" and "Closed" appear near the top of the issue list. Press K to navigate links until you find them, or look for them as buttons near the search bar.
Learning Cards: Filtering and Searching Issues
Screen reader users:
- Switch to Focus Mode (
NVDA+Space) before typing in the filter bar; switch back to Browse Mode after pressing Enter to read the filtered results - The filter bar does not announce how many results remain after filtering; press
Hto jump to the issue list heading, then listen for the count in the heading text - Combine
gh issue listflags (e.g.,--label "accessibility" --assignee @me) for instant filtered results without navigating dropdown menus
Low-vision users:
- Filter dropdown menus can extend below the viewport at high zoom; scroll within the dropdown or type in the search field at the top of each dropdown to narrow options
- After applying a filter, verify it took effect by checking the search bar text -- it updates to show active conditions like
is:open label:accessibility - The
Ctrl+/(Windows) orCmd+/(Mac) shortcut focuses the search bar instantly, avoiding the need to scroll up to find it
Sighted users:
- Build compound queries in the search bar for precision:
is:open label:"good first issue" no:assigneefinds unclaimed starter issues in one step - The Open/Closed toggle near the top of the list preserves your current filter; click Closed to see resolved issues without losing your label or assignee filter
- Pin your most-used filter as a browser bookmark (the URL updates to reflect the active query) for one-click access
Reading an Issue
Landing on an issue page
When you open an issue, the page structure is:
[Issue title - h1]
[Open/Closed status badge]
[Author, timestamp, comment count]
─────────────────────────────────
[Issue description - Main content] ← the original post
[Labels, Assignees sidebar - h3s]
─────────────────────────────────
[Activity / Timeline] ← comments and events
[First comment - h3]
[Second comment - h3]
...
─────────────────────────────────
[Add a comment - landmark]
[Comment text area]
[Close issue / Submit button]
Quick navigation
| Goal | Key |
|---|---|
| Hear the issue title | 1 |
| Jump to description | 2 (first h2 is usually "Description") |
| Jump to Activity section | 2 → next h2 is "Activity" |
| Navigate between comments | 3 (each comment is h3) |
| Jump to comment box | D → "Add a comment" landmark |
| Navigate labels/assignees | H or 3 in the sidebar |
Reading the issue description
- Press
2to reach the "Description" heading - Press
↓to read the content line by line, OR - Use
NVDA+↓(NVDA say all) to have it read continuously
Browse Mode recommended: The issue detail page is primarily text-based. Stay in Browse Mode (not Focus Mode) for reading - it gives you full heading (
H), section (D), and link (K) navigation throughout the page. Only switch to Focus Mode when you need to type in a comment box.
Markdown in the description renders as proper HTML: headings become actual headings, bullets become lists, code blocks become <code> elements with the text "code block" announced.
GitHub CLI (gh) alternative - reading an issue
View an issue's full content in your terminal:
# View issue in terminal (renders Markdown)
gh issue view 42
# Open the issue in your browser instead
gh issue view 42 --web
# View just the comments
gh issue view 42 --comments
The terminal output includes the title, state, labels, assignees, body, and comments. Markdown renders as plain text - headings use # symbols, lists use -, and code blocks are preserved.
Reading comments and activity
Each comment in the thread is marked as an h3. Navigate between them with 3.
Each comment announces:
- Commenter's username
- Timestamp ("2 days ago")
- Body text
- Reactions (if any - announced as a button with an emoji and count)
- A "Reply" link
Other timeline events (label added, PR linked, issue closed) appear between comments in the activity stream. They are typically announced as text paragraphs.
Learning Cards: Reading an Issue
Screen reader users
- Press
1to hear the issue title, then2to reach "Description" and "Activity" headings, and3to jump between individual comments - Stay in Browse Mode for reading; only switch to Focus Mode (
NVDA+Space) when you need to type in the comment box - Press
Dto jump to the "Add a comment" landmark at the bottom of the page to skip directly to the reply area
Low vision users
- The issue title is the largest text on the page, followed by an Open/Closed badge in green or purple
- Comment blocks have a subtle border and a grey header bar showing the author's avatar and timestamp; zoom in on the header to identify commenters
- The sidebar (Labels, Assignees, Milestone) is on the right at desktop width; at high zoom it may move below the main content
Sighted users
- The issue page has a two-column layout: main content on the left (description, timeline, comment box) and sidebar on the right (labels, assignees, milestone, linked PRs)
- Each comment shows the author's avatar in the left margin, with a header bar containing their username and a relative timestamp
- Timeline events (label changes, assignments, cross-references) appear as small lines between comments with icons indicating the event type
Leaving a Comment
Step-by-step
Visual / mouse users
- Scroll to the bottom of the issue page
- Click in the Leave a comment text area
- Type your comment (Markdown is supported - use the toolbar buttons above the text for bold, italic, code, etc.)
- Optionally click Preview to see how it will render
- Click the green Comment button to post
To close the issue while commenting: click the arrow on the Close issue button and choose Close with comment.
Low vision users (zoom, high contrast)
The comment area is at the bottom of the issue page. At high magnification:
- Scroll to the bottom to find the Leave a comment text area. At 200%+ zoom, this may require significant scrolling past the timeline.
- The text area expands as you type. The formatting toolbar above it (bold, italic, code, etc.) wraps at high zoom but remains functional.
- The Preview tab next to Write lets you check Markdown rendering before posting.
- The green Comment button is full-width at high zoom and easy to target.
- Keyboard shortcut: Press
Ctrl+Enter(Windows) orCmd+Return(macOS) from inside the text area to submit the comment without finding the button. - In Windows High Contrast mode, the text area border and the Comment button use system colors for clear visibility.
Screen reader users (NVDA / JAWS - Windows)
- Navigate to the comment box:
D→ "Add a comment" landmark, or pressEorFto focus the text area - Enter Focus Mode: NVDA:
Insert+Space| JAWS:Insert+Z - Type your comment (plain text or Markdown)
- To preview:
Tabto the Preview button, pressEnter; thenTabback to Write to continue editing - Submit: press
Ctrl+Enterfrom inside the text area, OR pressEscape→Tabto the Comment button →Enter
Screen reader users (VoiceOver - macOS)
- Navigate to the comment box:
VO+U→ Landmarks → "Add a comment", or Quick NavFto jump to the text area - Interact with the text area:
VO+Shift+Down - Type your comment (plain text or Markdown)
- To preview:
VO+Shift+Upto stop interacting, thenTabto the Preview button andVO+Space - Submit: press
Cmd+Returnfrom inside the text area, ORVO+Shift+Up→Tabto the Comment button →VO+Space
GitHub CLI (gh) alternative - commenting
Leave a comment from your terminal:
# Interactive: opens your default editor ($EDITOR) to write the comment
gh issue comment 42
# Inline: provide the comment text directly
gh issue comment 42 --body "Thanks for reporting this. I can reproduce the issue with NVDA + Chrome."
Markdown formatting while typing
These keyboard shortcuts work inside the text area (Focus Mode):
| Shortcut | Result |
|---|---|
Ctrl+B |
Bold text |
Ctrl+I |
Italic text |
Ctrl+E |
Code span |
Ctrl+K |
Inserts a link dialog for markdown links (example: [Link text](https://example.com)) |
Ctrl+Shift+. |
> Blockquote |
Ctrl+Shift+L |
- Bullet list |
Ctrl+Shift+7 |
1. Numbered list |
GitHub shortcuts for the Issues pages
These are the GitHub built-in shortcuts for working with issues. Enable Focus Mode first (NVDA: NVDA+Space, JAWS: Insert+Z) before using single-key shortcuts.
On the Issues list page
| Shortcut | Action |
|---|---|
? |
Show all shortcuts for this page |
G I |
Jump to the Issues tab from anywhere in the repo |
C |
Create a new issue |
Shortcut note: For G I, press G, release it, then press I (two sequential key presses, not simultaneous).
| Ctrl+/ (Win) or Cmd+/ (Mac) | Focus the issues search and filter bar |
| U | Filter by author |
| L | Filter by or edit labels |
| M | Filter by or edit milestones |
| A | Filter by or edit assignee |
| O or Enter | Open the selected issue |
On an open issue
| Shortcut | Action |
|---|---|
M |
Set a milestone |
L |
Apply a label |
A |
Set an assignee |
X |
Link a related issue from the same repository |
R |
Quote selected text in your reply (select text first) |
Ctrl+Shift+P (Win) or Cmd+Shift+P (Mac) |
Toggle Write and Preview tabs |
Ctrl+Enter |
Submit comment from inside the text area |
Rto quote is a power move: Select any text in a comment while in Browse Mode (Shift+Arrowto select), then pressR. GitHub puts the quoted text in the comment box as a Markdown blockquote. Much faster than typing>manually.
For the full shortcut system, see Screen Reader Cheat Sheet - GitHub Shortcuts section.
- Navigate to your comment (
3to jump to comments) - Find the "..." (ellipsis) menu button near your comment
- Press
Enteron "Edit" from that menu - The comment turns into a text area - switch to Focus Mode
- Make your changes
- Tab to "Update comment" button → Enter
Learning Cards: Leaving a Comment
Screen reader users:
- Press
Dto jump to the "Add a comment" landmark, which places focus near the text area; then Enter Focus Mode to start typing - Use
Ctrl+Enterto submit your comment directly from inside the text area -- this avoids having to Tab through the formatting toolbar to find the Comment button - To quote someone's text in your reply, select the text in Browse Mode (
Shift+Arrow), then pressR; GitHub inserts it as a blockquote in the comment box automatically
Low-vision users:
- The comment text area expands as you type and is full-width at high zoom, making it easy to target; use
Ctrl+Enterto submit without hunting for the Comment button - Use the Preview tab next to Write to check your Markdown formatting in rendered form before posting; bold, code blocks, and links are much easier to proofread there
- Keyboard formatting shortcuts (
Ctrl+Bfor bold,Ctrl+Efor inline code) work inside the text area and save time over clicking small toolbar icons
Sighted users:
- The formatting toolbar above the text area offers bold, italic, code, link, and list buttons; hover for tooltips showing the keyboard shortcut for each
- Use the
Rshortcut to quote selected text -- it creates a blockquote in your reply, making threaded conversations much easier to follow - The Close with comment option (dropdown arrow on the Close button) lets you leave a final note and close the issue in a single action
Filing a New Issue
Navigating to New Issue
Visual / mouse users
From the Issues list page, click the green New issue button in the top-right of the issue list. If the repository has templates, a template picker page appears - click Get started next to the template that fits your needs, or click Open a blank issue to skip templates.
Low vision users (zoom, high contrast)
The green New issue button is in the top-right of the issue list page. At high magnification:
- At 200%+ zoom, the button may move below the search bar or wrap to its own line. It remains a prominent green button.
- If the repository has issue templates, a template picker page appears with each template as a card. Template descriptions may truncate at high zoom. Hover over a truncated description for the full text.
- The Get started button next to each template is small but uses standard link styling. Press
Tabto move between templates and their Get started buttons. - Open a blank issue link appears at the bottom of the template list. At high zoom, scroll down to find it.
- In Windows High Contrast mode, the New issue button uses the system button colors and the template cards have visible borders.
Screen reader users (NVDA / JAWS - Windows)
From the Issues list:
- Press
Kto navigate links and find the "New issue" button/link - Press
Enter - If a template picker appears: press
3to navigate template names, read the description below each, then pressEnteron "Get started" for the right template - or find "Open a blank issue." link if no template fits
Screen reader users (VoiceOver - macOS)
From the Issues list:
- Quick Nav
BorVO+U→ Buttons to find the "New issue" button VO+Spaceto activate it- If a template picker appears: Quick Nav
HorVO+Cmd+Hto navigate template names, thenVO+Spaceon "Get started" for the right template - or Quick NavKto find the "Open a blank issue" link
Filling Out the Issue Form
The issue form has these fields (order may vary depending on the template):
Title field
- Find the Title input field (
For by landmark) - Focus Mode → type a clear, specific title
- Good title: "Screen reader announces wrong element count on Issues list with 50+ items"
- Bad title: "Bug with screen reader"
Description / Body field
- Tab to the body text area
- Focus Mode → type using the Markdown template provided
- If no template, use this structure:
## What happened
Describe what you observed.
## What I expected
Describe what should have happened.
## How to reproduce
1. Step one
2. Step two
3. Step three
## Environment
- Screen reader: [NVDA 2025.3.3 / JAWS 2026 / VoiceOver macOS Sonoma]
- Browser: [Chrome 124 / Firefox 125 / Safari 17]
- OS: [Windows 11 / macOS 14]
- GitHub interface: [Modern experience (default since Jan 2026) / Classic experience]
## Additional context
Any other information, screenshots (with alt text), or links.
Assigning labels from the sidebar
See also: Chapter 09: Labels, Milestones, and Projects covers the full label and milestone system.
While the form is open, the sidebar has dropdowns for Labels, Assignees, and Milestone.
Visual / mouse users
In the right sidebar, click the gear icon () next to Labels. A dropdown opens - click a label to select it. Click outside to close. Repeat for Assignees and Milestone.
Screen reader users (NVDA / JAWS - Windows)
Tabaway from the text area (or pressEscapeto leave Focus Mode)- Navigate to the sidebar - press
Hto find "Labels" heading - Press
Enteron the Labels gear/button - Dropdown opens →
↑/↓to navigate labels Enterto select/deselectEscapeto close (selections save automatically)
Screen reader users (VoiceOver - macOS)
VO+Shift+Upto stop interacting with the text areaVO+U→ Headings to find the "Labels" heading in the sidebarVO+Spaceon the Labels gear/button to open the dropdownVO+Downor arrow keys to navigate labelsVO+Spaceto select/deselectEscapeto close (selections save automatically)
Submitting the issue
- Tab to "Submit new issue" button
- Press
Enter
GitHub CLI (gh) alternative - filing a new issue
Create an issue from your terminal:
# Interactive: prompts for title, body, labels, and assignees
gh issue create
# Inline: provide everything on the command line
gh issue create --title "Screen reader announces wrong count on Issues list" \
--body "## What happened\n\nThe count says 14 but only 12 issues are visible." \
--label "bug,accessibility" \
--assignee @me
# Use a template (if the repo has issue templates)
gh issue create --template "bug_report.md"
The interactive mode walks you step-by-step through title, body (opens your editor), labels, and assignees - fully usable from a terminal with a screen reader.
Learning Cards: Filing a New Issue
Screen reader users
- After pressing "New issue," if a template picker appears, press
3to jump between template names; each has a "Get started" link next to it - In the title field, type at least 12 characters for a meaningful title; press
Tabto move to the body field - Press
Ctrl+Enterfrom inside the body text area to submit the issue without needing to find the Submit button
Low vision users
- The green "New issue" button is in the top-right of the Issues list page; at 200%+ zoom it may wrap below the search bar
- Template cards (if the repo uses them) show truncated descriptions at high zoom; hover over them for the full text
- The sidebar dropdowns for Labels, Assignees, and Milestone are gear icons that may be small at high zoom; they open searchable dropdown panels
Sighted users
- The new issue form has a Title field at the top and a large Body text area below; a formatting toolbar (bold, italic, code, etc.) appears above the body
- The Write/Preview tabs above the body let you toggle between editing and rendered Markdown views
- Sidebar options (Labels, Assignees, Milestone) appear to the right of the body field; click the gear icon next to each to open a dropdown
Tool Cards: File a New Issue
github.com (browser):
- Navigate to the repository's Issues tab (or press
GthenI). - Click New issue, choose a template or blank issue.
- Fill in the title and description, then click Submit new issue.
github.dev (web editor): Not available -- issues are managed through the repository's Issues tab, not the code editor.
VS Code Desktop (GitHub Pull Requests extension):
- Open the GitHub panel in the sidebar.
- Under Issues, click the + icon to create a new issue.
- Fill in the title and body, then click Create.
GitHub Desktop: Not directly supported. Click Repository > View on GitHub to open the browser, then file the issue there.
Git CLI / GitHub CLI:
gh issue create --title "Your title" --body "Description here"
# Or interactively:
gh issue create
Cross-Referencing Issues
Linking issues and PRs to each other creates a trail of context that helps everyone understand the project's history.
Closing keywords in PR descriptions or issue comments
When you type these phrases in a PR description or comment (followed by an issue number), GitHub creates a connection:
| Keyword | Effect on merge |
|---|---|
Closes #42 |
Closes issue #42 when the PR merges |
Fixes #42 |
Same - typically for bugs |
Resolves #42 |
Same - general use |
refs #42 |
Creates a reference without auto-closing |
cc @username |
Notifies the person |
Mentioning another issue in a comment
Simply type # followed by a number anywhere in a comment body. GitHub autocompletes with a dropdown of matching issues and PRs:
Step 1: Type # in the comment box (Focus Mode)
Step 2: A dropdown appears with issues and PRs
Step 3: ↑/↓ to navigate, or type more numbers to filter
Step 4: Enter to insert the reference
Cross-repo references
owner/repo#42 - references issue #42 in a different repository.
Learning Cards: Cross-Referencing Issues
Screen reader users:
- Type
#in any comment body to trigger GitHub's autocomplete dropdown; pressDown Arrowto browse matching issues andEnterto insert the reference link - Use
Closes #42(not just#42) in PR descriptions so GitHub automatically closes the issue on merge; your screen reader will confirm the link is created in the PR timeline - Cross-references appear as timeline events on the linked issue; navigate with
Hto find "mentioned this issue" entries to trace the conversation history
Low-vision users:
- Cross-reference links (
#42) render as colored, clickable links in both issue bodies and PR descriptions; at high zoom they remain inline with surrounding text - The autocomplete dropdown triggered by
#may overlap content at high magnification; type additional digits to narrow results and reduce dropdown size - Back-links appear automatically on the referenced issue's timeline, so you can verify the connection was created by visiting either side
Sighted users:
- Use
Closes #42,Fixes #42, orResolves #42in PR descriptions for auto-closing on merge;refs #42creates a reference without auto-close, useful for "related but not solved" links - GitHub's autocomplete (
#then type) searches both issue titles and numbers, so you can find issues by keyword without memorizing numbers - Cross-repo references use the format
owner/repo#42-- useful when your PR in one repository fixes a bug tracked in another
Sub-Issues - Parent and Child Relationships
Sub-issues (released 2025) let you nest issues inside a parent issue to break large work into tracked pieces. A "parent" issue contains a list of child issues; each child is a full issue with its own discussion, labels, and assignees.
When to Use Sub-Issues
| Use case | Example |
|---|---|
| Large feature broken down | Parent: "Redesign navigation"; Children: "Keyboard nav," "Screen reader nav," "Mobile nav" |
| Epic tracking | Parent: "WCAG 2.1 AA compliance"; Children: one issue per failing criterion |
| Release milestone | Parent: "v2.0 release"; Children: every required PR/fix |
Creating a Sub-Issue
From any open issue:
1. Open the parent issue page
2. Scroll to (or H-navigate to) the "Sub-issues" section in the issue body/sidebar
3. Tab to "Add sub-issue" button → Enter
4. Type the issue number or title to search
5. Select the issue from the dropdown → Enter to link
Or: select "Create new issue" to create and link in one step
Screen reader note: The sub-issues section is announced as a region. After linking, the child issue appears as a list item with a checkbox showing its open/closed state. Tab through to read each child's title and status.
Reading Sub-Issues on a Parent Issue
H → "Sub-issues" heading
↓ → list of linked child issues
Each item: [checkbox state] [issue title] [#number] [open/closed badge]
Tab → "Add sub-issue" button (if you have write access)
Progress indicator: The parent issue shows a completion bar (e.g., "3 of 7 completed") based on how many child issues are closed. Screen readers announce this as a progress region.
Viewing a Child Issue's Parent
Every child issue shows a "Parent issue" link near the top of the page (above the description). Navigate with H or links (K) to find it.
Sub-Issues vs. Task Lists
| Feature | Task list checkboxes | Sub-issues |
|---|---|---|
| Location | Issue description (Markdown) | Sidebar/section (structured data) |
| Each item is | Text line + checkbox | A full GitHub issue |
| Tracked in Projects | No (checkbox only) | Yes (each child tracks independently) |
| Cross-repo | No | Yes |
| Best for | Quick checklists in one issue | Multi-issue work tracking |
Workshop tip: If you are working on a feature that requires multiple PRs or involves several team members, ask the maintainer to create a parent issue. You can then claim individual child issues without one person owning the whole feature.
Learning Cards: Sub-Issues
Screen reader users:
- The sub-issues section is announced as a region; press
Hto navigate to the "Sub-issues" heading, then arrow down through the list where each child announces its checkbox state, title, and open/closed badge - The parent issue shows a progress indicator ("3 of 7 completed") announced as a progress region; listen for this after the sub-issues heading to gauge overall status
- Every child issue includes a "Parent issue" link near the top of its page; navigate with
K(links) to find it and jump back to the parent quickly
Low-vision users:
- The completion progress bar on the parent issue uses color to show progress; in high-contrast mode, completed vs. remaining segments use distinct system colors
- At high zoom, the "Add sub-issue" button may wrap below the sub-issues list; Tab past the last child item to reach it
- Each child issue's open/closed badge uses both color and text ("Open" or "Closed"), so status is readable without relying on color alone
Sighted users:
- Sub-issues appear as a checklist with a progress bar on the parent issue; each child links directly to its own issue page with full discussion and labels
- Use sub-issues instead of Markdown task-list checkboxes when each item needs its own assignee, labels, or cross-repo tracking -- sub-issues are structured data, not just text
- Creating a sub-issue from the parent's "Add sub-issue" button auto-links the new issue; you can also link existing issues by searching their number or title
Managing Issues (for Maintainers and Triagers)
Closing an issue
Visual / mouse users
Scroll to the bottom of the issue page. Click the Close issue button next to the comment box. Optionally type a closing comment first. If you want to record a reason, click the dropdown arrow on the button and choose Close as completed or Close as not planned.
Screen reader users (NVDA / JAWS - Windows)
- Keyboard shortcut (fastest): Navigate to the comment text area (
D→ "Add a comment" landmark), switch to Focus Mode, then pressCtrl+Shift+Enterto close the issue - Button approach:
Tabto the "Close issue" button (at the bottom of the page, near the comment box) and pressEnter - Optionally leave a closing comment first
Screen reader users (VoiceOver - macOS)
- Keyboard shortcut (fastest):
VO+U→ Landmarks → "Add a comment", interact with the text area (VO+Shift+Down), then pressCmd+Shift+Returnto close the issue - Button approach: Quick Nav
BorTabto find the "Close issue" button, thenVO+Space - Optionally leave a closing comment first
GitHub CLI (gh) alternative - closing and reopening
Close or reopen an issue from your terminal:
# Close an issue
gh issue close 42
# Close with a reason
gh issue close 42 --reason "completed"
gh issue close 42 --reason "not planned"
# Close with a comment
gh issue close 42 --comment "Fixed in PR #45."
# Reopen a closed issue
gh issue reopen 42
Reopening a closed issue
If an issue is Closed, the "Close issue" button becomes "Reopen issue" - navigate and activate to reopen.
Assigning an issue
From the issue sidebar:
- Navigate to "Assignees" heading (
3orH) - Activate the gear/plus button
- Type a username in the search field
- Select from the dropdown
GitHub CLI (gh) alternative - assigning and labeling
Manage assignments and labels from your terminal:
# Assign yourself
gh issue edit 42 --add-assignee @me
# Add labels
gh issue edit 42 --add-label "accessibility,in progress"
# Remove a label
gh issue edit 42 --remove-label "needs triage"
# Set a milestone
gh issue edit 42 --milestone "Hackathon Day 1"
Changing labels
From the issue sidebar:
- Navigate to "Labels" heading
- Activate the gear button
- Select/deselect labels from the dropdown
- Press Escape to save
Transferring or deleting an issue
Available from the "..." (ellipsis) button at the top of the issue - navigate buttons with B to find it.
Learning Cards: Managing Issues
Screen reader users:
- Close an issue instantly with
Ctrl+Shift+Enterfrom the comment text area (Focus Mode) -- no need to Tab to the Close button - The sidebar sections (Assignees, Labels, Milestone) each have their own heading; press
Hor3to jump between them, then activate the gear icon to open each dropdown - Use
gh issue edit 42 --add-label "accessibility" --add-assignee @meto batch-update labels and assignments from the terminal without navigating sidebar controls
Low-vision users:
- Sidebar controls (Assignees, Labels, Milestone) are narrow at default width; at high zoom they stack vertically and each dropdown opens a searchable overlay that is easier to read
- The Close issue button turns green and its label changes to "Reopen issue" once closed; in high-contrast mode, both states use distinct system colors
- Type in the search field inside each sidebar dropdown (Labels, Assignees) to filter long lists rather than scrolling through all options at high magnification
Sighted users:
- The issue sidebar on the right contains Assignees, Labels, Projects, and Milestone in collapsible sections; click the gear icon next to each to open the edit dropdown
- Use the dropdown arrow on the Close button to choose "Close as completed" vs. "Close as not planned" -- this distinction helps with project tracking and search filtering
- The "..." menu at the top of any issue provides Transfer, Pin, Lock, and Delete options for repository maintainers
The "good first issue" Label - Your Entry Point
When looking for your first open source contribution:
- Navigate to any project's Issues tab
- Filter by label: type
is:open label:"good first issue"in the search - Read through issues until you find one in your area of interest
- Comment on the issue: "Hi, I'd like to work on this. Can I be assigned?"
- Wait for a maintainer to respond and assign you before starting work
Remember: It's respectful to ask before starting. Maintainers juggle many discussions and need to know who is working on what to avoid duplicated effort.
Learning Cards: The "good first issue" Label
Screen reader users:
- Use the filter query
is:open label:"good first issue"in the search bar to jump directly to beginner-friendly issues;gh issue list --label "good first issue"does the same in the terminal - Before claiming an issue, read existing comments to check whether someone else has already been assigned; listen for "assigned to" in the sidebar metadata
- When you comment to claim an issue, include a sentence about your approach so the maintainer can give early feedback before you start coding
Low-vision users:
- The "good first issue" label renders with a distinct background color (typically light purple or teal); in high-contrast mode it uses system highlight colors with readable text
- Filter results may include issues with multiple labels stacked together; at high zoom, labels wrap to a second line but remain readable
- Bookmark the filtered URL (
/issues?q=is:open+label:"good first issue") in your browser for one-click access to beginner issues across your favorite repositories
Sighted users:
- The "good first issue" label is a GitHub convention recognized across the ecosystem; many projects also use "help wanted" for intermediate tasks
- Always comment before starting work -- even if unassigned -- to avoid duplicating effort with another contributor who may already be working quietly
- Read the issue's linked PR history (if any) to see whether previous attempts were made and why they were closed; this saves you from repeating known dead ends
Accessibility-Specific Issue Writing Tips
When filing accessibility bugs, these details help maintainers reproduce and fix the problem:
- Screen reader and version - "NVDA 2025.3.3" not just "screen reader"
- OS and version - "Windows 11 22H2"
- Browser and version - "Chrome 124.0.6367.82"
- GitHub interface - "Modern experience (default since Jan 2026)" or "Classic experience (opted out)"
- What was announced - quote the exact text your screen reader spoke
- What should have been announced - describe the expected behavior
- ARIA issue if known - e.g., "The button has no accessible name"
- Steps to reproduce - numbered, step-by-step
- Frequency - "This happens every time" vs "intermittent"
Example of a well-filed accessibility issue
Title: Issues list does not announce label filtering results to screen readers
## What happened
When I apply a label filter on the Issues list using the Labels dropdown,
the filtered list updates visually but NVDA does not announce that the
results changed or how many items are now shown.
## What I expected
After filtering, the screen reader should announce something like
"14 issues open, filtered by label: accessibility" or a live region
update indicating the results changed.
## How to reproduce
1. Navigate to any repo's Issues tab
2. Press B to navigate to the "Label" filter button
3. Press Enter to open the dropdown
4. Select the "accessibility" label
5. Press Escape to close
6. Notice: no announcement that filtering has been applied
## Environment
- Screen reader: NVDA 2025.3.3 (with NVDA+Chrome)
- Browser: Chrome 124.0.6367.82
- OS: Windows 11 22H2
- GitHub interface: Modern experience (default since Jan 2026)
## Additional context
JAWS 2026 also does not announce. VoiceOver on macOS Sonoma with
Safari 17 does announce "List updated" when filtering is applied,
so the macOS behavior appears correct.
Learning Cards: Accessibility-Specific Issue Writing
Screen reader users:
- Always quote the exact text your screen reader announced in the issue body; wrap it in a fenced code block so readers know it is literal output, not your description
- Include your screen reader name and version (e.g., "NVDA 2025.3.3") plus browser and OS; this lets maintainers reproduce with the same toolchain
- Test with a second screen reader or browser if possible and note the results -- "Also fails in JAWS 2026 with Chrome; works in VoiceOver with Safari" dramatically narrows the debugging scope
Low-vision users:
- When filing zoom or contrast bugs, state your exact zoom level and whether you use Windows High Contrast, macOS Increase Contrast, or a browser extension
- Screenshots are powerful evidence; annotate them (circle the problem area, add a text callout) and always include alt text describing what the screenshot shows
- Note whether the issue occurs only at certain zoom levels or viewport widths; a bug at 400% that disappears at 200% points to a CSS breakpoint problem
Sighted users:
- Even if you do not use assistive technology, you can file accessibility issues by testing with keyboard-only navigation (Tab, Enter, Escape) and noting where focus is lost or trapped
- Include the ARIA role or attribute involved if you can identify it from browser DevTools (e.g., "The button has
role=presentationand no accessible name") - Link to the relevant WCAG success criterion when possible (e.g., "Fails WCAG 2.1 SC 1.3.1 Info and Relationships"); this gives maintainers a clear standard to design against
Writing Effective Issues
See also: Appendix N: Advanced Search covers search qualifiers to find existing issues before filing a new one.
A well-written issue saves everyone time -- the maintainer who reads it, the contributor who fixes it, and the future searcher who finds it six months later. This section gives you reusable templates for the two most common issue types and a set of principles that apply to every issue you file.
Bug Report Structure
A strong bug report answers five questions. Use this template every time you report something broken.
| Section | What to write |
|---|---|
| Title | Follow the formula: "When I [action], [unexpected result] instead of [expected result]" |
| Steps to Reproduce | Numbered list -- start from the earliest relevant step |
| Expected Behavior | What should happen according to documentation or common sense |
| Actual Behavior | What does happen -- include exact error messages or screenshots |
| Environment | OS, browser, screen reader, app version -- anything that might matter |
The title formula is the most important part. A title like "When I press Enter on the Submit button, nothing happens instead of creating the issue" tells the maintainer exactly what is broken before they even open the issue.
Screen reader tip: When pasting error messages into the Actual Behavior section, wrap them in a fenced code block (triple backticks). Screen readers will announce "code block" so the listener knows the text is a literal error, not your description.
Steps to Reproduce matter more than you think. Maintainers cannot fix what they cannot recreate. Number every step, starting from a clean slate -- "Open the repository" is better than "Go to the page." Include what you clicked, what keyboard shortcut you pressed, and what happened after each step.
Feature Request Structure
Feature requests work best when they focus on the problem before jumping to the solution. Use this four-part structure:
- Problem statement -- Describe the pain point. What are you trying to do, and why is it hard or impossible right now?
- Proposed solution -- Your best idea for fixing the problem. Be specific enough to discuss, but hold it loosely.
- Alternatives considered -- Other approaches you thought about and why they fell short. This shows you have done your homework.
- Who benefits -- Name the audience. "Screen reader users navigating large repositories" is more compelling than "everyone."
A feature request that starts with "I want a dark mode toggle" is weaker than one that starts with "Low-vision users report eyestrain after 20 minutes because the current theme has insufficient contrast." The second version gives maintainers something to design around.
General Issue Writing Principles
These rules apply to every issue -- bugs, features, questions, and everything in between.
One issue per problem. If you discovered two bugs during the same session, file two separate issues. Combining them makes it impossible to close one without the other and clutters the conversation.
Write searchable titles. Future contributors will search before filing. "Bug with button" will never surface in a search for "Submit button unresponsive on Safari." Front-load the title with the specific component or action.
Include context, not assumptions. Instead of "The API is broken," write "The /repos endpoint returns a 403 when I pass a valid token." Let maintainers draw their own conclusions from the evidence you provide.
Link related issues. If your bug might be connected to issue #42, mention it: "This might be related to #42." GitHub automatically creates a back-link, building a web of context that helps everyone. You will learn more about cross-referencing in Chapter 6.
| Principle | Bad example | Good example |
|---|---|---|
| One issue per problem | "The button is broken and also the logo is wrong" | Two separate issues, each with its own title |
| Searchable title | "Help needed" | "Keyboard focus lost after closing modal dialog" |
| Context over assumptions | "Nothing works" | "After upgrading to v2.3, the dashboard returns a blank page on Firefox 124" |
| Link related issues | (no mention) | "Possibly related to #42 -- same component, different trigger" |
Before and After: A Vague Issue vs. a Clear Issue
Vague issue (hard to act on):
Title: Bug
It doesn't work. I tried clicking and nothing happened. Please fix.
The maintainer has to ask: What doesn't work? Where did you click? What browser? What did you expect? Every follow-up question costs a round-trip of waiting.
Clear issue (ready to fix):
Title: When I press Enter on the "New issue" button, nothing happens instead of opening the issue form
Steps to Reproduce:
- Navigate to github.com/org/repo
- Press
GthenIto go to the Issues tab- Tab to the "New issue" button
- Press
EnterExpected: The new issue form opens.
Actual: The page does not respond. No error in the console.
Environment: Windows 11, Firefox 128, JAWS 2025
The maintainer can reproduce this in under a minute. No follow-up questions needed -- the fix can start immediately.
Screen reader tip: You can use the issue template feature in GitHub to pre-fill these sections automatically. If the repository provides templates, your screen reader will announce each section heading as you Tab through the form. You will set up your own issue templates in Chapter 17.
Learning Cards: Writing Effective Issues
Screen reader users
- Use fenced code blocks (triple backticks) when pasting error messages or screen reader output; your screen reader announces "code block" so listeners know the text is literal, not description
- When writing "Steps to Reproduce," type each step as a numbered Markdown list item (
1.,2., etc.) so screen readers announce "list with N items" - Type
#in the comment body to trigger issue autocomplete; pressDown Arrowto navigate matching issues andEnterto insert a cross-reference link
Low vision users
- Use the Preview tab (next to Write) to check your Markdown rendering before submitting; headings, bold text, and code blocks are much easier to proofread in rendered form
- Screenshots with alt text are valuable evidence; add them with the image button in the formatting toolbar or drag-and-drop into the body field
- Keep paragraphs short (3-4 sentences max) so the issue is scannable at high zoom without excessive scrolling
Sighted users
- A well-structured issue uses H2 headings (##) for major sections: What happened, Expected, How to reproduce, Environment
- GitHub renders Markdown tables in issue bodies; use a table to compare expected vs. actual behavior side by side
- The title appears in issue lists, email notifications, and search results; front-load it with the specific component or action for discoverability
Try It: File Your First Issue
Time: 3 minutes | What you need: Browser, signed in to GitHub
Go to the Learning Room repository and file a real issue:
- Navigate to the Issues tab (press
GthenIin Focus Mode) - Find and activate the "New issue" button (
Kto links, orTabto it) - In the title field, type: "Introduce myself - [Your Name]"
- In the description, write 2-3 sentences: who you are, what screen reader you use, and one thing you're hoping to learn today
- Press
Ctrl+Enterto submit (or Tab to the Submit button and pressEnter)
You're done. You just filed your first GitHub issue. Go read someone else's introduction and leave a friendly comment - press 3 to jump between issue titles on the Issues list.
What success feels like: Your issue is live. Other participants can see it. You just contributed to a real repository - and it took less than three minutes.
Learning Cards: Filing Your First Issue
Screen reader users:
- After pressing
Ctrl+Enterto submit, listen for the page reload; GitHub navigates to your new issue page where the title is the first heading -- press1to confirm it matches what you typed - Navigate the issue list with
3(heading level 3) to jump between issue titles; this is faster than arrowing through every element on the page - If the template picker appears, use
TabandEnterto select "Open a blank issue"; template names are announced as link text
Low-vision users:
- The "New issue" button is prominent and green on the Issues list page; at high zoom it remains visible near the top of the page and does not collapse into a menu
- The title field is full-width and the body field expands as you type; both are easy to locate and target at any zoom level
- After submitting, your new issue page shows your avatar, title, and description in high-contrast-friendly layout; verify the content rendered correctly before moving on
Sighted users:
- Your issue immediately appears at the top of the Issues list; the green "Open" badge confirms it was created successfully
- Read a few other students' introduction issues and leave a comment to practice the commenting workflow from the Leaving a Comment section
- Notice how the issue number (e.g., #150) is auto-assigned and appears in the URL and page title; you will use this number for cross-references later
Day 2 Amplifier - Accessibility Agents:
@issue-trackerFile, read, comment on, and triage real issues manually before using any agent. If you have not done the triage work yourself - reading descriptions, assigning labels, identifying duplicates - you cannot evaluate whether an agent's priority scoring is correct. The skill must exist before the amplifier is useful.
Once you have mastered manual issue management:
- In VS Code -
@issue-tracker find open issues labeled good-first-issuesearches cross-repository with community sentiment scoring, release-awareness prioritization, and batch-reply capability across every repo you have access to- In your repo - The issue templates in
accessibility-agents/.github/ISSUE_TEMPLATE/structure both human filing and automated triage; fork accessibility-agents and that structure travels into any project you lead- In the cloud - GitHub Agentic Workflows triage new issues the moment they are opened: applying labels, posting first-response comments, adding to Project boards - the same triage actions you practiced manually today, running at scale
Today you are the triage engine. On Day 2, you understand the engine well enough to direct it.
Challenge Time: It's time for the real deal. Go to the Challenge Hub and complete Challenge 2: File Your First Issue and Challenge 3: Join the Conversation. When Gandalf the bot replies to you, it will tell you when it's time to move to Chapter 06: Working with Pull Requests.
Next: Chapter 06: Working with Pull Requests Back: Chapter 04: The Learning Room Related appendices: Appendix N: Advanced Search | Appendix V: GitHub Mobile
Authoritative Sources
Use these official references when you need the current source of truth for facts in this chapter.
Section-Level Source Map
Use this map to verify facts for each major section in this file.
- Filing, Managing, and Participating in GitHub Issues: GitHub Docs: About issues, GitHub Docs, home
- Challenge and workflow guidance: GitHub Docs, home, GitHub Changelog
- CLI issue workflow guidance: GitHub Docs, home, GitHub Changelog