Podcasts
Git Going with GitHub - Audio Series
Listen to the workshop as one end-to-end path. Companion lessons, Challenge Coach episodes, and reference material are interleaved so learners can hear the concept, practice it, and then keep moving through the course. Every episode includes a full transcript below the player.
Subscribe: Add the podcast RSS feed to your preferred podcast app - Apple Podcasts, Spotify, Overcast, or any RSS reader.
Transcripts: Every episode includes a complete, readable transcript. Expand the "Read Transcript" section below any episode to follow along or search the conversation.
How to Use These Episodes
- Follow the path: Listen in order when you want the full workshop experience.
- Practice in place: Challenge Coach episodes appear near the chapters that prepare you for that task.
- Use references when needed: Appendix and reference episodes are placed near the moments where they help most.
Browse by Category
Prefer to jump straight to a section? Use this index to find any companion episode by day or any Challenge Coach episode by number. Every row includes its own player. The full curated journey with transcripts is in the sections below.
Day 1 - GitHub on the Web (13 episodes)
- Welcome to Git Going with GitHub - Course Guide
- Episode 1: Pre-Workshop Setup - Chapter 0: Pre-Workshop Setup
- Episode 2: Understanding GitHub on the Web - Chapter 2: Understanding GitHub on the Web
- Episode 3: Navigating Repositories - Chapter 3: Navigating Repositories
- Episode 4: The Learning Room - Chapter 4: The Learning Room
- Episode 5: Working with Issues - Chapter 5: Working with Issues
- Episode 6: Working with Pull Requests - Chapter 6: Working with Pull Requests
- Episode 7: Merge Conflicts Are Not Scary - Chapter 7: Merge Conflicts Are Not Scary
- Episode 8: Open Source Culture and Etiquette - Chapter 8: Open Source Culture and Etiquette
- Episode 9: Labels, Milestones, and Projects - Chapter 9: Labels, Milestones, and Projects
- Episode 10: Notifications and Mentions - Chapter 10: Notifications and Mentions
- Episode 37: Contributing to Open Source - Chapter 8: Contributing to Open Source
- Episode 44: Choose Your Tools - Chapter 1: Choose Your Tools
Day 2 - VS Code, Git, and Agents (13 episodes)
- Episode 11: VS Code Setup and Accessibility - Chapter 11: VS Code Setup and Accessibility
- Episode 12: Git and Source Control in VS Code - Chapter 14: Git and Source Control in VS Code
- Episode 13: The GitHub Pull Requests Extension - Chapter 15: The GitHub Pull Requests Extension
- Episode 14: GitHub Copilot - Chapter 16: GitHub Copilot
- Episode 15: Accessible Code Review - Chapter 15: Accessible Code Review
- Episode 16: Issue Templates - Chapter 17: Issue Templates
- Episode 17: Accessibility Agents - Chapter 19: Accessibility Agents
- Episode 45: VS Code Accessibility Deep Dive - Chapter 12: VS Code Accessibility Deep Dive
- Episode 46: How Git Works: The Mental Model - Chapter 13: How Git Works: The Mental Model
- Episode 47: Fork and Contribute - Chapter 18: Fork and Contribute
- Episode 48: Build Your Agent: Capstone - Chapter 20: Build Your Agent: Capstone
- Episode 49: GitHub Accessibility and Open Source at Scale - Chapter 21: GitHub Accessibility and Open Source at Scale
- Episode 79: What Comes Next - Chapter 22: What Comes Next
Reference and Appendix (32 episodes)
- Episode 18: Glossary of Terms - Appendix A: Glossary of Terms
- Episode 19: Screen Reader Cheat Sheet - Appendix B: Screen Reader Cheat Sheet
- Episode 20: Accessibility Standards Reference - Appendix M: Accessibility Standards Reference
- Episode 21: Git Authentication - Appendix D: Git Authentication
- Episode 22: GitHub Flavored Markdown - Appendix C: GitHub Flavored Markdown
- Episode 23: GitHub Gists - Appendix U: GitHub Gists
- Episode 24: GitHub Discussions - Appendix U: GitHub Discussions
- Episode 25: Releases, Tags, and Insights - Appendix S: Releases, Tags, and Insights
- Episode 26: GitHub Projects Deep Dive - Appendix R: GitHub Projects Deep Dive
- Episode 27: Advanced Search - Appendix N: Advanced Search
- Episode 28: Branch Protection and Rulesets - Appendix O: Branch Protection and Rulesets
- Episode 29: GitHub Security Features - Appendix P: GitHub Security Features
- Episode 30: VS Code Accessibility Reference - Appendix G: VS Code Accessibility Reference
- Episode 31: GitHub Codespaces - Appendix J: GitHub Codespaces
- Episode 32: GitHub Mobile - Appendix V: GitHub Mobile
- Episode 33: Publishing with GitHub Pages - Appendix W: Publishing with GitHub Pages
- Episode 34: GitHub Actions and Workflows - Appendix Q: GitHub Actions and Workflows
- Episode 35: Profile, Sponsors, and Wikis - Appendix T: Profile, Sponsors, and Wikis
- Episode 36: Organizations and Templates - Appendix T: Organizations and Templates
- Episode 38: Resources and Links - Appendix X: Resources and Links
- Episode 39: Accessibility Agents - Complete Reference - Appendix L: Accessibility Agents - Complete Reference
- Episode 40: GitHub Copilot - Complete Reference - Appendix K: GitHub Copilot - Complete Reference
- Episode 41: Copilot Billing and Models - Appendix K: Copilot Billing and Models
- Episode 42: Accessing Workshop Materials - Appendix Y: Accessing Workshop Materials
- Episode 43: GitHub Skills - Complete Course Catalog - Appendix Z: GitHub Skills - Complete Course Catalog
- Episode 50: Advanced Git Operations - Appendix E: Advanced Git Operations
- Episode 51: Git Security for Contributors - Appendix F: Git Security for Contributors
- Episode 52: GitHub Desktop - Appendix H: GitHub Desktop
- Episode 53: GitHub CLI Reference - Appendix I: GitHub CLI Reference
- Episode 54: Agent Installation and Setup - Appendix : Agent Installation and Setup
- Episode 55: Advanced Agent Patterns - Appendix : Advanced Agent Patterns
- Episode 56: Document Developer Tools - Appendix : Document Developer Tools
Challenge Coach (21 challenges)
- Challenge 01: Find Your Way Around - Day 1 foundation
- Challenge 02: File Your First Issue - Day 1 foundation
- Challenge 03: Join the Conversation - Day 1 foundation
- Challenge 04: Branch Out - Day 1 contribution
- Challenge 05: Make Your Mark - Day 1 contribution
- Challenge 06: Open Your First Pull Request - Day 1 contribution
- Challenge 07: Survive a Merge Conflict - Day 1 stretch
- Challenge 08: The Culture Layer - Day 1 stretch
- Challenge 09: Merge Day - Day 1 stretch
- Challenge 10: Go Local - Day 2 local workflow
- Challenge 11: Open a Day 2 PR - Day 2 local workflow
- Challenge 12: Review Like a Pro - Day 2 local workflow
- Challenge 13: AI as Your Copilot - Day 2 local workflow
- Challenge 14: Template Remix - Day 2 capstone
- Challenge 15: Meet the Agents - Day 2 capstone
- Challenge 16: Capstone Project - Day 2 capstone
- Bonus: Improve an Agent - Bonus
- Bonus: Document Your Journey - Bonus
- Bonus: Group Challenge - Bonus
- Bonus: Notifications - Bonus
- Bonus: Git History - Bonus
Curated Listening Journey
Follow the workshop end-to-end in this order. Companion lessons and Challenge Coach episodes are interleaved so you hear the concept, practice it, then keep moving. Every entry below includes a full transcript - expand "Read Transcript" to follow along.
Start Here
1. Episode 0: Welcome to Git Going with GitHub
A tour of the workshop structure, the two-day arc, and what you will accomplish.
Based on: Course Guide
Read Transcript - Episode 0: Welcome to Git Going with GitHub
Transcript
Alex: Welcome to Git Going with GitHub. This episode is the front porch for the workshop: what you are building, where the pieces live, and why the path is designed the way it is.
Jamie: I like that phrase, front porch. Because if someone is brand new to GitHub, open source, VS Code, or the command line, the first question is probably, am I already supposed to know all of this?
Alex: No. Open source means people collaborate on projects where the work is visible, reviewable, and shared under rules that allow others to use or improve it. In this workshop, that collaboration is not pretend. You will practice the same GitHub workflow that real projects use.
Jamie: So open source is not just code sitting somewhere public. It is people proposing changes, discussing them, reviewing them, and deciding what should become part of the project.
Alex: Exactly. And accessibility work belongs in that conversation because small improvements can remove real barriers. The workshop gives you a supported place to learn the mechanics before you carry those skills into larger community projects.
Jamie: The materials also say this course is actively maintained. That feels important, because GitHub pages and VS Code screens do change.
Alex: They do. The course guide is your table of contents, and the Learning Room is your personal workshop space. The materials are being refined for the May 2026 cohort, so you should expect updates before and during the course.
Jamie: What happens if a button name or page order does not match what the chapter says?
Alex: Do not treat that as failure. Check the URL, the browser tab title, the page heading, landmarks, tab names, button labels, keyboard help, and in VS Code, the Command Palette. Then ask a facilitator or report the mismatch with the page link, the step that differed, and what your screen reader announced or what you observed.
Alex: The workshop has a two-day shape. Day 1 is GitHub foundations in the browser: navigating repositories, using issues, making branches and commits, opening a pull request, reviewing, and merging.
Jamie: Can we preview those words quickly? Because repository, issue, pull request, and merge can sound like a wall of vocabulary.
Alex: A repository is the project space. It holds files, history, issues, and pull requests. An issue is a tracked conversation about work to do, a bug, a question, or an improvement. A pull request, often shortened to PR, is a proposed change that other people can review before it becomes part of the project.
Jamie: And merge is the moment the approved change is brought into the main project history.
Alex: Right. A branch is a safe working line for your change, and a commit is a saved snapshot with a message. In Day 1, those contributions happen in your own provisioned Learning Room repository, so you can practice issue, branch, commit, pull request, and merge without risking a public project.
Jamie: Then Day 2 moves out of the browser-only world.
Alex: Yes. Day 2 is VS Code, Git, GitHub Copilot, and the Accessibility Agents ecosystem. Some workshop materials may describe a snapshot, for example 55 accessibility agents organized across 3 teams. The safest way to remember it is that Accessibility Agents is a living catalog: agents can be added, revised, or reorganized as the course grows.
Jamie: And the course is not saying, let the agents do magic before you know what is happening.
Alex: Right. You learn the manual workflow first, then you see how automation can support it. There is also a bridge between the two days: on many GitHub repository pages, pressing the period key opens github.dev, which gives you a VS Code-style editor in the browser. It is useful, but it has limits: no local terminal or debugger, web-compatible extensions only, and not the full desktop agent workflow.
Jamie: Before someone gets to all that, what should they do first?
Alex: Start with the pre-workshop setup. It helps you create or verify your GitHub account, choose a browser, install Git, install VS Code for Day 2, and configure your screen reader for GitHub. Plan about 30 minutes, and if setup is not finished before the workshop, tell a facilitator early.
Jamie: Then comes the GitHub Classroom assignment link, right?
Alex: Yes. The facilitator gives you a link that usually starts with https://classroom.github.com/a/. Open it in the browser where you are signed in to GitHub, authorize GitHub Classroom if asked, choose your name from the roster if prompted, accept the assignment, wait for the repository to be created, refresh until the repository link appears, and bookmark it.
Jamie: That repository name usually looks like learning-room-your-username.
Alex: Exactly. It is private to you unless the facilitator intentionally pairs you with someone. Everyone starts from the same template, but your issues, branches, commits, pull requests, mistakes, fixes, and bot feedback belong to your learning process.
Jamie: Once the Learning Room exists, how does a learner know what to do first?
Alex: The Student Progression Bot creates Challenge 1: Find Your Way Around. Open your Learning Room, go to the Issues tab, or use GitHub's keyboard shortcut G then I, find that challenge issue, and read it from top to bottom before activating controls.
Jamie: The issue itself tells you what to do and what evidence to post.
Alex: Yes. Evidence might be a comment, a field, or another requested trace of the work. When the instructions tell you to close the challenge issue, closing it triggers the next challenge. You are not expected to search the whole curriculum to guess the next task.
Jamie: There are a lot of tools named in the guide: browser, github.dev, VS Code, GitHub Desktop, GitHub CLI. How should someone choose without feeling behind?
Alex: Use the tool that fits the moment. The browser is best for Day 1, issues, repository navigation, pull requests, and reviews. github.dev is helpful when you want a VS Code-like editor without installing anything. VS Code desktop is best for Day 2 work with local Git, Copilot, extensions, and deeper editing.
Jamie: And GitHub Desktop or the command line are options, not secret requirements.
Alex: Exactly. GitHub Desktop gives you a visual desktop Git workflow. GitHub CLI is useful if you like terminal workflows or want automation later. If the command line is new to you, you still belong here; the course keeps returning to the contribution workflow itself: issue, branch, change, commit, pull request, review, and merge.
Alex: When you feel lost with a screen reader, listen for structure before you act. Useful signals include the page title, repository name heading, landmarks like main content or repository navigation, tab names such as Code, Issues, and Pull requests, issue or pull request titles, branch names, button names, field labels, bot comments, and check results.
Jamie: So the move is not to press keys faster. It is to pause, find where you are, and then decide.
Alex: Yes. And the course has built-in support. Every challenge has instructions and evidence prompts, chapters include stuck points, reference solutions are available after you try, Gandalf posts educational feedback on pull requests, and facilitators and peers are part of the learning system. If you are still stuck, open a support issue and include what you tried, what happened, what you expected, plus your screen reader and operating system.
Jamie: How do the chapters, appendices, podcasts, and exercises fit together?
Alex: The live agenda is intentionally smaller than the full curriculum. Live sessions focus on the core contribution path, while the full chapter set is there for preparation, catch-up, remote participation, and follow-up. Day 1 runs from setup and tool choice through GitHub navigation, the Learning Room, issues, pull requests, merge conflicts, open source culture, labels, notifications, and the Day 1 close.
Jamie: And Day 2 maps those browser skills into VS Code and a more complete contribution process.
Alex: Right. Day 2 covers VS Code setup, accessibility features, how Git works, Git in practice, code review, Copilot, issue templates, fork-based contribution, Accessibility Agents, the Capstone Project, and what comes next. Challenge 15 is browse-first discovery of Accessibility Agents, not a requirement to fork that repository. Completing Challenge 15 opens Challenge 16, titled Capstone Project, plus Bonus Challenges A through E; the capstone can be a contribution to Accessibility Agents, GLOW, or another meaningful repository, and review-ready drafts or contribution plans can be valid evidence.
Jamie: The appendices sound like the place to go when you need a quick answer rather than a full lesson.
Alex: Yes. Keep the glossary and screen reader cheat sheet handy. Other reference material covers core workshop help, deeper Git topics, VS Code and Copilot, GitHub platform features, community practice, troubleshooting, quick reference, and resources for continued learning. The course also points to official GitHub docs and the changelog when you need the current source of truth.
Jamie: And the exercises have a pattern: Try It, You are done when, and What success feels like.
Alex: That pattern matters because it makes practice checkable. Try It gives you the action, You are done when tells you the finish line, and What success feels like helps you recognize the result, especially when you are navigating by sound, keyboard focus, and page structure.
Jamie: What is the first success check for someone who just accepted the assignment?
Alex: You are ready to continue when you can say four things: I can open my Learning Room repository, I can find the Issues tab, I can open Challenge 1, and I know where to post evidence and how to ask for help.
Jamie: That is refreshingly small. Not, I understand all of Git. Not, I can solve every merge conflict.
Alex: Exactly. If you want the gentlest path, go from pre-workshop setup to choosing your tools, understanding GitHub, navigating repositories, learning the Learning Room, and then your Challenge 1 issue. You belong here, and the course will keep making the next step explicit.
2. Episode 18: Glossary of Terms
Comprehensive glossary: Git, GitHub, open source, and accessibility terminology.
Based on: Appendix A: Glossary of Terms
Read Transcript - Episode 18: Glossary of Terms
Transcript
Alex: Welcome back. This episode is a companion to the glossary, so the goal is simple: make GitHub words feel less mysterious when you hear them in a workshop, an issue, or a pull request.
Jamie: I love a glossary episode because half the stress of open source is hearing a familiar word used in a very specific way. Like, I know what a branch is in a tree. Git has other plans.
Alex: Exactly. The glossary is there for quick lookup across the whole workshop. Terms are grouped by topic, and there is also an alphabetical quick reference near the end when you already know the word you need.
Jamie: And the navigation tips matter. If you use a screen reader, headings are your friend here. Jump by headings, open the elements list, and type a few letters of the term.
Alex: If you use magnification, the term headings and the alphabetical table are useful because each row stands on its own. And anyone can use Control-F in the browser to search directly for a word like remote, stash, or ARIA.
Jamie: Let's also say pronunciations as we go, because some of these terms are awkward when you only read them.
Alex: Yes. Git is pronounced with a hard G, like get with an i sound. Repo is REE-poh, short for repository. Org is just org, short for organization. And PR is usually spoken as the letters P R, meaning pull request.
Jamie: Good. My shoulders just dropped a little.
Alex: A repository, often shortened to repo, is the project container. It holds the files, folders, documentation, and the full history of changes.
Jamie: So it is more than a folder. It is a folder with memory.
Alex: Right. A repository on GitHub has an address like github.com, then the owner name, then the repo name. If the owner is a group account, that group is called an organization, or org.
Jamie: So in microsoft slash vscode, microsoft is the organization and vscode is the repository.
Alex: Exactly. A fork is your personal copy of someone else's repository on GitHub. You use a fork when you do not have permission to write directly to the original project, but you still want to propose changes.
Jamie: And clone is different from fork, right? That pair always trips people up.
Alex: Fork means a copy under your GitHub account. Clone means a copy on your computer, where you can work in VS Code or another editor. A common workflow is fork the project on GitHub, then clone your fork to your computer.
Jamie: Where do remotes fit into that?
Alex: A remote is a named connection from your local Git repository to a repository hosted somewhere else, usually GitHub. The remote named origin usually points to the repo you cloned from. If you cloned your fork, origin points to your fork.
Jamie: And upstream is the original project you forked from.
Alex: Yes. You can see remotes with `git remote -v`. You can add the original project as upstream with a command like `git remote add upstream https://github.com/original-owner/repo.git`.
Jamie: So local means on my computer, remote means hosted elsewhere, origin is usually my GitHub copy, and upstream is the original project.
Alex: That is the usual setup. You may also hear downstream, which means something based on another project. A fork is downstream from the original because it receives changes from that original source.
Jamie: Before we leave the project container words, what is dot gitignore?
Alex: `.gitignore` is a special file that tells Git not to track certain files. You use it for temporary operating system files, build outputs like `dist/` or `build/`, dependency folders like `node_modules/`, editor folders like `.vscode/`, and secret files like `.env`.
Jamie: Important warning there: dot gitignore does not magically erase something that was already committed.
Alex: Correct. It only ignores untracked files. If a file is already tracked by Git, you remove it from tracking with `git rm --cached filename`, then add the pattern to `.gitignore`, then commit that change.
Alex: A branch is a separate line of development inside a repository. The main branch, usually called `main`, is often the stable version of the project.
Jamie: And sometimes older projects use `master`, so if I hear that, it is also a branch name, not a different tool.
Alex: Right. Common branch names include `main`, sometimes `develop`, and then names like `feature/add-search`, `fix/broken-button`, or `docs/update-readme`. The name should help people understand the purpose of the work.
Jamie: Then a commit is the saved checkpoint.
Alex: Yes. A commit records a snapshot of changes, a message, the author, a timestamp, and a unique identifier called a SHA hash. SHA is often pronounced shah, though spelling S H A is also common.
Jamie: Commit messages have a style too, don't they?
Alex: They do. A good message says what the change does, often in the imperative mood: `Fix typo in README`, not `Fixed typo` or `Fixing typo`. Longer commit messages can include a short title, a blank line, and then a body explaining why the change was made.
Jamie: And a diff is how we inspect the change.
Alex: A diff, short for difference, shows what changed between two versions. Added lines are usually shown with a plus sign, removed lines with a minus sign, and unchanged lines appear as context.
Jamie: That is what I am reading on the Files Changed tab of a pull request.
Alex: Exactly. Push, pull, and fetch are the movement words. Push sends your local commits up to a remote. Fetch downloads remote changes so you can inspect them. Pull fetches changes and then integrates them into your current branch.
Jamie: So fetch is the cautious look, and pull is the update that changes my branch.
Alex: An issue is a discussion item in a GitHub repository. People use issues to report bugs, request features, ask questions, discuss ideas, and track work.
Jamie: Issues also have numbers, like number 42, and they can have labels, assignees, milestones, and comments.
Alex: Yes. A pull request, or PR, is a proposal to merge changes from one branch into another. It includes the branch information, the diff, a description of what changed and why, and a place for discussion.
Jamie: The name still sounds a little odd. It means I am asking maintainers to pull my changes into their project.
Alex: That is exactly it. Review is the feedback process on a PR. A reviewer can leave a comment, approve the change, or request changes before it can be merged.
Jamie: And good review is not just thumbs up or thumbs down. It should be kind, specific, and useful.
Alex: Yes. You may also see a draft PR. Draft means the work is visible, but the author is signaling that it is not ready for final review yet.
Jamie: That is useful in learning settings too. A review-ready draft or a clear contribution plan can be real evidence that someone understands the workflow, even before a maintainer merges anything.
Alex: Merging is combining changes from one branch into another. GitHub projects may use a merge commit, squash and merge, or rebase and merge, depending on how they want the history to look.
Jamie: And then there is the famous merge conflict.
Alex: A merge conflict happens when two branches changed the same part of the same file in incompatible ways. Git pauses because it cannot decide which version should win.
Jamie: Those conflict markers are the lines with less-than signs, equals signs, and greater-than signs.
Alex: Yes. You resolve the file by choosing the final content, removing the markers, saving the file, and committing the resolution. It feels intimidating the first time, but it is a normal collaboration moment.
Jamie: Let's talk about the people words, because GitHub is not just commands.
Alex: A maintainer is someone with responsibility for a repository, often with write or admin access. A contributor is anyone who helps, whether through code, docs, issues, design, testing, accessibility feedback, or review.
Jamie: And a collaborator?
Alex: A collaborator is someone who has been granted access to work directly in a repository, usually more access than a typical outside contributor. Triage is the work of reviewing new issues, adding labels, asking clarifying questions, and routing work to the right place.
Jamie: Labels are those colored tags, like bug, documentation, good first issue, or accessibility.
Alex: Right. A milestone groups issues and pull requests around a goal, such as a release or a workshop deadline. GitHub Projects can organize work in boards, tables, and views so a team can track progress.
Jamie: Community files are part of that collaboration picture too.
Alex: They are. A README explains what the project is. A LICENSE tells people what they are allowed to do with the code. CONTRIBUTING explains how to help. A code of conduct sets expectations for behavior.
Jamie: And templates can guide issues and pull requests so people do not start from a blank box.
Alex: Exactly. You may also see SECURITY for reporting vulnerabilities, SUPPORT for help channels, GitHub Discussions for broader community conversations, a wiki for multi-page documentation, and Gists for small shareable snippets.
Jamie: What about the quick slang pile?
Alex: A few common ones: LGTM means looks good to me. WIP means work in progress. CI means continuous integration, where automated checks run on changes. CD can mean continuous delivery or continuous deployment, depending on the project.
Alex: Now for the Git terms that sound scarier than they usually are. HEAD, in all caps, is Git's pointer to your current branch or commit.
Jamie: Detached HEAD is the one that makes people wonder if they broke everything.
Alex: A detached HEAD means you are looking at a specific commit instead of working on a branch. It can happen when you check out an old commit, a tag, or a commit hash directly.
Jamie: What does that mean for my work?
Alex: You can look around safely, but new commits made there may be hard to find unless you create a branch. The fix is usually to create a branch at that point with `git switch -c branch-name`, or switch back to an existing branch if you were only inspecting history.
Jamie: Stash is another useful safety word.
Alex: Stash temporarily saves uncommitted changes so you can switch tasks or update your branch without committing unfinished work. A common flow is `git stash`, do the other task, then `git stash pop` to bring the changes back.
Jamie: And if I want to see what I stashed?
Alex: Use `git stash list`. You can use `git stash apply` to reapply without removing the stash, or `git stash drop` when you are sure you no longer need it.
Jamie: Rebase is where people get nervous.
Alex: Rebase replays your commits on top of another branch. Merge preserves the branch history and creates a merge point. Rebase can make history more linear, but it rewrites commit history.
Jamie: So when is rebase reasonable?
Alex: It is usually reasonable on your own local branch before you share it, or when your team explicitly uses that workflow. Do not rebase shared branches casually, because rewriting history can disrupt other people's work.
Jamie: And cherry-pick?
Alex: Cherry-pick copies one specific commit from one branch onto another. It is useful when you need one fix without bringing over every other change from that branch.
Jamie: Force push sounds like the red button.
Alex: It deserves caution. Force push overwrites the remote branch with your local history. It may be needed after a rebase on your own branch, but it is not okay on shared branches unless the team has agreed.
Jamie: There is a safer version, right?
Alex: Use `--force-with-lease` instead of plain force push when you can. It checks whether someone else updated the remote branch before overwriting it, which helps prevent accidental damage.
Alex: A SHA or hash is the unique identifier for a commit or Git object. You will often see a short version, like seven characters, in GitHub links and commit lists.
Jamie: A tag is a name attached to a specific commit, often for a version.
Alex: Yes. A release builds on a tag and adds release notes, downloadable files, or other packaged information for users.
Jamie: Then GitHub Actions is the automation system.
Alex: Right. An Action runs workflows, and a workflow is an automated process defined in the repository. CI/CD workflows might run tests, check formatting, build documentation, or deploy a site.
Jamie: And status checks are the pass or fail results that show up on a pull request.
Alex: Exactly. A status check might say the tests passed, the build failed, or an accessibility check needs attention. Maintainers often require important checks to pass before merging.
Jamie: What is a webhook?
Alex: A webhook sends information to another service when something happens on GitHub, like a push, issue comment, or pull request event. It is a way to connect GitHub activity to other tools.
Jamie: And profile?
Alex: Your GitHub profile is your public identity on GitHub. It can show your repositories, contributions, bio, links, and sometimes a profile README.
Jamie: The glossary also needs the accessibility words we keep using in this series.
Alex: A screen reader is software that reads interface content aloud or sends it to a braille display. NVDA, JAWS, VoiceOver, and TalkBack are common examples.
Jamie: Landmarks and headings are navigation structure.
Alex: Yes. Headings organize content by level, like heading level 1 for the page title and heading level 2 for major areas. Landmarks identify regions such as main content, navigation, search, and footer.
Jamie: ARIA is pronounced AIR-ee-uh, right?
Alex: Right. ARIA stands for Accessible Rich Internet Applications. It can add accessibility information to custom interface elements, but native HTML should come first whenever it can do the job.
Jamie: Focus is the current place my keyboard or assistive technology is interacting with.
Alex: Exactly. Tab order is the path focus follows as you press Tab. A good tab order matches the visual and logical reading order, does not trap people, and makes every interactive control reachable.
Jamie: So when we review a page, we are not only asking whether it looks good. We are asking whether the structure and keyboard path make sense.
Alex: Yes, and whether names, roles, labels, error messages, and instructions are available to assistive technology. That is where careful issues and clear reproduction notes really help maintainers.
Alex: Finally, the agent vocabulary. GitHub Copilot is an AI coding assistant. Depending on the environment, it may suggest code, answer questions, help explain errors, or help draft changes.
Jamie: And an agent is a little more active than a simple suggestion box.
Alex: Yes. An agent can follow instructions, use tools, inspect files, and carry out a task within limits. You still review the output, test it, and decide what belongs in the project.
Jamie: Slash commands are the short commands that start with a slash, like a shortcut in a chat or coding assistant.
Alex: Right. A prompt is the request you give the tool. An instruction file is a project-level guide that tells the assistant how to behave, such as coding style, testing expectations, accessibility requirements, or documentation tone.
Jamie: This connects to the later accessibility agent work too.
Alex: It does. The Accessibility Agents collection is a living catalog, so it grows over time. Challenge 15 is browse-first, and learners do not need to fork that repository just to complete the discovery challenge.
Jamie: Completing that discovery challenge unlocks the Capstone Project and the structured bonus path, right?
Alex: Yes. Challenge 16 is titled Capstone Project. It can involve a contribution to Accessibility Agents, GLOW, or another meaningful repository, and review-ready drafts or contribution plans can count as valid evidence of completion.
Jamie: And Day 1 contributions happen somewhere else.
Alex: They happen in the Learning Room repository, which is provisioned for each learner. That is where the issue, branch, commit, pull request, and merge workflow is practiced end to end.
Jamie: Let's end with a quick pronunciation pass for the words people may only have read.
Alex: Git has a hard G. GitHub is Git-hub. Repo is REE-poh. Org is org. PR is P R. SHA can be shah or S H A.
Jamie: More please.
Alex: ARIA is AIR-ee-uh. CI/CD is C I slash C D. YAML is often YAM-ul. `.gitignore` is usually spoken as dot gitignore. `HEAD` is head, even though it is written in capital letters.
Jamie: And when a term gets fuzzy, do not try to memorize every definition at once.
Alex: Look it up, read the nearby related terms, and connect it to the workflow you are doing right now. If a fact might have changed, use the official GitHub documentation, release notes, and linked references as the current source of truth.
Jamie: That makes the glossary less like homework and more like a map you keep beside you.
Alex: Exactly. The win is not knowing every word before you start. It is being able to recover your place when a new term appears, then keep contributing with confidence.
3. Episode 1: Pre-Workshop Setup
Creating your GitHub account, installing Git and VS Code, configuring your screen reader.
Based on: Chapter 0: Pre-Workshop Setup
Read Transcript - Episode 1: Pre-Workshop Setup
Transcript
Alex: Welcome back. This episode is all about getting ready before Day 1, so the workshop can start with learning instead of setup problems. Please try to finish this at least one day before the event, and if you want the bigger map first, the Get Going with GitHub guide explains GitHub Classroom, your Learning Room repository, Challenge 1, evidence prompts, and tool choices.
Jamie: I like that this is pre-work, but not busy work. It's the stuff that keeps you from getting stuck when everyone else is opening issues, making commits, and trying their first pull request.
Alex: Exactly. You'll want a Windows or macOS computer, a reliable internet connection, and headphones if you're using screen reader audio during group sessions. Linux users can still follow the Git installation path, but the workshop hardware guidance focuses on Windows and macOS.
Jamie: And the software side is a modern browser, a screen reader, and a GitHub account, right? Chrome or Firefox are recommended for GitHub, Edge is fine on Windows, and Safari is usually the best match for VoiceOver on macOS.
Alex: Yes. Before the workshop, install Git, install Visual Studio Code, and make sure you can sign in to GitHub. VS Code version 1.113 or later is recommended for later Accessibility Agents work, Git should be at least version 2.20, and Copilot should be current because it updates through VS Code.
Jamie: There's also Node.js, but only for optional command-line accessibility tools later. So if someone hears node --version and thinks, I don't have that, it doesn't block Day 1.
Alex: Let's start with the GitHub account. If you already have one, you don't need a second account, but you do need to know your password, have access to the email address, and be able to sign in.
Jamie: Username choice feels small until you realize it appears on every issue, pull request, and comment. What should people use?
Alex: Pick something professional and easy to recognize. Lowercase letters, numbers, and hyphens are safest, and GitHub will tell you if the name is already taken. During signup, you'll enter an email address, create a password, choose the username, decide whether you want product update emails, and then complete human verification.
Jamie: That verification step can be the rough spot. GitHub may present a visual CAPTCHA, and that can be a real barrier for screen reader users.
Alex: Yes. Look for an audio option such as Audio or Try an audio challenge. If the available challenge isn't accessible, contact the workshop organizer before the event so someone can help with account verification. After that, GitHub sends a short launch code to your email, and later you should also activate the separate email verification link.
Jamie: And that email verification is not the same thing as optional notification emails.
Alex: Right. Account verification is required for features like creating repositories. Notification emails are about activity, and the workshop does not require you to receive those by email because GitHub also has a web notification inbox.
Jamie: Now, two-factor authentication. People hear 2FA and sometimes think, oh no, another login hurdle.
Alex: It is one more step, but it's an important protection. Two-factor authentication means your password alone is not enough to sign in; you also confirm with a second method, such as an authenticator app, passkey, security key, or another approved option. GitHub requires 2FA for accounts, so make sure it is enabled and tested before the workshop.
Jamie: The part I always worry about is recovery. What if someone changes phones or loses access to the app?
Alex: Save your recovery codes somewhere secure, and add a backup method if GitHub offers one that works for you. Do not wait until the morning of the workshop to find out your 2FA method is unavailable. If you get locked out or you're unsure, use the support hub before the event.
Jamie: How does this connect to Git on your computer? Is that another password prompt?
Alex: Often VS Code or Git will open a browser-based GitHub sign-in, also called OAuth, where you approve access in the browser instead of typing a password into the terminal. More advanced options like SSH keys and personal access tokens are covered separately, but browser sign-in is the friendliest starting point.
Jamie: Once the account exists, I would want GitHub itself to feel less noisy. What settings help with that?
Alex: Open your GitHub account menu, go to Settings, and find Accessibility. The exact labels can move as GitHub changes, so use headings, landmarks, search, or your browser's find command if the page looks different from the guide.
Jamie: The big one is hovercards, right?
Alex: Yes, disable hovercards first. Hovercards are pop-up previews that appear when the pointer or focus lands on certain names or links, and they can interrupt navigation. Then enable link underlines so links are easier to identify without relying on color alone.
Jamie: What about character key shortcuts?
Alex: Those are single-letter shortcuts on GitHub pages. They can be useful, but they can also conflict with screen reader browsing keys, so set them in the way that works best with your assistive technology. While you're in settings, choose a theme that gives you comfortable contrast, such as light, dark, or a high contrast option if available.
Jamie: The profile step is partly social, but it also sounds practical.
Alex: It is. Maintainers are the people who review issues, review pull requests, and help decide what gets merged into a project. A clear profile, a short bio, and a profile picture if you're comfortable adding one can help maintainers recognize you as a real contributor; you can also set the notification email you want GitHub to use, or keep email notifications off and rely on the web inbox.
Jamie: Then there are feature previews, which always make me nervous because every account seems a little different.
Alex: That's normal. Feature previews are switches for GitHub experiences that may still be rolling out, such as new interface features, search experiences, or Copilot-related surfaces. With NVDA or JAWS on Windows, navigate the settings page by headings, buttons, and search fields; if a preview is not listed, it may already be generally available, unavailable for your account, or controlled by an organization policy.
Jamie: So not listed does not automatically mean you did something wrong.
Alex: Exactly. If the workshop asks for a specific preview and you cannot find it, write down the page, the account you're using, and what your screen reader announces, then ask for help.
Jamie: Let's talk about screen readers and browsers, because this is where a small setting can change the whole experience.
Alex: You only need one screen reader. On Windows, NVDA is free and widely used, and JAWS is a paid option with a trial. On macOS, VoiceOver is built in and can be started with Command+F5.
Jamie: For NVDA, what should be ready before GitHub work starts?
Alex: Make sure web browsing feels predictable in your chosen browser. Practice moving by headings, links, buttons, edit fields, and landmarks, and choose a voice rate you can understand during instructions. If you use focus highlighting or speech viewer for support, set those up before the workshop begins.
Jamie: And JAWS is similar, but with its own names for things.
Alex: Right. Make sure the virtual cursor is working in web pages, forms mode behaves as expected when you enter edit fields, and verbosity is set to a level that gives you enough detail without overwhelming you. GitHub pages contain a lot of controls, so comfort with headings and forms is very helpful.
Jamie: For Mac users, Quick Nav matters.
Alex: Yes. With VoiceOver, Safari is the recommended browser, and Quick Nav can make web navigation faster when it fits your workflow. Also remember that many Mac shortcuts use Command where Windows instructions use Control, and VoiceOver commands use the VoiceOver modifier, often Control+Option or Caps Lock depending on your setup.
Jamie: So the browser recommendation is not about brand loyalty. It's about which combination works best with GitHub and the screen reader someone already uses.
Alex: Exactly. Chrome and Firefox are strong choices on Windows, Edge is acceptable, and Safari is the usual VoiceOver pairing on macOS.
Jamie: Before we install anything, can we separate Git from GitHub? The names are almost identical, and that trips people up.
Alex: Git is the version control system on your computer. It tracks changes to files over time, lets you create commits, and supports branching so you can work without overwriting the main project. GitHub is the website where repositories, issues, pull requests, reviews, and collaboration happen.
Jamie: So Git is the tool that records the history, and GitHub is the place where people collaborate around that history.
Alex: Yes. On Windows, download Git from git-scm.com, run the installer, and the defaults are usually fine for this workshop. After installation, open PowerShell, Command Prompt, Git Bash, or Windows Terminal and run git --version.
Jamie: What about macOS and Linux?
Alex: On macOS, you can install Apple's Xcode Command Line Tools, often by running xcode-select --install, or use a package manager if you already have one. On Linux, use your distribution's package manager, such as apt, dnf, or pacman, then verify with git --version. If you're using a screen reader in the terminal, copy the output or review the current line if speech doesn't announce it clearly.
Jamie: And then VS Code is the recommended editor.
Alex: Right. Visual Studio Code is a free code editor with strong Git integration, a built-in terminal, accessibility support, and Copilot integration. Download it from the official VS Code site, install it, and open it once so it can finish its first-run setup.
Jamie: How do we turn on screen reader mode in VS Code?
Alex: Use the keyboard shortcut listed in the setup guide if it works for your system, or open the Command Palette with Control+Shift+P on Windows and Linux, or Command+Shift+P on macOS. Search for Toggle Screen Reader Accessibility Mode and run that command. VS Code should announce or show that screen reader mode is enabled.
Jamie: What changes when that mode is on?
Alex: VS Code exposes editor content and controls in ways that work better with assistive technology. It can improve how the editor, suggestions, notifications, and navigation are announced. We'll practice the everyday shortcuts during the workshop, including the Command Palette, opening files, using the terminal, and moving through source control.
Jamie: Git identity is one of those setup steps that sounds optional until your commits show up with the wrong name.
Alex: Exactly. Git stores a name and email address with each commit you create. In VS Code's terminal, you can set them globally with git config --global user.name followed by your name, and git config --global user.email followed by the email you want attached to commits.
Jamie: What should people use for the name?
Alex: Use the name you want maintainers and classmates to see in commit history. For email, use an address connected to your GitHub account, or use GitHub's private no-reply email if you don't want your personal address exposed. The important thing is that GitHub can match your commits to your account.
Jamie: And the check is simple?
Alex: Yes. Run git config --global --list and confirm that user.name and user.email are present and correct. If you mistype one, run the command again with the corrected value.
Jamie: This is also where the privacy decision shows up. A commit email is not just a setting hidden on your machine; it can become part of public project history.
Alex: That's right. Taking a minute here prevents confusing commit attribution later.
Jamie: What about VS Code extensions and Copilot? Do learners need to go hunting for a pile of add-ons?
Alex: No pile needed. GitHub Copilot is included with modern VS Code builds, and Copilot Free is available to GitHub users. To activate it, sign in with GitHub from VS Code when prompted and confirm that Copilot Chat or Copilot features are available.
Jamie: The other extension is GitHub Pull Requests, yes?
Alex: Yes. Open the Extensions view in VS Code, search for GitHub Pull Requests, install the GitHub Pull Requests extension, and sign in if prompted. You can verify it is working by checking that the GitHub Pull Requests view appears and can connect to your GitHub account.
Jamie: If someone's computer is locked down, is github.dev a fallback?
Alex: It can be. github.dev is a browser-based editor that looks and feels like VS Code and opens from a repository in the browser, often by pressing the period key on a GitHub repository page. It is useful for lightweight edits, but local VS Code plus Git is still the recommended setup for the full workshop.
Jamie: And there are other GitHub access methods, but they're not the main path here.
Alex: Right. GitHub Desktop and the gh command-line tool are useful references, and gh copilot exists for command-line help in some setups, but they are not required for this workshop. The core path is GitHub in the browser, Git on your machine, and VS Code as the editor.
Jamie: Before someone closes the laptop and says done, what should they verify?
Alex: Confirm you can sign in to GitHub, your email is verified, and 2FA works. Confirm your accessibility settings are adjusted, your profile is reasonable, your screen reader and browser combination is comfortable, Git responds to git --version, VS Code opens, screen reader mode is enabled, and your Git name and email are configured.
Jamie: And check versions if you're planning to use later advanced features.
Alex: Yes. Run code --version for VS Code, git --version for Git, and node --version only if you installed Node.js for optional command-line tools. The written guide's learning cards and tool cards are good quick checks if you want a compact review.
Jamie: What happens when Day 1 begins?
Alex: You'll work in your own Learning Room repository, which is provisioned for you. That's where the first contribution workflow happens: issue, branch, commit, pull request, and merge. The setup you did here supports that whole path.
Jamie: And if something fails before the event, don't silently struggle.
Alex: Use the Community Access support repository. You can open a support issue, join the support discussions, or ask in GitHub's accessibility community discussions. Include the exact page, command, prompt, or error message where you got stuck.
Jamie: And when tools change, because they will, use official sources rather than old screenshots.
Alex: Yes. The current GitHub documentation, GitHub's change log, the Git project documentation, and VS Code documentation are the best places to confirm details. The goal is simple: arrive on Day 1 signed in, accessible, and ready to contribute.
4. Episode 44: Choose Your Tools
A guided tour of browser GitHub, github.dev, VS Code, GitHub Desktop, and the CLI.
Based on: Chapter 1: Choose Your Tools
Read Transcript - Episode 44: Choose Your Tools
Transcript
Alex: Welcome back. Today we're doing something that can save a lot of frustration later: choosing the tool that fits the job, instead of assuming there is one correct way to use GitHub.
Jamie: I like that framing, because people can feel behind before they even start. One person is in a browser, someone else is in VS Code, someone else is using a terminal, and it can sound like they are all in different workshops.
Alex: They are using different doors into the same work. The workshop supports multiple tool paths because real teams do that too. A chapter might say, "open the file," and your job is to know whether that means the GitHub website, github.dev, VS Code, GitHub Desktop, or the GitHub CLI for you.
Jamie: So we are not choosing a tool forever. We are learning what each one is good at, what it cannot do, and how it feels with a screen reader or low vision setup.
Alex: There are five environments in this tour. GitHub.com is the website in your browser. github.dev is a browser-based editor that feels like VS Code. VS Code is the full desktop editor. GitHub Desktop is a graphical Git app. And GitHub CLI is a command-line tool called `gh`.
Jamie: Do learners need to install all of them?
Alex: No. Most people start with GitHub.com on Day 1, because it needs no installation and it is where issues, pull requests, repository pages, and reviews already live. Many learners add VS Code on Day 2 when they need a full workspace for editing, running commands, and working across files.
Jamie: And the other tools are not extra credit tools. They are alternate routes if they match the way you work.
Alex: Exactly. Later lessons use tool cards, which are expandable notes that show the same task in different tools. That way, you can follow the path that fits your access needs, your comfort level, and the task in front of you.
Jamie: Let's start with the browser, because that is the foundation for Day 1.
Alex: GitHub.com is the GitHub website. If you can sign in at github.com, you can browse repositories, open files, create and comment on issues, review pull requests, merge when you have permission, manage labels and project boards, and edit a single file with the built-in web editor.
Jamie: But it is not a full development environment.
Alex: Right. You cannot run code locally there, you do not get a full editor with desktop extensions, and you cannot work offline. It is excellent for collaboration and repository navigation, but limited for deeper coding work.
Jamie: How does it feel with a screen reader?
Alex: GitHub.com has strong screen reader support. Pages use landmarks, headings are generally consistent, and many actions have keyboard shortcuts. You can jump to main content or search with `S`, use `/` for search in many places, move by headings with `H`, and move by landmarks with `D` in browse mode. In a repository, `G` then `I` can take you to Issues.
Jamie: And for low vision users, the theme controls matter a lot.
Alex: They do. In appearance settings, you can choose light, dark, light high contrast, dark high contrast, or sync with your operating system. GitHub also responds well to browser zoom, and the layout usually adapts up to high zoom levels. The learning cards also remind people to enable link underlines in accessibility settings so links are not identified by color alone.
Jamie: github.dev feels like the bridge tool to me. It is still in the browser, but it is more editor-like.
Alex: That is a good way to put it. github.dev runs a VS Code-style editor in your browser, with a file explorer, tabs, diffs, staging, and commits. You can open it from a repository by pressing the period key, or by changing `github.com` to `github.dev` in the address bar.
Jamie: So if I am viewing a file on GitHub and I press period, I move into that editor experience?
Alex: Yes. It is especially useful when a change touches more than one file, or when you want a clearer editing workspace without installing anything. You can edit files, review the differences, and commit to a branch.
Jamie: What should people not expect from it?
Alex: It does not run your program, build your project, or execute normal terminal commands. Some browser-compatible VS Code extensions work, but anything that needs a local runtime may not. And like GitHub.com, it is not an offline tool.
Jamie: Any screen reader notes there?
Alex: Because github.dev is VS Code in the browser, the command palette is a central control point. Use `Ctrl+Shift+P` on Windows or Linux, and `Cmd+Shift+P` on macOS. Some screen readers may need focus mode or application mode in the editor area. If keys are not reaching the editor, press `Escape`, then try the command palette again.
Jamie: Then there is full VS Code on the desktop.
Alex: VS Code is the workshop's main full workspace for Day 2 and beyond. It does require installation, along with Git for local version control. Once set up, it gives you editing, extensions, an integrated terminal, Git tools, debugging, and GitHub Copilot features in one place.
Jamie: This is where you can actually run commands and test code on your own machine.
Alex: Exactly. You can stage, commit, push, and pull through the Source Control panel, or use the terminal if you prefer commands. You can run scripts, use language tools, install extensions, and keep working offline, then sync when you are back online.
Jamie: What does it not do by default?
Alex: Without extensions, VS Code does not give you the full GitHub issue and pull request workflow inside the editor. For that, you usually add the GitHub Pull Requests extension. You can still use Git from VS Code without it, but issues and pull request review may send you back to the website.
Jamie: And accessibility-wise, VS Code has its own learning curve.
Alex: It does, but it also has good keyboard support and screen reader features. The command palette is useful here too, because it lets you search for commands instead of hunting through menus. Low vision users can adjust themes, zoom, font size, and high contrast settings. The VS Code reference appendix is there for deeper setup help when learners are ready.
Jamie: Where does GitHub Desktop fit? I sometimes hear people assume it is only for beginners, but that seems unfair.
Alex: It is a real tool, and it can be a good fit. GitHub Desktop is a desktop Git client with a visual interface for cloning repositories, creating branches, seeing changed files, writing commits, pushing, pulling, and syncing with GitHub.
Jamie: So it helps with Git without requiring people to type Git commands.
Alex: Yes. That can reduce stress when the goal is to understand branches, commits, and sync status. It is also nice for reviewing a set of changed files before committing.
Jamie: But it is not a code editor, right?
Alex: Right. You usually pair it with an editor such as VS Code. It also does not run your project, and it is not the best choice for automation or scripted workflows. For issues, pull requests, settings, and deeper review, you may still move back to GitHub.com.
Jamie: How should screen reader users approach it?
Alex: Try it with your own screen reader before relying on it for a timed task. Some people like the clear commit workflow, while others find the browser or terminal more predictable. If it matches your access setup, it can be a comfortable middle ground.
Jamie: Now for the terminal people: the GitHub CLI.
Alex: The GitHub CLI is a command-line tool called `gh`. It lets you interact with GitHub from a terminal, so you can create issues, view pull requests, check repository information, authenticate, and automate repeated tasks.
Jamie: That sounds powerful, but also a little unforgiving.
Alex: It can be, which is why the learning path should start small. Install the tool, sign in with `gh auth login`, use `gh help`, and try one safe read-only command before changing anything. The goal is to build trust in what each command does.
Jamie: What can it not do for you?
Alex: It does not replace a code editor. You still need something to edit files, and you still need Git itself for many local repository operations. The CLI is strongest when you want speed, scripting, repeatable commands, or a terminal-first workflow.
Jamie: And for screen reader users, terminals can actually be appealing.
Alex: Yes, because command output can be linear and predictable. But precision matters. A missing flag or a wrong repository can change the result, so it helps to read command output carefully and use help text often. The CLI learning cards point learners toward small commands, authentication, and pull request workflows instead of trying to memorize everything.
Jamie: If someone is deciding where to start, what is the plain recommendation?
Alex: Start Day 1 in GitHub.com. The Learning Room repository is provisioned for each learner, and the early contribution workflow happens there: issue, branch, commit, pull request, and merge. The browser keeps everyone close to the collaboration pieces.
Jamie: Then Day 2 is when VS Code becomes more important.
Alex: Yes. When you need a full editing workspace, a terminal, extensions, Copilot, or local testing, VS Code is the recommended main path. github.dev is helpful when you want a quick editor without installation. GitHub Desktop is helpful when you want a visual Git workflow. The CLI is helpful when the terminal is comfortable or automation is part of the work.
Jamie: So switching tools is normal, not a sign that you chose wrong.
Alex: Absolutely. You might open an issue in the browser, edit three files in github.dev, test locally in VS Code, commit through GitHub Desktop, and check a pull request with the CLI. The best tool is the one that lets you understand the task, make the change, and verify what happened.
Jamie: I like ending with something small. What is the first confidence exercise?
Alex: Pick any repository you can safely explore, ideally your Learning Room repository once it is available. Find the README file, open it, and identify how you would make a small edit in each tool you are trying. You do not have to commit a real change in every tool. The exercise is about knowing where the file lives and how editing would begin.
Jamie: In GitHub.com, that means opening the README on the website and finding the edit control, usually the pencil icon when you have permission.
Alex: Yes. In github.dev, press period from the repository page or change the URL, then find the README in the explorer. In VS Code, open the cloned repository folder and find the README in the file explorer. If VS Code is not set up yet, skip that route for now.
Jamie: In GitHub Desktop, you would clone or open the repository, then use its option to open the files in your external editor.
Alex: And in the CLI, you might use `gh repo view` to confirm the repository, then use normal Git and your editor for file changes. Success looks simple: you can say which tool you used, where the repository was, where the README was, and what you would do before committing a change.
Jamie: And if someone gets stuck, what should they check before assuming they broke something?
Alex: Check the basics in order: which tool am I in, which repository am I looking at, which branch is active, which file is open, and have I actually saved the change? Then look for the matching appendix or official documentation for that tool. VS Code setup, GitHub Desktop, the GitHub CLI manual, and the GitHub Accessibility Lab CLI guide are all useful references.
Jamie: And when asking for help, include the tool and the exact point where things stopped making sense.
Alex: Yes. "I am in github.dev, on my Learning Room repository, trying to open the README, and the period key did not open the editor" is much easier to help with than "GitHub does not work." Clear context helps someone reproduce the problem or suggest a different path.
Jamie: That is a reassuring place to land. You do not have to become a browser expert, editor expert, desktop app expert, and terminal expert all at once. You just need enough orientation to choose the route that supports the work you are doing today.
5. Episode 2: Understanding GitHub on the Web
How GitHub organizes its web pages, heading structure, landmarks, and keyboard shortcuts.
Based on: Chapter 2: Understanding GitHub on the Web
Read Transcript - Episode 2: Understanding GitHub on the Web
Transcript
Alex: Welcome back. Today we're building the map you use before you click anything on GitHub. GitHub can feel like one giant website, but it makes more sense when you know what level you're on and what landmarks are always nearby.
Jamie: I like starting there, because the confusing moment is usually not, "What button do I press?" It's, "Where am I, and what kind of page is this?"
Alex: Exactly. GitHub has three nested levels. Level one is your own account area, like your profile, settings, and notifications. Level two is a user or organization space, such as github.com/github or github.com/community-access. Level three is a repository, and that is where issues, pull requests, code, actions, branches, and files live.
Jamie: So when a workshop says, "go to the repo," it usually means that third level. And for Challenge 01, Find Your Way Around, learners will practice that inside their own Learning Room repository, which is provisioned for each learner.
Alex: No matter which GitHub page you land on, there is a global navigation area near the top of the page. A screen reader will usually expose it as a landmark called "Navigation Menu." It includes the GitHub home link, search, links for pull requests and issues, notifications, and your account menu.
Jamie: And the keyboard path matters here. If your screen reader supports landmark navigation with D, you can move through landmarks until you hear "Navigation Menu," then use K to move through links inside it. Those are normal links, so Enter activates them from Browse Mode.
Alex: There is also a skip link on GitHub pages. When you start tabbing from the top of a freshly loaded page, you may hear something like "Skip to content." Activating it moves you past repeated navigation and into the main content area.
Jamie: That is especially helpful when the visual layout changes. At high zoom, or on a narrower screen, the same controls may collapse, wrap, or become icons. The labels, landmarks, tabs, URLs, and headings are the pieces to trust.
Alex: Inside a repository, you get a second navigation area. That one is usually labeled "Repository navigation," and it contains tabs like Code, Issues, Pull requests, Actions, Projects, Wiki, Security, Insights, and sometimes Settings. The active tab may have an underline visually, but the tab name and URL are the more reliable clues.
Jamie: Okay, let's say I followed a link and I have no idea where I landed. What are the fastest checks?
Alex: Use three signals: the URL, the browser tab title, and the first H1 heading. The URL is often the clearest. github.com by itself is your personal feed or dashboard. github.com slash username is a profile. github.com slash owner slash repo is a repository home page.
Jamie: And the extra pieces after that tell me the view. Slash issues is the issue list. Slash issues slash 42 is a specific issue. Slash pull slash 7 is a specific pull request. Slash settings slash accessibility is an account settings page.
Alex: Right. The browser tab title also follows patterns. A repository home page usually includes owner slash repo and a description. An issue page includes the issue title, issue number, and repo. A pull request page includes the PR title, PR number, and repo.
Jamie: Then the H1 confirms it from inside the page. Press 1 in Browse Mode to jump to the first H1. If you hear owner slash repo name, you're on a repository page. If you hear "Issues," you're on the issue list. If you hear an issue title or pull request title, you're on the detail page.
Alex: And if you want to check the URL directly, the browser address bar is your friend. Use Alt+D on Windows or Command+L on Mac, listen to the address, then Escape to return to the page.
Jamie: Let's walk through the main GitHub page types, because they sound similar until you've actually used them.
Alex: The repository home page, often the Code tab, is the project hub. Expect the H1 to be owner slash repo name, then repository tabs, then the file tree, and usually a rendered README below the files. The README is often where maintainers explain what the project does and how to contribute.
Jamie: The issue list is more like a tracker. The H1 is usually "Issues," and the page has filters, search, labels, milestones, and a list of open or closed issues. Then an issue detail page is one conversation about one task, bug, request, or discussion point.
Alex: A pull request detail page is similar, but it is about proposed changes. The Conversation tab holds the discussion, status checks, review comments, and merge controls. The Files changed tab shows the code or document differences file by file.
Jamie: And outside a repository, there are personal areas too. Your feed or dashboard is about activity and updates. Your profile is about you, your repositories, and your public activity. Settings pages are account-level controls, and the H1 usually names the settings category.
Alex: On a repository page, it helps to imagine the page from top to bottom. First there is global navigation. Then repository navigation. Then the main content, where the selected tab actually appears.
Jamie: On the Code tab, the main content usually has branch information, a file tree, and the README. If the file tree is exposed as a table, a screen reader user may jump to it with T, then use table navigation such as Control+Alt+Arrow keys, depending on the screen reader.
Alex: A quick orientation routine can take about a minute. Check the address bar. Check the browser title. Jump to the first H1. Move by landmarks until you find Navigation Menu, Repository navigation if you're in a repo, and Main. Then move by headings, links, buttons, or tables depending on what you need.
Jamie: And if I get stuck, I don't have to keep wandering. I can return to the repository root by trimming the URL back to github.com slash owner slash repo. I can use the skip link to jump into the main content. Or I can use search or the command palette to move faster.
Alex: Landmarks and headings are the two big orientation systems on GitHub. Landmarks divide the page into large regions, such as navigation and main content. Headings divide the content inside those regions.
Jamie: So the repository home page usually gives me Navigation Menu, Repository navigation, Main, and sometimes supporting side areas. The issues list has the same global and repository navigation, then a main region with filters and the issue results.
Alex: Issue detail pages and pull request Conversation tabs usually have the conversation in Main, with side information such as labels, assignees, reviewers, projects, and milestones. On a pull request Files changed tab, Main is dominated by the diff view, with file names, changed lines, and review controls.
Jamie: The heading pattern changes by page type too. Repository home starts with the repo name. Issues list starts with "Issues." Issue and pull request detail pages start with the title of that item. Then lower-level headings may mark comments, checks, files, README sections, or other page areas.
Alex: GitHub also has built-in keyboard shortcuts. Press question mark on GitHub.com to open the shortcut help dialog, then review what is available for that page and your current focus.
Jamie: Some shortcuts are especially useful. S or slash can take you to search. G then N opens notifications. And the command palette can be reached with slash or Control+K, with Command+K often used on Mac, depending on browser and GitHub context.
Alex: The command palette is a quick navigation and action box. You can type part of a repository, command, issue, or page destination, then choose from the results. It is useful when a page is crowded or when you know the destination but do not want to hunt through menus.
Jamie: This is also a good place to separate GitHub.com from github.dev. GitHub.com is the collaboration site: issues, pull requests, repository pages, profiles, settings, and notifications. github.dev is a browser-based VS Code-style editor for working with files in a repository.
Alex: Yes. Use GitHub.com when you need to read an issue, review a pull request, navigate project pages, or manage repository settings. Use github.dev when you want a code editor experience in the browser, especially for editing multiple files. Then return to GitHub.com when you need the full conversation, review, and pull request workflow.
Jamie: The source also talks about viewport changes, and I want to underline that. At full desktop width, you may hear or see more navigation items at once. At tablet width, controls may compress. Below mobile widths, menus may collapse even more.
Alex: And high zoom can create similar changes. At 200 percent or more, icons, wrapping, and spacing may shift. But the URL pattern, page title, H1, landmark names, tab names, button text, and command names are still your most dependable orientation clues.
Jamie: So the internal map is not a picture of one exact screen. It is account, organization or user space, repository, then global navigation, repository navigation when present, and main content.
Alex: That's the map Challenge 01 is asking you to practice. In your Learning Room repository, you will orient to the repo, find the headings, move through tabs, explore the file tree, and build confidence that you can recover your place.
Jamie: And it also connects to later work. Agents and automation still use GitHub's collaboration surfaces. They read issues, open pull requests, react to labels, and leave evidence in repositories.
Alex: Later, Challenge 15 has you browse the living Accessibility Agents catalog, and completing it unlocks the Capstone Project plus Bonus Challenges A through E. The Capstone Project can involve Accessibility Agents, GLOW, or another meaningful repository, and review-ready drafts or contribution plans can count as completion evidence. So this navigation work is not just warm-up. It is the surface you will keep using when the tasks get more advanced.
6. Episode 19: Screen Reader Cheat Sheet
NVDA, JAWS, and VoiceOver commands for GitHub and VS Code.
Based on: Appendix B: Screen Reader Cheat Sheet
Read Transcript - Episode 19: Screen Reader Cheat Sheet
Transcript
Alex: Welcome back. Today we're making the screen reader cheat sheet practical: how to move around GitHub with NVDA, JAWS, and VoiceOver, and how to keep your place when pages get busy.
Jamie: I like that we're treating it as something you use while working, not something you memorize before you're allowed to touch GitHub.
Alex: Exactly. Keep it open in another browser tab, a second window, or print it if that helps. The commands are grouped by task, so you can look up the thing you are doing right now: moving by headings, finding a button, reading a table, typing a comment, or checking a pull request.
Jamie: And if you're using a screen reader, the cheat sheet itself is navigable too. Headings get you to the task areas, and the command tables put the key in one column and the action in the other.
Alex: Right. NVDA users can use NVDA+F7, often Insert+F7, to open the Elements List. JAWS users can use Insert+F6 for headings and Insert+F7 for links. Low vision learners may want the sheet at 150 to 200 percent zoom, and sighted helpers can bookmark it as a quick reference instead of hunting through the whole course.
Jamie: Before the key commands, I want to slow down on modes. This is the part where people press a key and something totally different happens than they expected.
Alex: Yes. On the web, NVDA and JAWS usually work in a reading and navigation mode first. NVDA calls it browse mode, and JAWS often calls it the virtual cursor. In that mode, pressing H does not type the letter H. It jumps to the next heading.
Jamie: So browse mode is for moving around and reading the page. Focus mode is for typing or interacting with controls.
Alex: Exactly. With NVDA, you can toggle browse and focus mode with NVDA+Space, where the NVDA key is usually Insert or CapsLock. With JAWS, Insert+Z toggles the virtual cursor, and forms mode may also turn on automatically in edit fields. VoiceOver on macOS works differently: the VO keys are Control+Option, and you often use VO+Shift+Down to interact with an element, then VO+Shift+Up to stop interacting.
Jamie: So if I press H and it types H into a comment box, I'm probably in the typing context. If I press H and it jumps headings, I'm navigating.
Alex: The fastest GitHub navigation usually starts with headings. H goes to the next heading, Shift+H goes back, and numbers like 1, 2, 3, and 4 jump by heading level. On GitHub, the page title is often level 1, major areas are often level 2, issue and pull request titles are often level 3, and commit titles may show up around level 4.
Jamie: That explains why headings feel so useful on issue lists and pull requests. You're not tabbing through every star button, avatar, and link.
Alex: Landmarks are the other big shortcut. A landmark is a named page region, like navigation, main content, repository navigation, search results, add a comment, or pagination. In NVDA, D moves by landmark. In JAWS, R is commonly used for regions. In VoiceOver, open the rotor with VO+U and choose Landmarks.
Jamie: Then links, buttons, and forms fill in the smaller moves. K for links in NVDA, B for buttons, F or E for edit fields, and Tab when you want the next interactive thing of any type.
Alex: Yes, and lists and tables matter on GitHub more than people expect. L moves to a list, I moves through list items, and T moves to a table. Repository file lists often behave like tables, so once you're in one, Ctrl+Alt plus the arrow keys can move across columns and down rows.
Jamie: And when the page is really crowded, use the tool that lists the page parts instead of wandering.
Alex: Exactly. The Elements List or rotor lets you see headings, links, form fields, buttons, and landmarks in one dialog. Open it, switch to the type you need, type a filter like new issue or comment, and press Enter to jump to the matching item. That is often faster than repeated Tab or repeated H.
Jamie: The cheat sheet also separates commands by screen reader. That's helpful because the pattern is similar, but the exact key can change.
Alex: For NVDA on Windows, remember the core browse mode keys: H for headings, 1 through 6 for heading levels, K for links, B for buttons, F or E for form fields, T for tables, D for landmarks, L for lists, and I for list items. Insert+Space toggles browse and focus mode. Insert+F7 opens the Elements List. NVDA+DownArrow starts reading from the cursor, NVDA+UpArrow reads the current line, and Control stops speech.
Jamie: JAWS has the same general shape. H for headings, K for links, B for buttons, F for form fields, T for tables, R for regions, L for lists, and I for list items.
Alex: Right. JAWS also has U for the next unvisited link. Insert+Z toggles the virtual cursor, Numpad Plus exits forms mode, Insert+F6 opens the headings list, and Insert+F7 opens the links list. Insert+DownArrow starts reading from the cursor, Insert+UpArrow reads the current line, and Control stops speech.
Jamie: For VoiceOver, the rotor is the home base.
Alex: Yes. Turn VoiceOver on or off with Cmd+F5. Open the rotor with VO+U, use left and right arrows to choose Headings, Links, Form Controls, Tables, or Landmarks, and use up and down arrows inside that category. VO+Right and VO+Left move through items, VO+Space activates, VO+A starts reading, and Control stops reading.
Alex: Now let's connect those commands to the GitHub pages learners actually use. On a repository main page, use landmarks to reach main content or repository navigation, use headings to find the README and major areas, and use T if you need the file table.
Jamie: So if I'm trying to find files in my repository, I shouldn't assume Tab is the only way. I can jump to the table and move through rows.
Alex: Exactly. On the issues list page, headings and lists help you find issue titles, filters, pagination, and the New issue button. On an issue detail page, headings help you move through the title, conversation, comments, and timeline. The add comment landmark or form field navigation helps you find the response box.
Jamie: Pull requests have even more moving parts. There's the list page, and then the detail page with tabs.
Alex: Yes. On a pull request detail page, the Conversation tab is where you'll find the discussion, review status, checks, and comment box. The Commits tab often exposes commit titles as headings or links. The Files changed tab can be dense, so use headings, buttons, and table or code navigation carefully, and look for controls that collapse files or move between changed files.
Jamie: What about feature previews? Those can be hard to find because they live around account menus and dialogs.
Alex: If a lesson asks you to check or enable a feature preview, start from the avatar or account menu, then look for a Feature preview item if it is available. NVDA and JAWS users can use browse mode commands to find buttons, headings, and toggles in the dialog. VoiceOver users may need to interact with the menu or dialog using VO+Shift+Down, activate with VO+Space, and stop interacting when done. If the preview has moved or become part of the standard GitHub experience, treat that as a page-change clue rather than a personal mistake.
Jamie: Typing is where mode mistakes show up fast. You find the comment box, start typing, and suddenly the screen reader is jumping around.
Alex: For GitHub text areas, focus mode is required. That includes issue titles, issue bodies, pull request descriptions, review comments, and regular comment boxes. Move to the edit field first, activate it, confirm that your keystrokes are going into the field, and then type.
Jamie: And GitHub text areas support Markdown, so formatting can be keyboard-friendly too.
Alex: Yes. You can type Markdown directly, like number signs for headings, hyphens for lists, backticks for code, and brackets plus parentheses for links. Common editing shortcuts such as Ctrl+B for bold, Ctrl+I for italic, and Ctrl+K for a link may work in GitHub text areas. When in doubt, use the Preview tab or the screen reader's reading commands to check what you wrote before submitting.
Jamie: Dropdown menus and flyouts are another place where I see people get stuck.
Alex: Open the button with Enter or Space, then try arrow keys, Tab, and Escape. Some menus behave like application widgets, so focus mode or interaction mode may be needed. For VoiceOver, interact with VO+Shift+Down, move within the menu, activate with VO+Space, and stop interacting with VO+Shift+Up when you leave the menu.
Alex: GitHub also has its own built-in keyboard shortcuts. Press the question mark key on a GitHub page to open the shortcut dialog, as long as you're not inside a text field.
Jamie: How do those work with a screen reader? Because single letters already mean things in browse mode.
Alex: Sometimes the screen reader gets the key first. If a GitHub shortcut does not fire, use your screen reader's pass-through command or briefly switch modes, then turn your normal navigation back on. And do not test GitHub page shortcuts while your cursor is inside a comment box, because then you're just typing into the box.
Jamie: Once the shortcuts dialog opens, how should someone read it?
Alex: Use headings, tables, or the rotor to move through the dialog. It groups shortcuts by area, so you can find the ones for site-wide navigation, repositories, code browsing, issues, pull requests, comments, notifications, Actions, and Projects. Escape usually closes the dialog.
Jamie: Give me the short list learners should recognize.
Alex: The slash key moves to search on many GitHub pages. g i goes to Issues, and g p goes to Pull requests from repository pages. t opens the file finder when you're browsing code. y updates the address to a permalink for the exact version of the file, and l jumps to a line number when you're viewing a file.
Jamie: And then there are page-specific shortcuts, right?
Alex: Yes. Issue and pull request lists have shortcuts for moving through items and opening selected items. Detail pages have shortcuts around comments and timeline actions. The Files changed tab in a pull request has shortcuts for moving between files and comments. Notifications, GitHub Actions, and Projects have their own shortcut groups, so use the question mark dialog on the page you're actually using.
Jamie: The source for this episode is mostly about GitHub, but this course also spends time in VS Code. What should screen reader users know there?
Alex: VS Code has accessibility help built in. Use the Command Palette and search for accessibility help if you forget a command or need editor-specific guidance. VS Code also has screen reader optimized behavior, and many commands are reachable from the keyboard without relying on the mouse.
Jamie: Diffs are the scary part for a lot of learners. A GitHub pull request diff and a VS Code diff can both feel like a wall of changed lines.
Alex: In VS Code, look for the accessible diff viewer when comparing changes. It presents additions, deletions, and changed lines in a way that is easier to review with speech or braille than a purely visual side-by-side diff. Pair that with GitHub's Files changed tab when you need to understand what will be reviewed before a pull request is merged.
Jamie: So the habit carries across tools: find the accessible view, move by meaningful units, and verify the change before you submit or approve it.
Alex: A few common patterns are worth practicing until they feel familiar. To open an issue, move to the repository navigation, choose Issues, find New issue, enter the title and body in focus mode, preview if needed, and submit. To leave a comment, find the add comment area, move into the text box, type in focus mode, preview or review, then activate the comment button.
Jamie: For pull request review, I would start with the Conversation tab for context, move to Commits if I need the history, and use Files changed when I need the exact code or documentation changes.
Alex: Yes. If you're hearing too much, switch from continuous reading to headings, landmarks, links, and form fields. If H is typing the letter H, leave the edit field or switch back to browse mode. If you cannot find the comment box, search the page elements for comment, add a comment, or form fields. If the diff or code area is hard to navigate, try the file list, changed-file controls, GitHub shortcuts, or VS Code's accessible diff viewer.
Jamie: And if the page doesn't match the instructions, that doesn't mean you failed. GitHub changes.
Alex: Exactly. Check whether you're on the same page type, whether a tab or filter is selected, whether a feature has moved, and whether your screen reader, browser, or GitHub setting changes the behavior. If a command does not work, verify the screen reader mode, keyboard layout, browser focus, and whether the command belongs to NVDA, JAWS, VoiceOver, GitHub, or VS Code. Official references from NV Access, Freedom Scientific, Apple, GitHub keyboard shortcut documentation, and W3C accessibility guidance are good places to confirm details.
Jamie: That's a good place to land. The cheat sheet is not a test. It's a workbench: use the command you need, check where you are, and keep building the workflow one reachable control at a time.
7. Episode 3: Navigating Repositories
Exploring a repository: tabs, files, README, branches, and commit history.
Based on: Chapter 3: Navigating Repositories
Read Transcript - Episode 3: Navigating Repositories
Transcript
Alex: Welcome back. Today we're getting comfortable inside a GitHub repository, which is the place most of your collaboration work starts.
Jamie: And repository is one of those words people hear constantly, but it can still feel fuzzy. What is it, in plain language?
Alex: A repository is a project folder tracked by Git. It can hold code, documents, images, configuration files, and the history of changes to all of those files. On GitHub, the repository page is the web view of that project.
Jamie: So when I open a repo, I'm not just looking at a file cabinet. I'm looking at the current project plus its memory.
Alex: Exactly. Chapter 3 is a confidence-building orientation chapter, so there is no graded automation check here. The goal is to learn the page structure, practice with headings and landmarks, confirm that you can find your way around, and then bring that confidence into the Learning Room work later.
Jamie: I like that this is not treated as busywork. If I can find the tabs, files, README, branches, and history, later issues and pull requests are much less mysterious.
Alex: When you land on a repository URL, the Code tab is usually the home page. Your screen reader may announce a page title like owner slash repo-name, a short description, and GitHub. The first heading is usually the repository name.
Jamie: So my first check is, did I land where I meant to land? If the heading says a different owner or repo name, I stop before doing anything else.
Alex: Yes. A dependable orientation routine is: press 1 to hear the main heading, press D to move through landmarks, and use the heading list with NVDA+F7 or the VoiceOver rotor with VO+U to scan what is on the page.
Jamie: What landmarks should people expect to hear?
Alex: Common ones include Repository navigation for the tab bar, Main for the file area and repository details, and Repository Files Navigation for the rendered README when a README exists. GitHub's visual layout can change with screen width, account features, and product updates, so landmarks, headings, tab names, and shortcuts are more reliable than memorizing the exact visual position.
Jamie: And the learning cards in the chapter support different ways of working, right? Visual and mouse, low vision, NVDA or JAWS, and VoiceOver.
Alex: Right. Open the cards that match your setup. The official GitHub Accessibility Guide is also a good companion reference, especially for NVDA, while this course adds workshop context and other perspectives.
Jamie: Once I'm oriented, the tab bar is usually the next thing I want. What belongs there?
Alex: The main repository tabs often include Code, Issues, Pull requests, Actions, and sometimes Discussions, Projects, Wiki, Security, Insights, and Settings. Settings appears only when you have the right permissions, and some tabs appear only if the repository owner enabled them.
Jamie: And the tab labels tell me more than just the name.
Alex: They can. Issues might announce the number of open issues, Pull requests might announce open pull requests, and the current tab may be announced as selected or current. At high zoom, the tabs may wrap across lines, but they are still links. Keyboard shortcuts can help too: G then I jumps to Issues, and G then P jumps to Pull requests inside a repository.
Jamie: Now the Code tab has the file list, which can be intimidating if the repo is large.
Alex: The files table is the core of the Code tab. It has file and folder names, the most recent commit message for each item, and the age of that change. Screen reader users can often press T to move to the next table and land on the files table.
Jamie: How do I read one row without getting lost?
Alex: Start in the Name column, then move across to the Message column, then to the Age column. A row might tell you docs slash, Add accessibility guide, 3 days ago. Folders often end with a slash, and opening a folder reloads the page with that folder's contents. You can go back up with the browser Back button or the breadcrumb links.
Jamie: Let's talk branches, because that word shows up near the file list and it sounds like something I could break.
Alex: A branch is a version line of the repository. The default branch is the main shared line, usually called main, and it is what you see first unless you choose a different branch. People use branches to work on changes without disturbing the default branch.
Jamie: So the branch selector changes what version of the files I'm viewing.
Alex: Yes. The branch selector is near the top of the file area on the Code tab. Open it, and you'll find a dropdown where you can search branches, choose another branch, or switch to a tag if the repository has tags.
Jamie: What is a tag in this context?
Alex: A tag is a named point in history, often used for releases. Switching to a tag lets you inspect the files as they existed at that release point. It's useful when you want to understand what changed in the last release, or compare current work with a stable snapshot.
Jamie: That helps. Branches are active lines of work, and tags are named snapshots.
Alex: At some point, you may want the repository on your computer. Cloning means copying a remote repository from GitHub to a local folder so you can inspect or work with it using local tools.
Jamie: And cloning is not the same as forking.
Alex: Correct. A clone is a local copy on your machine. A fork is your own GitHub-hosted copy of someone else's repository. A branch is a line of work inside a repository. Those three ideas connect, but they are not interchangeable.
Jamie: What are the practical cloning choices?
Alex: With the GitHub CLI, you can use gh repo clone owner/repo-name, so you do not need to paste the full URL. You can also clone and move into the folder with a command sequence such as gh repo clone owner/repo-name followed by cd repo-name. With standard Git, you can use git clone and the repository URL.
Jamie: And the ZIP download?
Alex: Downloading a ZIP gives you the files, but not the Git history and not the normal Git connection back to GitHub. It is fine for reading or quick inspection. For contribution work, cloning is usually the better choice.
Jamie: Where do watching, starring, and forking fit in?
Alex: Watching subscribes you to notifications. Starring bookmarks or signals interest in a repository. Forking creates your own GitHub copy, often used when you need a place to propose changes and you do not have direct write access.
Jamie: Once I open a single file, the page feels different from the file table. What should I listen for?
Alex: A file page usually has the repository navigation, the file path or breadcrumb, the file content area, and file action buttons. A Markdown file like README.md is often rendered as formatted headings, links, lists, and text. A code file is usually shown with line numbers and code content.
Jamie: So for a README, I can navigate by headings like I would on a web page.
Alex: Exactly. For code, line numbers can help you locate a specific part of the file, and screen reader behavior may depend on your browser and settings. File action buttons may include Raw, Blame, History, Copy path, Download, and Edit when editing is available.
Jamie: How do I reach those buttons without hunting visually?
Alex: Use Tab, button navigation, or your screen reader's links and buttons list. If you choose Edit, GitHub may open an editor if you have permission. If you do not have permission, GitHub may guide you toward making the change in a fork or another editable copy.
Jamie: That is a good moment to slow down and check where the change will go before typing.
Alex: GitHub also lets you inspect history. Commit history answers who changed what and when, and often why, based on the commit message.
Jamie: Where do I find that from the Code tab?
Alex: Near the file list, there is usually a commits link showing the number of commits. The commits page lists recent commits with messages, authors, and dates. Opening one commit page shows the files changed and the diff, which is the before-and-after view of the lines.
Jamie: And Blame is related, but more specific?
Alex: Yes. The Blame view shows, line by line, which commit last changed each part of a file. It is useful when you need context for a line: who touched it, when, and which commit message explains the change. It is not about blaming a person; it is about tracing history.
Jamie: What if I know the file name but not where it lives?
Alex: Use Go to file. The T shortcut opens a search-as-you-type file finder from the repository. Browser Find with Ctrl+F can help on the current page, but Go to file searches the repository's file paths. If you are navigating sidebars or collapsed areas, use landmarks, headings, Tab, and the question mark shortcut to review available GitHub keyboard shortcuts.
Jamie: So search is part of navigation, not a failure to navigate.
Alex: Before you contribute, scan the repository's About area. It often includes the short description, website link, topics, license, and sometimes release or package information.
Jamie: Topics are the little labels like accessibility, documentation, or python?
Alex: Yes. They help you understand the project's subject area. The license tells you the rules for reuse and contribution, and if there is no license, you should be cautious about assuming reuse rights.
Jamie: Can we connect all of this to real situations?
Alex: Sure. If you want to know what a project does, read the description, About area, and README. If you want a good file to edit, inspect the file tree, README, open issues, and contribution guidance. If you want to know who has worked on a file recently, use History or Blame. If you want to understand a release, look at tags, releases, and recent commits. If you want to contribute, start with Issues, README, contributing docs, and the repository's current activity.
Jamie: And if I get stuck?
Alex: Return to the orientation routine: main heading, landmarks, headings list, then tabs. Check whether the page changed because you opened a folder, switched branches, searched files, or moved from the Code tab to another tab. If needed, ask a peer or facilitator to confirm what page and branch you are on.
Jamie: This connects directly to Challenge 01, Find Your Way Around, in the Learning Room. That is where learners practice repository orientation, headings, tabs, file tree navigation, and building confidence in their own provisioned repository.
Alex: A simple practice run is the five-tab tour: visit Code, Issues, Pull requests, Actions, and Settings if you have access, or another visible tab if you do not. On each one, identify the main heading, one useful landmark, and how you would get back to Code. That's enough to turn a repo from a wall of links into a place you can move through on purpose.
8. Episode 4: The Learning Room
Your shared practice environment: challenges, PR workflow, bot feedback, peer review.
Based on: Chapter 4: The Learning Room
Read Transcript - Episode 4: The Learning Room
Transcript
Alex: Welcome back. Today we're getting oriented in the Learning Room, which is your private practice repository for Day 1 of the workshop.
Jamie: I like starting there, because a new GitHub repository can feel like walking into a room with a lot of unlabeled doors.
Alex: Exactly. The Learning Room is a GitHub repo created for you through GitHub Classroom. It starts from the Community-Access/learning-room-template repository, but your copy lives in the workshop organization with a name like <workshop-org>/learning-room-<your-username>.
Jamie: So I am not editing the template repository itself.
Alex: Right. The template is the clean version facilitators maintain. Your work happens in your own private copy, with your own branches, your own pull requests, and your own feedback from Gandalf, the PR validation bot.
Jamie: And the private copy is on purpose, not just a convenience.
Alex: Yes. It gives you safety, authenticity, and room to move at your own pace. You can practice issues, branches, commits, pull requests, checks, reviews, and merges without changing anyone else's work. Facilitators manage the workshop organization, Classroom assignment, repository permissions, and automation, so you do not need to set those up yourself.
Jamie: What does the first hands-on moment look like?
Alex: You need to be signed in to your GitHub account in the browser, and you need the Classroom assignment link from the facilitator. It usually looks like classroom.github.com/a/ followed by a random-looking ID.
Jamie: And if GitHub Classroom asks for permission or asks who I am?
Alex: If it asks you to authorize GitHub Classroom, activate the authorization button. That is usually a one-time permission step. If it asks you to pick your name from a roster, use arrow keys or Find in Page with Ctrl+F or Cmd+F, and if your name is missing, skip to the next step and tell the facilitator.
Jamie: Then I accept the assignment?
Alex: Yes. Activate Accept this assignment, then wait while GitHub Classroom copies the template into the workshop organization and grants you access. That usually takes 10 to 30 seconds, and you may need to refresh every 15 seconds or so until the repository link appears.
Jamie: One accessibility detail there: status pages do not always announce when something changes.
Alex: Right. Use Browse mode and press K to move through links, or refresh the page until the repo link appears. When you open it, confirm the heading includes learning-room-<your-username>, check that it looks like a private workshop copy, and notice folders such as docs/ and .github/ plus README.md. Bookmark that page, because you will come back to it all day.
Jamie: Where does Challenge 1 show up?
Alex: In the Issues tab of your Learning Room repo. You can use GitHub's keyboard shortcut G then I to go to Issues. Look for an open issue like Challenge 1: Find Your Way Around, usually authored by aria-bot or github-actions[bot], then read the issue body for the task, evidence, and completion instructions.
Jamie: And if Challenge 1 does not appear after a couple of minutes?
Alex: Refresh the Issues tab once. If it is still missing, check the Actions tab for the Student Progression Bot workflow, and ask the facilitator with a link to your repo. While you are in Actions, you can also confirm that a workflow named pr-validation-bot or Gandalf PR Validation exists, which tells you Gandalf is ready for future pull requests.
Alex: Chapter 4 itself is an orientation chapter. There is no challenge to complete and no automation check for this part.
Jamie: So before starting the next chapter, I should be able to find docs/CHALLENGES.md, explain issue -> branch -> pull request -> review -> merge, and know where Gandalf comments on a PR.
Alex: Yes, and that comment location is the Conversation tab of the pull request. Day 1 also has two learning tracks that reinforce each other.
Jamie: One is the optional GitHub Skills practice, right?
Alex: Right. GitHub Skills modules such as Introduction to GitHub, Communicate Using Markdown, and Review Pull Requests let you practice individual skills in your personal account. Mona, GitHub's learning bot, guides those modules.
Jamie: And the required workshop track is the Learning Room.
Alex: Exactly. In the Learning Room, Blocks 1 through 4 move through Challenges 1 through 7, including finding your way, filing an issue, branching, committing, opening a PR, and dealing with a merge conflict. Block 5 covers Challenges 8 and 9 around culture and merge day, and Block 6 focuses on community tools like labels, milestones, and notifications.
Jamie: Same GitHub account, different purpose.
Alex: Yes. The Skills modules are optional self-paced practice. The Learning Room is the required workshop path, with your private repo, workshop issues, Gandalf feedback, and facilitator support.
Jamie: Once I am inside the repo, what files should I expect to work with?
Alex: Start with the file tree. The docs folder contains much of the practice content, .github contains automation and templates, README.md gives the repo overview, and docs/CHALLENGES.md acts like your challenge menu.
Jamie: What are the main practice files?
Alex: docs/welcome.md introduces open source contribution and includes TODO areas for who can contribute, finding something to work on, and what happens after a contribution is merged. Those edits help you practice improving documentation in a realistic way.
Jamie: So not everything is code.
Alex: Exactly. docs/keyboard-shortcuts.md is a screen reader shortcut reference, docs/setup-guide.md helps people get ready to contribute, and docs/CHALLENGES.md helps you understand the path. Some bonus material may appear too, but follow the challenge issue and facilitator guidance for when to use it.
Jamie: That makes the repository feel less mysterious. It is a set of practice surfaces, not a maze.
Alex: Yes. The files are there so you can practice Markdown, navigation, accessible writing, and contribution habits in a repo that behaves like a real project.
Alex: The first Day 1 skills are intentionally small, and that is good design.
Jamie: Challenge 01 is Find Your Way Around.
Alex: Right. Challenge 01 is about repository orientation: headings, tabs, the file tree, and confidence inside the Learning Room. Before you edit anything, you learn how to locate yourself.
Jamie: Then Challenge 04 is Branch Out.
Alex: Yes. A branch is a separate line of work inside the repo. Creating a safe working branch protects main, which is the stable branch you merge into when the work is ready.
Jamie: How do I use that branch without overthinking it?
Alex: Switch to your practice branch before editing, make the change there, commit the change, and open a pull request back into main. You might do that in the GitHub web editor, github.dev, VS Code, or the command line, depending on the workshop flow.
Jamie: I always worry that I will commit the wrong thing.
Alex: That is why you check the branch name before editing and before committing. Challenge 05, Make Your Mark, focuses on editing a file, writing a useful commit message, and connecting the change back to an issue. A good commit message says what changed and why it matters.
Jamie: And the learning cards and tool cards are there as reminders?
Alex: Yes. The learning cards explain the idea in short form, and the tool cards help with actions like switching to your practice branch. Use them when you need a quick reset without rereading the full chapter.
Jamie: So where does the pull request enter the picture?
Alex: A pull request, or PR, is the place where you propose bringing your branch changes into main. It also creates the conversation space for checks, comments, review, and final merge.
Jamie: Walk me through the shape of it.
Alex: You start from the issue instructions, create a branch, edit the file, commit the change, and open a PR. In the PR description, explain what changed and connect it to the issue. Then automation checks it, a reviewer may comment, you respond or update if needed, and eventually the work is merged.
Jamie: Is that the same as the fork-edit-PR workflow people use in open source?
Alex: It is the same collaboration pattern, but the Learning Room skips the fork because GitHub Classroom already created your private copy. Later, in public projects, a fork may be the copy you control before you propose changes to the original repository.
Jamie: Can you make that concrete?
Alex: Sure. Student A might work on a welcome guide challenge, open a PR from their branch, and describe which TODO they completed. The PR is visible to the author, facilitators, automation, and any assigned reviewer when that access is intentionally provided.
Alex: The automation is there to help you learn, not to scold you.
Jamie: That would be Gandalf.
Alex: Yes. Gandalf runs from a workflow such as .github/workflows/learning-room-pr-bot.yml, and it usually comments about 30 seconds after you open a pull request.
Jamie: Where should I listen for that feedback?
Alex: On the PR's Conversation tab. Gandalf may confirm that requirements are met, point out missing evidence, or suggest what to fix before you merge.
Jamie: And there is also progress tracking after merge.
Alex: Right. When a PR is merged, the progression automation can close the current challenge or post the next one. That is why challenges unlock one at a time instead of all arriving at once.
Jamie: What if everyone is working at the same time? Can my PR get buried?
Alex: Your Learning Room keeps your work separate. Use the Pull requests tab, filters, notifications, and direct links from issues or bot comments. Your work is not mixed into another student's repo.
Jamie: Peer review is the part that can make people nervous.
Alex: Totally understandable. In the Learning Room, review is low-stakes practice. You read the PR, inspect the files changed, compare the work to the challenge instructions, and leave one or two useful comments.
Jamie: How do I find a PR I am supposed to review?
Alex: The facilitator may assign one or share a direct link. When you open it, read the Conversation tab first for context, then the Files changed tab to hear what actually changed.
Jamie: Can I comment on anyone's PR whenever I want?
Alex: Only where access is intentionally provided and the facilitator says it is welcome. Private Learning Rooms mean classmates do not automatically see each other's work, though facilitators may arrange real peer review.
Jamie: What does a helpful review comment sound like?
Alex: Be specific and kind. You might say that a heading makes the steps easier to scan, or that the issue asks for a link back to setup-guide.md. If you disagree with a review, respond with context, ask a clarifying question, and bring in a facilitator if needed.
Alex: A few practical worries come up every cohort.
Jamie: What if my reviewer does not respond?
Alex: Use the workshop chat or the facilitator path. Human review may take 15 to 60 minutes, but you should not be left wondering what to do next.
Jamie: What if the bot feedback seems wrong?
Alex: Read the message, compare it with the challenge issue, and ask for help. Bots are useful, but they are not the final word when something looks off.
Jamie: Can I work with a friend or a study group?
Alex: Optional study groups are fine when facilitators allow them. You can talk through navigation and concepts together, while making sure the evidence in your repo represents your own work.
Jamie: Do I need to complete every challenge?
Alex: Follow the workshop requirements and facilitator guidance. Day 1 has a planned progression, but the bigger goal is confidence with the workflow, not racing through screens.
Jamie: How do I know when I am done with a challenge?
Alex: The issue tells you what evidence is required. Usually you will see the bot feedback satisfied, any assigned review addressed, the PR merged, and either the issue closed or the next challenge posted.
Jamie: And if I get stuck anywhere?
Alex: Keep your repo link, issue link, branch name, and PR link handy. Share where you are, what you tried, and what you expected to happen. Then take the win seriously, because opening issues, branches, commits, PRs, reviews, and merges is real contribution practice.
Jamie: If a word or Markdown pattern trips me up, where should I look?
Alex: Use the glossary and Markdown reference appendices, and rely on GitHub's documentation for README files, editing files, GitHub flow, Git basics, and pull requests when you want the source details.
9. Challenge 01: Find Your Way Around
Repository orientation, headings, tabs, file tree navigation, and confidence in the Learning Room.
Practice focus: Day 1 foundation
Read Transcript - Challenge 01: Find Your Way Around
Transcript
Alex: Welcome back. Challenge 1 is called Find Your Way Around, and it is exactly what it sounds like: a guided scavenger hunt through your Learning Room repository.
Jamie: I like starting there. Before anyone edits a file or opens a pull request, they need to know where they are and what they are touching.
Alex: Yes. Your Learning Room is your own private GitHub repository for Day 1. It is created from a template when you accept the GitHub Classroom assignment, but you do not work in the template itself.
Jamie: So my repo is not the class shared notebook. It is my copy, with my issues, my branches, my pull requests, and my practice space.
Alex: Exactly. You accept the Classroom link, wait while GitHub creates the repo, open the new repository link, and bookmark it. The repo name usually looks like learning-room-your-username inside the workshop organization.
Jamie: And Challenge 1 shows up as an issue in that repo, right? The Student Progression Bot opens the next challenge after you close the current one.
Alex: A little GitHub map helps before we click around. GitHub has account pages, organization or user spaces, and repositories. Most workshop work happens inside a repository, because that is where files, issues, pull requests, checks, and project history live.
Jamie: So when someone says, go to the repo, I should expect a page whose main heading is something like owner slash repo-name.
Alex: Right. Every GitHub page also has a global navigation area near the top. Inside a repository, there is a second navigation area for that repo, with tabs such as Code, Issues, Pull requests, Actions, Projects, Wiki, Security, Insights, and sometimes Settings.
Jamie: And if I am using a screen reader, I do not have to rely on where things appear visually. I can use landmarks, headings, links, and tab names.
Alex: Three signals tell you where you are: the URL, the browser tab title, and the first H1 heading. For example, owner slash repo is usually the Code tab, owner slash repo slash issues is the Issues list, and owner slash repo slash pull slash 7 is a specific pull request.
Jamie: My quick check would be: press 1 to hear the main heading, press D to move through landmarks, and open the headings list if I want a fast scan of the page.
Alex: That works well. Also remember that GitHub's layout can change with zoom level, window width, account settings, and product updates. So use visual position as a hint, but trust stable things like the URL, heading, landmark name, tab label, button text, and file name.
Jamie: Okay, I have the Challenge 1 issue open. What is the first thing I am actually asked to find?
Alex: Start on the Code tab. The challenge asks you to look at the file and folder list in the root of the repository and count how many items are showing before the first folder.
Jamie: Before the first folder is a funny detail. Why not just count everything?
Alex: Because this is a navigation practice task, not a math test. Repositories change over time, and the exact count may vary. If you can find the Code tab, reach the file list, and write a reasonable count, you are doing the skill.
Jamie: So the evidence can be simple, like, I found 3 files in the root before the first folder, even if someone else's number is different.
Alex: Yes. Then move to the Issues tab. Look for an issue marked Open, activate one, read it, and write down its title.
Jamie: What if there are no open issues when I look?
Alex: Then say that. Noting that the Issues tab exists and that you checked it is acceptable for this scavenger hunt. The goal is to learn the page type: Issues list, then issue detail.
Alex: Back on the Code tab, open the docs folder and then open docs/welcome.md. Read the first paragraph or opening sentence and write down what it says.
Jamie: And if I notice TODO comments in that file, I should not panic. Those are intentionally left there for a later challenge.
Alex: The next few findings are about understanding the project from its surrounding text. On the Code tab, find the repository description, then find the README, and then check the About area.
Jamie: The challenge says top-right for the description and right sidebar for About, but GitHub may move those pieces around at high zoom or on a narrow screen.
Alex: Exactly. Listen or look for the repository description near the repo name or in the About information. It is short text that tells you what this repository is for.
Jamie: And the README is the longer rendered document that GitHub shows below the file list, if the repo has one.
Alex: Right. For this challenge, open README.md and find the part about who the workshop is for. Then write a sentence about what you found. For the About area, write down the repo information you can identify, such as the description or other visible repo details.
Jamie: Let's slow down on the file list, because that is where a lot of people lose their place.
Alex: On the Code tab, the file list behaves like a table. It usually has a name column, a recent commit message column, and an age column that says how long ago the item changed.
Jamie: For screen reader table navigation, I might jump to the table and move row by row. On Windows screen readers, that is often Ctrl+Alt with arrow keys inside the table.
Alex: Yes. In the name column, folders and files are links. Folders may be announced with a trailing slash, and opening a folder reloads the page to show that folder's contents. Breadcrumb links and the browser Back command can take you back up.
Jamie: There is also a file finder shortcut, right?
Alex: Yes. GitHub has a Go to file control, and the repository shortcut T can open it when GitHub receives the key command. If your screen reader is using T for table navigation in Browse Mode, choose the method that is working in your current setup.
Jamie: When I open a Markdown file like README.md or welcome.md, I should expect headings, paragraphs, links, and maybe code-style text. A code file will feel different because the content is line-oriented.
Alex: And single file pages have action buttons too, such as controls to view raw content, copy, download, or edit when you have permission. Later you will edit files, but in Challenge 1 you are mainly reading and recognizing the page.
Jamie: What about blame and commit history? Those sound ominous.
Alex: They are just history views. Commit history shows a list of saved changes. Blame shows which commit last changed each line of a file. You do not need them to finish this challenge, but knowing they exist helps when you want to understand who changed what and when.
Jamie: Challenge 1 mostly uses Code and Issues, but the repo has more tabs than that.
Alex: It does. Pull requests are where proposed changes are discussed before merging. Actions show automation runs. Projects, Wiki, Discussions, Security, Insights, and Settings may appear depending on the repository and your permissions.
Jamie: The branch selector is on the Code tab too. Do I need to use it right away?
Alex: Not for this scavenger hunt, but you should recognize it. A branch is a safe line of work inside the same repo. Later, you will create a practice branch so your changes do not go straight onto main.
Jamie: And tags?
Alex: Tags are named points in history, often used for releases. The same selector may let you switch between branches and tags.
Jamie: I always mix up clone, fork, and branch.
Alex: A clone is a local copy on your computer. A fork is your own server-side copy of someone else's repository. A branch is a separate line of work inside a repository. For Challenge 1, you do not need to fork anything.
Jamie: And watching, starring, and forking are different social or workflow actions.
Alex: Right. Watching subscribes you to notifications. Starring bookmarks or signals interest. Forking creates a copy under your account or organization. Useful tools, but not required for completing Find Your Way Around.
Jamie: If the website is hard for me on a given day, do I have alternate ways to browse?
Alex: Yes. You can use github.com in the browser, press period on a repo page to open github.dev, browse with VS Code and the GitHub Repositories extension, or use GitHub CLI. For example, gh repo view owner/repo --web opens a repo page in your browser, and standard git clone works when you are ready to work locally.
Alex: When you have your findings, paste them into the evidence box in the Challenge 1 issue. Short sentences are enough: the root count, an open issue title, the opening of welcome.md, the repository description, who the README says the workshop is for, and what the About area shows.
Jamie: I appreciate that the evidence is not trying to trick anyone. If I explored the right places and described what I found, that counts.
Alex: After you submit your evidence, the challenge asks you to open the Peer Simulation: Welcome Link Needs Context issue and leave an encouraging comment or reaction. If your facilitator gives you access to a real buddy repository, you can use your buddy's issue instead.
Jamie: So even in the first challenge, I am practicing repository navigation and community behavior. Find the place, read the context, respond kindly.
Alex: Exactly. Then follow the issue instructions for completion. In this Day 1 flow, closing a challenge issue is what lets the Student Progression Bot open the next challenge.
Jamie: What are the common places people get stuck in this one?
Alex: If you cannot find the tabs, move to the Repository navigation landmark or search the links for Code and Issues. If you cannot find docs/welcome.md, return to the Code tab, open docs, then choose welcome.md. If you are unsure what to write as evidence, describe what you found in your own words.
Jamie: And if Challenge 1 itself is missing after I accepted the assignment?
Alex: Refresh the Issues tab once or twice. If it still does not appear after a couple of minutes, check the Actions tab for the Student Progression Bot workflow, then ask a facilitator with your repo link. While you are in Actions, you may also see the PR validation workflow for Gandalf; you do not need to run it yet.
Jamie: So the win condition is not memorizing GitHub's current layout or having the same file count as everyone else.
Alex: Right. The win is confidence. You can identify the repo, move between Code and Issues, open a folder, read a Markdown file, find the README and About information, leave a first community-style response, and recover when the page does not look exactly like the screenshot in your head.
Day 1: Issues and Collaboration
10. Episode 5: Working with Issues
Filing, searching, filtering, commenting on, and managing GitHub issues.
Based on: Chapter 5: Working with Issues
Read Transcript - Episode 5: Working with Issues
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.
11. Challenge 02: File Your First Issue
Finding a TODO, creating a clear issue, and explaining what needs to change.
Practice focus: Day 1 foundation
Read Transcript - Challenge 02: File Your First Issue
Transcript
Alex: Welcome back. Today is Challenge 2: File Your First Issue. You are going to find a TODO in `docs/welcome.md`, create a GitHub issue about it, and explain what needs to change clearly enough that someone else could act on it.
Jamie: I like that this starts with noticing, not coding. A TODO is basically the repository saying, "something belongs here, but it is not done yet."
Alex: Exactly. A GitHub issue is a conversation thread attached to a repository. Teams use issues to track bugs, chores, questions, feature ideas, accessibility barriers, and work that needs a decision before anyone edits files.
Jamie: So in this challenge, the issue is the work product. No branch, no commit, no pull request yet.
Alex: You are working in your private Learning Room repository for Day 1. That repository is where the early contribution path happens: issue, later branch, later commit, later pull request, and eventually a merge when you are ready.
Jamie: And for this specific challenge, everything happens on GitHub.com in the browser, mostly in the Issues tab.
Alex: Right. Start by opening `docs/welcome.md`. Find a line containing `TODO`; if you want the fastest route, use your browser's find command, Ctrl+F on Windows or Cmd+F on Mac, and search for `TODO`.
Jamie: What if I find more than one TODO, or the text is slightly different from the example?
Alex: Pick the TODO that is present in your repository and quote the exact text you found. The examples are models, not something you have to copy word for word.
Jamie: Then I go to Issues and choose New issue, right?
Alex: Yes. From the repository page, open the Issues tab. GitHub keyboard shortcuts may let you press G then I to jump there, or you can move through the repository navigation until you hear or see "Issues." Activate New issue, and if a template picker appears, choose a fitting template or open a blank issue.
Jamie: The title is the first place people get nervous. The challenge even says not to write "Fix TODO," which is painfully relatable.
Alex: A useful title says what file or area is involved and what kind of change is needed. Instead of "Fix TODO," try something like "Replace TODO in welcome.md intro with workshop welcome text" or "welcome.md placeholder needs real contributor context."
Jamie: That way someone scanning the issue list can understand the topic without opening every issue.
Alex: Exactly. In the body, this challenge asks for a very specific structure: `What:`, `Where:`, `Why:`, and `TODO found:`. The `Where:` line must include `docs/welcome.md`, and the `TODO found:` line should include the exact TODO text you discovered.
Jamie: So a strong body might say, `What: Replace the placeholder TODO with real welcome text.` Then `Where: docs/welcome.md, intro section.` Then `Why: New contributors need clear context when they open the file.`
Alex: Yes, and then `TODO found: TODO: Add a short workshop welcome paragraph.` Use the TODO text from your own file if it differs. That gives the reader the problem, the location, the reason, and the evidence.
Jamie: The solution examples also show two styles: a bug report and a feature request. Are both okay here?
Alex: They are both valid ways to write issues. A bug report style works when something expected is broken or missing, while a feature request style works when you are proposing an improvement. For Challenge 2, just make sure your issue is grounded in the TODO from `docs/welcome.md` and is clear enough for another person to fix.
Jamie: Let's talk about finding your way around the Issues pages, because that is where a lot of people lose time.
Alex: On the Issues list, the page has repository navigation, filters, a search or filter bar, issue rows, and the New issue button. With NVDA, Browse Mode is usually best for reading headings, links, issue titles, and page structure; switch to Focus Mode when you are typing in fields or search boxes. NVDA+F7 can open a list of headings, links, form fields, buttons, and landmarks, which is useful when the page feels busy.
Jamie: What gets announced for each issue in the list?
Alex: Usually you can learn the title, issue number, open or closed status, labels if present, author, comment count, and recent activity. Moving by heading level 3 can jump between issue titles faster than reading every control on the page.
Jamie: And low-vision learners should know that the New issue button is usually prominent near the top of the Issues page. At high zoom, the title field and body field are still large targets, but you may need to scroll more.
Alex: After you submit, GitHub opens the new issue page. The title should be the first main heading, the issue number appears in the page and URL, and the body should render as readable Markdown. Take a moment to confirm the title and body match what you meant to submit.
Jamie: Challenge 2 also includes a peer simulation check. That is easy to skip, but it is part of the communication practice.
Alex: Open the issue named "Peer Simulation: Welcome Link Needs Context" and leave a comment about whether the title is clear. Ask yourself, could I tell what needs fixing just from the title? If your facilitator gives you access to a real buddy repository, you may review your buddy's issue instead.
Jamie: This connects to Challenge 3 too, where learners comment on someone else's issue and use an @mention.
Alex: Right. An @mention is `@` followed by a username, and it sends that person a notification. A good comment is focused and helpful, such as `@classmate I can confirm this link goes to a 404 page` or `@classmate I would add the paragraph after the Who Can Contribute heading.`
Jamie: And the comment box supports Markdown, so you can use code ticks for file names, short lists, and links when that helps.
Alex: You can also cross-reference issues. In the same repository, typing something like `#150` links to issue 150. In some cases you can reference work in another repository too, but keep it simple here: copy the issue URL or note the issue number because you will use it as evidence.
Jamie: Once issues start piling up, the list can get noisy. What should learners know about filtering and searching?
Alex: The search and filter bar lets you narrow the list. Useful queries include `is:open`, `is:closed`, `author:USERNAME`, `assignee:@me`, `label:bug`, `label:good-first-issue`, and words from the title or body. You can combine filters, like `is:open label:bug`, to reduce the list to exactly what you need.
Jamie: There are also filter buttons for labels, milestones, assignees, and open versus closed state, depending on the repository.
Alex: Yes. Labels are short tags, milestones group work toward a goal, and assignees show who is responsible. The `good first issue` label is commonly used in open source to mark issues that are suitable for newcomers.
Jamie: When I open an issue, I should read the description first, then comments and activity, not jump straight to responding.
Alex: Exactly. The issue page usually starts with the title, then the original description, then discussion and activity. Maintainers may close an issue, close it with a reason, reopen it, assign it, add or remove labels, set a milestone, transfer it, or delete it when appropriate. You will not need most of those powers for Challenge 2, but recognizing the controls helps you understand real project workflow.
Jamie: Some learners prefer the terminal. Is there a safe way to do this from a clone?
Alex: Yes, if you already have the repository cloned and GitHub CLI installed. First confirm where you are with `git remote -v` and `gh repo view`. That prevents filing an issue in the wrong repository.
Jamie: Then read before writing.
Alex: Exactly. `gh issue list --assignee @me` can show issues assigned to you, and `gh issue view NUMBER` shows a specific issue with the Markdown rendered in the terminal. If you want only the comments, GitHub CLI has documented options, and `gh issue view --help` will show the current supported flags.
Jamie: For commenting, I can use `gh issue comment NUMBER` and let it open my default editor, or provide the body inline if I know exactly what I want to say.
Alex: And to create an issue, `gh issue create` can prompt you for title, body, labels, and assignees. You can also pass details inline with options like `--title`, `--body`, and `--label`. After any terminal action, check the command output and then view the issue so you know it landed where you intended.
Jamie: The chapter also mentions sub-issues. Are those part of this challenge?
Alex: They are an optional extension, not required for Challenge 2. A sub-issue is a smaller issue nested under a parent issue, useful when a big task needs separate trackable pieces. For example, a parent issue about improving `welcome.md` might have one sub-issue for adding a welcome paragraph and another for fixing a link.
Jamie: How is that different from a task list in a comment?
Alex: A task list is a checklist inside one issue or comment. A sub-issue is its own issue, with its own title, description, status, discussion, and sometimes its own assignee. If sub-issues are enabled in your repository, you may see an Add sub-issue or Create sub-issue control on the parent issue.
Jamie: And to finish the chapter work, evidence matters.
Alex: For Challenge 2, go back to your assigned challenge issue and paste the URL of the issue you created. Also explain what TODO you found and what title you used. If you are also doing the Chapter 5 pair of challenges, your evidence can include the issue you created, the issue where you commented with an @mention, and any optional sub-issue you added.
Jamie: What are the common stuck spots?
Alex: If you cannot find the TODO, open `docs/welcome.md` and search for `TODO` with Ctrl+F or Cmd+F. If you are not sure what to write, describe the problem to someone who has never opened the file: what is missing, where it is, and why it matters. If the New issue button is not visible, make sure you are on the Issues tab, and if issues appear disabled, ask your facilitator.
Jamie: And if I want to check whether my issue is strong, I should look for a clear title, enough context, and a reproducible location.
Alex: Yes. A vague issue says, "Bug" or "Update file." A clear issue says what is wrong, names `docs/welcome.md`, includes the TODO text, and explains the value of fixing it. Accessibility issues especially benefit from details like what happened, what you expected, how to reproduce it, environment details such as browser or assistive technology, and any extra context.
Jamie: Where should learners go when they need the current source of truth?
Alex: Use the official GitHub documentation about issues, the GitHub Accessibility Guide for working with issues, the GitHub Accessibility Lab CLI guide, and the GitHub changelog when interface behavior changes. The workshop chapter and its learning cards are your guided path, but official references are where you confirm current product details.
Jamie: So the practical goal is simple: find the TODO, file a clear issue, verify it appears, review a peer or simulation issue, and submit your evidence. That is a real open source communication skill before any code changes happen.
12. Challenge 03: Join the Conversation
Comments, mentions, reactions, and constructive peer communication.
Practice focus: Day 1 foundation
Read Transcript - Challenge 03: Join the Conversation
Transcript
Alex: Welcome back. Challenge 03 is called Join the Conversation, and it is the first time Day 1 asks you to participate in someone else's GitHub issue thread.
Jamie: This is comments, mentions, and reactions, right? The social parts of GitHub that can feel small until you actually need them.
Alex: Exactly. You are going to open a peer-simulation issue, leave a meaningful comment, use an @mention, and add a reaction to the original issue.
Jamie: So we are not editing files yet. We are practicing how collaboration sounds on GitHub.
Alex: Right. No branch, no commit, no pull request for this challenge. Your work happens in the issue conversation, and your evidence is the URL of the comment you posted.
Jamie: Where are learners doing this? Is it still the Day 1 repository?
Alex: Yes. You are in your Learning Room repository, the private repository provisioned for you for Day 1. That is where the early contribution path happens: issue, branch, commit, pull request, and merge, one skill at a time.
Jamie: And Challenge 03 comes after filing your first issue in Challenge 02.
Alex: Yes. Challenge 02 gets you comfortable creating an issue with a clear title and body. Challenge 03 shifts from filing your own report to joining a conversation around someone else's report.
Jamie: The classroom setup also says the Student Progression Bot opens the next challenge when you close the current challenge issue.
Alex: That is the normal flow. Complete the challenge, add the requested evidence, and close the assigned challenge issue when you are done. If anything is different for your cohort, follow your facilitator's instructions.
Jamie: Good. So learners should not go hunting for branches or files during this one.
Alex: Correct. Chapter 5 is issue practice. File editing starts later.
Alex: Start from your Learning Room repository page and open the Issues tab. If GitHub keyboard shortcuts are active for you, pressing G and then I can take you there.
Jamie: And if that shortcut does nothing, it is not a failure. Just use the repository navigation and find Issues.
Alex: Exactly. On the Issues page, you are looking for an issue titled Peer Simulation: Welcome Link Needs Context. If your facilitator assigned a real buddy repository, you may use your buddy's Challenge 02 issue instead.
Jamie: What if the peer-simulation issue is not obvious in the list?
Alex: Use the filter bar or the label filters and look for the peer-simulation label. You can also check whether you are viewing open issues, because closed issues may be hidden depending on the current filter.
Jamie: And a direct link from the facilitator is fine too.
Alex: Definitely. The important part is that you open the issue, read it, and respond to what it actually says.
Jamie: Let's make sure the word issue is clear. What is a GitHub issue, in plain language?
Alex: A GitHub issue is a trackable conversation about work. It might describe a bug, a missing document, an accessibility barrier, a question, or a feature request.
Jamie: So it is not just a complaint box.
Alex: Right. A good issue gives the team something they can act on. It usually includes what happened, what was expected, where it happened, and any useful context.
Jamie: What does the Issues list feel like with a screen reader?
Alex: You will usually hear a list of issue titles, status information such as open or closed, labels, authors, comment counts, and timestamps. Many learners move by headings to jump between issue titles more quickly than arrowing through every item.
Jamie: And NVDA users may switch modes depending on what they are doing.
Alex: Yes. Browse Mode is useful for reading headings, links, and issue text. Focus Mode is useful when you are typing into the search box or comment box. NVDA plus F7 can also open a list of headings, links, form fields, buttons, and landmarks when you need to re-orient.
Jamie: Low-vision learners should also know that zoom can change layout, but the pieces are still there.
Alex: Exactly. Look for the Issues tab, the search or filter bar near the top, the open and closed filters, and then the issue titles. At high zoom, some navigation may wrap or move, so use page search if you need to find the word Issues or the issue title.
Alex: Once the peer issue is open, read the description before you type. Your comment should respond to the specific situation, not just say that you agree.
Jamie: What would a strong comment sound like here?
Alex: Something like: @gandalf-bot Good catch on the missing context in welcome.md. I found the same issue near the welcome link, and I think adding one sentence that explains where the link goes would help new readers.
Jamie: That gives a location, confirms the observation, and suggests a possible fix.
Alex: Yes. You could also ask a clarifying question. For example: @gandalf-bot Is the goal to explain the link before the user opens it, or should the link text itself be more descriptive?
Jamie: That is much more helpful than a bare plus one.
Alex: Exactly. A good comment is specific, encouraging, constructive, and actionable. It helps the next person decide what to do.
Jamie: Let's slow down on @mentions, because that little symbol can be stressful the first time.
Alex: An @mention is the at sign followed immediately by a GitHub username, with no space. GitHub turns it into a link and usually sends that person a notification.
Jamie: For the simulation, the username is @gandalf-bot.
Alex: Yes. If you are using a real buddy repository, mention your buddy's exact username instead. Spelling matters, and the username must match exactly.
Jamie: So @ space gandalf-bot will not work.
Alex: Right. There should be no space between the @ and the username. After you post, check that the mention renders as a clickable link in the comment.
Jamie: And the reason is not just technical. You are signaling who should see the message.
Alex: Exactly. In open source, people often work in different time zones and read threads later. Mentions help route attention without needing everyone in the room at the same time.
Alex: The challenge also asks you to add a reaction to the original issue.
Jamie: Like a thumbs up, hooray, or heart?
Alex: Yes. Reactions are lightweight signals. They can acknowledge an issue, show agreement, or thank someone without adding another comment that says the same thing.
Jamie: How do I add one if I am using a screen reader?
Alex: Look near the issue description or comment for the button labeled Add reaction. Activate it, choose the reaction you want, and then confirm that the reaction count or icon appears.
Jamie: Is a reaction alone enough for Challenge 03?
Alex: No. The required evidence is a thoughtful comment with an @mention. The reaction is an additional collaboration feature you are practicing.
Jamie: The challenge form asks for evidence. What should go there?
Alex: Paste the URL of the comment you left on the peer-simulation issue or buddy issue. You can also add a short note such as: I commented on the peer-simulation issue about the welcome link, and I added a reaction to the original issue.
Jamie: How do you get a direct comment URL?
Alex: Each comment has a timestamp or a small menu that can lead to a link for that comment. If that is hard to find, copy the issue URL and describe which comment is yours, but a direct comment link is best when you can get it.
Jamie: And there is a peer check too.
Alex: Yes. If your facilitator gave you a real buddy, check whether they commented on your issue and reply. If you are using the simulation, reply to Gandalf or to your own peer-simulation comment with one follow-up thought.
Jamie: So completion is not about writing a perfect paragraph.
Alex: Right. One thoughtful comment with an @mention is enough evidence, as long as it actually participates in the conversation.
Alex: The culture behind this matters. Open source communication is usually written, asynchronous, and visible to more people than the two people talking.
Jamie: Which means tone has to do extra work, because nobody can hear your facial expression.
Alex: Exactly. Helpful feedback often starts by acknowledging what is working, then identifies a specific concern, explains why it matters, and suggests a path forward when possible.
Jamie: Can you give a tiny example?
Alex: Sure. Instead of saying, You wrote this wrong, try: The current link text may be hard to understand out of context. Could we make it more descriptive, such as Read the setup guide?
Jamie: That comments on the content, not the person.
Alex: Yes. Use we when it fits, describe the code or documentation instead of the author, and use tentative language when you are not sure. Words like might, could, and I think can make room for discussion.
Jamie: And do not pile on.
Alex: Right. If someone has already made the same point, a reaction may be better than repeating the criticism. Keep comments focused, and if a thread has been resolved, avoid reopening it unless there is new information.
Jamie: Saved replies can help too, right?
Alex: They can. A saved reply is a reusable comment snippet. For accessibility work, you might save a respectful template for asking for steps to reproduce, assistive technology details, browser version, or expected behavior.
Jamie: What if someone disagrees with my comment?
Alex: That is normal. Say thanks, clarify your reasoning, and be willing to adjust. A good thread can include disagreement without becoming personal.
Jamie: And if feedback feels harsh?
Alex: Pause before replying. Look for the useful information inside the message, ask a clarifying question if needed, and involve a facilitator or maintainer if the behavior crosses a line.
Jamie: What if I realize my own comment sounded blunt?
Alex: Own it plainly. You can say, I see that my wording came across stronger than I meant. Let me restate: I think the link text could be clearer for screen reader users.
Jamie: That is a very real open source skill.
Alex: It is. Respectful repair keeps collaboration moving.
Alex: If you prefer the terminal, the GitHub CLI can handle issue work too.
Jamie: What would that look like for this challenge?
Alex: First confirm you are in the right repository with commands such as git remote -v and gh repo view. Then read before writing with gh issue view followed by the issue number.
Jamie: And commenting?
Alex: You can use gh issue comment with the issue number. Some people let it open their editor, and others provide the comment text inline. Either way, keep the comment focused and verify from the command output or by viewing the issue again.
Jamie: Can the CLI create issues too?
Alex: Yes, gh issue create can prompt for title, body, labels, and assignees, or accept them inline. For Challenge 03, though, the main CLI task would be reading an existing issue and leaving a comment.
Jamie: Let me rehearse the whole thing. Open Issues, find the peer-simulation or buddy issue, read it, comment with a specific point and an @mention, add a reaction, then paste the comment URL as evidence.
Alex: That is it. If you cannot find the issue, filter by the peer-simulation label or ask your facilitator for the link.
Jamie: If the mention does not work, check for a space after the @ and check the username spelling.
Alex: And if you cannot find reactions, look for the Add reaction button near the issue text or comment. Screen readers should hear that label.
Jamie: I like that this challenge is small, but it is not trivial.
Alex: Exactly. You are practicing how real collaboration begins: read carefully, respond clearly, notify the right person, and leave a trace that someone else can follow.
13. Episode 22: GitHub Flavored Markdown
Markdown syntax, GitHub extensions, and writing accessible documentation.
Based on: Appendix C: GitHub Flavored Markdown
Read Transcript - Episode 22: GitHub Flavored Markdown
Transcript
Alex: Welcome back. Today we're talking about Markdown, which is one of those skills that shows up everywhere on GitHub: README files, issues, pull requests, comments, wikis, and documentation.
Jamie: And it can look a little strange at first. You see a pound sign before a heading, stars around words, brackets and parentheses for links, and it feels like a tiny code language.
Alex: That's a fair reaction. Markdown is lightweight text formatting. You type plain text with simple punctuation, and GitHub turns it into structured content like headings, lists, links, tables, code blocks, and images.
Jamie: So it's not programming, but it does have syntax. The punctuation tells GitHub how to display the text.
Alex: Exactly. John Gruber created Markdown in 2004 with the goal of keeping writing easy to read as plain text. Under the surface, Markdown becomes HTML, so `**bold**` becomes strong text, and `# Heading` becomes a real heading in the rendered page.
Jamie: Where will learners actually use this during the workshop?
Alex: Almost everywhere. On Day 1, the Learning Room repository is full of Markdown: challenge descriptions, welcome files, issue bodies, pull request descriptions, review comments, and README files. On Day 2, you'll see Markdown in VS Code, in issue templates, in Copilot responses, and in reports from accessibility agents.
Jamie: That makes the Learning Room connection feel important. When someone fixes a link in `docs/welcome.md`, writes an issue, or adds alt text to an image, they're practicing Markdown, not just completing a random task.
Alex: Right. And the reference is designed so you can use it in different ways. If you're new, read from the beginning. If you already know the basics, use the table of contents, heading navigation, or Ctrl+F to jump to the thing you need.
Jamie: I also like that the guide shows raw Markdown, the rendered result, and notes about screen reader behavior. That helps you understand both what you type and what someone experiences after GitHub renders it.
Alex: For practice, you can use a GitHub issue on Day 1, any `.md` file in VS Code on Day 2, or a GitHub Gist if you want a quick scratch space. And Bonus Challenge B, Document Your Journey, is a natural place to apply this because you're writing reflective documentation, portfolio language, and accessible Markdown.
Alex: Let's start with the writing basics. A paragraph in Markdown is just text separated from the next paragraph by a blank line.
Jamie: That blank line matters more than people expect. If I write two lines right next to each other, GitHub may treat them as one paragraph instead of two separate thoughts.
Alex: Yes. If you need a line break inside the same paragraph, Markdown has ways to do it, but most documentation is clearer when you use separate paragraphs. Then headings give the page structure: one `#` for level 1, two `##` for level 2, all the way down to six `######` for level 6.
Jamie: And the levels aren't just visual size. A screen reader can use headings as a map of the page.
Alex: Exactly. Use one main heading for the document, then move in order. Don't jump from level 1 straight to level 4 because you like how it looks. Also avoid the older underline style for headings, because the hash mark style is clearer and more consistent.
Jamie: What about bold and italic?
Alex: Use `**bold**` for strong emphasis, `*italic*` for gentle emphasis, and three stars for bold italic. Use emphasis sparingly, because if everything is emphasized, nothing stands out. GitHub also supports strikethrough with two tildes on each side, which is useful for showing removed text or completed ideas without deleting the history.
Jamie: Lists are another place where Markdown feels friendly. A dash, star, or plus can make an unordered list, and numbers make an ordered list.
Alex: Yes, and GitHub will renumber ordered lists when they render, so many writers just type `1.` for each item. You can also start a numbered list at a specific number when that matters. For nested lists, indent the child items so GitHub understands they belong under the parent item.
Jamie: Mixed lists are useful too. Like a numbered setup process where one step has a few bullet reminders underneath it.
Alex: Exactly. You can also put extra paragraphs, code blocks, or quotes inside list items if you indent them correctly. And a few smaller tools round this out: blockquotes use the greater-than sign, horizontal rules can visually separate major breaks, and a backslash can escape special characters when you want Markdown punctuation to appear literally.
Jamie: Links are where I see a lot of accessibility problems. The syntax is simple, but the writing choice matters.
Alex: The basic pattern is `[link text](URL)`. You can add optional title text, but don't depend on it because not everyone will encounter it. The link text itself should say where the link goes or what it does.
Jamie: So not `click here` or `read more` when the page has ten links like that.
Alex: Right. Write something like `Read the pull request review guide` or `Open the WCAG overview`. Reference-style links are helpful in longer documents because the sentence stays clean and the URL definitions live elsewhere. Relative links are great inside a repository because you can link to `docs/setup.md` without writing the full web address.
Jamie: And GitHub can also autolink some things, right?
Alex: Yes. Plain URLs often become links automatically, and email addresses can be written as mail links. But even when autolinks work, descriptive link text is usually easier to understand.
Jamie: Images use a similar pattern, but with an exclamation point at the front.
Alex: Exactly: exclamation point, square brackets for alt text, then parentheses for the image path or URL. The alt text should describe the meaningful content or purpose of the image. If the image shows a screenshot of a failed test, say what failed and where, not just `screenshot`.
Jamie: What if the image is complicated, like a full architecture diagram or a workflow chart?
Alex: Then short alt text is not enough. Give the image a useful alt text summary, and add a longer explanation nearby, often in the surrounding paragraph or a collapsible details section. Images can also be links, and they can have title text, but again, the core information needs to be available in normal text.
Jamie: Code formatting is another big part of GitHub writing. What's the difference between inline code and a code block?
Alex: Inline code uses single backticks around a short item, like a file name, command, variable, or branch name. For example, you might write `README.md` or `git status` inside a sentence. A fenced code block uses triple backticks before and after a larger example.
Jamie: And after the opening triple backticks, you can add a language name for syntax highlighting.
Alex: Yes. `python`, `javascript`, `bash`, `yaml`, `json`, `markdown`, and `diff` are common examples. The language label helps sighted readers because GitHub colors the code, and it also tells future maintainers what kind of example they're looking at.
Jamie: But a screen reader won't necessarily benefit from the colors.
Alex: Right, so the explanation before the code block still matters. If you're showing a diff, say what changed. If the code block is inside a list item, indent it so the list structure stays intact. And if you need to show literal backticks, use a longer run of backticks around the example.
Jamie: Tables are useful, but they can become hard to navigate.
Alex: A Markdown table uses pipes between columns and a separator row under the header. Colons in that separator row control left, right, or center alignment. You can format text inside cells, but keep the table simple.
Jamie: So a table is good for comparing a few related values, not for building a whole page layout.
Alex: Exactly. Introduce the table before it appears, give every column a clear header, and don't bury complex paragraphs inside cells. If the information reads better as a list, use a list.
Alex: GitHub Flavored Markdown, often shortened to GFM, is Markdown plus GitHub-specific features. It works across many GitHub surfaces, including issues, pull requests, comments, discussions, README files, and other rendered Markdown files.
Jamie: One of the most visible GFM features is the alert block. Those are the callouts like note, tip, important, warning, and caution.
Alex: Yes. They use a blockquote style with a bracketed label, like `[!NOTE]`, followed by the alert text. Choose the type based on meaning: a note adds context, a tip helps someone succeed, important marks something they should not miss, warning points to a possible problem, and caution is for serious risk.
Jamie: And don't use a warning just because it looks dramatic.
Alex: Please don't. Screen readers can encounter the label text, but color and icons are not enough. The words in the alert need to carry the message on their own.
Jamie: The guide also covers collapsible sections with `details` and `summary`. Those are HTML elements, right?
Alex: They are, and GitHub allows them. They're useful for long examples, optional troubleshooting, or extra notes that would otherwise interrupt the flow. The summary should be descriptive, and the content inside still needs proper Markdown spacing. You can nest them, and you can make one start open, but don't hide essential instructions where people might miss them.
Jamie: Task lists feel especially GitHub-y. A dash, a space, then `[ ]` for an incomplete checkbox, or `[x]` for a completed one.
Alex: Exactly. In issues and pull requests, task lists become interactive checkboxes, which makes them great for pre-review checklists. A screen reader user should hear them as checkbox items, so each item needs a clear label like `Update alt text for hero image`, not just `Done`.
Jamie: Mermaid diagrams are powerful, but I always get nervous about accessibility there.
Alex: That's the right instinct. GitHub can render Mermaid code blocks into diagrams such as flowcharts, sequence diagrams, class diagrams, state diagrams, and timelines. But the rendered diagram may not provide enough information to assistive technology users.
Jamie: So if you use Mermaid, write a text equivalent too.
Alex: Yes. Introduce what the diagram shows, provide the Mermaid block if it helps visual readers, and include a plain-language description of the same relationships or steps. If the diagram communicates a process, write the process as text.
Jamie: The guide also includes math expressions with LaTeX syntax. That's the dollar-sign style, right?
Alex: Right. Inline math can sit inside single dollar signs, and block math can be written as a larger displayed expression. It's useful for formulas, but screen reader support can vary, so explain important equations in words nearby.
Jamie: Footnotes are another GitHub feature people discover later. You put a marker like `[^1]` in the sentence and define the note elsewhere.
Alex: Yes. The identifier can be a number or a word, and GitHub creates links between the marker and the footnote. Multi-line footnotes are possible with indentation. They can be handy for citations or side comments, but too many footnotes can make reading feel jumpy.
Jamie: And headings get automatic anchors, which makes tables of contents possible.
Alex: GitHub turns heading text into an anchor by lowercasing it, replacing spaces with hyphens, and removing many punctuation marks. If there are duplicate headings, GitHub adds a number to later anchors. You can link to a heading in the same file, or to a heading in another file, and you can use those links to build a table of contents.
Jamie: There are also autolinked references, like issue numbers, pull requests, commits, and usernames.
Alex: Exactly. `#12` can link to an issue or pull request, an at-mention can notify a user or team, and a commit hash can link to a commit. Pull requests can also use closing keywords like `Fixes #12` to close an issue when the PR merges. Useful, but be careful with mentions because they can notify real people.
Jamie: And GitHub allows some HTML inside Markdown.
Alex: A limited, safer subset. You might see `kbd` for keyboard keys, subscript and superscript tags, line breaks, comments that stay hidden in the rendered page, or `details` and `summary`. But unsafe HTML, scripts, and many styling tricks are stripped or ignored, so use HTML only when Markdown cannot do the job clearly.
Jamie: Can we pull the screen reader behavior together? Because this is where Markdown stops being just formatting.
Alex: Rendered Markdown becomes structured HTML. Headings become navigable headings, lists become real lists, links become links, images expose alt text, tables expose rows and columns, and code blocks are read as code-like text. Good Markdown gives assistive technology useful structure to work with.
Jamie: And weak Markdown removes that structure. Like using bold text as a fake heading.
Alex: Exactly. Common mistakes include forgetting blank lines between paragraphs, skipping heading levels, writing generic link text, leaving image alt text empty when the image has meaning, using bold instead of headings, and dropping in a table without explaining what it contains.
Jamie: The more advanced mistakes matter too: code blocks without language identifiers, inconsistent list markers, Mermaid diagrams without text equivalents, and alert blocks with the wrong type.
Alex: A good authoring checklist is simple to remember. Use real headings in order, write clear paragraphs, make links descriptive, give meaningful images useful alt text, keep lists and tables readable, label code blocks, and use GFM features because they help the reader, not because they look fancy.
Jamie: That checklist also supports portfolio writing. If you're documenting your journey in Bonus Challenge B, accessible Markdown makes your work easier for reviewers, maintainers, and future collaborators to read.
Jamie: The guide ends with a first real Markdown document exercise, which feels like a good low-pressure way to practice.
Alex: It is. You create a short document with a main heading like `About Me`, an introduction, a section about what you want to learn, a setup section that uses emphasis and inline code, a favorite resource with a link and blockquote, a tools table, a workshop checklist, and a collapsible notes section.
Jamie: So by the time you're done, you've touched headings, paragraphs, lists, emphasis, code, links, quotes, tables, task lists, and details sections in one document.
Alex: Exactly. You're done when the file renders clearly, the heading structure makes sense, the links have meaningful text, images if any have alt text, the table has clear headers, and the checklist items are understandable on their own.
Jamie: And then the quick-reference card is there for everyday use: basic formatting, headings, lists, links, images, blockquotes, code blocks, tables, horizontal rules, task lists, alerts, collapsible sections, footnotes, anchors, autolinks, math, HTML, and Mermaid with accessible text.
Alex: The official GitHub writing and formatting documentation is the authoritative place to confirm details, but this reference gives you the workshop version: what to type, what GitHub renders, and how to keep the result accessible.
Jamie: Markdown starts small, but it changes how your work lands. A clear issue, a readable pull request, or a polished README can make collaboration feel easier for everyone.
Alex: That's the goal. Write plain text with structure, check the rendered result, and keep the reader's experience in mind.
14. Episode 23: GitHub Gists
Lightweight code sharing: creating, editing, forking, and embedding Gists.
Based on: Appendix U: GitHub Gists
Read Transcript - Episode 23: GitHub Gists
Transcript
Alex: Welcome back. Today we're looking at GitHub Gists, which are one of the lightest ways to share code, notes, examples, and small configuration files.
Jamie: So not a whole project, not a full repository, just a quick shareable thing?
Alex: Exactly. A Gist can hold one file or several files, and each file can have syntax highlighting if GitHub recognizes the extension. It's useful when you want to show a snippet, save a small note, or give someone a reproducible example without creating an entire repo.
Jamie: I like that middle ground. Sometimes an issue comment is too cramped, but a new repository feels like overkill.
Alex: That's where Gists fit nicely. They are small, linkable, and still connected to Git, so you can edit them and keep a history of changes.
Jamie: The appendix that this episode goes with also talks about GitHub Discussions. Before we stay with Gists, can we place Discussions in the workflow?
Alex: Sure. GitHub Discussions is the forum-style area for a repository or an organization. It is where questions, ideas, announcements, polls, and community Q&A can live without turning every conversation into an issue or pull request.
Jamie: So an issue says, there is work to track. A discussion says, let's talk, ask, compare, or decide whether there should be work.
Alex: Right. Use an issue for a bug, a specific feature request, or a task that needs labels, assignees, and closure. Use a discussion for questions, brainstorming, community input, or a topic that may not have one final answer.
Jamie: And the categories help set that expectation before anyone replies.
Alex: They do. Common categories include Q&A for support questions, Ideas for brainstorming, Announcements for maintainer updates, General for everything else, and Show and Tell when community members share what they built.
Jamie: Where does the workshop support hub fit into that?
Alex: For alumni, the Community-Access/support repository is the ongoing support home. Read the pinned Start Here resources in Discussions, search existing threads before starting a new one, and use issues when you have a setup blocker or accessibility blocker that maintainers need to track. In Accessibility Agents work, remember that the catalog grows over time, so Discussions are a good place for questions and ideas, while issues are better for concrete changes.
Jamie: If I'm on a repository page, how do I get to Discussions without hunting around forever?
Alex: Look in the main repository navigation near Code, Issues, Pull Requests, Actions, and Projects. If you use keyboard shortcuts, T can move through tab items, and K can help you find links such as Discussions. If the tab is missing, that usually means the maintainer has not enabled Discussions for that repository.
Jamie: And organizations can have their own Discussions too, right?
Alex: Yes. An organization can host community-wide conversations that are not tied to one repository. On a Discussions home page, categories are usually shown with headings, and a side panel may appear on the left or right depending on the width of the view. That panel can show category counts, pinned items, active discussions, and tags if the project uses them.
Jamie: Creating one sounds similar to opening an issue, but with a category first.
Alex: That's the key difference. Activate New discussion, choose a required category, write a clear searchable title, write the body in Markdown, and start the discussion. For Q&A, phrase the title as a real question, because that title becomes part of how other people search later.
Jamie: What should screen reader users expect in that form?
Alex: The path is usually New discussion, category selection, title field, body editor, and Start discussion. The body editor behaves like an issue comment editor, so enter focus mode when your screen reader needs it, type your content, and Ctrl+Enter can submit. Inside a discussion, replies are often exposed as article elements; NVDA and JAWS users may use A to move among them, while VoiceOver users may prefer headings, links, or the rotor depending on browser setup.
Jamie: And participation is more than just replying at the bottom.
Alex: Yes. You can reply to the main thread, reply to a specific comment with a nested reply, upvote useful posts instead of adding plus-one comments, vote in polls, and, in Q&A threads, the discussion author can mark an accepted answer. Low-vision users may also notice answered badges, percentage bars after poll voting, and success banners that can appear above the current zoom position. If the interface changes, GitHub's own documentation is the reference to check.
Jamie: Okay, back to Gists. If I want to make one from the web, where do I start?
Alex: Go to gist.github.com while signed in. You'll get fields for an optional description, a filename, and the file contents. Name the file with a useful extension, like notes.md, example.py, or config.json, because that helps GitHub choose the right formatting.
Jamie: And then I choose public or secret. This is the part where people can get surprised.
Alex: Yes, and it is important. A public Gist is visible and discoverable. A secret Gist is unlisted, meaning it is not meant to appear in public discovery, but anyone with the link can view it.
Jamie: So secret does not mean private.
Alex: Correct. Don't put passwords, tokens, private keys, personal data, unreleased business information, or anything sensitive in a Gist. Treat secret Gist links as shareable links, not access control.
Jamie: What about multiple files? Can one Gist hold a small example with a script and a README?
Alex: Yes. Use Add file in the web interface and give each file its own name and content. That is handy for a short demo where you want a README, a code file, and maybe a sample output file all traveling together.
Jamie: What if I'm already in the terminal and I don't want to open the browser?
Alex: If you use the GitHub CLI, you can create a Gist with gh gist create. For example, `gh gist create hello.py --public --desc 'small Python example'` creates a public Gist from that file with a short description.
Jamie: And if I want it unlisted instead?
Alex: Use the secret option when you mean unlisted, such as `gh gist create config.json notes.md --secret`. You can pass more than one filename, and the files become part of the same Gist. If you're piping text from another command, give the content a filename so people know what they're reading.
Jamie: After the command runs, how do I know it worked?
Alex: The CLI prints the Gist URL. Open that URL, check the filenames, read the rendered content, and make sure the visibility matches what you intended before sharing it.
Jamie: You said earlier that Gists are connected to Git. Does that mean they have history like repositories?
Alex: They do. A Gist is a Git repository behind the scenes, so edits create revisions. You can edit in the browser, review the revision history, and see what changed over time.
Jamie: Can I clone one locally too?
Alex: Yes. On the Gist page, copy the clone URL, or use the CLI with `gh gist clone` followed by the Gist identifier or URL. Once it's local, you can inspect the files in your editor, make changes, commit, and push if you have permission to update that Gist.
Jamie: And comments live on the Gist page, not in my local clone.
Alex: Right. Gist comments are for discussion around the snippet or note. To add one, open the Gist page, move to the comment editor near the bottom, type your message, and submit it much like an issue comment.
Jamie: Gists also have stars and forks. Are those the same as repository stars and forks?
Alex: Similar idea, smaller scale. Starring a Gist saves or signals appreciation for it. Forking a Gist makes your own copy under your account, so you can modify it without changing the original.
Jamie: But I shouldn't expect the whole repository collaboration system.
Alex: Exactly. A Gist doesn't give you the same project structure, issue tracker, pull request workflow, releases, or automation that a full repository does. It is lightweight sharing, not a complete project home.
Jamie: How do I find my own Gists later?
Alex: Use the Gists area from your GitHub profile, go directly to gist.github.com, or visit gist.github.com followed by your username. Screen reader users can move by headings and links to the Gist list, then open titles. You can also browse public Gists through GitHub's Gist discovery areas or arrive at them through links, search results, and community posts.
Jamie: Embedding sounds useful. What does it mean to embed a Gist in a web page?
Alex: It means placing the Gist content inside another page, usually a blog post, lesson, or documentation page. On the Gist page, GitHub provides an embed script you can copy and paste into an HTML page.
Jamie: So the page shows the snippet without me re-copying all the code by hand.
Alex: Yes, and if you update the Gist, the embedded version can reflect that update. For accessibility, don't rely only on the embedded script. Add a short plain-language summary and a direct link to the Gist, so people have another route if scripts are blocked, slow, or awkward with their setup.
Jamie: Give me a few situations where a Gist is the right tool.
Alex: A good one is sharing screen reader configuration notes, like NVDA settings for GitHub web navigation. Another is a quick Markdown note, such as Workshop Day 1 notes, where the content is useful but not a project. A third is a code snippet for an answer on Stack Overflow or in a support thread.
Jamie: And when should I stop and make a real repository instead?
Alex: Use a repository when the work has a project shape: a README, folders, tests, issues, pull requests, releases, permissions, or ongoing collaboration. Use a Gist when the work is small, self-contained, and easy to understand as a snippet or note.
Jamie: So a Gist is great for showing a pattern. A repository is better for maintaining a thing.
Alex: Nicely put. If you expect other people to file bugs, propose changes, run workflows, or follow a roadmap, give the work a repository.
Jamie: Let's end with the safety check, because secret Gists can sound safer than they are.
Alex: They can, and the rule is simple: never put sensitive data in Gists. Public Gists are discoverable. Secret Gists are link-accessible. Neither one is a password vault.
Jamie: If I accidentally put a token in a Gist and then delete the Gist, am I safe?
Alex: No. If a secret or public value was exposed, rotate or revoke it as soon as possible. Deleting the Gist removes the page from your account, but you cannot assume nobody copied the content, cached it, or followed the link while it existed.
Jamie: How do I delete one when I really do want it gone?
Alex: Open the Gist, find its delete control, confirm the deletion, and then verify it no longer appears in your Gists list. For routine cleanup, that's enough. For leaked secrets, cleanup is only the first step; revocation is the real fix.
Jamie: So the everyday workflow is: use Gists for small shareable material, be clear about visibility, and move to a repository when the work needs a real home.
Alex: Exactly. Gists are small, but they're not throwaway. Used well, they make examples easier to share, easier to revise, and easier for someone else to understand.
15. Episode 24: GitHub Discussions
Forum-style conversations, Q&A, polls, and navigation with screen readers.
Based on: Appendix U: GitHub Discussions
Read Transcript - Episode 24: GitHub Discussions
Transcript
Alex: Welcome back. Today we're talking about GitHub Discussions, which is GitHub's built-in forum space for a repository or an organization.
Jamie: So not an issue, not a pull request, but still part of the project conversation.
Alex: Exactly. Discussions are for threaded community conversations: questions, ideas, announcements, polls, and show-and-tell posts. They sit beside the more action-focused tools, so the community can talk without turning every question into a task.
Jamie: I like that distinction, because a lot of people hesitate before posting. They wonder, am I making work for someone just by asking this?
Alex: And Discussions gives you a softer place to ask, explore, and learn. It is still public project communication, but it does not carry the same meaning as opening an issue or proposing code.
Jamie: Okay, so when do I use Discussions, when do I use Issues, and when do I use a pull request?
Alex: Use an issue when there is trackable work: a bug, a setup blocker, an accessibility barrier, or a specific feature request. Use a discussion when you have a question, want community input, or want to brainstorm before deciding what work should exist. Use a pull request when you are proposing an actual change to files.
Jamie: So if I ask, "How does this agent work with my screen reader setup?" that sounds like a discussion. If I say, "This button has no accessible name," that sounds like an issue.
Alex: Yes. And if you have already changed the code or documentation to fix that button label, then a pull request is the right container for the proposed fix.
Jamie: What kinds of discussion categories should learners expect to hear about?
Alex: Common ones are Q&A for support questions, Ideas for brainstorming, Announcements for maintainer updates, General for open conversation, and Show and Tell for sharing what you built. Q&A is special because one reply can be marked as the accepted answer.
Jamie: That accepted answer part is helpful. It means the thread can stay conversational, but someone can still find the answer quickly later.
Alex: Right. And for workshop alumni, the support hub is a good example of this split. The support home points you to Discussions for community Q&A, and to Issues for trackable support requests like setup blockers or accessibility blockers.
Jamie: Before posting there, read the pinned Start Here resources and search existing discussions. That saves everyone from having the same conversation five times.
Alex: To find Discussions from a repository, open the repository and move through the main navigation where you hear Code, Issues, Pull Requests, Actions, Projects, and sometimes Discussions.
Jamie: And sometimes you will not hear Discussions at all.
Alex: Correct. Discussions is optional. If the tab is missing, that usually means the maintainer has not enabled it for that repository.
Jamie: What about big communities that are not centered on one repository?
Alex: Organizations can have Discussions too. Those live at the organization level, so they are community-wide conversations instead of conversations tied to one repo.
Jamie: So a repo Discussion is about that project, while an organization Discussion might be about the wider community, support process, roadmap, or shared practice.
Alex: Once you land on the Discussions page, categories become your map. Each category acts like a section, and each one can contain many threads.
Jamie: This is where low-vision learners may notice the layout shifting, right?
Alex: Yes. The category panel may appear on the left or right depending on the width of the window and zoom level. It usually shows category names with item counts, pinned posts or announcements, active discussions, and sometimes tags.
Jamie: Those counts are not just decoration. They help you tell where the activity is.
Alex: For keyboard browsing, heading navigation is useful because category names are headings. You can also use link navigation to move through discussion titles, then press Enter to open the thread you want.
Jamie: And if a screen reader has a quick key for tabs or links, the Discussions tab itself is reachable from the repository navigation without needing to visually scan the page.
Alex: Creating a discussion starts from the Discussions tab. Activate the "New discussion" button, then choose a category.
Jamie: The category comes first because it changes the kind of conversation you are starting.
Alex: Exactly. Pick Q&A for a question, Ideas for brainstorming, General when nothing else fits, and so on. Then write a clear title and a body using Markdown, the same style of editor you use for issues and comments.
Jamie: For Q&A, I would make the title a real question, like "How do I use the daily briefing agent with NVDA?" Not just "Help."
Alex: That is much easier to search later. A screen reader path would be: Tab to "New discussion," press Enter, use the category selector, type the title, move to the body editor, enter focus mode if your screen reader needs it, write the post, then activate "Start discussion."
Jamie: And if Ctrl+Enter submits in that editor, it feels familiar because it matches issue comments.
Alex: After creating the discussion, GitHub may show a success message near the top. If you are zoomed in and do not hear or see confirmation, move back toward the top of the page and check where you landed.
Jamie: Once a discussion exists, what does the page feel like?
Alex: It is similar to an issue page. The original post is at the top, replies follow in order, and the reply editor is usually near the bottom. In Q&A discussions, an accepted answer can also be pinned near the top.
Jamie: So I should not assume the first thing after the original post is just the first reply chronologically.
Alex: Right. If the thread is answered, the accepted answer may appear before the regular timeline so people can get to it quickly.
Jamie: How do you move through replies efficiently?
Alex: Use headings to jump between major parts of the thread, and read down through the content when you find the reply you want. GitHub also marks replies as article elements, so NVDA and JAWS users can often press A to jump between replies.
Jamie: And replying is basically the same as commenting on an issue?
Alex: Yes. Move to the reply editor at the bottom, type your message, and submit. If you want to respond to a specific comment, use that comment's "Reply" button, which opens a nested editor under it.
Jamie: Let's talk about marking answers, because that is one of the big differences between Q&A and a normal conversation.
Alex: In a Q&A discussion, the discussion author or a maintainer can mark a reply as the answer. GitHub then shows the thread as answered, often with a green badge or checkmark, and the accepted answer is easier to find.
Jamie: That helps future readers, but it also helps the person who asked the question close the loop.
Alex: Yes. And if the answer reveals that real work needs to happen, the conversation can move into an issue. Some projects allow maintainers to convert a discussion to an issue, which preserves the context while creating something trackable.
Jamie: So a discussion can be the place where the community figures out what is true, and an issue can be the place where the project tracks what to do about it.
Alex: Exactly. Then a pull request is where someone proposes the file changes that solve the issue.
Jamie: Where do polls fit into all of this?
Alex: Polls are a discussion format for collecting community preference. When you create one, you write a title and prompt, add answer options, and post it so people can vote.
Jamie: So it is not a scientific survey, but it is useful for quick direction.
Alex: Right. After voting, people usually see result bars and percentages for the options. For low-vision users, those bars may use color and fill, so listen for or look for the text percentages too.
Jamie: And upvoting is separate from polls.
Alex: Yes. Use the thumbs-up reaction on a discussion or reply when you agree or want to signal importance. That is much better than posting a comment that only says "+1," because maintainers can often scan or sort by reactions.
Jamie: It keeps the thread readable while still letting the community show what matters to them.
Alex: For screen reader navigation, start by treating the Discussions list like a structured page. Use landmarks to find the main content, headings to move between categories or thread areas, and links to open individual discussions.
Jamie: Inside a discussion, the original post, replies, answer area, and editor each become places to orient from.
Alex: Yes. NVDA users can try A for article navigation between replies, and JAWS users can often do the same. VoiceOver users will usually lean on headings, landmarks, and the VoiceOver rotor to move between controls and page regions.
Jamie: And the tab strip shortcut matters too. If your setup supports it, T can move among tab items, and link navigation can help you find the Discussions link.
Alex: When you reach an editor, remember that typing may require focus mode or forms mode depending on your screen reader. The editor behaves like other GitHub comment boxes, so Markdown, preview, and keyboard submission should feel familiar.
Jamie: How does this connect to the Accessibility Agents work in the curriculum?
Alex: The Accessibility Agents collection is a living catalog, so conversation matters. Challenge 15 is browse-first: learners discover agents and patterns without being required to fork that repository just to complete the challenge.
Jamie: That makes Discussions a natural place for questions like, "Which agent fits this task?" or "Has anyone tried this workflow with my assistive technology?"
Alex: Exactly. Completing Challenge 15 unlocks Challenge 16, the Capstone Project, along with Bonus Challenges A through E as a structured path. The capstone can involve Accessibility Agents, GLOW, or another meaningful repository, and review-ready drafts or contribution plans can count as valid evidence.
Jamie: So Discussions can support planning and feedback, even when the final evidence is not a merged code change.
Alex: Right. And earlier Day 1 contribution practice still happens in the learner's Learning Room repository: issue, branch, commit, pull request, and merge. Discussions does not replace that workflow; it gives the community a better place to talk around it.
Jamie: The appendix also pairs Discussions with Gists. Different tool, but still community content.
Alex: A Gist is a small shareable bundle of one or more files. It is useful for a code snippet, a quick Markdown note, a screen reader configuration example, or a short log you want someone else to inspect.
Jamie: So when would I choose a Gist instead of a repository?
Alex: Use a Gist when the thing is small and self-contained. Use a repository when the work needs project structure: issues, pull requests, branches, documentation, releases, tests, or a longer history of collaboration.
Jamie: Give me the practical creation path.
Alex: Open the Gist page, add a filename, type or paste the content, and choose whether to create a public or secret Gist. If you need more than one file, use the add-file control before creating it. Screen reader users can move by form fields and buttons, and file extensions help GitHub apply the right formatting.
Jamie: And examples would be something like NVDA settings for GitHub web navigation, workshop Day 1 notes, or a code snippet you want to reference in a Stack Overflow answer.
Alex: After a Gist exists, you can edit it, view its revision history, embed it in a web page, clone it with Git, or fork it to make your own copy.
Jamie: Finding your own Gists is usually through your profile or the Gist site, and public Gists can also be discovered through search.
Alex: Yes. Gists can have comments too. Open the Gist, move to the comment editor, type your response, and submit it just like other GitHub comment areas.
Jamie: The privacy part is the one I really want learners to hear clearly.
Alex: Public Gists are visible and can be indexed. Secret Gists are unlisted, but anyone with the link can open them. Never put passwords, tokens, private keys, student data, or sensitive logs in a Gist.
Jamie: Secret does not mean protected. It means hard to find unless someone has the URL.
Alex: Exactly. And if you delete a Gist, treat that as permanent. Before deleting, make sure you have saved anything you still need.
Jamie: For anything that changes over time, check GitHub's current documentation for Discussions and Gists. The interface can shift, but the decision pattern stays pretty stable: talk in Discussions, track work in Issues, propose changes in pull requests, and share small standalone notes in Gists.
Day 1: Pull Requests and Merge Day
16. Episode 6: Working with Pull Requests
Creating, reviewing, commenting on, and merging pull requests.
Based on: Chapter 6: Working with Pull Requests
Read Transcript - Episode 6: Working with Pull Requests
Transcript
Alex: Welcome back. Today we're working with pull requests, which is where a change stops being just your local work and becomes a proposal for a project to accept.
Jamie: So a pull request is not the change itself, exactly. It's the conversation around whether that change should be merged?
Alex: Right. A pull request, or PR, proposes merging changes from one branch into another branch. An issue is usually the problem, request, or task. The PR is the proposed fix, with the files, commits, discussion, checks, and review all gathered in one place.
Jamie: That helps. An issue can say, "This link is broken," and the PR says, "Here is the branch where I fixed that link. Please review it."
Alex: Exactly. In the Day 1 Learning Room repository, which is provisioned for each learner, that sequence becomes very concrete. Challenge 04 has you create a safe working branch, Challenge 05 has you edit a file and write a useful commit message, Challenge 06 has you open your first pull request, and Challenge 09 returns to final readiness, merging, and verifying that the linked issue closed.
Jamie: Before someone starts clicking around, what should they know about the screen reader experience on GitHub PRs?
Alex: GitHub has an accessibility guide for pull requests, and this chapter adds workshop context for NVDA, JAWS, VoiceOver, low vision users, and people who prefer the terminal. One important detail is the newer Files Changed experience. It adds better landmarks for the file tree and diff area, and for many accounts it is already part of the standard interface.
Jamie: And if someone hears about a feature preview toggle, they should not panic if they cannot find it?
Alex: Right. If the user menu still lists "New Files Changed Experience," make sure it is enabled. If it is not listed, that usually means the feature has graduated and is active already. For NVDA, use Browse Mode for reading conversations, headings, and diffs, then switch to Focus Mode with NVDA+Space only when you need to type in a comment box or search field.
Jamie: That is a small thing, but it can save a lot of confusion. Reading mode for reading, typing mode for typing.
Alex: Yes. Also maximize the browser window if you can. GitHub's landmarks and panels are more predictable when the layout is not squeezed.
Alex: In the chapter practice, the first mini challenge is intentionally small: create one branch change. You open your assigned Chapter 6.1 issue in the Learning Room, go to the file it names, and make only the requested edit.
Jamie: Those files are things like the welcome document, the keyboard shortcuts reference, and the setup guide, right?
Alex: Yes. One issue might ask you to replace a TODO in docs/welcome.md. Another might ask you to fix an incorrect shortcut in docs/keyboard-shortcuts.md, or repair a broken link in docs/setup-guide.md. From the web editor, you activate "Edit this file," make the focused change, and then use "Commit changes" to create a new branch such as fix/yourname-issue42.
Jamie: And the branch is short-lived on purpose. It keeps this one fix separate from main and separate from other workshop work.
Alex: Exactly. When GitHub asks, choose to create a new branch for the commit and start a pull request. That takes you to the Open a pull request page, which is where Challenge 6.2 begins.
Jamie: What should someone check before they press the button?
Alex: Check that the base branch is main and the compare branch is your fix branch. Give the PR a clear title, use the template if one is provided, and write a body that says what changed, why it changed, and how someone can test it. Include a line like Closes #42, using your assigned issue number, so GitHub can close the issue automatically when the PR is merged.
Jamie: How does that change if the work comes from a fork instead of a branch in the same repository?
Alex: The idea is the same, but the compare side points to a branch in another repository. In a same-repository PR, both base and compare are inside one repo. In a fork-based PR, your fork supplies the compare branch, and the original project receives the proposal.
Jamie: And if someone is using local Git instead of the web editor?
Alex: Start from main, create a branch with a command like git checkout -b fix/yourname-issue42, edit the file, commit the change, push the branch, and then open the PR. The chapter's terminal guidance is conservative: check your current branch with git branch --show-current, keep one focused change per branch, include the Closes line in plain text, check status with gh pr checks, and use gh pr --help when you need the current options.
Jamie: Once the PR exists, the page can feel busy. What are the important parts?
Alex: A pull request page has a title, a description body, a list of commits, a Files changed view, reviewers, labels, status checks, and a timeline of comments and reviews. Across the top, the main tabs are usually Conversation, Commits, Checks, and Files changed.
Jamie: How do you get to PRs in the first place?
Alex: You might arrive from a notification, which often opens the specific PR directly. You can also open the repository's Pull requests tab, review the list of open PRs, and use filters to narrow by author, label, or review status. In the terminal, gh pr list shows open PRs, gh pr list --search "review-requested:@me" can find reviews assigned to you, gh pr view 42 shows one PR, and gh pr view 42 --web opens it in the browser.
Jamie: The Conversation tab is the front door, then?
Alex: Yes. It starts with the PR description, then shows status checks, comments, review threads, bot messages, and events such as commits being pushed. If a reviewer leaves a threaded comment, the author can reply, make a change, and resolve the conversation when it is handled.
Jamie: What about the Commits and Checks tabs?
Alex: The Commits tab lets you inspect the sequence of commits included in the PR. The Checks tab shows automated results in more detail, such as whether validation, tests, or accessibility checks passed or failed. If a check fails, open its details and read the message before guessing at a fix.
Alex: The Files changed tab is where review becomes concrete. It shows the actual diff, meaning the line-by-line difference between the base branch and the proposed branch.
Jamie: This is where people hear "green plus" and "red minus," right?
Alex: Yes. Additions are usually shown in green with a plus sign, and deletions are usually shown in red with a minus sign. A plus line means the PR adds that line. A minus line means the PR removes that line.
Jamie: And for low vision users, color should not be the only cue.
Alex: Exactly. Use the plus and minus signs, line numbers, file headings, and screen reader announcements. The newer Files changed experience includes landmarks for the file tree and the diff, so you can move between regions instead of reading the whole page from the top every time.
Jamie: How would you place an inline comment on a specific line?
Alex: In Files changed, move to the line you want, find the line comment control, activate it, type your note, and either add it to a pending review or submit it as a single comment, depending on what GitHub offers in that context. For multi-line comments, select the range of changed lines first; on Windows this may involve the line controls plus Shift selection, and on macOS the pattern is similar with VoiceOver interacting with the diff controls. After comments exist, they appear both in the diff and in the Conversation timeline, so you can read them in either place.
Jamie: Reviewing a PR sounds more formal than just leaving a comment. What changes?
Alex: A review can gather multiple inline comments and then submit one overall result. You can request a review from someone in the reviewers area, and when they review, they usually read the description, scan the files changed, inspect the diff, and leave comments on specific lines when needed.
Jamie: And the final review choices are approve, request changes, or comment?
Alex: Right. Approve means the reviewer is satisfied. Request changes means the reviewer believes something must be fixed before merging. Comment means they are giving feedback without a formal yes or no.
Jamie: Can the terminal help with review, or is this browser-only?
Alex: The GitHub CLI can help. gh pr diff 42 shows the diff in the terminal. gh pr review 42 --approve approves, gh pr review 42 --approve -b "Looks good" approves with a comment, gh pr review 42 --request-changes -b "Please fix the link text" requests changes, and gh pr review 42 --comment -b "I left a note" leaves a comment-only review.
Jamie: Where do suggested changes fit?
Alex: A suggested change is best when the reviewer can offer an exact replacement for a small piece of code or text. A regular comment is better for a broader question, design concern, or accessibility issue that needs judgment. As the author, you can apply one suggestion or batch several suggestions into one commit, which keeps the history cleaner.
Jamie: The chapter practice also includes passing required checks. What is the learner looking for there?
Alex: After opening the PR, wait a short time for the validation bot to respond on the Conversation tab. It checks whether the body includes the Closes #XX link, whether the description is detailed enough, whether the changed files are in the expected Learning Room area, and whether basic accessibility rules pass, such as heading order, descriptive link text, and valid alt text.
Jamie: If the bot says something failed, that is not a disaster.
Alex: Not at all. Open the Files changed tab, inspect the file, edit the branch, commit the fix to the same branch, and let the PR update. Then read the new bot comment or run gh pr checks to confirm the required checks pass.
Jamie: So by Challenge 09, readiness is not just "I opened a PR." It is "the PR is reviewable, checks are green, feedback is handled, and the linked issue will close correctly."
Alex: Exactly. A merge-ready PR gives the maintainer enough information to make a decision without chasing missing context.
Alex: Maintainers also choose how a PR gets merged. The three common options are merge commit, squash and merge, and rebase and merge.
Jamie: What is the plain-language difference?
Alex: A merge commit preserves the branch history and adds a merge point, which is useful when the sequence of commits matters. Squash and merge combines all commits in the PR into one commit on main, which is great for small workshop fixes or messy work-in-progress histories. Rebase and merge replays the commits onto main for a linear history, which some projects prefer when each commit is already clean and meaningful.
Jamie: Where do draft PRs fit into that story?
Alex: A draft PR says, "Please look if you want, but this is not ready for final review." Use it when you want early feedback, need checks to run, or want to share progress without asking for approval yet. In the browser, you can create a draft, later mark it ready for review, or convert an open PR back to draft if the project allows it.
Jamie: And the CLI has that too?
Alex: Yes. gh pr create --draft creates a draft PR, gh pr ready marks it ready, gh pr view --json isDraft can confirm the state, and gh pr list --draft lists draft PRs. Auto-merge is another maintainer tool: when it is enabled, GitHub can merge after required reviews and checks pass. You can also cancel auto-merge, and after a PR is merged, many projects delete the branch and verify that linked issues closed.
Jamie: What are the common real-world situations learners should be ready for?
Alex: If you are assigned to review a PR, start with the description, then read the checks, then inspect Files changed. If you are responding to review feedback on your own PR, reply to comments, make focused commits, and resolve conversations only when the concern is actually handled.
Jamie: And the scary one: merge conflicts.
Alex: A merge conflict means Git cannot automatically combine two sets of changes. For this chapter, the key move is to stop and read the conflict message carefully. Depending on the project, you may fix it in the web editor, pull the branch locally, or ask a facilitator or maintainer before making a risky edit.
Jamie: What mistakes should people avoid?
Alex: Avoid huge PRs that mix unrelated work, vague titles like "fix stuff," missing Closes lines, missing testing notes, and descriptions that repeat the title without explaining anything. Also avoid changing files outside the issue's scope unless the maintainer asked for it.
Alex: A good PR description answers three reviewer questions quickly: what changed, why it changed, and how to test it.
Jamie: That seems simple, but it is exactly what I look for when I open someone else's PR.
Alex: A useful template might include Summary, Changes made, Related issues, Testing, Screenshots or recordings, and a short checklist. In text-heavy documentation PRs, screenshots may not apply, but testing still does: you can say you checked the Markdown preview, verified the link, or confirmed the heading order.
Jamie: And the Closes #XX pattern belongs in Related issues?
Alex: Yes. Before and after structure also helps. Instead of saying "updated docs," say "Before: setup-guide.md linked to an outdated accessibility settings page. After: the link points to the current setup page and the surrounding sentence explains what the reader will find."
Jamie: Can learners practice by reading a real PR, even before they are comfortable reviewing?
Alex: Absolutely. Open a PR in the Learning Room, read the description, check whether it references an issue, read the bot comment, then move to Files changed and identify what lines were added or removed. You do not have to judge everything at first. Just follow the trail from description to conversation to diff.
Jamie: And later, tools like a PR review agent can help draft observations, but they do not replace reading the PR yourself.
Alex: Exactly. Review at least a couple of pull requests manually before leaning on automation. An agent can summarize a diff, suggest comments, or help organize risks, but you still bring the project context, the accessibility judgment, and the final decision.
Jamie: So the workflow is small branch, useful commit, linked PR, readable description, checks, review, and then a merge strategy that fits the project.
Alex: That is the heart of it. Pull requests are not just a button on GitHub. They are the shared workspace where a change becomes something the project can trust.
17. Challenge 04: Branch Out
Creating a safe working branch and understanding why branches protect main.
Practice focus: Day 1 contribution
Read Transcript - Challenge 04: Branch Out
Transcript
Alex: Welcome back. Challenge 4 is called Branch Out, and it is one of those small GitHub moves that makes everything after it safer. You're going to create a personal branch for Day 1 work, named `learn/YOUR-USERNAME`.
Jamie: This is the moment where I always want to ask the basic question. Why make a branch at all if I'm just practicing in my own private repository?
Alex: Because `main` is the stable copy of the project. A branch is a separate line of work, so you can try an edit, make a commit, and later open a pull request without changing `main` right away. If something goes sideways, your main branch is still clean.
Jamie: So the branch is not extra ceremony. It's a safety rail.
Alex: Exactly. And in the Learning Room, that safety rail is part of the real workflow: issue, branch, commit, pull request, review, merge. Challenge 4 is where that chain starts to feel practical.
Jamie: And just to ground where we are, this is happening in the Learning Room repository, not in the original template repository.
Alex: Your Learning Room is the private repository GitHub Classroom created for you from `Community-Access/learning-room-template`. Its name looks like `<workshop-org>/learning-room-<your-username>`, and it is where your Day 1 contributions happen.
Jamie: The setup path is: open the Classroom assignment link, identify yourself if GitHub Classroom asks, accept the assignment, and wait while GitHub copies the template into the workshop organization.
Alex: Right. When the repository link appears, open it and check a few landmarks: the repository name includes your username, you see files like `README.md`, and you see folders like `docs/` and `.github/`. Bookmark that page, because you'll come back to it all day.
Jamie: And the first challenge issue appears inside that repository, usually after the Student Progression Bot runs. If it doesn't show up after a couple minutes, refresh the Issues tab, then ask a facilitator if needed.
Alex: It's also worth checking the Actions tab once early on. You should see the pull request validation workflow, often called Gandalf, listed there. You don't need to run it yet; you just want to know that feedback will appear later when you open a pull request.
Jamie: There are two practice tracks in this workshop, right? I hear people mention GitHub Skills modules and the Learning Room, and they can sound similar.
Alex: They reinforce each other, but they are not the same. GitHub Skills modules are optional, self-paced practice in your own account, with GitHub's learning bot guiding isolated skills like opening a pull request or writing Markdown. The Learning Room is the required workshop track, where the Day 1 challenge issues, branches, commits, pull requests, checks, reviews, and merges happen.
Jamie: So the optional modules help build confidence, but the Learning Room is the shared workshop path.
Alex: Yes. In the Learning Room, the practice files are in `docs/`. You'll see `docs/welcome.md` with open source contribution sections to complete, `docs/keyboard-shortcuts.md` with screen reader shortcut references, `docs/setup-guide.md` with setup instructions, and `docs/CHALLENGES.md` as the challenge menu.
Jamie: And the repository is private, so I'm not seeing every other student's work in my copy.
Alex: Correct. Peer-simulation issues and pull requests inside your repository give you realistic collaboration practice. Facilitators may also pair students for real peer review when access is intentionally arranged, but your Learning Room starts as your own safe workspace.
Jamie: Let's create the Challenge 4 branch. Where should I be on GitHub?
Alex: Start on the Code tab of your Learning Room repository. Near the top of the file list, find the branch dropdown. Visually it usually shows `main`; with a screen reader, listen for a button labeled something like `Switch branches/tags`.
Jamie: Then I activate that button and type the branch name?
Alex: Yes. Type `learn/` followed by your actual GitHub username. So if your username is `octocat`, the branch name is `learn/octocat`. If your username is `student42`, the branch name is `learn/student42`.
Jamie: And then GitHub offers an option like `Create branch: learn/student42 from main`.
Alex: Activate that option. Now your branch exists on GitHub, created from the current state of `main`. For the evidence box in the challenge issue, write your branch name and a short sentence about how you created it.
Jamie: The issue also asks for a peer simulation check. Open the peer-simulation pull request, notice its branch name, and if you have a real buddy, ask whether they made their branch or help them find the dropdown.
Alex: The naming pattern for this challenge matters because facilitators and automation can recognize `learn/<username>` quickly. It keeps the room organized when many people are working at once.
Jamie: But I saw examples like `fix/welcome-todo`, `feature/add-schedule-link`, and `docs/update-readme` in the reference. Are those wrong?
Alex: No, those are common branch naming styles for regular project work. A pattern like `type/description` is short and descriptive, and you'll see it often. For Challenge 4, though, use the workshop pattern: `learn/` plus your username.
Jamie: What if GitHub says the branch already exists?
Alex: If you already created `learn/<your-username>`, you're done. Switch to it from the same branch dropdown and confirm the name. If you typed the name wrong, create a new branch with the correct name; the old one won't break anything.
Jamie: So the deeper skill is understanding that my work can live away from `main` until I'm ready to propose it.
Alex: You only need one tool for this challenge, but it's useful to know the same idea exists across tools. In VS Code with Git, you can create a branch from the Source Control area or by selecting the branch name in the bottom-left status bar and choosing to create a new branch.
Jamie: And in the terminal, the Git command would be `git checkout -b learn/your-username`, assuming I'm already in the repository and starting from `main`.
Alex: Exactly. In GitHub Desktop, use the Current Branch dropdown, choose New Branch, enter the name, and confirm it is based on `main`. With GitHub CLI, you might clone your Learning Room repository with `gh repo clone <workshop-org>/learning-room-<your-username>`, change into the folder, and then run the Git branch command.
Jamie: Before pushing later, I should check which branch I'm on, especially in a terminal.
Alex: Yes. `git branch --show-current` is a good habit. And later, when you create short pull request branches, keep them focused, link the related issue in plain text, and use documented command help like `gh pr --help` when you need the current options.
Jamie: How does this branch connect to pull requests? We haven't changed a file yet.
Alex: A pull request is a proposal to merge one branch into another, usually your working branch into `main`. The branch is where your change lives; the pull request is where people and bots review it, discuss it, and decide whether it is ready.
Jamie: So later, if I edit `docs/welcome.md` or fix something in `docs/setup-guide.md`, that edit happens on a branch first.
Alex: Right. In the web editor, GitHub can create a branch for you when you choose to propose changes. In Chapter 6 practice, beginners are usually encouraged to use a short-lived branch like `fix/yourname-issueXX` for a focused pull request, rather than mixing everything into the Day 1 practice branch unless a facilitator says otherwise.
Jamie: When opening the pull request, I need a title, a useful description, and a line like `Closes #42` to connect it to the issue.
Alex: Yes. Then the pull request page gives you several places to read. The Conversation tab has the description, comments, review discussion, and status checks. The Commits tab lists commits, the Checks tab shows automation details, and the Files changed tab shows the diff, which means the exact lines added, removed, or changed.
Jamie: For screen reader navigation, Browse Mode is usually the reading mode for headings, comments, and diffs, and Focus Mode is mainly for typing into fields.
Alex: Good distinction. GitHub's pull request interface also supports landmarks and tabs, and the Files changed experience includes better structure for the file tree and diff areas. If something about the interface seems different from a guide, use headings, buttons, landmarks, and the official GitHub accessibility references to re-orient.
Jamie: There are also draft pull requests for work that is not ready yet, reviewer requests when you want feedback, and review outcomes like comment, approve, or request changes.
Alex: Once you open a pull request in the Learning Room, Gandalf usually posts feedback in about 30 seconds. It may check whether you used a `Closes #XX` line, whether the description is detailed enough, whether the files are in the expected area, and whether there are basic accessibility issues like heading order, link text, or alt text.
Jamie: If the bot finds something, I don't have to panic. I read the comment, update the branch, and the checks can run again.
Alex: Exactly. Peer review works similarly, just with a person. A reviewer reads the description, checks the conversation, opens the diff, may leave inline comments, and may suggest changes. As the author, you respond, make updates if needed, and resolve conversations when the discussion is handled.
Jamie: And when review is approved, or when the workshop allows self-merge, the pull request can be merged into `main`.
Alex: After merging, GitHub may offer to delete the branch, and in real projects maintainers may choose merge commit, squash and merge, rebase and merge, or auto-merge when required checks pass. In the Learning Room, merging also lets the progression automation notice your completed work and open the next challenge.
Jamie: What about common problems? Like a reviewer doesn't respond, or I disagree with feedback, or the bot seems wrong?
Alex: Ask for help in the workshop channel, tag a facilitator when appropriate, and explain what you checked. Study groups are fine for talking through ideas, but your repository work should still show your own understanding. And if you are reading someone else's pull request by assignment, be specific, kind, and focused on the change.
Alex: If you're stuck on Challenge 4, start with the branch dropdown. It is near the top-left of the file list on the Code tab, and it may be announced as `Switch branches/tags`.
Jamie: If I finish and want to verify, I can use that same dropdown to switch to `learn/<my-username>` and confirm GitHub shows the branch name.
Alex: Yes. And for reliable facts beyond the workshop notes, use official GitHub documentation about Git, GitHub Flow, pull requests, the GitHub Accessibility Guide for pull requests, and the GitHub CLI help built into the tool.
Jamie: I like that this challenge is small. No file edit yet, no merge yet, just create the safe place where future work can happen.
Alex: That's the win. You made a branch from `main`, named it in the workshop pattern, recorded evidence in the issue, and practiced the first move of a real contribution workflow. From here, your changes have a place to land before they become a pull request.
18. Challenge 05: Make Your Mark
Editing a file, writing a useful commit message, and connecting a change to an issue.
Practice focus: Day 1 contribution
Read Transcript - Challenge 05: Make Your Mark
Transcript
Alex: Welcome back. Challenge 5 is called Make Your Mark, and this is where your Learning Room starts to feel like a real repository instead of a place you are only reading.
Jamie: Because now we are changing an actual file, not just opening issues or looking around.
Alex: Exactly. You will edit `docs/welcome.md`, replace a TODO with real content, and save that change with a commit message that says what changed and why. A commit is a saved snapshot in Git, so this is your first clear record of contribution.
Jamie: And this happens in the private Learning Room repository that GitHub Classroom created for each learner, right? Not in the original template repository.
Alex: Right. Your Learning Room is your own private copy from the classroom assignment, named something like `learning-room-your-username`. Everyone practices the same issue, branch, commit, pull request, review, and merge flow, but your work stays in your own repo unless facilitators intentionally arrange peer review. Day 1 prioritizes Challenges 1 through 6, so this one is part of the core path.
Jamie: Before I touch the pencil icon, where should I be? I can imagine someone accidentally editing in the wrong place.
Alex: Start in your Learning Room repository, then check the branch dropdown. For Challenge 5, you should be on your `learn/YOUR-USERNAME` branch, which is the practice branch you created earlier so your work is separate from `main`.
Jamie: So the branch is a safety rail. I can make the change there first, and main stays stable.
Alex: Yes. The Learning Room was designed for that kind of practice: safe enough to experiment, realistic enough to build real habits, and paced so you are not blocking anyone else.
Jamie: What if someone is listening and thinking, I do not even see my Learning Room yet?
Alex: Then go back to the GitHub Classroom assignment link, make sure you accepted the assignment, and open the repository link when GitHub finishes creating it. If Challenge 1 was missing earlier, the usual check was the Issues tab and then the Actions tab, where the progression workflow and Gandalf PR validation workflow live. By Challenge 5, you should already have that repo bookmarked and your challenge issue open.
Jamie: Okay, what file are we editing?
Alex: Open `docs/welcome.md`. The `docs` folder also contains practice files like `keyboard-shortcuts.md`, `setup-guide.md`, and `CHALLENGES.md`, but Challenge 5 is focused on the TODO you found earlier in the welcome file.
Jamie: The issue says to replace the TODO with real content. Does that mean there is one correct sentence everyone has to use?
Alex: No. The reference solution gives an example, not a required answer. For instance, it replaces a comment like `TODO: add link to workshop schedule` with a sentence that links to the workshop schedule file.
Jamie: So if my TODO is about who can contribute, I write a clear sentence or two that actually belongs in that section.
Alex: Exactly. Keep it small, useful, and related to the TODO. This is not a redesign of the whole page. It is one focused improvement.
Jamie: Walk me through the browser version, because that is the path a lot of people will use first.
Alex: In your Learning Room, confirm the branch dropdown says `learn/YOUR-USERNAME`. Then navigate to `docs/welcome.md`, open the file, and activate the pencil icon labeled `Edit this file`.
Jamie: Then I find the TODO in the editor and replace it with my actual text.
Alex: Yes. After the edit, move to the commit area. Write your commit message, and for this challenge commit directly to your `learn/YOUR-USERNAME` branch.
Jamie: If I use a screen reader, is the pencil icon findable as a button?
Alex: It should be. With NVDA or JAWS, many learners use button navigation to find `Edit this file`. With VoiceOver, the Buttons rotor can help. The important part is to verify the file name and branch before you start typing.
Jamie: What if GitHub offers to create a new branch?
Alex: For Challenge 5, stay with the challenge instruction and commit to your learning branch. In the next pull request work, you will see short-lived feature branches like `fix/yourname-issueXX`, but this challenge is about making one meaningful branch commit.
Jamie: The commit message feels small, but it is doing a lot of work here.
Alex: It is. A message like `Update welcome.md` tells us the file changed, but not what happened. A stronger message is `Add workshop description to welcome.md` or `Replace placeholder text with actual welcome message`.
Jamie: So I should be able to read the message later and know the purpose of the change without reopening the file.
Alex: That is the goal. A good commit message answers two plain questions: what changed, and why it changed.
Jamie: The solution shows a more formal version too, right? Something like `docs: replace TODO with workshop schedule link`, then a short body underneath.
Alex: Yes, and that format is useful. The first line is a short summary, often around 50 characters if you can manage it. Then a blank line can separate an optional body that explains the reason in more detail.
Jamie: But I do not have to use the fancy prefix to pass the challenge.
Alex: Correct. `Fix TODO in welcome.md` and `Add schedule link to welcome page` are both acceptable because they are clear. The convention is helpful, not mandatory.
Jamie: After I commit, what evidence do I need to give back in the challenge issue?
Alex: Paste the commit URL, share the exact commit message you used, and briefly say what you changed the TODO to say. The issue template asks for all three so a facilitator, bot, or future-you can follow the trail.
Jamie: How do I find the commit URL if I have never copied one before?
Alex: After the commit, GitHub usually shows the latest commit near the file or repository view. Open the commit message link, and copy the URL from the address bar. You can also use the commit history for the file if you need to find it again.
Jamie: There is also a peer simulation check in the issue. What is that asking me to notice?
Alex: Compare your commit message with the peer-simulation PR title and commit message in your repo. Ask yourself whether you can tell what changed just by reading the title or message. If you have a real buddy in the workshop, comparing messages is a good way to practice clarity without judging anyone's writing style.
Jamie: What if the GitHub web editor is not the tool I want to use?
Alex: That is fine. On github.com, the pencil icon path is the most direct. In github.dev, you can press `.` from the repository to open the browser-based VS Code editor, edit the file, and commit from Source Control.
Jamie: And if I am working locally?
Alex: You can use VS Code with Git: edit the file, stage with `git add`, and commit with `git commit`. GitHub Desktop works too: edit in your preferred editor, return to Desktop, write the message, and click Commit.
Jamie: So the tool is flexible, but the outcome is not vague.
Alex: Right. The successful outcome is a real edit in `docs/welcome.md` and a descriptive commit message saved on the correct branch.
Jamie: Let us talk about the mistakes people are afraid of, because this is where anxiety can spike.
Alex: The most common one is editing on `main` instead of your practice branch. If you catch it before committing, switch to `learn/YOUR-USERNAME` with the branch dropdown and make the edit there.
Jamie: What if I cannot find the edit button at all?
Alex: Look near the top-right area of the file view for the pencil icon, or search the buttons for `Edit this file`. If the button is unavailable, check that you are in your own Learning Room repo and signed in with the right GitHub account.
Jamie: And the scary one: I accidentally committed to main.
Alex: Ask your facilitator for help. It is fixable, and this is exactly why the Learning Room exists. You are practicing real work in a place where recovery is part of the lesson.
Jamie: If I finished but I am not sure it is good enough, should I copy the solution exactly?
Alex: Use the solution as a comparison, not as a script. Your edit can be different. Check that it replaces the TODO with real content, that the commit message makes sense, and that your evidence points to the commit.
Jamie: How does this connect to pull requests? Challenge 5 is only a commit, but the chapter around it talks a lot about PRs.
Alex: A pull request, or PR, is how a saved change becomes a proposed contribution for review and merge. Challenge 5 gives you the commit habit first, because every PR is made of commits.
Jamie: So later, when I open a PR, the reviewer will see not only my description but also the commits behind it.
Alex: Exactly. A PR page has several important places: the Conversation tab for the description, comments, and bot feedback; the Commits tab for saved changes; the Checks tab for automated results; and the Files changed tab for the diff.
Jamie: Diff means the before-and-after view of the file, right?
Alex: Yes. Removed lines and added lines are shown so reviewers can understand the change. In later PR work, you will also include a line like `Closes #XX` in the PR description so the related issue closes automatically when the PR is merged.
Jamie: And Gandalf reads the PR too?
Alex: Gandalf posts validation feedback on the PR Conversation tab. It can check things like issue linkage, description detail, and accessibility-related file issues. If something fails, you update the branch and the checks run again.
Jamie: That makes the commit message part of a bigger communication chain.
Alex: Yes. A clear commit helps the PR make sense, a clear PR helps review move faster, and review prepares you for contributing beyond the Learning Room.
Jamie: There are a lot of moving pieces around the Learning Room: optional skills modules, peer review, bots, study groups. How much of that matters for this challenge?
Alex: For Challenge 5, keep your attention on the edit and commit. But it helps to know the larger map: GitHub Skills modules are optional self-paced practice in your account, while the Learning Room is the required workshop track for Day 1.
Jamie: And peers do not automatically see everything in my private repo.
Alex: Right. Facilitators may arrange peer review or sharing when it is useful, but your repo is private by default. The usual PR flow is: you open a PR, automation gives feedback, a reviewer may comment, you respond or update, and then the work is merged when it is ready.
Jamie: What if review takes a while, or I disagree with feedback?
Alex: Ask for facilitator help, respond kindly, and keep the conversation tied to the change. Study groups are fine when the workshop allows them, but your evidence and decisions should still be your own.
Jamie: It sounds like this tiny TODO edit is rehearsal for open source communication.
Alex: It is. And if GitHub's interface changes, use current official GitHub documentation, GitHub's accessibility guidance, or your facilitator as references. The labels may move, but the workflow remains: find the right repo, use the right branch, make the smallest useful change, describe it clearly, and leave evidence someone else can follow.
Jamie: So for Make Your Mark, I check my branch, edit `docs/welcome.md`, replace the TODO, commit with a meaningful message, paste the commit URL and message, and compare whether my message is understandable.
Alex: That is the challenge. Small change, clear record, confident next step.
Jamie: I like that. It is not about writing the perfect sentence. It is about making a real contribution that someone else can understand.
19. Challenge 06: Open Your First Pull Request
Opening a pull request, comparing branches, and using closing keywords.
Practice focus: Day 1 contribution
Read Transcript - Challenge 06: Open Your First Pull Request
Transcript
Alex: Welcome back. Today we're opening the door that turns a branch change into a contribution: Challenge 6, Open Your First Pull Request.
Jamie: This is the one where the work stops being just, I changed a file, and becomes, I am asking the project to accept this change.
Alex: Exactly. A pull request, or PR, is a proposed change from one branch into another branch. It gives everyone a place to compare the branches, read the reason for the change, run checks, and talk before anything lands in `main`.
Jamie: So the PR is not just a submit button. It's the conversation around the change.
Alex: Yes. And in this challenge, the conversation is small on purpose: one branch, one issue, one clear description, and one PR link as evidence.
Jamie: Where are learners working for this one?
Alex: In the Day 1 Learning Room repository. That's the private repository provisioned for each learner, and it's where the Day 1 path happens: issue, branch, commit, pull request, and eventually merge.
Jamie: And the challenge issue itself is titled Challenge 6: Open Your First PR with the learner's username in it, right?
Alex: Right. The public challenge title is Open Your First Pull Request, and the assigned issue may say Open Your First PR with your username. The important part is that you're opening a PR from your working branch back into `main`.
Jamie: This also connects back to the issue from Challenge 2.
Alex: Yes. You filed an issue to describe a need or a problem. Now your PR connects the change to that reason, so the project history tells a complete story.
Alex: Before the PR exists, you need one small branch change. In the chapter practice path, the Learning Room has files like `docs/welcome.md`, `docs/keyboard-shortcuts.md`, and `docs/setup-guide.md`, each with a small problem to fix.
Jamie: So this is not the time to rewrite the whole repository.
Alex: Please don't. If the issue asks you to replace a TODO, fix one broken link, or correct one keyboard shortcut, do that one thing. A focused PR is easier to review, easier to explain, and easier to fix if a check fails.
Jamie: How does the web editor path work?
Alex: Open the file named in your issue, activate the pencil icon or Edit this file button, make the requested change, and then choose Commit changes. In the commit dialog, create a new branch for the commit and start a pull request. The chapter recommends a short-lived branch like `fix/yourname-issueXX`, while some challenge instructions may name `learn/YOUR-USERNAME`; follow the branch name your assigned issue or facilitator gives you.
Jamie: That branch name is a small thing, but it helps you hear what the branch is for.
Alex: Exactly. And if you're using NVDA, JAWS, or VoiceOver, stay in reading mode while you're moving around the page, then switch into the editor or form fields only when you're ready to type. That reduces the feeling of getting trapped in controls.
Jamie: Now we're on the Open a pull request page. What has to be right before creating it?
Alex: First, check the branch comparison. The base branch should be `main`, and the compare branch should be the branch with your change. That comparison is GitHub asking, what is different between these two branches?
Jamie: And then the title.
Alex: The title should tell the story quickly. Something like, Complete the Who Can Contribute section in welcome.md, Fix broken accessibility settings link in setup-guide.md, or Correct NVDA modifier key in keyboard-shortcuts.md.
Jamie: Then the body is where the issue link goes.
Alex: Yes. For this challenge, use a simple structure: `What this PR does`, one sentence about the change; `Why`, one sentence about the reason; and then `Closes #XX`, replacing XX with the issue number. For larger PRs, you may see sections like Summary, Changes Made, Related Issues, Testing, Screenshots or recordings, and a Checklist.
Jamie: What does `Closes #XX` actually do?
Alex: It creates a two-way link between the PR and the issue. The issue shows that it is referenced by the PR, the PR shows that it closes the issue, and when the PR is merged, GitHub closes that issue automatically. `Fixes #XX` and `Resolves #XX` work the same way.
Jamie: That's a surprisingly powerful line of text.
Alex: It is. It connects the change to the reason for the change, which is one of the habits that makes open source collaboration understandable later.
Jamie: After I activate Create pull request, am I done?
Alex: You're done opening it, but not done checking it. In this Learning Room path, the validation bot usually starts within about 30 seconds and posts feedback on the PR Conversation tab.
Jamie: What is the bot looking for?
Alex: It checks whether the PR references an issue with a closing keyword, whether the description is detailed enough, whether the changed files are in the expected Learning Room area, and whether basic accessibility rules pass. That can include heading order, descriptive link text, and valid alt text.
Jamie: If the bot says something failed, that doesn't mean the learner broke everything.
Alex: Not at all. Read the bot comment, fix the specific problem, and update the PR. If the problem is in the description, edit the description. If the problem is in the file, use the Files changed tab or the file editor, commit the fix to the same branch, and let the checks run again.
Jamie: And passing checks show up as green status, when the repository has them configured.
Alex: Right. A complete challenge submission has a clear PR title, a useful description, a linked issue, and passing checks when checks are present. Then you paste the PR URL into the challenge evidence field.
Alex: Let's make the PR page less mysterious. You can arrive there from a notification, from the Pull requests tab in the repository, or from a Compare and pull request prompt after pushing a branch.
Jamie: And if someone is using the terminal?
Alex: The GitHub CLI can list open PRs with `gh pr list`, show a specific PR with `gh pr view`, check status with `gh pr checks`, and open the PR in the browser with `gh pr view --web`. The safest terminal habits are to check your branch first, keep the change small, include the closing keyword in plain text, and use documented help like `gh pr --help` when you're unsure.
Jamie: On the website, the Pull requests list has filters too, right?
Alex: Yes. You can filter by open or closed state, review status, assignee, author, and draft state. If GitHub keyboard shortcuts are enabled, shortcuts can help you move faster, but the reliable path is still the same: find the Pull requests tab, open the PR title, and verify where you landed.
Jamie: What should I listen for on the list page?
Alex: The PR number, title, author, status, and any check or review indicators. A short title is helpful here because it has to make sense when it's heard in a list with many other PRs.
Jamie: Once the PR is open, there are several tabs. I know people get lost here.
Alex: The main tabs are Conversation, Commits, Checks, and Files changed. Conversation is the overview: the PR description, bot comments, human review comments, and status summaries.
Jamie: So Conversation is where I confirm what the PR claims to do.
Alex: Yes. Read the description first, then the bot or reviewer comments. If a review conversation has been answered and fixed, GitHub may let the author or maintainer resolve that conversation, which marks that thread as handled.
Jamie: What about Commits and Checks?
Alex: Commits shows the sequence of commits included in the PR, which is useful when the author made follow-up fixes. Checks shows automated jobs and logs. If something fails, the Checks tab often gives more detail than the short status summary.
Jamie: And Files changed is where the actual diff lives.
Alex: Yes, and it's the tab people often fear at first. GitHub's newer Files changed experience includes better landmark structure for the file tree and diff area; if your account still shows it as a feature preview, you can check the User Menu and Feature preview area, but for many accounts it may already be standard.
Jamie: Let's slow down on the diff. What am I listening for?
Alex: A diff shows what changed in each file. Added lines are usually announced with a plus sign, removed lines with a minus sign, and unchanged nearby lines are context. The left file tree helps you move between changed files when a PR touches more than one file.
Jamie: Can I navigate that with headings and landmarks?
Alex: Yes. Use headings, landmarks, and the tab bar to move to Files changed, then scan the changed file headings. In the chapter's practice example, if the PR touched `docs/welcome.md`, you might hear added lines where TODO sections were filled in; if it touched `docs/keyboard-shortcuts.md`, you might hear changes inside a table.
Jamie: How do inline comments fit in?
Alex: Inline comments attach feedback to a specific diff line or range of lines. You can comment on one line, or select a range for a multi-line comment, then submit it as part of a review. Existing comments can also appear inside the diff, so it's worth reading both the Conversation tab and Files changed.
Jamie: Challenge 6 has a peer simulation check too.
Alex: Yes. Find the Peer Simulation: Improve contribution guidance PR and leave an encouraging comment. If you have access to a real buddy's PR, you may comment there as well, but the full review workflow comes later.
Jamie: The chapter also mentions draft PRs, reviewers, suggestions, and merge options. Do learners need to master all of that for Challenge 6?
Alex: Not all at once, but it's helpful to recognize the words. A draft PR is for work that should be visible but is not ready for final review. You can create a draft, convert an open PR to draft, or mark a draft ready for review when the work is ready.
Jamie: And requesting reviewers is the moment you ask another person to look.
Alex: Right. Reviewers can leave comments, approve, request changes, or submit a comment-only review. They can also use suggested changes, where a reviewer proposes an exact edit and the author can apply it, sometimes batching several suggestions into one commit.
Jamie: Then maintainers decide how to merge.
Alex: Yes. Depending on repository settings, a maintainer may use a merge commit, squash and merge, or rebase and merge. They may delete the branch after merging, or enable auto-merge so the PR merges when required checks pass.
Jamie: And after merge, the closing keyword does its job.
Alex: Exactly. The PR becomes part of `main`, and the linked issue closes automatically if the PR used `Closes #XX`, `Fixes #XX`, or `Resolves #XX` correctly.
Alex: A complete example might have the title, Fix TODO: add workshop schedule link to welcome.md. The body would say what changed, why it changed, and then `Closes #3`.
Jamie: So, not a novel. Just enough context for a reviewer to understand the change without hunting through the issue first.
Alex: Yes. Good PR descriptions avoid vague lines like fixed stuff, and they avoid leaving out testing or issue links. A before-and-after structure can help when the change is visual, behavioral, or accessibility-related.
Jamie: What are the most common stuck points in this challenge?
Alex: If you can't find New pull request, make sure you're on the Pull requests tab. If GitHub says there isn't anything to compare, check that your branch has a commit that differs from `main`, and that you committed to the intended branch. If you forgot `Closes #XX`, edit the PR description after creating the PR.
Jamie: And success is the PR URL, the issue link, and the checks passing when they apply.
Alex: That's it. You opened a PR, compared branches, connected the work to an issue, and practiced the same contribution pattern used by humans, teams, and AI-assisted workflows. AI can help draft changes later, but you now know how to inspect the PR yourself.
Jamie: That feels like a real milestone.
Alex: It is. The first pull request is where GitHub starts to feel less like a website full of buttons and more like a collaboration system you can move through with confidence.
20. Episode 7: Merge Conflicts Are Not Scary
Why conflicts happen, how to read conflict markers, and resolving them confidently.
Based on: Chapter 7: Merge Conflicts Are Not Scary
Read Transcript - Episode 7: Merge Conflicts Are Not Scary
Transcript
Alex: Welcome back. Today we're taking the fear out of merge conflicts. A conflict can look dramatic on the screen, but most of the time it is Git saying, "I found two edits in the same place, and I need a human to choose."
Jamie: That already makes it sound less like an emergency. I think the scary part is seeing those rows of angle brackets and wondering if you broke the project.
Alex: You did not break the project. Conflicts are a normal part of collaboration, including collaboration with AI tools that may rewrite something a human already changed. The skill is reading the choices calmly, keeping the right content, and leaving the file clean.
Jamie: So this is not a punishment from Git. It's a checkpoint where the person with context makes the final call.
Alex: A merge conflict happens when two changes overlap in the same part of the same file. If you change line 12 to say "Submit form" and I change that same line to say "Send message," Git cannot safely guess which one belongs there.
Jamie: The shared document analogy helps me here. Two people edit the same paragraph, and the document app can tell both edits happened, but it cannot know which wording is better.
Alex: Exactly. Git is very good at combining changes that happen in different places. If you edit the introduction and I edit the footer, Git can usually merge that automatically.
Jamie: But if we both edit the same sentence, delete and rewrite the same section, or one of us deletes a file while the other edits it, Git stops.
Alex: Right. Long-running pull requests are another common cause. The longer your branch sits while main keeps changing, the more likely your work and someone else's work will overlap.
Jamie: So conflicts are not rare, and they are not proof that someone made a mistake. They are part of the normal cost of multiple people moving a project forward.
Alex: The thing you read first is the conflict marker block. It usually starts with a line like <<<<<<< HEAD, then one version of the content, then a separator line made of =======, then the other version, and finally a line like >>>>>>> branch-name.
Jamie: Let me slow that down. The first marker says, "the conflict begins here." The row of equal signs separates the two choices. The final marker says, "the conflict block ends here."
Alex: Yes. In the usual merge view, the content between <<<<<<< HEAD and ======= is your current branch's version. The content between ======= and >>>>>>> branch-name is the incoming version.
Jamie: And resolving the conflict does not mean deleting everything that looks weird as fast as possible.
Alex: Please do not do that. Read both sides. Decide whether to keep your version, keep their version, or combine the useful parts into one clean paragraph, table row, or code block.
Jamie: Could you give a small example?
Alex: Sure. Imagine a file called docs/keyboard-shortcuts.md has a table row for saving work. One student adds "Press Ctrl+S to save," while another adds "Use Command+S on macOS or Ctrl+S on Windows." The best resolution might combine them into one clearer row, then remove all three marker lines.
Jamie: So the final file should read like a normal file. No <<<<<<<, no =======, no >>>>>>>, and no leftover duplicate wording unless you meant to keep it.
Alex: In Challenge 07, the Day 1 stretch challenge called Survive a Merge Conflict, you practice this in a safe file inside your Learning Room repository. That Learning Room repo is provisioned for you, and it is where the Day 1 issue, branch, commit, pull request, and merge workflow happens.
Jamie: I like that it is controlled. You are not being dropped into a huge open source conflict with ten files and a blinking cursor.
Alex: Exactly. You open your assigned Chapter 7 challenge issue, the one titled something like "Chapter 7.1: Resolve Conflict Markers (@yourname)." The issue tells you which practice file contains the markers.
Jamie: Then the first practical move is to search for <<<<<<<, right?
Alex: Yes. Use the find command so you can jump straight to it. The chapter suggests Ctrl+F in the browser, and in VS Code you can use its search or find tools; the important part is that these markers are plain text and screen readers can read them.
Jamie: Once I find the block, I read the current branch side, read the incoming side, choose or combine content, delete the marker lines, and search again to make sure nothing remains.
Alex: That's the core of it. Then commit on a short-lived branch named like fix/yourname-issueXX, for example fix/maria-issue48. Open a pull request titled "fix: resolve conflict markers in [filename]."
Jamie: And the PR body should include Closes #XX, plus a sentence or two explaining what content you kept and why. That explanation is part of the evidence, not just decoration.
Alex: If you're resolving this on GitHub.com, the web editor is the primary path for this chapter. GitHub may show a button to resolve conflicts, or you may open the file from your branch and edit the marker block directly.
Jamie: What does that feel like with a screen reader?
Alex: It is text editing. You find the marker, move through the lines, listen to each side, and edit the final wording. The visual editor may show color-coded regions, but the reliable information is still the marker text and the surrounding content.
Jamie: So low vision learners can use zoom or high contrast, and screen reader users can rely on search and line-by-line reading.
Alex: Yes. The chapter includes learning cards for different ways of working: visual and mouse guidance, low vision notes, NVDA and JAWS on Windows, VoiceOver on macOS, and CLI notes for terminal users. Open the cards that match your setup.
Jamie: After the edit, you commit the change in the web editor, check the pull request, and wait for the bot validation checks. If the bot says markers remain, search for all three: <<<<<<<, =======, and >>>>>>>.
Alex: Some learners prefer doing the same work locally with Git. If you cloned your Learning Room in Block 0, the local flow starts by syncing main, then merging main into your feature branch.
Jamie: Say the commands out loud, because this is where people often lose their place.
Alex: From the repository folder, you can run: git checkout main, then git pull origin main. Then switch back with git checkout your-branch-name, and run git merge main. If there is a conflict, Git tells you which files are affected and pauses the merge.
Jamie: Paused is a helpful word. It is not finished, but it is not destroyed.
Alex: Exactly. Run git status and look for entries like "both modified:" to identify the conflicted files. Then open each one in your editor, such as code docs/welcome.md, read the marker block, choose the final content, delete the markers, and save.
Jamie: Then Git needs to be told that the file is resolved.
Alex: Right. Run git add docs/welcome.md, or whatever file you resolved. Then run git commit. Git may auto-fill a merge commit message, or you can use a message like "Resolve merge conflict in welcome.md." Finally, git push updates your pull request on GitHub.
Jamie: So the conflict workflow is merge, status, edit, add, commit, push. And in the middle, the real work is making a thoughtful content decision.
Alex: VS Code can make conflicts easier to inspect, especially on Day 2 when you are working more locally. It shows the conflict markers in the file, and it may offer actions like accept current change, accept incoming change, accept both changes, or compare changes.
Jamie: Those buttons sound convenient, but I would still want to read the result afterward.
Alex: Absolutely. Whether you click an action or edit manually, the final file needs to be clean and meaningful. Search again for marker text before you commit.
Jamie: What about inspecting a pull request from the terminal?
Alex: The GitHub CLI can help. Use gh pr checks to see whether the pull request checks are passing, failing, or still running. Use gh pr diff to review what changed in the PR, which is especially useful after a conflict resolution because you can confirm that you only changed what you intended.
Jamie: So the terminal can show both readiness and the actual difference. That is useful if the web page is noisy or if you want a compact view.
Alex: Prevention helps too. Keep branches short-lived, ideally one to three days when possible, because a branch that lives for weeks has more chances to drift away from main.
Jamie: And sync with main frequently. From your feature branch, that might mean fetching or pulling updates, then merging main into your branch. If you are comfortable with rebasing, git rebase origin/main is another option, but you do not need to start there.
Alex: Communication matters. If two people are about to rewrite the same page, say so in the issue or pull request. Draft PRs are also useful because they make work visible before it is ready to merge.
Jamie: Small PRs help too. A focused pull request is easier to review, easier to merge, and easier to repair if a conflict appears.
Alex: Also avoid mass reformatting unless the team planned it. Reformatting a whole file can create conflicts with every nearby change, even if the actual idea was small.
Jamie: Pull before you push, work in separate files when you can, and do not let a branch become a private island.
Alex: There is also a useful advanced idea called a fast-forward merge. That happens when the target branch has not moved away from your branch, so Git can simply move the branch pointer forward without creating a separate merge commit.
Jamie: And if main has moved, Git may need a regular merge or a rebase, and that is where conflicts can appear. So frequent syncing keeps surprises smaller.
Alex: Sometimes conflicts are actually good. They stop Git from silently choosing between two different intentions, and they force a human review at the exact spot where the project needs judgment.
Jamie: That reframes it nicely. A conflict can protect the work, especially when accessibility wording, instructions, or code behavior could change meaning.
Alex: If you get stuck, ask for help. Read both versions aloud, pick the clearer one, or combine them. If you deleted too much, use Ctrl+Z and try that block again.
Jamie: And if the bot complains, do the simple checks first: search for <<<<<<<, then =======, then >>>>>>>. If any remain, the file is not resolved yet.
Alex: You can also ask a facilitator to sanity-check the final content before opening the PR, or compare your work with the Challenge 7 reference solution after you have tried it. In a messy local situation, starting fresh can be reasonable, but treat that as a last resort after you understand what you would be throwing away.
Jamie: That is reassuring. The first conflict resolution is usually the hardest because you are learning the shape of the problem and the feeling of editing through it.
Alex: For evidence, once your PR is open and passing checks, comment on your assigned issue. Include that Chapter 7 is completed, name the PR number, name the file, and explain whether you kept your version, their version, or combined both, with a brief reason.
Jamie: The summary I am taking away is simple: find the markers, read both sides, decide on the final content, delete the markers, verify with search, commit the resolution, and connect the PR back to the issue.
Alex: If you want a trusted reference while practicing, use GitHub's guide to resolving merge conflicts and the Git book's basic merge conflict material. Those sources match the behavior you will see in real repositories.
Jamie: And the practice prompt is worth doing even if you only read it at first. Open a conflict block, identify the three marker lines, say which side is current and which side is incoming, and describe what clean final content should look like.
Alex: That small rehearsal builds confidence. Once you have resolved one conflict, the markers stop looking like danger signs and start looking like instructions.
Jamie: Which is a pretty good place to end: merge conflicts are not scary. They are editable text, a decision point, and a normal part of contributing with other people.
21. Challenge 07: Survive a Merge Conflict
Reading conflict markers, choosing content, deleting markers, and committing a resolution.
Practice focus: Day 1 stretch
Read Transcript - Challenge 07: Survive a Merge Conflict
Transcript
Alex: Welcome back. Challenge 7 is called Survive a Merge Conflict, and I love that title because it names the feeling pretty honestly. A conflict can look alarming the first time, but it is usually just Git saying, "I found two edits in the same place, and a person needs to decide."
Jamie: And this is happening inside the Day 1 Learning Room, right? The private repository each learner gets for issues, branches, commits, pull requests, and merges.
Alex: Exactly. Challenges 1 through 6 are the live core path, and Challenge 7 is available as stretch practice or async follow-up if the room needs more time. In this challenge, a facilitator intentionally creates the conflict so you can practice on something safe.
Jamie: That already lowers the pressure. If it appears, it is not because you broke the project. It is because the exercise was set up to teach you how to read it.
Alex: A merge conflict happens when two changes touch the same part of the same file in different ways, and Git cannot automatically choose the right result. If one person edits line 12 to say "Submit form" and another edits that same line to say "Send message," Git stops and asks for a human decision.
Jamie: So Git can still merge lots of things on its own, like changes in different files or different parts of a file. The conflict is the overlap.
Alex: Right. Common causes include two people editing the same line, one person deleting a file while another edits it, two people reorganizing the same section, or a pull request staying open so long that the main branch moves far ahead.
Jamie: That last one feels very real. The longer a branch sits around, the more chances the project has to change underneath it.
Alex: You can prevent many conflicts by keeping branches short-lived, syncing with main often, and talking with teammates about who is editing what. Small pull requests help too, because a focused change gives Git and reviewers less to compare.
Jamie: And avoid those giant formatting sweeps unless the team agrees first. Reformatting a whole file can make Git think every line changed, even if the actual idea was tiny.
Alex: Yes. Pull before you push, work in separate files when possible, and use Draft PRs when you want early visibility before the work is ready to merge. In Git, a fast-forward merge is the easy case where your branch is simply ahead of main with no competing history, so Git can move the pointer forward without creating a special merge commit.
Jamie: But conflicts are not always bad news. Sometimes they catch the exact place where two ideas need to be reconciled.
Alex: Exactly. A conflict can protect the project from silently losing someone's work. And as AI-assisted workflows become more common, this skill matters there too: an AI agent may generate a change that overlaps with human-written code, and resolving the conflict is part of supervising that work safely.
Jamie: What should a learner expect to see in Challenge 7 itself?
Alex: You start from your assigned Challenge 7 issue and your existing pull request. The facilitator triggers the conflict, and then the pull request may say something like "Can't automatically merge" or "This branch has conflicts." Look near the merge area for a "Resolve conflicts" button.
Jamie: And if the conflict is not there yet, waiting for the facilitator signal is a valid move. There is no need to hunt for a problem that has not been created.
Alex: Yes. The issue description tells you which practice file contains the conflict markers. The branch guidance is the same short-lived pattern from the previous challenge, something like fix/yourname-issueXX.
Jamie: Learners can do this in the browser on GitHub.com, and people who cloned their Learning Room can use VS Code or the terminal instead.
Alex: The web editor is the main path for this challenge because it keeps the workflow close to the pull request. VS Code and local Git are good alternatives if you are already set up locally.
Jamie: Let's talk about the scary-looking part: the actual markers in the file.
Alex: Git writes three marker lines into the file. You may hear or read a line that starts with seven less-than signs, then a middle separator line of equals signs, and then a closing line that starts with seven greater-than signs. In one common PR example, the first section is the HEAD version, often the version on main, and the second section is your branch version.
Jamie: But the labels can depend on the operation, right? In a local merge, "current" and "incoming" may not mean what a learner assumes.
Alex: Exactly. Read the labels and read the surrounding text instead of trusting memory alone. The content between the first marker and the equals line is one version, the content between the equals line and the closing marker is the other version, and the marker lines themselves are never final content.
Jamie: So the job is not to delete the whole conflicted area. The job is to decide what the final file should say.
Alex: Here is a simple example. Before resolution, the file might contain "Welcome to the Learning Room! This is the main branch version" on one side, and "Welcome to the Learning Room! This is my improved version with more detail" on the other. A valid resolved file might keep the improved sentence, keep the main version, or write a new combined sentence that uses ideas from both.
Jamie: All three can be correct if the final text is meaningful and the project is better for it. The mistake is leaving the conflict markers behind.
Alex: On GitHub.com, open your pull request, find the message about conflicts, and choose "Resolve conflicts." GitHub opens an editor and highlights the conflicted area. Read both versions carefully before changing anything.
Jamie: For finding the area quickly, search for the marker that starts with the less-than signs. In the browser, Ctrl+F works well, and in VS Code the editor find tools can jump you there too.
Alex: Then make the content decision: keep one side, keep the other side, or combine them into one clean paragraph or code block. After that, remove every marker line: the opening marker, the equals separator, and the closing marker.
Jamie: I like saying "every marker line" because there are usually three types to check for. Search for the less-than marker, the equals separator, and the greater-than marker before you commit.
Alex: Once the file reads cleanly, use "Mark as resolved," then commit the merge resolution. Your pull request should update, and if everything is clean, it should become mergeable again.
Jamie: The automated check is looking for practical evidence too. No conflict markers should remain, and the file should still contain real, meaningful content.
Jamie: What changes if someone uses VS Code instead of the browser?
Alex: VS Code highlights conflict regions and may offer actions like "Accept Current Change," "Accept Incoming Change," and "Accept Both Changes." Those buttons are helpful, but still read the actual text because current and incoming depend on the merge situation. After accepting both, you may still need to edit the result so it reads naturally.
Jamie: So the button can start the resolution, but it does not replace judgment.
Alex: Exactly. Save the file, review it, and commit the resolution. If you are using Source Control in VS Code, the changed file should appear there after you save.
Jamie: And for terminal users, what is the local Git shape of this?
Alex: From your Learning Room folder, you would update main, switch back to your feature branch, and merge main into it. If Git reports a conflict, use git status and look for files listed as both modified. Open each conflicted file, remove the markers, keep the content you want, and save.
Jamie: Then the resolution becomes a normal commit.
Alex: Right. Run git add for the file, commit with a message such as "Resolve merge conflict in welcome.md," and push. Your pull request on GitHub updates automatically, and you can check the diff, the PR status, and any validation checks.
Jamie: What if someone gets stuck halfway through and feels like they made it worse?
Alex: First, that is normal. If you do not see a conflict, the facilitator may not have triggered it yet. If you cannot find the button, look in the pull request conversation near the merge section, or search the page for "Resolve conflicts."
Jamie: And if the hard part is deciding which text to keep?
Alex: Read both versions aloud if that helps. Keep the clearer version, combine both if both add value, or ask the facilitator for a sanity check. If you accidentally delete too much, undo with Ctrl+Z and work through that conflicted block again.
Jamie: What about the dreaded bot message that says markers are still there?
Alex: Search the file for all three marker patterns: the less-than line, the equals line, and the greater-than line. There should be zero results for the conflict markers. If you want another comparison point, use the reference solution for Challenge 7 or ask someone to review the final text.
Jamie: The chapter also mentions learning cards for different ways of working.
Alex: Yes. There are cards for visual and mouse users, low vision users, NVDA and JAWS on Windows, VoiceOver on macOS, and CLI users. Open the ones that match your setup, and if you need official background, the GitHub guide to resolving merge conflicts and the Git book's basic merge conflict chapter are reliable references.
Jamie: Once the conflict is resolved, what evidence does the challenge ask for?
Alex: Your pull request should be linked to the issue, usually with "Closes #XX" in the body, and the title can be something like "fix: resolve conflict markers in filename." In the description, include one or two sentences saying which content you kept, or whether you combined both, and why.
Jamie: The issue also asks for a plain evidence comment, right? Something like the conflict was in this file, I chose to keep this content, and I resolved it by removing the markers.
Alex: Yes. There is also a peer simulation check: compare your resolution with the facilitator's conflict seed, or with a buddy if you have one. Two valid resolutions can keep different wording, as long as the final file is clean and intentional.
Jamie: You are done when the pull request passes the bot checks, has no marker lines, and is ready to merge. If live time runs out, this is a good async follow-up because the steps leave a clear trail.
Alex: And in the broader Day 1 path, that trail matters. You have used an issue, a branch, a commit, a pull request, a reviewable change, and now a merge conflict resolution inside your own Learning Room.
Jamie: Let me try the short version. A conflict means Git found overlapping edits and needs a human choice, not that the project is ruined.
Alex: Yes. Read both sides, choose or combine the content, delete the marker lines, save, commit, and verify that the pull request is clean.
Jamie: And the professional habit is staying calm enough to read what is actually there.
Alex: Exactly. Merge conflicts are a normal collaboration checkpoint. If you can identify the markers, make a deliberate content decision, and leave the file meaningful, you have survived Challenge 7.
22. Episode 8: Open Source Culture and Etiquette
Communication norms, code review etiquette, inclusive language, and asking questions.
Based on: Chapter 8: Open Source Culture and Etiquette
Read Transcript - Episode 8: Open Source Culture and Etiquette
Transcript
Alex: Welcome back. Today we're talking about the human side of open source: culture, etiquette, and community standards.
Jamie: I like this topic because a lot of GitHub anxiety is not really about Git. It's the fear of saying the wrong thing in a public thread.
Alex: Exactly. Technical skills help you make the change. Communication skills help people understand it, review it, trust it, and welcome you back.
Jamie: And this connects to several challenges, right? Challenge 03 has learners joining the conversation with comments, mentions, and reactions, and Challenge 08 asks them to reflect on community norms.
Alex: Yes. Later, Challenge 12 turns this into practice when you review a classmate's pull request. So today is not extra manners on top of the work. It is part of the work.
Jamie: Before we get into tone and review comments, can we ground this in the actual workflow? Where do these conversations happen?
Alex: Most open source projects use GitHub Flow, a lightweight way to propose changes. You create a branch from main, make focused commits, open a pull request, discuss and review, pass checks, and then a maintainer merges the work into main.
Jamie: So the pull request is not just a button you press after coding. It is the place where the explanation, review, and decision all live.
Alex: Right. GitHub Flow works because main stays ready to use, branches are temporary, and small changes are easier to review. A pull request that changes five files is usually kinder to reviewers than one that changes fifty files.
Jamie: Learners may also hear the phrase Git Flow. Is that the same thing?
Alex: Not quite. Git Flow is an older, more complex branching model with long-lived main and develop branches, plus feature, release, and hotfix branches. It fits teams that ship scheduled versions, like mobile apps, desktop software, firmware, or large enterprise products.
Jamie: And this workshop uses GitHub Flow because it is simpler for open source contribution, especially when people are learning.
Alex: Yes. The unwritten rule is one task per branch. If you are fixing missing alt text, that branch should not also rewrite the README, rename files, and change a build script.
Jamie: What about forks? People hear, keep your fork up to date, and it sounds like another hidden chore.
Alex: It is a maintenance habit. If your fork falls behind the original project, your branch can drift away from the current code, and your pull request may be harder to merge. The easiest method is on GitHub.com: open your fork, find the sync option, and update your branch when GitHub says it is behind.
Jamie: And if someone is working in VS Code or the terminal?
Alex: They add the original project as an upstream remote one time. Then the usual sync is: switch to main, fetch upstream changes, merge upstream's main into your main, and push the updated main back to your fork.
Jamie: GitHub Desktop has a path for this too, right?
Alex: Yes. Desktop can fetch, show that your branch is behind, and help you update from the upstream project. The main idea is to sync before starting new work, before opening a pull request, and whenever a maintainer asks you to update your branch.
Jamie: Let's talk commits. A commit message feels tiny, but reviewers really do read it.
Alex: They do. A helpful commit message starts with a short first line in the imperative voice, like Add keyboard instructions to setup guide. If more context is needed, add a blank line and then a body explaining why the change was made. A footer can reference an issue, such as Closes #42.
Jamie: And atomic commits means each commit should be one coherent change, not a suitcase full of unrelated edits.
Alex: Exactly. Common mistakes are messages like update, fix stuff, or final changes. Better messages say what changed: Fix broken skip link target, Clarify installation steps, or Add tests for empty search results.
Jamie: Now the culture part. Open source communication is mostly written, asynchronous, and public. That changes everything.
Alex: It does. Written means people cannot hear your friendly tone unless you put it into the words. Asynchronous means someone may answer hours or days later. Public means future contributors may read the thread to understand what happened.
Jamie: So a short comment can accidentally sound sharp, especially without vocal cues.
Alex: Yes. Prefer wording that points at the code rather than the person. Say, This function returns null when the list is empty, instead of, You forgot the empty case. Use tentative language when you are unsure, like, I might be missing something, or, Could we consider this approach? Also, avoid urgency markers unless something is genuinely urgent, and remember that people may be writing in a second or third language.
Jamie: A lot of learners first participate by writing an issue. What makes an issue description useful?
Alex: Give context, exact steps, expected behavior, and actual behavior. If it is an accessibility issue, include the page or component, the assistive technology or browser when relevant, and the barrier you encountered. For example: I expected focus to move to the dialog title, but focus stayed behind the dialog.
Jamie: And asking for help has a structure too.
Alex: Yes. Say what you are trying to do, where you got stuck, what you already tried, and what kind of help you need. A clear question might be: I am on step 3 of the local setup, the test command returns this error, I tried reinstalling dependencies, and I need help understanding which file to check next.
Jamie: That also respects the fact that maintainers are often volunteers with limited time.
Alex: Right. Give people enough information to help without making them interview you first. Also choose the right channel: use an issue for bugs or feature discussion, a pull request for change review, a discussion thread for open-ended questions if the project uses Discussions, and private reporting only for security or sensitive conduct concerns.
Jamie: Pull request descriptions are their own genre. What should they include?
Alex: A good PR description answers what changed, why it changed, and how someone can test it. Link the related issue if there is one. If the PR is not ready, open it as a draft and say what kind of feedback would help.
Jamie: Documentation has the same community effect. A README is often the first conversation a project has with a new person.
Alex: A solid README includes the project name, what it does, installation, usage, contributing guidance, license information, and any accessibility notes that help people use or test the project. A good README is specific and current. A weak README assumes too much, hides setup steps, or uses vague phrases like just run it.
Jamie: And community health files are where projects make expectations explicit.
Alex: Yes. CONTRIBUTING.md explains how to contribute. CODEOFCONDUCT.md explains behavior standards and reporting paths. SECURITY.md explains how to report vulnerabilities. LICENSE explains what people are allowed to do with the code. On GitHub, you can usually find these files at the top level of the repository, or through the repository's community profile when it is available.
Jamie: Let's get into feedback. What does helpful review feedback sound like?
Alex: It usually starts by acknowledging what is working, then names a specific concern, explains why it matters, suggests a path forward when possible, and signals how important the concern is. For example: The new labels make the form clearer. One concern: this button text may be ambiguous for screen reader users. Could we change it to Save profile so the action is specific?
Jamie: That is very different from, This is confusing.
Alex: Yes. Review the code, not the person. Ask questions instead of making demands. Distinguish personal preference from project requirements. And when the change is good, approve explicitly so the author is not left guessing.
Jamie: Authors have etiquette too. Receiving review can feel personal, especially when you worked hard.
Alex: It can. Start with thank you, then separate the feedback from your identity. If you made a choice intentionally, explain the reasoning. If you are blocked, say so early instead of disappearing from the thread.
Jamie: Comment threads can get messy. What keeps them usable?
Alex: Keep comments focused on the issue or pull request. If a reviewer asks a question and you answer it, do not leave the conversation hanging forever. Resolve conversations when the concern is addressed, but do not resolve someone else's concern just to make the thread look clean.
Jamie: And no piling on.
Alex: Right. If three people have already said the same thing, use a reaction instead of adding another me too comment. Reactions can be useful for agreement, thanks, or acknowledgment without adding noise.
Jamie: The chapter also calls out saved replies as an accessibility win. Why?
Alex: Saved replies let you reuse comments you write often, like thanks for the report, could you add steps to reproduce, or this looks ready to me. They reduce typing load and help keep tone consistent. You create them in GitHub settings under saved replies, then insert one from the comment editor; with a screen reader, the path is still through settings and the comment box controls, just with careful navigation by labels and buttons.
Jamie: Accessibility comments need special care, because the wording can affect whether people feel blamed or included.
Alex: Yes. Describe the barrier and the user impact without shaming the author or treating disabled people as an afterthought. Say, This control needs an accessible name so screen reader users can identify it, rather than, This is bad for the blind. Inclusive language is precise, respectful, and centered on access.
Jamie: There is also a social contract around good first issues.
Alex: Maintainers should scope those issues clearly and leave enough context for a newcomer to begin. Contributors should read the issue carefully, check whether someone is already working on it, ask before expanding the scope, and follow through or communicate if they need to step away.
Jamie: What happens when the conversation gets uncomfortable?
Alex: If you receive harsh feedback, pause before replying. Pull out any actionable information, ask clarifying questions, and ignore the heat if you safely can. If the comment crosses a line, use the project's Code of Conduct process.
Jamie: And if you disagree with a maintainer's decision?
Alex: Disagree with evidence and respect. Explain the tradeoff you see, link to relevant behavior or documentation, and be willing to accept the decision after discussion. The project maintainers carry responsibility for the project, even when you would choose differently.
Jamie: What if you are the one who accidentally caused offense?
Alex: Do not defend the wording first. Acknowledge the impact, apologize briefly, correct the comment or behavior, and move forward. The Code of Conduct exists to make participation safer and clearer, not to scare people away from honest repair.
Jamie: So Challenge 08 is not asking learners to prove they are perfect communicators.
Alex: No. It is one guided reflection in your assigned Chapter 8 issue in your Learning Room repository. There is no bot grading because communication quality is too nuanced for that. You post a comment with three specific behaviors: one respectful review habit, one clear way to ask for help, and one constructive way to respond to feedback.
Jamie: Specific is the key word there. I will be nice is not as useful as, I will include the exact step where I got stuck and what I already tried.
Alex: Exactly. If you get stuck, write one simple sentence per prompt, draft in a text editor first if that helps, borrow the quick-reference style phrases, and ask a facilitator for an example you can adapt. Your evidence is the reflection comment itself, and when it appears with three actionable behaviors, you can close the issue.
Jamie: This also fits the bigger first-time contributor path. Open source is not only for people who write production code all day.
Alex: Anyone can contribute: documentation, testing, accessibility notes, design feedback, issue triage, examples, translations, and code all count when the project needs them. A good first contribution is small, clear, and reviewable. If the change touches many systems, requires a big redesign, or nobody can explain the expected result, it may be too large for a first attempt.
Jamie: After something is merged, the work is not just over and forgotten.
Alex: Say thanks, pull the latest changes, delete old branches when appropriate, and note what you learned. Bonus Challenge B uses that reflection for documenting your journey with accessible Markdown and portfolio language. Bonus Challenge C adds the team version: divide work, communicate status, and make collaboration visible. And when you want to go deeper, the chapter points to GitHub's contributing documentation, Open Source Guides, and related appendices on accessibility standards, Git security, branch protection, and GitHub Pages.
23. Challenge 08: The Culture Layer
Reflection, community norms, issue triage, labels, and respectful communication.
Practice focus: Day 1 stretch
Read Transcript - Challenge 08: The Culture Layer
Transcript
Alex: Welcome back. Today we are in Challenge 8, The Culture Layer, and it is a good reminder that open source is not only branches, commits, and pull requests.
Jamie: It is also how people treat each other while all that work is happening.
Alex: Exactly. In your Day 1 Learning Room repository, this challenge asks you to reflect on what made the workshop welcoming, then practice a small triage task by adding a descriptive label to an issue. There is no autograder for communication quality here, because a bot cannot fairly judge whether a reflection is thoughtful.
Jamie: So the evidence is human-readable: a reflection, the issue you triaged, the label you chose, and why.
Alex: Open source projects are communities that happen to use code, documentation, issues, and pull requests as their shared workspace. A project can have excellent technology and still feel hard to join if the communication is confusing, dismissive, or rushed.
Jamie: That lands. A newcomer may be trying to understand the tool, the project, the norms, and the social expectations all at once.
Alex: Right. That is why files like CONTRIBUTING.md and CODE_OF_CONDUCT.md matter. CONTRIBUTING.md explains how to participate, and a code of conduct explains the behavior the community expects. Those files tell you that filing a clear issue, improving docs, asking a useful question, or testing a fix can all be real contributions.
Jamie: And accessibility is part of that culture, not just a feature checklist. If the issue template is hard to follow, the branch names are confusing, or the docs skip context, people can get blocked before they even reach the code.
Alex: Yes. The project README is part of the welcome mat too. A helpful README usually gives the project name, what it does, how to install or run it, how to use it, how to contribute, the license, and any accessibility notes that help people participate.
Jamie: What does the reflection part look like in Challenge 8?
Alex: Start with your assigned Challenge 8 issue in your Learning Room repository. The prompt asks you to think about your workshop experience and answer two or three questions in one or two sentences each. You might write about what made you feel supported, what moment taught you something new, what would make the community more inclusive, or how a peer helped you.
Jamie: I like that it is not asking for a perfect essay. It is asking for a real observation.
Alex: Yes, and specific beats polished. Instead of writing, I will communicate better, you might write, I will include the exact step where I got stuck and what I already tried. Or, I will start a review comment by saying what is working before I suggest a change.
Jamie: Some versions of the chapter ask learners to commit to three collaboration behaviors: a respectful review habit, a clear way to ask for help, and a constructive way to respond to feedback.
Alex: Same skill, just a slightly different shape. The goal is to leave a comment that a facilitator can read and say, yes, this person has named a behavior they can actually practice today.
Alex: After the reflection, you will find an issue to triage. In this challenge, the suggested issue is called Peer Simulation: Welcome Link Needs Context, unless your facilitator gives you a real classmate's issue and you have access to it.
Jamie: Triage means sorting and describing the work, right? Not necessarily fixing it.
Alex: Exactly. Open the Issues tab, open the issue, and read the title and description before you touch the labels. Then find the Labels area in the right sidebar. Activate it, choose one label that describes the issue, and close the menu if needed. The label should appear on the issue.
Jamie: And the common choices here are bug, enhancement, documentation, good first issue, and question.
Alex: Yes. Bug means something is not working as expected. Enhancement means a suggested improvement. Documentation means the issue is about instructions, help text, or guidance. Good first issue means the work looks suitable for newcomers. Question means the issue needs clarification before the team can act.
Jamie: What if I cannot add a label?
Alex: That can happen if you do not have collaborator permission. In that case, leave a comment recommending the label and explain why, or ask the facilitator to check permissions. If you do not see any labels at all, open the Labels page from the Issues tab, near Milestones, or ask whether the default labels need to be created.
Jamie: This is where Challenge 8 starts touching Challenge 9 material, because labels are the doorway into organizing work.
Alex: Exactly. Labels are colored tags on issues and pull requests. They tell the team what kind of work something is, and screen readers announce them with the issue title, such as Label: bug, or Labels: accessibility, good first issue.
Jamie: So a label is not decoration. It changes how easy it is to scan, filter, and prioritize.
Alex: Right. You can filter the issue list by one label, combine labels, combine labels with open or closed state, or search across label names. Maintainers can also create new labels, give them descriptions, and choose colors, though description quality matters more than color for many learners.
Jamie: Where do milestones and projects fit?
Alex: A milestone groups issues and pull requests around a goal, release, or deadline. A GitHub Project is a planning board or table that can track items across a workflow, with fields like status, priority, or assignee. If you are unsure where an issue belongs, Needs Triage is a valid project status because it says, someone still needs to decide.
Jamie: And cross-references are the little links GitHub creates when one issue or pull request mentions another, like number 42.
Alex: Yes. Typing a number sign and an issue number can connect the conversation. Keywords like Closes number 42 are stronger: they close the linked issue when the pull request is merged into the default branch, so use them only when the PR really resolves the issue.
Alex: The culture layer also makes more sense when you remember the workflow underneath it: GitHub Flow. It is the lightweight pattern this workshop uses for contributions.
Jamie: That is the one where main stays safe, and you work on a branch.
Alex: Exactly. You create a branch from main with a descriptive name, make a small change, commit it, open a pull request, discuss and revise, wait for checks to pass, and then a maintainer merges it. The pull request becomes the shared conversation space for the change: what changed, why it changed, how to test it, and what feedback came up.
Jamie: I have heard of Git Flow too. Is that different?
Alex: It is. Git Flow is an older and more complex branching model with long-lived branches like main and develop, plus feature, release, and hotfix branches. It can fit scheduled releases, mobile apps, firmware, or enterprise products, but it is more machinery than we need for this workshop.
Jamie: So here, the habit is one focused task per branch.
Alex: Yes. A branch for one documentation fix, one accessibility improvement, or one small feature keeps review easier. If a pull request tries to fix five unrelated things, the conversation gets harder for everyone.
Jamie: What about keeping a fork up to date? That comes up in open source all the time.
Alex: It does. A fork is your copy of someone else's repository, and syncing it brings in changes from the original project. You sync so your work starts from current code, your pull request is easier to review, and you reduce the chance of conflicts.
Jamie: What is the easiest way in the browser?
Alex: On GitHub, open your fork and look for the sync option near the branch controls. If GitHub says your branch is behind, use the update option to bring your main branch current. Then create your work branch after that, not before, when you can.
Jamie: And if I am in the terminal?
Alex: The first time, you add an upstream remote that points to the original repository. After that, the usual rhythm is: switch to main, fetch upstream changes, merge upstream's main into your main, and push your updated main back to your fork on GitHub. In commands, that often looks like git checkout main, git fetch upstream, git merge upstream/main, and git push origin main.
Jamie: GitHub Desktop can help too, but labels still need the browser, right?
Alex: Correct. Desktop can fetch, pull, and push repository changes, and you can use Repository, View on GitHub when you need issue settings like labels. Sync before starting a branch, before opening a pull request, and any time a maintainer says your branch is out of date.
Alex: Small commits are another part of respectful collaboration. A commit message should help the reviewer understand what changed without opening every file first.
Jamie: What does a good commit message sound like?
Alex: The first line is required and should be short, specific, and written like an instruction: Add missing alt text, Fix broken welcome link, Update contributing guide. If you need more context, add a blank line and then a body explaining why the change was needed. A footer can reference an issue, such as Closes number 42, when that is accurate.
Jamie: And atomic commits means each commit is one coherent change.
Alex: Yes. Do not mix a typo fix, a feature change, and a formatting cleanup in one commit if they could be reviewed separately. Also avoid messages like update stuff or final final. Future you, and your reviewers, deserve better breadcrumbs.
Jamie: The communication advice in this chapter is practical. A lot of open source happens in writing, later, and in public.
Alex: That means comments need context. A helpful piece of feedback usually starts by acknowledging what is working, identifies the specific concern, explains why it matters, suggests a path forward if possible, and makes clear whether the concern is blocking or optional.
Jamie: So instead of, This is wrong, I might say, The new instructions are clear, but this link target seems to skip the setup step. Could we point to the beginner guide instead?
Alex: That is much better. Review the code or the documentation, not the person. Use we language when it fits, describe uncertainty honestly with phrases like I may be missing something, and avoid urgent wording unless something is truly urgent.
Jamie: There is also etiquette around comments themselves: stay focused, do not pile on, resolve conversations when they are handled, and use reactions when a full comment would just add noise.
Alex: Saved replies can help with that. They let you store reusable comments for common situations, like thanking someone for a report, asking for reproduction steps, or explaining how to add accessibility details. For many learners, a saved reply reduces typing effort and helps keep tone consistent.
Alex: Reviewers and authors both have responsibilities. Reviewers should ask questions instead of issuing commands, explain requirements instead of gatekeeping knowledge, separate personal preference from project standards, and approve explicitly when the work is ready.
Jamie: And authors should not have to pretend feedback never stings. But they can still respond professionally.
Alex: Yes. Say thank you, explain your choices, surface blockers early, and ask for clarification when a comment is unclear. If feedback is harsh, pause before responding. If you disagree with a decision, explain the tradeoff and accept the maintainer's call. If someone is rude, use the project's code of conduct or ask a facilitator for help. If you accidentally caused offense, acknowledge it, apologize plainly, and adjust.
Jamie: The good first issue label has a social promise behind it too.
Alex: It should mean the issue is scoped, understandable, and supported enough for a newcomer to attempt. And for accessibility issues, inclusive comments describe the barrier, the affected users or assistive technology when known, the expected behavior, and the impact without blaming the person who reported it.
Jamie: There are also different places to talk, and picking the right one is part of the culture.
Alex: Yes. Use issues for trackable work, pull request comments for feedback on a specific change, project boards for planning status, and discussions or chat for broader questions if the project uses them. Security reports should follow the project's SECURITY.md instructions, because public issues are not the right place for a private vulnerability report.
Jamie: And those community health files are worth checking before you contribute: CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, LICENSE, and the README.
Alex: They answer different questions. How do I help? How do we treat each other? How do I report sensitive problems? What am I allowed to do with this code? What is this project and how do I start?
Alex: To finish Challenge 8, put your evidence in the challenge form or issue prompt. Include your reflection answers, the issue you triaged, the label you added, and why you chose it.
Jamie: A simple example would be: Reflection: I felt supported when a peer explained how they found the Issues tab. I learned that asking a clear question is a contribution. I triaged issue number 12 by adding the documentation label because the issue asks for more context in the welcome link.
Alex: That is exactly the level of detail needed. If you add an optional comment on the issue itself, keep it short and useful: I added the documentation label because this issue helps new contributors understand the welcome section.
Jamie: Alternate approaches are fine too, right? Someone might focus on the code of conduct, the contributing guide, or compare this repo's norms with another project they have seen.
Alex: Yes. What matters is that the reflection shows you understand open source has cultural norms as well as technical steps. If you get stuck, write one simple sentence per prompt, draft in a text editor first if that helps, and ask a facilitator for one example you can adapt in your own words.
Jamie: So Challenge 8 is small on purpose, but it is not minor.
Alex: Right. A respectful label, a clear reflection, and a thoughtful comment are all part of contribution work. They make the repository easier to navigate, easier to review, and easier for the next person to join.
24. Episode 9: Labels, Milestones, and Projects
Organizing and tracking work with labels, milestones, and GitHub Projects.
Based on: Chapter 9: Labels, Milestones, and Projects
Read Transcript - Episode 9: Labels, Milestones, and Projects
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.
25. Episode 26: GitHub Projects Deep Dive
Project boards, table and roadmap views, custom fields, cross-repo management.
Based on: Appendix R: GitHub Projects Deep Dive
Read Transcript - Episode 26: GitHub Projects Deep Dive
Transcript
Alex: Welcome back. Today we're taking a deeper look at GitHub Projects, the project management tool built right into GitHub.
Jamie: This is the feature that can look like a board, a spreadsheet, or a timeline, right? I have seen all three and wondered whether they are the same thing wearing different outfits.
Alex: They are views of the same underlying project data. The current GitHub Projects experience is often called Projects v2, and it replaced the older Classic project boards for most day-to-day planning.
Jamie: So if someone sees older references to Projects Beta or Classic Projects, they should not assume those screens are what they will use now.
Alex: Exactly. Classic projects were mainly Kanban boards. Current Projects can use Board, Table, and Roadmap layouts; they support custom fields, stronger filtering, cross-repository tracking, built-in workflows, GitHub Actions integration, and a fuller API through GraphQL.
Alex: A project can start from either an organization or a repository. From an organization page, you open the Projects tab, activate New project, choose a template such as a blank table or blank board, name it, and create it.
Jamie: And from a repository, it is similar, except the Projects tab may offer Link a project or New project depending on what already exists.
Alex: Right. With a screen reader, the creation flow is pretty direct: go to the org or repo Projects tab, tab to the New project button, press Enter, use arrow keys in the template modal, press Enter on the template you want, type the project name, then tab to Create project and press Enter.
Jamie: Low vision learners should also know that the template picker is a grid, so zooming in can make the card names and descriptions easier to compare. And after creation, the Add item row may be near the bottom, so it can be easy to miss at high zoom until you scroll.
Alex: The default layout is Table view. It works like a spreadsheet: every row is an issue, pull request, or draft item, and the columns are fields such as Title, Status, Assignee, Labels, Repository, Priority, or any field you add.
Jamie: That sounds like the safest place to do careful editing. What are the keyboard moves people should recognize?
Alex: In Table view, T can jump you to the table when GitHub keyboard shortcuts are active. Up and down move through rows, left and right move through columns, Enter opens the item detail panel, Escape closes it, Space on a cell edits the value, and F2 on a title cell edits the title inline. A screen reader might announce a row as something like: Fix keyboard trap in modal dialog, Status In Progress, Assignee alice, Priority High, Labels bug and accessibility.
Jamie: Board view is the Kanban one, with columns like Todo, In Progress, and Done. But I want to call out the awkward part: dragging cards is not a good keyboard workflow.
Alex: Yes. To move a card without dragging, open the card with Enter, move to the Status field in the detail panel, open the dropdown, choose the new status, and press Escape to close the panel. Board view is useful for work-in-progress conversations and quick status reviews, but Table view is usually better for precise keyboard editing.
Jamie: And Roadmap view is the timeline. It is helpful for release planning or sprint planning, but because it is chart-based, the data should still be edited in Table view.
Alex: Exactly. Roadmap uses date information, such as Start Date, Due Date, or milestone timing. Items without dates can show up outside the dated timeline, often in an ungrouped area, so if something is missing from the roadmap, check its date fields first.
Jamie: Custom fields are where Projects start to feel less like a static board and more like a planning system. What field types are available?
Alex: You can add Text fields for notes like acceptance criteria or design links. Number fields work well for estimates or story points. Date fields handle deadlines or start dates. Single select fields create a dropdown, which is great for Priority, Size, Type, or Risk. Iteration fields track cycles or sprints.
Jamie: How does someone create one without hunting around forever?
Alex: Table view is usually easiest. Move across the column headers until you reach the plus button at the end, activate it, choose the field type, give the field a name, and configure any choices or date settings. With a screen reader, listen for the column header area and the add field control; after the field exists, you can edit an item's value either in the table cell or from the item's right-side detail panel.
Jamie: Projects can hold real issues and pull requests, but they can also hold draft items. That distinction is easy to miss.
Alex: An existing issue or pull request is already connected to a repository. You can add one to a project from the Add item control, by searching for it, pasting its URL, or using project controls from the issue or pull request itself. A draft issue is lighter weight: it lets you capture work before you know which repository it belongs in or before it is ready to become a real issue.
Jamie: And when the draft becomes real work, you can promote it to an issue in a repository.
Alex: Yes, and for bigger cleanups you can bulk edit items. Select multiple rows or cards, then change a field like Status, Assignee, Iteration, or Priority for all selected items at once.
Jamie: This is also where cross-repository projects come in. One project can track work from more than one repository, especially at the organization level.
Alex: Right. You can connect repositories to a project and use the Repository field to see where each item lives. That field becomes powerful when you filter or group by repo, because one team can track accessibility bugs in a web app, documentation tasks in a docs repo, and release work somewhere else without splitting the plan into separate boards.
Jamie: Manual tracking is useful, but nobody wants to update every field by hand forever. What automation is built in?
Alex: Projects include workflows you can configure from the project settings or workflows area. Common ones include automatically adding matching issues or pull requests, changing Status when an item is added, moving closed issues to Done, updating pull requests when they are merged, and archiving completed items after a period of time.
Jamie: Auto-add sounds especially helpful. Could I say, add every new issue with the accessibility label from this repository into the project?
Alex: Yes. Auto-add rules can watch repositories and match criteria such as labels or other issue properties, depending on the rule options available to your account and project. And for more advanced cases, GitHub Actions can interact with Projects too, often by using GitHub's API or command-line tooling to add items, update fields, or report project state as part of a workflow.
Jamie: Where do iterations fit in? Are they just another name for milestones?
Alex: They are different. A milestone usually represents a release or deadline, while an iteration field represents a repeating cycle, such as a one-week or two-week sprint. You create an Iteration field, set a start date and duration, optionally add breaks, and then assign items to the current or upcoming cycle. Over time, iteration views can help a team notice capacity, spillover, and what actually got finished.
Alex: Views let you save different ways of looking at the same project. One view might be a table of everything, another might be a board grouped by Status, and another might be a roadmap filtered to a release.
Jamie: So a view is not a copy of the work. It is a saved lens on the work.
Alex: Exactly. You can create a new view, choose the layout, apply a filter, group items, sort them, and save it. Filter syntax can include terms like status:In Progress, assignee:octocat, label:accessibility, repo:org/name, is:open, or milestone:v1, plus custom field values such as priority:P0 if your project has that field.
Jamie: Grouping and sorting are the pieces that make the same project useful to different people. A maintainer might group by repository, a project lead might group by iteration, and a contributor might sort by due date or priority.
Alex: Exactly. The trick is to make views serve a question: what is blocked, what is due soon, what is assigned to me, what belongs to this repo, or what is in the current sprint.
Jamie: Let's talk about navigation, because a project can feel busy fast.
Alex: On the project home page, you are usually moving through a list of projects. Inside a project, listen for the view tabs, the filter bar, the main layout, and the right-side detail panel. In Table view, row and column movement gives the most complete text access. In Board view, Tab moves through columns and cards, and Enter opens a card. In the detail panel, fields such as Status, Assignee, Labels, Date, Repository, and custom fields can be reviewed and changed.
Jamie: And the filter bar is worth learning because it can shrink a huge project down to the few items you need.
Alex: Yes. If you lose your place, a good recovery pattern is to return to the view tabs, confirm the active view, check the filter bar, then move into the table, board, or detail panel again.
Jamie: The appendix also mentions an Accessibility Agents command, /project-status. How should learners understand that?
Alex: The Accessibility Agents collection is a living catalog, so available helpers can grow over time. The /project-status helper is meant to summarize project health: what is open, what is in progress, what may be blocked, what is overdue, and where attention is needed. You would use it before a standup, before a review, or when you need a plain-language snapshot instead of manually scanning every row.
Jamie: The practice work in this appendix is practical rather than theoretical.
Alex: Yes. One exercise is to create a personal tracking project, add a few real or draft items, and try Table, Board, and Roadmap views. Another is to set up automation, such as auto-adding matching issues or moving completed work. A third is to create a sprint view with an Iteration field. The advanced exercise is to build a cross-repository project and use the Repository field to filter or group the work.
Jamie: I like that progression. First you make a project, then you make it easier to maintain, then you make views for planning, and finally you coordinate across repositories.
Alex: Exactly. And if you want to verify behavior beyond this walkthrough, use GitHub's official documentation for Projects, labels, milestones, and the API. Projects change over time, so the strongest habit is learning where the controls live and how to confirm what a view is actually showing.
26. Episode 27: Advanced Search
GitHub search query language, qualifiers, and filtering for issues, PRs, and code.
Based on: Appendix N: Advanced Search
Read Transcript - Episode 27: Advanced Search
Transcript
Alex: Welcome back. Today we're talking about GitHub advanced search, which sounds like a power-user feature, but it is really a way to stop wandering around the site when you already know what you want.
Jamie: I love that framing, because search is where I go when I can't remember which repo, issue, pull request, or file I saw something in.
Alex: Exactly. GitHub search can reach across repositories, code, issues, pull requests, commits, users, organizations, and topics. The trick is learning the small query language that narrows the results before you ever press Enter.
Jamie: So instead of opening menus and checking boxes, I can type a more precise sentence into the search field.
Alex: Yes. And if you use a screen reader or high zoom, that can be a big relief. A typed query often gives you a clean results page faster than moving through filter dropdowns, sidebars, and checkbox menus.
Jamie: Where do you start from on GitHub?
Alex: On most GitHub pages, press slash to focus the global search bar at the top. Type your query, press Enter, and GitHub opens a results page grouped by type, such as Code, Issues, Pull requests, Repositories, and Users.
Jamie: Global search is the one at the top of the page. But GitHub also has search boxes inside repositories, right?
Alex: Right. The global search bar starts broad, across all of GitHub unless your query narrows it. Inside a repository, the Issues tab and Pull requests tab have their own search fields, and those are already scoped to that repository.
Jamie: So if I'm in a repo's Issues tab, I don't need to type the repo name unless I want to be extra explicit.
Alex: Exactly. But when you're starting from the top search bar, you can scope the search yourself with qualifiers like repo:owner/name, org:orgname, or user:username. A qualifier is a key and a value separated by a colon.
Jamie: Give me a concrete one.
Alex: repo:community-access/accessibility-agents in:title keyboard searches that repository for results with keyboard in the title. The in:title part says, do not search every body and comment; focus on the title field.
Jamie: That would reduce a lot of noise. What about in:body and in:comments?
Alex: Those work the same way. Use in:body when the important detail is likely in the description, and in:comments when you're looking for discussion after the issue or pull request was opened.
Jamie: And if I do lose the search bar visually at high zoom, slash brings me back there.
Alex: Yes. After results load, screen reader users can jump by headings to move between result groups. Low vision users can also use browser zoom to make GitHub's bold matched terms easier to find, and the Advanced Search page at github.com/search/advanced is a good bookmark if you want labeled form fields instead of compact syntax.
Alex: The query language itself starts simple. If you type two words, GitHub treats that as both words. So keyboard navigation means results should match keyboard and navigation.
Jamie: And if I want either word?
Alex: Use OR in capital letters, like keyboard OR focus. For an exact phrase, put it in straight quote marks, like "skip link". To exclude a word, put a minus sign in front, like -deprecated.
Jamie: I have definitely needed that last one. Sometimes one noisy term takes over the whole search.
Alex: You can also exclude a qualifier. For example, -label:bug means results should not have the bug label. That same key:value pattern is the heart of GitHub search.
Jamie: Let's unpack the issue and pull request qualifiers people see all the time.
Alex: is:open means open items only, and is:closed means closed items only. is:issue limits results to issues, and is:pr limits results to pull requests. For pull requests, is:merged finds merged PRs, and is:unmerged finds PRs that were not merged.
Jamie: And labels?
Alex: label:accessibility finds items with that label. If the label has spaces, quote it, like label:"good first issue". no:label finds items with no labels, no:assignee finds items assigned to nobody, and no:milestone finds items not attached to a milestone.
Jamie: What about the human side, like who made it or who owns it now?
Alex: author:@me finds items you created. assignee:@me finds items assigned to you. mentions:username finds places where that user was mentioned, and involves:@me is broader: it can include things you created, were assigned to, were mentioned in, or commented on.
Jamie: Dates use the same style?
Alex: Yes. created:>2025-01-01 means created after that date. updated:<2026-01-01 means updated before that date. A range looks like created:2025-01-01..2025-03-31.
Jamie: Let's use this for issues and pull requests, because that is where a lot of contribution work starts.
Alex: A good direct place is github.com/issues for issues involving you, and github.com/pulls for pull requests involving you. Those pages are already focused on repositories you have access to, so the result list can feel more manageable than a full global search.
Jamie: What would I type if I wanted open accessibility issues in an organization, but only ones nobody has claimed yet?
Alex: org:community-access is:issue is:open label:accessibility no:assignee. That says: search this organization, only issues, only open ones, with the accessibility label, and no current assignee.
Jamie: That is much more precise than searching the word accessibility and hoping.
Alex: For beginner-friendly work across GitHub, try is:issue is:open label:"good first issue" no:assignee. If you want a language filter, add language:python or language:javascript.
Jamie: Does language always make sense for issues?
Alex: It depends. GitHub can use repository language signals, so it is useful when you want issues from projects mostly written in a language. It does not mean the issue text itself is written in Python or JavaScript.
Jamie: What about pull request review?
Alex: A daily review query is is:pr is:open review-requested:@me. If you need pull requests where someone mentioned you, use is:pr is:open mentions:@me. To find your own open issues, use is:issue is:open author:@me.
Jamie: And stale work?
Alex: Use a date qualifier. For example, is:issue is:open repo:owner/name updated:<2024-08-01 finds open issues in one repository that have not been updated since before that date.
Jamie: Pull requests have a few special qualifiers too, don't they?
Alex: They do. review:approved can find PRs with an approving review. draft:true finds draft pull requests, while is:draft is another common way to express that. head:branch-name searches by the source branch of a PR, and base:main searches by the target branch.
Jamie: So base:main is useful when I only care about PRs trying to merge into main.
Alex: Exactly. And once the results are right, sorting helps. sort:created-asc puts the oldest created results first, while sort:updated-desc puts the most recently updated results first.
Alex: Code search feels related, but it has its own behavior. GitHub's modern code search is built for files, symbols, paths, and exact strings, not just issue text.
Jamie: So if I want to find aria-label in JavaScript files inside one repo?
Alex: Use repo:owner/name language:javascript aria-label. That combines a repository scope, a language filter, and the text you want to find.
Jamie: What if I know the function name?
Alex: Try symbol:handleKeyDown with a repo scope, like repo:owner/name symbol:handleKeyDown. Symbol search is meant for named code things such as functions or classes, where GitHub can recognize them.
Jamie: And across an organization?
Alex: org:community-access aria-hidden="true" searches across repositories in that organization for that exact pattern. You can tighten it with path:src/ to search only files under a path, extension:md to search Markdown files, filename:config.yml for a specific file name, or content:"exact string" for an exact string in file content.
Jamie: I like path:src/ because it lets me ignore docs or generated files when they are not relevant.
Alex: Exactly. And org: and repo: are useful here too. repo:owner/name means one repository, while org:orgname means all repositories in that organization.
Jamie: Commits are searchable too, but I always forget that.
Alex: They are. A query like repo:owner/name fix keyboard navigation can find commits with those words in the message. repo:owner/name author:username finds commits by a specific author, committer-date:2025-01-01..2025-03-31 narrows by date range, and path:docs/README.md finds commits touching a specific file.
Jamie: Search is not only for work items and files. It can also help you discover projects.
Alex: Yes. Repository search is great for finding communities and examples. topic:accessibility stars:>50 is:public finds public repositories tagged with the accessibility topic and more than 50 stars.
Jamie: And if I want TypeScript projects related to screen readers?
Alex: language:typescript topic:screen-reader sort:stars-desc. That filters by language and topic, then sorts with the most-starred repositories first.
Jamie: What other repository qualifiers are useful?
Alex: stars:>100, forks:>10, archived:false, and pushed:>2025-01-01 are common ones. You can use them to avoid abandoned projects, or to find active projects with a certain amount of community activity.
Jamie: Can I search for people and organizations the same way?
Alex: Yes. User and organization search supports qualifiers like type:user, type:org, location:, and fullname:. You might search accessibility type:user, or accessibility type:org, then use the result type filters to narrow what GitHub shows.
Alex: In this workshop, search becomes especially useful when you're looking for contribution opportunities or checking whether a report already exists.
Jamie: So before I file a new issue, I can search for the problem first.
Alex: Exactly. In a repository, use terms from the problem plus is:issue. If the issue is about keyboard focus, a query like repo:owner/name is:issue keyboard focus in:title can quickly show whether someone already filed something similar.
Jamie: And for the Accessibility Agents work, we should treat that collection as a living catalog, not a fixed set.
Alex: Right. Challenge 15 is browse-first, so search can help you discover what is already there without requiring a fork. A query like repo:community-access/accessibility-agents is:issue is:open label:accessibility can help you find current discussion or possible work, depending on the repository's labels.
Jamie: Then Challenge 16, the Capstone Project, is broader than one repo.
Alex: Yes. A meaningful capstone contribution might be to Accessibility Agents, GLOW, or another repository where the work matters. Review-ready drafts and contribution plans can count as completion evidence, so search can help you gather proof, locate related issues, and avoid duplicating work.
Jamie: What about proof after the fact?
Alex: Use is:pr is:merged author:@me to find your merged pull requests. Add org:community-access or repo:owner/name if you need proof from a specific place. For recent discussion about a topic, combine the topic words with updated:>2025-01-01 and maybe in:comments.
Jamie: I know I can bookmark a results page, but is there a better habit than leaving a pile of random bookmarks?
Alex: Build a small personal search library. Save the searches you actually reuse: review requests, your open issues, beginner-friendly issues, stale issues in a repo you maintain, and proof of merged work.
Jamie: Because the query is stored in the URL after I run the search.
Alex: Exactly. You can bookmark that URL, keep it in a notes file, or make a Markdown table with the name of the search, the query, and when you use it. That turns search from a one-time trick into part of your workflow.
Jamie: And if I live in the terminal?
Alex: The GitHub CLI has gh search commands. For example, gh search issues "is:open label:accessibility no:assignee" can bring issue search into your command line, and gh search prs "is:open review-requested:@me" can help you check review requests without opening the browser first.
Jamie: So the same mental model carries over: words, qualifiers, scopes, dates, and sorting.
Alex: That's the key. Start broad only when you need to explore. When you know the repository, organization, state, label, author, date, or file path, put that knowledge into the query.
Jamie: And the payoff is not just faster search. It is fewer wrong turns, fewer duplicate issues, and a cleaner path to the contribution you were trying to make.
Alex: Well said. Advanced search is one of those skills that makes GitHub feel smaller, calmer, and much more navigable.
27. Episode 10: Notifications and Mentions
Managing your notification inbox, @mentions, and strategies for avoiding overload.
Based on: Chapter 10: Notifications and Mentions
Read Transcript - Episode 10: Notifications and Mentions
Transcript
Alex: Welcome back. Today we're talking about GitHub notifications, which are the little signals GitHub sends when something might need your attention.
Jamie: And I am glad we are doing this, because notifications can feel like a second inbox that nobody warned you about.
Alex: Exactly. GitHub can notify you because you participated in a thread, because someone mentioned you, because you were assigned, because someone requested your review, or because something happened on a repository you chose to watch.
Jamie: So participating and watching are not the same thing.
Alex: Right. Participating means GitHub sees you as directly involved. You commented, opened the issue or pull request, got assigned, were requested as a reviewer, or someone typed your username with an at sign. Watching is a repo-level choice that can add more notifications, sometimes a lot more.
Jamie: That explains why one repository can be quiet and another can suddenly flood you.
Alex: Yes. Common notification reasons include a mention, a review request, an assignment, activity on a subscribed thread, a failed CI check on your pull request, or a release from a repo you watch for all activity. CI means continuous integration, the automated checks that run tests or validation after code changes.
Jamie: For the workshop, what are learners actually expected to do with this?
Alex: Chapter 10 is guided practice, not an autograded automation task. Notification settings belong to your GitHub account, so the Learning Room bot cannot reliably grade them. The pattern is configure, filter, and act, then leave evidence in your assigned Chapter 10 challenge issue.
Jamie: And this uses the GitHub website, not email, right?
Alex: Right. The practice happens at github.com/notifications, or by using the bell icon in the GitHub header. You do not need email delivery to complete it, because email depends on mail settings, spam filters, and other things outside the workshop. The web inbox is consistent, and the habits transfer later if you choose to use email or mobile notifications.
Jamie: This also connects back to Challenge 09, the Day 1 stretch, because final pull request readiness depends on seeing review signals and knowing when a PR is ready to merge.
Alex: Yes. Challenge 09 is where you pay attention to review requests, status checks, merging, and verifying that a linked issue closes. Chapter 10 gives you the inbox skills behind that work, and Bonus Challenge D goes deeper into notification hygiene, mentions, subscriptions, and avoiding overload.
Alex: Start in your Learning Room repository on GitHub.com. That repo is provisioned for your Day 1 practice, including issues, branches, commits, pull requests, and merges. Near the top right of the repository page, in the same general area as Star and Fork, find the Watch control.
Jamie: What should screen reader users listen for there?
Alex: With NVDA or JAWS, you can move by buttons until you hear Watch, Unwatch, or something similar. Press Enter to open the dropdown, move through the choices with the arrow keys, and press Enter on the level you want. With VoiceOver on macOS, use Quick Nav or VO navigation to find the Watch button, use VO+Space to open it, move through the choices, and use VO+Space to choose.
Jamie: And the recommended choice for most workshop repos is Participating and @mentions.
Alex: Yes. That keeps you informed when you are involved, without subscribing to every comment on every issue. Other levels matter too: All activity means every issue, PR, and comment; Ignore means no notifications from that repository; Custom lets you pick certain types, like issues, pull requests, or releases. You may also hear not watching in GitHub language, which usually means you are not asking for broad repo updates, though direct participation can still reach you.
Jamie: Where does starring fit? I have definitely confused Star and Watch before.
Alex: A star is a bookmark or a public signal that you like or want to find a repository later. Watching changes notifications. A common mistake is starring a repo you like, then also choosing too many watch updates by accident. If that happens, go back to the Watch dropdown and choose Participating and @mentions, Custom, or Ignore, depending on how quiet you need it to be.
Jamie: Once the watch level is set, the action moves to the inbox.
Alex: Yes. Go to github.com/notifications, use the bell icon, or, if GitHub keyboard shortcuts are active for your account, press G then N. The page usually has navigation and filters around the list, with tabs or controls for unread, done, and saved notifications.
Jamie: What does each notification sound like when you move through the list?
Alex: The list is made of links and controls. A notification normally announces the title, the repository, and the reason, such as mention, review requested, assignment, or status. Open one by activating its title link, read enough to understand why it appeared, then return to the inbox.
Jamie: And then there are actions: read, done, saved, and mute.
Alex: Right. Marking read or unread changes whether it appears as new. Marking done removes it from the active inbox, but future activity can bring it back. Saving keeps something available for later. Muting or unsubscribing from a thread stops future updates unless something directly pulls you back in, such as a new mention, depending on GitHub's current rules.
Alex: Filtering is where the inbox becomes useful instead of noisy. In the Chapter 10 walkthrough, activate the Review requested filter first, then clear it and activate Assigned.
Jamie: Review requested is probably the one people will use constantly in real projects.
Alex: Absolutely. It shows pull requests where someone wants your review. Assigned shows issues or PRs assigned to you. You can also filter by repository or organization, which is helpful when your personal work, class work, and open source work all share the same inbox.
Jamie: What about a pull request where the notification is really about a failing check?
Alex: Open the notification, go to the pull request, and look for the checks or status area. If a CI check failed, you are not just reading a message; you are deciding whether the failure needs your action before merge. That is especially important during final PR readiness work in Challenge 09.
Jamie: Let's talk about mentions, because typing someone's username feels simple, but it can also be a little loaded.
Alex: A mention is written as @ followed by a GitHub username, like @alex-example. It is a direct attention signal, so use it when you need that person to see the comment. A team mention looks like @org/team-name, and it notifies members of that team according to their organization settings and permissions.
Jamie: So a mention is not decoration. It is more like saying, please look at this.
Alex: Exactly. Good mentions include context, such as what you need reviewed, what decision is blocked, or what question you are asking. If you receive a mention you did not expect, first check whether it needs action. If it was accidental or no longer relevant, it is fine to reply briefly, mark it done, or unsubscribe from the thread.
Alex: When your inbox grows, do not try to treat every notification the same way. First handle the things that directly name you: mentions, assignments, and review requests. Then scan repo or organization filters for anything you chose to follow.
Jamie: I get nervous about mark all as done. It sounds like deleting everything.
Alex: It is not deletion. Done means the notification leaves the active inbox, but the issue or PR still exists, and future activity can notify you again if you are still subscribed. Still, use mark all as done only after a quick scan, and save anything you truly need to revisit.
Jamie: Where do account settings come in?
Alex: In GitHub Settings, you can configure notification preferences for web, email, and other delivery choices. Email can be useful, but it is optional for this challenge. The web inbox is the shared baseline, and the GitHub mobile app is a useful reference if you want notifications on your phone later.
Jamie: So mobile is allowed as a personal workflow, but it is not the thing being tested here.
Alex: Correct. And if your screen reader intercepts a shortcut like E, I, M, or Shift+M, focus the notification row or use the visible action menu instead. NVDA, JAWS, and VoiceOver each have their own browsing modes, so the reliable path is: find the notification, confirm the title and reason, then choose the action intentionally.
Jamie: What if someone wants a command-line style workflow too?
Alex: The gh CLI can help with notification-like checks, even though the browser inbox is still the focus here. You can list pull requests requesting your review, view issues assigned to you, check the status of a pull request, and open the notification page in your browser with gh browse. For example, gh pr list with a review-requested search, gh issue list assigned to you, and gh pr checks can help you find work without hunting through pages.
Jamie: And VS Code?
Alex: With the GitHub Pull Requests extension, VS Code can show items needing attention and open related issues or pull requests. GitHub Desktop is different; it is great for commits, branches, and syncing, but it does not manage the notification inbox. For notification triage, use the browser, the GitHub mobile app if you choose, or CLI-supported checks.
Alex: To complete the Chapter 10 practice, change the watch level on your Learning Room repository, test the Review requested and Assigned filters, and perform one inbox action on a non-critical thread. That action can be mute, unsubscribe, mark done, mark read or unread, or save, depending on what is available and appropriate.
Jamie: Then the evidence is a comment on the assigned challenge issue.
Alex: Yes. Post a short completion comment that says Chapter 10 completed, the watch level you set, the filters you tested, and the inbox action you performed with a brief thread description. Then close your Chapter 10 challenge issue.
Jamie: And if the inbox is empty or the filters show nothing?
Alex: That is okay. Check the Done tab for older notifications, clear active filters before trying a new one, and ask a facilitator to model an inbox action if you need to hear the workflow once. If you are unsure how this connects to merge readiness, compare your final PR checks with the Challenge 9 reference solution.
Jamie: The confidence check is pretty practical: can you reduce noise, find review requests, find assigned work, and choose what to do with a notification?
Alex: Exactly. If this was your first time, you have already learned a professional maintenance habit: set sane watch levels, filter for signal, act on each item, and keep a daily rhythm that does not depend on panic. Between days, keep the Learning Room inbox manageable, and when Day 2 adds broader collaboration, you will have a calmer way to notice what needs you.
28. Challenge 09: Merge Day
Final PR readiness, review signals, merging, and verifying linked issue closure.
Practice focus: Day 1 stretch
Read Transcript - Challenge 09: Merge Day
Transcript
Alex: Welcome back. Challenge 09 is Merge Day, and it is exactly what it sounds like: your Day 1 pull request becomes part of the main branch.
Jamie: This is the moment where the work stops being a practice change on a side branch and becomes the shared version of the repository.
Alex: Yes. In your private Learning Room repository, you have already filed an issue, made a branch, committed a change, and opened a pull request. Now you are checking that the pull request is ready, merging it, and confirming the linked issue closed the way you expected.
Jamie: I like that this is not just click the big green button and hope. There is a final check before the celebration.
Alex: Exactly. Merging is a real collaboration signal. It says the change was reviewed enough, the checks are acceptable, and the repository is ready to include your work on main.
Jamie: Before we touch the merge button, what should be true about the pull request?
Alex: Start with the basic readiness signals. Your PR should not have conflict markers like less-than signs, equals signs, and greater-than signs from a merge conflict. If GitHub says the branch has conflicts, pause and go back to the conflict workflow before merging.
Jamie: And the pull request description still matters here, right? Even this late?
Alex: Very much. The description should say what changed, why it changed, and which issue it closes. The key line is `Closes #XX`, with the number of the issue you filed earlier, because that text is what lets GitHub close the issue automatically when the PR merges.
Jamie: So if I wrote a vague description in Challenge 6, Merge Day is a good time to clean it up.
Alex: Yes. A strong PR usually has a short summary, a list of changes made, related issues, testing notes, and sometimes screenshots or recordings if the change is visual. For today's Learning Room work, it may be simple, but the habit scales to larger projects.
Jamie: Let's say I have my repo open and I am trying to find the PR. What is the path?
Alex: Open the Pull requests tab in your Learning Room repository, then open the PR you created in Challenge 6 or the later PR you are using for Day 1. If GitHub keyboard shortcuts are enabled, the repository shortcut G then P can move you toward the pull request list. You can also arrive from a notification, from the bell inbox, from GitHub Desktop opening the PR in the browser, or from the GitHub CLI with a command like `gh pr view --web`.
Jamie: Once I am on the PR page, I sometimes feel like there are too many tabs and regions. Where do I read first?
Alex: Begin on the Conversation tab. That is where you find the description, the review discussion, bot comments, status checks, and the merge area. With a screen reader, headings and landmarks are your friends here; in NVDA, browse mode is usually best for reading, and focus mode is for typing in fields.
Jamie: Then the other tabs are for confirming the details?
Alex: Right. Commits shows the commit history. Checks gives more detail about automated tests and validation. Files changed shows the diff, where added lines are marked with plus, removed lines with minus, and unchanged lines give context. If there are review comments, unresolved conversations, or suggested changes, read those before merging.
Jamie: What review signals should make me stop instead of merge?
Alex: If the PR is still a draft, do not treat it as ready until it is marked ready for review. If a reviewer requested changes, read the comments and respond with another commit or a reply. If required checks are failing, open the Checks tab or the bot comment and fix the issue first.
Jamie: And if the checks are green, the description links the issue, and the diff looks right, then we are looking for the merge button.
Alex: Yes. Near the merge area, GitHub should offer a green Merge pull request button when the PR can be merged. Some repositories use branch protection, which can require a review, passing checks, or facilitator approval before that button becomes active.
Jamie: What about merge options? Sometimes I hear merge commit, squash, and rebase, and I freeze.
Alex: For this challenge, use the default option your repository presents unless your facilitator tells you otherwise. A merge commit preserves the branch history as a merge. Squash and merge combines the branch's commits into one commit. Rebase and merge replays the commits onto main. Those are maintainer choices; today, your main responsibility is to avoid merging before the PR is ready.
Jamie: All right. Walk me through the actual merge, slowly.
Alex: Open the PR, move to the merge area, and activate the green Merge pull request button. GitHub may ask you to confirm, so activate Confirm merge. After that, the page should report that the pull request was successfully merged, and the PR status changes to merged, often with a purple merged icon.
Jamie: And if there is a dropdown asking how to merge?
Alex: Choose the normal merge option unless your facilitator has given a different instruction. In some repositories you may also see auto-merge, which waits and merges later after required checks pass. That can be useful in professional work, but for Challenge 09, most learners are doing a direct merge when everything is already ready.
Jamie: Should I delete the branch afterward?
Alex: If GitHub offers Delete branch after the merge, it is usually safe for this short Learning Room branch. The work is already on main, and deleting the branch removes clutter. If you are unsure, ask before deleting, but for a completed feature branch this is a normal cleanup step.
Jamie: The PR says merged. How do I prove the change actually landed on main?
Alex: Go back to the Code tab of the repository. Check the branch dropdown and make sure it says `main`, not your feature branch. Then open the file you changed, often `docs/welcome.md` in this challenge path, and confirm your new welcome text is there instead of the TODO.
Jamie: That part seems important because the PR page alone tells me the PR merged, but the Code tab shows what everyone gets on main.
Alex: Exactly. The second verification is the linked issue. Open the Issues tab, find the issue from Challenge 2, and confirm it is closed. If the PR description used `Closes #XX` with the correct number, GitHub should close it automatically when the PR merges.
Jamie: What if the issue did not close?
Alex: First, check whether the PR description had the correct issue number before the merge. If you have not merged yet, edit the description and include the correct `Closes #XX` line. If the PR is already merged, ask your facilitator whether to close the issue manually with a comment linking back to the merged PR.
Jamie: The challenge asks for evidence. What should a good completion comment include?
Alex: Keep it concrete. Include a link to the merged PR, a link to the issue that closed, and one thing you are proud of from Day 1. For example, you might say that PR number 5 fixed the TODO in `welcome.md`, linked to issue number 3, and taught you how issues and pull requests connect.
Jamie: I like the proud-of line. It makes the evidence more than a receipt.
Alex: It does. You can also mention what surprised you, such as how much of open source is communication: issue descriptions, PR summaries, comments, review replies, and clear commit messages. The alternate ways to recap are also fine: a comment on the challenge issue, a short summary in the workshop discussion channel, or a brief reflection file if your facilitator wants that.
Jamie: But the core proof is still the loop: issue, branch, commit, PR, merge.
Alex: Yes. If you merged at least one PR and can explain what you learned, you completed the Day 1 workflow. The evidence is there to help you and your facilitator see the full path, not to make the celebration harder.
Jamie: There is also a wrap-up piece involving peers and notifications. How does that fit Merge Day?
Alex: After merging, leave a wrap-up comment on the peer-simulation issue or PR. If you have real buddy access in your cohort, congratulate your buddy on completing Day 1. That reinforces the social part of GitHub: people need acknowledgment, not just code review.
Jamie: And notifications are how those social signals find us.
Alex: Right. This course uses GitHub's web notification inbox at `github.com/notifications`, not email, because the web inbox is available to everyone and works consistently. A practical repository watch level is Participating and @mentions, which notifies you when you are involved without flooding you with every event.
Jamie: So Star and Watch are not the same thing.
Alex: Correct. Starring is more like bookmarking or showing interest. Watching controls notifications. If a repository gets noisy, check whether you accidentally subscribed to All activity, and move it back to Participating and @mentions or another level that fits your role.
Jamie: What should learners practice in the inbox before they call Day 1 done?
Alex: Open the notification inbox from the bell icon or by visiting `github.com/notifications`. Try the Review requested filter to find PRs where someone asked for your review, then clear it and try Assigned to find issues or PRs assigned to you. Open one notification, read its title, repository, and reason, then return to the inbox.
Jamie: And then take one action, right?
Alex: Yes. On a non-critical thread, mark it done if you are finished with it, or mute it if you do not want future updates from that thread. Keyboard shortcuts can help, such as E for done and Shift+M for mute, but if your screen reader captures a key, move focus to the notification row first or use the visible controls.
Jamie: What if the inbox is empty?
Alex: That is not a failure. You can check the Done tab, practice reading the layout, or ask a facilitator to model a notification action. The goal is to understand how to filter and act so review requests, mentions, assignments, and failed checks do not get buried later.
Jamie: Let's talk blockers. What are the common Merge Day problems?
Alex: If your PR still has conflicts, do not force anything. Return to the conflict challenge and resolve the conflicting lines first. If the merge button is disabled, look for the reason near the merge area: it may need a passing check, a review approval, or facilitator action because of branch protection.
Jamie: What if I am just not sure whether the file change is the right one?
Alex: Open Files changed and read the diff again. Use the file tree if it is available, then move through the changed file. Added lines should reflect the content you intended, and the change should stay focused on the assigned issue. If you need a second set of ears, ask someone to review the PR rather than guessing.
Jamie: And if I am using the terminal?
Alex: The same ideas apply. Check your branch with `git branch --show-current`, keep the change small, confirm the `Closes #number` text, and use GitHub CLI commands such as `gh pr checks`, `gh pr view`, and `gh pr list` to inspect status. Use documented help with `gh pr --help` when you are unsure of an option.
Jamie: This is a good moment to name what learners have actually done today, because it is a lot.
Alex: It really is. You navigated a real GitHub repository, filed an issue with structured information, used comments and @mentions, created a safe branch, made a meaningful commit, opened a linked pull request, and brought that work onto main.
Jamie: And somewhere in there, many people also met a merge conflict and lived to tell the story.
Alex: Yes, and that matters. Merge conflicts are normal when people edit the same area of a project. They are not a sign that you broke GitHub; they are a collaboration problem with a fixable shape.
Jamie: So when the PR is merged, the issue is closed, the evidence is posted, and the peer comment is done, Day 1 is complete.
Alex: Exactly. Take the celebration seriously. You completed the professional GitHub contribution path in your Learning Room repository, and you now have a mental map for how issues, branches, commits, pull requests, reviews, merges, and notifications fit together.
29. Challenge bonus-d: Notifications
Notification hygiene, mentions, subscriptions, and avoiding overload.
Practice focus: Bonus
Download Challenge bonus-d (MP3)
Read Transcript - Challenge bonus-d: Notifications
Transcript
Alex: Welcome back. Bonus D is all about Notifications, and you may also see the issue describe it as Notification Mastery.
Jamie: I like this topic because notifications sound small until they take over your day.
Alex: Exactly. GitHub notifications are how GitHub tells you that something may need your attention: a mention, a review request, an assignment, a reply, or a failed check. The goal is to stay reachable without letting every repository become an interruption machine.
Jamie: So this is not about getting to inbox zero for the sake of it. It is about knowing which signals deserve attention and which ones can wait.
Alex: This bonus is web-first. The main place to practice is the GitHub notification inbox at github.com/notifications, not your email app. Email can be useful, but it depends on spam filters, mail servers, personal settings, and other things the workshop cannot control.
Jamie: That makes sense. If two learners have different email providers, they could do the same GitHub work and still have completely different email results.
Alex: Right. The reliable workflow is to use the notification bell or go straight to github.com/notifications. Bonus D unlocks after Challenge 15, along with Challenge 16 and Bonus Challenges A through E. And the Day 1 practice that this builds on happens in your own Learning Room repository, where you created an issue, branch, commit, pull request, and merge.
Jamie: And Chapter 10 itself is guided practice, not an autograded bot check, correct?
Alex: Correct. Notification settings live at the account level, so the Learning Room PR bot cannot safely validate them. The original Chapter 10 walkthrough is short, about five to eight minutes, and the evidence is a structured comment on your assigned challenge issue.
Jamie: Before we touch settings, what actually causes a GitHub notification?
Alex: Several things. Someone can type @your-username in an issue, pull request, or discussion. You can be requested as a reviewer on a pull request, assigned to an issue or pull request, or subscribed to a thread because you commented on it. You can also get notified when a continuous integration check fails on your pull request, or when a release is published in a repository you are watching for that kind of activity.
Jamie: That explains why review requests are such a common notification. They are not just chatter; they are a specific request for your attention.
Alex: Yes, and unexpected mentions deserve a calm check too. Sometimes someone tags you by mistake, and sometimes they really do need your input. Open the thread, decide whether to respond, mute it, or leave it in your workflow, and do not assume every mention is equally urgent.
Jamie: The Watch button is where a lot of notification overload starts, right?
Alex: It is. Each repository has a subscription level. Participating and @mentions means you hear about threads where you commented, were assigned, were requested, or were mentioned. All Activity means every issue, comment, and pull request can come to you. Ignore means no notifications from that repo, and Custom lets you choose categories like issues, pull requests, or releases.
Jamie: If I am in my Learning Room repository, how do I change that without relying on a mouse?
Alex: On the repository page, the Watch control is near Star and Fork. With NVDA or JAWS on Windows, use button navigation, often the B key, until you hear Watch or Unwatch, press Enter, move through the options with the arrow keys, and press Enter on the level you want. With VoiceOver on macOS, use Quick Nav to find the Watch button, open it with VO+Space, move through the choices, and select with VO+Space. The button label should update, which confirms the change.
Jamie: And starring is different from watching, which is an easy thing to mix up.
Alex: Very easy. Starring is more like bookmarking or showing interest in a repository. Watching changes what notifications you receive. A good workshop default is Participating and @mentions for most repositories, All Activity only for repositories you actively maintain or contribute to every day, Custom for repositories you read occasionally, and Unwatch for repositories you are finished with.
Jamie: Once the watch level is reasonable, the inbox itself becomes much less scary.
Alex: Yes. Open github.com/notifications, or use the notification bell in the GitHub header. If GitHub keyboard shortcuts are enabled for your account, G then N can also open notifications. The page is organized around tabs, filters, and a list of notification items.
Jamie: What should a screen reader user expect to hear in that list?
Alex: Each notification is a link or row that usually announces the title, the repository, and the reason, such as mention, review requested, or assignment. You can move through the list with your usual reading commands or link navigation, then press Enter to open one. For practice, use the Review requested filter to find pull requests asking for your review, clear that filter, then use Assigned to find issues or pull requests assigned to you. If you open a pull request notification, check the conversation and status area so you know whether review, tests, or another action is needed.
Jamie: What if the inbox is empty? That can feel like you did something wrong.
Alex: An empty inbox is fine. You may simply have no current notifications. You can switch to Done to look at older items, or ask a facilitator to model one notification action live. If filters show nothing, clear active filters first, then apply one filter at a time, including repository or organization filters when you need to narrow a busy inbox.
Jamie: Okay, so I have a notification in front of me. What are the main actions?
Alex: You can mark a notification as done, mark it read or unread, mute a thread, or open it and respond. In the browser inbox, E commonly marks an item done, I toggles read and unread, and GitHub's shortcut help may show mute as M or Shift+M depending on the current interface. If a screen reader captures the shortcut, move focus to the notification row or use the visible action menu instead.
Jamie: I always wonder about the difference between done and mute.
Alex: Done removes it from your inbox for now, but future activity can notify you again. Mute says you do not want future updates from that thread, so save it for noisy or no-longer-relevant conversations. For a large backlog, mark all as done can be useful after you have checked for review requests and assignments, but do not use it to hide work you actually need to do.
Jamie: That is the balance: reduce noise, but do not make yourself unreachable.
Alex: Exactly. A practical daily routine is to check filtered notifications once or twice a day, handle review requests and assignments first, then mute or finish the rest intentionally.
Jamie: Bonus D also sends learners to github.com/settings/notifications. What changes are worth considering there?
Alex: Start with the defaults and change one thing at a time. A common configured setup is email on and web on for Participating, because replies to your own conversations matter. For Watching, many people turn email off and keep web on, so watched repository activity waits in GitHub instead of interrupting their email. For GitHub Actions, successful runs usually do not need email, while failed runs can be worth sending because they may block a pull request.
Jamie: And if someone uses more than one email address?
Alex: They can use custom routing. For example, organization notifications for Community-Access can go to a workshop email, while personal project notifications go to a personal address. If they use the GitHub mobile app, they can also tune push notifications there, but mobile is a reference option, not required. VS Code can show notification-related items through the GitHub Pull Requests extension, GitHub Desktop does not manage notifications, and the browser inbox remains the shared workshop path.
Jamie: What does a good Bonus D evidence comment include?
Alex: It should describe your notification configuration and your strategy. Answer how you will know when someone requests your review, how you will avoid being overwhelmed by busy repositories, and how you plan to use the GitHub inbox: read everything, triage with filters, or check specific categories first. The checklist asks you to review email notifications, web notifications, repository watching, custom routing if you have multiple emails, and mobile push settings if you use the app. In Chapter 10, your completion comment can also say your watch level, the filters you tested, and whether you muted or marked a thread done, then you close the assigned challenge issue.
Jamie: So completion is not a perfect screenshot of every setting. It is proof that you made intentional choices and can explain them.
Alex: Yes. If you changed at least one default setting and can explain how that keeps you informed while reducing noise, you have met the heart of the bonus. If you cannot find settings, go to github.com, open your profile menu, choose Settings, then Notifications in the left sidebar. If there are too many options, start with review request email or web notifications, then adjust watching. For current details, use the official GitHub documentation and GitHub's changelog, because interface labels can change over time.
Jamie: This also wraps up a lot of Day 1 skills, doesn't it?
Alex: It does. By this point, you have practiced the flow of noticing work, opening the right GitHub page, taking an action, and leaving evidence. If it was your first time using these tools, the confidence check is simple: can you find work assigned to you, find review requests, change a watch level, and quiet a noisy thread?
Jamie: And Day 2 adds more collaboration where that matters: reviews, ongoing issues, and planning contributions without losing track of conversations.
Alex: Exactly. Notification hygiene is part of being a dependable contributor. You are not trying to hear everything. You are building a system that helps you hear what matters when it matters.
Day 2: Local Workflow
30. Episode 11: VS Code Setup and Accessibility
Screen reader mode, Command Palette, sidebar navigation, and accessibility settings.
Based on: Chapter 11: VS Code Setup and Accessibility
Read Transcript - Episode 11: VS Code Setup and Accessibility
Transcript
Alex: Welcome back. Today we're setting up VS Code as an accessible place to do GitHub work, especially the kind of Markdown, review, and contribution work that shows up throughout this course.
Jamie: And VS Code can sound a little intimidating if you've only used GitHub in the browser. Is this a whole new world, or just another way into the same projects?
Alex: A bit of both. VS Code is a free, extensible code editor from Microsoft, and extensible means you can add features through extensions. GitHub.com is excellent for reading issues, reviewing pull requests, and having discussions, while VS Code is where editing, checking files, using Copilot, and moving through a repository can feel more direct.
Jamie: So the browser is still important. We're not replacing it.
Alex: Not at all. You're adding a stronger workspace for creating. VS Code gives you a file tree, a full text editor, a built-in terminal, source control tools, settings, keyboard shortcuts, extensions, and accessibility features that can announce problems while you're working.
Jamie: That last part is big. Finding an error after you push is stressful. Hearing about it while you're still editing is much better.
Alex: Exactly. This is Day 2 foundation work. The assumption is that you already completed the Day 1 walkthrough in GitHub's browser interface, including the Learning Room repository that was created for you.
Jamie: So today is less about making a big contribution and more about making sure the editor is usable, signed in, and ready.
Alex: Before installing anything, you can try VS Code right in your browser with github.dev. Open a repository on GitHub.com, then press the period key. After a few seconds, the repository opens in a VS Code-style editor in that same browser tab.
Jamie: That period key shortcut feels almost hidden. Where does it work?
Alex: Use it from a repository code page, such as the main page of your Learning Room repository or a folder or file view in the repository. It won't work from an issue page, a pull request conversation, or a random GitHub settings page.
Jamie: And if the period key doesn't do anything?
Alex: You can go directly by changing the address to github.dev and the same owner and repository path, or look for repository page options that open the web editor. The period key is just the fastest route when you're already in the right place.
Jamie: What do I get in github.dev once it opens?
Alex: You get the Explorer file tree, the editor, search, source control views, many keyboard commands, Markdown editing, and a familiar VS Code layout. It's great for quick edits, reading a project, and practicing navigation without installing desktop VS Code.
Jamie: But it's not exactly the same as desktop VS Code, right?
Alex: Right. github.dev doesn't have a full local terminal, it can't run every tool, and Copilot support may require desktop VS Code or a Codespace depending on what you're trying to use. Desktop VS Code is better when you need installed extensions, command-line tools, local files, or deeper Copilot workflows.
Jamie: So github.dev is perfect for quick orientation, and desktop VS Code is better when the project needs more power.
Alex: Yes. For this workshop, github.dev is a low-friction bridge. You can open the Learning Room repository, test the interface, enable accessibility support, and confirm the main surfaces before doing heavier work.
Jamie: The first thing I would want to do is make sure my screen reader and the editor are cooperating. How do I turn on screen reader mode?
Alex: On Windows with NVDA or JAWS, press Shift+Alt+F1. You should hear confirmation that screen reader accessibility mode is on. On Mac with VoiceOver, VS Code is often already optimized, but if navigation feels wrong, open the Command Palette with Cmd+Shift+P and run Toggle Screen Reader Accessibility Mode.
Jamie: What should change after it's on?
Alex: VS Code adjusts the editor so screen readers get better announcements, including cursor movement, line content, suggestions, errors, and navigation context. It may change how some editor features behave so text editing is more reliable with assistive technology.
Jamie: Are there screen reader-specific habits worth knowing?
Alex: Yes. NVDA and JAWS users may need focus mode or forms mode when editing text, and browse mode can get in the way inside the editor. VoiceOver users should pay attention to whether focus is moving through the editor, sidebar, and panels as expected, and use the screen reader mode toggle if things feel off.
Jamie: And VS Code has an accessibility help dialog too, right?
Alex: Yes. Press Control+Shift+H to open accessibility help. It tells you useful commands for the current context, including navigation help and ways to reach accessible views. If you forget a keyboard path, that help dialog is a good place to recover.
Jamie: I want the editor to be chatty enough to be useful, but not so chatty that I can't think.
Alex: That's where settings matter. In Settings, search for editor.accessibilitySupport and set it to on if automatic detection doesn't work well for you. Also search for screen reader announcements or accessibility verbosity settings so you can tune what VS Code speaks.
Jamie: Audio cues are part of that too?
Alex: Yes. Audio cues are short sounds that can signal things like errors, warnings, breakpoints, folded regions, or terminal command completion. They don't replace speech, but they can add quick confirmation without making you stop and inspect the screen.
Jamie: So the baseline is: turn on support, confirm announcements, and adjust speech and sounds until the editor gives useful feedback.
Alex: Once accessibility support is stable, the next skill is knowing the main areas of the VS Code window.
Jamie: Give me the landmarks.
Alex: There are five big areas to recognize: the Activity Bar, the sidebar, the editor, the panel area, and the Status Bar. The Activity Bar is the vertical strip of major tools, the sidebar changes based on the tool you picked, the editor is where files open, the panel is where things like Terminal and Problems can appear, and the Status Bar runs along the bottom.
Jamie: The Activity Bar is the place with Explorer, Search, Source Control, Run, and Extensions?
Alex: Exactly. Explorer shows the file tree. Search finds text across the project. Source Control shows Git changes. Extensions lets you install add-ons. Accounts is usually near the bottom, and it is where GitHub sign-in lives.
Jamie: And if I don't want to hunt through the interface?
Alex: Use the Command Palette. Control+Shift+P on Windows or Linux, Cmd+Shift+P on Mac. It's the most important VS Code shortcut because you can type the action you want, like Toggle Word Wrap, Preferences, or Accessible Diff Viewer, and run it from the keyboard.
Jamie: How do I move between the sidebar, editor, terminal, and panels without getting lost?
Alex: Use the keyboard commands for the surface you want, then listen for the announcement. Control+Shift+E opens Explorer, Control+Shift+F opens Search, Control+Shift+G opens Source Control, and Control+Shift+X opens Extensions. Control+` opens the integrated terminal in desktop VS Code, and Escape often returns focus out of temporary popups.
Jamie: What's the difference between opening a folder and opening a file?
Alex: Opening a file gives you one document. Opening a folder gives VS Code the project context: the file tree, search across files, Git status, extensions that activate for the project, and settings that belong to that workspace. For repository work, opening the folder is usually the better choice.
Jamie: And for a Markdown file, headings can become navigation points, yes?
Alex: Yes. Open README.md, then press Control+Shift+O, or Cmd+Shift+O on Mac, to open the outline or symbols view. For Markdown, it lists headings, which makes long files much easier to scan with a keyboard and screen reader.
Jamie: Where does GitHub sign-in happen inside VS Code?
Alex: The most direct place is the Accounts button near the bottom of the Activity Bar. Activate it, choose the GitHub sign-in option, and follow the browser prompt. You can also open the Command Palette and search for Accounts if the button is hard to find.
Jamie: How do I know sign-in worked?
Alex: Return to the Accounts control and listen for your GitHub username. VS Code may also show account-related items in the Status Bar or ask permission for GitHub features when you first use them.
Jamie: Status Bar is one of those places I forget about. What's usually in it?
Alex: From left to right, it can include Git branch information, sync state, problems counts, live share or account indicators, line and column, indentation, encoding, language mode, notifications, and sometimes Copilot status. You can tab or arrow through many Status Bar items, and your screen reader should announce what each one does.
Jamie: Copilot status is part of this setup check too.
Alex: Yes. In desktop VS Code, look for the Copilot indicator in the Status Bar, use the Command Palette to search for Copilot commands, or try a small suggestion in a scratch file. If you're in github.dev and Copilot doesn't appear, that may be expected; you may need desktop VS Code or a Codespace.
Jamie: And the Menu Bar is still there for people who prefer menus.
Alex: Right. The Menu Bar includes File, Edit, Selection, View, Go, Run, Terminal, and Help. On Windows and Linux, Alt usually moves focus to the Menu Bar. On Mac, the system menu is at the top of the screen, and VoiceOver users can navigate it with standard macOS commands.
Jamie: There are a lot of entry points, but the pattern is reassuring: use a direct shortcut when you know it, and use the Command Palette when you don't.
Alex: Settings are where you make VS Code feel less generic and more like your workspace.
Jamie: Which settings should accessibility learners check first?
Alex: Open Settings from the Command Palette or the menu, then search for accessibility. Check editor.accessibilitySupport, screen reader announcement or verbosity options, audio cues, font size, word wrap, cursor style, and line numbers if they affect how you navigate. The Settings editor also supports filters like modified settings and extension settings, which helps when you need to find what changed.
Jamie: What about carrying those settings to another computer?
Alex: That's Settings Sync. When you enable it, VS Code can sync settings, keyboard shortcuts, snippets, user tasks, extensions, and interface state across machines. If two machines disagree, VS Code may ask you to resolve a conflict instead of silently overwriting your setup.
Jamie: Profiles sound related, but not identical.
Alex: Exactly. A profile is a named set of settings, extensions, and UI state. You might create a workshop profile with the accessibility settings, extensions, and shortcuts you want for this course, then switch back to another profile for different work. Profiles can also be exported and shared, and they can work alongside Settings Sync.
Jamie: If shortcuts conflict with my screen reader, can I change them?
Alex: Yes. Open the Keyboard Shortcuts editor from the Command Palette, search for the command, activate the edit control, press the new key combination, and save it. If VS Code detects a conflict, review it before accepting the new shortcut.
Jamie: I know this chapter focuses on setup, but learners also hear about terminals, extensions, and diffs. Can we place those on the map?
Alex: Definitely. The integrated terminal is a command line inside VS Code, usually opened with Control+` on Windows or Linux, and from the Terminal menu as well. In github.dev, terminal support is limited, so use desktop VS Code or a Codespace when you need real commands.
Jamie: Extensions are add-ons, right?
Alex: Right. Open the Extensions view with Control+Shift+X, search for an extension, read its details, and install it if it fits your workflow. Extensions can add language support, GitHub tools, linters, themes, accessibility helpers, and project-specific features.
Jamie: What about reviewing changes accessibly?
Alex: VS Code includes an Accessible Diff Viewer. Open the Command Palette, search for Accessible Diff Viewer, and run it when you're reviewing file changes. It presents differences in a way that is easier to move through with speech than a purely visual side-by-side comparison.
Jamie: Where does Source Control fit?
Alex: The Source Control view shows changed files, lets you inspect diffs, stage changes, write commit messages, and work with Git. The full contribution workflow comes later, but recognizing the Source Control icon now makes later Git work less surprising.
Jamie: And Copilot Chat and agents are desktop-focused?
Alex: For serious use, yes. Desktop VS Code gives you the richer Copilot Chat experience, and later chapters use agent files and the living catalog of Accessibility Agents as part of contribution planning and review. For this setup chapter, you just need to know whether Copilot is available in your current environment.
Jamie: So we're not trying to master every tool today. We're making sure the doors open, the announcements make sense, and the important rooms are findable.
Alex: The practice for this chapter is a quick accessibility baseline. Plan about 10 to 15 minutes, and use either github.dev or desktop VS Code.
Jamie: Walk me through it like I'm doing it now.
Alex: Open your Learning Room repository on GitHub.com. Press the period key to launch github.dev, or open the same repository folder in desktop VS Code. Turn on screen reader mode, open Explorer with Control+Shift+E, open README.md, use Control+Shift+O for the outline, open the Command Palette with Control+Shift+P, check Accounts, and check Copilot status in the Status Bar if your environment supports it.
Jamie: And then the evidence goes back to GitHub.com, not inside VS Code?
Alex: Correct. Return to the assigned setup or Day 2 readiness issue and post a completion comment. Record whether you opened github.dev, enabled screen reader mode, signed in to GitHub, checked Copilot status, opened a file in Explorer, opened the outline or symbols view, and opened the Command Palette.
Jamie: What if one of those answers is no?
Alex: Say where you got stuck. If the period key did nothing, check that you were on a repository code page. If the Explorer is empty, wait a few seconds and open Explorer again. If screen reader mode didn't announce, use the Command Palette and search for Screen Reader.
Jamie: And if Accounts or Copilot are hard to find?
Alex: Use the Command Palette as your fallback. Search for Accounts to manage sign-in, and search for Copilot to see available commands. If Copilot doesn't show in github.dev, try desktop VS Code or a Codespace, or note that it was not available in your environment.
Jamie: This makes setup feel like contribution work, not busywork.
Alex: It is contribution work. A stable, accessible editor reduces friction and helps you make cleaner changes. When you can open the tool, sign in, confirm accessibility support, move through files, use the Command Palette, and report what worked, you're ready for the VS Code-based chapters that follow.
31. Episode 45: VS Code Accessibility Deep Dive
Keyboard navigation, accessible views, terminal access, signals, speech, and Copilot accessibility in VS Code.
Based on: Chapter 12: VS Code Accessibility Deep Dive
Read Transcript - Episode 45: VS Code Accessibility Deep Dive
Transcript
Alex: Welcome back. Today we're going deeper into VS Code accessibility, the parts that make local work feel manageable instead of crowded.
Jamie: And this is especially important before Challenge 10: Go Local, right? Once you're making a local commit, VS Code becomes the place where you edit, check, search, run commands, and recover when something gets confusing.
Alex: Exactly. This chapter continues the VS Code setup work from the previous chapter, but it moves from basic orientation into power tools. We're talking keyboard navigation, the Problems panel, the terminal, Copilot Chat, Accessible Help, Accessible View, Accessible Diff, accessibility signals, speech features, and Markdown authoring.
Jamie: So not one magic setting. More like a set of reliable paths through a busy app.
Alex: Let's start with focus. In VS Code, you can jump to the major areas directly: Ctrl+Shift+E for Explorer, Ctrl+Shift+F for Search, Ctrl+Shift+G for Source Control, Ctrl+Shift+X for Extensions, Ctrl+` for the terminal, Ctrl+Alt+I for Copilot Chat, Ctrl+Shift+P for the Command Palette, Ctrl+1 for the editor, and Ctrl+Shift+M for Problems.
Jamie: Mac listeners should translate those as Cmd for Ctrl and Option for Alt where appropriate. That's easy to forget when you're listening instead of looking at a table.
Alex: Right. Those shortcuts are your reset points. If VS Code feels noisy, don't hunt around the screen first. Send focus somewhere known, like Ctrl+1 for the editor or Ctrl+Shift+P for the Command Palette.
Jamie: I like that because focus loss is one of those moments where people blame themselves. But the fix can just be, go back to a known area.
Alex: Inside the editor, the movement shortcuts matter just as much. Ctrl+Home and Ctrl+End move to the beginning or end of a file. Ctrl+G lets you jump to a line number, or to a line and column with a pattern like 10:5. Ctrl+P opens a file by name, Alt+Z toggles word wrap, Ctrl+= and Ctrl+- change the editor font size, Ctrl+M toggles Tab focus mode, and Ctrl+Shift+; opens breadcrumb navigation.
Jamie: Tab focus mode is worth calling out. When it's on, Tab moves between interface controls instead of inserting a tab character into the file. That's a big difference for screen reader users moving through widgets.
Alex: Find is another anchor. Ctrl+F opens Find in the current file, and the toggles are Alt+C for match case, Alt+W for whole word, and Alt+R for regular expression search. Screen readers announce those toggles as checkboxes, Space changes them, and the match count is announced as you type. F3 and Shift+F3 move through results, and Escape closes Find while returning focus to the last cursor position.
Jamie: And replace is Ctrl+H. Then Ctrl+Shift+1 replaces the current match, while Ctrl+Alt+Enter replaces all matches. That's one of those shortcuts where I want people to pause before using replace all.
Alex: Global search is Ctrl+Shift+F, and it searches across the workspace. The same case, word, and regex toggles work there, and you can Tab to include or exclude file filters. Useful glob patterns include docs/*.md for Markdown files in a docs folder, *.agent.md for agent definition files, .github/** for everything inside the .github folder, and !node_modules/** to keep that folder out of results.
Jamie: Tree views have their own fast filter too. In Explorer or Source Control, focus the tree and start typing part of a filename. VS Code opens a little filter field, narrows the tree, and Escape clears it.
Alex: For Markdown, Ctrl+Shift+O opens a symbol picker filled with headings. Type a few letters, press Enter, and you're there. In Explorer, Up and Down move through items, Right Arrow expands a folder, Left Arrow collapses it, Enter opens a file, F2 renames, Delete deletes, and Ctrl+N starts a new file that you'll save with Ctrl+S.
Jamie: The learning-card version is pretty practical: use Ctrl+G for line jumps, listen for Find counts, use Ctrl+Down in the Keyboard Shortcuts editor when your screen reader announces that hint, turn on word wrap at high zoom, and use breadcrumbs or Quick Open when the file tree is too much.
Alex: The Problems panel is where VS Code collects errors, warnings, and informational messages from tools like markdownlint, eslint, or Pylance. Open it with Ctrl+Shift+M, or jump through problems from the editor with F8 and Shift+F8.
Jamie: What does a problem entry actually contain? Because a red icon alone doesn't help if you aren't using the screen visually.
Alex: Each entry includes severity, the message, the source tool, the file name, and the line number. A screen reader should read those pieces together, and pressing Enter on a problem row jumps straight to the source line. The status bar also shows the current errors and warnings count, and it updates as files change.
Jamie: So if markdownlint complains about a heading, I can open Problems, hear the message and line, press Enter, fix it, and use F8 for the next issue without manually searching the file.
Alex: The integrated terminal is where local Git work often happens. Ctrl+` opens it, and from there you can run commands like git status, git add, git commit, or test commands for a project.
Jamie: Terminals can be the noisiest part of the whole editor. A command prints a lot of text, focus moves, a prompt appears, and suddenly you're not sure what changed.
Alex: VS Code's terminal shell integration helps by making command boundaries clearer. When shell integration is available, VS Code can better identify prompts, command output, command success, and command failure. That improves navigation, accessibility signals, and the ability to review output after the fact.
Jamie: So the habit is not just type a command and hope. Run the command, read the output, and confirm whether the prompt has returned.
Alex: Yes. If output streams quickly, use Accessible View or the terminal's accessible reading features to review it in a calmer reading surface. You can also create or switch terminals from the terminal controls or Command Palette, but the key idea is to keep track of which terminal is active before running a command.
Jamie: And if the terminal steals focus when I didn't expect it, Ctrl+1 gets me back to the editor. That one shortcut can save a lot of frustration.
Alex: Copilot Chat in VS Code has its own accessibility patterns. You can open it with Ctrl+Alt+I or by running Chat: Open Chat from the Command Palette.
Jamie: And Chat has modes now. Learners may hear Ask, Edit, and Agent mode and wonder which one they are in.
Alex: Ask mode is for questions and explanations. Edit mode helps propose changes to files. Agent mode can plan and work across files, and may ask for confirmation or interact with the terminal. Chat participants, such as @workspace, @vscode, or @terminal, help aim the question at a particular context.
Jamie: The accessibility issue I hear most is, Copilot answered, but I don't know how to read the whole response without getting lost.
Alex: That's where Accessible View is useful, especially for streamed responses. After Copilot responds, open Accessible View and read the response in a stable text surface. In Agent mode, pay attention to question prompts, confirmation choices, and terminal focus, because the workflow can move between chat, editor, and terminal.
Alex: Accessible Help is a context-aware keyboard guide. If you're in the editor and press Alt+H, or open the Accessible Help command from the Command Palette, VS Code gives shortcuts and guidance for the current area.
Jamie: So it changes depending on where focus is. Help in the editor is not the same as help in the terminal or a list.
Alex: Exactly. In the editor, Accessible Help might remind you about navigation, selection, and screen reader commands for that context. It's useful when you know where you are but can't remember the local controls.
Jamie: Accessible View is a little different. That's for reading content that may be dynamic, temporary, or hard to reach directly.
Alex: Yes. Open it with the Open Accessible View command, or use the assigned shortcut if your setup has one. It can present things like Copilot responses, hover documentation, terminal output, or other dynamic content in a readable view. For Copilot, ask the question, wait for the answer, open Accessible View, read, copy anything you need, then return to chat or the editor.
Jamie: And for hover documentation, the pattern is similar. Trigger the hover, open Accessible View, read it without chasing a floating box, then close it when you're done.
Alex: The Accessible Diff Viewer helps with changes. Open a diff, then use the Accessible Diff Viewer command to review additions, deletions, modifications, and line information without visually scanning side-by-side panes. During the workshop, that's useful before committing, when checking a pull request, or when reviewing Markdown edits.
Jamie: Diff audio cues can help too, as long as they don't become noise. A sound for an inserted or deleted line can be helpful when you're moving through a change.
Alex: Accessibility signals are VS Code's way of giving nonvisual feedback for events. They can use sound, announcements, or both, depending on the signal and your settings.
Jamie: So this is not just one beep for everything. Different events can have different signals.
Alex: Right. There are signals for editor events, diffs, terminals, chat and Copilot, debugging, editor actions, voice features, and code actions. To explore them, use the commands that list signal sounds and signal announcements. You can also control volume, which matters if you rely on a screen reader, system audio, and VS Code sounds at the same time.
Jamie: When do you actually want them on?
Alex: For this workshop, I would prioritize signals that help you catch problems and state changes: errors and warnings, terminal command failed, chat response received, and meaningful diff changes. I would be careful with position-based signals if they fire too often while you arrow through code. If you used older audio cue settings, search Settings for accessibility signals and audio cues so you can migrate to the current signal settings.
Jamie: So audio can reduce uncertainty, but only if it's tuned. Too many cues can make VS Code feel busier, not clearer.
Alex: VS Code Speech adds voice input and output features through the VS Code Speech extension. Once it's installed, you can dictate into the editor, speak prompts to Copilot Chat, and listen to chat responses.
Jamie: That's useful for fatigue too, not only for vision access. Typing a long prompt or a paragraph of Markdown can be tiring.
Alex: Exactly. Editor dictation turns speech into text where the cursor is. Voice in Copilot Chat lets you speak your request instead of typing it. Text-to-speech can read Copilot responses automatically after voice input, or you can manually trigger read-aloud for a response.
Jamie: And then there's Hey Code, the hands-free activation phrase.
Alex: Yes, if it's supported and enabled in your environment. Speech settings also cover language configuration, voice behavior, and related commands. If voice is central to your workflow, it's worth assigning custom keybindings for the commands you use most and checking platform support before you rely on it during a timed activity.
Jamie: I would also test it in a quiet moment, not five minutes before a live commit. Microphone permissions and language settings are much easier to fix when you're not under pressure.
Alex: Markdown authoring in VS Code comes up constantly in this course. You're editing READMEs, issue text, contribution notes, and sometimes agent definition files.
Jamie: Markdown preview helps, but I don't want listeners to feel like preview is the only way to understand the document.
Alex: Right. The preview is useful, and you can open it when you want to check rendered structure. But the Outline view and Ctrl+Shift+O are often faster for headings. The markdownlint extension catches common formatting issues, and Copilot can help revise Markdown, draft summaries, or suggest clearer wording.
Jamie: What about shortcuts?
Alex: Use the Keyboard Shortcuts editor to find or assign Markdown-related commands, including preview commands and any formatting helpers you prefer. The bigger workshop reason is quality: clean Markdown makes issues, pull requests, plans, and documentation easier for maintainers and other contributors to read.
Jamie: What should someone do when VS Code just feels tangled? Too many panels, too much speech, not sure where focus went.
Alex: Start simple. Press Escape once or twice to close transient widgets, then Ctrl+1 to return to the editor. If you need a tool, open it directly: Ctrl+Shift+M for Problems, Ctrl+Shift+F for Search, Ctrl+` for terminal, or Ctrl+Shift+P for the Command Palette. If content is hard to read, try Accessible View. If you don't know the local controls, open Accessible Help.
Jamie: And if the problem is not your memory but the interface changing, go back to trusted references.
Alex: Yes. The VS Code accessibility documentation and the GitHub guide for Copilot accessibility in VS Code are the main references for these features. The course appendices on VS Code and screen reader shortcuts are also useful when you want a compact reminder.
Jamie: The real win here is confidence. You can move to a known area, inspect messages, read dynamic content, tune audio feedback, and keep working locally without losing the thread.
32. Episode 21: Git Authentication
Personal access tokens, SSH keys, credential storage, and commit signing.
Based on: Appendix D: Git Authentication
Read Transcript - Episode 21: Git Authentication
Transcript
Alex: Welcome back. Today we're talking about Git authentication, which is the part of GitHub that proves you are who you say you are before GitHub lets you change something.
Jamie: So this is the moment where Git stops being just, I can read this project, and becomes, I am allowed to push changes here.
Alex: Exactly. GitHub asks you to authenticate when you push commits, clone a private repository, or access organization repositories that require certain permissions. You usually do not need authentication to clone a public repository, view public code on GitHub.com, or read public issues and pull requests.
Jamie: And if somebody is only using the GitHub website or GitHub Desktop, they may not have to touch this appendix right away.
Alex: Right. This becomes most relevant when you're using VS Code with command-line Git and you want to push commits to your fork or another repository. The reference is set up with two main paths, a Personal Access Token path and an SSH key path, plus troubleshooting by exact error message. If you use a screen reader, heading navigation and numbered steps are useful here; if you use magnification, the code blocks and separate method sections help you keep the two paths apart.
Jamie: Okay, two paths. Is that the same as HTTPS versus SSH?
Alex: Yes. With HTTPS, your remote URL usually starts with https://github.com, and Git asks for a username and a credential. With SSH, your remote URL usually looks like git@github.com:owner/repo.git, and Git proves your identity with a key stored on your computer.
Jamie: The HTTPS credential is the Personal Access Token, right? Not my GitHub password.
Alex: Correct. A Personal Access Token, or PAT, is a password-like string you generate on GitHub and paste when Git asks for a password. GitHub has fine-grained tokens, which can be limited to specific repositories and permissions, and classic tokens, which are broader and still appear in many workshop instructions. The workshop reference recommends a classic token because it is straightforward to create through the web interface, but the security habit is the same either way: grant only the access you need.
Jamie: The nice part is that tokens work everywhere and are easy to revoke. The less nice part is that you have to store them safely, and they expire.
Alex: That's the tradeoff. SSH uses a key pair instead: a public key that you add to GitHub, and a private key that stays on your computer. Once SSH is set up, it usually stops prompting you, but the first setup is more command-line heavy. And the private key is secret; never paste it into GitHub, email, chat, or a repository.
Jamie: If I'm following the recommended workshop route, how do I make the token?
Alex: Start at github.com/settings/tokens. Choose Tokens classic, then generate a new classic token. Give it a clear note, such as Workshop Laptop Token, choose a short expiration like 30 or 60 days, and select the scopes you need. The common workshop scope is repo, and workflow is only needed if you will update GitHub Actions workflow files.
Jamie: And when GitHub shows the token, copy it right then. You don't get to come back and view it later.
Alex: Yes. If you're using a screen reader, the token appears as a long string in a text field, so select all, copy, and move it directly into a safe place. A password manager is best, an encrypted note can work, and a plain text file should only be temporary and only inside an encrypted folder.
Jamie: What should people avoid?
Alex: Do not paste the token into an unencrypted document that syncs to the cloud. Do not email it to yourself. And definitely do not save it in a public GitHub file. The next time Git asks for credentials, enter your GitHub username, and paste the token where Git asks for a password.
Jamie: This is where credential storage helps, because nobody wants to paste that long token every time.
Alex: Exactly. Git Credential Manager is the recommended cross-platform helper because it stores credentials securely and integrates with GitHub sign-in flows. On Windows, Git Credential Manager often remembers the token after first use. On macOS, Keychain may ask to save it, and you can choose Always Allow. On Linux, you can use Git Credential Manager too, or a temporary cache with git config --global credential.helper cache.
Jamie: What about the SSH path? I know people like it, but the words public key and private key can sound a little mysterious.
Alex: Start by checking whether you already have one. In a terminal, run ls -al ~/.ssh and look for files like id_rsa.pub or id_ed25519.pub. The .pub file is the public key, and the matching file without .pub is the private key.
Jamie: If there is no key, the command is ssh-keygen, right?
Alex: Yes. A common modern command is ssh-keygen -t ed25519 -C "your-email@example.com". When it asks where to save the key, pressing Enter accepts the default location. A passphrase is optional, but recommended, because it protects the key if someone gets access to your computer.
Jamie: Then we copy the public key, not the private one.
Alex: Exactly. In Windows PowerShell, you can use Get-Content ~/.ssh/id_ed25519.pub | Set-Clipboard. On macOS, use pbcopy < ~/.ssh/id_ed25519.pub. On Linux, you can run cat ~/.ssh/id_ed25519.pub, then manually select and copy the output.
Jamie: And that output should start with something like ssh-ed25519 or ssh-rsa.
Alex: Right. Then go to github.com/settings/keys, choose New SSH key, give it a title like Workshop Laptop SSH Key, set the key type to Authentication Key, paste the public key, and add it. GitHub may ask for your password or 2FA code. After that, test with ssh -T git@github.com, and a successful response starts with Hi username, you've successfully authenticated.
Jamie: Here's a very real question. What if I set up SSH perfectly, but my repository was cloned with HTTPS?
Alex: Then Git will still try to use the HTTPS route, because the remote URL controls the method. Run git remote -v to see the current remote. If you want SSH, set it with git remote set-url origin git@github.com:your-username/repo.git.
Jamie: And to go the other direction?
Alex: Use git remote set-url origin https://github.com/your-username/repo.git. This is worth checking before you regenerate tokens or keys, because the wrong remote URL can make a working credential look broken. HTTPS expects a token or credential helper, and SSH expects a configured key.
Jamie: Authentication errors can feel personal, but they usually have pretty specific causes.
Alex: They do. If you see Authentication failed when pushing, the token is often expired, mistyped, or stored incorrectly. Generate a new PAT, clear the old saved credential from Windows Credential Manager, macOS Keychain, or on Linux with git credential-cache exit, and push again so Git asks for credentials.
Jamie: What about Permission denied publickey?
Alex: That means SSH did not find a key GitHub accepts. Check that the public key is added at github.com/settings/keys, then run ssh-add -l to see what your SSH agent knows about. If your key is missing, add it with ssh-add ~/.ssh/id_ed25519.
Jamie: And Host key verification failed?
Alex: That means your computer does not recognize GitHub's host key yet, or the stored host key does not match. The reference gives ssh-keyscan github.com >> ~/.ssh/known_hosts as the direct fix. If anything about the warning seems unusual, pause and verify against GitHub's official SSH documentation before accepting a host key.
Jamie: Let's talk security habits, because tokens and keys are powerful.
Alex: Treat a PAT and a private key like passwords. Use the smallest token scopes that will do the job, set expiration dates on tokens, use a passphrase on SSH keys, and revoke old tokens when you're done with a project or device. Also, do not commit tokens, private keys, or local config files that contain secrets; use .gitignore for files that should stay on your machine.
Jamie: But the public key is different.
Alex: Yes. The public key is meant to be uploaded to GitHub and can be shared in that limited sense. The private key and tokens are the pieces that must stay protected.
Jamie: Commit signing sounds related, but it is not exactly the same as logging in, is it?
Alex: Right. Authentication lets you push or access a repository. Commit signing marks individual commits with a cryptographic signature, and GitHub can show a Verified badge when the signature matches a key connected to your account.
Jamie: So maintainers can see that the commit really came from a trusted key, not just from a name and email typed into Git config.
Alex: Exactly. There are two common signing methods. SSH signing is simpler for many learners because it can reuse an SSH key you already have, though you still add it to GitHub as a signing key and configure Git for SSH signing. GPG signing is the older traditional method and has more setup steps.
Jamie: Give me the short version of SSH signing first.
Alex: You tell Git to use SSH for signing with git config --global gpg.format ssh. Then you set your signing key, usually pointing Git at your public SSH key file, and turn on signing with git config --global commit.gpgsign true. In GitHub settings, add the same public key as a signing key, not just an authentication key.
Jamie: And the GPG route is the one with key IDs and the public key block.
Alex: Yes. You generate a GPG key with gpg --full-generate-key, choose RSA and RSA, 4096 bits, and usually no expiration if that is what your organization expects. Use the email address associated with your GitHub account. Then find the key ID with gpg --list-secret-keys --keyid-format=long; the output includes something like sec rsa4096/XXXXXXXXXXXXXXXX, and the X part is the key ID.
Jamie: Then export the public part and add it to GitHub.
Alex: Right. Export it with gpg --armor --export followed by the key ID, and copy the block that starts with BEGIN PGP PUBLIC KEY BLOCK. Add that public key in GitHub's SSH and GPG keys settings. Then configure Git with your signing key ID and turn on commit.gpgsign true so future commits are signed automatically.
Jamie: Where does Vigilant Mode fit into this?
Alex: Vigilant Mode is a GitHub account setting that makes commit verification more visible and stricter in how unsigned or unverified commits are shown. Some maintainers use it because they want a clearer signal about which commits were signed by trusted keys. As a contributor, you may see badges such as Verified, Unverified, or Partially verified beside commits.
Jamie: If you're using a screen reader, don't just assume the icon color tells the whole story.
Alex: Right. Move to the badge text near the commit, and open the badge details when you need the reason. GitHub will usually explain whether the signature is valid, missing, attached to an unknown key, or tied to an email mismatch.
Jamie: For this workshop, the practical recommendation is still pretty calm.
Alex: Use a Personal Access Token if you need a straightforward way to push from the command line. Use SSH if you're comfortable with terminal setup and want a smoother long-term flow. Commit signing is valuable, especially in security-conscious projects, but it is usually something to add after your basic push workflow is working unless a repository specifically requires it.
Jamie: So the pattern is: choose HTTPS with a token or SSH with a key, store secrets safely, check your remote URL, and troubleshoot from the exact error message.
Alex: Exactly. Authentication is GitHub checking whether the person asking to change a repository is allowed to do it. Once that is set up, push, pull, and contribution work get much quieter.
33. Episode 46: How Git Works: The Mental Model
Commits, branches, staging, local versus remote, push, pull, fetch, and why conflicts happen.
Based on: Chapter 13: How Git Works: The Mental Model
Read Transcript - Episode 46: How Git Works: The Mental Model
Transcript
Alex: Welcome back. Today we're slowing down just enough to make Git feel less like a magic trick and more like a set of places where your work moves.
Jamie: I like that, because Git commands can sound small, like add, commit, push, pull. But when one of them surprises you, it suddenly feels like the floor disappeared.
Alex: Exactly. On Day 1, GitHub.com handled a lot for you behind the scenes. You edited a file, clicked a button, and GitHub created the commit and kept track of the branch.
Jamie: And on Day 2, learners start doing that locally, on their own computer.
Alex: Right. Challenge 10, Go Local, is where this becomes practical: cloning, local branches, commits, pushing, and sorting out what is local versus what is on GitHub. The rest of the Day 2 Git work also leans on this model, and the habit is to understand local Git mechanics first, then connect them to GitHub workflows and the gh command line later.
Jamie: So when people say Git has a working tree, staging area, and repository, what are those in plain language?
Alex: The working tree, also called the working directory, is the project folder on your computer. If you open the project in VS Code and browse files in the Explorer, those files are in your working tree. They are real files you can edit, rename, or delete.
Jamie: So changing a file there does not mean Git has saved that change forever.
Alex: Correct. Git notices the change, but it waits for you to choose what belongs in the next commit. That choosing happens in the staging area, which is also called the index.
Jamie: That is the part I used to skip over. Staging is not just a speed bump; it lets me decide which changes travel together.
Alex: Yes. You might fix a typo in one file and experiment with a larger rewrite in another. You can stage the typo fix, leave the experiment unstaged, and make a clean commit that only contains the typo fix. Then, when you commit, Git records what you staged into the repository, which lives in the hidden .git folder inside the project.
Jamie: The packing box comparison helps me here. The desk is the working tree, the open box is staging, and the sealed box is the commit.
Alex: That is a good way to remember the movement. Edit files in the working tree, stage the changes you want, then commit the staged changes into Git's stored history. In command form, that is the path from editing a file, to git add file.md, to git commit -m 'short description'.
Jamie: And if you are not relying on visuals, there are ways to check where things are.
Alex: Definitely. In the terminal, git status tells you which files are changed, which are staged, and whether there is anything ready to commit. In VS Code Source Control, Ctrl+Shift+G opens the panel, where files appear under Changes before staging and Staged Changes after staging. Pressing Enter on a file opens the diff, and many screen readers announce added and removed lines with change labels; low vision users can also use zoom, panel width, file badges like M or U, and editor gutter indicators for added, modified, or deleted lines.
Jamie: A commit is often described as a save point. Is that accurate enough?
Alex: It is accurate as a starting point, but there is one important detail. A commit is a snapshot of the project at a moment in time, not just a list of edits. Each commit records the staged file content, a message, the author name and email, and a pointer to the commit that came before it.
Jamie: And each commit gets one of those long IDs, right?
Alex: Yes. Git gives every commit a SHA hash, which is usually shown as a long 40-character identifier. In daily work, you often see the short version, like the first 7 characters, and that is usually enough for commands and conversation.
Jamie: Do learners need to memorize those hashes?
Alex: No. Treat them like confirmation numbers. They are useful when you want to point to a specific commit, but you can copy them from git log, GitHub, or VS Code.
Jamie: The source says commits are permanent, mostly. What is the 'mostly' doing there?
Alex: Once a commit is in the repository history, you normally do not erase it. If you made a mistake, you usually add another commit that fixes or reverses the problem. Git does have advanced history rewriting tools, but for this course, the safer mental model is that commits give you a history you can inspect and recover from.
Jamie: That connects back to Day 1. When I clicked Commit changes on GitHub.com, GitHub staged and committed for me in one action.
Alex: Exactly. Locally, you get more control because staging and committing are separate. In VS Code, you type a commit message in the Source Control message box and commit from there, often with Ctrl+Enter. Afterward, git log --oneline -5 gives you the last few commits, and the Timeline view can show a file's history in order.
Jamie: Branches are another place where people get nervous. Is a branch a copy of the whole project?
Alex: Not in the way people often imagine. A branch is a movable label that points to a commit. The default branch is usually main, and when you create a new branch, that new label starts at the commit you are currently on.
Jamie: Then when I commit on that branch, the label moves forward?
Alex: Exactly. Your new commits extend that line of work, and the branch name follows the newest commit on that line. Git also uses HEAD to track where you are currently working, usually meaning which branch is checked out.
Jamie: So HEAD is not another branch I have to manage. It is Git's marker for my current position.
Alex: Right. If HEAD is on your feature branch, new commits go there. If HEAD is on main, new commits go to main, which is why it is worth checking your branch before you start editing.
Jamie: And branches are what let me work without disturbing main.
Alex: Yes. You can create a branch for a fix, make commits there, push it to GitHub, and open a pull request when it is ready. Later, merging brings that work back into main or another target branch.
Jamie: Local versus remote is the other big dividing line. What lives where?
Alex: Your local repository is the copy on your computer, including the working tree and the .git history. The remote repository is the copy hosted somewhere else, usually GitHub. They are related, but they are not the same place.
Jamie: So clone is the first movement from GitHub to my computer.
Alex: Yes. git clone copies the remote repository to your machine and sets up a connection, commonly named origin. After that, you can make local commits even if GitHub has not seen them yet.
Jamie: That two-copy idea explains a lot. My computer can be ahead, GitHub can be ahead, or both can have different new work.
Alex: Exactly. A local commit stays local until you push it. Changes made on GitHub or by other contributors do not update your working copy until you fetch or pull.
Jamie: Can we slow down on those direction words?
Alex: Push sends your local commits up to the remote. Fetch contacts the remote and downloads information about new commits without merging them into your current branch. Pull gets remote work and integrates it into your current branch, usually by doing a fetch followed by a merge, though some projects configure pull to rebase instead.
Jamie: So fetch is the cautious check, pull is the check plus bring it in, and push is share my work.
Alex: That is the practical version. In Challenge 10, those words stop being abstract because you clone your Learning Room repository, create a local branch, commit locally, and push back to GitHub. The Learning Room repository is the learner's provisioned space for the Day 1 issue, branch, commit, pull request, and merge workflow, and now you are seeing the same Git ideas from your computer.
Jamie: Merge conflicts sound like Git being angry. Are they actually an error?
Alex: They are not a moral failure, and they are not rare. A merge conflict happens when Git cannot safely combine two sets of changes. The classic case is two branches editing the same lines in the same file, but conflicts can also happen when one side edits a file and the other side deletes it.
Jamie: What does a conflict look like when you open the file?
Alex: Git may insert conflict markers into the file. You might hear or see lines beginning with seven less-than signs, then a section of one version, then seven equals signs, then the other version, and finally seven greater-than signs. VS Code often adds controls to accept current change, accept incoming change, accept both, or compare them.
Jamie: That sounds alarming, but at least it is visible in the file.
Alex: Exactly. To resolve it, you open the conflicted file, decide what the final text should be, remove the markers, save, stage the resolved file, and commit the merge result if Git asks for one. The important part is to read the surrounding text, not just pick a button as fast as possible.
Jamie: So a conflict means Git needs a human decision because both sides changed something Git cannot judge on its own.
Alex: Yes. And once you understand working tree, staging, branch, and remote, the recovery path is less mysterious. git status will usually tell you which files are unmerged and what Git expects you to do next.
Jamie: I want to talk about the timeline idea, because history can feel like a pile of commit messages.
Alex: Git history is a chain of commits connected by parent pointers. When you read git log from the newest commit backward, you are walking that chain in reverse time. The commit message tells you the human reason, while the hash gives Git a precise reference.
Jamie: And branching creates more than one line in that timeline.
Alex: Yes. A branch lets work continue in parallel from a shared earlier commit. When the work is merged, the timelines reconnect, sometimes with a merge commit that records the moment two lines came together.
Jamie: That is where Bonus E, Git History, fits nicely.
Alex: It does. Bonus E uses history as a learning tool: reading commits over time, noticing how a project changed, and using the log to answer questions like when a file changed, what branch introduced a fix, or why a change was made. It turns history from something hidden into something you can study.
Jamie: This also makes VS Code Source Control less spooky. The panel is not inventing a separate system; it is showing Git's areas.
Alex: Exactly. The Changes list is your working tree. Staged Changes is the staging area. The message box plus the commit action writes a commit to your local repository. Sync, push, pull, and fetch are all about moving commits between your local repository and the remote on GitHub.
Jamie: And if something feels wrong, the first move is not to panic-click around the interface.
Alex: Right. Check which branch you are on, then run git status. If you need context, run git log --oneline -5, or fetch before deciding whether to pull. Do not delete the .git folder to 'start over'; that folder is the repository history. If authentication is the problem, use the course material on Git authentication, and for deeper reading, the Pro Git book and GitHub's About Git, GitHub flow, and pull request docs are reliable references.
Jamie: So the compact checklist is: where are my files, what is staged, what branch am I on, what commits exist locally, and what has or has not reached GitHub.
Alex: Yes. If you can answer those questions, Git becomes much easier to recover from. The commands are still commands, and you will still look things up, but you will know what kind of movement each command is trying to perform.
34. Episode 12: Git and Source Control in VS Code
Cloning, branching, staging, committing, pushing, and pulling from VS Code.
Based on: Chapter 14: Git and Source Control in VS Code
Read Transcript - Episode 12: Git and Source Control in VS Code
Transcript
Alex: Welcome back. Today we're moving Git out of the browser and into VS Code, where you can clone a repo, edit files, stage changes, commit, push, pull, and open the path toward a pull request.
Jamie: This is the moment where Git starts feeling real, right? Not just buttons on GitHub.com, but a local copy on your own machine.
Alex: Exactly. This supports Challenge 10, Go Local, where you clone your private Learning Room repository, create or use a learn/<username> branch, make one commit, push it, and use that work as evidence. Then Challenge 11 builds on it by opening a Day 2 pull request from that pushed branch and reading the PR in VS Code.
Jamie: And just to be very clear, the Learning Room repository is the one GitHub Classroom created for each learner. It is not the facilitator template repository.
Alex: Right. Use the private repo URL that looks like https://github.com/<workshop-org>/learning-room-<your-username>.git. Also, the shortcuts are mostly Ctrl on Windows and Linux, and Cmd on Mac, so Ctrl+Shift+P becomes Cmd+Shift+P, Ctrl+Shift+G becomes Cmd+Shift+G, and Ctrl+Enter becomes Cmd+Enter.
Jamie: Let's start with cloning, because that word sounds simple until you have three different tools offering to do it.
Alex: Cloning means making a full local copy of a Git repository. In VS Code, the most reliable path is the Command Palette: press Ctrl+Shift+P, run Git: Clone, paste the repository URL, choose a folder you can find again, and then open the cloned repository when VS Code asks.
Jamie: So VS Code is still using Git underneath, but it gives you prompts instead of making you remember the whole command.
Alex: Yes. The terminal version is git clone followed by the repository URL. The GitHub CLI version is gh repo clone owner/name, which is shorter and can handle GitHub authentication nicely once gh is signed in. VS Code also has a Start Page clone button, and GitHub.com has a Code button where you can copy the URL.
Jamie: What should a screen reader user expect while the clone is happening?
Alex: VS Code usually shows a progress notification. NVDA often reads it automatically, and if nothing seems to happen, you can run Notifications: Focus Notification Toast from the Command Palette. When the clone finishes, open Explorer with Ctrl+Shift+E and confirm you hear files such as README.md and folders such as docs.
Jamie: And after cloning, you might only see main locally, even if there are branches on GitHub.
Alex: Yes. A fresh clone checks out the default branch, often main. In the terminal, git branch -a lists local branches and remote-tracking branches like remotes/origin/learn/yourname. The star marks your current branch, and git switch learn/yourname or git checkout learn/yourname can create a local branch that follows the one on GitHub.
Jamie: The chapter also gives a low-stakes practice clone with the Sci-Fi Themes repo, which is helpful if you want to rehearse before touching your Learning Room work.
Alex: That's a good warm-up. You can clone with gh repo clone owner/name, cd into the folder, and open it in VS Code with code . if the code command is installed.
Alex: Once the repository is open, the Source Control view becomes your main Git dashboard in VS Code.
Jamie: That's the branch-looking icon in the Activity Bar, and the shortcut is Ctrl+Shift+G, or Cmd+Shift+G on Mac.
Alex: When it opens, you get the commit message input near the top, then groups of files such as Changes and Staged Changes. A changed file might be modified, added, deleted, renamed, or untracked. You can open a file's diff, stage it with the plus button, or use the context menu with Shift+F10.
Jamie: I like that the panel separates what changed from what is ready to commit. That reduces the mystery.
Alex: Git is tracking three areas. The working tree is the folder you are editing. The staging area is the set of changes you have selected for the next commit. The repository is Git's saved history after you commit.
Jamie: So the file states are untracked for a new file Git is not tracking yet, modified for a tracked file that changed, and staged for a change that is queued for the next commit.
Alex: Exactly. In the terminal, git status gives the same overview, git status -s gives a compact one-letter view, git diff shows unstaged changes, and git diff --staged shows what is ready to commit. Those command cards in the chapter are worth keeping nearby because they give you another way to verify what VS Code is showing.
Jamie: Branches are where a lot of people get nervous. What is the practical version?
Alex: A branch is a named line of work. For Challenge 10, you either switch to your existing learn/<username> branch or create it if it does not exist yet. In VS Code, use the Command Palette and run Git: Checkout to... for an existing branch, or Git: Create Branch... for a new one.
Jamie: And naming matters because maintainers and facilitators read those names later.
Alex: Yes. A name like learn/yourname or docs/improve-welcome is easier to understand than random-test. After you switch, the status bar shows the current branch. You can focus the status bar to hear it, and you can also run git branch --show-current.
Jamie: What happens when you switch branches?
Alex: VS Code updates the files in your working tree to match that branch. If you have uncommitted changes that would be overwritten, Git will stop and ask you to commit, stash, or discard them first. In the CLI, git switch -c branch-name creates and switches, git switch branch-name switches, git branch lists local branches, and git branch -a includes remote-tracking branches.
Jamie: And after a pull request is merged, deleting the branch is cleanup, not part of making the contribution real.
Alex: Right. You can delete a merged local branch with git branch -d branch-name, and delete a remote branch with git push origin --delete branch-name. Use force deletion only when you are certain the work is no longer needed.
Alex: Staging is the part of Git that lets you choose exactly what goes into a commit.
Jamie: Why not just commit everything that changed?
Alex: Sometimes that is fine, but staging gives you control. Maybe you fixed a typo and also started a bigger edit that is not ready. You can stage one file, stage all changes, or stage only selected lines or chunks, which Git often calls hunks.
Jamie: That is especially useful in workshop practice because a small commit is easier to explain and easier to review.
Alex: In VS Code, use the plus button next to one file to stage that file, or the plus button on the Changes group to stage everything. For line or chunk staging, open the diff and use the stage controls for the selected change. In the CLI, git add path stages one file, git add . stages current folder changes, and git add -p walks you through hunks interactively.
Jamie: And if you stage the wrong thing?
Alex: You can unstage it. In VS Code, use the minus button in Staged Changes. In the terminal, git restore --staged path removes it from the staging area without deleting your edit. Then check again with git status or by reading the Source Control groups.
Jamie: What about throwing changes away? That feels risky.
Alex: It should feel serious. Discard only when you are sure you do not need the edit. VS Code can discard one file or all unstaged changes, while git restore path does the same in the terminal. If you might need the work later, stash it instead; and if you truly want to remove a file from the repository, use Git Delete in VS Code or git rm path so the deletion is tracked and can be committed.
Jamie: Now we have changes staged. What makes a good commit?
Alex: A commit is a saved snapshot plus a message. A good subject line is short, specific, and written like an action, such as docs: improve welcome.md introduction. Many teams use a prefix like docs, fix, chore, or feat, followed by a colon and a plain-language summary.
Jamie: And the commit message input is at the top of Source Control.
Alex: Yes. Type the message there, then press Ctrl+Enter, or Cmd+Enter on Mac. Screen readers usually announce the Source Control state changing afterward because the staged files disappear. That is your signal that the commit was created locally.
Jamie: Local is the key word there.
Alex: Exactly. A commit on your computer is not on GitHub yet. In the terminal, the equivalent is git commit -m followed by your message. You can also use git commit without -m to write a longer message in an editor, or git commit -am for tracked files only, but beginners should be careful because that skips untracked new files.
Alex: Pushing sends your local commits to GitHub.
Jamie: So if I commit and then close my laptop, GitHub does not know about that commit until I push.
Alex: Correct. In VS Code, run Git: Push from the Command Palette, or use the sync and publish controls in the Source Control area. If the branch is new, VS Code may say Publish Branch. That creates or connects the branch on GitHub, often called origin, so your local branch has a remote tracking branch.
Jamie: Remote tracking branch is one of those phrases that sounds bigger than it is.
Alex: It means your local branch knows which branch on GitHub it normally pushes to and pulls from. In the CLI, the first push for a new branch is often git push -u origin branch-name. After that, git push is usually enough because Git remembers the relationship.
Jamie: Pulling is the opposite direction, then?
Alex: Mostly, yes. Pulling downloads commits from GitHub and integrates them into your current branch. Technically, git pull is git fetch plus a merge by default. If you want to see what changed before integrating, run git fetch, then git status or git log.
Jamie: When would git pull --rebase come up?
Alex: Use it when your local branch and the GitHub branch both have new commits, and you want your local commits replayed on top of the latest remote commits for a cleaner history. It is common on personal feature branches, but be careful on branches other people are also using. If a conflict appears during rebase or pull, stop, read the conflicting files, resolve them, then continue the operation.
Jamie: And if push fails, the usual reason is that GitHub has commits you do not have yet.
Alex: Right. Run git fetch, check git status, pull or pull with rebase if appropriate, resolve any conflicts, and then push again. For forked projects, GitHub.com may also offer a Sync fork button, and the terminal version is to add an upstream remote once, fetch upstream, merge or rebase the default branch, and push the updated branch back to your fork.
Jamie: Challenge 11 starts right after that push, because now the branch exists on GitHub and can become a pull request.
Alex: Yes. On GitHub.com, use Compare and pull request if the banner appears, or open Pull requests, choose New pull request, set base to main, compare to your branch, and include plain text like Closes #XX so the PR links to the challenge issue. If you prefer the web workflow for a small edit, you can still edit directly on GitHub.com, commit in the browser, and open a PR there, but Challenge 10 is about practicing the local path.
Jamie: Once work exists in history, how do you look back without getting lost?
Alex: VS Code has a Timeline view for a file. You can open it from the Explorer sidebar or through the Command Palette, and it shows recent saves and Git commits related to that file. Opening a commit lets you inspect what changed.
Jamie: And Git blame is the line-by-line history tool, right?
Alex: Yes. Blame shows which commit and author last changed each line. It is not about blaming a person; it is about finding context. In the terminal, git log shows repository history, git log -- path shows history for one file, git log -p includes patch details, git blame path shows line history, and git show commit-hash displays a specific commit.
Jamie: Conflicts are another kind of history lesson, but less friendly.
Alex: A merge conflict happens when Git cannot safely combine two edits to the same area. VS Code marks the file as conflicted and offers actions such as accept current, accept incoming, accept both, or compare changes. Do not just pick a button blindly; read the file and make the final content correct.
Jamie: The accessible diff view helps because you can move through changes in a more structured way than searching for conflict markers by hand.
Alex: Yes. Use the diff viewer, review one hunk at a time, save the resolved file, stage it, and complete the merge or rebase. If you realize you are in the wrong operation, git merge --abort can back out of a merge, and git rebase --abort can back out of a rebase.
Jamie: We touched stash earlier, but it deserves one more pass because it solves a very real problem: I changed files, and now I need to switch tasks.
Alex: Stash temporarily shelves uncommitted work. In VS Code, use the Command Palette for Git: Stash, then later Git: Apply Stash or Git: Pop Stash. Apply restores the changes and keeps the stash entry; pop restores the changes and removes the stash entry.
Jamie: The terminal version is git stash push -m with a message, git stash list, git stash show, git stash apply, and git stash pop.
Alex: Exactly. If you need to include new untracked files, use git stash push -u. You can drop one stash when you are done, or clear all stashes, but clear is a careful command because it removes every stash entry.
Jamie: And then there is reflog, the emergency tool.
Alex: Reflog records where your local branch tips and HEAD have been. If you deleted a branch or moved away from a commit, git reflog can help you find the old commit hash. The safer recovery move is usually to create a new branch at that hash, using git branch recovered-name hash, before doing anything destructive.
Jamie: But reflog is local. It is not a GitHub backup service.
Alex: Right. It exists on your machine and eventually expires entries. For everyday work, use steady habits: git status before acting, git branch --show-current before pushing, git fetch before assuming you are up to date, and clear PR text like Closes #XX.
Jamie: There are also alternatives if VS Code is not the best fit for a specific moment.
Alex: GitHub Desktop offers a visual Git interface. GitHub CLI gives commands like gh repo clone, gh pr create, gh pr view, and gh pr checkout. The Git CLI gives the most direct commands: clone, switch, add, commit, push, pull, fetch, status, log, restore, stash, and reflog.
Jamie: So the expected result for Challenge 10 is not a giant feature. It is evidence that the local workflow happened: the right branch name, a meaningful commit, a pushed branch, and PR metadata that links back to the issue.
Alex: Exactly. If you get stuck, confirm the repository URL, confirm you are on the intended branch, run git status, fetch before pushing, and ask for help with the exact message Git gave you. Small, verifiable steps make this workflow much less mysterious.
35. Challenge 10: Go Local
Cloning, local branches, commits, pushing, and understanding local versus remote.
Practice focus: Day 2 local workflow
Read Transcript - Challenge 10: Go Local
Transcript
Alex: Welcome back. Day 2 begins with Challenge 10: Go Local, and the shift is pretty big. Yesterday, GitHub.com handled a lot for you in the browser. Today, you bring the repository down to your computer, make a change locally, and send it back up.
Jamie: So this is the moment where Git stops feeling like a website button and starts feeling like an actual development workflow.
Alex: Exactly. The goal is simple: clone a repository, create a branch, edit a file, commit your change, and push that branch to GitHub. The change itself can be tiny. The workflow is the thing you're practicing.
Jamie: And the challenge title is doing a lot of work there: Go Local. We're proving that work done on your computer can still become part of a GitHub project.
Alex: Before the steps, let's steady the mental model. A remote repository is the copy on GitHub. A local repository is the copy on your computer, including a hidden .git folder where Git stores history.
Jamie: That two-copy idea helps. If I edit locally, GitHub doesn't magically know yet.
Alex: Right. Your local work moves through three areas. First, the working directory, which is the folder and files you can open and edit. Then the staging area, which is a holding place for the changes you want in the next commit. Then the repository history, where the commit is saved as a snapshot.
Jamie: So editing is not the same as committing. And staging is that middle step where I choose what belongs in the save point.
Alex: Yes. A commit records the staged snapshot, a message, the author, and a pointer to the previous commit. Git also gives it a unique hash, though most of the time you'll only hear or see the short version, around seven characters.
Jamie: And branches are how we keep work separate from main, right?
Alex: That's it. The default branch is usually main. When you create a branch, you're making a parallel line of work so your edit can be reviewed or tested without disturbing main. Git uses HEAD to track which branch you're currently on.
Jamie: Then push is the moment I share my local commits with GitHub. Pull brings GitHub's changes down and merges them, and fetch checks what's new without changing my files yet.
Alex: Perfect. And if two people change the same part of the same file, Git may need help deciding what to keep. That's a merge conflict. It is normal, and VS Code gives tools for reviewing those changes when it happens.
Jamie: What should learners have ready before starting this one?
Alex: You should have VS Code available for Day 2, though GitHub Desktop and the command line are also supported paths. If you're joining Day 2 without Day 1, that's okay if you already know the basics: repositories, issues, pull requests, and reviewing changes. The Day 2 Quick Start is there to check accounts, tools, and comfort level in about 30 minutes.
Jamie: And the repository choice matters here, because there are practice repos and learner repos floating around.
Alex: Use the repository URL given in your Challenge 10 issue or by your facilitator. In many cohorts, that is your private Learning Room repository, the one GitHub Classroom provisioned for you. Some practice material uses the sci-fi themes repository, with the URL https://github.com/Community-Access/vscode-sci-fi-themes.git. What you should not do is clone the facilitator template unless you were specifically told to maintain it.
Jamie: So if the instructions say Learning Room, I clone my own private Learning Room copy. If the issue gives the sci-fi themes URL, I use that. Either way, the pattern is the same.
Alex: Let's walk the VS Code path first, because it's the recommended Day 2 route. Open VS Code, then open the Command Palette with Ctrl+Shift+P, or Cmd+Shift+P on Mac. Type Git: Clone, choose that command, paste the repository URL, and choose a folder on your computer where you can find it again.
Jamie: After it clones, VS Code usually asks whether to open the cloned repository. Say yes, because opening the folder is what makes Source Control and the file tree line up with the repo.
Alex: Exactly. You can verify the clone by opening Explorer with Ctrl+Shift+E, or Cmd+Shift+E on Mac. You should hear or see files like README.md, and possibly a docs folder, depending on the repo.
Jamie: Then we need to get off main before editing.
Alex: Yes. Open the Command Palette again and run Git: Create Branch. In the challenge issue, the branch name may be fix/YOUR-USERNAME, where you replace YOUR-USERNAME with your GitHub username. In Learning Room practice, you may use a learn/<username> branch if your cohort is using that convention.
Jamie: I like checking the branch name in the status bar after that. It makes it harder to accidentally commit on main.
Alex: Good habit. Now open README.md or the file named in your issue, make a small edit, and save with Ctrl+S or Cmd+S. A typo fix, a clearer sentence, or one helpful comment is enough.
Jamie: Then Source Control time.
Alex: Open Source Control with Ctrl+Shift+G, or Cmd+Shift+G on Mac. Your changed file appears under Changes. Move to the file and activate the plus button, which stages it. Then type a commit message like docs: improve README wording, and commit with Ctrl+Enter or Cmd+Enter.
Jamie: After the commit, the change list should clear because the snapshot is now saved locally.
Alex: Right. But it is still only local. To share it, open the Command Palette, run Git: Push, and if VS Code asks to publish the branch or set upstream, confirm it. Setting upstream just links your local branch to a branch on GitHub so future pushes know where to go.
Jamie: What if someone prefers the terminal? I know some learners hear command line and immediately worry they're doing the harder version.
Alex: The terminal path is direct, not automatically harder. Start by cloning the repo URL your facilitator gave you, for example git clone followed by the URL. Then cd into the folder. A good check before changing anything is git status, and another is git branch --show-current.
Jamie: And to create the branch?
Alex: Use git checkout -b fix/YOUR-USERNAME, replacing the placeholder. Some newer materials also use git switch -c for the same create-and-switch action. Then edit a file in any text editor. You can use VS Code with code README.md, or another editor you already know.
Jamie: Stage and commit are the part where the mental model pays off.
Alex: Yes. Use git add with the file you changed, such as git add README.md or git add docs/welcome.md. Then commit with a clear message, for example git commit -m 'docs: fix typo in welcome page'. A descriptive message helps future you understand why the commit exists.
Jamie: Then push with the upstream link the first time.
Alex: Right: git push -u origin fix/YOUR-USERNAME. The -u connects your local branch to the remote branch named origin, which is GitHub in most cloned repos. After that, plain git push usually works from that branch.
Jamie: Where does GitHub CLI fit in?
Alex: GitHub CLI can shorten the clone step with gh repo clone owner/name, and it often handles authentication smoothly. But even if you use gh to clone, the Git ideas are the same: check status, know your branch, stage intentionally, commit locally, and push.
Jamie: GitHub Desktop is the other supported route, and it can feel calmer if you want labeled controls instead of commands.
Alex: Yes. In GitHub Desktop, choose File, then Clone repository. Use the URL tab, paste the repo URL, choose a local path, and select Clone. Once the repo is open, use the Current Branch menu or Branch menu to create a new branch, often fix/YOUR-USERNAME, based on main.
Jamie: Then you open the file in an editor, make the tiny change, and save it.
Alex: When you return to GitHub Desktop, it lists the changed file and shows the diff, which is the before-and-after view of the edit. Write a summary in the bottom-left box, such as docs: improve README wording. Then select Commit to your branch, and finally Publish branch at the top.
Jamie: So Desktop still does clone, branch, edit, commit, push. It just wraps the Git commands in a different interface.
Alex: Let's spend a minute on accessible Source Control habits, because they make local Git much less mysterious. In VS Code, Ctrl+Shift+G opens the Source Control panel. Files are grouped by state, so you can tell what is changed, what is staged, and what is ready to commit.
Jamie: When you use a screen reader, the names and states matter. Modified, added, deleted, staged... those words tell you where you are in the process.
Alex: Exactly. Press Enter on a changed file to review the diff. Added and removed lines are identified by the viewer, and you can stage a whole file with the plus button. More advanced users can stage selected lines or chunks, which is useful when one file contains two unrelated edits.
Jamie: And unstaging is allowed. If I staged the wrong file, I can move it back out before committing.
Alex: Yes, staging is reversible before the commit. Committing is more durable, so slow down there and write the message in plain language. A good message often starts with a type like docs or fix, then says what changed: docs: improve welcome page introduction.
Jamie: How do I know I actually succeeded after pushing?
Alex: Go to the repository on GitHub.com. You may see a banner saying your branch had recent pushes, with a Compare & pull request button. You should also be able to find your branch in the branch selector and see your commit in that branch's history.
Jamie: And the challenge asks for evidence, not a huge essay.
Alex: Right. In the issue's evidence box, describe the tool you used, the branch name, what file you edited, and your commit message. The automated check is looking for at least one commit on a non-default branch that was pushed from a local tool.
Jamie: Some versions also ask for a peer simulation check, comparing your workflow with a buddy or with the peer-simulation PR notes.
Alex: That's a useful reflection. Maybe your buddy used Desktop while you used VS Code, or they pushed from terminal while you clicked Publish Branch. The interface changed, but the Git workflow stayed recognizable.
Jamie: And to unlock Challenge 11, reply to the issue with a joyful message that you pushed your code, then activate Close issue.
Alex: Yes. Celebrate it. Your computer and GitHub are now talking to each other through Git.
Jamie: Let's talk about getting stuck, because cloning and pushing are the two places where people often feel blocked.
Alex: If cloning fails, first check the URL. Make sure you copied the HTTPS or SSH URL from the Code button for the right repository. If it is a private Learning Room repo, you need access with your own GitHub account; if access is denied, ask a facilitator to confirm the Classroom setup.
Jamie: Authentication errors can sound scary, but they often mean the tool needs you to sign in again or use the right credential method.
Alex: Exactly. The Git authentication appendix is there for that setup. If VS Code seems quiet during clone or push, check notifications; the command Notifications: Focus Notification Toast can bring the progress message into focus.
Jamie: What about push rejected?
Alex: First, confirm you committed. Push sends commits, not just saved files. Then run git status to see what Git thinks is happening. If GitHub has changes you do not have locally, fetch or pull before trying again, and make sure you are on the branch you meant to push.
Jamie: And if Source Control doesn't show anything?
Alex: Make sure you opened the cloned folder as the workspace, not just a single file. Press Ctrl+Shift+G or Cmd+Shift+G, and check that the folder is actually a Git repository. If you're unsure what to edit, choose the smallest helpful change: fix a typo, improve a sentence, or add a short note.
Jamie: There are also safety tools for mistakes, right?
Alex: Yes. If you do not want to keep an uncommitted change, you can discard it, but read the prompt carefully because discard can remove work. If you need to temporarily set work aside, stash is safer. Timeline and Git history help you review past commits, blame shows who last changed each line, and reflog can sometimes recover lost local commits or deleted branches.
Jamie: Reflog is local-only, though. If the work never existed on your machine, reflog won't invent it.
Alex: Correct. And with conflicts, remember that a conflict is not a failure. It means Git found overlapping edits and needs a human decision. VS Code can guide you through choosing, combining, or reviewing those changes before committing the resolution.
Jamie: I like where this challenge lands. It is not asking for a masterpiece edit. It is asking for a complete loop.
Alex: Clone gives you a local copy. Branch protects main. Edit changes a real file. Stage selects what belongs in the snapshot. Commit saves it locally. Push backs it up on GitHub and makes it visible to the project.
Jamie: And once that branch appears on GitHub with your commit, you've crossed an important line. You're not just using GitHub in the browser anymore. You're working like a contributor with local tools.
36. Challenge bonus-e: Git History
Reading history, understanding commits over time, and using history as a learning tool.
Practice focus: Bonus
Download Challenge bonus-e (MP3)
Read Transcript - Challenge bonus-e: Git History
Transcript
Alex: Welcome back. Today we're doing Bonus E, Git History, and the goal is to read a repository's past instead of only looking at its current files.
Jamie: I like that framing, because history can feel like a wall of mysterious messages. This challenge makes it visual, right?
Alex: Exactly. You'll explore the learning-room repository, which is the per-learner repo where your Day 1 issue, branch, commit, pull request, and merge work happened. The challenge asks you to use GitHub Desktop, or GitHub.com if you prefer, to see commits, branches, and merges over time.
Jamie: And this is one of the bonus challenges that unlocks after Challenge 15, yes?
Alex: Yes. After Challenge 15 unlocks the next path, Bonus Challenges A through E become available as a structured set. You can choose this one without waiting for Challenge 16, and Challenge 16 itself is the Capstone Project.
Jamie: Before we open a history view, I want the Git model in my head. What am I actually looking at when I see all those commits?
Alex: You're looking at saved snapshots. When you work locally, Git separates your project into the working directory, the staging area, and the repository. The working directory is the folder you edit, the staging area is where you choose what will go into the next commit, and the repository is the saved record in the hidden .git folder.
Jamie: So a commit is not just a note that says something changed. It is a saved point in the project.
Alex: Right. A commit records the snapshot, a message, the author, and a pointer to the commit that came before it. It also gets a unique ID called a SHA hash, usually shown as a short seven-character version like a1b2c3d. You do not need to memorize hashes, but they are useful when you want to identify one exact moment.
Jamie: Where do branches fit into that?
Alex: A branch is a movable name that points to a commit. The default branch is often main, and your learning branch may be named something like learn/YOUR-USERNAME. HEAD is Git's way of saying which branch or commit you are currently on.
Jamie: And local versus remote is the two-copy part: one copy on my computer, one copy on GitHub.
Alex: Yes. Push sends your local commits to GitHub. Pull brings remote updates down and merges them into your current branch. Fetch checks what changed on the remote without merging, which is useful when you just want to update what your tools know before reading history.
Jamie: Now the timeline view makes more sense. It is not just decoration. It is showing how snapshots connect.
Alex: That's the core of this challenge. A straight line of commits shows one path through time. A branch creates another path, and a merge brings paths back together. In a visual graph, those paths may appear as parallel lines that split and reconnect.
Jamie: The challenge asks some very specific observation questions, too.
Alex: It does. You're asked to find how many branches exist right now, locate your Challenge 5 commit, see where your learn/YOUR-USERNAME branch diverges from main, find the merge commit from your Challenge 9 pull request, and identify the oldest commit in the repository.
Jamie: That oldest commit is often the one that created the starting project structure, sometimes called the initial commit.
Alex: Exactly. And the merge commit is interesting because it usually has two parent commits. That means it connects two lines of work: the main line and the branch that was merged.
Jamie: Let's start with GitHub Desktop, because the challenge is really built around that visual timeline.
Alex: Open GitHub Desktop and choose the learning-room repository. If it is not already visible, use the repository picker to find it. Then open the History tab, where the left side lists commits and the right side shows details for the commit you selected.
Jamie: What should I listen for or look for once I'm in that tab?
Alex: Move through the commits and pay attention to the message, author, date, and changed files. Click or select a commit to inspect the diff, which is the set of lines added, removed, or modified. Some commits will be yours, and some may be seeded peer-simulation commits that make the repository history more realistic.
Jamie: What if GitHub Desktop does not show all the branches I expect?
Alex: Fetch from the remote first. In GitHub Desktop, use Repository, then Fetch origin. That updates Desktop's knowledge of remote branches without forcing you to merge anything into your current work.
Jamie: So after fetching, I can compare what I remember doing with what the timeline actually records.
Alex: Yes. Look for your Challenge 5 commit message, then look for the branch line that contains it. Then look for where that branch separates from main and where your Challenge 9 pull request came back in as a merge.
Jamie: If someone does not want to use Desktop, GitHub.com gives them another path.
Alex: It does. In the learning-room repository on GitHub.com, the Code tab usually has a commits link near the top showing the number of commits. Open that to see the linear commit history, with the most recent commits first.
Jamie: That page includes the author, date, message, and SHA for each commit, right?
Alex: Yes. Select a commit and GitHub shows the diff. Visually, added lines are commonly shown in green and removed lines in red, and the text diff still carries the actual line changes for assistive technology to read.
Jamie: And the branch graph is under Insights, then Network.
Alex: Correct. The Network graph can show branches as lines that diverge and merge, but it can be busy in repositories with several contributors or simulation commits. If it is hard to read, narrow your attention to a date range, search commit history for your username, or use the branch filter where available.
Jamie: So GitHub.com gives me both a simple list and a more graph-like view.
Alex: That's a good way to say it. The commits page is easier for reading one commit at a time. The Network graph is better for seeing how branches relate.
Jamie: Where does VS Code fit into this challenge? It is mentioned as another history tool, but not quite the same as Desktop.
Alex: VS Code's Timeline view is file-focused. In the Explorer sidebar, you can open Timeline for the current file, and it shows commits that changed that file. That is excellent when you want to know how one document evolved.
Jamie: So if I open a README, the Timeline view is not necessarily showing the whole repository's story.
Alex: Right. It is a narrower lens. For the bonus evidence, GitHub Desktop or GitHub.com is better for branches and merges, while VS Code Timeline is great for answering, who changed this file, when, and why.
Jamie: That also helps when a file suddenly looks unfamiliar. I can inspect its history instead of assuming I broke something.
Alex: Exactly. And if you use VS Code Source Control, files are grouped so you can tell what is changed, what is staged, and what is ready to commit. Running git status in the terminal gives the same kind of orientation in text.
Jamie: This bonus also connects to the advanced Git appendix, because a lot of advanced commands start with reading history carefully.
Alex: They do. Cherry-pick, for example, begins by finding the SHA for one specific commit, then applying that commit to your current branch. You might find the SHA in VS Code Timeline, with git log branch-name --oneline, or through a GitHub API query with gh, then run git cherry-pick a1b2c3d.
Jamie: And if cherry-pick runs into a conflict, it pauses like a merge conflict.
Alex: Yes. You resolve the marked files, stage them, and run git cherry-pick --continue. If you decide this was the wrong move, git cherry-pick --abort returns you to where you started.
Jamie: Interactive rebase is another history tool, but it sounds more powerful and more dangerous.
Alex: It rewrites commits, so use it with care. With git rebase -i HEAD~3, you can edit the last three commits: keep them, squash them together, reword messages, drop one, or pause to amend one. It is best for commits that have not been pushed to a shared branch.
Jamie: That explains why history is not just something you read after the fact. Sometimes you clean it up before asking people to review your pull request.
Alex: Exactly. A tidy history can make review easier, but safety comes first. If you get into trouble during a rebase, git rebase --abort is the escape hatch, and git status will usually tell you what Git is waiting for.
Jamie: Undo commands are where I always want extra caution. Reset and revert sound similar, but they are not the same.
Alex: Good instinct. git reset moves where your branch points and can keep changes staged, keep them unstaged, or discard them depending on the mode. git revert is safer for shared branches because it creates a new commit that undoes an older commit, leaving the existing history intact.
Jamie: Tags are history markers too, right? Like naming an important release point.
Alex: Yes. A lightweight tag is a simple name for a commit, and an annotated tag includes extra metadata and is commonly recommended for releases. You can create tags in Git, push them to GitHub, list them, show details, or delete local and remote tags when needed.
Jamie: What about detached HEAD? That phrase sounds worse than it is.
Alex: It means you are looking directly at a commit instead of being on a branch. If you only meant to inspect history, switch back to your branch. If you made commits there and want to keep them, create a new branch at that point so the work has a name.
Jamie: And force pushing is the one where the appendix says to prefer --force-with-lease over plain --force.
Alex: Right. --force-with-lease checks whether someone else pushed since your last fetch, and it fails instead of overwriting their work. A common flow is rebase your feature branch onto main, resolve conflicts, continue the rebase, then push with --force-with-lease because the remote branch still has the old commit shape.
Jamie: Branch protection can block that kind of direct push or merge too.
Alex: Yes. Protected branches may require pull requests, reviews, passing checks, or up-to-date branches. The reliable flow is to work on a branch, commit, push that branch, open a pull request, wait for review and checks, and merge through the pull request when the rules are satisfied.
Jamie: Two more advanced tools are very history-centered: bisect and clean.
Alex: git bisect helps find the commit that introduced a bug. You mark the current commit as bad, mark an older known-good commit, and Git checks points in between until it narrows down the first bad commit. You can do it manually or have Git run a test script at each step, then finish with git bisect reset.
Jamie: git clean is less about commit history and more about clearing untracked files, but it can affect your working folder fast.
Alex: Exactly, so dry-run first. git clean -n shows what would be removed, while -f actually removes files, -d includes directories, -x includes ignored files, and -i lets you confirm interactively. If you are unsure, do not jump straight to deletion.
Jamie: The appendix also mentions using GitHub Copilot for Git operations, not as a substitute for understanding, but as help with confusing output.
Alex: Yes. You can paste git status, git log, git show, a conflict message, or a branch protection error into Copilot Chat and ask what it means. Copilot can also help draft clearer commit messages or suggest which Git command matches the result you want, but you still verify before running anything that rewrites or deletes work.
Jamie: If a learner gets stuck during this bonus, what are the simple recovery moves?
Alex: If Desktop looks incomplete, fetch origin. If the Network graph is overwhelming, use the commits list instead or focus on a smaller time period. If you cannot find your own work, search for your username, your branch name, or a commit message you remember.
Jamie: And the evidence box is not asking for a perfect diagram. It is asking what they discovered.
Alex: Right. Include the tool you used, the number of branches you found, your Challenge 5 commit, where your learning branch diverged from main if you could identify it, the Challenge 9 merge commit if you found it, the oldest commit, and one surprising thing you noticed. If you explored at least one commit diff and can explain what the history tells you about the project, you have done the work of this bonus.
Jamie: I like that because it turns Git history into a study tool. You can learn from the path the project took, not only from the final file state.
Alex: Exactly. Git history is a navigable record of change: who changed what, when it changed, and how separate lines of work came back together. Once you can read that record, advanced Git becomes much less mysterious.
37. Episode 13: The GitHub Pull Requests Extension
Viewing, creating, reviewing, and merging PRs from inside VS Code.
Based on: Chapter 15: The GitHub Pull Requests Extension
Read Transcript - Episode 13: The GitHub Pull Requests Extension
Transcript
Alex: Welcome back. Today we're staying in VS Code and bringing pull requests into the editor with the GitHub Pull Requests and Issues extension.
Jamie: This is the one that lets you look at PRs, read diffs, comment, and even merge without constantly jumping back to the browser, right?
Alex: Exactly. A pull request, or PR, is the conversation around a proposed change. The extension gives that conversation a home inside VS Code, right beside your files, source control, and terminal.
Jamie: That sounds especially useful on Day 2, because learners are no longer only clicking through GitHub.com. They are pushing branches from VS Code and then trying to understand what changed.
Alex: Yes. On Day 1, your Learning Room repository gave you the web workflow: issue, branch, commit, pull request, merge. This workflow maps those same ideas into the editor, so when Challenge 11 asks you to open a Day 2 PR from a locally pushed branch, the pieces already feel familiar.
Jamie: Before anyone reviews anything, they need the extension installed. What should they have open?
Alex: Open VS Code desktop with your Learning Room repository loaded. Then open the Extensions sidebar with `Ctrl+Shift+X`, or `Cmd+Shift+X` on Mac, search for `GitHub Pull Requests`, choose the GitHub-published extension, and activate Install.
Jamie: And if someone prefers commands over sidebars, they can use the Command Palette?
Alex: Yes. Open it with `Ctrl+Shift+P`, or `Cmd+Shift+P` on Mac, and run the command to install extensions, then search from there. After installation, VS Code usually prompts you to sign in to GitHub, opens a browser for authorization, and then returns you to VS Code.
Jamie: How do I know the sign-in worked? Because OAuth windows can feel a little mysterious.
Alex: Open the Explorer sidebar with `Ctrl+Shift+E`. You should see a GitHub section with Pull Requests and Issues. If an install or sign-in notification disappeared too quickly, run `Notifications: Focus Notification Toast` from the Command Palette and listen for the message.
Jamie: Once the extension is ready, where do pull requests actually show up?
Alex: You have a couple of routes. You can use the GitHub icon in the Activity Bar, or run `GitHub Pull Requests: Focus on Pull Requests View` from the Command Palette. You can also find a GitHub section inside Explorer, which is handy if you already live in the file tree.
Jamie: And the list is not just one giant pile of every PR on GitHub, I hope.
Alex: No, it is organized. You can see PRs assigned to you, PRs you created, open PRs, and PRs waiting for your review. The tree usually groups by repository and status, and a screen reader may announce something like pull request number, title, author, branch, and review state.
Jamie: If I open one from the list, what am I reading first?
Alex: Usually the PR detail view: title, description, status, checks, reviewers, comments, and changed files. If you want the browser version, open the PR on GitHub.com and use the Conversation and Files changed tabs. If you want the terminal version, `gh pr list`, `gh pr view`, and `gh pr status` cover the same basic orientation.
Jamie: Reading a PR is one thing. Checking it out sounds more serious. Why would I do that?
Alex: Checking out a PR means VS Code switches your working copy to the branch from that pull request. That lets you run the code, test the docs locally, or inspect files with all your usual editor tools instead of only reading the web diff.
Jamie: So in Challenge 12, when I review a classmate's PR, checking it out helps me verify what they changed instead of only reacting to the summary.
Alex: Right. From the PR detail view, activate Checkout. From the PR tree, open the context menu with `Shift+F10` on Windows, or `Ctrl+Return` on Mac, and choose Checkout. You can also use the Command Palette if you remember the extension command better than the panel layout.
Jamie: And when I am done, I should get back to my own branch.
Alex: Yes. Use the branch control in the status bar, the Source Control panel with `Ctrl+Shift+G`, or Git commands to return to your original branch. The web fallback is to stay on GitHub.com and review read-only. The terminal version is `gh pr checkout` for a local checkout, and `gh pr diff` if you only want to inspect changes without switching branches.
Alex: The heart of review is the diff, which is the before-and-after view of the files changed by a PR.
Jamie: Diffs are where I see added lines, removed lines, and whether the change matches what the author claimed.
Alex: Exactly. In VS Code, open the PR, then open the changed files list. A file may open in the Diff Editor, often with old content on the left and new content on the right. You can switch between split view and inline view if one is easier to read.
Jamie: For screen reader users, the visual layout is not always the easiest way to understand the change.
Alex: That is where the Accessible Diff Viewer helps. Press `F7` to move to the next change and `Shift+F7` to move to the previous change. It reads a change as a structured block, such as removed line, added line, and surrounding context, which is usually much clearer than wandering through each visual column.
Jamie: So the review habit is: read the PR description, read the changed files, use `F7` through the diff, and notice one specific thing worth saying.
Alex: Yes. It might be a typo, an unclear instruction, a missing setup step, a heading hierarchy issue, link text that needs improvement, or something the author handled well. Specific comments are useful; vague approval is rarely enough by itself.
Alex: Creating a PR from VS Code is the author side of the same loop.
Jamie: This is where Challenge 11 fits, right? I make changes on a local branch, push that branch, and then open a Day 2 PR.
Alex: Yes. You need a repository connected to GitHub, a branch with commits, and usually that branch pushed to the remote. Then run `GitHub Pull Requests: Create Pull Request` from the Command Palette, or start from Source Control, or use the GitHub panel.
Jamie: The two branch fields always trip people up. Base branch and compare branch sound similar.
Alex: The base branch is the target, often `main`, where you want the change to land. The compare branch is your source branch, the one containing your commits. If those are reversed, the PR will look confusing, so pause and confirm them before creating it.
Jamie: Then I write the title and description in VS Code too?
Alex: Yes. The title is required. The description is optional in the tool, but recommended in real collaboration. If the repo has a PR template, often stored in `.github/pull_request_template.md` or a related template folder, fill it in: description, related issue, type of change, testing, checklist, and screenshots when relevant.
Jamie: And reviewers, labels, milestones, and draft status are optional fields, but they are not random decoration. They tell other people how to treat the PR.
Alex: Right. Draft means not ready for final review. The browser alternative is GitHub.com's New pull request page. The terminal alternative is `gh pr create`, either interactively for prompts or inline with flags for title, body, base, head, and draft.
Jamie: Let's talk about comments, because this is where review can either help someone or make them feel shut down.
Alex: A good inline comment attaches to a specific line and explains what you noticed. In VS Code, put your cursor on the line, run `GitHub Pull Requests: Add Comment`, write the comment, and add it. If that is difficult, open the PR in the browser and comment from the Files changed tab.
Jamie: What if I have several comments and do not want to send them one at a time?
Alex: Use Start Review when it is available. That lets you collect comments, then submit them together with a review verdict. Your verdict can be Approve, Request changes, or Comment. Approve means you believe it is ready, Request changes means something should be fixed before merge, and Comment means you are giving feedback without a blocking decision.
Jamie: I like prefixes for tone too: blocking, suggestion, question, nit. They tell the author whether I am stopping the PR or just offering a small improvement.
Alex: Exactly. The web path is Files changed, add inline comments, then Review changes. The terminal path is `gh pr review --approve`, `gh pr review --request-changes`, or `gh pr review --comment`, and `gh pr diff` helps you inspect before deciding. Challenge 12 is really about this: leave specific feedback and own the tone of your review.
Alex: Merging is the moment when the accepted change becomes part of the target branch.
Jamie: So I should not merge just because the button is there.
Alex: Correct. Check that you have permission, the PR is review-ready, required checks have passed, conflicts are resolved, and the team agrees it should land. In VS Code, the merge action appears in the PR detail view when you have access. You can also run a merge command from the Command Palette.
Jamie: There are different merge types too, right?
Alex: Yes. A regular merge keeps the branch history. Squash and merge combines the PR into one commit, which many documentation projects prefer for a tidy history. Rebase and merge replays commits on top of the base branch. Use the repository's norm, not personal preference in the moment.
Jamie: After merging, I still need to clean up my local view of the world.
Alex: Switch back to `main`, pull the latest changes, and delete the feature branch if the project expects that. On GitHub.com, use the merge button and then delete the branch if offered. With the CLI, use commands such as `gh pr merge`, `gh pr merge --squash --delete-branch`, or auto-merge options when checks must pass first.
Alex: A few problems come up often enough that they are worth recognizing by sound and pattern.
Jamie: First one: the panel says there are no pull requests. That can feel like the extension is broken.
Alex: Usually it is a filter or repository issue. Switch to an All Open view, confirm the right repository is open, and make sure you are signed in with the account that can see the PRs. If the extension seems stuck, reload the window with `Developer: Reload Window` from the Command Palette.
Jamie: What about could not create pull request or authentication failed?
Alex: For PR creation, confirm your branch has commits, the branch is pushed, and the base and compare branches make sense. For authentication, sign in to GitHub in the browser first, close and reopen VS Code, then retry the extension sign-in. If checkout is blocked by permissions, use GitHub.com in read-only mode and still leave your review comment there.
Jamie: And if the diff or comment command is the hard part, use `F7`, search the Command Palette for `GitHub Pull Requests: Add Comment`, or ask a facilitator to model one comment.
Alex: For the chapter evidence, post a completion comment in your assigned setup or review practice issue. Include whether the extension is installed, whether you are signed in, which classmate PR you reviewed, whether the comment was inline or on GitHub.com, and a one-sentence summary of what your comment addressed. There is no automation check here because extension state lives in your account and your local VS Code setup.
Alex: The deeper skill is review judgment, not just button finding.
Jamie: So when I review, I am asking: does the PR do what it says, is the change understandable, does it create an accessibility problem, and can another person maintain it later?
Alex: Yes. Useful review comments include the issue, the reason it matters, and a possible next action. For example, a blocking comment might say that a heading skips from level two to level four and ask the author to preserve the hierarchy. A non-blocking nit might suggest clearer link text without delaying the merge.
Jamie: How many comments is too many?
Alex: If every line gets a comment, the author may not know what matters. Group repeated issues, mark small preferences as nits, and save bigger patterns for the review summary. Review is also a learning tool: explaining what you noticed sharpens your own standards.
Jamie: Where does Copilot fit into this without replacing the reviewer?
Alex: Use it to help understand unfamiliar code or summarize a diff, but do not outsource the decision. It can miss context, invent certainty, or overlook accessibility impact. The Accessibility Agents collection is a living catalog that can support review work over time, but the human reviewer still owns the judgment.
Alex: The same PR workflow now has three doors: VS Code, GitHub.com, and the `gh` CLI.
Jamie: And they line up pretty cleanly. View with the PR panel, the browser tabs, or `gh pr view`. Create with the VS Code command, the web form, or `gh pr create`. Review with inline comments and verdicts in the editor, on GitHub.com, or through `gh pr review`. Merge in the PR detail view, with the web button, or with `gh pr merge`.
Alex: That is why this episode pairs so naturally with Challenge 11, Challenge 12, and bonus-c. Challenge 11 gets your own branch into a PR. Challenge 12 has you review a classmate with clear, constructive feedback. Bonus-c adds the team layer: divide the work, communicate what changed, and make the review conversation easier for everyone.
Jamie: So the takeaway is not that everyone must abandon the browser. It is that you can choose the environment that keeps you oriented, verify the change with accessible tools, and leave feedback that helps the project move forward.
38. Episode 15: Accessible Code Review
Navigating diffs with a screen reader, reviewing PRs in browser and VS Code.
Based on: Chapter 15: Accessible Code Review
Read Transcript - Episode 15: Accessible Code Review
Transcript
Alex: Welcome back. Today we're talking about accessible code review: reading pull requests, understanding diffs, and leaving feedback that actually helps.
Jamie: This is one of those skills that can feel intimidating, because you're not just reading code. You're reacting to someone else's work, in public, with a record attached.
Alex: Exactly. But code review is one of the best places to learn. You see how other people solve problems, you catch mistakes before they merge, and you practice explaining what makes code or documentation clearer.
Jamie: So review is not only a gatekeeping step. It's a learning step, a quality step, and a collaboration step.
Alex: There are two main places you'll review pull requests in this course: GitHub.com in the browser, and VS Code with the GitHub Pull Requests and Issues extension. There's also a third path through the gh command line tool, which is useful when you prefer the terminal.
Jamie: And these connect directly to the Day 2 challenges, right?
Alex: They do. Challenge 11 asks you to open a Day 2 pull request from a locally pushed branch and read it in VS Code. Challenge 12 asks you to review a classmate's PR, leave specific feedback, and take responsibility for your review tone. Bonus Challenge C builds on that with a small-group contribution, where division of work and communication matter just as much as commits.
Jamie: Before doing that, learners should already know the basics of pull requests, have their Learning Room repository available, and have some comfort with Git and source control in VS Code. The written chapter also has short command cards, so you don't have to memorize every menu path.
Alex: Let's start with the VS Code setup. Open the Extensions sidebar with Ctrl+Shift+X, or Cmd+Shift+X on Mac. Search for GitHub Pull Requests, choose the extension published by GitHub, and install it.
Jamie: Then VS Code asks you to sign in to GitHub, usually through a browser authorization screen. After approving it, you return to VS Code.
Alex: To verify it worked, open the Explorer sidebar with Ctrl+Shift+E, or Cmd+Shift+E on Mac. You should see a GitHub section that includes Pull Requests and Issues. The extension also adds PR views, checkout commands, changed-file views, inline comments, review submission, and merge actions.
Jamie: And if a notification disappears before a screen reader catches it, use the Command Palette and run Notifications: Focus Notification Toast. That's a small rescue move that can save a lot of confusion.
Alex: If the extension will not install, reload the VS Code window. If sign-in fails, make sure you're signed in to GitHub in the browser, restart VS Code, and try again. If the PR list is empty, switch the PR panel to an all-open view or check that you're in the right repository.
Alex: Once the extension is installed, you can find pull requests from the GitHub icon in the Activity Bar or from the GitHub section in Explorer. You can list open PRs, filter by status, filter by repository, find items waiting for your review, and open a PR in the browser when that is easier.
Jamie: What does that feel like with a screen reader?
Alex: The PR tree usually announces enough context to orient you, something like pull request number, title, author, status, and repository. When you open a PR detail view, you can move through the description, checks, changed files, comments, and available actions.
Jamie: And checking out a PR means downloading that branch locally, yes?
Alex: Yes. You do that when you want to run the project, inspect files in your editor, or test a change more closely. You can check out from the PR detail view, from the PR tree context menu, or through the Command Palette. When you're done, switch back to your original branch, often main, and pull the latest changes if needed.
Jamie: If checkout is blocked because you don't have permission, that doesn't stop the review. You can stay in read-only mode and review on GitHub.com instead.
Alex: Now let's make diffs less mysterious. A diff is a comparison between two versions of a file. In a unified diff, added lines usually start with a plus sign, deleted lines start with a minus sign, and unchanged context lines appear around them so you know where the change sits.
Jamie: So if I hear plus heading, that line was added. If I hear minus paragraph, that line was removed. And context lines are there to help me understand the neighborhood.
Alex: Right. On GitHub.com, open the pull request, read the description first, then move to the Files changed tab. The modern pull request interface is the default, and the file tree can help you orient by file name, folder, and change count.
Jamie: How do I move around without losing my place?
Alex: Use the file tree, headings, and controls inside the Files changed view. GitHub also has a keyboard shortcuts dialog, opened with the question mark key, where you can confirm the current shortcuts for moving through files and review items. Because shortcuts can change or depend on focus, I like to verify them there before relying on them.
Jamie: And inline comments live on specific lines in the diff.
Alex: Yes. Move to the line you want, open the line comment control, and write the comment there. If you need to comment on several adjacent lines, use the multi-line comment option. When you have more than one comment to leave, choose Start review so you can collect comments before submitting them together.
Jamie: Existing comments matter too. A thread might already explain why something changed, or show that another reviewer asked the same question.
Alex: When you're ready, submit the review with one of three verdicts: approve, request changes, or comment only. Approve means you're comfortable with the PR merging. Request changes means something should be fixed before merge. Comment only means you're leaving feedback without a formal yes or no. If you're the author and you've pushed updates, you can re-request review so reviewers know it's ready for another look.
Alex: VS Code gives you another review path. From the PR view, open the changed files list, then open a file to see the diff. By default, VS Code often uses a split diff, with old content on one side and new content on the other.
Jamie: Split view can be visually helpful, but it can also be noisy with a screen reader.
Alex: That's where the Accessible Diff Viewer matters. Press F7 to move to the next change, and Shift+F7 to move to the previous change. It announces each change as a structured item, including added lines and removed lines, so you don't have to piece together the visual layout manually.
Jamie: So instead of arrowing through a complicated editor and wondering what side I'm on, I get the change read as a meaningful block.
Alex: Exactly. You can also toggle diff views, such as split or inline, if one works better for you. But for screen reader review, F7 is usually the most reliable starting point.
Jamie: And comments from VS Code?
Alex: Place the cursor on the line you want to discuss, open the Command Palette, and run GitHub Pull Requests: Add Comment. Type the comment and add it. If that command is hard to locate or the line placement feels uncertain, open the same PR on GitHub.com and use the Files changed tab there.
Alex: Challenge 11 also asks you to create a pull request from your local branch. In VS Code, the recommended route is the Command Palette command for creating a pull request, though you can also start from Source Control or the GitHub panel.
Jamie: The PR form has a lot of fields. Which ones should people pay attention to first?
Alex: The title is required, and it should describe the change clearly. The description is optional in GitHub, but it's strongly recommended because reviewers need context. You also confirm the base branch, which is the target, and the compare branch, which is your source branch. Reviewers, labels, milestone, and draft status are optional, but they can help a team coordinate.
Jamie: Draft status is useful when the PR is not ready for final review yet.
Alex: Yes. And many repositories use pull request templates. Those are usually stored in the .github folder, either as a single pull_request_template.md file or as files inside a PULL_REQUEST_TEMPLATE folder. A good template may ask for a description, related issue, type of change, testing notes, a checklist, and screenshots when they apply.
Jamie: With a screen reader, I like treating the template as a form inside the description box. Move through each prompt, answer it in place, and don't leave reviewers guessing.
Alex: You can submit through the interactive prompts, provide details inline, create the PR as a draft, or open the form in your browser. The goal is the same: make the change understandable before anyone starts reviewing the diff.
Alex: A helpful review comment is specific, kind, and actionable. It points to the exact problem, explains why it matters, and suggests a possible improvement when you can.
Jamie: So not just, "This is confusing." More like, "This step says press Enter, but the previous sentence says the focus is still in the search box. Could we add a sentence telling the reader to move to the result first?"
Alex: Perfect. Some comments are blocking, meaning the PR should change before merge. Some are non-blocking nits, like a wording polish. Some are questions, and some are praise. Prefixes like blocking, suggestion, nit, question, and praise can help the author understand your intent.
Jamie: How many comments is too many?
Alex: Prioritize. If there are ten tiny style issues and one accessibility barrier, lead with the accessibility barrier. In Challenge 12, the aim is not to prove you found everything. It's to leave feedback a classmate can use, in a tone you'd be comfortable receiving.
Jamie: And after the review is submitted, the author can reply, push commits, and resolve threads.
Alex: Right. Common review tasks include checking whether the PR only changes what it claims, searching for all changes to one section, comparing new commits after the author updates the branch, and asking for clarification when another reviewer's comment is unclear. Good reviewers keep the conversation moving.
Alex: Merging is a separate permission and responsibility. Before merging, make sure the review expectations are met, required checks have passed, conflicts are resolved, and the repository's rules allow you to merge.
Jamie: And there are different merge styles.
Alex: A normal merge keeps the branch commits as they are. Squash and merge combines the PR into one commit, which can keep history tidy. Some repositories enable auto-merge, which merges after required checks pass. After merging, switch back to main, pull the latest changes, and delete the feature branch if the project expects that cleanup.
Jamie: So reviewers may recommend merge readiness, but maintainers often decide the actual merge method.
Alex: The gh CLI is the terminal path. It can be especially nice if terminal output is easier for you to search, copy, or review line by line.
Jamie: What are the core commands?
Alex: Use gh pr view to read the PR description, status, checks, and comments. Use gh pr diff to view the full diff in the terminal. Use gh pr checkout to test the branch locally. And use gh pr review with options like --approve, --request-changes, or --comment, usually with a body message that explains your review.
Jamie: I like that it gives another accessible route. Browser, editor, terminal: same review, different workspace.
Alex: Copilot can help during review, but it should not replace your judgment. In VS Code, with a diff open, you can ask it to summarize what changed, identify possible risks, or suggest test cases.
Jamie: But it can miss context, misunderstand intent, or sound confident about something wrong.
Alex: Exactly. Use it to support your reading, then verify against the actual diff, the PR description, and the project standards. The human reviewer still owns the comment and the verdict.
Alex: The practice work gives you both environments. In the web review exercise, you navigate to a PR, read the description, open Files changed, use focus mode if it helps, find an accessibility issue such as heading hierarchy, find a link text issue, place inline comments, and submit the review.
Jamie: Then the VS Code exercise has you open the PR extension, view file changes, use the Accessible Diff Viewer, listen to the first change, locate the issue, add an inline comment, and reflect on what was easier or harder.
Alex: For evidence, Chapter 15 Part 1 asks for a completion comment confirming the extension installation, GitHub sign-in, the classmate PR number, whether a comment was posted, and what the comment was about. Challenge 12 asks you to show that you reviewed a PR, left inline feedback, and submitted a formal review verdict. Close the assigned Challenge 12 issue when your room instructions say the work is complete.
Jamie: If something breaks, there are practical fallbacks. Reload VS Code, retry GitHub sign-in, switch the PR panel to all open PRs, use GitHub.com if checkout fails, use F7 if the diff editor is hard to navigate, or ask a facilitator to model one review comment.
Alex: The longer-term habit is to review other people's work regularly. Look for correctness, clarity, style, and accessibility. In team work, especially Bonus Challenge C, review becomes part of communication: who changed what, who tested what, and what still needs attention. The Accessibility Agents collection is a living catalog, and some agents can help with review workflows, but the skill comes first: learn to read the change, judge the impact, and respond clearly.
Jamie: That's a strong place to land. A good review does not have to be loud or exhaustive. It has to be specific, respectful, and useful enough that the next commit gets better.
39. Challenge 11: Open a Day 2 PR
Opening a pull request from a locally pushed branch and reading it in VS Code.
Practice focus: Day 2 local workflow
Read Transcript - Challenge 11: Open a Day 2 PR
Transcript
Alex: Welcome back. Challenge 11 is called Open a Day 2 PR, and this is the moment your local Git work becomes a GitHub conversation.
Jamie: So we already did the local part in Challenge 10: clone, branch, edit, stage, commit, and push. Now we are proposing that branch for review.
Alex: Exactly. Your commits started on your machine, but a pull request lives on GitHub. A pull request, or PR, is the place where you describe the change, compare it against `main`, let checks run, and invite review.
Jamie: And if someone joined Day 2 without Day 1, this is still doable as long as they have the GitHub basics and have completed the Day 2 Quick Start readiness check.
Alex: The pattern is familiar from Day 1, but the route is different. Day 1 was edit on GitHub.com, commit, open a PR. Day 2 is edit locally, commit locally, push to GitHub, then open a PR.
Jamie: That helps. The PR step did not become a whole new skill. The commits just came from a different place.
Alex: Right. Git is moving your work between locations: your working folder, your local repository history, and GitHub. Once the branch is on GitHub, the PR creation step feels very much like the browser workflow you already practiced.
Jamie: So if I am nervous, I should not treat this as a brand-new mountain. It is the same review doorway, with one extra push step before it.
Alex: Before opening the PR, confirm that your branch really made it to GitHub. In VS Code, the Source Control panel should be clean after your commit and push, meaning no staged or unstaged changes are waiting.
Jamie: And if I like the terminal, I can check the same thing with `git status`, right?
Alex: Yes. `git status` tells you whether your working tree is clean and whether your branch is ahead of or behind GitHub. `git branch --show-current` tells you which branch you are on, and `git fetch` followed by `git status` helps confirm that your local view is up to date before you push or open the PR.
Jamie: What branch name should people expect?
Alex: Use the branch your challenge issue assigned. In some Day 2 materials you will see examples like `fix/YOUR-USERNAME`, `learn/<username>`, or `feature/day2-local-edit`. The important part is not the exact example name. It is that your compare branch is the branch with your Day 2 commit, and your base branch is usually `main`.
Jamie: That also explains the VS Code pieces from the Git practice chapter: branch name in the status bar, changed files in Source Control, staged changes, commit message, and push status.
Alex: Yes, and there are safety tools around that workflow. Timeline helps you inspect file history. Stash can set unfinished work aside without deleting it. Discard is for throwing away changes, so use it carefully. If a merge conflict appears, VS Code can show conflict choices, and if you truly lose track of a local commit, `git reflog` can help you find recent local history.
Jamie: Good to know, but for this challenge we are hoping for the calm version: one branch, at least one commit, pushed to GitHub, ready for a PR.
Alex: The quickest browser path is the notification banner. Go to the assigned repository on GitHub.com, such as the sci-fi themes repository if that is what your challenge uses. If GitHub notices your recent push, it may show a banner with a Compare & pull request button.
Jamie: That banner is a shortcut, not a requirement. If I hear it or see it, I can use it and skip the manual compare setup.
Alex: Exactly. If there is no banner, open the Pull requests tab, choose New pull request, set base to `main`, and set compare to your Day 2 branch. Then choose Create pull request to reach the form.
Jamie: The base is where I want the change to land. The compare branch is where my change currently lives.
Alex: You can also create the PR inside VS Code if the GitHub Pull Requests and Issues extension is installed and you are signed in. Open the GitHub Pull Requests view from the Activity Bar, or use the Command Palette with `Ctrl+Shift+P`, or `Cmd+Shift+P` on Mac.
Jamie: Then I run GitHub Pull Requests: Create Pull Request?
Alex: Yes. You can run that command, or select the Create Pull Request button in the Pull Requests view. Choose your compare branch, choose `main` as the base branch, enter a clear title, add a short description, and activate Create.
Jamie: And the extension is useful beyond creating PRs. It can list PRs, show details, open changed files, and let me work with reviews without constantly switching back to the browser.
Alex: If you use GitHub CLI, the command is `gh pr create`. It opens an interactive PR creator in the terminal.
Jamie: Interactive means it asks me questions instead of making me remember every option.
Alex: Right. Give the PR a clear title, choose to write the body in your editor if that is comfortable, summarize what changed, and when it asks what is next, choose Submit. You can also use inline options later, but the guided prompts are a solid starting point.
Jamie: So the three doors are browser, VS Code, and `gh pr create`. They all lead to the same PR on GitHub.
Alex: Now slow down for the title and description. A title like `docs: improve README wording` tells reviewers the type of change and the area touched.
Jamie: That is much better than `updates` or `stuff fixed`, which makes everyone open the diff just to learn the basics.
Alex: For the description, write a few plain sentences. You might include a short Changes area, a How I made these changes area, and a Pattern recognition note. For example: I cloned the repo locally, created a branch, edited in VS Code, committed, pushed, and opened this PR. Compared with Day 1, this started from a local clone, may have more than one commit, and required `git push` before the PR.
Jamie: And if the PR should close an issue, include plain text like `Closes #8`, using the real issue number.
Alex: Yes. The reference solution shows that kind of professional PR: a specific title, a list of changes, a short explanation of how the work was made, and a note about what changed from Day 1. That is the evidence reviewers need to understand your path.
Jamie: It also makes the pattern visible to future you. You are not just submitting a link. You are explaining the workflow you used.
Alex: After the PR exists, read it. In the browser, check the Conversation and Files changed tabs. In VS Code, the GitHub Pull Requests extension can open the PR details and changed files.
Jamie: This is where the code review chapter starts to matter. I am not reviewing someone else yet, but I can still inspect my own PR like a reviewer would.
Alex: Exactly. Read the title and description first, then open the changed files. If the diff editor is hard to follow, use the Accessible Diff Viewer with `F7` for the next change and `Shift+F7` for the previous change. It reads changes in chunks, which is usually easier than moving line by line through a visual diff.
Jamie: The challenge also mentions a peer-simulation check. That means I should look at the sample PR title and description and ask whether they clearly explain what changed. If I have real buddy access, I can review my buddy's PR too.
Alex: Yes. And when you leave review comments later, be specific and constructive. A useful comment points to the issue, explains why it matters, and suggests a next step when possible.
Jamie: That is a good habit even when the change is tiny. The PR is both a code artifact and a communication artifact.
Alex: Once the PR is open, Gandalf should run automated checks and post a validation report in the PR conversation. If Gandalf is quiet, open the Checks tab and see whether the workflow is running, waiting, or failed.
Jamie: What if my branch does not appear in the compare dropdown?
Alex: First, make sure the push completed. From your local tool, you can run `git push -u origin fix/YOUR-USERNAME`, replacing the branch name with yours. If GitHub says there is nothing to compare, your branch may not contain any new commits compared with `main`, so confirm you committed and pushed at least one change.
Jamie: And if I do not know what to write in the description, I can reuse the same shape from the earlier PR challenge: what changed and why.
Alex: To finish Challenge 11, paste the URL of your Day 2 PR into the evidence field. Then describe the pattern you noticed between the Day 1 PR and the Day 2 PR.
Jamie: Something like: Day 1 used the web editor, Day 2 used a local clone and required a push, but both ended with a PR against `main`.
Alex: Perfect. Then activate Close issue when the challenge asks you to. If you created a PR from your locally pushed branch, waited for validation, and explained the workflow pattern, you completed the challenge.
Jamie: That is the real win here: local work did not stay trapped on your machine. You moved it into a reviewable GitHub workflow.
40. Challenge 12: Review Like a Pro
Reviewing a classmate PR, leaving specific feedback, and owning review tone.
Practice focus: Day 2 local workflow
Read Transcript - Challenge 12: Review Like a Pro
Transcript
Alex: Welcome back. Challenge 12 is Review Like a Pro, and this is where the workshop starts to feel like real collaboration. You are going to review a pull request from a classmate, a peer-simulation PR, or a sample file, and leave feedback that another person could actually use.
Jamie: I like the goal, but review can feel weirdly personal. It is someone else's work, and you are putting your opinion on it in public.
Alex: Exactly, and that is why this challenge is about both code review and open source culture. A good review is not a performance of expertise. It is asking useful questions, noticing what works, suggesting improvements, and assuming the author was trying to do a good job.
Jamie: So the target is not to sound impressive. It is to help the change get better without making the author feel attacked.
Alex: Before you start, make sure you are in the right place. Day 2 work happens in your Learning Room repository, which is provisioned for you, and VS Code is the required editor for the Day 2 local workflow. If you joined Day 2 without Day 1, the quick start guide is there to confirm your account, tools, and GitHub basics before you jump in.
Jamie: And if I do not have a classmate PR ready, I am not stuck, right?
Alex: Right. The challenge gives you options. You can review the peer-simulation PR named Peer Simulation: Improve contribution guidance, you can review a buddy's Day 2 PR if your facilitator gave you access, or you can use docs/code-review-sample.md as the practice material.
Jamie: And the evidence is not mysterious. I need the review URL, a short description of the feedback I gave, and the verdict I chose.
Alex: On GitHub.com, start from the Pull requests tab in the repository. Open the PR you are reviewing, then move to the Files changed tab. Along the top of a pull request you will usually hear or see Conversation, Commits, Files changed, and Checks.
Jamie: Files changed is where the actual review happens, because that is where the diff lives.
Alex: Yes. A diff is the comparison between the old version and the proposed new version. GitHub marks removed lines and added lines, and it also uses red and green visually, but the important thing is the line-level change: what was removed, what was added, and where it happened.
Jamie: What do I do first when I land in that file list?
Alex: Orient yourself before commenting. Read the PR description, use the file tree to hear which files changed, then move through the changed files one at a time. Some learners like Focus Mode in the browser because it reduces noise while reading diffs.
Jamie: Then I place the first inline comment on a specific line, not just at the bottom of the PR.
Alex: Exactly. Focus on a changed line, or hover over it if you use a mouse, and activate the blue plus comment button. For the first comment, make it specific and positive, like: Great, this heading structure makes the section easy to scan.
Jamie: That is much more useful than just saying looks good.
Alex: For the second comment, make a constructive suggestion. You might say that a sentence would be clearer if it used the word beginners instead of new people. If the suggestion button is available, the one with the plus and minus style icon, use it to create a suggestion block so the author can accept the exact text change.
Jamie: That one-click acceptance is a nice accessibility win too. It reduces the amount of retyping and interpretation the author has to do.
Alex: At the end, submit a review verdict. Approve means the changes are ready to merge. Request changes means something must be fixed first. Comment means you have feedback, but you are not blocking the merge.
Jamie: When I am unsure, Comment is the safer choice. It lets me participate without pretending something is blocking.
Alex: That is a strong default for practice reviews. A complete review might say: Nice work. The structure is clear and the content is welcoming. I left one suggestion to improve clarity. If there is a real blocker, name it clearly, such as a missing required field, an insecure http link that should be https, or a heading level that breaks the document structure.
Jamie: So review comments can be praise, questions, suggestions, or required changes. The key is that each one points to something specific.
Alex: You can also do this from VS Code with the GitHub Pull Requests and Issues extension. Install it from the Extensions sidebar with Ctrl+Shift+X, or use the Command Palette with Ctrl+Shift+P and search for the extension. On Mac, use Cmd instead of Ctrl for those shortcuts.
Jamie: After installing, I sign in to GitHub, and then I should see a GitHub section in the Explorer or a Pull Requests view in the Activity Bar.
Alex: Right. From there, find an open PR, preferably one that is not yours, and open it. You can check out the PR branch locally for testing, open the changed files, and read the diff inside VS Code.
Jamie: The diff editor can be a lot through speech, though.
Alex: Use the Accessible Diff Viewer. Press F7 to move to the next change and Shift+F7 to move to the previous change. It reads each change as a structured block, which is usually much easier than arrowing through a visual side-by-side diff.
Jamie: And to comment, I put the cursor on the line, run GitHub Pull Requests: Add Comment from the Command Palette, write the comment, then add it. Ctrl+Enter can submit in some comment boxes.
Alex: When you are done, use Finish Review, the check icon at the top of the PR view. If checkout fails because you do not have permission, stay in read-only mode and open the PR on GitHub.com. The browser path still completes the challenge.
Jamie: What am I actually looking for when I review? I know I should be helpful, but helpful about what?
Alex: Start with whether the change does what the PR description says. Then check whether the commit message is meaningful, whether there are typos or formatting issues, whether a beginner would understand the content, and whether the language and Markdown are accessible. If the PR includes a template, notice whether the title, description, related issue, testing notes, and checklist are filled in well enough to guide the reviewer.
Jamie: How many comments is too many?
Alex: Enough to help, not enough to bury the author. If five comments all point to the same pattern, leave one example and say it happens in a few places. Also set expectations with words like nit, question, suggestion, or blocking, so the author knows how seriously to treat the comment.
Jamie: That also helps with tone. A nit about capitalization should not sound like a security emergency.
Alex: Exactly. Helpful feedback usually starts by acknowledging what is working, identifies the specific concern, explains why it matters, suggests a path forward when you can, and signals the weight of the concern. Talk about the code or the document, not the person. If you are uncertain, use tentative language like: I might be missing something, but...
Jamie: There is also a command line path here, right? Some people like staying in the terminal.
Alex: Yes. With GitHub CLI, gh pr list shows open pull requests, and gh pr diff followed by the PR number shows the changes. For a summary review, you can run gh pr review with the PR number, --comment, and a body message. GitHub CLI can also approve or request changes, and advanced reviewers can add more specific comments, but for this challenge the browser or VS Code path is usually clearer.
Jamie: What about Copilot during review? Is it fair to ask it what changed?
Alex: It can be useful as a reading aid. In VS Code, with a diff open, you can ask Copilot to summarize the change or explain a piece of code you do not understand. But do not outsource judgment. You still verify the diff, check the project norms, and decide what feedback is appropriate.
Alex: After you submit the review, the author sees your comments on the PR. They may reply, make commits, resolve threads, or re-request review after changes. A maintainer handles merging when the project is ready, usually after review and status checks pass.
Jamie: And if I am the author receiving feedback, I should say thanks, ask clarifying questions, explain my choices when needed, and surface blockers early.
Alex: That fits the bigger GitHub Flow pattern: create a branch, make a small focused change, open a pull request, discuss and review, pass checks, then merge. GitHub Flow keeps main deployable and makes the PR the place where the conversation lives. One branch should represent one task, and small PRs get reviewed faster.
Jamie: There are project norms around that conversation too.
Alex: Yes. Read the README, CONTRIBUTING file, Code of Conduct, security policy, and license when they exist. Good first issue labels are an invitation to start small, not a promise that maintainers have unlimited time. Clear commit messages, focused changes, and a PR description that says what changed, why, and how to test it make the review kinder for everyone.
Jamie: And if things get tense?
Alex: Slow down. Public, written, asynchronous communication can make tone hard to read. If you receive harsh feedback, look for the actionable part and ask for clarification. If you disagree, explain the tradeoff respectfully. If someone is rude, follow the project's Code of Conduct. If you caused offense, acknowledge it, apologize briefly, and repair the conversation.
Jamie: Let us talk about the stuck moments, because review interfaces have a lot of little controls.
Alex: If you cannot find the Files changed tab, open the PR first and then look for the tab links near Conversation and Commits. If you cannot leave an inline comment, focus on the line number in the diff and look for the blue plus button. If the suggestion icon is not available, leave the exact replacement text in your comment instead.
Jamie: And if there are no classmate PRs?
Alex: Ask a facilitator for a sample PR or use the peer-simulation PR and docs/code-review-sample.md. If the VS Code extension does not install cleanly, reload the window from the Command Palette. If sign-in fails, confirm you are signed in to GitHub in the browser, restart VS Code, and try again. If the PR list looks empty, switch the Pull Requests view to show all open PRs.
Jamie: Then I paste the review URL into the challenge issue, describe my inline comments, name my verdict, and close the issue when instructed.
Alex: Yes. If you are using the peer simulation, also read any review comments on your own PR, or reply with one thing you learned if you do not have real buddy access. Gandalf celebrates once your review is approved, and Challenge 13 unlocks after you confirm the review and close the issue. The win is not the number of comments. It is one specific, constructive review that helps another contributor move forward.
Day 2: Copilot and Agents
41. Episode 14: GitHub Copilot
Inline suggestions, Copilot Chat, prompting strategies, and custom instructions.
Based on: Chapter 16: GitHub Copilot
Read Transcript - Episode 14: GitHub Copilot
Transcript
Alex: Welcome back. GitHub Copilot is an AI coding assistant built into the places many of us already work, especially VS Code and GitHub.com.
Jamie: So it is not just autocomplete with a fancy name?
Alex: Right. Autocomplete is one part of it, but Copilot also answers questions, explains code, drafts documentation, suggests tests, helps with commit messages, and can make edits across files when you ask it to. It generates those suggestions from context: the file you are editing, nearby code, the repository workspace, your prompt, and sometimes instructions your project has provided.
Jamie: That context piece feels important. It means Copilot is not reading your mind. It is responding to what it can see and what you tell it.
Alex: Exactly. And in this course, we use it as a reviewed writing partner, not as an authority. Challenge 13, AI as Your Copilot, is where learners practice signing in, asking targeted questions, applying a small change, and reflecting on what Copilot helped with.
Jamie: Before anyone gets excited and opens every AI feature at once, what should be in place?
Alex: You should already be comfortable opening a repository in VS Code and using basic Git workflows from earlier lessons. Copilot access depends on your account, plan, student status, or organization policy. GitHub Copilot Free is available to individual developers with monthly limits, verified students may have student access, and organization or enterprise access can be managed by an administrator. Plans and billing can change, so if you are unsure, check your Copilot settings on GitHub or ask a facilitator before using workshop time.
Jamie: Let's say I have VS Code open with my Learning Room repository. How do I actually turn Copilot on?
Alex: Start with a current stable version of VS Code if you can. Recent VS Code builds include built-in AI features and surface Copilot and Chat directly, so you normally do not need to install a separate Copilot Chat extension. Open the Copilot item in the Status Bar if it appears, choose Use AI Features or Set up Copilot when prompted, and sign in with GitHub through the browser. If your access is tied to GitHub Enterprise, use the enterprise sign-in path and provide the enterprise URL.
Jamie: And how do I know it worked instead of just assuming the sign-in completed?
Alex: Open Copilot Chat with Ctrl+Alt+I, or use the Command Palette and run Chat: Open Chat if the shortcut does not work in your setup. Type something simple like 'Hello, are you working?' and press Enter. If Copilot responds, you have a basic activation check. You can also use the Copilot status item, Copilot settings, or Command Palette commands related to sign-in and status if you need to confirm your account state.
Jamie: What if the controls are missing, or the chat panel refuses to open?
Alex: Update VS Code, reload the window with Developer: Reload Window, and make sure you are signed into GitHub in both the browser and VS Code. If OAuth fails, close VS Code, confirm your GitHub account works in the browser, and try again. If the panel still does not open, use the Command Palette instead of the shortcut, and confirm AI features are enabled. If you see a subscription required message, that is an account access issue, not a Git mistake.
Jamie: The feature people notice first is the faint suggested text that appears while typing. What is happening there?
Alex: Those are inline suggestions, often called ghost text because they appear in the editor before they become real text. Copilot looks at what you are typing, the surrounding file, and nearby project context, then predicts a possible completion. It might offer a few words, one line, or several lines.
Jamie: How do you control it from the keyboard?
Alex: Press Tab to accept the visible suggestion. Press Escape to dismiss it. Press Alt+] to move to the next suggestion when more than one is available. You can also open the full suggestions panel with Ctrl+Enter, and in some setups accept a suggestion word by word with Ctrl+Right Arrow, or Cmd+Right Arrow on Mac, which is useful when you only trust the first part.
Jamie: Ghost text can be tricky with a screen reader. Sometimes I want help, and sometimes I just want the editor to stop talking.
Alex: That is real. NVDA, JAWS, and VoiceOver can interact with Copilot suggestions, but the experience varies by version, settings, and how much Copilot is offering. If a suggestion is long or hard to review, open Accessible View with Alt+F2, or Option+F2 on Mac, so you can read the content in a plain text buffer. If suggestions are too frequent, you can temporarily disable them for the current language, toggle Copilot completions from the Command Palette, or change the Copilot completion setting more permanently in VS Code settings.
Jamie: Can I steer inline suggestions without opening chat?
Alex: Yes. A common move is prompting through comments. You might write a comment such as 'Create a function that validates an email address and returns true or false,' then start the next line and let Copilot suggest code. For this workshop, the same idea works for documentation: write a short comment describing the paragraph, checklist, or settings example you want, then review the suggestion before keeping it.
Jamie: Chat feels less mysterious to me because I can ask a normal question. Is that the main difference?
Alex: Pretty much. Copilot Chat is conversational assistance inside VS Code. Open it with Ctrl+Alt+I or Chat: Open Chat, type in natural language, and ask about code, settings, errors, docs, or a change you are planning. If a shortcut conflicts with your operating system or assistive technology, the Command Palette fallback is the reliable path.
Jamie: I have seen people type things like @workspace and slash commands. Are those magic words?
Alex: They are ways to give Copilot more precise context. @workspace asks Copilot to use the files in your open workspace. @terminal focuses on terminal output, which helps when an error just appeared. @vscode is useful for questions about VS Code features and settings. Slash commands are shortcuts for common tasks: /explain, /fix, /tests, and /doc can ask Copilot to explain code, suggest a fix, generate tests, or draft documentation.
Jamie: And then there are modes and models, which can sound like a lot.
Alex: Keep the choice practical. Ask mode is best when you want an explanation or plan. Edit mode is for applying changes to selected files. Agent mode can take more initiative, including proposing commands, so it needs closer review. The model picker in Chat lets you switch among the models available to your account; names and availability can change, but a quick model is fine for small questions, while a stronger reasoning model may help with complex refactors or careful explanations.
Jamie: What should screen reader users expect in the chat panel itself?
Alex: The panel is a sidebar with conversation history, the response area, model and mode controls, and an input box near the bottom. Responses may stream in, which can be noisy or hard to follow. Use Accessible View with Alt+F2, or Option+F2 on Mac, to read the full answer after it arrives, especially if there is a code block. Built-in actions are also available through the Command Palette, which can be easier than hunting through visual controls.
Jamie: Challenge 13 uses Copilot in a pretty specific way, right? It is not asking learners to build a big app.
Alex: Correct. The pattern is sign in, prompt, apply, reflect. First, you sign in and confirm Copilot Chat responds. Then you clone the sci-fi themes repository, open it in VS Code, and ask Copilot to explain a setting named chat.agent.thinking.phrases.
Jamie: That is a very workshop-flavored setting.
Alex: It is. After Copilot explains it, you ask a follow-up: how to apply one of those themes to settings.json. Then you make the setting change yourself. The goal is not to let AI do hidden work; it is to ask a focused question, read the answer, and apply a small change you understand.
Jamie: And then learners create something new?
Alex: Yes. You ask Copilot to create a custom GitHub Copilot thinking phrases theme for a favorite universe, maybe Star Trek, Dune, Marvel, Studio Ghibli, or something else. Copilot should generate an array of themed phrases. You copy the generated content, open Preferences: Open User Settings (JSON), paste the configuration, save, reload the window, and test it by asking Copilot another question.
Jamie: What counts as completion?
Alex: You post a comment in your assigned Challenge 13 issue with a short checklist: whether Copilot is enabled and signed in, whether you asked it to explain a setting, whether you applied a setting, whether you created a custom theme, and what theme universe you chose. Then close the issue when you are done. There is no automation check here because Copilot setup is local to your account and machine.
Jamie: Chat answers are one thing. What about Copilot Edits, where it actually changes files?
Alex: Copilot Edits is for multi-file changes that you still review. You describe the change, choose or confirm the working set of files, and Copilot proposes edits. Then you inspect the diff before accepting anything. With a screen reader, move through the diff carefully, use VS Code's accessible diff support where it helps, and keep the working set small so the review stays manageable.
Jamie: Agent mode sounds more powerful, and honestly a little easier to misuse.
Alex: That is a fair read. Agent mode can plan work, edit files, and ask to run terminal commands. You approve terminal commands before they run, and you should read them like you would read any command someone handed you in a chat message. Ask mode is for advice, Edit mode is for controlled file changes, and Agent mode is for tasks where you are willing to supervise a more active assistant.
Jamie: Where does the VS Code Agents window fit in?
Alex: In VS Code 1.120 and newer, there is an Agents window you can open from the Command Palette with Chat: Open Agents Window. It can show available agents and related controls. For workshop learners, the safety advice is simple: do not approve commands you do not understand, do not hand an agent broad access just because it asks, and keep your changes reviewable. Accessibility is still improving there, so use keyboard navigation, Accessible View when available, and ask for help if focus gets confusing.
Jamie: And Next Edit Suggestions?
Alex: Next Edit Suggestions try to predict the next place you may want to edit after you make a change. You can turn them on in settings if they are available for your account and VS Code build. They can be helpful during repetitive edits, but they are still suggestions. Accept only what matches your intent.
Jamie: Copilot is also on GitHub.com. Is that the same experience as VS Code?
Alex: It overlaps, but the context is different. On GitHub.com, you can open Copilot Chat from the GitHub interface when it is available to your account. There, it is useful for asking about a specific repository, an issue, a file, a piece of code, or a general coding question while you are already browsing the site.
Jamie: That seems especially useful during pull requests.
Alex: Yes. Copilot can help draft pull request summaries, explain changed code, and assist with code review comments on GitHub.com. In VS Code, it is closer to your editor, terminal, and local files. On GitHub.com, it is closer to issues, pull requests, repository pages, and review workflows.
Jamie: And it is not only for code.
Alex: Not at all. In this course, Copilot is often most useful for non-code contribution work: drafting docs, tightening a commit message, summarizing a change for a pull request, turning notes into a checklist, or making an accessibility report clearer. The human still decides whether the result is accurate, kind, and useful.
Jamie: Prompting is where people can get vague fast. What makes a prompt better?
Alex: A weak prompt is something like 'fix this' with no context. A stronger prompt says what you are working on, what file or audience matters, what format you want, and what constraints to follow. For example: 'Rewrite this README section for first-time contributors. Keep it under 150 words, use plain language, and preserve the commands exactly.' That gives Copilot a job, boundaries, and a way to judge the answer.
Jamie: So the pattern is not one perfect prompt. It is a conversation.
Alex: Yes. Start specific, read the response, then iterate. You can ask for a contextual rewrite, generate text with constraints, review and improve a draft, run an accessibility-focused audit, or draft from an outline. Follow-up prompts are normal: 'make it shorter,' 'keep the tone warmer,' 'add a keyboard-only note,' or 'show me what changed.' VS Code's Timeline view can also help you inspect file history as you experiment.
Jamie: Where do prompt files come in?
Alex: Prompt files are reusable prompts stored in .github/prompts/*.prompt.md. They are useful when a team repeats the same kind of request, such as reviewing docs for accessibility language or drafting release notes. Instead of retyping a long prompt, you keep the prompt in the repo and reuse it.
Jamie: Custom instructions sound similar to prompt files. Are they the same thing?
Alex: They are related, but they work differently. A repo can include .github/copilot-instructions.md to tell Copilot how to behave for that project. Those instructions can cover accessibility standards, documentation style, commit message format, preferred tone, keyboard navigation expectations, and design system rules. You do not have to paste them into every chat; Copilot can apply them as background guidance where the feature supports them.
Jamie: What makes accessibility-focused instructions useful instead of just decorative?
Alex: Make them specific to the team and project. Say which standards matter, which components or design system rules to enforce, and what a good review should check. Lists and checklists help, especially for things like keyboard navigation or WCAG 1.3.1, Info and Relationships. Avoid vague instructions like 'make everything accessible' because Copilot cannot reliably turn that into a precise review.
Jamie: And custom agents?
Alex: Custom agents are more task-oriented. You might have an accessibility reviewer agent, a documentation editor agent, or a release-note helper agent. Instructions guide Copilot's general behavior, while agents automate specific workflows. You can use both together: the repo instructions set the standards, and the agent carries out a focused task under those standards.
Jamie: Here is the uncomfortable question. When should I trust Copilot, and when should I not?
Alex: Trust it most for low-risk drafts, explanations you can verify, and suggestions that match patterns already visible in the repository. Verify anything that changes behavior, affects accessibility, touches security, modifies commands, or claims to summarize policy. Reject output that you do not understand, that invents files or APIs, that removes important context, or that makes the experience worse for users.
Jamie: What are common failure modes?
Alex: Copilot can hallucinate, which means it can confidently state something false. It can produce outdated syntax, overlook project conventions, miss accessibility requirements, or generate text that sounds polished but says very little. It can also overfit to nearby code, repeating a bad pattern because that is what it sees.
Jamie: What does a good verification pass include?
Alex: Read the diff, run the relevant test or preview, confirm links and commands, check that the change matches the issue or goal, and make sure the language is accurate. For accessibility work, do not accept claims like 'this is accessible' without checking keyboard behavior, labels, headings, names, roles, states, focus order, and screen reader output when those things apply.
Jamie: And the accessibility limitations are not only about the code it writes. They are also about using the tool itself.
Alex: Yes. Streaming chat can be hard to follow, ghost text can be noisy, focus can move in surprising ways, and some newer surfaces, like advanced agent controls, may not feel as polished with every screen reader. Accessible View helps a lot for reading long responses and code blocks, but it does not remove the need to review carefully. Official accessibility guides and screen reader demonstrations are good companion references when your setup behaves differently from someone else's.
Jamie: If a learner only remembers one practical workflow from this episode, what should it be?
Alex: Use Copilot in small, reviewable loops. Ask a clear question, provide enough context, read the response in a way that works for you, apply only the part you understand, and verify the result. That is how Challenge 13 is designed: sign in, prompt, apply, reflect.
Jamie: And the learning cards in the chapter are there for quick review, not as a separate project.
Alex: Exactly. They reinforce inline suggestions, chat, edits, agent mode, Copilot on GitHub.com, prompting, Accessible View, and critical evaluation. By the end, you should be able to use Copilot to explain unfamiliar code, create a small configuration change, draft contribution text, and keep human judgment in charge.
Jamie: That last part is the anchor for me. AI can speed up a draft, but it cannot take responsibility for the contribution.
Alex: Well said. Copilot can be a useful partner, especially for documentation and exploration, but your review is what makes the work trustworthy.
42. Episode 40: GitHub Copilot - Complete Reference
All Copilot features, chat participants, slash commands, and MCP servers.
Based on: Appendix K: GitHub Copilot - Complete Reference
Read Transcript - Episode 40: GitHub Copilot - Complete Reference
Transcript
Alex: Welcome back. Episode 40 is our Copilot reference companion. It is not trying to teach one tiny workflow; it is the place you come back to when you need the shortcut, the command, the mode, the setting, or the safety check.
Jamie: So this is the desk reference version of Copilot. Less mystery, more, where is that control and what does it do?
Alex: Exactly. We are covering Copilot in VS Code, Copilot Chat, participants like @terminal and @github, variables like #file and #codebase, slash commands, agents, MCP servers, custom instructions, models, pricing, plugins, the CLI, and pull request help. The big theme is control: give Copilot the right context, choose the right mode, and review what it gives you before it lands in your work.
Jamie: Let's start with the thing people usually need first: keys. What are the Copilot shortcuts worth memorizing?
Alex: For inline suggestions, also called ghost text, Tab accepts the whole suggestion and Escape rejects it. Ctrl+Right Arrow on Windows or Linux, and Cmd+Right Arrow on macOS, accepts one word at a time. Alt+] and Alt+[ move through alternative suggestions on Windows or Linux, with Option+] and Option+[ on macOS.
Jamie: The word-by-word option feels important. If Copilot suggests a long line, I do not want to accept a whole sentence or function before I know what is in it.
Alex: Right. The full suggestion list opens with Ctrl+Enter on Windows or Linux, and Cmd+Enter on macOS. For accessibility, Alt+F2 opens Accessible View, Option+F2 on macOS, and Ctrl+/ or Cmd+/ inserts the suggestion from Accessible View at the cursor.
Jamie: And for Chat, the common pattern is open the Chat panel, send with Ctrl+Enter or Cmd+Enter, and clear the conversation with Ctrl+L or Cmd+L. Inline chat is Ctrl+I on Windows or Linux, Cmd+I on macOS.
Alex: Yes. The appendix also separates the official screen reader workflow: enable VS Code screen reader mode, consider accessibility signals, use Accessible Help when needed, and read Copilot responses in Accessible View instead of trying to follow live streaming text. For inline suggestions, open Accessible View, review the suggestion, then insert only when it is safe.
Alex: Copilot Chat gets much better when you tell it where to look. The @ participants scope the conversation to a source, while # variables attach specific context.
Jamie: Give me the plain version. If I type @terminal, what am I asking for?
Alex: You are asking Copilot to use the integrated terminal as context. @github can search GitHub data such as issues, pull requests, and code you can access. @vscode can help with VS Code features and settings in environments where that participant is available. @workspace searches the current workspace, but newer prompts should usually prefer #codebase because it works more broadly across modes.
Jamie: So @ is about the source, and # is about attaching something specific.
Alex: Exactly. #file lets you pick a file. #selection sends the text you selected. #terminalLastCommand attaches the last command and output. #githubRepo can point Copilot at a repository you can access, and #codebase searches the project for relevant snippets.
Jamie: Then slash commands are the quick actions. /explain for plain-language explanation, /fix for repair suggestions, /tests for tests, /doc for documentation, /new or /generate when your environment offers generation commands, /help to see what exists, and /clear when the thread has gotten noisy.
Alex: And two commands are especially useful for project setup. /init can analyze a workspace and create .github/copilot-instructions.md. /savePrompt can turn a useful chat exchange into a reusable .prompt.md file. The exact list can change by VS Code version, Copilot plan, extension, and workspace, so /help is always worth checking.
Jamie: Chat modes are where I see people get nervous. Ask, Edit, Agent, Plan... those names sound close until you know what can actually change files.
Alex: Ask is conversation only. It explains and suggests, but it does not directly edit files. Edit works on a chosen set of files and proposes diffs you approve or reject. Agent can inspect files, make changes, and run commands, so it needs more review. Plan writes a plan first, and no code should be written until you approve that plan.
Jamie: And since VS Code unified the Chat view, the mode selector lives down by the Chat input, right?
Alex: Yes. Tab through the bottom of the Chat view until you reach the mode selector, then press Space or Enter to open it. The model selector is a separate control near the same area, so do not confuse mode with model. Mode changes the kind of work Copilot is allowed to do; model changes the engine answering you.
Jamie: Where does the newer Agents window fit in?
Alex: In VS Code 1.120 and later, the Agents window gives a more agent-first workflow. You can open it from the Activity Bar or Command Palette by searching for Agents, then review available agents, their capabilities, and their task state. The safe pattern is to ask for a plan, review proposed changes, inspect diffs, and only then accept or run anything that affects your repository.
Jamie: That helps with accessibility too, because the task state and review points are easier to revisit than a fast-moving stream of text.
Alex: Exactly. Smart Actions are another entry point: they appear from editor context, quick fixes, menus, or the Command Palette, depending on the file and selection. They can explain, fix, generate, or document based on what you are focused on. The Browser Agent is different: it can interact with web pages for browsing and testing tasks, but it is experimental, so treat its results as something to verify, not as a final accessibility audit.
Jamie: And Plan Agent is the calmer option for complex work. It gives you a proposal before implementation. Copilot Spaces adds the team knowledge base angle, where shared context such as docs, decisions, and repository guidance can travel with the team instead of living in one person's memory.
Alex: MCP stands for Model Context Protocol. An MCP server is a tool provider Copilot can call when a task needs something outside ordinary chat, such as scanning a page, querying a service, or reading structured project information.
Jamie: So MCP is not another chatbot. It is more like a bridge from Copilot to tools.
Alex: Yes. The appendix catalogs many MCP tools, including accessibility scanning tools, browser-related tools, documentation helpers, and repository helpers. In VS Code, you configure the server, allow Copilot to use it in the right mode, and review tool calls before you trust the result.
Jamie: I like the review part there. An accessibility scanner can find real issues, but it can also miss things a human user would notice immediately.
Alex: Exactly. MCP tools can also run in CI/CD, which means continuous integration and deployment workflows. That is useful when you want scans or checks to run whenever code changes. Some MCP integrations require local dependencies such as Docker, and some require tokens or permissions, so the setup belongs in documentation, not in someone's private notes.
Jamie: And for workshop use, that means MCP can support accessibility testing, but it does not replace keyboard testing, screen reader testing, or a careful review of the user experience.
Alex: Custom instructions are how you teach Copilot the house rules of a project. The most common repository-level file is .github/copilot-instructions.md, and it is always-on for that workspace when supported.
Jamie: What goes in that file without turning it into a novel?
Alex: Short, concrete guidance. For an accessibility project, that might include WCAG expectations, semantic HTML preferences, documentation tone, commit message style, test requirements, and code quality rules. /init can generate a first draft, but you still need to edit it so it reflects the actual project.
Jamie: The appendix also mentions AGENTS.md and CLAUDE.md. Those are for broader tool compatibility, right?
Alex: Right. AGENTS.md is useful in multi-tool or monorepo settings where several coding agents need shared instructions. CLAUDE.md can support cross-tool compatibility where that ecosystem is used. For more targeted rules, .instructions.md files can include frontmatter and applyTo glob patterns, such as applying test conventions only to files matching a test path.
Jamie: So if a test file convention only matters under tests, you do not need to burden every prompt with it.
Alex: Yes. Instructions can exist at repository, user, and organization levels, and conflicts can happen. When Copilot seems to ignore an instruction, check whether the file is in a supported location, whether the setting that loads instruction files is enabled, whether the glob pattern matches, and whether a higher-level or later instruction is contradicting it.
Jamie: Troubleshooting sounds unglamorous, but it is probably where people save the most time.
Alex: Absolutely. The appendix calls out common issues: copilot-instructions.md not being followed, .instructions.md not loading automatically, a custom agent not appearing, a slash command not showing up, conflicting instruction files, and instruction file locations not working as expected. A practical check is to view loaded customizations in VS Code, confirm your Copilot and VS Code versions, and reopen the workspace after configuration changes.
Jamie: There is also a configuration scope reference, which I read as: know whether the setting belongs to this repository, to my personal VS Code setup, or to the organization.
Alex: Yes. Repository settings travel with the project and help the team. User settings follow you across workspaces through Settings Sync if you use it. Organization instructions are configured through GitHub plans that support them, and they can set expectations across many repositories.
Jamie: And the quick reference card is the fast path: open Copilot, read responses, accept or reject suggestions, and manage instruction files.
Alex: For screen reader workflows, the appendix repeats the reliable habits: enable screen reader mode, consider accessibility signals, learn the official shortcut table, use the suggestions panel when needed with Ctrl+Enter or Cmd+Enter, and read Chat responses in Accessible View. NVDA, JAWS, and VoiceOver users may use different navigation keys inside the readable pane, but the goal is the same: review the complete answer before acting on it.
Alex: The plugin ecosystem expands what Copilot can do. The awesome-copilot collection is a catalog of prompts, instructions, agents, and related integrations that can be browsed and installed.
Jamie: And that is different from Accessibility Agents, right?
Alex: Yes. Accessibility Agents is a living catalog focused on accessibility contribution workflows. awesome-copilot is a broader plugin ecosystem. In Chat, the /plugin command can help browse and install supported plugins, and the CLI flow can browse a marketplace, add the collection, install a specific plugin, and list what is installed.
Jamie: Some MCP server integrations need Docker, so a learner should not assume every plugin is one-click.
Alex: Correct. The appendix also moves into GitHub agentic workflows and third-party agents. These can take a task from GitHub, work on it in the cloud, and open a pull request or produce a result for review. The accessibility skill is not just assigning the task; it is reviewing the agent's pull request with the same care you would use for any contributor.
Jamie: The workflow files are Markdown with frontmatter, which means they have human-readable instructions plus structured properties at the top.
Alex: Yes. The security model emphasizes safe outputs, so workflows should produce reviewable artifacts instead of silently changing protected systems. The gh aw CLI extension can create a workflow, compile the Markdown workflow into a locked GitHub Actions file, and then you commit both the source .md and the .lock.yml that Actions actually runs. After that, you monitor the runs like any other automation.
Jamie: Models are the part where people ask, which one should I pick, and also, will this cost me credits?
Alex: A practical way to choose is by task. Use everyday models for normal coding and writing, faster models for simple repetitive work, deeper reasoning models for hard debugging or architecture, agent-oriented models for multi-step implementation, and visual models when images or screenshots are part of the work.
Jamie: And Auto model selection can choose for you, but it is not magic.
Alex: Right. Auto is convenient when you do not have a strong preference. Override it when you need speed, when you need deeper reasoning, when a model is not available on your plan, or when usage limits matter. Model availability, billing, and retirement notices change, so the appendix points learners to current Copilot plan and billing information rather than treating one snapshot as permanent.
Jamie: Switching models in VS Code happens from the model control near the Chat input, and in inline chat there may be a model picker in that inline session. Keyboard users can Tab to it and listen for the current model name.
Alex: The pricing reference separates plan features from usage. The free plan is useful for workshops, but it has limits and restrictions. Pro and higher plans raise or change access, and GitHub AI credits affect some premium or usage-based features, especially as billing rules evolve after June 1, 2026. If you are teaching or learning in a group, check your plan before relying on a high-usage agent workflow.
Alex: Copilot also exists in the GitHub CLI. With the GitHub CLI extension installed, gh copilot suggest can propose a command, and gh copilot explain can explain a command you already have.
Jamie: That is useful when the scary part is the terminal. You can ask for a command, but still read it before running it.
Alex: Exactly. For example, you might ask gh copilot suggest how to list recent branches, or use gh copilot explain on a command before you paste it into a workflow. Treat suggestions as drafts, especially when a command can delete files, rewrite history, change permissions, or publish something.
Jamie: And on GitHub pull requests, Copilot can help summarize changes and review code, but it is not a maintainer.
Alex: Right. PR summaries can help a reviewer understand what changed, and Copilot review comments can catch possible issues. Still, you check the diff, run tests, confirm accessibility behavior, and make sure the final contribution matches the repository's standards. In Challenge 16, a review-ready draft or a clear contribution plan can be valid evidence when the work is meaningful, whether the repository is Accessibility Agents, GLOW, or another appropriate project.
Jamie: So the reference is not asking us to memorize every command. It is giving us a way to choose the right Copilot surface, add the right context, slow down for review, and leave work that another person can understand.
43. Episode 41: Copilot Billing and Models
Usage-based billing, GitHub AI Credits, model volatility, and durable model-selection guidance.
Based on: Appendix K: Copilot Billing and Models
Read Transcript - Episode 41: Copilot Billing and Models
Transcript
Alex: Welcome back. Today we're taking the Copilot reference material and focusing on the part that can feel slippery: billing, GitHub AI Credits, and model choice.
Jamie: Slippery is the word. A learner opens Copilot, sees a model name, sees a plan limit somewhere else, and wonders, am I about to spend something?
Alex: Exactly. Appendix K is a broad reference for Copilot in VS Code and GitHub: shortcuts, chat, agents, plugins, instructions, accessibility workflows, and pricing. But model names, limits, and availability change often, so the safer skill is learning where to check and how to choose.
Jamie: So we are not trying to memorize a frozen chart. We are trying to make good decisions when the chart changes.
Alex: Let's ground this in the everyday Copilot surfaces first. Inline suggestions are the ghost text that appears in your editor, and the core keys are Tab to accept, Escape to reject, Ctrl+Right Arrow or Cmd+Right Arrow to accept one word, Alt+] or Option+] for the next suggestion, and Ctrl+Enter or Cmd+Enter for the full suggestion list.
Jamie: And for screen reader users, the big one is Accessible View, right?
Alex: Yes. When a suggestion or response appears, Alt+F2 on Windows or Linux, and Option+F2 on macOS, opens Accessible View. It gives you the content in a readable pane instead of making you chase streaming text, and Ctrl+/ or Cmd+/ can insert a suggestion from that view.
Jamie: What about chat itself?
Alex: In VS Code, Ctrl+Alt+I often opens the Chat panel, Ctrl+I or Cmd+I opens inline chat at the cursor, and Ctrl+Enter or Cmd+Enter sends a message. If a keymap differs, the Command Palette is your fallback; search for the Chat command by name.
Jamie: And context is where people get tripped up too. They ask a good question, but Copilot does not know what they meant.
Alex: Right. You can type @ participants to scope context, such as @github for GitHub data or @terminal for terminal output. You can also attach specific context with # variables: #selection for selected text, #file for a file picker, #codebase for a workspace search, #githubRepo for a repository you can access, and #terminalLastCommand for the last command and output. For new prompts, #codebase is usually the better choice than the older @workspace habit.
Jamie: Then slash commands and modes sit on top of that.
Alex: Yes. Slash commands like /explain, /fix, /tests, /doc, /new, /help, /clear, /init, and /savePrompt give Copilot a specific action. Modes change how much Copilot can do: Ask answers, Edit proposes diffs, Agent can work across files and tools, and Plan writes an implementation plan before code is changed. The model selector is separate from the mode selector, usually near the bottom of the Chat input area.
Jamie: So where does the model actually touch the workflow?
Alex: In Ask mode, the model affects the quality, speed, and style of the explanation. In Edit mode, it affects the proposed diff. In Agent mode, it affects planning, tool use, file edits, and terminal choices. In review workflows, it can affect how Copilot summarizes or critiques a pull request.
Jamie: That makes model choice feel bigger than just picking a smarter chatbot.
Alex: It is bigger. Appendix K also covers the wider ecosystem: the VS Code Agents window, Smart Actions, the experimental Browser Agent, Plan Agent, Copilot Spaces for team knowledge, MCP servers for tools such as accessibility scanning, and the awesome-copilot plugin ecosystem. There are also GitHub cloud agents and third-party agents that can be assigned work and produce pull requests.
Jamie: Which sounds powerful, but also like something you should review carefully.
Alex: Absolutely. Agent output should be reviewed through diffs, tests, accessible reading workflows, and small commits. Agentic workflows can be defined in Markdown with frontmatter, compiled into locked GitHub Actions workflow files, and monitored like other automation. The safe habit is to review the output, not just the promise.
Jamie: And organization policy can change what someone sees.
Alex: Yes. An organization or enterprise can allow or block models, agents, MCP tools, custom instructions, and related features. Two learners can open the same version of VS Code and still have different options because their account, plan, region, or organization policy is different.
Jamie: Now the money question. What are GitHub AI Credits?
Alex: Copilot has plan entitlements, and GitHub also uses usage-based billing through GitHub AI Credits for some AI activity. The May 2026 reference material points learners to current plan details, free plan limits, Pro comparisons, and usage-based billing information after June 1, 2026. Prices and allowances are not workshop facts to memorize forever.
Jamie: What kinds of Copilot activity might consume credits?
Alex: Check the current Copilot billing and usage pages for the exact answer on your account. In general, higher-cost experiences can include premium model requests and agentic or review workflows, depending on the plan and product surface. Chat, edits, agent mode, cloud coding agents, code review, Spaces, extensions, and premium models may be counted differently, while basic inline completions and plan-included usage may be covered until a plan limit is reached.
Jamie: So the honest answer is, do not assume every Copilot feature is billed the same way.
Alex: Exactly. Free plan users may have monthly caps and feature restrictions. In a workshop, use core prompts, smaller requests, and lighter models when possible; avoid long agent loops unless they are necessary; and keep evidence of what you did. Recommend an upgrade only when the work actually needs more capacity or a feature that the learner does not have.
Jamie: If I want to check my current access, where do I go?
Alex: On GitHub.com, open your account settings, find Copilot, and review your plan, usage, enabled features, and available models. If your Copilot access comes through a workplace or school, also check organization or enterprise settings if you have permission, or ask an admin what policies are applied. Your personal settings might not tell the whole story.
Jamie: And in VS Code?
Alex: Open Copilot Chat, then move through the controls near the bottom of the Chat view. The mode selector and model selector are separate controls; press Space or Enter to open a dropdown. In inline chat, some versions also expose a model control for that session, and if the interface changes, the Command Palette is still a good way to search for Copilot and Chat commands.
Jamie: Any accessibility checks while doing that?
Alex: Enable VS Code screen reader mode if it is not already enabled, and consider accessibility signals if they help you track events. Use Accessible View for chat responses, inline suggestions, and code blocks. When comparing inline suggestions, the suggestions panel with Ctrl+Enter or Cmd+Enter and word-by-word acceptance can make review less rushed.
Jamie: How should someone choose a model without memorizing model names?
Alex: Choose by task. For everyday coding and writing, a balanced default or Auto selection is usually fine. For simple repetitive tasks, a faster model can be enough. For deep reasoning, debugging, or tricky architecture, choose a reasoning-oriented model if you have access.
Jamie: And agentic work?
Alex: For agentic software development, use a model that is good with tools, planning, and multi-step changes. For visuals, choose a model that supports image input or visual understanding. The labels may change, but the question stays the same: what does this task require?
Jamie: Where does Auto model selection fit?
Alex: Auto lets Copilot choose a model for the request. It is helpful when you are not sure what fits, but you may want to override it when cost, latency, organization policy, reproducibility, or a specific capability matters. If you are documenting a result, say whether you used Auto or a named model.
Jamie: And models retire too.
Alex: They do. New models appear, old models retire, limits change, and availability can differ by plan, region, organization policy, and product surface. That is why a model list from a lesson is a snapshot, not a guarantee.
Jamie: If I write documentation about Copilot models or billing, how do I keep it from going stale immediately?
Alex: Include the date you checked, link to official Copilot documentation, billing pages, changelog posts, or VS Code release notes, and say where you observed the behavior. For example, mention whether you checked GitHub settings, the VS Code model picker, an organization policy page, or a billing dashboard. That gives the next reader a trail to verify.
Jamie: The source material uses dated language like facts verified in May 2026.
Alex: That is a useful pattern. Write something like, "Verified May 2026," then quote only what the source actually says. If a learner or maintainer reads it later, they know whether to refresh the claim before relying on it.
Jamie: Models are one part of Copilot behavior, but instructions are another. How do those fit in?
Alex: Custom instructions tell Copilot how to behave in a repository or workspace. A .github/copilot-instructions.md file can set repo-level guidance, AGENTS.md can help in multi-tool or monorepo contexts, CLAUDE.md may support cross-tool compatibility where available, and .instructions.md files can use frontmatter and applyTo patterns for scoped rules. Organization-level instructions can also apply for GitHub Teams or Enterprise setups.
Jamie: What about old settings-based instructions?
Alex: The reference steers learners toward files instead of older settings-based task instructions. If Copilot ignores guidance, check whether the file is in a supported location, whether the glob pattern matches, whether another instruction conflicts with it, and whether organization instructions are overriding something. Diagnostics can also help you view loaded customizations and troubleshoot missing agents or slash commands.
Jamie: So model choice is not the only lever.
Alex: Right. Context variables, custom instructions, chat mode, plugins, MCP tools, Smart Actions, Spaces, organization policy, and account plan can all change the result. When Copilot surprises you, do not blame the model first; check the whole setup.
Jamie: How does this connect back to the course challenges?
Alex: Challenge 15 is browse-first in the Accessibility Agents living catalog. Learners are not required to fork that repository to complete the challenge. Completing Challenge 15 unlocks Challenge 16, titled Capstone Project, plus Bonus Challenges A through E as a structured path.
Jamie: And the capstone is not limited to one repository.
Alex: Correct. Challenge 16 can accept contributions to Accessibility Agents, GLOW, or another meaningful repository. A review-ready draft or a clear contribution plan can be valid evidence, especially when billing limits, organization policy, or model access affects what a learner can complete.
Jamie: Where do the Day 1 contributions happen?
Alex: In each learner's Learning Room repository. That is where the issue, branch, commit, pull request, and merge workflow happens. For Copilot-related evidence, name the workflow you used, the model or Auto setting if relevant, the date, and any limits or policy restrictions you encountered.
Jamie: So the takeaway is not, memorize which model is best this month.
Alex: Right. Check your access, choose a model by task, watch usage, review agent output carefully, and document any model or billing claim with a date and an official source. And when you are listening with a screen reader, keep Accessible View close; it turns Copilot from a stream of motion into text you can actually inspect.
44. Challenge 13: AI as Your Copilot
Using Copilot as a reviewed writing partner while keeping human judgment in charge.
Practice focus: Day 2 local workflow
Read Transcript - Challenge 13: AI as Your Copilot
Transcript
Alex: Welcome back. Challenge 13 is called AI as Your Copilot, and the main idea is simple: use GitHub Copilot to improve documentation, then decide whether the suggestion deserves to stay.
Jamie: I like that wording, because it does not say, let the AI take over. It says, use it, inspect it, and keep your own judgment in charge.
Alex: Exactly. Copilot can be a writing partner, a code explainer, a command helper, and sometimes a creative spark. But it can also be confidently wrong, too wordy, or unaware of the workshop context.
Jamie: So the win is not just getting a nicer paragraph. The win is being able to say what you asked, what Copilot offered, and why you accepted, changed, or rejected it.
Alex: Yes. In this challenge, that evaluation is part of the work. You are practicing AI-assisted contribution without handing away responsibility for the final change.
Jamie: Before someone starts, what needs to be working in VS Code?
Alex: You need VS Code open with your Learning Room repository available locally. Current VS Code builds include built-in AI features, so you usually do not need a separate Copilot Chat extension, but your GitHub account still needs Copilot access.
Jamie: And access can vary, right? Some people have Copilot Free, some have student access, and some are in an organization where an admin controls it.
Alex: Right. Copilot Free is available to individual developers with monthly limits, verified students may have the GitHub Copilot Student plan, and enterprise or organization access depends on policy. If you are unsure, check your Copilot settings on GitHub, review the Copilot plans page, or ask a facilitator before burning time troubleshooting.
Jamie: There is also billing language in the chapter. Do learners need to panic about that?
Alex: No panic. The workshop keeps prompts short and focused on documentation tasks. The important practical note is that GitHub Copilot is moving to usage-based billing on June 1, 2026, and features like chat, CLI, cloud agent, Spaces, Spark, and third-party coding agents use GitHub AI Credits, while code completions and next edit suggestions are not billed in AI Credits for paid plans.
Jamie: So if Copilot is missing, first update VS Code, then look for the Copilot status item, or use the Command Palette.
Alex: Yes. Open the Command Palette with Ctrl+Shift+P, or Cmd+Shift+P on Mac. You can run commands like Chat: Open Chat, Inline Chat: Start in Editor, or Chat: Open Agents Window if a shortcut does not work with your keyboard layout or assistive technology setup.
Alex: The assigned Challenge 13 issue starts in the same file from the code review challenge: docs/code-review-sample.md. Open it from the Code tab if you need to orient yourself, then open that same file locally in VS Code.
Jamie: So we are not asking Copilot to invent a whole new project. We are asking it to improve a real workshop document that already exists.
Alex: Exactly. Select a paragraph or section that could be clearer, or choose an issue you noticed during Challenge 12. Then start Copilot from the Copilot icon, the shortcut your setup supports, or the Command Palette.
Jamie: The prompt can be plain, right? Something like, improve the clarity of this paragraph for beginners.
Alex: That is a good starting point. You might also ask, suggest a better heading for this section, or rewrite this paragraph for someone new to pull requests. The key is to keep the request focused enough that you can evaluate the result.
Jamie: And once it suggests something, the options are accept, modify, or reject.
Alex: Yes. Accept means the suggestion is accurate, clearer, in the right tone, and accessible. Modify means Copilot helped, but you need to tighten it, remove extra claims, or make it fit the document. Reject means the original is better, or the AI introduced a problem.
Jamie: What makes a prompt good for documentation work?
Alex: A good prompt gives context, states the audience, names the task, and adds constraints. For example, instead of saying, make this better, say, rewrite this README paragraph for beginning GitHub contributors, keep the tone welcoming, avoid jargon, and do not add new facts.
Jamie: That last part matters. If Copilot adds new facts, now you have to verify them.
Alex: Exactly. Chapter 16 gives several useful patterns: contextual rewrite, generate with constraints, review and improve, accessibility audit, and draft from an outline. All of them work best when you tell Copilot what material to use and what not to invent.
Jamie: Can learners use inline suggestions too, or should they only use chat?
Alex: They can use both. Inline suggestions are the ghost text that appears while you type in the editor. You can accept a suggestion, open the full suggestions panel with Ctrl+Enter, or accept part of it word by word with Ctrl+Right Arrow, and on Mac that is usually Cmd+Right Arrow.
Jamie: Ghost text can be noisy with a screen reader, though.
Alex: It can. NVDA, JAWS, and VoiceOver users may want to adjust announcement settings, use Accessible View, or temporarily disable inline suggestions if they are interrupting concentration. You can disable them for the current language, turn them off through the Copilot status item or Command Palette, or change the setting more permanently in VS Code settings.
Jamie: Chat feels easier to review because the answer is in one place. How do you recommend opening it?
Alex: The current default shortcut in VS Code is Ctrl+Alt+I for the Chat view, but shortcuts can vary. The reliable fallback is the Command Palette command Chat: Open Chat. Once it opens, the panel is usually a sidebar with controls near the top, the conversation history, the response area, and the input box.
Jamie: And chat has modes now, not just one text box.
Alex: Right. Ask mode is best when you want an explanation or advice. Edit mode is better when you want Copilot to propose changes. Agent mode lets Copilot take more initiative, including planning work and requesting terminal commands, so it needs closer supervision.
Jamie: What about models? The chapter mentions choosing a model and auto selection.
Alex: For this workshop, do not get stuck comparing models. Use the default or auto selection unless a facilitator tells you otherwise. The bigger skill is asking a focused question and reading the result carefully.
Jamie: And if the response streams by too fast?
Alex: Use Accessible View. In VS Code, Alt+F2, or Option+F2 on Mac, opens the response in a plain text buffer that is easier to read, search, and copy from. That is useful for chat answers, inline suggestions, and code blocks, especially when the response is long.
Jamie: Chapter 16 also talks about Copilot Edits, Agent mode, the Agents window, and Next Edit Suggestions. How much of that is required for this challenge?
Alex: The assigned challenge can be completed with a focused documentation edit, so you do not need the advanced features. But it helps to know what they are, because they may appear in your VS Code interface.
Jamie: So Copilot Edits is for bigger changes?
Alex: Yes. Copilot Edits can propose changes across one or more files. If you use it, pay attention to the working set, then review the diff file by file so you know exactly what changed before you accept anything.
Jamie: And Agent mode is the one where Copilot may try to drive the work.
Alex: Correct. Agent mode can plan steps and ask permission to run terminal commands. Never approve a command just because it sounds official. Read it, ask what it does if needed, and reject anything that modifies files, installs packages, or contacts services in a way you do not understand.
Jamie: What is the VS Code Agents window for?
Alex: In newer VS Code builds, the Agents window can show available agents and related chat experiences. The safety advice is the same: keep the task small, inspect proposed changes, and do not share secrets, tokens, private keys, or personal data in prompts.
Jamie: And Next Edit Suggestions?
Alex: Those suggest likely follow-up edits after you make a change. They can be convenient for repeated documentation cleanup, but still treat each suggestion as a draft, not a decision.
Jamie: What if someone wants to use Copilot outside VS Code?
Alex: On GitHub.com, Copilot Chat can answer questions about a repository, an issue, code, or general programming topics, depending on your access. In the browser editor, you may also see a Copilot or Copilot actions button when editing a file. If you do not see it, use the VS Code method instead.
Jamie: There are also pull request features, right?
Alex: Yes. Copilot can help draft pull request summaries and may offer code review assistance on GitHub.com. Those are helpful starting points, but you still need to read the PR, confirm the summary is true, and make sure comments are fair and specific.
Jamie: And the command line option is GitHub CLI with Copilot?
Alex: Right. If the gh-copilot extension is installed, you can ask for command suggestions, like how to create an issue with multiple labels, or ask it to explain a command such as git merge --squash. Treat suggested commands with extra care, because command-line mistakes can change files or repository history.
Jamie: The chapter also compares custom instructions and custom agents. Those sound similar, but they are not the same thing.
Alex: Custom instructions are standing guidance that Copilot should follow, such as documentation style, accessibility standards, commit message format, tone, keyboard navigation expectations, WCAG 1.3.1 checks for info and relationships, and design system rules. They can live in places like .github/copilot-instructions.md, depending on the feature and support level.
Jamie: So instructions guide every response, while agents handle a more specific workflow.
Alex: Exactly. A custom agent can be built for a particular kind of task, while instructions provide the baseline behavior. Good instructions are concrete and team-specific; weak instructions are vague, generic, or so broad that Copilot cannot tell what to do.
Alex: Now comes the most important habit: evaluate every suggestion before it enters your repository.
Jamie: The challenge gives five questions. Is it factually correct? Is it clearer? Does it keep the tone? Is it accessible? Did the AI add content I did not ask for?
Alex: Yes. If a suggestion is factually wrong, reject it. If it is not clearer, keep the original. If the tone is off, modify or reject. If it introduces an accessibility issue, fix it or reject it.
Jamie: The common mistakes are very real: fake links, fancy language, lost context, and accessibility regressions.
Alex: Exactly. A fake link can look convincing but lead nowhere. Over-complicated language can turn a beginner-friendly paragraph into a wall of buzzwords. Lost context might make the answer drift into unrelated Python or machine learning content. Accessibility regressions include images without alt text, complex tables where a list would be clearer, or color used as the only way to communicate meaning.
Jamie: Can you give an example of a good Copilot interaction?
Alex: Sure. Suppose you ask Copilot to review alt text in docs/welcome.md for screen reader users. It notices an image with alt text that only says screenshot and suggests something more descriptive, like Learning Room repository Code tab showing the file list with README.md, docs folder, and .github folder.
Jamie: That is better because it says what the image communicates, not just that an image exists.
Alex: Right, but you still evaluate it. Maybe Copilot's version is too long, so you shorten it. Maybe the image is decorative, in which case empty alt text could be more appropriate. You check the purpose of the image, then decide.
Jamie: And when facts are involved, use current references, not Copilot's confidence.
Alex: Yes. Use official Copilot documentation, VS Code Copilot documentation, GitHub Accessibility guides, Copilot plan and billing pages, the custom instructions support reference, custom agent documentation, model selection documentation, and the Copilot changelog when you need current details.
Jamie: Once the documentation edit is ready, what does the repository need to show?
Alex: Save the final version of docs/code-review-sample.md, then stage, commit, and push it on a non-default branch. A typical commit message is docs: improve code-review-sample clarity with Copilot assistance.
Jamie: And the autograder is not judging whether the AI wrote the perfect paragraph.
Alex: Correct. The automated check verifies that a commit exists on a non-default branch. The human learning evidence is in your Challenge 13 issue, where you describe what you asked Copilot, what it suggested, how you evaluated it, one thing it got right, and one thing it got wrong or needed help with.
Jamie: There is also a peer simulation check. Compare the Copilot result with the peer-simulation PR, or with a real buddy if one is available, and ask whether the document actually improved.
Alex: Yes. And if your cohort asks you to bring in the workshop review bot, mention @gandalf-bot in a commit message or PR comment so the change can be audited. Follow your assigned issue first, then any facilitator-specific directions.
Jamie: What are the common stuck points?
Alex: If Copilot is not available, confirm access and sign-in, and ask a facilitator about alternatives. If controls are missing, update VS Code, reload the window, and use the Command Palette. If chat responses are hard to hear, use Accessible View. If every suggestion seems good, make the task harder, such as asking for a rewrite for a screen reader user, then inspect whether the answer really helps.
Jamie: So Challenge 13 is a documentation contribution, a Copilot practice round, and a judgment exercise all at once.
Alex: Exactly. Use Copilot to help you write or review. Keep the parts that are accurate, clear, accessible, and useful. Change or reject the rest, and leave a clear record of how you decided.
45. Episode 16: Issue Templates
Creating YAML-based issue templates for bug reports, features, and custom forms.
Based on: Chapter 17: Issue Templates
Read Transcript - Episode 16: Issue Templates
Transcript
Alex: Welcome back. Today we're working with issue templates, one of GitHub's best tools for turning a messy intake process into something calm and useful.
Jamie: I love that framing, because a blank issue box can feel like being asked, please describe everything important, with no clue what important means.
Alex: Exactly. An issue template gives contributors prompts before they submit. It can ask for steps to reproduce, expected behavior, actual behavior, environment details, assistive technology setup, or anything else maintainers need.
Jamie: So the template is not just making the issue look tidy. It's helping the contributor include the information that lets someone act on it.
Alex: Yes. And for accessibility projects, that matters a lot. If a report says, button broken, the maintainer has to ask follow-up questions. If the report says which page, which screen reader, what happened, what should have happened, and how to reproduce it, the conversation starts much farther along.
Jamie: Before somebody builds one of these, what should they already have in place?
Alex: You should already know the basics of GitHub issues: opening them, reading them, and moving through the page. You also need a repository where you have write access, such as a personal practice repo or another repo you control. And you want an editor that understands YAML files, because color highlighting helps you catch mistakes.
Jamie: YAML is the format with indentation rules, right? Friendly when it's right, fussy when it's not.
Alex: That is a fair summary. VS Code is a good choice, but github.dev or the GitHub web editor can work too. Copilot can help generate variations, and notification knowledge is useful, but neither one blocks you from doing this chapter.
Jamie: There's also a nice built-in example here. Learners already filled out the workshop registration form earlier.
Alex: Right, and Challenge 14, Template Remix, uses that real registration template as the model. The work pattern is to analyze it, remix it for a new purpose, optionally create a Markdown version, and optionally test it in the template chooser. Plan for about two to two and a half hours if you're doing the exercises and dealing with YAML troubleshooting.
Jamie: And Challenge 14 is design-focused, not an autograded code puzzle.
Alex: Yes. Your evidence is usually a comment on your assigned Challenge 14 issue or a pull request that shows the template you analyzed, remixed, or created. A good completion comment can say whether you analyzed the registration template, what context you remixed it for, whether the YAML validates, where you committed it, and whether you tested the chooser.
Alex: On GitHub, issue templates live in a specific place: the .github/ISSUE_TEMPLATE/ directory inside the repository.
Jamie: So if GitHub doesn't find the file there, the template won't show up where users expect it.
Alex: Correct. A Markdown issue template usually ends in .md. A YAML issue form usually ends in .yml. GitHub reads the files in that folder and uses them to build the template chooser page when someone activates New issue.
Jamie: That's the page where you see choices like bug report, feature request, documentation issue, or whatever the project has configured.
Alex: Yes. The chooser can also be shaped by a config.yml file in that same ISSUE_TEMPLATE folder. That file can add helpful external links, such as a support forum or security reporting page, and it can control whether people can open a blank issue without choosing a template.
Jamie: So the project can guide people toward the right path without blocking every unusual case.
Alex: Exactly. A mature project often offers a few well-named templates, useful descriptions, and maybe a blank issue option if maintainers still want open-ended reports.
Alex: Let's read one like a maintainer. At the top of a YAML form template, you'll usually see keys such as name, description, title, labels, and sometimes assignees.
Jamie: What does each one do in practice?
Alex: The name is what appears as the template choice. The description is the helper text in the chooser. The title can pre-fill the issue title with a prefix like bug report or event request. Labels are added automatically, and assignees can route the issue to a person or team if the project uses that workflow.
Jamie: Then the body is where the actual form fields live.
Alex: Right. In the workshop registration template, you can see several field types. A markdown field displays instructions only. An input field collects one line of text, a dropdown offers a list of choices, and a textarea gives someone room for a longer answer.
Jamie: And each field has its own little set of details.
Alex: Yes. The id is the internal name for the field. The label is what the user hears or sees as the field name. The description explains what to enter, the placeholder gives an example, and validations can mark a field as required.
Jamie: The chapter asks learners to search the file for accessible, too. Not as a word game, but to notice that the form description promises the fields work with screen readers.
Alex: That's professional template design. The template doesn't just collect data. It sets expectations, reduces confusion, and makes the contribution process more predictable than a single empty text area.
Jamie: Once you've read the registration template, the remix challenge feels less intimidating. You're not inventing the whole structure from nothing.
Alex: Exactly. For Challenge 14.2, you copy the registration template into a new file, often something like .github/ISSUE_TEMPLATE/my-template.yml, in a repository where you can commit changes. You keep the basic skeleton: name, description, title, labels, and body. You also keep the field pattern: type, id, attributes, and validations.
Jamie: But you change the meaning of the form.
Alex: Yes. You might turn it into a bug report, event attendance form, product research intake, or accessibility audit request. Change the labels, descriptions, placeholder text, dropdown options, and title prefix so they fit that new purpose.
Jamie: And then decide what truly needs to be required. It is tempting to require everything, but that can make forms exhausting.
Alex: Exactly. Required fields should be the information maintainers need before they can take action. After that, validate the YAML, fix indentation or syntax problems, commit the file, and push it to your repository.
Jamie: The optional Markdown template is different enough that it's worth trying once.
Alex: It is. A Markdown issue template starts with front matter between three hyphens. It uses name, about, title, and labels, and that about key is different from YAML forms, which use description. Below that, you write headings like Problem, Context, and Solution Ideas, often with HTML comments that guide the user without appearing in the final issue after they replace them.
Alex: Testing is where the template becomes real. Open your test repository on GitHub.com, go to Issues, activate New issue, and check whether your template appears in the chooser.
Jamie: If it doesn't appear, the first suspects are location, filename, and YAML syntax.
Alex: Exactly. The file needs to be under .github/ISSUE_TEMPLATE/, it needs the right extension, and the YAML needs to parse. When it does appear, activate Get started on your template and move through the fields.
Jamie: This is a good time to test with a screen reader, not just visually glance at the page.
Alex: Yes. Listen for field labels, descriptions, required indicators, dropdown choices, and checkbox text. Then preview the issue before submitting, because preview shows what maintainers will receive.
Jamie: And the reflection matters. Ask whether the form helped you know what to write, whether anything was confusing, and whether the required fields were reasonable.
Alex: That's the kind of evidence maintainers can use. The best template is not the longest one. It's the one that asks clear questions in the right order.
Jamie: Let's compare the two formats more directly. When would you use a Markdown template instead of a YAML form?
Alex: Use Markdown when the issue can be guided by a few headings and comments, and when you want the contributor to write in a flexible document. It's simple, portable, and easy to edit. It works well for lightweight reports or projects that do not need strict field validation.
Jamie: And YAML forms are better when you need structure.
Alex: Right. YAML forms let you define specific field types. A markdown field gives instructions. An input field is a single line, like a version number or URL. A textarea is for longer answers. A dropdown gives a controlled set of options. Checkboxes are useful for confirmations, checklists, or multiple selections.
Jamie: That's also where required fields come in.
Alex: Yes. In YAML forms, validations can make a field required. That helps prevent incomplete reports, but it should be used carefully. A form with clear labels, short descriptions, useful placeholders, and sensible required fields is much easier to complete.
Jamie: Especially when labels are specific. A field called details is vague. A field called steps to reproduce tells me exactly what belongs there.
Alex: Exactly. The field type should match the answer you want. Don't use a dropdown for something with hundreds of possible answers, and don't use a giant textarea when a short version number would do.
Alex: An accessibility bug report template usually asks for a few core pieces of information: the affected component, the assistive technology setup, expected behavior, actual behavior, steps to reproduce, and any known WCAG success criterion.
Jamie: WCAG is the Web Content Accessibility Guidelines, right? The standards people often use to describe accessibility requirements.
Alex: Right. The template can make that field optional, because not every contributor will know the criterion. It can also include Additional context and a Before submitting checkbox group, where someone confirms they searched existing issues or included reproduction details.
Jamie: I like the assistive technology setup field. Without it, two people can experience the same page very differently and not know why.
Alex: Exactly. A screen reader name, browser, operating system, zoom level, voice control tool, or keyboard-only setup can change the investigation. The goal is not to make contributors prove their report. It's to help maintainers reproduce the barrier respectfully and efficiently.
Jamie: The chapter also includes a second kind of template, a feature request form.
Alex: Yes. A feature request can ask what problem the feature solves, what solution is proposed, who benefits, what alternatives were considered, and whether there are accessibility considerations. That keeps feature discussions from becoming only, please add this, with no context.
Jamie: And custom templates can cover almost anything: audits, research interviews, event support, documentation updates, design reviews.
Alex: Exactly. Start by looking at the issue patterns your project already receives. Then decide the required fields, optional fields, placeholder examples, and help text. Test it yourself, and if you can, ask someone else to try it without coaching.
Jamie: Let's talk about the actual file workflow. Some people will do this in the browser, and some will do it in VS Code.
Alex: In the browser, you can create or edit a file directly in .github/ISSUE_TEMPLATE/, paste in the template, preview where possible, and commit the change. In VS Code, you usually clone or open the repository, create a branch, add the template file, validate it, commit, and push.
Jamie: File naming is one of those small details that saves headaches.
Alex: Yes. Use clear lowercase names with hyphens, like accessibility-bug-report.yml or feature-request.yml. Avoid spaces. And if you're using YAML, watch indentation, colons, quotation marks, and unique ids for fields.
Jamie: What are the common mistakes?
Alex: Tabs instead of spaces, a dropdown with options indented wrong, a colon in text that should have been quoted, or a required validation attached to the wrong level. If something fails, compare it with a working template, run it through a YAML validator, and check the chooser again.
Alex: Issue templates are not the only templates a project can use. Pull request templates guide contributors after they have made a change and are asking maintainers to review it.
Jamie: So an issue template helps describe the need, and a pull request template helps describe the proposed change.
Alex: Exactly. A strong PR template often asks for a description, the type of change, how to test it, accessibility considerations, and related issues. Those prompts help reviewers understand both the code change and the reasoning behind it.
Jamie: And they pair nicely. The issue says what problem exists. The PR says what was changed, how it was tested, and what accessibility impact was considered.
Alex: Yes. In the Accessibility Agents living catalog, and in other meaningful repositories, templates help maintainers keep contribution conversations clear as the project grows.
Jamie: The hands-on work gives learners several ways to practice without treating one path as the only correct one.
Alex: Exercise A is to use an existing template. Navigate to the Issues area of a project such as Accessibility Agents, open the template chooser, select a template, move through the fields, fill it in if appropriate, preview it, and reflect on how the template guided you.
Jamie: And if you're only exploring, be respectful. Don't create noise in a public project unless the workshop instructions ask you to submit something real.
Alex: Exactly. Exercise B is to add an accessibility bug report template to a repository you control. Open the repo in VS Code or the web editor, create the template file, copy or adapt the YAML, validate it, create a branch and commit, test it on GitHub, test with your screen reader, and merge your branch if that fits your workflow.
Jamie: Exercise C is about submitting upstream when the project is ready for that kind of contribution.
Alex: Right. Before opening a pull request, verify the template is useful, valid, and tested. In the PR, answer what the change does, why it is useful, how it was tested, and what issue it relates to if there is one. Then review your own PR, submit it, and respond to feedback.
Jamie: And Exercise D brings it home to your own project.
Alex: Choose a project, identify the issue patterns it gets or might get, design required and optional fields, write placeholders and help text, test locally, optionally deploy to GitHub and test with a friend, then reflect on what you would improve.
Jamie: If someone gets stuck, where should they look first?
Alex: Start with a known working template, like the workshop registration form, and compare structure. Check the folder path, file extension, indentation, and front matter. Then validate the YAML and try the chooser again.
Jamie: And if the form technically works but feels bad to fill out, that's a design problem, not a GitHub problem.
Alex: Exactly. Rewrite labels so they are specific, shorten descriptions, remove unnecessary required fields, and make placeholders realistic. Templates are about asking better questions before frustration builds.
Jamie: There's also the Day 2 amplifier with the Template Builder Agent later in the curriculum.
Alex: Yes. After you understand templates manually, Chapter 19 introduces @template-builder in VS Code to help automate template creation. The important part is that you still review the output: labels, required fields, help text, accessibility language, and whether the template actually helps maintainers.
Jamie: So Challenge 14 is not just, make a file exist. It's learning how to structure a contribution so another human can respond well.
Alex: Exactly. By the end, you should be able to read a professional template, remix it, create Markdown and YAML versions, test the chooser, and explain why the template improves issue quality and reduces back-and-forth.
46. Challenge 14: Template Remix
YAML issue forms, accessible labels, required fields, and useful maintainer intake.
Practice focus: Day 2 capstone
Read Transcript - Challenge 14: Template Remix
Transcript
Alex: Welcome back. Today we're working on Challenge 14: Template Remix, and the skill is designing an issue template that helps people give useful information from the start.
Jamie: So instead of opening a blank issue and hoping people know what to write, we give them a guided form.
Alex: Exactly. An issue template can ask for the location of a problem, the expected behavior, the actual behavior, the assistive technology involved, and anything else maintainers need to act.
Jamie: That sounds like accessibility work and project management meeting in the middle.
Alex: It is. Good templates reduce back-and-forth, make issues easier to triage, and help contributors feel less like they're guessing what the project wants.
Jamie: What should learners have ready before they start this one?
Alex: You should already know the basics of GitHub issues: opening them, reading them, and moving around the conversation. You also need a repository where you can write files, usually your class repository or another repo you control. VS Code is the supported Day 2 editor, and YAML highlighting will help a lot because `.yml` files care about spacing. If you joined Day 2 without Day 1, use the Day 2 Quick Start first to confirm your account, tools, and basic workflow are ready.
Jamie: And the familiar workshop registration form comes back here, right?
Alex: Yes. You already filled out that registration template, so now you inspect it as a working example. Copilot can help generate variations, but it's optional. Terminal comfort helps, but you can still use the browser editor or github.dev if that is the right path for you. Plan around two to two and a half hours if you're doing the exercises and fixing YAML mistakes along the way.
Alex: The challenge uses a practical pattern: analyze a real template, remix it for a new purpose, create your own file, and test that it behaves correctly.
Jamie: When you say analyze, where do I actually look?
Alex: Start with `.github/ISSUE_TEMPLATE/workshop-registration.yml`. Then compare it with the worked remix sample in `docs/samples/challenge-14-registration-remix-example.yml`. You're looking for what stayed the same and what changed when the template was adapted for a different purpose.
Jamie: The top of the YAML file is doing a lot of work, isn't it?
Alex: It is. `name` is what people hear or see in the template chooser. `description` is the short helper text below it. `title` pre-fills the issue title with a useful pattern, `labels` adds labels automatically, and `body` defines the actual form fields.
Jamie: And inside the body, each field has its own little set of details.
Alex: Right. The `id` is an internal identifier, the `label` is the field name shown to the person filling it out, the `description` explains what belongs there, and the `placeholder` gives an example. If you see `validations` with `required: true`, GitHub treats that field as required before the issue can be submitted.
Jamie: Okay, once I've studied the existing form, how do I create mine?
Alex: In the current Challenge 14 issue, the file name may be assigned for you. The seeded version asks you to work on your `fix/YOUR-USERNAME` branch and create `.github/ISSUE_TEMPLATE/YOUR-USERNAME-template.yml`. If your instructor or issue text gives a different exact file name, follow that instruction, but keep the file inside `.github/ISSUE_TEMPLATE/` and make sure it ends in `.yml`.
Jamie: That folder path matters because GitHub only looks in certain places for issue templates.
Alex: Yes. In the browser, you can use Add file, then Create new file, and type the full path, including `.github/ISSUE_TEMPLATE/`. Commit the file to a new branch, then open a pull request so the change can be reviewed.
Jamie: What about VS Code, since that's the main Day 2 tool?
Alex: Use the Explorer with Ctrl+Shift+E, or Cmd+Shift+E on Mac. Create `.github` at the root if it is not there, then create `ISSUE_TEMPLATE` inside it, then create your `.yml` file inside that folder. Use the Source Control view with Ctrl+Shift+G, or Cmd+Shift+G on Mac, to stage, commit, and push. Then use the GitHub Pull Requests extension to create the PR.
Jamie: And if someone is working from the command line?
Alex: They can run `mkdir -p .github/ISSUE_TEMPLATE`, then create the file with `touch .github/ISSUE_TEMPLATE/YOUR-USERNAME-template.yml`. Open the repo with `code .`, add the YAML content, then run `git add .`, `git commit -m Add custom issue template`, `git push`, and `gh pr create` if GitHub CLI is set up.
Alex: The minimum structure is small, but it needs to be correct: `name`, `description`, `title`, `labels`, and `body`.
Jamie: I noticed the challenge issue itself has `hidden: true`. Should learners put that in their own template?
Alex: Usually, no. That belongs to the challenge issue form that controls what learners see in the assignment. Your custom template should focus on the public form someone would choose when they click New Issue.
Jamie: Let's slow down on the body fields, because that's where YAML can get intimidating.
Alex: The body is a list of form elements. `markdown` displays instructions and is not an input field. `input` is a single-line answer, like a file name, URL, version, or short title. `textarea` is for longer writing, such as steps to reproduce or a detailed description. `dropdown` gives a fixed list of options, and `checkboxes` supports a checklist or multiple selections.
Jamie: Where does accessibility show up in the design, besides the topic of the form?
Alex: Use clear labels, because those labels are what people rely on when moving through the form. Put real guidance in descriptions, not just in placeholders, because placeholder text can disappear once someone starts typing. Mark a field required only when the maintainer truly needs it. And if a dropdown has choices, make the choices plain enough that a contributor does not have to decode your project slang.
Jamie: Can we walk through the reference example, the accessibility report one?
Alex: Sure. The example file is `.github/ISSUE_TEMPLATE/accessibility-report.yml`. Its name is Accessibility Report, its description says it is for reporting an accessibility barrier in workshop materials, its labels include accessibility and bug, and its title starts with `[A11y]:`.
Jamie: Then the body starts with instructions before asking for information.
Alex: Yes. A markdown block thanks the person and explains why the report matters. Then an input asks where the barrier happened, such as a file name, URL, or line reference. A textarea asks the person to describe the barrier and what they expected instead. Then dropdowns ask about assistive technology and severity.
Jamie: I like that severity question: how much does this affect your ability to participate?
Alex: That's practical intake. Blocked, difficult, and minor tell maintainers how urgent the issue is without making the reporter write a whole priority analysis. The assistive technology question is optional in that example, which is also important, because not every accessibility report depends on a specific tool.
Jamie: Do learners have to make an accessibility report template, or can the topic be different?
Alex: Any useful structured form works. You could make a bug report, feature request, workshop improvement form, session feedback form, help question template, event attendance form, product research form, or accessibility audit request. What matters is that the template guides a contributor better than a blank issue would.
Jamie: The chapter also compares YAML forms with Markdown templates. What's the difference?
Alex: A Markdown issue template is a `.md` file with frontmatter at the top between lines of three hyphens. It uses `name`, `about`, `title`, and `labels`, and then plain Markdown headings like Problem, Context, and Solution Ideas. For a bug report, those headings might be Describe the Bug, Steps to Reproduce, Expected Behavior, Actual Behavior, Environment, Additional Context, and Before Submitting.
Jamie: So Markdown is simpler, but YAML gives more control.
Alex: Right. Use Markdown when a flexible writing prompt is enough. Use YAML forms when you want required fields, dropdowns, checkboxes, clearer labels, and more consistent data. Challenge 14 focuses on YAML, but building a Markdown version is a useful comparison exercise if you want extra practice.
Alex: After the file exists, test the boring details before you celebrate.
Jamie: Because YAML is famous for failing over one tiny spacing problem.
Alex: Yes. Use two spaces, not tabs. Make sure every key has a colon. Keep list items lined up correctly, and quote text when punctuation might confuse the parser. A YAML linter can help you catch mistakes before GitHub does.
Jamie: What does the automated check expect for this challenge?
Alex: The challenge text says the autograder looks for a YAML file in `.github/ISSUE_TEMPLATE/` with a valid `name` field. Some instructions also mention `description`, so include both. In practice, a solid Challenge 14 template should have `name`, `description`, `title`, `labels`, and at least one useful field in `body`.
Jamie: And if the template does not show up in the template chooser?
Alex: Check that the file is in the exact folder, ends in `.yml`, and includes a valid `name`. Some repositories also use `config.yml` to manage the issue chooser, contact links, and whether blank issues are allowed. If you see an option to open a blank issue, that skips the guided form, so use it only when none of the templates fit. For extra practice, activate New Issue, choose your template, move through the fields, preview the issue, and confirm the labels and required fields behave as expected. If you use a screen reader, listen for whether each label and description is announced clearly.
Jamie: What evidence does the learner submit?
Alex: Open your assigned Challenge 14 issue and post the URL of your template file or pull request. Say what you remixed, what purpose your template serves, and which fields you included. You can also note whether YAML validates and whether you tested the template chooser. Then close the challenge issue when the instructions tell you to, because that is what moves you onward to Challenge 15.
Jamie: The chapter also talks about pull request templates. Are those part of the same idea?
Alex: Yes, just at a different point in the workflow. An issue template helps people describe work before it happens. A pull request template helps people explain a change after they have made it, with prompts like what this PR does, the type of change, how to test it, accessibility considerations, and related issues.
Jamie: So for this challenge PR, the description should not just say done.
Alex: Right. Use a clear title like Add custom issue template. In the description, explain the template's purpose, what fields you changed from the registration form, and how you checked the YAML. If someone reviews your PR, respond to the feedback, update the file, and keep the conversation in the PR.
Jamie: Where does Accessibility Agents fit into this without turning Challenge 14 into a different project?
Alex: Chapter 17 uses real issue and pull request templates from Accessibility Agents as examples you can read. The collection is a living catalog, so read the current files instead of memorizing any fixed number of items. For Challenge 14, you're learning to inspect a professional template and build your own; you are not required to fork that catalog to complete this challenge.
Jamie: And later there is a Template Builder Agent, but this challenge is still manual first.
Alex: Yes. The Template Builder Agent is a Day 2 amplifier in a later chapter. Do the manual version first so you can judge whether an automated draft has clear labels, useful descriptions, sensible required fields, and good options. When details change, check GitHub's official documentation about issue and pull request templates and configuring issue templates for the current rules.
Alex: The finish line is not a huge file. It's a working YAML issue form that makes a real contribution easier to explain.
Jamie: Analyze the registration template, remix it for a useful purpose, commit it in the right folder, open the PR, test what you can, and submit the link. That's a very practical Challenge 14.
47. Episode 17: Accessibility Agents
55 agents across 3 teams and 5 platforms, 54+ slash commands, custom agents, and agentic accessibility workflows.
Based on: Chapter 19: Accessibility Agents
Read Transcript - Episode 17: Accessibility Agents
Transcript
Alex: Welcome back. Today we're talking about Accessibility Agents, a living catalog of specialized AI assistants for accessibility and GitHub workflow tasks.
Jamie: So these are not just general chatbots with a friendly name. They are meant to help with specific work, like reviewing a pull request, checking a page for accessibility issues, or drafting a better issue template.
Alex: Exactly. They extend GitHub Copilot with domain knowledge. Instead of asking a broad assistant to help with everything, you call an agent that has instructions, responsibilities, and guardrails for one kind of task.
Jamie: And the catalog keeps growing, right? The current snapshot names 55 agents, but learners should treat that as a moment in time, not a ceiling.
Alex: Right. The important shape is three teams across five platforms. Accessibility agents cover web, document, and mobile auditing. GitHub Workflow agents help with issues, pull requests, analytics, and templates. Developer Tools agents support Python, desktop apps, CI checks, and custom tooling.
Jamie: That already sounds powerful, but also a little risky. If an agent sounds confident, I can imagine people accepting its answer too quickly.
Alex: Before using any agent, check the basics. You need Git, VS Code, a GitHub account, Copilot working in VS Code, and a repository that either already has a .github/agents folder or can receive custom agent files.
Jamie: And Copilot Free is enough for this workshop, as long as the built-in Copilot features are enabled and working.
Alex: Yes. Then comes the deeper prerequisite: manual skill. If you have not read issues by hand, an issue-tracking agent will not help you judge issue summaries. If you have not reviewed a diff, a pull request review agent can sound useful while missing something important.
Jamie: So the agent is a multiplier. It can speed up a skill I have practiced, but it should not replace learning the skill.
Alex: Exactly. If you want to use @template-builder, you should have designed and tested a template manually. If you want @web-accessibility-wizard or @contrast-master, you should understand the relevant WCAG checks and have tried manual testing. If you want a Python or wxPython agent, you should know enough code and keyboard testing to spot bad advice.
Jamie: I like the self-check: could I do this task manually right now? If the honest answer is no, pause and learn that workflow first.
Alex: That self-check is especially important for blind and low-vision contributors. The agent may summarize a screen, a diff, or a document, but you still need a way to confirm what changed, what evidence exists, and whether the result is accessible.
Jamie: Challenge 15 is where this becomes hands-on. It is a browse-first challenge, not a requirement to fork the Accessibility Agents repository.
Alex: Yes. You start by exploring the living catalog on GitHub.com and matching agents to work you already practiced on Day 1. The beginner-friendly starting set is @daily-briefing, @issue-tracker, and @pr-review because those connect to repository awareness, issues, and pull request review.
Jamie: Then learners post evidence in their assigned Challenge 15 issue, right? Something like, here are three agents, and here is the manual skill that makes me ready to try each one.
Alex: Exactly. Then you validate one agent. You run it carefully, read the output, compare it to what you expected, and write down whether it was accurate, incomplete, or questionable.
Jamie: And the third part is reading the agent itself. Not just using the magic box, but opening the instruction file and asking what it is actually allowed to do.
Alex: Yes. Look for its purpose, capabilities, domain knowledge, responsibilities, response guidelines, and limits. The optional extension path is contribution-oriented: improve an existing agent or propose a new one with a clear accessibility purpose.
Jamie: Completing Challenge 15 matters because it unlocks Challenge 16, the Capstone Project, plus Bonus Challenges A through E. Those bonuses are a structured path, not spare-time extras.
Alex: And do not skip the feedback task. The workshop asks for feedback because these agents, challenges, and examples are evolving with learner experience.
Alex: To run agents locally, you usually work in VS Code with Copilot Chat open. The common shortcut is Ctrl+Alt+I, but if that conflicts with your setup, use the Command Palette and run Chat: Open Chat.
Jamie: What does invoking an agent sound like in practice?
Alex: In Copilot Chat, you mention the agent by name and give it a small task. For example: @daily-briefing morning briefing. Or @issue-tracker find open issues labeled good-first-issue in accessibility-agents. Or @pr-review show open pull requests in accessibility-agents.
Jamie: Small task first. That feels easier to verify than asking for a giant report.
Alex: Exactly. Agents are discovered through files in your repository, commonly under .github/agents, and through related .github configuration. Some setups include a quick install command, with one version for macOS or Linux shells and another for Windows PowerShell.
Jamie: And if the repository carries the agent files, the behavior can travel with the repo. A teammate or contributor can open the project and get the same custom instructions.
Alex: Right. You can also personalize your instance with a preferences file: GitHub username, repositories you work on most, preferred output format, and notification priority. That helps agents produce output that fits your workflow instead of a generic response.
Jamie: On GitHub.com, there are browser-native Copilot features too: PR summaries, PR review help, Copilot in issues, GitHub Models as an AI playground, and release notes drafted from changes.
Alex: Yes, and VS Code 1.120 adds the Agents window as a Preview feature in Stable. It does not replace custom Accessibility Agents. It gives you one place to manage sessions, changed files, customizations, and validation tasks across projects.
Jamie: Let us zoom out to the ecosystem. You said three teams, and I want to understand how they relate.
Alex: Team 1 is Accessibility, with agents for web, document, and mobile work. That includes page audits, contrast checks, keyboard navigation, Word, Excel, PDF, ePub, and remediation support.
Jamie: So that team is closest to accessibility testing and repair.
Alex: Yes. Team 2 is GitHub Workflow. Those agents help with daily briefings, issue tracking, pull request review, analytics, accessibility change monitoring, and template building.
Jamie: And Team 3 is Developer Tools, which sounds like the bridge into code and automation.
Alex: Exactly. That team includes Python and desktop development support, CI accessibility checks, Playwright scanning, and custom tool workflows. Around the agents, there is a supporting ecosystem: slash commands, prompts, hooks in tools like Claude Code, configuration files, and examples for contributors.
Jamie: That is also where the roadmap matters. Learners are not only consumers here; they can help shape what gets built next.
Alex: Yes. A useful contribution might be a clearer instruction, a new workflow example, a bug report about a misleading response, or a new agent proposal for an uncovered accessibility workflow.
Alex: The five platforms give you choices. Most learners should start with GitHub Copilot in VS Code because it is already part of the workshop flow and works well with files, chat, and repository context.
Jamie: But the catalog is not limited to VS Code.
Alex: Right. Claude Code can be useful for faster command-line iteration and hook-based enforcement. Gemini CLI can be a free or low-cost command-line path for some accessibility checks. Claude Desktop can work well for long planning sessions. Codex CLI is another command-line option for agentic coding workflows.
Jamie: How should someone choose without getting overwhelmed?
Alex: Start from your strongest environment. If you use VS Code every day, use the VS Code path. If you prefer the command line, use a CLI path. If you want both, let VS Code handle editing and review while a command-line tool helps with repeatable checks.
Jamie: And accessibility of the platform matters. Screen reader behavior, zoom support, keyboard focus, and how chat output is exposed are all part of the choice.
Alex: Yes. Try the same small task on more than one platform only after you understand the task. Then compare whether the result is easier to navigate, easier to copy, and easier to verify.
Jamie: The slash commands are the part I can imagine using every day. They sound like shortcuts for common prompts.
Alex: That is the idea. The catalog includes 54+ slash commands organized by workflow. A slash command is a named prompt, like /my-issues or /review-pr, that gives the assistant a focused job without making you retype the whole instruction every time.
Jamie: Which ones should learners try first?
Alex: Start with /my-issues to find your work, /review-pr to structure a pull request review, /triage to sort issues, /daily-briefing to get a morning overview, and /a11y-update to summarize accessibility-relevant changes.
Jamie: And reading a command definition is part of the learning, not just running it.
Alex: Yes. Open the command file and look for what it asks the assistant to gather, how it should format the answer, and what behavior it promises. For /a11y-update, for example, you would expect it to focus on accessibility changes, risks, and follow-up actions rather than a generic project summary.
Alex: If a learner asks which agents are worth trying first, I would pick a small, high-impact set. @daily-briefing gives a morning view of issues opened in the last day, PRs awaiting review, CI failures, security alerts, and community activity.
Jamie: That is useful because it turns scattered repository activity into one checklist I can review at my own pace.
Alex: @issue-tracker is good for finding open issues, especially labels like good-first-issue, and it can help draft replies. @pr-review can summarize a pull request, identify risk areas, map changed files, suggest inline comments, and recommend whether minor changes are needed.
Jamie: What about accessibility-specific monitoring?
Alex: @insiders-a11y-tracker watches recent changes for accessibility signals. It might flag a heading hierarchy skip, non-descriptive link text, or a positive change like an ARIA label being added. @template-builder helps create issue templates interactively, which connects back to the template design work from earlier.
Jamie: And @analytics can show team trends, active contributors, files that change a lot, and review turnaround time. That is less about one issue and more about how the project is moving.
Alex: Exactly. The safest habit is to ask for sources and concrete locations: issue numbers, PR numbers, file names, line ranges, or links. Then check those locations yourself before acting.
Jamie: What about building or improving an agent? That sounds like Bonus Challenge A territory.
Alex: Yes. Bonus Challenge A is about improving an existing agent with a clear accessibility purpose. A custom agent usually lives in an agent.md-style file with frontmatter at the top and instructions below it.
Jamie: Frontmatter is the little metadata block, right? The part that tells the system the agent name, description, tools, or permissions.
Alex: Right. Then the body explains purpose, capabilities, domain knowledge, responsibilities, and response guidelines. Informational agents should stay read-only when they only need to summarize or inspect. Task-oriented agents may need file editing, shell execution, or GitHub API access, so their guardrails must be stronger.
Jamie: I want the agent to know when to stop and ask.
Alex: That is the tiered decision pattern. Low-risk actions can be suggested directly. Medium-risk actions should be explained with options. High-risk actions, like changing files, running commands, or opening a PR, should ask for confirmation and leave a clear review path.
Jamie: The template-builder exercises fit here too. Generate a template, extend the agent for a project, then refine the result through feedback.
Alex: Yes, and the pre-built guided workflows give models to study: an accessibility bug report template and a security vulnerability template. You are learning how an agent gathers details, produces a useful file, and invites human review.
Alex: The most powerful workflows chain agents together. One agent can triage issues, another can inspect accessibility risk, another can draft a template or review a PR, and an orchestrator can coordinate the handoff.
Jamie: Orchestrator agents are the ones like @nexus, @accessibility-lead, and @web-accessibility-wizard?
Alex: Yes. @nexus can help route work across the ecosystem. @accessibility-lead can keep the accessibility mission and guardrails visible. @web-accessibility-wizard can coordinate web audit tasks across checks like headings, keyboard flow, contrast, and ARIA usage.
Jamie: Give me a real contribution example.
Alex: You might use /triage to find an accessibility issue, ask @insiders-a11y-tracker what changed recently, ask @web-accessibility-wizard for likely test areas, make a small documentation or code improvement, then ask @pr-review to help prepare a review-ready summary. The human still decides what is true, what should be changed, and whether the evidence is strong enough.
Jamie: That connects directly to Challenge 16, the Capstone Project. The contribution can be to Accessibility Agents, GLOW, or another meaningful repository.
Alex: Yes. Challenge 16 is about choosing a meaningful repository, defining a mission, writing responsibilities and guardrails, and preparing a review-ready contribution. A review-ready draft or a well-supported contribution plan can be valid evidence of completion.
Jamie: Where do GitHub Desktop, GitHub CLI, and Copilot CLI fit into all this?
Alex: GitHub Desktop is useful if you want a visual app for cloning, branching, committing, and pushing. GitHub CLI, the gh command, is useful for signing in, listing issues, checking PRs, viewing workflow runs, and opening links from the terminal.
Jamie: And gh copilot can explain a command, suggest a command, or help write a shell script. That is handy when the terminal is the fastest path but the syntax is hard to remember.
Alex: Exactly. Just keep the same verification habit. If Copilot suggests a command, read it before running it, especially if it edits files, deletes anything, changes permissions, or posts to GitHub.
Jamie: Troubleshooting is pretty practical too. If an agent is not found, check the file location, the agent name, the repository workspace, and whether Copilot or the Agents window has refreshed.
Alex: If the agent gives incorrect output, narrow the prompt, provide the repository or file context, ask for sources, and compare the answer to GitHub itself. If a slash command does not work, check the command name, whether the command file is present, and whether your platform supports that command style.
Jamie: And for going deeper, Appendix V lists the full slash command catalog, while Episode 39 walks through every agent in more detail.
Alex: Exactly. For now, keep the workflow grounded: choose an agent that matches a skill you have, run a small task, verify the output, and only then use it in a contribution.
48. Episode 39: Accessibility Agents - Complete Reference
All 55 agents, all 54+ slash commands, customization, and troubleshooting.
Based on: Appendix L: Accessibility Agents - Complete Reference
Read Transcript - Episode 39: Accessibility Agents - Complete Reference
Transcript
Alex: Welcome back. Episode 39 is a reference companion for Accessibility Agents, so the goal is a little different today. We're not trying to memorize every agent name or every file format. We're learning how the system is organized, how to call on it safely, and how to check its work.
Jamie: That helps, because a complete reference can feel like opening a giant parts drawer. Useful, but only if you know which drawer to reach into.
Alex: Exactly. The reference covers a living catalog of agents, slash commands, instruction files, settings, troubleshooting notes, and the file formats behind them. It also reflects an important platform shift: GitHub's older Copilot extension model has moved toward MCP servers for extensibility, while custom .agent.md files remain a key way to define an agent persona in VS Code.
Jamie: So the reference is both a map of today's agents and a guide to how the whole customization system works.
Alex: Yes. And because this is AI-assisted work, every output still needs human review. An agent can speed up searching, drafting, and organizing, but your manual GitHub and accessibility skills are how you verify the result.
Jamie: Let's start with the big picture. When the reference says agent ecosystem, what are we actually talking about?
Alex: It means a catalog of specialized assistants grouped into three teams: accessibility, GitHub workflow, and developer tools. The catalog grows over time, so treat the number in any one copy of the appendix as a release snapshot, not a permanent fact. The useful part is the organization.
Jamie: And those agents don't all do the same kind of work, right?
Alex: Right. Some are task agents that inspect or change files. Some are informational agents that explain, summarize, or guide. Some are orchestrators, which means they coordinate a larger review by routing parts of the job to more specialized agents.
Jamie: What about platforms? I saw several names in the reference, and that can get confusing fast.
Alex: The main daily workflow is GitHub Copilot in VS Code, where custom agents usually live under .github/agents as .agent.md files. The reference also discusses Claude Code, Gemini CLI, Claude Desktop, and Codex CLI as other environments with their own installation patterns and capabilities. The important accessibility habit is to confirm which platform you are using before expecting a command, tool, or shortcut to behave the same way.
Jamie: So if a learner types an agent name and nothing happens, the problem might not be their typing. It might be platform support or installation location.
Alex: Exactly. Platform, file location, and workspace trust all affect what loads.
Alex: The accessibility team is the largest area of the catalog, and it covers web, document, media, mobile, and content accessibility. You'll see agents for ARIA patterns, modals, color contrast, keyboard navigation, live regions, forms, headings, tables, links, WCAG guidance, cognitive accessibility, data visualization, and more.
Jamie: I like that these are split by accessibility concern. If I have a dialog problem, I don't need a broad audit first. I can ask the modal specialist for focus trapping, Escape behavior, and screen reader announcements.
Alex: Exactly. For documents, the catalog includes agents for Word, Excel, PowerPoint, PDF, ePub, cross-document analysis, inventory, and CSV reporting. That matters because document accessibility has different evidence than web accessibility. A tagged PDF, a spreadsheet header structure, and a web form label all need different checks.
Jamie: And the GitHub workflow team is more about repository activity?
Alex: Yes. It includes agents like @daily-briefing for a morning status report, @issue-tracker for issue triage, @pr-review for structured pull request review, @analytics for team metrics, @insiders-a11y-tracker for accessibility-sensitive changes, and @template-builder for guided issue template creation. The reference notes that some outputs are intentionally arranged with H2 or H3 headings, so a screen reader user can jump through the result by heading.
Jamie: That's a small design choice with a big payoff. If the output is long, headings make it browsable instead of becoming one giant wall of text.
Alex: The developer tools team rounds it out with agents for coding support, testing, documentation, refactoring, security, CI, release work, and similar engineering tasks. They are not a replacement for understanding Git or your codebase, but they can help package work into safer, reviewable chunks.
Jamie: So the agent name should match the job. Accessibility audit, GitHub workflow, or development support.
Alex: Yes. If the request spans more than one area, start with the agent closest to the decision you need, then ask it to produce a clear, checkable output.
Jamie: The reference also talks about slash commands. Are those the same thing as agents?
Alex: Not quite. An agent is a persona with instructions, tools, and behavior. A slash command is a reusable prompt, usually typed with a slash, that packages a common task. The reference covers more than 54 slash commands, and many are designed to produce predictable output formats.
Jamie: So a command might be something like asking for an accessibility update, an issue summary, or a pull request review checklist?
Alex: Yes. A good command says what inputs it expects, what files or tools it may use, and what shape the answer should take. For example, a command could ask for an audit summary with sections for scope, findings, severity, evidence, and suggested fixes.
Jamie: What should learners listen for in the output?
Alex: First, check whether the agent used the right context. Did it look at the correct file, issue, pull request, or repository? Second, check whether the output format matches the request. Third, verify factual claims, especially accessibility claims that cite WCAG, ARIA, keyboard behavior, or screen reader behavior.
Jamie: That verification piece is exactly why Challenge 15 matters. Discover Accessibility Agents is browse-first: learners explore agent files, run agents carefully, and compare AI output against manual skill. They don't have to fork the agent catalog repository just to complete that challenge.
Alex: Right. The evidence is careful exploration and verification, not blind trust. Completing Challenge 15 opens the path to Challenge 16, Capstone Project, and Bonus Challenges A through E. And for the capstone, a review-ready draft or a well-supported contribution plan can count, whether the work targets Accessibility Agents, GLOW, or another meaningful repository.
Alex: Customization is where the reference gets powerful. There are three scopes to understand: personal user-level settings, workspace-level settings shared in a repository, and broader organization-level instructions in supported enterprise environments. When instructions conflict, the more specific or higher-priority instruction wins according to the platform's rules.
Jamie: So if my personal preference says short answers, but the repository says every accessibility audit must include severity and evidence, the repository rule may need to shape that audit.
Alex: Exactly. The reference also describes how multiple instruction files can be combined. That means one repo might have general Copilot instructions, a markdown-specific instructions file, a YAML issue-template instructions file, and a custom agent file all influencing the result.
Jamie: Where do always-on instructions usually live?
Alex: The recommended repository option is .github/copilot-instructions.md. That file can describe accessibility standards, documentation style, commit message format, and preferred tone. The reference also covers AGENTS.md for multi-tool or monorepo situations, CLAUDE.md for Claude Code compatibility, older settings-based instructions that are now discouraged, and organization-level instructions for enterprise setups.
Jamie: And there was a note about discovery in VS Code.
Alex: Yes. Some instruction types need the right VS Code setting or folder location before Copilot discovers them. If instructions seem ignored, don't assume the wording is bad first. Confirm the file name, location, scope, and whether the feature is enabled.
Jamie: Let's separate the file formats, because the names are close enough to trip people up. What is a .instructions.md file for?
Alex: A .instructions.md file gives targeted guidance for certain files or tasks. It can include frontmatter, which is metadata at the top of the file, and an applyTo glob pattern, which is a file-matching pattern like docs/**/*.md or .github/ISSUE_TEMPLATE/*.yml. That lets you say, apply these markdown accessibility rules only to markdown files, or apply these YAML standards only to issue templates.
Jamie: And VS Code can discover those automatically or through a command palette workflow?
Alex: Yes. The reference describes creating instruction files through the Command Palette, and also a quicker manual creation approach. Either way, effective instructions are specific, testable, and phrased as behavior the assistant can follow.
Jamie: Then .agent.md is the agent itself?
Alex: Right. A .agent.md file defines a custom agent persona. Its frontmatter can include a name, description, model choices or fallback models, tool access, and invocation controls. The body then describes constraints, behavior, task name, output format, section headers, accessibility requirements, and scope boundaries.
Jamie: Tool access sounds important. That's where safety comes in.
Alex: Very much. The reference groups tools by use case, from read-only research to documentation generation, full GitHub workflow, terminal access, conversational-only work, and interactive wizards. If an agent only needs to summarize files, don't give it terminal power by default. Match tools to the risk of the task.
Jamie: And .prompt.md is the slash command format?
Alex: Yes. A .prompt.md file defines a reusable command. It can name an agent, specify models, set tools, declare input parameters, and reference files or tools in the body. One subtle rule is that when a prompt names an agent and also lists tools, tool priority and platform behavior determine what actually gets used, so review that carefully.
Jamie: Where do skills fit?
Alex: Skills are reusable procedure packages, usually stored with a SKILL.md file inside a skill folder. They can describe when to use the skill, the procedure, and the expected output format. VS Code can progressively load skills, which means it may start with lightweight metadata and pull in the full skill only when it becomes relevant.
Alex: The reference also covers hooks, which are JSON-based lifecycle automations. A hook can run around tool use, such as before a tool is allowed to act. The input and output contract matters because the hook may approve, deny, or shape an action based on fields and exit codes.
Jamie: That sounds powerful, but also like something to use carefully.
Alex: Yes. Hooks can enforce guardrails, but a bad hook can block useful work or create confusing failures. If a hook is involved, troubleshooting needs to include the hook event, the command fields, the decision it returned, and any exit code.
Jamie: The personal settings file is more approachable. The reference calls out preferences.md, right?
Alex: Right. preferences.md can record things like your GitHub username, repositories you work on most, preferred output format, notification priority, review comment tone, time zone, and accessibility context. For blind and low-vision learners, that accessibility context can be practical: maybe you prefer heading-rich summaries, plain language, concise tables, or warnings before dense code blocks.
Jamie: So personalization is not just cosmetic. It can reduce friction in the way answers are structured.
Alex: Exactly. The best preference file tells the agent how to be useful without hiding important detail.
Jamie: Let's make Challenge 15 concrete. If I open the agent catalog, what should I actually do without getting lost?
Alex: Start by browsing the three teams and picking one agent that matches a task you already understand. Open its agent file and listen for the purpose, tools, constraints, and output format. Then run a small, low-risk prompt and compare the answer to what you would check manually.
Jamie: For example, I might pick @markdown-a11y-assistant, ask it to review one markdown file for heading order and link text, then manually inspect the same file.
Alex: Perfect. Or you might use @issue-tracker to summarize a small issue list, then open the issues yourself and see whether the priorities make sense. The habit is to keep the task narrow enough that you can verify it.
Jamie: And if the agent gives me something useful, I still shouldn't paste it straight into a pull request without review.
Alex: Right. Turn it into evidence you can stand behind: a note, a checklist, a draft, a review comment, or a contribution plan. That connects directly to the capstone, where review-ready work and thoughtful plans are valid outcomes.
Alex: Troubleshooting usually starts with loading. If @agent-name does not appear, check the file path, file extension, frontmatter, workspace trust, VS Code version, and whether custom agents are enabled for your environment. Also confirm you are in the workspace where the file exists.
Jamie: And if the slash command doesn't appear?
Alex: Check that the .prompt.md file is in a supported prompt location, that its frontmatter is valid, and that the command name is what you think it is. If a prompt references an agent, make sure that agent also loads.
Jamie: What about wrong output? That's the one that feels slippery, because the agent did respond, just not well.
Alex: For wrong output, look at context first. Did the agent have access to the file, issue, or pull request? Did your prompt say what to include and what to exclude? Did another instruction file override the behavior? You can also ask the agent to state which files and assumptions it used, then verify that list.
Jamie: And if instructions aren't being applied, check the basics before rewriting everything.
Alex: Yes. Wrong folder, wrong filename, invalid frontmatter, disabled discovery, unsupported platform, and conflicting instructions are common causes. The reference also points learners to keyboard shortcuts for working with Accessibility Agents and Copilot features, because being able to open chat, move through results, and reach Accessible View makes troubleshooting less frustrating.
Jamie: The last part of the reference looks outward: smart actions, browser agents, third-party agents, and further reading.
Alex: Right. Smart actions are contextual shortcuts that can launch common AI-assisted tasks. Browser agents can help with accessibility testing in web contexts, especially when the task involves pages, interactions, or rendered behavior. Third-party agents on GitHub.com and GitHub Cloud may add more options, but they also require extra attention to permissions, data access, and trust.
Jamie: So version compatibility is not a footnote. It's part of responsible use.
Alex: Exactly. Agent behavior changes as VS Code, Copilot, MCP support, and repository files change. The safest update pattern is to read the release notes for your tools, keep agent files in version control, review changes like any other code, and test one small workflow after an update before relying on it for major work.
Jamie: And if the reference points to official docs, use those as the tie-breaker when behavior changes.
Alex: Yes. Use the VS Code custom agents documentation, GitHub Copilot documentation, MCP documentation, and the custom instructions support information as your current references. The appendix is your practical guide, but the platform docs tell you what changed most recently.
Jamie: That makes the whole system feel less mysterious. Pick the right agent, keep the request small enough to verify, know which file controls which behavior, and treat updates as something to test.
Alex: That's the workflow. Agents can help you move faster, but careful context, accessible output, and human review are what make the work trustworthy.
49. Challenge 15: Meet the Agents
Exploring agent files, running agents carefully, and verifying AI output against manual skill.
Practice focus: Day 2 capstone
Read Transcript - Challenge 15: Meet the Agents
Transcript
Alex: Welcome back. Challenge 15 is Meet the Agents, and it moves us into the capstone project space without asking you to build anything yet.
Jamie: So this is the moment where learners meet Gandalf's peers, but they are not expected to become agent engineers in one sitting.
Alex: Exactly. Your job is to explore the Community-Access accessibility-agents repository, discover what agents exist, run one carefully, and read one agent's instructions file. The real skill is learning how to inspect an AI tool before you trust it.
Jamie: And an important detail: this challenge is browse-first. You are not required to fork the accessibility-agents repository just to complete Challenge 15.
Alex: Right. The Accessibility Agents collection is a living catalog, so do not memorize a fixed list. It is organized around teams like Accessibility, GitHub Workflow, and Developer Tools, and agents can appear in different environments, including GitHub Copilot in VS Code and other supported platforms.
Jamie: Before anyone opens Copilot Chat and starts summoning agents, what should already be in place?
Alex: For Day 2, VS Code is the supported editor, and you should have GitHub Copilot access working. Copilot Free is enough for the workshop path. If you joined Day 2 without Day 1, use the Day 2 Quick Start to confirm your account, tools, and basic GitHub workflow skills.
Jamie: Because Day 1 was where people did the regular GitHub work by hand, right? Issues, branches, commits, pull requests, review, and merge in their provisioned Learning Room repository.
Alex: Yes. Agents are useful only when they build on a skill you already understand manually. If an agent reviews a pull request, you should already know how to read a diff. If an agent summarizes issues, you should already know what a useful issue looks like.
Jamie: That makes the agent less like a shortcut and more like a power tool. You still need to know what safe and correct looks like.
Alex: Exactly. If you cannot do the task by hand yet, slow down and learn the manual workflow first. Then the agent can help you move faster without replacing your judgment.
Jamie: So where do we start in the actual challenge issue?
Alex: Open the Community-Access accessibility-agents repository on GitHub. Read the README first, because it explains how the catalog is arranged and how individual agents are meant to be used. Then browse the folders, where each agent has its own files and usually its own instructions.
Jamie: The challenge asks for at least three agents and what they do. What would count as a good discovery note?
Alex: You might find `@accessibility-lead`, which coordinates accessibility reviews and can route work to specialists. You might find `@aria-specialist`, which looks at ARIA roles, states, and properties in HTML or web components. You might find `@keyboard-navigator`, which focuses on tab order, focus management, keyboard shortcuts, and whether interactive elements can be operated without a mouse.
Jamie: Quick definition check. ARIA is Accessible Rich Internet Applications, the set of attributes that can help assistive technology understand custom interface behavior.
Alex: Yes, and it is powerful but easy to misuse, which is why a specialist agent can be useful. You can also explore GitHub Workflow agents such as `@daily-briefing`, `@issue-tracker`, `@pr-review`, `@analytics`, `@insiders-a11y-tracker`, and `@template-builder`. Some agents are informational, some can help with tasks, some guide you through a workflow, and some coordinate other agents.
Jamie: What if the catalog has changed by the time someone listens to this?
Alex: Use the repository README as the current map, and use Chapter 19 for the learning frame. If the agent schema itself is confusing, you can mention `@gandalf-bot` and ask: How does the agent schema work?
Jamie: Running an agent is the part that can feel a little risky. What is the careful version?
Alex: Choose one agent that matches a skill you already have, then read that agent's README or usage notes. It may run through a Copilot Chat command, a VS Code palette command, an Agents window session, or another documented path. Start with a small file or a small question, not a high-stakes repository-wide change.
Jamie: So a learner might ask something like `@daily-briefing morning briefing`, or `@issue-tracker find open issues labeled good-first-issue`, depending on what the agent supports.
Alex: Yes. Another example is asking `@accessibility-lead` to review the heading structure of a file. In the solution example, the lead agent routed that request to a heading specialist, which noticed a jump from H2 to H4.
Jamie: But the learner still needs to check the file. The agent's answer is not automatically true just because it sounds confident.
Alex: Exactly. Read the output, compare it with what you expected, and verify against the file, issue, pull request, or accessibility rule. The challenge evidence should say what the agent did and whether that matched your manual understanding.
Jamie: And these agents can show up in more than one place, right?
Alex: Right. The workshop path is strongest in VS Code with Copilot Chat, and GitHub.com can also support Copilot workflows such as task mode, PR summaries, PR review help, and issue conversations. GitHub Desktop, the `gh` CLI, and `gh copilot` can support repo movement and command help, but you still inspect commands before running them. Other platforms may support the same catalog through their own setup paths, so follow the instructions for the platform you are actually using.
Alex: The most useful file to read is an agent's `.agent.md` file.
Jamie: Those files can look strange at first because they mix configuration and plain-language instructions.
Alex: At the top, you will usually see YAML frontmatter. YAML is a readable configuration format, and the frontmatter can name the agent, describe it, and limit which tools it may use. Below that, the body explains the agent's purpose, responsibilities, output style, and guardrails.
Jamie: Guardrails are the boundaries. They tell you what the agent should not do, or what it cannot know reliably.
Alex: Yes. For example, `@keyboard-navigator` can review code for keyboard accessibility patterns, but it cannot physically press Tab through an app and prove the behavior works. A human still needs to test actual keyboard interaction.
Jamie: Appendix L goes much deeper than this challenge needs, but it helps explain the file ecosystem.
Alex: It does. You will see always-on instructions like `.github/copilot-instructions.md`, file-based `.instructions.md` rules, `.prompt.md` slash commands, reusable `SKILL.md` files, hooks for lifecycle automation, and `preferences.md` for personal settings. The big idea is that agents are configurable tools with scope, priority, permissions, and limits.
Jamie: So a good first read is not every line. It is frontmatter, purpose, responsibilities, guardrails, and then any examples that show how to invoke the agent.
Alex: Once you have explored, run, and read, document what happened.
Jamie: The challenge gives two paths for notes: use the local clone from earlier Day 2 work, or edit through GitHub if that is the better route.
Alex: Open `docs/my-notes/agents-discovery.md` in the repository where the challenge asks you to work. Add a section with your username, three agents you found, the agent you ran and what it did, and the agent file you read with its purpose and guardrails.
Jamie: And if someone is working locally, this is a normal Git workflow again.
Alex: Yes. Add the file, commit with a message like `docs: add agent discoveries for your-username`, push your branch, and open a pull request. If you are using the GitHub editor, the web flow still needs a commit and a shareable PR or commit URL.
Jamie: Then the issue's evidence box asks for the same story in a compact form: three agents, one run, one instruction summary, and the PR or commit link.
Alex: Right. There is also a peer simulation check. Compare your discoveries with the simulated peer issue, or with a real buddy if you have one, because different people may find different agents and different use cases.
Jamie: What happens when Challenge 15 is closed?
Alex: Closing Challenge 15 unlocks Challenge 16, titled Capstone Project, plus Bonus Challenges A through E. Those bonus challenges are part of a structured unlocked path, not leftover extras.
Jamie: And the capstone is flexible. It is not only about one repository.
Alex: Correct. Challenge 16 can accept meaningful contributions to Accessibility Agents, GLOW, or another repository where your work matters. A review-ready draft or a clear contribution plan can count as valid evidence, because planning a responsible contribution is real work.
Jamie: There is also a feedback task called out in Chapter 19.
Alex: Yes. Share workshop feedback when asked. It helps improve the learning path, the agent catalog, and the accessibility of the whole experience.
Jamie: Let's do quick troubleshooting, because this is where learners can lose momentum.
Alex: If you cannot find the repository, go to the Community-Access organization and search for accessibility-agents. If you do not know how to run an agent, open that agent's folder and look for its README or usage examples. If the `.agent.md` file feels overwhelming, read the YAML frontmatter first, then jump by headings to purpose, responsibilities, and guardrails.
Jamie: What if the agent gives a weird answer, or an answer that disagrees with what the learner sees?
Alex: Treat that as a signal to verify, not as a failure. Check the source file, narrow your prompt, confirm the agent had the right tools and repository context, and compare the result with your manual knowledge. If an agent is not found, check the file location, reload the editor or Copilot session, and confirm the customization format your platform supports.
Jamie: What references should people keep open while they work?
Alex: Chapter 19 is the guided lesson for this challenge, and Appendix L is the detailed reference for agents, instructions, prompts, skills, hooks, preferences, scopes, and troubleshooting. When platform behavior changes, use the official GitHub Copilot and VS Code documentation as the current source for product details.
Jamie: So the win is not proving that an agent is amazing. The win is being able to say what it is, what you asked it to do, what it produced, and where its limits are.
Alex: Exactly. Find three, run one, read one, document your evidence, and close the issue when your work is ready. Then you are prepared to move into the capstone path with better judgment about when AI help is useful and when human review still leads.
50. Episode 47: Fork and Contribute
The complete fork-based open source contribution workflow from fork to upstream pull request.
Based on: Chapter 18: Fork and Contribute
Read Transcript - Episode 47: Fork and Contribute
Transcript
Alex: Welcome back. Today we're taking the open source workflow all the way from a fork to a pull request that maintainers can review.
Jamie: This is the one that can feel intimidating, because suddenly you're not working in a classroom repository anymore. You're contributing to something someone else owns.
Alex: Exactly. A fork is your personal copy of someone else's repository on GitHub. It lives under your account, so you can push branches and experiment there without changing the original project.
Jamie: So forks are really about permission. I may not be allowed to write to the main project, but I can still do useful work in my copy.
Alex: Yes. The original project is usually called the upstream repository. Your fork stays connected to that upstream, and that connection is what lets you propose your changes back with a pull request.
Jamie: That also explains the Day 1 difference. In the Learning Room repository, each learner had their own provisioned repo and could make the issue, branch, commit, pull request, and merge directly there.
Alex: Right. In open source, you usually do not get write access to the upstream repository. So the pattern becomes fork first, branch on your fork, and ask maintainers to review the change before it lands.
Jamie: I want to slow down on three words that sound similar when you're new: fork, clone, and branch. They all make copies, kind of, but not in the same way.
Alex: Good place to pause. A fork lives on GitHub under your account, and it copies the whole repository. A clone lives on your computer, and it gives you a local working copy. A branch lives inside a repository, local or remote, and it isolates one line of work.
Jamie: So if I say, I cloned the upstream, that means something different from, I forked the upstream.
Alex: Very different. If you clone the upstream directly, you can read and edit locally, but you probably cannot push changes back there. If you fork first and then clone your fork, your local copy is connected to a GitHub repo where you do have permission to push.
Jamie: Can you describe the flow without relying on the visual diagram?
Alex: Picture three places from left to right. On the left is the upstream repository on GitHub. In the middle is your fork on GitHub. On the right is your computer. The fork action copies left to middle, cloning copies middle to right, pushing sends your committed work from right to middle, and the pull request proposes moving the change from middle back to left.
Jamie: That makes the direction much clearer. Edit locally, push to my fork, request review from upstream.
Alex: And there are a few practical checks that help you stay oriented. If you use a screen reader, `git remote -v` will read out the remotes, and the VS Code Status Bar can announce the current branch after you move focus there with F6. You can also use `Ctrl+Shift+P`, then Git: Checkout to, to hear branch names in the picker.
Jamie: For low vision users, the URL is a helpful clue too. A fork URL includes your username, like `github.com/your-name/repo`, while the upstream URL includes the project owner's name.
Alex: Yes, and in VS Code the branch name in the lower-left Status Bar is worth checking often. If it's small, zooming with `Ctrl+=` can make that status information easier to read.
Alex: When you're ready to fork, start on GitHub.com at the repository you want to contribute to. For a workshop practice repository, that may be `Community-Access/accessibility-agents`, which is part of the living Accessibility Agents catalog.
Jamie: And to be careful with current challenge rules: Challenge 15 is browse-first. Learners are not required to fork the Accessibility Agents repository just to complete that discovery challenge.
Alex: Correct. Forking becomes important when you're practicing this contribution workflow, or when your chosen Challenge 16 Capstone Project repository accepts pull requests. On the repository page, find the Fork button near the top of the page.
Jamie: If I'm using NVDA or JAWS, I can press B to move through buttons, and the Fork button is usually near Watch and Star. With VoiceOver, the Buttons rotor can help me jump to Fork.
Alex: After you activate Fork, GitHub opens a Create a new fork page. The usual defaults are right: the owner is your username, the repository name stays the same, and Copy the main branch only stays checked. Then activate Create fork.
Jamie: And after that, GitHub sends me to my copy, with my username in the URL.
Alex: Exactly. If you prefer GitHub CLI, you can create the fork without cloning by running `gh repo fork OWNER/REPO --clone=false`. Replace `OWNER/REPO` with the actual upstream repository name.
Jamie: Now the fork exists on GitHub, but I still need the files on my computer.
Alex: Right. Clone your fork, not the upstream, unless you have a very specific reason. In VS Code, open the command palette with `Ctrl+Shift+P`, or `Cmd+Shift+P` on macOS, run Git: Clone, paste your fork URL, choose a local folder, and open the repository when VS Code offers.
Jamie: So the URL should include my username, not the upstream owner's username.
Alex: Yes. In the terminal, the command is `git clone https://github.com/your-username/repo-name.git`, then `cd repo-name`. Replace the username and repository name with the real ones.
Jamie: What about GitHub Desktop and the GitHub CLI?
Alex: In GitHub Desktop, use File, Clone repository, choose the GitHub.com tab, select your fork, pick a local path, and clone it. With GitHub CLI, run `gh repo clone your-username/repo-name`, then change into the folder.
Jamie: After cloning, what remotes do I have?
Alex: At first, usually just one: `origin`. In this workflow, `origin` should point to your fork. That name matters because later, when you push, you want your work going to the repo you control.
Alex: Now add the upstream remote. This is the connection from your local clone back to the original project.
Jamie: So `origin` is my fork, and `upstream` is the original repository. That's the naming convention.
Alex: Exactly. From inside the local repository, run `git remote add upstream https://github.com/OWNER/REPO.git`, using the upstream repository's URL. Then run `git remote -v` to verify both remotes.
Jamie: What should I hear or see when I verify?
Alex: You should see `origin` listed with your username in the URL, for fetch and push. You should also see `upstream` listed with the original owner's URL. If both point to the same place, stop and fix that before continuing.
Jamie: A common mistake would be cloning the upstream, then trying to push and getting a permission error.
Alex: Exactly. Another common one is setting `origin` to the upstream by accident. If a push says permission denied, don't assume Git is broken. First check `git remote -v` and confirm where your push is trying to go.
Jamie: We have the remotes. Now we need a branch, right?
Alex: Yes. Create a feature branch for the specific change you're making. In the terminal, `git switch -c fix-typo-in-readme` creates the branch and moves you onto it.
Jamie: And the branch name should describe the change, not just be something like `stuff`.
Alex: Please, yes. In VS Code, you can use the branch name in the Status Bar or the command palette to create and switch branches. In GitHub Desktop, use the Current Branch control, create a new branch, and make sure it's based on `main` unless the project tells you otherwise.
Jamie: How do I verify I didn't stay on `main` by accident?
Alex: In the terminal, run `git branch` or `git status`; Git will tell you the current branch. In VS Code, check the lower-left branch name. In GitHub Desktop, check the Current Branch field before editing.
Alex: Now make the change. Keep it focused, follow the project's contributing guidance, and avoid mixing unrelated fixes in one pull request.
Jamie: That sounds especially important in accessibility work. A maintainer should be able to understand what barrier changed, what file changed, and how to review it.
Alex: Exactly. After editing, stage and commit your work. In the terminal, `git status` shows changed files, `git add filename` stages one file, and `git commit -m "Clear summary of the change"` records the commit.
Jamie: And in VS Code, the Source Control panel gives me the changed files, lets me stage them, enter a message, and commit.
Alex: Right. Multiple commits are okay while you're working. Maintainers may later ask you to squash or clean them up, but early on, the most important thing is making clear, reviewable commits.
Jamie: So I don't need to panic if my branch has three small commits instead of one perfect commit.
Alex: No panic. Clear history helps, but a pull request can still be reviewed while it has multiple commits.
Alex: Next, push your branch to your fork. The first push usually uses `git push -u origin your-branch-name`.
Jamie: What does the `-u` part do?
Alex: It sets an upstream tracking relationship for that branch, so future pushes and pulls know which remote branch to use. After that first push, `git push` is usually enough from the same branch.
Jamie: In VS Code, this is where I might hear Publish Branch or Sync Changes.
Alex: Yes. In GitHub Desktop, use Push origin. Either way, remember that `origin` should be your fork. Then open GitHub.com and verify that the branch exists on your fork, often with a recently pushed branch banner near the top.
Jamie: That banner is a nice confirmation: my local commit made it to GitHub, but only to my fork so far.
Alex: Exactly. Nothing has changed upstream yet.
Jamie: Now comes the pull request, which is the part people worry about.
Alex: A pull request is a request for maintainers to review and possibly merge your branch into the upstream repository. If GitHub shows a Compare and pull request banner on your fork, activate it.
Jamie: And I need to check the base and compare settings, because they determine the direction.
Alex: Yes. The base repository should be the upstream project, usually on `main`. The compare side should be your fork and your feature branch. If those are reversed, the pull request will not say what you intend.
Jamie: If the banner isn't there, I can use the Pull requests tab and choose New pull request.
Alex: Right. You can also use GitHub CLI with `gh pr create`, then follow the prompts for base, head, title, and body. However you open it, write a clear title, summarize what changed, and include how you tested it or what you checked.
Jamie: That body is not just paperwork. It's how the reviewer knows where to focus.
Alex: Exactly. If your change is a draft, say so. A review-ready draft or a detailed contribution plan can still be valid evidence in the Capstone Project when that matches the challenge expectations.
Alex: Once the pull request is open, maintainers may comment, ask questions, or request changes.
Jamie: If they request changes, do I open a new pull request?
Alex: Usually no. Make the edits on the same local branch, commit them, and push to `origin` again. The pull request updates automatically because it is watching that branch.
Jamie: And review etiquette matters here.
Alex: It does. Reply to comments when you've addressed them, ask if something is unclear, and don't treat requested changes as rejection. Review is part of collaboration.
Jamie: I like that framing. The maintainer is helping the change fit the project, not grading your worth as a contributor.
Alex: Exactly. Keep the conversation specific, kind, and tied to the work.
Jamie: Forks can drift over time, though. The upstream project keeps changing while my fork sits there.
Alex: That's why you sync your fork. From the command line, first switch to your local `main` with `git switch main`. Then download the latest upstream changes with `git fetch upstream`.
Jamie: After fetching, those changes are available locally, but not merged yet.
Alex: Right. Merge them with `git merge upstream/main`. Then push the updated `main` back to your fork with `git push origin main`.
Jamie: So the full rhythm is local `main`, fetch upstream, merge upstream main, push origin main.
Alex: Yes. On GitHub.com, many forks also show a Sync fork button, which can update your fork from the upstream when there are no complicated conflicts. With GitHub CLI, `gh repo sync your-username/repo-name -b main` can do the same kind of update.
Jamie: When should I sync?
Alex: Before starting a new branch, after being away from a project for a while, and when a pull request says your branch is behind the base branch. If there are conflicts, slow down and resolve them carefully, or ask for help in the pull request.
Jamie: And if I'm already working on a feature branch, I may need to bring updated `main` into that branch too.
Alex: Right. That can be a merge or a rebase depending on the project's guidance. When you're new, follow the repository's instructions and ask before rewriting shared history.
Alex: Here's the whole loop in plain language: fork the upstream, clone your fork, add upstream, create a feature branch, make a focused change, commit it, push to your fork, and open a pull request upstream.
Jamie: Then respond to review, keep the fork synced, and after the pull request is merged, clean up the branch.
Alex: Yes. Locally, switch away from the feature branch, then delete it with `git branch -d your-branch-name`. On your fork, delete the remote branch with `git push origin --delete your-branch-name`, or use the delete button GitHub offers after merge.
Jamie: What are the stuck points people should recognize quickly?
Alex: Permission denied usually means you're pushing to a repo you don't control, or your authentication needs attention. Repository not found often means the URL is wrong or the fork doesn't exist under your account. A pull request with no changes usually means the base and compare settings are wrong, or you pushed a different branch than the one you selected.
Jamie: And if I accidentally committed to `main` instead of a feature branch?
Alex: Don't keep piling on work. Stop, make a new branch from the commit, and use the advanced Git guidance if you need to move commits or reset `main`. If you're unsure, ask before force pushing.
Jamie: For current details, use official GitHub documentation, the GitHub change log, and the project's own contributing file, because screens and buttons can change.
Alex: Exactly. And for the curriculum path, completing Challenge 15 unlocks Challenge 16, the Capstone Project, plus Bonus Challenges A through E. Those bonuses are a structured unlock path, and the capstone can involve Accessibility Agents, GLOW, or another meaningful repository.
Jamie: So this workflow is not just a Git exercise. It's the contribution shape you'll use when a real project asks for work through forks and pull requests.
Alex: That's it. Once you can identify upstream, origin, branch, push target, and pull request direction, the workflow becomes much less mysterious.
51. Episode 48: Build Your Agent: Capstone
Designing, writing, testing, and contributing a custom accessibility agent.
Based on: Chapter 20: Build Your Agent: Capstone
Read Transcript - Episode 48: Build Your Agent: Capstone
Transcript
Alex: Welcome back. Today we're at the capstone, where the work gets very real. Challenge 16 is called Capstone Project, and the goal is to design or improve something agentic that could help an actual repository.
Jamie: Agentic meaning an agent, prompt, instruction file, skill, workflow, or documentation that helps an AI assistant behave in a useful, bounded way?
Alex: Exactly. The capstone is not locked to one repository. Accessibility Agents is a strong default, GLOW is another excellent path, and another meaningful repository can work if you can explain the need and prepare a review-ready contribution.
Jamie: So completion does not require a perfect merged pull request by the end of the live event.
Alex: Right. Your evidence can be a pull request, an agent file, a documented contribution plan, or a review-ready draft. What matters is that a maintainer could look at it and understand the purpose, responsibilities, guardrails, and how you tested it.
Jamie: Before someone starts, what should they already have in place?
Alex: You should understand the basic Git workflow: fork or create a working copy, make a branch, commit, push, and prepare a pull request. Day 1 gave you that full contribution loop in your own Learning Room repository, and this capstone asks you to use the same habits in a more open-ended setting. You also need GitHub Copilot or Copilot Free active, and you should have browsed the Accessibility Agents catalog so you have examples in mind.
Jamie: And there is a time box here, but it sounds flexible.
Alex: Most learners can create workshop-ready evidence in about 60 to 90 minutes. A polished pull request may take longer if the project has tests, review rules, or unfamiliar files. It is completely acceptable to leave the live session with a strong draft and continue asynchronously after the event.
Alex: The first real decision is where to contribute. Pick a place where your work can help someone, not just a place where the file is easy to edit.
Jamie: I can imagine people freezing there. If three paths are valid, how do I know I am not choosing wrong?
Alex: Ask practical questions. Who benefits if this gets merged? Does the repository already use agents, prompts, custom instructions, skills, or automation? Can the change fit in one small pull request? Do you have access to fork it or prepare a draft? And can you define limits so the agent does not overreach?
Jamie: That small-pull-request idea feels important. A capstone does not have to solve every accessibility problem in the project.
Alex: Exactly. Valid contributions include a new agent, an improved agent, a prompt or slash command, repo-specific custom instructions, a skill or rule reference, documentation, or even a scoped issue triage plan for an agent the project should build next.
Jamie: I like that documentation and plans count, because sometimes the most helpful thing is making the path safer for the next contributor.
Alex: Yes, especially when you do not have write access or the project needs discussion before code. A clear plan with mission, impact, boundaries, and test examples can be strong capstone evidence.
Jamie: Let's talk about Accessibility Agents, because many learners will start there.
Alex: Accessibility Agents is a living catalog of agents, prompts, instructions, skills, and accessibility workflows. It is the most direct agent-building path because you can study existing examples and then add or improve one focused asset.
Jamie: What makes a good contribution there?
Alex: A small specialist agent for an uncovered workflow is one option. You could also improve an existing agent's guardrails, update documentation that has become stale, add examples for screen reader, low vision, keyboard-only, and sighted workflows, make prompts produce more reviewable output, or refine a skill with clearer severity and remediation guidance.
Jamie: That connects naturally to Bonus Challenge A, Improve an Agent.
Alex: It does. If creating a brand-new agent feels too broad, improving an existing one is often a better contribution. You still need a clear accessibility purpose, but you start from something real instead of a blank page.
Alex: GLOW is a different kind of opportunity. It stands for Guided Layout and Output Workflow, and it focuses on document accessibility and large-print production.
Jamie: So not just code accessibility. We are talking about documents people actually need to read, print, convert, and share.
Alex: Exactly. GLOW audits formats like Word, Excel, PowerPoint, Markdown, PDF, EPUB, HTML, and CSS. It supports standards and profiles such as ACB large print guidance, APH submission guidance, Microsoft Accessibility Checker-style checks, and WCAG 2.2 AA concepts.
Jamie: And GLOW has several surfaces, right?
Alex: Yes. It includes web, desktop, command-line, VS Code, and Word add-in paths. That means a contribution might help a developer, but it might also help a teacher, publisher, document remediator, or community organization.
Jamie: What would a good GLOW capstone look like?
Alex: You might add an agent that helps users choose between audit, fix, template, export, and convert workflows. You might improve large-print agent instructions, write a prompt for release notes, add custom instructions for document accessibility work, or document a contributor workflow.
Jamie: And because GLOW can touch real documents, safety matters.
Alex: Very much. A GLOW agent should not promise perfect compliance, silently rewrite content, or auto-fix issues that need human judgment. It should preserve files, explain what it changed, name the standards profile when relevant, and send uncertain cases to human review.
Jamie: What if someone has another repository they care about already?
Alex: That can be a great capstone path. The repository should be meaningful, public or otherwise safe to discuss, and small enough for a scoped contribution. You also need a way to prepare evidence, either through a fork, a branch, a draft pull request, or a written plan.
Jamie: What kinds of contributions travel well to other projects?
Alex: Repo-specific custom instructions are common. So are maintainer workflow agents, accessible contributor docs, issue templates, release-note prompts, or a triage plan for accessibility reports. The key is to respect the project's style, license, security needs, and review process.
Alex: Once you choose the repository, define the mission before you write the file. A good mission says who the agent helps, what task it supports, what output it produces, and where it must stop.
Jamie: Can you give a concrete example?
Alex: Sure. Plain Language Findings Reviewer could help a team rewrite accessibility audit findings so they are easier for product teams to understand. Its job might be to clarify impact, remove blame, preserve technical accuracy, and suggest next actions.
Jamie: But it should not decide legal compliance or invent test results.
Alex: Exactly. Responsibilities describe what the agent should do. Guardrails describe what it must avoid, when it should ask a clarifying question, and when it should tell the user that human review is needed.
Jamie: That distinction is useful. Responsibilities make the agent helpful, and guardrails make it safe.
Alex: Yes. A strong mission also includes non-goals. If your agent reviews release notes, say it does not approve releases. If it reviews accessibility findings, say it does not replace testing with assistive technology.
Jamie: Now we have to write the actual asset. Where does it usually go?
Alex: For a VS Code custom agent, a common location is .github/agents, with a file name like plain-language-findings-reviewer.agent.md. Other assets may live in prompt, instruction, or skill locations used by that repository, so follow the repo's existing pattern when there is one.
Jamie: And the naming should be boring in a good way.
Alex: Yes. Use lowercase words separated by hyphens, and make the name describe the job. The top of the file usually has YAML frontmatter, which is a small block of machine-readable fields between three hyphens. Depending on the agent surface, fields can include things like name, description, and tools.
Jamie: Then the rest is Markdown that humans can read.
Alex: Right. A minimal agent file should include a short purpose statement, responsibilities, guardrails, an output format, and at least one example. If you are making claims about standards or product behavior, include source notes so reviewers can check your work.
Jamie: Let's spend a second on output format, because accessible agent output is easy to overlook.
Alex: Use clear headings, short lists, plain language, and consistent labels like severity, impact, evidence, and recommendation. Do not rely on color alone. Be careful with wide tables because they can be hard to navigate with speech or magnification, and use code blocks only when they truly help.
Jamie: So the agent's answer should be easy to review, not just impressive-looking.
Alex: Exactly. Good output lets someone find the problem, the reason it matters, the suggested fix, and any uncertainty without hunting through a wall of text.
Alex: Testing is where the agent stops being an idea and starts becoming a contribution. Open the repository in VS Code, use Copilot Chat, and if the agent is available through the Agents window, try it there too.
Jamie: What should the test prompts look like?
Alex: Use realistic examples. Try an easy case, a messy case, an out-of-scope request, a safety-sensitive request, and a case involving low vision, screen reader, keyboard-only, or cognitive accessibility needs.
Jamie: So if the agent only behaves well on the perfect example, it is not really ready.
Alex: Right. Check whether it follows the mission, stays inside its guardrails, asks clarifying questions when needed, avoids inventing facts, produces accessible output, and explains limitations. Save notes from those tests because they belong in your pull request or capstone evidence.
Jamie: When it is time to contribute, what goes in the pull request?
Alex: Use the workflow you already practiced: branch, edit, commit, push, and open a pull request or draft. In the description, explain the problem, what changed, how you tested it, what limitations remain, and what kind of review you want. If you include images, also describe the important information in text.
Jamie: And if the learner cannot open a pull request in the target project?
Alex: Then prepare a review-ready branch in your own fork, or write a contribution plan with the same details. Challenge 16 accepts that kind of evidence when it shows clear purpose, responsibilities, guardrails, and testing plans.
Jamie: What about review feedback? That can be intimidating.
Alex: Treat review as part of the contribution, not a verdict on you. Thank the reviewer, clarify anything confusing, make small follow-up commits, update tests or docs if needed, and explain what changed. If you disagree, keep the conversation grounded in user impact, project goals, and maintainability.
Jamie: How will learners know whether their capstone is strong?
Alex: The core criteria are practical: real user need, good repository fit, small scope, clear responsibilities, clear guardrails, accessible output, testing evidence, and a pull request or plan that a reviewer can understand. Work that goes beyond the basics usually includes edge cases, source notes, examples, documentation, and safe defaults that reduce maintainer effort.
Jamie: And if someone gets stuck at the end?
Alex: Shrink the scope. Improve one existing agent. Write one strong contribution plan. Test one output format. Ask for focused feedback instead of trying to finish everything. The capstone can continue after the live event, and Bonus Challenge A gives a structured path for improving an agent with a clear accessibility purpose.
Jamie: That makes the capstone feel less like a final exam and more like joining a real project responsibly.
Alex: That is the goal. Choose a real need, write the boundaries clearly, test with examples that resemble actual users, and leave behind evidence another person can review.
52. Challenge 16: Capstone Project
Choosing a meaningful repository, defining a mission, writing responsibilities and guardrails, and preparing a review-ready contribution.
Practice focus: Day 2 capstone
Read Transcript - Challenge 16: Capstone Project
Transcript
Alex: Welcome back. Challenge 16 is the Capstone Project, and it is the point where the workshop becomes a real contribution path.
Jamie: I like that word, path, because this one is not only about making one file and being done. It asks you to choose work that could actually help a repository.
Alex: Exactly. You choose Accessibility Agents, GLOW, or another meaningful repository, then prepare an agentic contribution. That could be an agent, a prompt, a custom instructions file, a skill, a workflow, an issue template, documentation, or even a strong contribution issue.
Jamie: And just to be clear on the title, this challenge is called Capstone Project.
Alex: Right. It unlocks after Challenge 15, at the same time as Bonus Challenges A through E. You can work on the capstone first, pick a bonus first, or move between them, but the bonus challenges are a structured path, not leftover extras.
Jamie: Before someone starts, what should they have ready?
Alex: You should understand the fork, branch, commit, push, and pull request workflow from earlier work. You should have VS Code ready for Day 2, and GitHub Copilot or Copilot Free active if you are testing agent behavior. If you joined Day 2 without Day 1, the Day 2 Quick Start is there to confirm your tools and baseline skills.
Jamie: This also connects back to the agent discovery work from Challenge 15, right?
Alex: Yes. Challenge 15 is browse-first: you explore the Accessibility Agents catalog and match agents to skills you have already practiced. You are not required to fork that repository just to complete Challenge 15.
Jamie: So the catalog is something learners browse and evaluate, not a fixed list they have to memorize.
Alex: Exactly. Accessibility Agents is a living catalog, so examples and inventory snapshots can change over time. The stable habit is to inspect the current repository, read the instructions, and ask whether you understand the manual skill the agent is meant to support.
Jamie: So when I open Challenge 16, the first real decision is where my contribution belongs.
Alex: Yes. The three recommended paths are Accessibility Agents, GLOW, or another repository you care about. A meaningful repository is one where you can explain who benefits, what workflow improves, and why your change fits.
Jamie: What questions help someone choose without getting stuck in options?
Alex: Ask: who would benefit if this were merged? Does the repository already use agents, prompts, instructions, skills, templates, or automation? Can you make one small, useful change? Can you fork it, open a branch, or at least prepare a review-ready draft? And can you set boundaries so the contribution does not overreach?
Jamie: Accessibility Agents sounds like the most direct route for an agent file.
Alex: It is a strong default because the repository is organized around agents, prompts, instructions, skills, and accessibility workflows. It is also the path where the Challenge 16 autograder can check an agent file for valid YAML frontmatter plus Responsibilities and Guardrails sections.
Jamie: And GLOW is a different kind of fit.
Alex: GLOW stands for Guided Layout and Output Workflow. It focuses on document accessibility and large-print production across surfaces like web, desktop tooling, command line workflows, VS Code agent tooling, and a Word add-in path. Good GLOW contributions might help users choose between Audit, Fix, Template, Export, and Convert workflows, or improve prompts, release-note review, documentation, or safety notes.
Jamie: What if someone has a personal project or a community project they already care about?
Alex: That can work too. The repository should be real, the contribution should be small enough to review, and the evidence should explain the mission, responsibilities, guardrails, and next steps. A project-specific custom instructions file, an accessible contribution guide, an issue template, or a maintainer workflow prompt can all be valid.
Jamie: The challenge asks for a mission statement. What makes that more than a slogan?
Alex: A good mission statement names the audience, the help being offered, and the reason it matters. For example: "Help workshop students navigate Git Going with GitHub challenges by explaining concepts and suggesting next steps without completing the work for them." That one sentence already gives reviewers a scope.
Jamie: And then the contribution can be several different asset types.
Alex: Right. You might create or improve an agent file, prompt, slash command, custom instructions file, skill, workflow update, issue template, documentation page, or issue triage plan. The capstone is about useful agentic work, not about forcing every learner into the same file type.
Jamie: I want to slow down on responsibilities and guardrails, because those words come up a lot.
Alex: Responsibilities are the tasks the contribution is designed to handle. Guardrails are the limits, safety checks, and refusal rules that keep it from doing the wrong thing. If your asset involves automation or AI assistance, those two sections tell reviewers how it should behave.
Jamie: Can you give a concrete example?
Alex: The reference solution uses a sample agent called Workshop Buddy. Its metadata includes a name, a description, and a tools list. Its responsibilities include answering workshop questions, pointing students to the right chapter, explaining Git and GitHub in beginner-friendly language, suggesting next steps when someone is stuck, and reminding people about accessibility best practices.
Jamie: And its limits are just as important as its helpfulness.
Alex: Yes. It should guide, not solve. It should not make repository changes directly, should not provide answers to challenge evidence prompts, should not access external services or APIs, and should be honest when a question is outside the workshop scope.
Jamie: The example interactions make that easy to hear. If a student asks what conflict markers are, the agent explains them. If a student asks it to write the PR description that proves their work, it refuses and helps them think through what to include.
Alex: Once you have a path and a mission, you need a workspace. The quickest browser route is Codespaces: choose the repository, select the Code button, choose the Codespaces tab, let the environment load, and create or update one focused file in the Explorer.
Jamie: Then if it involves an agent or automation, add the responsibilities and guardrails before opening anything for review.
Alex: Exactly. From there, create a branch, commit, and submit a pull request when you have access. If you do not have access, you can still save a branch, draft issue, or contribution plan.
Jamie: What about the local VS Code path?
Alex: Fork the chosen repository when fork-based contribution is possible. Then use the Command Palette with Git: Clone, using Ctrl+Shift+P on Windows or Linux, or Cmd+Shift+P on Mac. After cloning, create a branch such as capstone/your-username, use the Explorer to focus the parent folder, and use the arrow keys to move through files.
Jamie: And Source Control is where the Git work happens in VS Code.
Alex: Right. Open Source Control with Ctrl+Shift+G, or Cmd+Shift+G on Mac. Stage the files, write a clear commit message, publish the branch, and open the pull request through the GitHub Pull Requests extension if that is your workflow.
Jamie: Some people are faster at the command line.
Alex: That is fine too. With GitHub CLI, you can fork and clone a repository with a command like gh repo fork OWNER/REPO --clone, then create a branch with git checkout -b capstone/your-username. After editing, use git add ., commit with a message like "Prepare capstone contribution", push the branch, and run gh pr create.
Jamie: And if a pull request is not possible during the workshop, that is not a dead end.
Alex: Correct. Challenge 16 accepts a PR, a branch, a draft issue, or a contribution plan when it is review-ready and explains who it helps, what it does, and how it stays safe.
Jamie: If someone does choose the agent-file route, what does the file need to look like?
Alex: An agent file usually ends with .agent.md. The exact folder depends on the project, but examples include a community agents folder or a .github/agents folder. At the top, you include YAML frontmatter between lines of three hyphens, with fields like name, description, and tools.
Jamie: YAML frontmatter is just metadata, right?
Alex: Yes, metadata that tools can read. Keep it simple: a name, a one-sentence description, and a tools list such as tools: ["codebase"] or tools: []. After that, add the visible Markdown content, including the agent title, Responsibilities, and Guardrails.
Jamie: That explains why spacing and punctuation matter there.
Alex: They do. YAML is picky, so quoted strings and simple lists can save frustration. If your capstone includes an agent, the sample agent-file template in the docs is a safe starting point.
Jamie: How does the autograder fit into this?
Alex: The autograder only validates the Accessibility Agents path when you submit an .agent.md file. It checks for valid YAML frontmatter and the two required sections: Responsibilities and Guardrails. GLOW and other repository paths are reviewed by facilitators using the same ideas: mission, responsibilities, guardrails, and review readiness.
Jamie: After the file exists, how should learners test it?
Alex: If it is an agent, test it with Copilot Chat or the agent surface your project supports. Ask a realistic question, read the response, and check whether it stays in scope, asks clarifying questions when needed, avoids unsafe actions, and gives output a maintainer could review.
Jamie: So testing is not just "did it answer." It is "did it behave like the file says it should behave."
Alex: Exactly. If you wrote a prompt or slash command, run a sample and save the result or describe it. If you wrote documentation, an issue template, or a contribution plan, test the reader experience: can someone follow it, find the next action, and understand the boundaries?
Jamie: What if the learner cannot run the tool locally?
Alex: Then document how it should be tested. A review-ready draft can include expected inputs, expected outputs, risk areas, and what a reviewer should check. That is much stronger than saying "untested" with no context.
Jamie: I like that this keeps the door open for careful drafts, not only perfect finished work.
Alex: When you prepare the pull request or evidence, make it easy for a reviewer to understand the work. Include the mission, who it helps, what changed, how you tested it, and the responsibilities and guardrails.
Jamie: The Workshop Buddy example has a nice PR description pattern.
Alex: It explains the new agent, then names design decisions: guide without solving, stay scoped to the workshop, and keep accessibility awareness present. Its checklist confirms YAML frontmatter with name and description, the Responsibilities section, the Guardrails section, and example interactions showing both help and boundaries.
Jamie: And the Challenge 16 issue asks for evidence in a pretty practical format.
Alex: Yes. Share the repository you chose, the repository URL or fork, the contribution type, your mission statement, the PR, branch, or plan URL, the responsibilities, the guardrails, and what you reviewed in a peer or peer-simulation contribution.
Jamie: What should that peer review look for?
Alex: Check clarity, scope, responsibilities, guardrails, and usefulness to the target repository. If you cannot review a real classmate's capstone, use the peer-simulation PR and explain what you would check before calling the work ready for review.
Jamie: Once feedback comes in, what is the healthiest way to respond?
Alex: Thank the reviewer, ask a clarifying question if something is unclear, and make small commits that are easy to inspect. If you disagree with feedback, explain the design tradeoff calmly and tie it back to the mission and guardrails.
Jamie: And if the work is still a draft?
Alex: Say what kind of feedback you want. You might ask whether the scope is small enough, whether the guardrails are strong enough, or whether the contribution fits the repository's workflow.
Jamie: What does a solid capstone need to satisfy?
Alex: A real repository, a clear mission, useful responsibilities, sensible guardrails, and review-ready evidence. Work that goes beyond the basics usually includes examples, local testing notes, a tight scope, and alignment with how the project already works.
Jamie: And if someone gets stuck at the end?
Alex: If you do not know which repository to choose, start with Accessibility Agents for the most direct agent-building route, or choose GLOW or another repository if you already see a useful contribution there. If you do not know what to contribute, pick one small improvement: an agent, prompt, instructions file, issue template, or documentation page. If you cannot open a PR, submit a review-ready contribution plan instead.
Jamie: And if the autograder fails?
Alex: Check that you are on the Accessibility Agents .agent.md path, that the YAML frontmatter is valid, and that the file includes Responsibilities and Guardrails as sections. For GLOW or another repository, make sure the written evidence clearly explains the same criteria, because a facilitator will review it.
Jamie: Then the final action is to post the link or plan in the Challenge 16 issue and activate Close issue.
Alex: Yes. And that is a real milestone: you have completed Git Going with GitHub and prepared work that can continue beyond the classroom.
53. Challenge bonus-a: Improve an Agent
Extending or improving an existing agent with a clear accessibility purpose.
Practice focus: Bonus
Download Challenge bonus-a (MP3)
Read Transcript - Challenge bonus-a: Improve an Agent
Transcript
Alex: Welcome back. Bonus A is called Improve an Agent, and it is exactly what it sounds like: you take an existing agent and make one focused, useful improvement.
Jamie: I like that this is not asking everyone to invent something from scratch. Sometimes the best contribution is noticing that an existing tool could be clearer, safer, or more complete.
Alex: Yes. The goal is an accessibility-purpose improvement that a maintainer could review. It might be a new responsibility, a clearer guardrail, a better description, or a small fix that helps the agent behave more reliably.
Jamie: And this bonus has a place in the larger workshop path, right?
Alex: Right. Challenge 15 is the browse-first agent discovery challenge. Completing Challenge 15 unlocks Challenge 16, the Capstone Project, plus Bonus Challenges A through E. You do not have to complete the capstone before starting Bonus A, but this bonus can absolutely feed into your capstone evidence.
Jamie: Before we talk workflow, can we define what an agent is in this context?
Alex: An agent is usually a Markdown file with instructions for an AI assistant. In these repos, agent files often end in .agent.md, and they describe the agent's purpose, responsibilities, limits, and response style. Those limits are often called guardrails, which means instructions about what the agent should not do or when it should ask for human review.
Jamie: So improving an agent is not just changing words. You are changing the instructions that guide future behavior.
Alex: Exactly. And the course principle still applies: skill first, agent second. If an agent reviews pull requests, you should have read diffs and PR conversations by hand. If an agent checks accessibility, you should understand the manual accessibility skill well enough to judge whether the agent output is useful.
Jamie: That keeps the AI from becoming a mystery box. You are still the reviewer.
Alex: Yes. You should already have the basics from the workshop: GitHub account, Git, VS Code or another editor, Copilot access if you plan to test in chat, and the Day 1 contribution workflow from the Learning Room repository. That Learning Room work gave you the issue, branch, commit, pull request, and merge pattern you will reuse here.
Jamie: And the target repo does not have to be only one place.
Alex: Correct. Accessibility Agents is a strong default because it is a living catalog of accessibility, GitHub workflow, and developer tool agents. GLOW is another good path if you care about document accessibility, large print, Office files, web apps, or conversion workflows. You can also choose another meaningful repository if it already uses agents or would benefit from one.
Alex: Start by browsing. Open the repository you want to help, look for its agent folders, and read two or three .agent.md files before choosing one.
Jamie: That sounds simple, but I can imagine opening a catalog and thinking, there are too many choices. What should I listen for while reading?
Alex: Listen for purpose, scope, and boundaries. What is this agent supposed to help with? What inputs does it expect? What kind of answer does it produce? And just as important, where could it overreach?
Jamie: So I am not trying to find a broken agent. I am trying to find a place where the instructions could serve users better.
Alex: Exactly. Good candidates include a vague responsibility, a missing guardrail, a typo that could confuse readers, an unclear description, or a new responsibility that clearly fits the agent's mission. A small wording change can be valid if you can explain why it improves clarity or accessibility.
Jamie: That is reassuring. I think people sometimes assume a contribution has to be dramatic.
Alex: In this challenge, dramatic is usually a warning sign. One focused change is easier to review, easier to test, and more respectful of the original author's choices.
Alex: Once you have an agent, make a working branch. A common branch name is agent-improve slash the agent name, for example agent-improve slash aria-specialist.
Jamie: Do I always need a fork?
Alex: Use whatever contribution path the repository allows. If you do not have write access, you will usually work from a fork. If you do have access, you might create a branch in the repository. Either way, keep the branch focused on this one improvement.
Jamie: Then the edit is inside the agent file itself?
Alex: Usually, yes. Edit the .agent.md file and make the improvement clear. If the agent uses YAML frontmatter at the top, be careful with indentation and punctuation. Below that, look for sections such as purpose, responsibilities, domain knowledge, guardrails, or response guidelines.
Jamie: What would the commit look like?
Alex: Use a commit message that names the agent and the specific change. For example: Improve aria-specialist: add live region review. Then push your branch so it has a URL you can share.
Jamie: And then comes the review path.
Alex: If the project accepts pull requests, open one against the original repository and explain why the change makes the agent better. If a workshop pull request is not appropriate, a review-ready branch or contribution plan is still valid evidence. The key is that someone else could understand your change and review it.
Jamie: Can we walk through the sample improvement? I always learn faster when I can hear one concrete case.
Alex: Sure. The sample target is aria-specialist.agent.md. The improvement adds a responsibility for checking aria-live regions in dynamic content. The existing agent covered static ARIA roles and states, but it did not call out live regions.
Jamie: Quick definition: aria-live is what lets screen readers hear updates that happen after the page has already loaded, right?
Alex: Yes. Search results, notifications, form validation messages, and status updates can change without a full page reload. If those updates are not announced properly, a screen reader user may miss critical information. So an ARIA-focused agent should know to review live regions and the politeness level, such as polite or assertive.
Jamie: What changed in the responsibilities?
Alex: Before, the responsibilities included checking interactive elements for correct ARIA roles and verifying that ARIA states match the visual state of components. The added line says to review aria-live regions for appropriate politeness levels on dynamic content updates. That is one clear addition, not a rewrite of the whole agent.
Jamie: And the pull request explanation would say why that gap matters.
Alex: Exactly. It would say that dynamic updates need to be announced to screen readers, and that the agent already checks static ARIA but did not mention live regions. That explanation turns the edit from a preference into a reasoned accessibility improvement.
Alex: The challenge evidence is short, but it should be specific. You will describe the repository, the agent you improved, what you changed, why it is an improvement, and a link to the pull request, branch, or contribution plan.
Jamie: So not just, I updated an agent. More like: I improved this agent, in this repo, by adding this guardrail, because it prevents this kind of bad output.
Alex: Exactly. The evidence should show your judgment. Maintainers need to know the problem you saw and why your fix is scoped well.
Jamie: The criteria are specific, justified, and respectful, right?
Alex: Yes. Specific means change one thing well. Justified means explain why the change helps. Respectful means you are improving an existing design, not treating the original work like it was careless.
Jamie: That respect piece feels important in open source.
Alex: It is. Maintainers are more likely to engage when the pull request shows care for the project, its conventions, and its users.
Jamie: How much testing should someone do for a text-only agent change?
Alex: Do a practical check. Open the repository in VS Code or github.dev, read the edited file from top to bottom, and make sure the instructions still make sense. If you have Copilot Chat available, run the agent with a small prompt and see whether the output reflects your change.
Jamie: For example, if I added a live region responsibility, I could ask it to review a component with a status message that updates after a form submission.
Alex: Exactly. Then compare the output against what you know manually. Does the agent notice the dynamic update? Does it avoid making unsupported claims? Does it suggest a reasonable fix?
Jamie: And if the output gets worse?
Alex: Narrow the instruction. A lot of agent problems come from language that is too broad. You can improve reliability by adding a guardrail, giving an output format, or saying when the agent should ask for more context instead of guessing.
Jamie: Where do the different platforms fit here?
Alex: Use the platform that lets you work comfortably and verify the change. GitHub Copilot Chat in VS Code is the most common workshop path, and the VS Code Agents window can help manage agent sessions. Some teams use GitHub.com task mode, Claude Code, Gemini CLI, Claude Desktop, or other supported tools. The important repo detail is that custom agents usually live with the project, often under .github slash agents, so the instructions can travel with the repository.
Jamie: What if every agent looks perfect?
Alex: Read for clarity, scope, and guardrails. Ask whether a new contributor would understand what the agent can do, what it should not do, and what kind of output to expect. A small clarification is fine when it helps future users.
Jamie: What if I am not sure my change really counts as an improvement?
Alex: Try to explain it in one sentence. If you can say who benefits and what confusion or risk it reduces, you probably have a valid improvement. If you cannot explain it, keep reading until you find a clearer gap.
Jamie: And if I need to check current facts?
Alex: Use the current project docs, official GitHub Docs, GitHub Copilot docs, VS Code docs, and the GitHub Changelog when platform behavior matters. Counts, feature names, and platform support can change, so avoid baking fragile numbers into your contribution unless you have just verified them.
Jamie: After review, do I need a merged pull request to count this bonus?
Alex: No. A merged pull request is wonderful, but workshop evidence can be a pull request, a review-ready branch, or a contribution plan. For Challenge 16, the Capstone Project, those same kinds of review-ready drafts and plans are also valid when they show purpose, responsibilities, guardrails, and a meaningful repository impact.
Jamie: Let me see if I have it. Bonus A asks me to choose an existing agent, understand its current instructions, make one focused accessibility-related improvement, and explain the value clearly.
Alex: That is it. Browse first, pick carefully, change one thing, test enough to trust it, and leave a reviewable trail. If your work helps an agent become clearer, safer, or more useful for real accessibility workflows, you have done the work this bonus is asking for.
54. Challenge bonus-c: Group Challenge
Collaborative contribution, division of work, and communication across a small team.
Practice focus: Bonus
Download Challenge bonus-c (MP3)
Read Transcript - Challenge bonus-c: Group Challenge
Transcript
Alex: Welcome back. Bonus C is called Group Challenge, and it asks you to design a collaborative challenge for future workshop cohorts.
Jamie: So the assignment is not just, work in a group. It is, design something that would make a group work well.
Alex: Exactly. You are creating the exercise, not merely completing one. The goal is to practice collaborative contribution, division of work, and communication across a small team.
Jamie: And this is part of the bonus path that opens after Challenge 15, right?
Alex: Right. Completing Challenge 15 unlocks Challenge 16, called Capstone Project, plus Bonus Challenges A through E. The capstone can involve the Accessibility Agents living catalog, GLOW, or another meaningful repository, and a review-ready draft or contribution plan can count there. Bonus C is one option inside that unlocked path.
Jamie: What is the learner actually making for Bonus C?
Alex: A written challenge design that 3 to 5 students could complete together. It should teach teamwork, not just split a task into unrelated pieces.
Jamie: So the output is a file, not a finished app or a finished accessibility fix.
Alex: Yes. You are documenting a reusable exercise in your Learning Room repository. That repository is provisioned for each learner, and it is also where the Day 1 issue, branch, commit, pull request, and merge practice happens.
Jamie: That helps. The Learning Room is the safe place to leave the design and show your work.
Alex: Exactly. Future cohorts should be able to open your file, understand the challenge, and know how the team would prove they finished.
Jamie: I think the hardest part is choosing a collaboration problem. What makes a good one?
Alex: Start with a task that one person could not easily do alone, or at least should not do alone if you want a better result. The work should create a reason for people to coordinate, compare findings, review each other, or depend on shared decisions.
Jamie: What is the difference between real collaboration and parallel solo work?
Alex: Parallel solo work is five people each editing a separate paragraph and never needing to talk. Real collaboration has shared judgment. Maybe the team has to prioritize issues, agree on standards, review fixes, or hand off work from one role to another.
Jamie: So five separate tasks can still be collaborative if the pieces affect each other.
Alex: Yes. If one person's finding changes what another person fixes, or the team has to agree on success criteria, the design starts to feel like a group challenge.
Jamie: And the accessibility note needs to be real, not just a sentence that says, this is accessible.
Alex: The file path is specific: create `docs/group-challenges/YOUR-USERNAME-challenge.md` in your Learning Room repository.
Jamie: That path matters because it gives everyone the same place to look.
Alex: Exactly. At the top of the file, add a clear title and a short summary. Then include the required parts: title, goal, team size, time estimate, instructions, success criteria, and an accessibility note.
Jamie: Success criteria is the part that answers, how do teams know they are done?
Alex: Yes. For example, done might mean each person filed one issue, each person opened one pull request, the group reviewed all pull requests, and the final README explains what changed.
Jamie: And the accessibility note explains how people using different tools can participate.
Alex: Right. It might mention keyboard access, screen reader-friendly instructions, clear file names, text alternatives for visual evidence, or allowing people to use GitHub.com, VS Code, or another accessible workflow.
Jamie: Then the GitHub part is still the usual contribution path.
Alex: Yes. Commit your file, push your branch, and open a pull request. In the challenge issue, the evidence field asks you to describe your group challenge and link to the file.
Jamie: The reference solution gives an example called Accessibility Audit Relay, which is a nice name because you can hear the handoff in it.
Alex: It is designed for 3 to 5 students auditing a sample web page for accessibility issues. Each person has a focus area, so no one has to inspect everything.
Jamie: Walk me through the roles.
Alex: One student checks images for meaningful alt text. Another reviews heading order, like H1, H2, and H3. Another tests whether link text is descriptive instead of vague text like "click here." A fourth checks color contrast, and a fifth, if present, reviews keyboard navigation order.
Jamie: Where does the relay part show up?
Alex: The group starts from a sample repository with a deliberately imperfect HTML page. Each student creates a branch for their focus area, files issues for the problems they find, discusses priorities with the team, submits a pull request fixing at least one issue, and reviews someone else's pull request.
Jamie: So the evidence is not just, I was present.
Alex: Right. Each student can post the issues they filed, the pull request they opened, and one review they gave.
Jamie: That works because everyone has a role, the roles connect, and the final page is genuinely better.
Alex: Exactly. The strongest designs have clear roles, concrete deliverables, and a reason for people to work together instead of merely working nearby.
Jamie: This challenge leans on GitHub Flow, even though the learner is designing an exercise.
Alex: It does. GitHub Flow is the lightweight branch-and-pull-request workflow used throughout the workshop: branch from main, make a focused change, commit it, open a pull request, discuss and review, pass checks, and merge.
Jamie: Can you say why one branch per task keeps coming up?
Alex: A small branch makes the pull request easier to understand and review. If the branch changes one thing, reviewers can tell what happened, authors can respond faster, and the team can merge with more confidence.
Jamie: And Git Flow is a different model with more branch types.
Alex: Yes. Git Flow often uses long-lived main and develop branches, plus feature, release, and hotfix branches. It can make sense for scheduled releases, mobile apps, firmware, or enterprise products. This workshop uses GitHub Flow because open source learning work benefits from a simpler path.
Jamie: So for Bonus C, keep the designed workflow small, reviewable, and easy to explain.
Alex: Exactly. If your challenge needs a branching diagram that takes ten minutes to explain, it is probably too complex for this purpose.
Jamie: What about keeping work current? Some group designs might use forks or a shared sample repository.
Alex: If a fork is part of the exercise, sync before creating a new branch, before opening a pull request, and whenever the upstream main branch has changed. In the GitHub web interface, the easiest route is often the "Sync fork" button when GitHub shows one.
Jamie: And the command line version?
Alex: Add the upstream remote once, switch to your main branch, fetch upstream changes, merge `upstream/main` into your main branch, and push the updated main to your fork. GitHub Desktop can also fetch, pull from the upstream default branch, and push the result.
Jamie: Commit messages are part of group communication too.
Alex: They are. Use a concise first line that says what changed, add an optional body if the why needs explanation, and use a footer if you need to reference an issue. Atomic commits help here, because each commit represents one coherent change.
Jamie: Common mistake: one giant commit that says updates.
Alex: Exactly. A better message is specific, like `fix missing alt text on product images` or `docs add keyboard testing instructions`.
Jamie: Group work also brings us back to open source culture.
Alex: Yes. Open source communication is mostly written, asynchronous, and public. That means your comment may be read hours later, by someone in another time zone, using a different language, or catching up through a screen reader.
Jamie: Chapter 8 had learners write a reflection before doing heavier review work.
Alex: Right. That reflection asked for one respectful review habit, one clear way to ask for help, and one constructive way to respond to feedback. If writing is hard, drafting in a text editor first is completely reasonable.
Jamie: So write for the person who arrives later and needs context.
Alex: Exactly. Include the exact step where you got stuck, what you already tried, and what you expected to happen. That makes it easier for someone to help without guessing.
Jamie: What does helpful feedback sound like in a group challenge?
Alex: Start by acknowledging what is working. Then identify the specific concern, explain why it affects the project, suggest a path forward when you can, and make clear whether the concern is blocking or just a suggestion.
Jamie: Tone matters a lot when comments are public.
Alex: Use "we" language or describe the code instead of judging the person. If you are uncertain, say so. If a comment sounds sharp, rewrite it into something specific and useful before posting.
Jamie: Accessibility issues can feel personal because they affect real people.
Alex: Yes. Describe the barrier, the context, and any assistive technology involved when relevant. Avoid blaming the author, and focus on how the experience can be improved.
Jamie: The repo's README and community health files help too.
Alex: They do. A README should explain the project, installation, usage, contributing, license, and any accessibility notes. CONTRIBUTING, code of conduct, security, and license files set expectations for participation, safety, and reuse.
Jamie: Channel choice matters too.
Alex: Use issues for tracked tasks, pull request comments for a specific change, discussions or chat for broader questions, and urgency markers only when something is truly urgent. A good first issue is also a social promise: the task should be scoped, welcoming, and supported.
Jamie: Commenting etiquette is where groups can get messy.
Alex: Keep comments focused, do not pile on when someone already raised the point, and resolve conversations when the concern has been addressed. Reactions are useful for simple agreement, so not every agreement needs another full comment.
Jamie: Saved replies can help, especially if typing the same accessible review phrasing over and over is tiring.
Alex: Yes. A saved reply can hold a polite review template, an accessibility testing reminder, or a standard request for reproduction steps. You can create one in GitHub settings and insert it from the comment editor when needed.
Jamie: Reviewers have responsibilities too.
Alex: Review the change, not the person. Ask questions instead of making demands, distinguish opinion from requirement, avoid gatekeeping knowledge, and approve explicitly when the work is ready.
Jamie: Authors have responsibilities on the other side.
Alex: Say thank you, do not take feedback as a personal attack, explain your choices, and surface blockers early. If you disagree with a decision, respond with evidence and ask what tradeoff the maintainer is prioritizing.
Jamie: And if the feedback is harsh or someone is rude?
Alex: Pause before replying, answer the specific technical points, and ask a facilitator or maintainer for help if the conversation stops being respectful. If you accidentally cause offense, acknowledge it, clarify your intent, and adjust your wording.
Jamie: Code review tooling helps with Bonus C because the exercise you design may ask teams to review each other's work.
Alex: In VS Code, the GitHub Pull Requests and Issues extension lets you view pull requests, check out a PR branch, read changed files, create pull requests, and comment without constantly switching to the browser.
Jamie: The setup is Extensions sidebar, search for GitHub Pull Requests, install, and sign in with GitHub.
Alex: Yes. After sign-in, verify that the GitHub section appears in the Explorer sidebar. The Pull Requests panel can show open pull requests, PR details, checks, file changes, and filters such as items waiting for your review.
Jamie: Diffs can be rough when you are listening to them.
Alex: Use the Accessible Diff Viewer in VS Code. Press F7 for the next change and Shift+F7 for the previous change; it announces added and removed lines in a structured way.
Jamie: And if inline commenting in VS Code is awkward?
Alex: Use GitHub.com as the fallback. Open the pull request, go to the Files changed tab, read the diff, and leave the comment there. It is also useful to compare which environment made review easier for you.
Jamie: Formal review verdicts matter too.
Alex: Yes. Approve means the work is ready from your perspective. Request changes means something must be addressed before merge. Comment-only means you have feedback or questions but are not giving a final verdict.
Jamie: What about Copilot during review?
Alex: It can help summarize unfamiliar changes or explain code you do not understand, but verify everything against the actual diff and the project rules. It should support your judgment, not replace it.
Jamie: If learners create the Bonus C pull request from VS Code, what should they watch for?
Alex: Use the Command Palette to create the pull request, then fill in a clear title and description. Confirm the base branch target and compare branch source, and add reviewers, labels, milestone, or draft status if the workflow asks for them.
Jamie: Templates may appear in the PR form too.
Alex: Yes. A pull request template might ask for description, related issue, type of change, testing, checklist items, and screenshots if applicable. Fill it out with enough detail that a reviewer can understand the purpose without opening every file first.
Jamie: And merging belongs after review and checks, not before.
Alex: Right. A maintainer can merge with the project's chosen strategy, such as a default merge or squash and merge, and then delete the feature branch if appropriate. After merging, switch back to main and pull the latest changes.
Jamie: Troubleshooting is part of the skill too.
Alex: If the extension says "No pull requests found," check the filter. If creation fails, confirm your branch is pushed and you have permission. If authentication fails, sign in through the browser, reload VS Code, and try again.
Jamie: What counts as completing Bonus C?
Alex: Your challenge issue has a required evidence field. Fill it with the challenge name, a short description of what teams would do, and a link to your file.
Jamie: And the pull request should contain `docs/group-challenges/YOUR-USERNAME-challenge.md`.
Alex: Yes. The file should be understandable enough for review, even if reviewers suggest improvements. Bonus C is about designing the group challenge clearly.
Jamie: What should a facilitator or reviewer look for?
Alex: Clear roles, concrete deliverables, a team size around 3 to 5, a realistic time estimate, step-by-step instructions, success criteria, and an accessibility note that makes participation possible for people using different tools.
Jamie: If someone cannot think of a challenge, where should they start?
Alex: Look at the other bonus challenges for inspiration and think about a real problem a small team could solve together. For accessibility-specific designs, use reliable references such as official GitHub documentation, the GitHub changelog, WCAG guidance, WAI tutorials, and the ARIA Authoring Practices Guide.
Jamie: So the finished design should feel like an invitation to collaborate.
Alex: Exactly. Give every participant meaningful work, make the handoffs clear, and leave future learners with a challenge they can actually complete together.
55. Episode 49: GitHub Accessibility and Open Source at Scale
Connecting capstone work to GitHub's accessibility program and open source at scale.
Based on: Chapter 21: GitHub Accessibility and Open Source at Scale
Read Transcript - Episode 49: GitHub Accessibility and Open Source at Scale
Transcript
Alex: Welcome back. This one connects your capstone work to something much bigger than a workshop assignment.
Jamie: I like that framing, because by the end of a capstone, it can feel like, okay, I made the thing, I submitted the thing, and now what?
Alex: Exactly. The important part is that you practiced habits that real accessibility work depends on. You identified a user need, described a barrier or opportunity, proposed a focused change, tested or explained what happened, and invited review.
Jamie: So the capstone is not just proof that someone followed instructions. It is proof that they can make an accessibility contribution that another person can understand and evaluate.
Alex: GitHub describes its mission as accelerating human progress through developer collaboration. That is a big statement, but accessibility makes it practical: who gets to collaborate, who gets to build, and who gets to benefit.
Jamie: And the scale is huge. GitHub's accessibility program talks about enabling about 1.3 billion people with disabilities to benefit from and contribute to that progress.
Alex: Right. Accessibility is not a side quest or a nice extra. It is part of belonging in open source, because open source depends on people being able to show up, learn the tools, report problems, propose changes, and take part in decisions.
Jamie: That lands. If the tools, docs, events, or contribution paths exclude people, then the project is not really open to everyone.
Alex: GitHub describes four strategic accessibility priorities, and the first one starts inside the company. Supporting employees with disabilities means improving the everyday systems people use to do their jobs.
Jamie: So accessibility starts with the people building and maintaining the platform, not only with external users.
Alex: Yes. That includes required accessibility training for GitHub teams, improvements to internal tools and systems, and support for employee communities such as NeuroCats and AccessCats.
Jamie: And it includes accommodations and career growth too, right? Because access is not only about whether a button has a label. It is also about whether disabled employees can do meaningful work and advance.
Alex: The second priority is developers with disabilities. GitHub says every developer should feel welcome and be able to use GitHub products, documentation, training, support, events, and community spaces.
Jamie: That is broader than the website interface. It includes the whole experience around becoming a developer and staying active as one.
Alex: Exactly. Accessibility is listed as a GitHub Fundamental, which means product teams have clear expectations, testing requirements, and processes. There is also accountability through GitHub Fundamentals scorecards, along with regular audits and compliance tracking.
Jamie: I appreciate that word, accountability. Good intentions matter, but people also need checks, standards, and follow-up.
Alex: The third priority is customers building on GitHub. This is about sharing tools and practices so organizations can improve accessibility in their own work.
Jamie: What kinds of tools are we talking about?
Alex: One example is a Figma annotation toolkit for accessible design collaboration. GitHub also points to patterns for accessible README files, contributing guides, and issue templates, which lines up with a lot of what learners practiced earlier.
Jamie: And there is a scanner too, right?
Alex: Yes. The GitHub Accessibility Scanner is an action you can add to your repository's continuous integration checks. Continuous integration, or CI, is the automated process that runs checks when code changes, so accessibility issues can be caught earlier instead of waiting for a manual review at the end.
Jamie: There is also the Copilot angle: writing accessibility-focused custom instructions so AI assistance nudges people toward better audits, clearer findings, and more useful fixes.
Alex: The fourth priority is open source at scale. GitHub has pledged to help improve accessibility across open source, not just inside one product or one team.
Jamie: That sounds ambitious, but also necessary. Open source is where so many tools, libraries, templates, and learning paths begin.
Alex: The pledge includes empowering people with disabilities to contribute to open source projects, increasing free and open source assistive technologies, improving the accessibility of mainstream open source projects, and providing resources, tools, and guidance to maintainers.
Jamie: So the goal is not only better software for disabled people. It is also more disabled people shaping the software everyone uses.
Alex: This is where your capstone evidence habits connect directly. A strong accessibility contribution usually makes the need visible, explains the barrier, proposes a change that is small enough to review, and gives maintainers a way to respond.
Jamie: And in the current capstone, that contribution can happen in Accessibility Agents, GLOW, or another meaningful repository. Accessibility Agents is a living catalog, so it can grow over time, but it is not the only valid target.
Alex: Right. Review-ready drafts and contribution plans can also count as valid evidence when they are clear and actionable. That matters because real accessibility work often starts before a merge: with research, issue writing, test notes, design changes, or a plan a maintainer can trust.
Jamie: So a learner should not hear, if it did not merge, it did not matter. The evidence can still show professional judgment and real contribution value.
Alex: The bigger reason this matters is that these habits scale. If thousands of projects receive clearer accessibility issues, better test notes, more focused pull requests, and more respectful review conversations, open source starts to change.
Jamie: And it changes what people expect. Accessibility becomes part of normal engineering work instead of a special cleanup phase later.
Alex: It also changes who has a voice. Contributors with disabilities, and contributors with accessibility expertise, bring lived experience and technical insight into tool design, documentation, issue triage, and review.
Jamie: That is a powerful shift. The work is not separate from engineering. It is engineering, with more people included in the process.
Alex: After the workshop, the reference episodes go deeper into optional tools and advanced workflows. They are useful, but the most important pattern is already in your hands.
Jamie: Find a real need, communicate clearly, make a focused change, and leave enough evidence that someone else can review it.
Alex: When you need current facts, go back to official sources: GitHub's documentation, the changelog on the GitHub Blog, and the GitHub Accessibility site. Product details change, so checking the source keeps your contribution accurate.
Jamie: And that is especially important with accessibility tools, because a stale instruction can become a barrier for the next contributor.
Alex: Exactly. The real work continues in real repositories: finding issues, collaborating with maintainers, reviewing code, building tools, and making accessibility visible in everyday project decisions.
Jamie: Which is a good place to end. The capstone was not the finish line. It was practice for the kind of open source work that matters every day.
Reference and Next Steps
56. Episode 20: Accessibility Standards Reference
WCAG 2.2, ARIA roles, and the PR accessibility checklist.
Based on: Appendix M: Accessibility Standards Reference
Read Transcript - Episode 20: Accessibility Standards Reference
Transcript
Alex: Welcome back. Today we're using Appendix M as a practical reference for accessibility standards: WCAG 2.2, ARIA, and the checks that belong in a pull request review.
Jamie: I like the word reference there, because standards can feel huge. Are learners supposed to memorize criterion numbers?
Alex: No. The useful habit is knowing where to look when a review mentions something like WCAG 1.4.3 or name, role, value. This appendix pairs especially well with the open source culture chapter and the VS Code accessibility chapter, because it turns accessibility values into reviewable requirements.
Jamie: So when a maintainer says the focus indicator does not meet WCAG, I do not panic. I look up the criterion, understand the requirement, and check the change against it.
Alex: WCAG stands for Web Content Accessibility Guidelines. It is the main standard used to evaluate accessibility on the web, and WCAG 2.2 is organized around four principles, often remembered as POUR.
Jamie: Perceivable, Operable, Understandable, and Robust, right?
Alex: Right. Perceivable means people can access the information in a way that works for them, like an image having useful alt text. Operable means controls and navigation can actually be used, like a button working from the keyboard, not only on mouse hover. Understandable means the interface and messages make sense, such as an error that explains what needs fixing. Robust means the code can be interpreted reliably by browsers and assistive technologies.
Jamie: That last one is where custom widgets can get risky. Something may look like a menu or button visually, but if the code does not expose what it is, a screen reader may not have enough information.
Alex: Exactly. Every WCAG success criterion fits under one of those four principles. The learning cards in the appendix turn that into practical habits: use POUR while reviewing, use find to jump to criterion numbers, and keep contrast and ARIA pattern references close by.
Jamie: What about the levels? I see A, AA, and AAA in accessibility conversations, and I always wonder how much weight each one carries.
Alex: Level A is the baseline. It addresses severe barriers, such as missing keyboard access or missing text alternatives. Level AA goes further and is the usual target for compliance in government, enterprise, and many open source projects. Level AAA is the highest level, but it is not usually required across an entire project.
Jamie: So if I am filing a bug or reviewing a pull request, WCAG 2.2 AA is usually the level I should expect to work with.
Alex: Yes. If a project has its own policy, follow that, but AA is the standard you will most often cite. It is specific enough to guide a review without asking every project to meet every AAA requirement everywhere.
Alex: The criteria developers run into most often are not obscure. Under Perceivable, you will see non-text content, info and relationships, meaningful sequence, sensory characteristics, use of color, contrast, resize text, reflow, and non-text contrast.
Jamie: That is where low vision checks show up a lot. Text needs enough contrast, user interface parts need enough contrast, and content should still work at high zoom without forcing horizontal scrolling.
Alex: Exactly. Operable includes keyboard access, no keyboard traps, skip links or other ways to bypass repeated navigation, descriptive page titles, logical focus order, useful link text, clear headings and labels, visible focus, the WCAG 2.2 focus appearance requirement, and label in name.
Jamie: Label in name is the one where the accessible name should include the visible label, yes? So if a button visibly says Save, voice control and screen reader users should not get a totally different name.
Alex: Yes. Understandable includes the page language, no unexpected changes on focus or input, clear error identification, labels or instructions for form fields, and suggestions when an error can be corrected. Robust includes valid markup that assistive technology can interpret, name role value for interface components, and status messages that are announced without moving focus.
Jamie: That makes the criteria feel less like legal codes and more like review questions. Can I perceive it? Can I operate it? Can I understand it? Can assistive technology understand the code?
Alex: ARIA stands for Accessible Rich Internet Applications. It fills gaps when native HTML does not fully describe a complex interactive control.
Jamie: And ARIA has roles, states, and properties. Can you separate those in plain language?
Alex: A role says what the thing is, such as button, dialog, tab, navigation, or status. A state says what condition it is currently in, such as aria-expanded false, aria-checked true, or aria-disabled true. A property gives a stable detail, such as aria-label, aria-required, or aria-describedby.
Jamie: The part I hear people get wrong is assuming ARIA magically makes something accessible.
Alex: It does not. Use native HTML when it works, because a real button already has the right role and keyboard behavior. If you add an ARIA role to a custom element, you must also provide the matching keyboard interaction, like Enter and Space for a button. And ARIA changes what assistive technologies can read; it does not add visual styling or behavior by itself.
Jamie: Landmarks are another ARIA topic that comes up a lot for screen reader users. What are they doing?
Alex: Landmarks identify major page regions so someone can jump around efficiently. Common ones include banner for a site header, navigation for navigation links, main for the primary content, complementary for supporting content, contentinfo for a footer, search for search tools, form for an important form, and region for a named area that needs to be discoverable.
Jamie: So a page is not just a long stream of text and controls. It has named areas that can be navigated.
Alex: Yes. On GitHub and many web apps, screen reader users may move by landmarks using commands in NVDA, JAWS, or the VoiceOver Rotor. Good landmarks help someone move straight to the main content, the navigation, or a form without listening through everything in between.
Jamie: The appendix also shows common ARIA patterns. Let's talk through the ones a contributor is likely to touch.
Alex: First, the accessible button pattern when a native button cannot be used. You would need the button role, a keyboard focus target, a clear accessible name, and JavaScript support for Enter and Space. But the better question is always whether you can use a real button element instead.
Jamie: Then forms with errors. This one matters because error messages often get added late, and late fixes are where accessibility details disappear.
Alex: A good form field has a programmatic label, instructions when needed, and an error message connected to the field, often with aria-describedby. The field can use aria-invalid true when the value is invalid. The error text should say what is wrong and, when possible, how to fix it.
Jamie: Live regions are for updates that happen without a page reload, right? Like Saved, Item added, or Results loaded.
Alex: Yes. A polite live region, such as role status or aria-live polite, lets assistive technology announce the update without moving focus. Assertive announcements should be rare, because they interrupt what the person is already hearing. For expandable sections, the control should usually be a button with aria-expanded, often connected to the panel with aria-controls, and the state needs to change when the section opens or closes.
Jamie: That gives reviewers something concrete to inspect: the control, the name, the state, the keyboard behavior, and the announcement.
Jamie: Where do these standards show up in GitHub work? Not just building web apps, but actual contributions.
Alex: They show up when you file accessibility bugs, review pull requests, and write documentation. Standards help you describe the problem in a way maintainers can act on.
Jamie: For a bug report, what should I include?
Alex: Include the page or component, the steps to reproduce, what you expected, what actually happened, and the assistive technology or browser setup if it matters. If you know the relevant criterion, cite it. For example, a missing focus indicator might reference WCAG 2.4.7, and weak text contrast might reference WCAG 1.4.3.
Jamie: And in code review, I should not only ask whether the feature works visually.
Alex: Right. Review keyboard access, focus order, visible focus, contrast, form labels, error messages, status announcements, semantic HTML, and whether any ARIA used is actually needed and implemented correctly.
Jamie: Documentation has accessibility standards too, even if there is no widget involved.
Alex: Yes. Use clear headings, meaningful link text, useful alt text for images, plain instructions that do not rely only on color or position, and code examples that do not teach inaccessible patterns.
Jamie: Testing is where a lot of people either overtrust tools or feel like they have to test everything manually forever.
Alex: Automated tools are helpful, but they usually catch only about 30 to 40 percent of accessibility issues. They can flag missing alt text, some contrast failures, missing form labels, and certain ARIA mistakes. They cannot reliably tell whether alt text is meaningful, whether focus order feels logical, or whether an error message is actually helpful.
Jamie: So the remaining work is manual testing, but it can still be systematic.
Alex: Yes. Use the keyboard only. Check that focus is visible and moves in a sensible order. Zoom to 200 percent and 400 percent where relevant, check reflow, test contrast, listen with a screen reader when possible, and verify dynamic updates like saved messages or validation errors.
Jamie: The learning cards are useful here too. Different users will notice different risks first.
Alex: Exactly. Screen reader users may rely on find, landmarks, headings, and criterion numbers. Low vision users may focus on contrast, zoom, reflow, and readable tables. Sighted reviewers may scan examples and pattern demos, but still need to test with keyboard and structure, not just appearance.
Jamie: Before a pull request gets merged, what belongs on the accessibility checklist?
Alex: Check that images and icons have text alternatives when needed. Check that headings, lists, tables, and labels are coded as structure, not just styled to look that way. Check that color is not the only signal, contrast meets the relevant ratios, keyboard access works, focus order makes sense, focus is visible, status messages are announced, and ARIA is not being used to cover up avoidable HTML problems.
Jamie: And the review comment should include what was tested, not just a vague looks good.
Alex: Yes. A helpful review might say that keyboard navigation was tested, focus remained visible, form errors were announced, and contrast passed for the changed colors. If something fails, cite the criterion when you can and describe the user impact in plain language.
Jamie: For official references, the safest sources are the W3C WCAG 2.2 recommendation, WAI-ARIA 1.2, the WCAG Quick Reference, WAI tutorials, the ARIA Authoring Practices Guide, and tools like the WebAIM Contrast Checker.
Alex: That is also why the appendix connects each topic back to authoritative references. You do not have to carry the whole standard in your head. You need to know how to connect a real contribution, a real test result, and the standard that explains why the fix matters.
57. Episode 25: Releases, Tags, and Insights
Semantic versioning, GitHub Releases, and repository analytics.
Based on: Appendix S: Releases, Tags, and Insights
Read Transcript - Episode 25: Releases, Tags, and Insights
Transcript
Alex: Welcome back. Today we're looking at two parts of GitHub that help you understand where a project has been and where your work may show up later: releases and repository Insights.
Jamie: I like that pairing, because releases feel very official, and Insights can feel a little mysterious. Both can answer the question, is this project active, and where do my contributions fit?
Alex: Exactly. A release is about a versioned snapshot. Insights are about activity, participation, traffic, dependencies, and other signals that help you read the health of a repository.
Jamie: So we're not just clicking around. We're learning how maintainers communicate progress, and how contributors can tell what is happening.
Alex: A release is a named snapshot of a repository at a specific point in history, packaged and published for users. In a software project, it usually has a version number, release notes, download links for packaged files if the project has them, and source code archives that GitHub creates automatically.
Jamie: And for a documentation project, or a curriculum repo, a release might not include an app download at all. It might just mark a stable version of the material.
Alex: Right. When your pull request gets merged, your change becomes part of the default branch. It does not automatically mean a release goes out that same minute. Your work is included in the next release when the maintainer decides to publish one.
Jamie: That timing can vary a lot, then. Some projects release every few days, some every few weeks, and some only when there is enough meaningful change.
Alex: Yes. That pattern is called release cadence, which just means the project's usual rhythm for publishing versions.
Jamie: The part that used to confuse me was the difference between a branch, a tag, and a release. They all point at code, but not in the same way.
Alex: A branch is a movable pointer. As commits are added to that line of work, the branch moves forward. A Git tag is a named pointer to one specific commit. Once you use it to mark version v2.1.0, it should keep pointing to that exact commit.
Jamie: So a tag is like saying, this commit is the one we mean when we say v2.1.0.
Alex: Yes. There are two common kinds of tags. A lightweight tag is basically just the name pointing to the commit. An annotated tag stores extra metadata, such as the tagger, date, and a message, and it can be signed in some workflows.
Jamie: And a GitHub Release sits on top of that tag.
Alex: Exactly. Every GitHub Release is backed by a tag. A tag without a release is still useful as a marker in Git history. When you create a release in GitHub, GitHub can create the tag for you if it does not already exist.
Jamie: Let's talk about finding releases, because GitHub pages can have a lot going on.
Alex: From a repository home page, the Releases area is usually in the right sidebar. It may show the latest version and a link to the full releases page. You can also go directly to github.com/owner/repo/releases if you know the owner and repository name.
Jamie: At high zoom, that right sidebar may not feel like a sidebar anymore. It can move below the main content, so scrolling down is worth trying.
Alex: For screen reader navigation, start on the repository home page and use heading navigation to find the Releases heading. Some people use H, or jump by heading level if their screen reader supports that. Then Tab or use link navigation to reach the version link or the link that says how many releases exist.
Jamie: Once you're on the releases list, each release behaves like its own section. Headings are your friend there.
Alex: Yes. A release entry usually has a title, often the version number, a badge such as Latest or Pre-release, a publication date, the tag name, the release notes, and asset downloads if the project attached any. GitHub also provides source code downloads as zip and tar.gz archives.
Jamie: The badge language is helpful. Latest usually means the newest stable release, while Pre-release tells you it may be an alpha, beta, or release candidate.
Alex: And if you are scanning links, listen for asset names, compare links, tag links, and source code archive links. If there are compiled binaries, installers, or other packaged files, they usually appear in the assets area.
Jamie: Version numbers look simple until you have to decide what they mean. What is semantic versioning?
Alex: Semantic versioning, often shortened to semver, uses three numbers: major, minor, and patch. You will usually see it written as something like v2.1.3. The first number is major, the second is minor, and the third is patch.
Jamie: So v2.0.0, v2.1.0, and v2.1.3 are telling different stories.
Alex: v2.0.0 usually signals a major release, where breaking changes are possible. v2.1.0 usually means new features were added without breaking existing use. v2.1.3 usually means patch-level fixes, such as bugs fixed after v2.1.0.
Jamie: When should a maintainer bump each number?
Alex: Bump major when existing users may have to change how they use the project. Bump minor when you add backward-compatible features. Bump patch when you fix something without changing the public behavior in a breaking way.
Jamie: And then there are suffixes like alpha, beta, and rc.
Alex: Right. v2.1.0-alpha.1 is an early preview. v2.1.0-beta.2 means the feature set is closer but still being tested. v2.1.0-rc.1 means release candidate, which is nearly final unless testing finds a problem.
Jamie: Release notes are where the version number becomes readable. What should I listen for when I open them?
Alex: Good release notes group changes into categories. You might hear Breaking Changes, New Features, Bug Fixes, and Dependencies. A note might say a preferences file format changed, a new command was added, keyboard navigation was fixed, or a dependency was updated.
Jamie: That is much easier than one giant paragraph of commit messages.
Alex: Definitely. Many release notes also include issue or pull request numbers and usernames. For example, a bug fix might reference number 51 and credit the contributor who opened or merged it.
Jamie: And the Full Changelog link is where a contributor can go looking for their own merged pull request.
Alex: Yes. That link usually opens a comparison between two tags, such as v2.0.0 to v2.1.0. It shows the merged pull requests and commits between those versions, so you can confirm whether your work is part of that release window.
Jamie: What changes when you're the maintainer, or you're helping prepare a release?
Alex: Then you may create the release yourself. In GitHub, you can go to github.com/owner/repo/releases/new. The form asks for a tag, a target branch, a release title, release notes, optional assets, and choices about draft or pre-release status.
Jamie: If the tag does not exist yet, GitHub can create it when the release is published, right?
Alex: Yes. You type a new version tag, such as v2.1.0, or choose an existing tag. The target branch is usually main, because that is the branch you want the version to mark. The title is often the same as the tag.
Jamie: And the notes can be written by hand, or GitHub can generate release notes from merged pull requests since the last release.
Alex: Exactly. Auto-generated notes are a useful starting point, especially when pull request titles are clear. You can also attach assets such as binaries, installers, PDFs, or any packaged files users need to download.
Jamie: Draft and pre-release sound similar, but they are not the same thing.
Alex: A draft release is saved but not published to users yet. A pre-release is published, but marked as not final, which is useful for alpha, beta, or release candidate versions. You can have a draft that later becomes a stable release, or a draft that later becomes a pre-release.
Jamie: The appendix also mentions Accessibility Agents for release notes. How should learners treat that?
Alex: The Accessibility Agents collection is a living catalog, so available commands may grow or change over time. If your environment includes the /draft-release agent, it can help prepare structured release notes from merged pull requests. It does not replace maintainer judgment, but it can save time and improve consistency.
Jamie: What would that output usually include?
Alex: It can group changes under headings like New Features, Bug Fixes, and Dependencies, and include pull request numbers or contributor names when available. A maintainer should still review it for accuracy, remove noise, and call out breaking changes clearly.
Jamie: Now let's move from releases to Insights. What is the Insights tab actually for?
Alex: Insights is GitHub's area for repository activity and health signals. It can show recent activity, contributors, traffic, commits over time, code frequency, dependency information, forks, network activity, and community standards.
Jamie: Can everyone see all of that?
Alex: Not always. On public repositories, many activity views are visible to anyone, but some areas, especially traffic or security-related information, may require maintainer or collaborator access. On private repositories, visibility depends on your access to that repository.
Jamie: And Insights does not show everything people might imagine.
Alex: Correct. It is not a private analytics dashboard for individual visitors. It does not tell you every person who viewed a page. It gives aggregated repository signals, and some of those signals are limited to recent time windows.
Jamie: How do you get there?
Alex: Open the repository and find the top navigation bar with tabs like Code, Issues, Pull requests, Actions, and Insights. Activate Insights, then use the Insights sub-navigation to choose Pulse, Contributors, Traffic, Commits, Code frequency, Dependency graph, Network, Forks, or Community standards when those pages are available.
Jamie: Pulse is a good first stop because the name is pretty literal. It tells you whether the project has a pulse.
Alex: Pulse summarizes recent activity over a selected period. You may find recently opened and closed issues, merged pull requests, open pull requests, commits, releases, and other activity counts.
Jamie: As a contributor, I would use that to ask, is anyone reviewing things, merging things, and responding to issues?
Alex: Exactly. A project with recent merges and issue activity may be easier to engage with. A quiet project is not necessarily bad, but it changes your expectations. You might write a more patient contribution plan, or check whether maintainers have posted guidance.
Jamie: Charts and graphs can be awkward with audio output. What is a practical way to read them?
Alex: Use headings, tables, lists, and nearby text before trying to interpret the visual shape. Many GitHub Insights pages have accessible labels or data summaries, but not every chart gives the same experience. If the graph is hard to understand, look for counts, dates, contributor names, and links around it.
Jamie: The Contributors view answers a different question: who builds this project?
Alex: Yes. It shows contributor activity, often with a graph and a table or list of contributors. You may hear names, commit counts, and activity over time. The table or list is usually more useful than the chart if you're relying on speech output.
Jamie: For a new contributor, why does that matter?
Alex: It helps you understand whether the project has one main maintainer, a small active group, or a broad community. If one person does most of the work, be thoughtful about review time. If many people contribute, look for patterns in how pull requests are labeled, reviewed, and merged.
Jamie: Traffic sounds more like a maintainer feature.
Alex: It often is. Traffic can show clones, views, unique cloners, unique visitors, referring sites, and popular content, depending on your permissions and the repository. It helps maintainers understand how people find and use the project.
Jamie: But it is not a popularity contest.
Alex: Right. A sudden increase in views might mean a blog post linked to the repo, a release got attention, or users are looking for installation help. Referring sites can tell maintainers where people are coming from, and popular paths can show which docs or files need extra care.
Jamie: There are several other Insights pages that sound technical but are useful once you know what question they answer.
Alex: Commits shows commit activity over time, and Code frequency shows lines added and removed across the repository's history. Big spikes can reflect a migration, generated files, a cleanup, or a major feature. They are clues, not automatic proof of quality.
Jamie: The Dependency graph is the one I connect with security work.
Alex: Yes. The Dependency graph shows the packages or libraries a project depends on, when GitHub can detect them. Dependabot can use that information to alert maintainers about vulnerable dependencies and, when configured, open pull requests to update them.
Jamie: Network and Forks are about copies and relationships between repositories.
Alex: The Forks page shows who has forked the project. The Network view can help you see branch and fork relationships, especially when work has happened outside the main repository. For contributors, it can reveal whether a project has active downstream experimentation.
Jamie: Community standards feels less like analytics and more like a readiness checklist.
Alex: That is a fair reading. It looks for files and practices such as a README, license, contributing guide, code of conduct, issue templates, and security policy. If those are present and clear, a new contributor has a better chance of understanding how to participate.
Jamie: So if I am assessing a project, I should not rely on one number or one graph.
Alex: Exactly. Read the latest release to see what has shipped. Check release notes to understand the kind of work being published. Use Pulse and Contributors to see whether people are active, then use Traffic, Dependencies, Network, Forks, and Community standards when you need a fuller picture.
Jamie: And if I am looking for my own contribution, I trace it from pull request, to merge, to the default branch, to a tag, to a release, and maybe to the comparison link between releases.
Alex: Yes. That path turns a merged pull request into a published version you can point to. It is also a good reminder that open source work continues after the merge button. Packaging, notes, versions, downloads, and project health signals all help users trust the work.
Jamie: That makes releases and Insights feel less like extra tabs and more like part of the collaboration story.
Alex: That's the takeaway. Tags mark exact commits, releases explain and package those moments, and Insights help you read the life of the repository around them.
58. Episode 28: Branch Protection and Rulesets
Required reviews, status checks, rulesets, and diagnosing blocked merges.
Based on: Appendix O: Branch Protection and Rulesets
Read Transcript - Episode 28: Branch Protection and Rulesets
Transcript
Alex: Welcome back. Today we're talking about branch protection and repository rulesets, which are the reason a pull request can look finished and still not be mergeable.
Jamie: That is such a familiar moment. You've written the change, opened the pull request, maybe even fixed feedback, and then the Merge button is disabled. It can feel like GitHub is just saying no.
Alex: Usually it is saying not yet, and it is giving you clues. A branch protection rule is a set of requirements that must be satisfied before changes can enter an important branch, usually main.
Jamie: So this is about protecting main from accidental changes, not about making contributors jump through hoops for fun.
Alex: Exactly. Protection can require review, passing tests, signed commits, an up-to-date branch, or a pull request instead of a direct push. Contributors mostly experience those rules in the merge box at the bottom of the pull request, while maintainers and facilitators configure the rules behind the scenes.
Jamie: Let's make the classic version concrete. What are the rules people run into most often?
Alex: The most common one is required reviews. A maintainer can say that a pull request needs one approval, or two approvals, or approval from a code owner before it can be merged.
Jamie: And if someone already approved, but then I push another commit, does that approval still count?
Alex: Sometimes yes, sometimes no. If the repository dismisses stale reviews, a new push withdraws the old approval, because the reviewer approved an earlier version of the work. If a reviewer requested changes, you respond, push the fix, and re-request review.
Jamie: Status checks are the other big one, right?
Alex: Right. A status check is an automated report attached to your commit. It might come from GitHub Actions, or from a third-party continuous integration service, which is software that builds, tests, or scans the project after you push.
Jamie: What names might a learner hear or see in the checks list?
Alex: Common examples are ci / build, ci / test, lint, accessibility-check, CodeQL, and deploy previews from services like Netlify. If a check is required, pending or failing means the merge stays blocked until that check succeeds.
Jamie: Then there is the message about the branch being out of date with the base branch.
Alex: That means main moved after you created your branch, and the repository requires your pull request branch to include the latest main before merging. GitHub may offer an Update branch button, or you may update locally with fetch and rebase if the project allows that and you're comfortable doing it.
Jamie: What about signed commits? That one can sound a little mysterious.
Alex: A signed commit has a verified cryptographic signature, often using GPG or SSH signing. If a repository requires signed commits, every commit in the pull request needs that Verified status, or the pull request cannot be merged.
Jamie: And there are a few rules that shape the history itself.
Alex: Yes. Requiring a linear history means the project does not allow merge commits into that branch, so maintainers usually squash merge or rebase merge instead. A push restriction says only listed people, teams, or apps can push to the branch. A locked branch is stricter: it is effectively read-only, often during a release freeze or for an archived project.
Jamie: Classic branch protection still exists, but GitHub also has repository rulesets. What changed?
Alex: Repository rulesets are the newer, more flexible approach GitHub introduced in late 2023. They can apply rules to patterns of branches or tags, and in organizations they can be managed across multiple repositories from one place.
Jamie: So instead of one rule for one branch in one repo, a maintainer can say, apply this to main, release branches, or version tags.
Alex: Exactly. Classic branch protection is usually single repository, single branch. Rulesets can target patterns like main, release/*, or v*, include bypass lists, show violation insights, and run in Active, Evaluate, or Disabled mode.
Jamie: Evaluate mode sounds useful. Is that like a trial run?
Alex: Yes. It logs what would have been blocked without actually blocking it. That gives maintainers a safer way to test a policy before enforcing it.
Jamie: Where would someone look for rulesets?
Alex: If you have access, you may find them under the repository's Insights tab, then Rulesets, or under Settings, Rules, Rulesets for admins. Contributors often do not have that access, and that's okay, because the pull request merge box still explains what is blocking the merge.
Jamie: If I were configuring one, what would the shape of that workflow be?
Alex: An admin opens repository settings, goes to Rules, creates a new ruleset, gives it a name, and chooses whether it targets branches or tags. Then they add patterns, such as main for the default branch, release/* for release branches, or v* for version tags. After that they choose rules, set enforcement to Active or Evaluate, review any bypass entries, and save.
Jamie: Tag patterns are important because releases are often tied to tags, aren't they?
Alex: They are. A project may protect tags so people cannot delete a release tag or create version tags outside the release process. That is especially helpful when packages, documentation sites, or deployments trust those tags.
Jamie: Let's go back to the contributor experience. The pull request is open, the merge button is unavailable, and the page says reviews are required. What now?
Alex: First, check how many approvals are required and whether a code owner or maintainer needs to review. Use the Reviewers area in the right sidebar to request review if that is appropriate for the project. If changes were requested, respond, push the update, and ask for another look.
Jamie: What if the message says checks have not completed, or checks were not successful?
Alex: Go to the merge box and expand Show all checks if the list is collapsed. Find the failing check, open Details, and read the log for the error. Then fix the underlying problem in your branch and push again, which usually reruns the checks automatically.
Jamie: And if it is just sitting there forever?
Alex: Most workshop and small project checks finish in a few minutes. If a required check stays in progress for a long time, say more than 30 minutes, it may be a runner or service problem, so contact the maintainer. If the same check passes on main but fails on your pull request, assume your change triggered something and read the log carefully.
Jamie: The out-of-date message is less scary once you know what it means.
Alex: Yes. If GitHub shows Update branch, that button merges the latest main into your pull request branch. The local alternative is usually git fetch upstream, then rebase onto upstream/main, followed by a push, but only use that path when you understand the project's expectations around rebasing.
Jamie: And for verified signatures?
Alex: You need to set up commit signing, usually with GPG or SSH signing, then replace the unsigned commits with signed ones. That may mean recommitting, cherry-picking, or asking a maintainer which recovery path they prefer.
Jamie: Sometimes the page just says merging is blocked, which is not very soothing.
Alex: When that happens, read the status lines directly above the merge button. The cause may be missing review, failed checks, an out-of-date branch, required signatures, a locked branch, or a rule that restricts who can push or merge. The closest status text is usually more useful than the button label itself.
Jamie: The merge box matters a lot here. How should a screen reader user get to the part of the page that explains the block?
Alex: Open the pull request's Conversation tab, then move to the bottom of the page. Pressing End is often the fastest way to land near the merge area, and then heading navigation can help you find the merge heading. Listen for status lines such as 1 review required, checks pending, or branch out of date before trying the button.
Jamie: Can we be a little more specific for NVDA and JAWS users?
Alex: With NVDA, browse mode heading navigation is often a good path: press H until you reach the merge area, then use the arrow keys to read line by line. With JAWS, the virtual cursor works similarly, and the headings list can also help if the page is long. Once you find a Details link for a check, activate it to open the log.
Jamie: Low vision users get some visual cues too, but they are easy to miss.
Alex: The merge area uses green, yellow, and red indicators, but the text next to the icons is what you should trust. Zooming to 150 percent or more can make the checkmarks, X icons, and secondary Update branch button easier to find. Sighted users will also see a vertical checklist above the merge button, and Show all checks expands the full list when GitHub only shows a summary.
Jamie: Those check details pages can be noisy.
Alex: They can. GitHub Actions opens a run page with jobs, steps, and log output, while third-party checks may open an external dashboard. Start with the failed job name, then the first error message, because later errors can be side effects of the first failure.
Jamie: Let's define status checks a bit more, because they show up everywhere in protected branches.
Alex: A status check is a pass, fail, or pending report for a specific commit. In GitHub Actions, those reports usually come from workflow files in .github/workflows, such as .github/workflows/ci.yml. A workflow can run when someone opens a pull request, pushes to a branch, or updates the pull request.
Jamie: So a project might run tests every time I push to my pull request branch.
Alex: Exactly. The check may be queued, in progress, successful, failed, cancelled, or skipped. For a required check, the important result is successful; anything else may block the merge depending on how the rule is configured.
Jamie: And not every check comes from GitHub Actions.
Alex: Right. Services like Netlify, Vercel, CircleCI, security scanners, accessibility scanners, and code quality tools can all post checks back to GitHub. To the merge box, they all become signals about whether the current commit is ready.
Jamie: Who actually gets to configure all of this?
Alex: Repository admins and maintainers with the right permissions can configure branch protection in a repository. Organization owners can create organization-level rulesets, depending on the GitHub plan and organization settings. Contributors usually cannot change the rules, but they can still read the merge box and ask informed questions.
Jamie: You mentioned bypass lists earlier. Are those just exceptions?
Alex: Yes, but they should be deliberate exceptions. A ruleset can allow specific users, teams, roles, or apps to bypass selected rules, such as a release bot that needs to create a protected tag. Good projects keep bypass lists small and review them because bypassing a rule is a powerful action.
Jamie: How do these choices look in real project configurations?
Alex: For a small team, a practical setup might protect main, require pull requests, require one approval, and require the basic test workflow to pass. For an open source project, maintainers may add code owner review, dismiss stale reviews, restrict direct pushes, and require security or accessibility checks. In an enterprise, rulesets may be managed at the organization level with required scans, linear history, release tag protection, and Evaluate mode before a new rule becomes active.
Jamie: And in the workshop environment, learners are not usually trying to become repository admins on day one.
Alex: Right. The Learning Room repository is provisioned per learner, and it is where Day 1 contributions happen: issue, branch, commit, pull request, and merge. Facilitators can keep protections light for practice, or intentionally demonstrate a blocked merge so learners can hear and inspect the clues.
Jamie: If someone wants the most current reference, where should they go?
Alex: Use GitHub's documentation on protected branches, repository rulesets, Actions status checks, and commit signing. GitHub changes screens over time, so trust the current docs and the live messages in the pull request. If you can explain what rule is blocking you and what evidence would satisfy it, you're in good shape.
Jamie: I like that framing. A blocked merge is not a dead end. It is a checklist from the repository.
Alex: Exactly. Read the merge box, open the details when needed, make the next change, and verify that the status changed. That is how protected branches turn from a mystery into a normal part of collaboration.
59. Episode 29: GitHub Security Features
Dependabot, secret scanning, code scanning, and private security advisories.
Based on: Appendix P: GitHub Security Features
Read Transcript - Episode 29: GitHub Security Features
Transcript
Alex: Welcome back. Today we're looking at GitHub security features, and this one is bigger than a settings tour. In open source, your project is connected to packages, workflows, tokens, build tools, and other people's code. A weak link in that chain can affect everyone who installs or contributes to the project.
Jamie: So security is not only the maintainer's problem. If I open a pull request, review an alert, or notice something strange, I'm part of the safety system too.
Alex: Exactly. GitHub gives repositories a set of tools for that work: Dependabot for vulnerable dependencies, secret scanning for leaked credentials, code scanning for risky patterns in the code, and private reporting for vulnerabilities that should not be posted in public.
Jamie: I like that framing. We are not trying to become security experts overnight. We are learning what the signals mean and how to respond without making things worse.
Alex: Most of these signals live behind the repository's Security and quality tab. What you see there depends on your access. A public visitor may see the security policy and, if the maintainer enabled it, a private vulnerability reporting form.
Jamie: And if I have write or admin access, I may see more: Dependabot alerts, secret scanning alerts, code scanning alerts, security advisories, and security settings.
Alex: Right. On a repository page, move to the secondary navigation and open the Security link. GitHub also supports the keyboard shortcut G then S, as long as GitHub keyboard shortcuts are available in your current mode.
Jamie: Inside that tab, the alerts are separated by type, right? Dependabot, secret scanning, and code scanning each have their own area, so I should not assume one empty page means everything is clear.
Alex: Yes. Also, severity labels use words like Critical, High, Medium, and Low, not just color. If there are no open alerts, GitHub may show a green shield or a no alerts message, which is a good confirmation to look for.
Alex: Dependabot is GitHub's automated system for watching dependencies. A dependency is a package your project relies on, like an npm package, a Python package, or a GitHub Action. If a known vulnerability is found in one of those packages, GitHub can create a Dependabot alert.
Jamie: Known vulnerability means something like a CVE?
Alex: Yes. CVE stands for Common Vulnerabilities and Exposures, which is a public identifier for a reported security flaw. Dependabot alerts usually tell you the package name, the package ecosystem, the vulnerable version range, the fixed version, the advisory ID, a description, and the severity.
Jamie: And the severity is not just vibes. Critical is roughly a CVSS score from 9.0 to 10.0, High is 7.0 to 8.9, Medium is 4.0 to 6.9, and Low is 0.1 to 3.9.
Alex: Exactly. When you see an alert, read the advisory first. Then check whether the project actually uses the affected code path. Most of the time, the practical fix is to update the dependency to the fixed version.
Jamie: And sometimes Dependabot has already done that work by opening a pull request.
Alex: Yes. Dependabot security updates can automatically open a PR with a title like, bump lodash from 4.17.20 to 4.17.21. The author is dependabot[bot], and the description usually links release notes, changelogs, and commits. Reviewing those PRs, running tests, and merging them when they pass can be a strong contribution.
Jamie: There is also the non-emergency version of this, where Dependabot keeps packages current even when there is no known security issue.
Alex: That is Dependabot version updates. Teams configure it in .github/dependabot.yml. A common setup says version 2, updates for the npm ecosystem in the root directory, run weekly, and keep the number of open Dependabot PRs limited, maybe five at a time.
Jamie: Secrets are the feature that makes people nervous. What counts as a secret here?
Alex: A secret is a credential that grants access, like a token, API key, password, private key, or cloud credential. Secret scanning looks for those patterns in code and commit history. The goal is to catch accidental leaks before someone can use them.
Jamie: And push protection can stop the problem before it reaches the repository, right?
Alex: Right. If you run git push and GitHub detects a known secret pattern, the push can be blocked. The terminal message may include GH013, the commit, the file, the line number, and the secret type, such as a GitHub personal access token.
Jamie: What should I do in that moment? Because my first instinct might be, just delete the line and push again.
Alex: Delete the secret from the file, yes, but also revoke and rotate the credential. Revoke means disable the old secret. Rotate means create a new one and update the service that needs it. GitHub may automatically revoke certain GitHub tokens, but you still need to verify the damage is contained.
Jamie: And if it is a false positive?
Alex: Investigate first. Some systems allow a bypass with a written reason, but bypassing should be rare and deliberate. The safer pattern is to store secrets outside the code, usually in environment variables, so your code reads something like process.env.GITHUB_TOKEN instead of hardcoding a token string.
Jamie: For existing public repositories, secret scanning alerts can also appear after the fact. If an alert says a credential has been sitting in history, treat it as urgent, because it may already be exposed.
Alex: Code scanning is different from Dependabot. Dependabot looks at packages. Code scanning looks at your code. GitHub's built-in engine is CodeQL, which uses static analysis, meaning it examines code without needing to run the app.
Jamie: So it can find patterns like SQL injection or cross-site scripting before a user ever hits that path in production.
Alex: Exactly. It may also flag unsafe data flow, insecure configuration, or places where untrusted input reaches a sensitive operation. A code scanning alert usually includes the rule name, severity, file, line, explanation, and sometimes a path showing how data moves through the program.
Jamie: Where do I find those alerts?
Alex: Open the Security and quality tab, then Code scanning. You can move through the alert list, open one alert, read the affected file and line, and check the recommendation. It is worth reading the full alert before changing code, because the fix is often about the flow of data, not just one line.
Jamie: How does a repository turn CodeQL on?
Alex: Usually through GitHub Actions. In the repository, you add a workflow file under .github/workflows, often a CodeQL workflow that chooses the language, initializes CodeQL, builds if needed, and runs analysis. It can run on pushes, pull requests, and a schedule, so new code gets checked continuously.
Jamie: What if I find something serious that is not already an alert? Like a vulnerability that could expose user data.
Alex: Do not open a public issue with exploit details. If the repository has private vulnerability reporting enabled, go to the Security and quality tab and choose the reporting option. The form lets you privately describe the vulnerability, affected versions or files, reproduction steps, and impact.
Jamie: That gives maintainers a chance to fix it before the whole internet gets a recipe for abuse.
Alex: Yes. Maintainers can triage the report, discuss it privately, prepare a fix, create a security advisory, and publish details when the patch is ready. They may also credit the reporter or request a CVE, depending on the project and severity.
Jamie: And if nobody responds?
Alex: Check the repository's security policy for response expectations. Many projects describe how long to wait and what contact path to use. If there is still no response, follow responsible disclosure norms: avoid posting exploit steps publicly, keep records of your contact attempts, and choose the least harmful way to escalate.
Alex: A SECURITY.md file is the repository's written security policy. It usually explains supported versions, what is in scope, how to report a vulnerability, what information to include, and what response timeline to expect.
Jamie: Where would I find it?
Alex: The Security and quality tab often links to it if it exists. You may also find it at the repository root, inside .github, or in a default community health file for the organization. If you are unsure whether to post publicly or report privately, SECURITY.md is the first document to check.
Jamie: The appendix also mentions SBOMs. That acronym shows up a lot in software supply chain conversations.
Alex: SBOM stands for Software Bill of Materials. It is an inventory of the components and dependencies in a project. In GitHub, when dependency graph data is available, repository maintainers can export an SBOM, often from the dependency graph area, such as Insights, Dependency graph, then Export SBOM.
Jamie: So if a new vulnerability appears in a library, an SBOM helps a team answer, are we using that thing anywhere?
Alex: Exactly. It is not a fix by itself, but it gives teams a clearer map of what the project is built from.
Jamie: Let's slow down on navigation, because security pages can be dense.
Alex: From any repository page, you can Tab to the secondary navigation and open Security, or use G then S if GitHub shortcuts are active for you. Once inside, use headings, links, and tables to move by alert type. In many screen readers, T can help reach tables, and arrow keys can read rows and columns.
Jamie: For Dependabot alerts, I would listen for package name, severity, vulnerable version, fixed version, and advisory link.
Alex: Yes. For code scanning alerts, listen for rule name, severity, file, line, and any data-flow explanation. For the private vulnerability reporting form, move field by field and include impact, reproduction steps, affected area, and any safe supporting details.
Jamie: Low vision learners may need a slightly different tactic.
Alex: Increase browser zoom or terminal font size when reading alert tables and push protection errors. Severity badges include text, so you do not have to rely on color alone. In an editor, syntax highlighting can make environment variable names and accidental hardcoded strings easier to spot.
Alex: Security also connects to the Accessibility Agents work in this course. The Accessibility Agents collection is a living catalog, so the useful move is to inspect the current repository state, not memorize a fixed number of agents.
Jamie: And for Challenge 15, learners browse that catalog first. They are not required to fork the accessibility-agents repository just to complete discovery.
Alex: Right. A security-focused agent or checklist could summarize a repository's current posture: Dependabot alerts open, secret scanning status, code scanning status, open Dependabot PRs, and a recommendation like, review the high-severity dependency update before adding new features.
Jamie: For community-access/accessibility-agents, that means a dashboard should be treated as a current snapshot, not a permanent truth.
Alex: Exactly. A sample output might say, Dependabot alerts: check the Security and quality tab. Secret scanning: verify whether alerts are enabled and whether any are open. Code scanning: review CodeQL results if configured. Dependabot PRs open: review, test, and merge safe updates. Recommendation: keep security maintenance visible alongside accessibility improvements.
Jamie: That also fits the Capstone Project. Challenge 16 can be a contribution to Accessibility Agents, GLOW, or another meaningful repository, and a review-ready draft or contribution plan can be valid evidence when the work is thoughtful and actionable.
Alex: One last habit: use GitHub's code security documentation as the source of record when you need exact behavior. These features change, and repository settings vary by visibility, plan, and maintainer choices.
Jamie: So the workflow is: open the Security and quality tab, identify the alert type, read the details, act carefully, and document what you did.
Alex: Yes. Security work rewards patience. Read before clicking, revoke secrets instead of just deleting them, test dependency updates, keep vulnerability reports private when needed, and use SECURITY.md to respect the project's process.
Jamie: That makes security feel less mysterious. It is still serious, but it becomes a set of careful contribution habits.
60. Episode 30: VS Code Accessibility Reference
Complete accessibility settings, audio signals, diff viewer, and screen reader configs.
Based on: Appendix G: VS Code Accessibility Reference
Read Transcript - Episode 30: VS Code Accessibility Reference
Transcript
Alex: Welcome back. This episode is a companion reference for VS Code accessibility. The main chapters help you get comfortable; this one is the place you come back to when you need the exact setting, shortcut, or screen reader behavior.
Jamie: So the goal is not to memorize every setting path. It is to know where to look when VS Code starts feeling noisy, quiet, confusing, or hard to navigate.
Alex: Exactly. The appendix supports the VS Code interface and accessibility chapters, and it points back to the official VS Code accessibility documentation as the source of truth. VS Code changes over time, so if a setting name shifts, the current docs and the Settings UI are the final check.
Jamie: And because this is a long reference, there are some practical ways to use it. Go to Line with Ctrl+G, Go to Symbol with Ctrl+Shift+O, jump between tables with T in browse mode, and use larger zoom or a high contrast theme before scanning dense tables. If your setup has the bookmark command on Ctrl+K Ctrl+K, bookmark the file so you can return quickly.
Alex: Most accessibility settings are available in two places: the Settings UI with Ctrl+comma, or settings.json through the Command Palette with Ctrl+Shift+P, then Open User Settings JSON. The Settings UI is safer for browsing. settings.json is faster when you already know the exact setting path.
Jamie: The one I hear about most is `editor.accessibilitySupport`. What does it actually control?
Alex: That setting tells VS Code whether to use screen reader optimizations. `auto` tries to detect NVDA, JAWS, or VoiceOver. `on` forces those optimizations, and `off` disables them. When it is active, VS Code may show a Screen Reader Optimized indicator in the status area and adjust how editor content is exposed to assistive technology.
Jamie: What changes when screen reader mode is active? Is it only an announcement label?
Alex: It is more than a label. VS Code changes how it presents editor text, paging, hover content, suggestions, and some complex views. `editor.accessibilityPageSize` controls how many lines Page Up and Page Down read in screen reader mode. Hover content is still available, but the reliable way to read it is Accessible View with Alt+F2.
Jamie: That helps. And there are settings that are mostly visual, right?
Alex: Yes. Bracket guides, indentation guides, occurrence highlights, and the minimap can be useful visually, but they are not usually helpful through speech. Many screen reader users turn `editor.minimap.enabled` off, set `editor.renderWhitespace` to `none`, and set `editor.wordWrap` to `on`. Some people also set `workbench.editor.enablePreview` to `false` so each file opens in a real tab instead of replacing the preview tab.
Jamie: What about diffs, terminals, and notifications? Those are the places where I lose track fastest.
Alex: For diffs, `diffEditor.diffAlgorithm` set to `advanced` usually creates cleaner change groups, `diffEditor.ignoreTrimWhitespace` set to `true` cuts down noise, and `diffEditor.renderSideBySide` set to `false` gives an inline diff that is easier to read with speech. For the terminal, `terminal.integrated.screenReaderMode` can be `auto` or `on`, `terminal.integrated.enableBell` can add useful sound feedback, and Accessible View can read terminal output. For announcements, the `accessibility.verbosity` settings control how much VS Code says about comments, the diff editor, the editor, hovers, inline chat, inline completions, notebooks, panel chat, settings, keybindings, and the terminal.
Jamie: Audio cues are one of those features people either love immediately or turn off after five minutes. What is the balanced way to approach them?
Alex: Start by opening Settings with Ctrl+comma and searching for audio cue, or edit the same values in settings.json. Most cue settings accept `auto`, `on`, or `off`. `auto` means play the sound only when screen reader mode is active, `on` means always play it, and `off` means never play it.
Jamie: And each sound has a meaning, not just a decorative beep.
Alex: Right. There are signals for clearing the terminal or output, sending a Copilot Chat request, waiting for a chat response, and receiving that response. There are debugger signals for breakpoints, diff signals for deleted, inserted, and modified lines, and editor signals for formatting, errors, warnings, folded code, inline suggestions, and lines that have breakpoints. A low-value signal such as no inlay hints is often left off.
Jamie: Where do text announcements fit in? Are those separate from sound?
Alex: They are related but not identical. Audio cues are non-verbal sounds, while accessibility announcements are text-based status updates that your screen reader can speak. Verbosity settings decide which parts of VS Code talk more, and signal priority helps you keep urgent items like errors more noticeable than routine items. If a message arrives at the wrong time or repeats too much, adjust the related verbosity before you redesign the whole setup.
Jamie: Can people customize the actual sounds?
Alex: Where your VS Code version supports custom signal sounds, use short, clear files in a common audio format and keep them in a stable folder. Avoid long music clips, quiet files, and sounds that are hard to tell apart. The test is simple: when you hear it during real work, you should know immediately whether it means error, warning, diff change, chat response, or terminal event.
Jamie: Diffs are where accessibility settings become very real. Reviewing a pull request is hard if you cannot tell what changed.
Alex: The Accessible Diff Viewer is for exactly that moment. Use it when a visual side-by-side diff is too much, when a pull request has many changes, when whitespace is getting in the way, or when you need a keyboard-friendly way to review code changes.
Jamie: I always hear the word hunk in diff tools. What is a hunk?
Alex: A hunk is a block of related changes. In an accessible diff, you usually get the file, then each hunk, then the lines inside that hunk. Lines are marked by prefix: a plus sign for an inserted line, a minus sign for a deleted line, and an unchanged context line so you know where the change lives.
Jamie: How do you open it without hunting around visually?
Alex: Start from a changed file in Source Control or an open diff. Use the Command Palette to search for accessible diff, and in diff workflows use F7 and Shift+F7 to move between differences when those keybindings are available. If a merge conflict is involved, the accessible diff path is usually clearer than relying on visual conflict decorations alone.
Jamie: The appendix recommends inline view for screen readers. Why is side-by-side harder?
Alex: Side-by-side diff is designed for visual comparison: old file on one side, new file on the other. Speech has to jump between panes, and it is easy to forget which side you are on. Inline view keeps the old and new lines in one flow, so `diffEditor.renderSideBySide` set to `false` is often the better default.
Jamie: Does navigation change by screen reader?
Alex: A little. NVDA and JAWS users often move between focus mode and browse-style reading depending on where focus lands. VoiceOver users may need to interact with groups before moving inside the diff content. In all three cases, listen for hunk boundaries, line prefixes, and context lines; those are the clues that make the change understandable.
Jamie: Let us talk about screen reader-specific setup. People often ask, should I configure VS Code, or should I configure my screen reader?
Alex: Usually both, but lightly. For NVDA, keep it current, make sure focus mode is working well in edit fields, and choose punctuation and indentation feedback that helps you read code. There is no magic add-on required for everyone, but if your organization recommends a current VS Code-related NVDA add-on, install it from a trusted source and test it with your normal files.
Jamie: And the commands to lean on are mostly VS Code commands, not secret screen reader commands.
Alex: Yes. Use Ctrl+Shift+O for symbols, Ctrl+G for a line number, Alt+F2 for Accessible View, Ctrl+Shift+M for Problems, and the Command Palette when you forget a shortcut. NVDA commands still matter for switching interaction modes and reviewing speech, but the most portable workflow comes from VS Code itself.
Jamie: How does JAWS fit into that?
Alex: With JAWS, keep the version current, check that application or forms interaction behaves correctly in the editor, and tune typing echo and verbosity so code is readable but not overwhelming. Some workplaces use JAWS scripts for VS Code; if you do, confirm that the scripts match your VS Code version. JAWS commands can help with virtual cursor behavior, but again, VS Code commands like Go to Symbol, Problems, Source Control, and Accessible View are the core path.
Jamie: And VoiceOver on macOS has its own rhythm.
Alex: It does. In VoiceOver Utility, set keyboard and verbosity options so code editing is responsive, then practice interacting with VS Code groups using Control+Option+Shift+Down Arrow and backing out with Control+Option+Shift+Up Arrow. The rotor can help you inspect structure, and Quick Nav can be useful for reading, but you may need to turn Quick Nav off when VS Code needs arrow-key chords or editor navigation.
Jamie: I want the keyboard map. Not every shortcut in the universe, but the ones that keep work moving.
Alex: Start with global navigation. Ctrl+Shift+P opens the Command Palette, Ctrl+P opens a file by name, Ctrl+Tab moves through open editors, Ctrl+comma opens Settings, and Ctrl+K Ctrl+S opens Keyboard Shortcuts. The main areas are Ctrl+Shift+E for Explorer, Ctrl+Shift+F for Search, Ctrl+Shift+G for Source Control, Ctrl+Shift+D for Run and Debug, Ctrl+Shift+X for Extensions, and Ctrl+backtick for the terminal.
Jamie: What about inside the editor?
Alex: Use Ctrl+N, Ctrl+O, Ctrl+S, and Ctrl+W for new, open, save, and close. Ctrl+G goes to a line, Ctrl+Shift+O goes to a symbol, F12 goes to definition, and Alt+Left or Alt+Right moves through navigation history. Ctrl+F and Ctrl+H handle find and replace, Ctrl+slash toggles a comment, Alt+Up or Alt+Down moves a line, Shift+Alt+Down copies a line, Ctrl+Space opens suggestions, and Ctrl+period opens quick fixes.
Jamie: Multi-cursor editing scares people because it can change several places at once.
Alex: That is fair. Treat it as optional until you are comfortable. Ctrl+D selects the next match, Ctrl+U backs out of the last cursor action, and Escape cancels the multi-cursor state. Some systems use Ctrl+Alt+Up or Down to add cursors above or below, but that can conflict with operating system or screen reader shortcuts, so check Keyboard Shortcuts before relying on it.
Jamie: And the Git, terminal, Copilot, Problems, diff, and Markdown pieces?
Alex: For terminal work, Ctrl+backtick toggles the terminal and Ctrl+Shift+backtick creates a new one. In Source Control, Ctrl+Shift+G takes you to changes, Enter opens a selected file diff, and Ctrl+Enter from the commit message can commit when your setup allows it. Problems is Ctrl+Shift+M, F8 moves to the next problem, Shift+F8 moves to the previous one, Markdown preview is Ctrl+Shift+V or Ctrl+K V to open beside, and Copilot shortcuts such as inline chat and chat view should be verified in Keyboard Shortcuts because extensions and versions can change them. For accessibility features, remember Alt+F2 for Accessible View and F7 or Shift+F7 for diff movement when those bindings are active.
Jamie: Low vision settings deserve their own attention too. Sometimes the issue is not speech; it is size, contrast, and visual clutter.
Alex: Absolutely. Use Ctrl+K Ctrl+T to choose a theme, including high contrast themes, and use Ctrl+equals to zoom in, Ctrl+minus to zoom out, and Ctrl+0 to reset zoom. You can also set editor font size, terminal font size, and window zoom level directly in Settings.
Jamie: Are there tradeoffs when you zoom or change contrast?
Alex: Yes. Larger zoom can make long lines wrap differently, which is why word wrap should be tested in normal files, diffs, and the terminal. The minimap can help some low vision users orient visually, while others turn it off to reduce clutter. Breadcrumbs and the outline can also help you understand where you are in a large file.
Jamie: The appendix includes settings.json profiles. I like that because people have different tolerance levels for feedback.
Alex: A minimal screen reader profile might force `editor.accessibilitySupport` on, enable word wrap, disable the minimap, hide rendered whitespace, use inline diffs, and keep announcements limited. That works well for people who prefer to call Accessible View manually. A maximum feedback profile turns on more signals, leaves verbosity high, enables the terminal bell, and makes screen reader support explicit in the terminal.
Jamie: Then there are profiles for specific kinds of work.
Alex: For Copilot-heavy work, prioritize chat announcements, inline completion announcements, and sounds for chat request sent, response pending, response received, and inline suggestions. For Git and pull request review, prioritize inserted, deleted, and modified diff line signals, the advanced diff algorithm, inline diff view, and whitespace filtering. For slower machines or large repositories, reduce visual extras, keep the minimap off, limit lower-value signals, and avoid settings that create constant background work.
Jamie: And there is a balanced quick-copy setup for people who just want a reasonable starting point.
Alex: Yes. Use that as a starting profile, not a permanent identity. Paste it into settings.json only after you understand what it changes, then adjust one or two settings at a time so you can tell what improved or got worse.
Jamie: VS Code 1.120 also added or refined some chat, agents window, and Markdown diff behavior. What should listeners take from that?
Alex: The important part is that chat and agent workflows are becoming more keyboard and screen reader aware, but they still need settings support. Keep verbosity on for inline chat, panel chat, and inline completions if you use Copilot. For Markdown diffs, use the same accessible diff habits: inline view, clear line prefixes, and Accessible View when the rendered experience is not enough.
Jamie: Troubleshooting is where this reference probably gets used most. Let us start with the scary one: VS Code is not acting like it knows a screen reader is running.
Alex: Set `editor.accessibilitySupport` to `on` and `terminal.integrated.screenReaderMode` to `on`, then restart VS Code if needed. Also make sure your screen reader is running before VS Code starts. If the status indicator still does not appear, check the official VS Code accessibility docs for the current detection behavior.
Jamie: What if the opposite happens and VS Code will not stop talking?
Alex: Reduce the `accessibility.verbosity` settings for the areas causing noise, such as chat, hover, terminal, or inline completions. Set lower-priority signals to `auto` or `off`, especially repeated pending sounds. If you need a quiet baseline, start from the minimal profile and add feedback back slowly.
Jamie: And if there is not enough feedback?
Alex: Turn on signals for errors, warnings, inline suggestions, diff lines, terminal clear events, and chat completion. Use Ctrl+Shift+M to open Problems, then F8 and Shift+F8 to move through issues. If hover text or terminal output is being missed, open Accessible View with Alt+F2.
Jamie: Diffs can still feel confusing even after settings are changed.
Alex: Then switch to inline view, keep whitespace changes filtered unless you are reviewing whitespace on purpose, use the advanced diff algorithm, and open the Accessible Diff Viewer. Listen for the file name, hunk boundary, plus or minus prefix, and context line. If you can describe the changed block in one sentence, you are oriented enough to keep reviewing.
Jamie: Last one: terminal output or shortcuts are not behaving.
Alex: For terminal output, use Accessible View, keep the setting that returns focus to the terminal after closing Accessible View, and enable the terminal bell if sound helps. For shortcut conflicts, open Keyboard Shortcuts with Ctrl+K Ctrl+S, search the command name, and change one binding at a time. Do not reset everything unless you have to.
Jamie: So the appendix is less of a reading assignment and more of a workbench reference.
Alex: Exactly. Keep it nearby, choose the amount of feedback that fits your brain and your tools, and test settings in real tasks: opening files, editing code, reading a diff, using the terminal, and reviewing chat output. A good VS Code setup is the one that lets you return to the work without fighting the interface.
61. Episode 31: GitHub Codespaces
Cloud dev environments, accessibility setup, and screen reader usage.
Based on: Appendix J: GitHub Codespaces
Read Transcript - Episode 31: GitHub Codespaces
Transcript
Alex: Welcome back. GitHub Codespaces is one of those tools that can make a workshop feel a lot less fragile. Instead of asking every learner to install the same tools on a local computer, it gives you a VS Code development environment running on a cloud machine.
Jamie: And that cloud part matters because setup is often where people get stuck before they even touch Git.
Alex: Exactly. When you open a Codespace, GitHub creates a virtual machine, clones the repository into it, and connects that machine to a VS Code interface. You can use that interface in the browser, or connect it to VS Code Desktop on your own computer.
Jamie: So my screen reader, magnification, keyboard, and operating system are still local. The code environment is the part that lives somewhere else.
Alex: Right. That is a big accessibility win. You can use VS Code features like Screen Reader Optimized mode, audio cues, accessible diffs, zoom, themes, and the integrated terminal without installing compilers or language runtimes first. It also means everyone in a workshop can start from a similar environment, which makes troubleshooting much easier.
Jamie: When would I choose Codespaces instead of local VS Code?
Alex: Use Codespaces when setup would slow you down, when your local device is low-powered, when you are on a borrowed machine, or when a project needs tools you do not want to install locally. Local VS Code is still great when you already have your environment tuned, when you need offline access, or when you rely on extensions that work best on your desktop.
Jamie: Where does github.dev fit? I know pressing period on a GitHub repository opens a browser editor.
Alex: github.dev is great for quick edits because it opens a lightweight VS Code-style editor in the browser. But it does not give you a full cloud machine with a terminal. Codespaces is the choice when you need to run code, install packages, start a server, run tests, or use a development container.
Jamie: That also makes Codespaces useful on mobile or a low-end laptop, right?
Alex: Yes, with some practical limits. A phone or tablet can open a Codespace in the browser, and the heavy work happens in the cloud, not on the device. The tradeoff is screen size, touch keyboard friction, and browser behavior, so it is better for review and small edits than long coding sessions.
Alex: To create a Codespace from a repository page, open the repository on GitHub and move to the Code button. In the panel that opens, choose the Codespaces tab, then activate Create codespace on main, or the branch name you want.
Jamie: I always wonder what is happening after that click, because sometimes there is a wait and it feels mysterious.
Alex: GitHub is provisioning the virtual machine, attaching storage, cloning the repository, reading any environment configuration, and starting VS Code in a new browser tab. A normal startup may take 30 to 60 seconds, and larger projects can take longer.
Jamie: And there is also a dashboard, not just the repository page.
Alex: Yes. At github.com/codespaces, you can create a new Codespace, search for the repository, choose a branch, select a region, and pick a machine type. The default 2-core machine is enough for general development, documentation, and most workshop exercises. A 4-core machine helps with moderate builds or tests, and an 8-core machine is for heavier builds or multiple services.
Jamie: You mentioned environment configuration. Is that where devcontainer.json comes in?
Alex: Yes. A devcontainer.json file tells Codespaces how to build the development environment for the project. It can define the base image, install tools, recommend extensions, set environment variables, and run setup commands after the repository is created.
Jamie: So instead of saying, install Node, install Python, install this extension, set this folder, the repository can describe that setup.
Alex: Exactly. That is why it is so useful for classes and open source projects. A maintainer can encode the expected environment, and contributors can start with fewer surprises. It does not remove the need to understand the tools, but it removes a lot of local installation trouble.
Alex: Once the Codespace exists, you decide how you want to use it. The browser version opens as VS Code for the Web, with the Explorer, editor, terminal, Source Control view, extensions view, and command palette.
Jamie: Browser choice still matters, though.
Alex: It does. Codespaces works in Chrome, Edge, Firefox, and Safari, but Chrome and Edge tend to be the most consistent with NVDA and JAWS. Some VS Code extensions also are not available in the browser version, especially if they need local desktop capabilities.
Jamie: And if I want my familiar desktop setup?
Alex: Install the GitHub Codespaces extension in VS Code Desktop, sign in to GitHub, open the Command Palette with Ctrl+Shift+P or Cmd+Shift+P, and run Codespaces: Connect to Codespace. Then choose an existing Codespace or create a new one. Your screen reader is interacting with your local VS Code app, while the project and terminal still run on the cloud machine.
Jamie: Let's talk accessibility setup. What should a screen reader user check first?
Alex: VS Code usually detects a screen reader and turns on Screen Reader Optimized mode automatically. You can verify it from the Command Palette by searching for Toggle Screen Reader Accessibility Mode and pressing Enter. This applies in Codespaces the same way it does in desktop VS Code.
Jamie: What actually changes when that mode is on?
Alex: The editor is tuned to read content more predictably, especially line by line. Diff views become easier to review as text comparisons. Inline suggestions, including Copilot suggestions, are announced in a more controlled way instead of interrupting constantly.
Jamie: I also like audio cues because they catch things I miss visually.
Alex: Audio cues work in Codespaces just like in desktop VS Code. You can get tones for errors, warnings, breakpoints, task completion, and suggestion availability. To manage them, open Settings and search for audio cues, or run Help: List Audio Cues from the Command Palette.
Jamie: The terminal is the spot where people often lose their place. What helps there?
Alex: The integrated terminal is a standard terminal, so use the same patterns you use locally. In NVDA, Browse Mode helps you review output, Focus Mode lets you type, and setting maximum line length to 10000 can make long output easier to read. In JAWS, use Virtual Cursor for reading and PC Cursor for editing, often with Insert+Z or Num Pad Plus. On macOS, VoiceOver users can use Quick Nav and the Rotor, and if terminal text is hard to review, put focus in the terminal and press Alt+F2 for Accessible View.
Alex: The keyboard shortcuts are mostly standard VS Code shortcuts, so skills transfer well. Ctrl+Shift+P opens the Command Palette, Ctrl+P opens Quick Open for finding files, Ctrl+` toggles the integrated terminal, and Ctrl+B toggles the sidebar.
Jamie: Give me the panel shortcuts too, because those are easy to forget.
Alex: Ctrl+Shift+E opens Explorer, Ctrl+Shift+G opens Source Control, and Ctrl+Shift+X opens Extensions. In the editor, Ctrl+Shift+K deletes a line, Alt+Up and Alt+Down move a line, Ctrl+/ toggles a comment, and Ctrl+G jumps to a line number. In Source Control, you can review changed files, stage changes, write a commit message, commit, and push back to GitHub.
Jamie: And on a Mac, I should expect some Command-key versions.
Alex: Yes. Many shortcuts use Cmd instead of Ctrl on macOS, and browsers can sometimes intercept a shortcut before VS Code receives it. When in doubt, the Command Palette is the safest route because you can search for the action by name.
Jamie: What about previewing a web app? If the server runs inside the Codespace, how do I open it?
Alex: That is where port forwarding comes in. If your app starts a local server, maybe on port 3000 or 8000, Codespaces can detect that port and offer to forward it. You can open the forwarded address in a browser tab and test the app while it is still running in the cloud environment.
Jamie: Is that preview public by default?
Alex: Usually the forwarded port is private to you unless you change its visibility. Be careful before making a port public, especially if the app exposes test data, admin screens, or unfinished work. For most learning tasks, a private preview is enough.
Alex: Managing Codespaces is part of using them well. A Codespace can be stopped, resumed, or deleted, and those words do not mean the same thing.
Jamie: I want that distinction, because delete sounds scary and stop sounds harmless.
Alex: Stop pauses the cloud machine so it is not actively running, and you can resume it later. Delete removes the Codespace and its unpushed work, so push important commits before deleting. If you committed locally inside the Codespace but did not push, GitHub will not show those changes in the repository yet.
Jamie: And there are usage limits, even if many learners will not hit them in a workshop.
Alex: Personal GitHub accounts include a monthly free allowance for Codespaces, and typical workshop use is usually within that allowance. Still, machine size, running time, and storage can affect usage. Stop Codespaces you are not using, delete ones you no longer need, and check your GitHub billing and Codespaces usage pages if you are unsure.
Jamie: What about preferences that I want every time, like shell settings or editor themes?
Alex: Dotfiles can help with shell preferences, aliases, and setup scripts that you want applied to new Codespaces. VS Code Settings Sync can bring over settings like font size, theme, zoom, and some extension preferences. For low vision users, that means high-contrast themes and zoom choices can follow you into the browser-based editor.
Jamie: Let me throw a few common problems at you. Codespace takes forever, terminal stops reading, audio cues do not work, extensions are missing, or changes do not show up on GitHub.
Alex: If startup is slow, give it a little time, then reload or check whether the project is doing a heavy setup. If terminal output stops reading, use the screen reader's reading mode or VS Code Accessible View. If audio cues are silent, check VS Code settings, browser audio permissions, and whether the tab is muted. If an extension is unavailable in the browser, connect the Codespace to local VS Code Desktop. And if changes are not visible on GitHub, make sure you pushed, not just committed.
Jamie: So Codespaces is not a replacement for understanding Git or VS Code. It is a way to remove setup barriers and give everyone a workable starting point.
Alex: Yes. You still need the habits: know where your files are, use Source Control, commit clearly, push before cleanup, and verify the result on GitHub. But Codespaces can make the environment more predictable, especially for learners using screen readers, magnification, mobile devices, or low-end hardware. Because limits and interface names can change, the official GitHub Codespaces documentation is the place to check for current details.
62. Episode 32: GitHub Mobile
VoiceOver and TalkBack guide for iOS and Android GitHub apps.
Based on: Appendix V: GitHub Mobile
Read Transcript - Episode 32: GitHub Mobile
Transcript
Alex: Welcome back. Today we're taking GitHub off the big screen and into your hand with GitHub Mobile on iOS and Android.
Jamie: I like this topic because mobile GitHub can sound like a compromise. Like, sure, I can check something quickly, but can I actually do useful work there?
Alex: You can, as long as you pick the right kind of work. GitHub Mobile is good for issues, pull requests, notifications, code browsing, and lightweight code review. It is not meant to replace every desktop workflow, but it can keep you connected when a review request, mention, or issue update needs attention.
Jamie: So install first, then learn what belongs on mobile and what should wait for the web or desktop.
Alex: Exactly. On iPhone or iPad, get GitHub from the App Store. On Android, get GitHub from Google Play. After you install it, sign in with your GitHub account, and seriously consider enabling notifications when the app asks, because that is one of the places mobile really shines.
Jamie: And once you're in the app, the main map is the bottom tab bar, right?
Alex: Right. There are five main tabs: Home, Notifications, Explore, Pull Requests, and Profile. Home is your personalized activity feed, Notifications is where mentions and review requests land, Explore helps you discover repositories, Pull Requests gathers PRs connected to you, and Profile has your account, repositories, stars, and settings. Low vision learners should also know that GitHub Mobile respects system text sizing, supports dark mode through system or app settings, and uses smaller-screen layouts instead of trying to copy the desktop page exactly.
Jamie: Let's start with iOS. If someone is using VoiceOver, how do they get oriented without feeling like the app is just a wall of unlabeled stuff?
Alex: First, turn on VoiceOver the way you normally would. On many iPhones, triple-click the side button; on older models, triple-click the Home button. You can also go through Settings, Accessibility, VoiceOver, and turn it on there.
Jamie: Once VoiceOver is on, are the gestures the usual ones?
Alex: Mostly, yes. Swipe right to move to the next element, swipe left to move to the previous one, and double tap to activate what has focus. A two-finger swipe up reads from the top, a two-finger tap pauses or resumes speech, a three-finger swipe left or right can move between screens, and the two-finger scrub gesture, like drawing a Z, goes back.
Jamie: The rotor is the part a lot of people know exists but forget to use. Where does it help in GitHub Mobile?
Alex: Open the rotor by rotating two fingers on the screen as if you're turning a dial. In GitHub Mobile, Headings can jump through sections in an issue or pull request, Links can move to linked issues, commits, or web pages, Form Controls can help you land on a comment field, and Actions can expose choices like assign, label, or close when those actions are available.
Jamie: And for writing a comment, the basic flow is find the field, open it, type, and submit?
Alex: Yes. Swipe to the comment field, or use the rotor set to Form Controls if that is faster. Double tap to activate the field and open the keyboard, type or dictate your comment, then swipe to the Comment button and double tap. I usually recommend listening for the confirmation after submitting, because mobile screens can change quickly.
Jamie: Android has a similar story, but TalkBack has its own feel. How should someone start there?
Alex: Turn on TalkBack from Settings, Accessibility, TalkBack. If the shortcut is enabled on your device, holding both volume keys for about three seconds can also toggle it. Once TalkBack is on, you can move through GitHub Mobile with swipe gestures or by exploring the screen with a finger.
Jamie: Explore by touch is important on a phone. Sometimes you want to feel where the bottom tabs are instead of swiping through everything.
Alex: Exactly. Swipe right to move to the next element, swipe left to move to the previous one, and double tap to activate. Swipe up then down to scroll down, swipe down then up to scroll up, and swipe right then left to go back. A two-finger swipe down reads from the top, which can help when you open a new issue or PR and want the page context.
Jamie: Where does the TalkBack menu come in?
Alex: Open it with a three-finger tap, or with the gesture your device uses, often swipe down then right. From there you can change reading granularity, such as character, word, line, or paragraph, use reading controls, and copy text. For comments, find the field where TalkBack says something like "Edit text, double tap to edit," double tap, type with the keyboard or dictation, then find the Comment button and double tap to submit.
Alex: Notifications may be the best reason to keep GitHub Mobile installed.
Jamie: Because the mobile inbox is more linear than the web version?
Alex: Yes. The Notifications tab presents activity in a vertical list, and each row gives you context like repository, notification type, and title. Screen reader users can move through items one by one, and low vision users get system-sized text plus unread indicators, usually a blue dot on the row.
Jamie: What about triage? I don't want to open every notification just to clean up my inbox.
Alex: You don't have to. Swipe left on a notification to reveal quick actions like Mark as read, Archive, and Unsubscribe. Swipe right to mark something as done, and tap a notification when you need the full issue or pull request.
Jamie: And filtering is there too?
Alex: Yes. Use the filter icon near the top right of the Notifications tab. You can narrow by type, like issues, pull requests, or releases; by repository; or by reason, such as mentioned, review requested, or assigned. With VoiceOver or TalkBack, those filter controls are reachable as form controls, so open the panel, move through the options, and activate the filters you want.
Jamie: Pull requests on a phone feel risky to me. I can imagine approving something and later realizing I missed half the diff.
Alex: That is a fair concern. Mobile is best for quick PR work: checking status, reading a short description, approving a small change, or leaving a focused comment. If the change is large, security-sensitive, or depends on running the project locally, move to desktop or the web.
Jamie: When you open a PR in the app, what landmarks should you listen for?
Alex: A pull request is organized into sections such as Description, Commits, Files changed, and Checks. VoiceOver and TalkBack can announce these as headings, so use heading navigation when it is available. Description gives the PR body, Commits lists the commits, Files changed shows the diff, and Checks reports CI or automated test status.
Jamie: And leaving a review is not the same as just posting a comment, right?
Alex: Right. Move to the Review changes button and activate it. Choose Approve, Request changes, or Comment, add an optional review comment in the text field, and then activate Submit review. If you only write a regular conversation comment, that may not count as a formal review.
Jamie: How readable are diffs on a small screen?
Alex: The app uses a simplified single-column diff view in Files changed. Additions and removals are text-only rather than a wide two-column table, and screen readers generally announce lines as added or removed. Sighted users may see additions in green and removals in red, but you should not rely on color alone; listen or look for the added and removed labels.
Jamie: Issues are the other big workflow. Can you file an issue from mobile without fighting the interface?
Alex: Yes, especially for a clear, compact report. Navigate to the repository, open Issues, then use the plus button or New Issue. Fill in the title and body, and if the repository supports it, you may also choose labels, assignees, or a milestone.
Jamie: And finding your own issues?
Alex: You can find issues through repository issue lists, notifications, mentions, or the places in the app that collect activity connected to you. For a learner, a good mobile habit is to open the notification, read the issue title and latest comment, decide whether action is needed, and only then reply. That keeps you from typing into the wrong conversation.
Jamie: What about reading code? Is that realistic on a phone?
Alex: It is realistic for browsing, not for heavy editing. You can open a repository, move through folders and files, read small files, check a README, or confirm that a file exists. For longer source files, complex navigation, or anything where indentation and surrounding context matter, desktop tools are still safer.
Jamie: So where would you draw the line between mobile and desktop?
Alex: Use mobile for staying current and making small decisions. Notifications, quick issue replies, short PR reviews, checking CI status, scanning a README, and following a link from a mention are all good mobile tasks. It is also convenient when you are away from your desk and need to unblock someone.
Jamie: And desktop or web when the work needs more room.
Alex: Yes. Use desktop or the web for large diffs, multi-file reasoning, branch management, resolving conflicts, editing several files, running tests, or comparing behavior across tools. The phone is a strong companion, not the whole workshop.
Jamie: What accessibility limitations should people expect today?
Alex: Some screens can still be inconsistent. A screen reader might skip part of a PR description, a notification badge may not be announced reliably, the keyboard can cover a comment field, and small-screen diffs can still be tiring. Also, mobile apps change often, so if a label or button moves, use the current GitHub Mobile docs and the GitHub Mobile changelog as your source for the latest behavior.
Jamie: Let's talk fixes. If VoiceOver skips part of a PR description, what can someone try before giving up?
Alex: Use heading navigation to move away and back, try reading from the top with a two-finger swipe up, or open linked content in the browser if the app view is not reading well. If the PR is important and the description is not reliable on the phone, switch to the web before reviewing.
Jamie: What about TalkBack not announcing a new notification badge?
Alex: Open the Notifications tab directly and refresh or move through the list rather than depending only on the badge. For a keyboard covering the comment field, dismiss and reopen the keyboard, rotate the device if that helps, or move focus back to the edit field and review what you typed before submitting.
Jamie: I have also seen people write a review comment and then not find the submit button.
Alex: That happens. Move through the review panel slowly, use form or control navigation if your screen reader supports it, and listen for Submit review rather than just Comment. If the app freezes or crashes, force close it, reopen it, check for an update, and if sign-in or state seems broken, sign out from Profile and Settings and sign back in.
Jamie: So the takeaway is not, do everything on mobile. It is, know which GitHub jobs fit in your pocket.
Alex: Exactly. GitHub Mobile is excellent for awareness, quick responses, lightweight review, and code lookup. When the task needs deep context, lots of files, or careful testing, move back to a larger workspace. Used that way, the phone becomes part of an accessible contribution workflow instead of a frustrating backup plan.
63. Episode 33: Publishing with GitHub Pages
Free static site hosting, custom domains, HTTPS, and accessibility.
Based on: Appendix W: Publishing with GitHub Pages
Read Transcript - Episode 33: Publishing with GitHub Pages
Transcript
Alex: Welcome back. Today we're publishing a website without renting a server or setting up a separate hosting account. GitHub Pages lets a repository serve a static website, right from GitHub.
Jamie: Static website is one of those phrases that sounds simple until it doesn't. What does static mean here?
Alex: It means GitHub Pages serves files as they already exist: HTML, CSS, JavaScript, images, PDFs, and files like that. It does not run server-side code, so no PHP request handlers, no Python web app, no Node.js server, and no private database behind the page.
Jamie: So it is great for things that can be delivered as files: documentation, workshop materials, a project landing page, a portfolio, maybe a blog.
Alex: Exactly. The default address for a project site usually looks like https://username.github.io/repo-name/. For a user or organization Pages site, where the repository is named username.github.io, the address becomes https://username.github.io/.
Jamie: Let's say I have a repository with a small site in it. Where do I turn Pages on?
Alex: Open the repository on GitHub.com, then go to Settings. In the left sidebar, find the Code and automation group, and choose Pages. That page is where you choose how GitHub should build and publish the site.
Jamie: And the accessibility detail here is helpful. Settings is a link in the repository navigation, and Pages is also a link in the settings sidebar under that Code and automation grouping.
Alex: Right. Under Build and deployment, you choose a source. The two big choices are deploying directly from a branch, or using GitHub Actions to build and deploy.
Jamie: If I choose deploy from a branch, what am I picking?
Alex: You select the branch, commonly main or master, then select the folder. GitHub Pages supports either the repository root, written as slash, or the docs folder, written as docs slash. After you save, the first deployment usually takes a minute or two, and the published URL appears near the top of the Pages settings page.
Jamie: For low vision learners, the status indicators matter too. A successful deployment shows a green checkmark, and a failed one shows a red X. And the published site does not inherit GitHub's styling, so your own CSS has to handle contrast, spacing, and readable font sizes.
Alex: Choosing the publishing source is really a design decision. If you serve from the root, GitHub publishes files from the top level of the repository. If you serve from docs slash, GitHub publishes only that folder.
Jamie: I can see why docs slash is cleaner when the repository also has source files, scripts, tests, or notes that are not meant to be the website.
Alex: Yes. The docs folder keeps the published site separate from the working parts of the project. But when you need a build step, branch publishing may not be enough.
Jamie: This is where Jekyll comes in, right?
Alex: Yes. Jekyll is the classic static site generator associated with GitHub Pages. A static site generator takes source files, often Markdown plus templates, and produces plain HTML, CSS, and other assets. You can also use Hugo, Eleventy, or a Next.js static export, but those usually need GitHub Actions so the site can be built before it is published.
Jamie: And Actions can do more than build. It can run checks before the site goes live, including accessibility checks.
Alex: In this project, there is a specific wrinkle. The Markdown content has a pre-built HTML mirror in an html folder, generated by scripts/build-html.js.
Jamie: But GitHub Pages does not let me choose any folder I want when I deploy from a branch. It gives me root or docs slash.
Alex: Correct. One manual approach is to copy the contents of html into docs, then commit and push the docs folder. After that, set the Pages source to the master branch and the docs folder.
Jamie: What about renaming html to docs? That sounds tempting.
Alex: It can work in a different project, but only if docs is not already being used for something else. You would update the build script output path first, then move html to docs and commit the change. In this project, docs is used for Markdown source files, so copying the built output or using Actions is safer.
Jamie: So the automated version is the cleaner long-term path.
Alex: Yes. A Pages workflow can run on every push to master. It checks out the repository, sets up Node.js, installs dependencies, runs node scripts/build-html.js, uploads the html folder as the Pages artifact, and then deploys it.
Jamie: What if I don't want the github.io address? Can I use my own domain?
Alex: You can. In repository Settings, then Pages, enter the custom domain and save it. GitHub adds a CNAME file to the repository containing that domain name.
Jamie: Then the DNS provider has to point the domain at GitHub Pages.
Alex: For a subdomain, like learning.example.org, you create a CNAME record that points to the account's github.io host. For an apex domain, like example.org, you use four A records. The current GitHub Pages IP addresses are 185.199.108.153, 185.199.109.153, 185.199.110.153, and 185.199.111.153.
Jamie: DNS can be slow, so this is not always instant.
Alex: Right. DNS changes can take up to 48 hours to propagate, and GitHub Pages will keep checking. GitHub also recommends verifying the custom domain in your account or organization Pages settings, because verification helps prevent someone else from claiming your domain on Pages if you temporarily remove it.
Jamie: What about HTTPS? Do learners have to buy a certificate?
Alex: No. GitHub Pages enforces HTTPS automatically for github.io subdomains. For custom domains, once DNS has propagated, you can enable Enforce HTTPS, and GitHub Pages provisions a certificate through Let's Encrypt.
Jamie: So the visitor gets redirected from HTTP to HTTPS once enforcement is on.
Alex: Exactly. One security reminder, though: a Pages site is public static hosting. Do not put secrets, API keys, private data, or anything confidential into files that will be published. Client-side JavaScript is visible to visitors, too.
Jamie: Publishing is exciting, but accessibility cannot stop at the repository. What should people check in the actual site?
Alex: Start with semantic HTML. Use headings in a real outline, a main landmark for the page's primary content, navigation where navigation belongs, and footer or aside only when they make sense. Screen reader users should be able to move by headings, landmarks, links, and form controls and get a coherent picture of the page.
Jamie: Skip links are one of those tiny features that make a site feel much less exhausting.
Alex: Yes. Add a skip link near the top of the page that jumps to the main content, and make sure it becomes visible when focused. It helps keyboard users bypass repeated navigation.
Jamie: What changes for single-page sites, where the URL or content changes without a full reload?
Alex: Focus needs attention. After a route change, move focus to the main heading or main region, and update the document title so assistive technology announces the correct page. Otherwise, a listener may hear the old page title while the visible content has changed.
Jamie: And the basics still matter: images and color.
Alex: Definitely. Give meaningful images useful alt text, mark decorative images with empty alt text, and check color contrast for text, controls, focus indicators, and links. Also test zoom and text resizing, because published sites need to remain readable when someone increases magnification.
Jamie: After deployment, how would you test without making it a giant ritual?
Alex: Open the published URL, not just the local files. Use the keyboard to move through links and controls, check that focus is visible, inspect headings and landmarks with a screen reader, and confirm the page title makes sense. Automated tools like axe, Lighthouse, or pa11y can help, but they do not replace a real navigation pass.
Jamie: The troubleshooting note about wrong page titles feels easy to miss.
Alex: It is. If a screen reader announces the wrong page title, check the title element in the HTML. For a single-page app, also make sure route changes update the title before or at the same time the new content is presented.
Jamie: What about the 404 page? GitHub Pages will show something if a page is missing, but can we make that experience better?
Alex: Yes. Add a 404.html file to the root of the published output. Make it plain and accessible: say the page was not found, provide a link back home, and include links to search, documentation, or the main project page if those are useful.
Jamie: Manual publishing is fine once, but it can get stale. What does continuous deployment add?
Alex: It makes publishing repeatable. A GitHub Actions workflow can build the site on each push, run checks, upload the Pages artifact, and deploy it. The workflow needs permissions such as contents read, pages write, and id-token write so it can publish securely.
Jamie: You mentioned accessibility checks earlier. Where do those fit?
Alex: Put them after the build and before the deploy, or in a separate job that the deploy depends on. Depending on the project, that might be npm test, an HTML validator, pa11y, axe-based tests, or link checking. Some teams fail the deployment on serious accessibility errors, while others start with warnings and tighten the rules over time.
Jamie: What are the limits? Because Pages sounds simple, but it is not a full web host.
Alex: That's the key. GitHub Pages is for static output, so it will not run server-side code, host a database, process private form submissions by itself, or protect secret files. It is also not ideal for very large media-heavy sites or anything that needs a custom backend.
Jamie: If I push a change and the site does not update, where should I look first?
Alex: Check the Pages settings and the Actions or deployment history. Make sure the selected branch and folder are correct, the commit reached that branch, and the workflow actually finished. Also try a hard refresh, because browser caching can make an old page look like a failed deployment.
Jamie: What about the scary one: the home page works, but every other page is a 404?
Alex: That often comes from paths. Project Pages live under slash repo-name slash, so root-relative links can break if the site generator assumes it is hosted at the domain root. Single-page apps may also need a fallback strategy, and regular sites need the generated files to match the URLs you are linking to.
Jamie: And if the HTTPS certificate is stuck?
Alex: Confirm the DNS records are correct, remove conflicting records, wait for propagation, and then try Enforce HTTPS again when GitHub shows the domain is ready. If the certificate is still not provisioning, the DNS check is usually the place to start.
Jamie: So GitHub Pages is not magic, but it is a very practical publishing path when the output is static and the checks are visible.
Alex: Exactly. Pick the right source, build when you need to, protect the domain and HTTPS settings, and test the published site as a real website. That turns a repository into something people can actually read, navigate, and use.
64. Episode 34: GitHub Actions and Workflows
Workflow YAML structure, CI/CD, automation, and the Actions marketplace.
Based on: Appendix Q: GitHub Actions and Workflows
Read Transcript - Episode 34: GitHub Actions and Workflows
Transcript
Alex: Welcome back. Today we're talking about GitHub Actions, which is GitHub's built-in automation system for repositories.
Jamie: This is the thing that suddenly starts running when you open a pull request, right? Tests, checks, little status icons, sometimes a red X that makes everyone nervous.
Alex: Exactly. Actions are event-driven automation. Something happens in the repository, like a commit being pushed or a pull request being opened, and GitHub runs a workflow that the maintainers defined.
Jamie: So as a contributor, I may not be writing the automation, but I still need to understand what it is telling me.
Alex: Yes. Most contributors only need to read the results, follow the links when something fails, and make a focused fix. The written appendix is also a reference, so you can jump to the part you need later instead of memorizing every possible workflow feature today.
Jamie: Let's slow down on the vocabulary, because Actions has a lot of nested words. Workflow, job, step, action, runner... they all sound similar at first.
Alex: A workflow is the full automated process, and it is stored in a YAML file. YAML is a plain text format where indentation matters, so spaces at the start of a line change what belongs under what.
Jamie: And a job is inside the workflow?
Alex: Right. A job is a group of steps that run together, usually on one machine. A step might run a command, like npm test, or use a reusable action, like actions/checkout, which downloads the repository code into the runner.
Jamie: Runner is the machine doing the work?
Alex: Yes. GitHub-hosted runners are virtual machines such as ubuntu-latest, windows-latest, or macos-latest. The workflow says which runner to use with the key runs-on.
Jamie: Where do I find these workflow files if I'm browsing a repository?
Alex: They live in a required folder path: .github/workflows. The folder name starts with a dot, so a screen reader may announce it as "dot github." On GitHub.com, the file browser shows it, and you can press T to open Go to file and search for workflow YAML files, usually ending in .yml.
Jamie: What would I actually hear or read inside a simple workflow file?
Alex: A common file might be called .github/workflows/ci.yml. Near the top, name: CI gives the workflow its display name. Then on: defines the events that start it, jobs: lists the work to do, and steps: lists the individual commands or reusable actions.
Jamie: So if I hear on colon, then pull_request under it, that's saying this workflow runs when a pull request changes.
Alex: Exactly. Other common triggers are push, schedule, workflow_dispatch, release, issue_comment, pull_request_review, and merge_group. Schedule means a timer, workflow_dispatch means someone can start it manually from the Actions tab, and pull_request is the one contributors usually notice first.
Jamie: Because that is the one that runs checks on my PR.
Alex: Yes. On the pull request Conversation tab, near the merge area, GitHub shows status checks. A yellow or orange spinner means the check is still running, a green checkmark means it passed, a red X means something failed, and a gray slashed circle usually means the check was skipped by design.
Jamie: And required checks are the ones that can block merging.
Alex: Right. Non-required checks may still be useful, but required checks must pass before the pull request can be merged, if the repository has that rule enabled. Some projects also put status badges in the README so visitors can see whether the main branch is currently passing its workflow.
Jamie: If I'm using NVDA or JAWS, how do I get to the checks without wandering the whole page?
Alex: Open the pull request Conversation tab, then move by headings with H, or by heading level if that is easier, until you find the checks area. Each result is usually exposed as a link or button with a name and status, and you can press Enter on a failed one to open more detail.
Jamie: And with VoiceOver on macOS?
Alex: Use VO+U to open the Rotor, choose Headings, move to the checks area, then read through the results with VO+Arrow. When you find the failed check link, activate it with VO+Space.
Jamie: What if I want to look at the full workflow run instead of just the pull request summary?
Alex: Use the repository navigation and open the Actions tab. It is in the repo's top navigation, often near Projects and Security, with a play-button style icon. In the Actions tab, you can choose a workflow, then choose a run, then expand a job and read the step logs.
Jamie: Logs are where the real clue usually lives.
Alex: Yes. You are looking for the first failing step, the error message, and any file names or line numbers. Some workflows also upload artifacts, which are files produced by the run, like test reports, coverage reports, screenshots, build output, or accessibility scan results.
Jamie: What kinds of workflows should a new contributor expect to see in real projects?
Alex: Continuous integration, or CI, is the big one. It usually means running tests every time someone opens or updates a pull request, so maintainers can see whether the change broke existing behavior.
Jamie: Then there are style checks, right? The ones that complain about formatting.
Alex: Yes. Linting checks code style and common mistakes. Documentation projects may run spelling checks, link checks, Markdown checks, or build the docs site to make sure the pages still compile.
Jamie: Accessibility and security checks can show up too.
Alex: They can. Accessibility workflows might scan pages for detectable issues, while security workflows might check dependencies or scan for known vulnerabilities. Deployment workflows are another common pattern: a project may deploy to production when code is pushed to main, or create a preview build for each pull request.
Jamie: You mentioned reusable actions earlier. Where do maintainers find those?
Alex: Many reusable actions are shared through the GitHub Marketplace under the Actions category. A maintainer can search for an action that sets up Node, checks out code, uploads an artifact, deploys a site, or runs a specific tool.
Jamie: So an action is like a reusable automation component, not necessarily the whole workflow.
Alex: Exactly. The workflow is the full recipe. An action is one reusable ingredient that a step can call with uses: and often configure with with: options.
Jamie: What about matrix builds? I see that phrase in a lot of CI files.
Alex: A matrix build runs the same job across several combinations. For example, a project might test Node.js 18, 20, and 22, or test on ubuntu-latest, windows-latest, and macos-latest. That helps maintainers catch a problem that only appears in one version or one operating system.
Jamie: For low vision learners, this is where indentation and nesting can get hard to track.
Alex: Absolutely. Increase the editor font size, turn on visible whitespace in VS Code, and use YAML syntax highlighting if it helps. In workflow files, a line in the wrong indentation level can change the meaning or break the file entirely.
Alex: Now, the moment everyone meets eventually: a check fails.
Jamie: I appreciate naming that, because the first red X can feel like you broke the whole project.
Alex: Usually you did not. Start by opening the failed check, then open the workflow run, then expand the failed job. Inside that job, find the step marked as failed and read the log around the error.
Jamie: Should I read from the very top of the log?
Alex: Not usually. Start near the failed step and look for the first real error message, not every warning. A useful error often mentions a command, a file path, a missing dependency, a test name, or a line number.
Jamie: Then I fix the issue locally or in the web editor, commit, and push again?
Alex: Yes. Pushing another commit to the same branch usually reruns the pull request checks. If you are stuck, leave a clear comment on the pull request that says which check failed, what error you found, and what you already tried.
Jamie: That gives maintainers something concrete to respond to.
Alex: Security matters a lot in workflows because automation can access code, tokens, and deployment systems.
Jamie: Is that why GitHub sometimes asks maintainers to approve workflows from first-time contributors?
Alex: Yes. Some repositories require approval before running workflows on contributions from new or external contributors, especially when the workflow could use secrets or write permissions. That pause is a safety measure, not a personal rejection.
Jamie: Let's define secrets, because that word is easy to misunderstand.
Alex: A secret is an encrypted value stored in repository or organization settings, usually for API keys, tokens, passwords, or deployment credentials. Workflows can read secrets without printing the actual value, if they are configured correctly.
Jamie: And environment variables?
Alex: Environment variables are named values available to commands while the job runs. Some are harmless, like a version number or a build mode. Sensitive values should be stored as secrets, not typed directly into a YAML file, a log, an issue, or a pull request comment.
Jamie: Where does Dependabot fit into this?
Alex: Dependabot can open pull requests that update dependencies or security alerts. Those PRs may trigger workflows too, and maintainers still review the checks before merging.
Alex: Accessibility-focused workflows are helpful, but they are not magic.
Jamie: Meaning they can catch some barriers automatically, but not every barrier a person might experience.
Alex: Exactly. Tools such as GitHub's Accessibility Scanner Action, axe-based checks, pa11y, Lighthouse, or project-specific scripts can detect issues like missing labels, color contrast problems in some contexts, invalid HTML, and certain ARIA mistakes.
Jamie: But they cannot tell whether the whole experience makes sense with a screen reader.
Alex: Right. Automated scans do not replace keyboard testing, screen reader testing, magnification checks, plain language review, or feedback from disabled users. They are useful gates, but they are only part of accessibility practice.
Jamie: Some workflows need the app running before they can scan it, yes?
Alex: Yes. A workflow may need to install dependencies, build the project, start a local server, wait for the page to become available, and then point the scanner at that URL. On GitHub-hosted runners, the environment is temporary, so the workflow has to prepare everything it needs each time.
Jamie: What is a good hands-on activity for this appendix if I do not want to write a workflow from scratch?
Alex: Pick a repository you are allowed to inspect and open .github/workflows. Choose one YAML file and identify its name, its on: triggers, the jobs it defines, the runner it uses, and one step that runs a command.
Jamie: Then I would open the Actions tab and compare the file to a real run.
Alex: Yes. Find a recent run, open a job, read several step names, and notice whether any artifacts were uploaded. If there is a pull request with checks, compare the PR status summary with the workflow run details.
Jamie: And the reflection questions are practical: What started the workflow? Which check would block a merge? Where would I click or activate if it failed? What would I tell a maintainer if I needed help?
Alex: Exactly. GitHub Actions can look intimidating at first, but most contributor work comes down to reading the status, opening the failed run when needed, understanding the error, and making the next small fix.
65. Episode 35: Profile, Sponsors, and Wikis
Profile README, GitHub Sponsors, and repository Wikis.
Based on: Appendix T: Profile, Sponsors, and Wikis
Read Transcript - Episode 35: Profile, Sponsors, and Wikis
Transcript
Alex: Welcome back. Today we're looking at the parts of GitHub that people see before they ever open your code: your profile, GitHub Sponsors, and repository wikis.
Jamie: I like that framing, because GitHub can feel like a bunch of repositories. But when someone visits your account, they're also meeting a person, a maintainer, or a community member.
Alex: Exactly. Your profile page shows your avatar, bio, activity, pinned repositories, and, if you create one, a custom profile README. It can say what you work on, what you care about, and where someone should go next.
Jamie: So it's not just decoration. It's a way to help visitors understand whether your work is relevant to them.
Alex: Yes, and the same community idea shows up in Sponsors and wikis. Sponsors helps people financially support open source work, and wikis give a repository a place for shared documentation that sits alongside the code.
Jamie: The profile README is the part that always sounds a little magical to me. How does GitHub know to put one README on your profile page?
Alex: GitHub looks for a special public repository whose name exactly matches your username. If your username is janesmith, the repository would be janesmith/janesmith. The README in that repository appears directly on your GitHub profile, below your avatar and bio.
Jamie: Exact match sounds important there.
Alex: It is. Create a new repository, name it exactly your username, make it public, and initialize it with a README. Then edit that README like any other Markdown file.
Jamie: And this is not something you need to fork from someone else. It's your own repository, just with a special name.
Alex: Right. Once it exists, your profile README becomes a small landing page for visitors. You can keep it simple, and you can change it later as your work changes.
Jamie: That's reassuring. A profile doesn't have to be perfect on day one.
Alex: A useful profile README usually starts with a short introduction: who you are and what kind of work you do. Then you might add your current focus, like learning TypeScript, improving documentation, or contributing to accessibility tooling.
Jamie: Skills can fit there too, right? Languages, tools, frameworks, testing experience, that kind of thing.
Alex: Yes, as long as it stays readable. You might include JavaScript, Python, HTML and CSS, Git, GitHub Actions, or screen reader testing with NVDA, JAWS, or VoiceOver. If you want people to contact you, include links to a personal site, LinkedIn, or an email address you actually want to share.
Jamie: The example in the reading has a very human shape: Hi, I'm Jane Smith, then current focus, skills, get in touch, and a fun fact.
Alex: That's a good pattern. It tells visitors what Jane is working on, what she can help with, and something personal enough to make the profile feel real.
Jamie: What should people avoid?
Alex: A few common traps: too many badges, auto-generated stats widgets that may not be accessible, and long walls of text. A concise paragraph with a few headings and links is usually better than a noisy profile that takes work to understand.
Jamie: So authentic beats flashy.
Alex: Accessibility matters a lot here because your profile README is regular page content. People may navigate it by headings, links, or plain reading order, so structure makes a real difference.
Jamie: That means use Markdown headings like ## Current focus and ## Skills, not just bold text that looks like a heading visually.
Alex: Exactly. If you include images, write useful alt text, such as , rather than leaving the image unexplained. And avoid ASCII art, because screen readers may read it character by character.
Jamie: That can turn a cute visual banner into a very long audio mess.
Alex: It can. Also test your profile in GitHub's light and dark themes, especially if you use custom images or colored text in images. Low vision visitors need enough contrast in both modes.
Jamie: And if you're a screen reader user publishing your own profile, it's worth reading it back before assuming it works.
Alex: Yes. Open the profile page as a visitor would, move by headings, move by links, and listen for anything that feels repetitive, missing, or confusing.
Jamie: The profile page has other pieces besides the README. Pinned repositories are one of the first things I notice.
Alex: You can pin up to six repositories to highlight work you want people to see first. From your profile, use Customize your pins and choose the repositories that best represent your current work.
Jamie: Then there's the contribution graph, the grid of green squares.
Alex: Those green squares represent GitHub activity over the past year, including things like commits, pull requests, and issues. You don't customize the graph directly, but it reflects visible activity and consistency over time.
Jamie: And status is the temporary message, right? Like on vacation until March 15.
Alex: Right. On your profile, use the smile icon to set a status message. It's a small signal, but it helps people understand availability or context.
Jamie: Sponsors is the part that can feel awkward to ask about. What is GitHub Sponsors, in plain terms?
Alex: GitHub Sponsors lets people financially support developers and projects they depend on. It's similar to Patreon for open source: a maintainer or project sets up sponsorship tiers, and supporters choose a monthly amount or sometimes a custom amount.
Jamie: And GitHub doesn't take a fee from those sponsorship payments?
Alex: Correct, the payment goes to the developer or project. Sponsorship can help maintainers keep projects alive, pay for tools, or justify time spent fixing bugs, writing docs, and supporting users.
Jamie: Why would someone sponsor a project instead of just starring it?
Alex: A star is a signal of interest or appreciation. Sponsorship is material support. If an open source project saves you time, helps your workplace, or supports your accessibility needs, sponsorship can be a direct thank-you.
Jamie: How does someone sponsor from GitHub?
Alex: Go to a user's profile or a repository page and look near the top for the Sponsor button, often shown with a heart icon. Choose a tier or custom amount, select a payment method such as a credit card or PayPal, and GitHub sends a receipt. You can often choose whether the sponsorship appears publicly on your profile.
Jamie: For screen reader users, the button is still a normal button element?
Alex: Yes. You can press B to move through buttons until you hear Sponsor. Low vision users can look near the profile photo or repository name area; the heart icon often has a pink or magenta accent near the Star and Watch controls.
Alex: Maintainers can also receive sponsorships if they're eligible and doing open source work.
Jamie: What does setup involve?
Alex: Start at github.com/sponsors and choose the option to join the waitlist or set up Sponsors, depending on what GitHub shows for your account. Then connect a payment method, such as Stripe or a bank account, and create sponsor tiers with clear descriptions.
Jamie: The tier descriptions seem important. People want to know whether they're just supporting the work, getting updates, or receiving something extra.
Alex: Exactly. Some maintainers offer sponsor-only updates, community access, early releases, or priority support. Others keep it simple and frame every tier as sustaining the work.
Jamie: And accessibility advocates can use this too, not just large software projects.
Alex: Absolutely. People who maintain assistive technology resources, inclusive design tools, documentation, or testing libraries can use Sponsors to fund ongoing work.
Jamie: That makes open source feel less like invisible labor.
Alex: Wikis are the documentation side of this conversation. A GitHub wiki is a separate Markdown-based documentation space attached to a repository.
Jamie: Separate from the README, but still connected to the repo?
Alex: Yes. The README is usually the front door: what the project is, how to install it, and where to begin. A wiki is better for multi-page material, like tutorials, FAQs, meeting notes, or community-editable guides.
Jamie: When would you not use a wiki?
Alex: If documentation needs to change in the same pull request as the code, a docs/ folder in the main repository is often better. That keeps docs version-controlled with the project and lets normal review rules apply. If you need a polished public site, GitHub Pages or external docs may be a better fit.
Jamie: So README for the short entry point, docs/ for versioned project documentation, and wiki for lightweight shared reference that can live beside the code.
Alex: That's a solid way to choose.
Alex: To use a wiki, open the repository and select the Wiki tab. If no wiki exists yet, GitHub offers to create the first page. After that, you can select New page, add a title and Markdown content, and save it.
Jamie: And once pages exist, GitHub builds navigation for them?
Alex: Yes. Wiki pages appear in a sidebar, usually on the right side of the page, with links to the other wiki pages. You can also link between wiki pages using double brackets, like [[Page Title]].
Jamie: Does the editor feel familiar?
Alex: It should. GitHub's wiki editor is similar to the issue and pull request comment editor, and normal Markdown works: headings, lists, links, and code blocks. Use heading levels in order so the page is easy to scan and easy to navigate by heading.
Jamie: There's one caveat I don't want people to miss: wikis are separate Git repositories.
Alex: Right. Changes pushed directly to a wiki's Git remote are not tracked by the main repository's branch protection, so they may not go through the same pull request review process. Treat wikis as helpful supplementary documentation, not the only home for critical project docs.
Jamie: The broader appendix also touches neighboring community features: organizations, templates, repository settings, stars, watching, following, Explore, Trending, topics, lists, and the GitHub CLI.
Alex: Those all shape how people find projects and move through GitHub communities. For this episode, the center is more personal and project-facing: how your profile introduces you, how Sponsors can sustain work, and how wikis can organize shared knowledge.
Jamie: So the practical takeaway is pretty simple. Make your profile readable, make support options clear when they apply, and choose the right documentation home for the job.
Alex: Exactly. A clear profile, thoughtful sponsorship information, and accessible docs all make collaboration easier before anyone writes a line of code.
66. Episode 36: Organizations and Templates
GitHub Organizations, repository templates, visibility, and archiving.
Based on: Appendix T: Organizations and Templates
Read Transcript - Episode 36: Organizations and Templates
Transcript
Alex: Welcome back. Today we're looking at GitHub organizations, repository templates, and the settings that shape how a project feels before you ever open a file.
Jamie: I like that framing, because contributors often meet a project through its structure first. Who owns it, whether it is public, whether it is archived, whether there is a template button... all of that tells you something.
Alex: Exactly. This companion sits inside a larger community appendix, so it touches profiles, Sponsors, wikis, and social discovery too. Episode 36 leans into the structural pieces, but those community features are part of the same picture.
Jamie: So before we get into organizations, what does a person's public GitHub presence include?
Alex: The big one is the profile README. If you create a public repository named exactly the same as your GitHub username, the README from that repository appears on your profile page.
Jamie: That still feels like a hidden feature. What would someone put there without making it overwhelming?
Alex: A short introduction, what you are learning or building now, a few skills, contact links if you want to share them, and maybe one human detail. Keep it current, avoid a wall of badges, and be careful with auto-generated stats widgets because they can be noisy or inaccessible.
Jamie: And for accessibility, use real headings, add alt text for images, and skip ASCII art because a screen reader may read every character out loud.
Alex: Yes. Pinned repositories, your contribution graph, and a temporary status message also shape the profile. They are not a substitute for good work, but they help visitors understand where to look first.
Jamie: Now the group version of that public presence is an organization, right?
Alex: Right. A GitHub organization is a shared account for a group, such as an open source project, a company, a school cohort, or a community team. Instead of one personal account owning everything, the organization owns repositories and manages people around them.
Jamie: If someone creates an organization, do they have to pay?
Alex: Not necessarily. GitHub has free organization plans, and paid plans add features that teams may need, such as more advanced security, administration, or enterprise controls. The choice depends on the group's size, privacy needs, and governance requirements.
Jamie: From a contributor's point of view, the organization page is a starting map.
Alex: Yes. You can usually find repositories, people, teams if they are visible to you, projects, packages, and organization-level information. The exact page changes depending on your permissions, so do not assume that every tab is missing for everyone if you cannot see it.
Jamie: Organizations also have roles, and this is where I sometimes get nervous. Who can actually do what?
Alex: At the organization level, owners have broad administrative control. Members belong to the organization but their access depends on repository permissions and team membership. Billing managers handle payment and billing details without necessarily managing code.
Jamie: So a member is not automatically an admin on every repository.
Alex: Correct. Teams are how organizations group members by role or responsibility, like documentation, maintainers, accessibility review, or release engineering. A team can be granted access to one repository or many repositories, with permission levels such as read, triage, write, maintain, or admin.
Jamie: What about membership visibility? I have seen profiles where organization membership is public, and others where it is not shown.
Alex: Members can often choose whether their membership is public on their profile or private. Joining usually happens through an invitation, and after you accept, your visible access still depends on the organization's settings and the teams you are placed in.
Jamie: Repository visibility is another setting contributors run into right away.
Alex: Yes. A public repository can be viewed by anyone. A private repository is limited to people or teams with access. Internal repositories are available in certain enterprise environments, where they are visible to members inside that enterprise but not to the public internet.
Jamie: So internal is not just a nicer word for private.
Alex: Right. It has a specific meaning tied to enterprise accounts. For contributors, visibility affects whether you can clone the repository, open issues, read discussions, see pull requests, or even know the repository exists.
Jamie: That explains why two people can be talking about the same organization and see different things.
Alex: Repository templates are a different kind of structure. A template repository is a starter project that other people can copy into a new repository.
Jamie: How is that different from a fork? Because both sound like copies.
Alex: A fork keeps a relationship to the original repository, which is useful when you plan to propose changes back with pull requests. A template is for starting something new from a prepared set of files. The new repository is not part of the original repository's fork network.
Jamie: So if I want to contribute to an existing project, I probably fork. If I want to start my own project from a starter kit, I use a template.
Alex: Exactly. When you create from a template, GitHub copies the selected template contents into a new repository. It does not copy issues, pull requests, stars, watchers, or the social history around the original project.
Jamie: What about branches and commit history?
Alex: By default, you get the template's default branch contents. If the template has more branches, GitHub can offer an option to include all branches. The generated repository starts fresh, so you are not inheriting the original project's full collaboration history.
Jamie: How does someone make a repository into a template?
Alex: You start with a normal repository, prepare the files people should begin with, and then go to the repository settings. In the general settings area, there is a Template repository option you can turn on.
Jamie: What belongs in a good template?
Alex: Usually a README, a license if appropriate, a code of conduct, contributing guidance, starter source files, issue templates, pull request templates, and maybe workflow files if they are safe for reuse. Do not include secrets, personal credentials, private configuration, or assumptions that only make sense for one person.
Jamie: And to use one, you find the template repository and activate the template control near the top of the page.
Alex: Yes. Choose the owner for the new repository, give it a name, pick public or private visibility as allowed, decide whether to include all branches if that option appears, and create it. After it opens, confirm the files you expected are present before you start editing.
Jamie: For screen reader use, I would search the page for buttons and listen for the template control, then move through the create repository form field by field.
Alex: That is a reliable way to stay oriented. The important check is that the new repository is yours or belongs to the intended organization, not the original template owner.
Jamie: Some repository settings are not flashy, but contributors need to notice them.
Alex: Repository topics are one example. They are short labels that help people discover projects by category, such as accessibility, documentation, Python, or good first issue.
Jamie: Topics are social and structural at the same time. They help search, but they also tell visitors what the project thinks it is.
Alex: Exactly. The default branch name is another setting to notice. It affects what branch you land on first, what branch a pull request may target by default, and what branch you may need to update before starting work.
Jamie: So if a guide says main but the repository uses something else, pause and check the actual branch name.
Alex: Yes. Also pay attention to visibility, archived state, and whether issues or discussions are enabled. Those settings explain why a contribution path may be open in one project and unavailable in another.
Jamie: Archived repositories are easy to misunderstand. Does archived mean deleted?
Alex: No. Archiving makes a repository read-only and marks it as no longer actively maintained. People can still view and often clone it, but normal collaboration actions like opening new issues or pull requests are disabled.
Jamie: When would archiving be the right choice?
Alex: When a project is replaced, retired, kept for historical reference, or preserved after a class or event. Archiving is kinder than leaving people to wonder whether anyone is watching. It sends a clear maintenance signal.
Jamie: And if the project should keep living somewhere else, that is where transfer comes in?
Alex: Yes. Transferring repository ownership moves a repository from one user or organization to another. Existing web and Git URLs usually redirect, but permissions, teams, branch protections, Actions secrets, and billing context should be reviewed carefully.
Jamie: So transfer is not just a name change. It can affect who has power over the project.
Alex: Right. You need the right administrative permissions, and if you transfer into an organization, that organization may need to accept or allow it. Before transferring, tell collaborators what is happening and check anything that depends on ownership.
Jamie: The appendix also talks about Sponsors and wikis, which feel less like repository settings and more like community support.
Alex: GitHub Sponsors lets people financially support maintainers or projects. A Sponsor button may appear on a profile or repository, and from there a sponsor can choose a tier, select payment, and decide whether the support is shown publicly.
Jamie: And the same idea can work in the other direction. If someone maintains open source work, they may be able to set up a Sponsors profile with tiers and payment details.
Alex: Exactly. Wikis are another community feature. A repository wiki is a separate Markdown-based documentation area, useful for multi-page guides, FAQs, or community-editable notes that do not belong in the README.
Jamie: But not every project should use a wiki.
Alex: Right. If documentation needs the same review process as code, keep it in the repository. Wikis are separate Git repositories, and changes pushed directly to a wiki do not go through the main repository's branch protections or pull request review.
Jamie: Accessibility-wise, the same Markdown habits apply: clear headings, lists that are real lists, meaningful link text, and page titles that make sense out of context.
Jamie: GitHub also has a whole social layer around finding and following work.
Alex: Stars are bookmarks and signals. They help you save repositories and they can show maintainers that people value the project, though a star is not the same as a contribution.
Jamie: Watching is more active because it affects notifications.
Alex: Yes. You can watch repository activity at different levels, ignore a repository, or use more granular choices on the web interface. The GitHub CLI can help with common actions like starring, unstarring, watching, and listing what you follow, but some fine-grained options are web-only.
Jamie: Following people affects what you discover, and the home feed can surface activity from people and repositories you follow.
Alex: Explore, Trending, Topics, and Lists are discovery tools. Topics help you browse by category, Trending shows what is getting attention, and Lists let you organize starred repositories from the web interface.
Jamie: For accessible and inclusive projects, search terms matter. Accessibility, screen reader, WCAG, inclusive design, good first issue, and help wanted can lead to very different results.
Alex: And it helps to look at organizations and people trusted by the community. Their pinned repositories, topics, stars, and following lists can lead you toward projects with clearer contribution paths.
Jamie: So your own presence is part of that network too: profile README, pinned repositories, contribution activity, and what you choose to star or follow.
Alex: The practical takeaway is that GitHub is not only files and commits. Organizations explain ownership, teams explain access, templates explain project starting points, and settings explain what kinds of contribution are possible.
Jamie: And the social features help you decide where to spend your attention. Stars, watches, follows, topics, profiles, Sponsors, and wikis all add context around the code.
Alex: When you land on an unfamiliar repository, check who owns it, whether it belongs to an organization, whether it is public, private, internal, active, archived, or based on a template. Then check the README, topics, default branch, issues, and contribution guidance.
Jamie: That gives you a calm way to read the room before you act.
Alex: Exactly. Good contributors do not only know Git commands. They learn how the project is organized, who maintains it, and what path the repository is offering.
67. Episode 37: Contributing to Open Source
Finding issues, scoping contributions, the fork-to-PR workflow, and building habits.
Based on: Chapter 8: Contributing to Open Source
Read Transcript - Episode 37: Contributing to Open Source
Transcript
Alex: Welcome back. Today we're talking about contributing to open source, which can sound huge until you realize how many kinds of contribution actually count.
Jamie: I like starting there, because a lot of people hear open source and immediately picture code. And then they quietly decide, nope, not for me yet.
Alex: Right, but open source means the project is available for people to use, inspect, improve, and discuss in public. A contribution might be code, but it might also be documentation, tests, design feedback, triage on issues, accessibility notes, or a careful review of someone else's pull request.
Jamie: So reporting a confusing instruction, improving a README, or confirming that a bug still happens can all be real help.
Alex: Absolutely. In this workshop, you already start practicing that in Challenge 03, where comments, mentions, reactions, and peer communication matter. The first contribution habit is not being loud. It's being useful and clear.
Jamie: That feels more welcoming. You don't have to arrive as the expert. You can arrive as someone who paid attention.
Alex: Open source also has a culture layer. Technical skills help you make a change, but communication skills help the change move through a community.
Jamie: And that culture piece is exactly what Challenge 08 is asking learners to notice, right? Not just what buttons to press, but how people treat each other while work is happening.
Alex: Yes. Challenge 08 is a guided reflection in your assigned issue in the Learning Room repository. There's no bot grade, because communication quality is too human and too context-specific for that.
Jamie: What does the evidence look like?
Alex: You post a short reflection comment with three specific commitments: one respectful review habit, one clear way you'll ask for help, and one constructive way you'll respond to feedback. The facilitator is looking for actions you can actually practice, not vague promises like, I'll be nice.
Jamie: So a better version would be, I'll include the exact step where I got stuck and what I already tried.
Alex: Exactly. If writing the reflection feels hard, draft it in a text editor first, use one simple sentence per prompt, and adapt an example in your own words if you need to. When the comment appears on the issue, that comment is the evidence, and then you can close the challenge issue.
Jamie: I appreciate that this prepares people for later review work. Challenge 12 asks learners to review a classmate's pull request, and the tone you practice now shows up there.
Alex: It does. The pattern is simple: read the community norms, connect them to something that happened on Day 1, write down a behavior, and then use it in comments, reviews, and pull requests.
Jamie: Okay, so suppose I want to contribute outside the workshop. How do I find something that won't swallow my whole week?
Alex: Start with labels like good first issue and help wanted. Good first issue usually means the maintainers believe the task is approachable for someone new to the project, and help wanted means they are actively inviting outside help.
Jamie: Usually is doing some work there.
Alex: It is. Labels are signals, not guarantees. Before you claim an issue, read the whole thread, check whether someone is already working on it, look for recent maintainer replies, and see whether the requested change is actually clear.
Jamie: What are signs that a first contribution is too big?
Alex: If the issue touches many parts of the codebase, requires a design decision nobody has made yet, changes public behavior for users, or has a long debate attached to it, save that one for later. A strong first contribution is small, specific, and easy to verify.
Jamie: So pick one typo, one missing example, one failing test, one accessibility note, one small docs improvement.
Alex: Yes. And the good first issue label comes with a social agreement. Maintainers should make the issue clearer than usual, and contributors should ask before expanding the scope or rewriting half the project.
Jamie: Before I even pick an issue, how do I tell whether a project is a healthy place to contribute?
Alex: Look for recent activity, respectful conversations, and maintainers who respond at least sometimes. You don't need instant replies, because open source is often asynchronous, but you do want signs that the project is alive.
Jamie: Asynchronous meaning people are not all online at the same time.
Alex: Exactly. Also check the community health files. CONTRIBUTING.md tells you how that project wants contributions made. CODE_OF_CONDUCT.md describes expected behavior. SECURITY.md tells you how to report vulnerabilities safely. LICENSE explains how the project can be used and shared.
Jamie: And CONTRIBUTING.md is not optional reading, even if you already know Git.
Alex: Right. Every project has its own expectations. One project may want an issue before every PR. Another may welcome tiny documentation pull requests without discussion. Some want tests, changelog entries, screenshots, or a specific commit style.
Jamie: Where do people find those files?
Alex: Usually at the top level of the repository, sometimes in a .github folder. GitHub often surfaces community files on the repository page, and many projects link them from the README.
Jamie: And the communication channel matters too. A bug report belongs in an issue, a proposed code change belongs in a PR, a security vulnerability should follow SECURITY.md, and casual questions may belong in Discussions, chat, or wherever the project points you.
Alex: Once you've found a good target, the standard workflow in this course is GitHub Flow. It's lightweight: branch from main, make a focused change, open a pull request, discuss it, pass checks, and merge when it's ready.
Jamie: And this is the same basic shape learners practiced in the Learning Room repository on Day 1: issue, branch, commit, pull request, merge.
Alex: Yes. In a public project, you may not have permission to push branches directly, so you often fork first. A fork is your copy of the repository under your GitHub account. Then you clone it to your computer, create a branch, edit files, commit, push that branch to your fork, and open a pull request back to the original project.
Jamie: That's the fork-to-PR path people hear about.
Alex: Exactly. The important habit is one task per branch. If you're fixing missing alt text, don't also reorganize the README and rename files in the same branch.
Jamie: Because then the review becomes about everything at once.
Alex: Right. Small pull requests are easier to review, easier to test, and easier to merge. They also make it easier for maintainers to say yes.
Jamie: Where does Git Flow fit into this? I see that phrase in older articles.
Alex: Git Flow is a more complex branching model with long-lived main and develop branches, plus feature, release, and hotfix branches. It can make sense for teams shipping scheduled versions, like mobile apps, firmware, or enterprise products. This workshop uses GitHub Flow because it fits open source contribution better: main stays deployable, changes are reviewed through PRs, and you don't need to manage several long-lived branch types.
Jamie: What about forks getting stale? I always worry that I made my fork, walked away for a few days, and now the original project moved on without me.
Alex: That can happen, and it's normal. Syncing your fork means bringing changes from the original repository into your copy so your work starts from current code.
Jamie: When should I sync?
Alex: Sync before starting a new contribution, before opening a pull request if time has passed, and whenever GitHub says your branch is behind. The easiest method is the GitHub web interface: open your fork, use the Sync fork control, and update it if GitHub offers that option.
Jamie: And if someone is using the command line in the VS Code terminal?
Alex: The one-time setup is adding the original project as an upstream remote. After that, switch to your main branch, fetch upstream changes, merge upstream's main into yours, and push the updated main back to your fork. Many projects use main, but if a project uses a different default branch name, follow that project.
Jamie: GitHub Desktop has a path for this too, right?
Alex: Yes. GitHub Desktop can fetch, show that your branch is behind, and help you update from the upstream repository. The exact button names may shift, so listen for the repository, branch, fetch, and update cues rather than memorizing one screen.
Jamie: Let's talk commits, because I know a commit message can be technically valid and still not very helpful.
Alex: A good commit message starts with a short first line that says what changed. A common style is a present-tense phrase like, fix missing label on search field, or docs: clarify setup steps.
Jamie: So not update stuff.
Alex: Please, no update stuff. The body is optional, but useful when the why needs explanation. The footer is also optional and often used for references like related issue numbers or breaking-change notes.
Jamie: And atomic commits are the goal?
Alex: Yes. Atomic means one coherent change per commit. If you fix a typo, update a test, and refactor a helper function for unrelated reasons, those probably should not all be one commit.
Jamie: Common mistakes would be vague messages, giant mixed commits, messages that describe your mood instead of the change, or a commit that says fix but doesn't say what was fixed.
Alex: Exactly. Helpful messages make review easier, and they make future troubleshooting easier when someone reads the project history months later.
Jamie: Now the pull request. What should go in the description so maintainers don't have to guess?
Alex: Start with what changed and why. Then include how you tested it, any screenshots or notes if the change affects the interface, and a link to the related issue if there is one. If the PR is not ready, open it as a draft and say what is still missing.
Jamie: For accessibility work, I would add what assistive technology or browser I used, if I tested that.
Alex: Yes, and be precise. For example, this adds an accessible name to the search button and I checked it with keyboard navigation and a screen reader. That gives reviewers something concrete to evaluate.
Jamie: What about receiving review feedback? That can feel personal even when it isn't meant that way.
Alex: Start by saying thank you, then separate the comment from your identity. Explain your choices if there was a reason, ask clarifying questions when a request is unclear, and surface blockers early if you can't make a change.
Jamie: And reviewers have responsibilities too.
Alex: Definitely. Review the code, not the person. Don't gatekeep knowledge. Ask questions instead of issuing demands. Make it clear when something is required versus just your preference. And when the work is ready, approve explicitly instead of leaving the author wondering.
Jamie: Open source communication is mostly written, delayed, and public. That combination can make tone tricky.
Alex: It can. Helpful feedback usually starts by acknowledging what's working, then names the specific concern, explains why it matters, suggests a path forward when possible, and signals how important the concern is.
Jamie: So instead of, this is wrong, I might write, the form labels are clearer now. One concern: the submit button still doesn't have an accessible name, which may make it hard to identify with assistive technology. Could we add visible text or an aria-label here? Blocking for accessibility.
Alex: That's a strong example. It describes the code, not the person. It uses we where appropriate, leaves room for uncertainty, and explains the impact.
Jamie: What language habits help?
Alex: Avoid urgency markers unless something is genuinely urgent. Use tentative language when you're uncertain, like, I may be missing something, or, would this work better if...? Also remember that people may be writing in a second or third language, so clarity matters more than cleverness.
Jamie: And commenting etiquette includes not piling on. If five people already said the same thing, a reaction may be enough.
Alex: Yes. Keep comments focused, resolve conversations when the concern has been addressed, and don't leave threads hanging if someone answered your question. Reactions are useful for lightweight agreement, thanks, or acknowledgement without adding noise.
Jamie: The chapter also mentions saved replies, which are surprisingly practical.
Alex: They are an accessibility win because you can reuse clear, respectful text without retyping it every time. Common uses include thanking someone for a report, asking for reproduction steps, or explaining how to add testing details. In GitHub settings, you create a saved reply, give it a title, add the reusable text, and then insert it from the comment box when needed.
Jamie: And with a screen reader, the path is basically settings, saved replies, create or edit the reply, then use the saved reply control in a comment field when you're writing.
Alex: Exactly. If the interface changes, search settings for saved replies and listen for the control near the comment editor.
Jamie: What if the conversation gets difficult?
Alex: If you receive harsh feedback, pause before replying and look for the actionable part. If you disagree with a decision, explain your reasoning once, respectfully, and accept that maintainers own the project's direction.
Jamie: And if someone is rude?
Alex: Don't escalate. Refer to the Code of Conduct, involve maintainers or moderators if needed, and step away if the thread is no longer productive. You deserve to contribute without being mistreated.
Jamie: What if I'm the one who caused offense by accident?
Alex: Acknowledge it directly, apologize without arguing the person's reaction, correct the behavior, and move forward. Long defensive explanations usually make the thread heavier.
Jamie: Accessibility issues can be especially sensitive because they affect real access, not just preference.
Alex: Yes. Be specific about the barrier, avoid blaming users for needing assistive technology, and don't frame accessibility as extra polish. If you can, include the environment, steps to reproduce, expected behavior, actual behavior, and impact.
Jamie: Documentation comes up a lot in first contributions. What belongs in a good README?
Alex: At minimum, a README should say what the project is, how to install or set it up, how to use it, how to contribute, and what license applies. Many projects also include examples, screenshots, support links, or accessibility notes.
Jamie: What makes a README accessible?
Alex: Use real headings in order, meaningful link text, alt text for informative images, plain language where possible, and code blocks that are labeled or introduced clearly. Avoid using images as the only way to explain a command or workflow.
Jamie: So a good README helps someone decide whether the project fits their needs and then helps them get started. A bad README makes them infer everything.
Alex: Exactly. And if you're building your portfolio, bonus-b, Document Your Journey, is a good place to practice reflective documentation and accessible Markdown. You're not just recording what you did; you're making the work understandable to someone else.
Jamie: The learning cards in the chapter are useful here too. They turn these ideas into quick reminders: how to find work, how GitHub Flow works, how to keep forks updated, how to write commits, how to comment, and how to shape a README.
Alex: That's also why community health files matter. A clear README invites people in. A clear CONTRIBUTING file tells them how to help. A Code of Conduct tells them what behavior is expected. Together, those files reduce uncertainty.
Jamie: After a contribution gets merged, what should someone do besides celebrate?
Alex: Celebrate first. Then thank the reviewer or maintainer, delete your branch if it's no longer needed, sync your fork before future work, and note what you learned while it's still fresh.
Jamie: That note could become portfolio language later.
Alex: Exactly. Sustainable contribution is built from small habits: follow projects you care about, watch issue labels, make small PRs, keep a short contribution log, and choose communities where newcomers are treated with patience.
Jamie: Where can learners keep practicing with structure?
Alex: GitHub Skills modules are a good next step because they give guided, hands-on practice with issues, pull requests, reviews, Markdown, and project workflows. They pair nicely with the workshop because you get repetition without having to invent a project from scratch.
Jamie: And community matters. Look for projects that answer newcomer questions, write clear issues, enforce their Code of Conduct, and have maintainers who explain decisions rather than shutting people down.
Alex: Bonus-c, the Group Challenge, is a nice bridge into that world. You practice dividing work, coordinating with a small team, and communicating across multiple people without losing the thread.
Jamie: So the habit is not, contribute everywhere. It's, find one place where your attention helps, make one focused change, communicate clearly, and come back when you have capacity.
Alex: That's a healthy open source rhythm. Small, respectful, steady contributions build trust over time, and trust is what turns a first pull request into a real place in a community.
68. Challenge bonus-b: Document Your Journey
Reflective documentation, portfolio language, and accessible Markdown.
Practice focus: Bonus
Download Challenge bonus-b (MP3)
Read Transcript - Challenge bonus-b: Document Your Journey
Transcript
Alex: Welcome back. Today we're working on Bonus B: Document Your Journey.
Jamie: I like this one already. It sounds less like fixing a file and more like making sense of what just happened.
Alex: That's exactly the spirit. You write a reflection document about your workshop experience, what you learned, what surprised you, and what you want to do with these skills next.
Jamie: And this is a bonus challenge, so when does it appear for learners?
Alex: Bonus challenges unlock after Challenge 15, Discover Accessibility Agents. That challenge is browse-first, because the Accessibility Agents collection is a living catalog that grows over time. After Challenge 15, Bonus B can happen before, during, or after Challenge 16, which is the Capstone Project.
Jamie: So what does completion actually look like here? Are we writing a private journal entry, or something that belongs in GitHub?
Alex: You're writing a Markdown file in a repository, usually on your own branch. The target file path is reflections/YOUR-USERNAME.md, with your actual GitHub username in the file name.
Jamie: That path is useful. It tells me this is documentation, not just a comment I might lose later.
Alex: Right. The challenge asks for a 300 to 500 word reflection with headings and lists. It should include what you learned, how the experience felt, your biggest win, what comes next, and one piece of advice for the next cohort.
Jamie: What if somebody hears that and freezes because they don't know what their biggest insight is yet?
Alex: Start with the easiest prompt: what would you tell someone starting tomorrow? One honest sentence is enough to get the file moving, and you can build from there.
Alex: A strong reflection usually has a simple arc. Before the workshop, what did GitHub feel like? During Day 1, what became less mysterious? During Day 2, what clicked because you built or reviewed something yourself?
Jamie: So not, "I learned GitHub," full stop. More like, "I learned that an issue is a conversation about an improvement," or, "I learned that a branch lets me work without disturbing main."
Alex: Yes. Day 1 happened in your Learning Room repository, which was provisioned for you. That's where you practiced the core contribution path: issue, branch, commit, pull request, and merge.
Jamie: And those moments are worth writing down because they can feel tiny while you're doing them. Filing a first issue or resolving a merge conflict can be a real confidence shift.
Alex: For Day 2, you might mention going local in VS Code, using the terminal, reviewing a pull request, or exploring the living catalog of Accessibility Agents in Challenge 15. If you connect this to the Capstone Project, remember that Challenge 16 accepts contributions to Accessibility Agents, GLOW, or any other meaningful repository.
Jamie: And the capstone evidence does not have to be a perfect, fully merged masterpiece.
Alex: Exactly. A review-ready draft or a clear contribution plan can be valid evidence. In your reflection, describe what you attempted, why you chose that repository or topic, and what you learned from preparing the work.
Jamie: Let's talk about tone, because "portfolio language" can sound intimidating. How polished should this be?
Alex: Polished enough that another person can follow it, but still in your own voice. Instead of saying, "I am now an expert developer," say what you can actually do: "I can open a focused pull request, write a clear description, and respond to review comments."
Jamie: That's more believable, and honestly more useful if someone reads it later.
Alex: Specific beats grand. Name your top three GitHub skills, explain one challenge that felt hard, and describe one win you are proud of. Then add what you'll do next, such as contribute to an accessibility project, set up Git on your personal laptop, or keep practicing with GitHub learning materials.
Jamie: And the one sentence summary at the end can be simple.
Alex: Very simple. Something like, "I came in thinking Git was only for programmers and left understanding it as a collaboration tool." If your document has headings, paragraphs, and honest reflection, you have met the main learning goal.
Alex: Markdown is the format that makes this reflection readable on GitHub. It's plain text with lightweight symbols for structure, like number signs for headings, hyphens for lists, and brackets for links.
Jamie: And GitHub turns that plain text into rendered HTML, so headings become real headings and lists become real lists.
Alex: Yes. You can practice Markdown in a GitHub issue, in any .md file in VS Code with preview, or in a GitHub Gist. In VS Code, Markdown preview is commonly opened with Ctrl+Shift+V.
Jamie: For this reflection, what are the easy accessibility wins?
Alex: Use one top-level title, then use heading levels in order. Put a space after the number signs, leave blank lines between paragraphs, and use real lists instead of long comma-heavy sentences.
Jamie: And links and images?
Alex: Use descriptive link text, not "click here." If you include an image, write alt text that explains the purpose of the image. Inline code is useful for file names like reflections/YOUR-USERNAME.md, and fenced code blocks should include a language identifier when you use them.
Jamie: GitHub Markdown has extra features too, right? Do learners need all of them for this bonus?
Alex: They don't need all of them, but it's useful to recognize them. Task lists can show next steps, alert blocks can highlight notes or warnings, and details sections can make optional material collapsible.
Jamie: I always wonder about tables. They look neat visually, but they can get noisy with assistive technology.
Alex: Use tables only when the information truly has rows and columns. Introduce the table before it appears, keep it simple, and avoid using a table just to make layout look tidy.
Jamie: What about the fancy stuff, like diagrams and math?
Alex: Mermaid diagrams need a text equivalent because the diagram alone may not communicate well to everyone. Math expressions and footnotes can be useful, but they are not needed for this reflection. Heading anchors, issue references, pull request references, commit hashes, and user mentions can help connect your story to real GitHub work.
Jamie: And HTML inside Markdown?
Alex: Use it sparingly. GitHub allows some HTML, like keyboard key styling, but blocks unsafe elements. Preview your file and listen to how the structure reads, because rendered Markdown is what most people will encounter.
Alex: The open source culture chapter gives this reflection some depth. It reminds us that technical skill gets work into a project, but communication helps people keep working together.
Jamie: So if I'm reflecting on the workshop, I can include communication habits too, not just commands I memorized.
Alex: Definitely. GitHub Flow is the core workflow: create a branch, make changes and commit, open a pull request, discuss and review, pass checks, and merge. The pull request is where the explanation, tradeoffs, review, and decision all live.
Jamie: And Git Flow is different, right? Some learners may see that term later.
Alex: Git Flow is a more complex release model with branches like develop, feature, release, and hotfix. You may see it in older or release-heavy projects, but this workshop uses GitHub Flow because it is simpler for open source contributions.
Jamie: What about forks staying current?
Alex: If you work from a fork, sync it before starting new work, after upstream changes, or before opening a pull request. The GitHub web interface is usually the easiest method, but the command line version is: add an upstream remote once, switch to main, fetch upstream, merge upstream main into your main, then push your updated main to your fork. GitHub Desktop can also handle this through its interface.
Jamie: A lot of the culture chapter is about feedback. How does that belong in a journey reflection?
Alex: You can write about the kind of collaborator you are practicing becoming. Helpful feedback usually starts by acknowledging what works, then names a specific concern, explains why it matters, suggests a path forward when possible, and makes clear whether the concern is required or optional.
Jamie: That sounds very different from just saying, "This is wrong."
Alex: Exactly. Prefer "we" language or describe the code instead of the person. Use tentative language when you're unsure, respect cultural and language differences, and avoid urgency words unless something is truly urgent.
Jamie: Comment etiquette matters too. Public threads can feel high stakes.
Alex: Keep comments focused, don't pile onto a point someone else has already made, and resolve conversations when the work is actually addressed. Reactions can acknowledge without adding noise. Saved replies can also help you reuse kind, clear language for common situations, including accessibility review notes.
Jamie: And both sides of code review have responsibilities.
Alex: Reviewers should review the work, not the person, ask questions instead of making demands, avoid gatekeeping knowledge, and approve explicitly when the work is ready. Authors can say thank you, explain choices, avoid taking feedback personally, and surface blockers early.
Alex: There are a few more open source habits that can shape the reflection. A good README explains what the project is, how to install or use it, how to contribute, and what license applies.
Jamie: And accessibility belongs there too, not hidden away.
Alex: Right. A README can mention keyboard support, screen reader notes, known accessibility limits, or how to report an accessibility issue. Community health files also matter: CONTRIBUTING.md, CODEOFCONDUCT.md, SECURITY.md, and LICENSE help people understand how the project works.
Jamie: For first-time contributors, what makes a good starting point?
Alex: Small, clear, and scoped. Read the issue before starting, check whether someone is already assigned, ask a focused question if needed, make one coherent change, and write a pull request description that explains what changed and how to review it.
Jamie: And when things get uncomfortable?
Alex: If feedback feels harsh, pause before replying and look for the actionable part. If you disagree, explain your reasoning respectfully. If someone is rude, use the project's code of conduct or ask a maintainer for help. If you caused offense, acknowledge it, apologize briefly, and adjust your behavior.
Jamie: Walk me through the actual Bonus B workflow like I'm doing it right now.
Alex: Start on your branch. Create a file at reflections/YOUR-USERNAME.md. Add a title such as "My Git Going with GitHub Journey."
Jamie: Then I add sections for before the workshop, Day 1, Day 2, what I built, and what I would tell future students.
Alex: Yes. You can also use headings like "What I learned," "My biggest win," and "What I will do next." Keep it around 300 to 500 words, use lists where they make the writing easier to scan, and keep paragraphs short.
Jamie: What should the commit message sound like?
Alex: Make it meaningful and specific, such as "Add workshop journey reflection." Then push your branch to GitHub and open a pull request. In the challenge issue, the required evidence is a link to your reflection file or pull request, plus a brief takeaway if you want to include one.
Jamie: The challenge also says sharing in wins or discussions is optional.
Alex: Yes. Share if it feels useful or encouraging, but the required part is the reflection file or PR link.
Jamie: Before someone submits, what should they check?
Alex: Preview the rendered Markdown. Make sure the heading levels make sense, paragraphs have blank lines, links have meaningful text, any images have alt text, and the file is not far outside the word count.
Jamie: And if the formatting looks wrong?
Alex: Check the common Markdown mistakes first: missing space after the number signs in a heading, no blank line between paragraphs, skipped heading levels, generic link text, missing alt text, a table with no introduction, or a code block with no language label.
Jamie: Where should learners look when they want the official answer instead of guessing from memory?
Alex: Use GitHub's official writing and formatting documentation for Markdown behavior, GitHub's open source contribution guidance for workflow, Open Source Guides for community expectations, and W3C WAI resources for accessibility patterns.
Jamie: So Bonus B is not busywork. It's a chance to turn two days of practice into something you can reread, share, and build on.
Alex: Exactly. Document the journey in your own words, format it accessibly, and leave a clear trail of what you learned and what you plan to do next.
69. Episode 38: Resources and Links
Tools, references, communities, and continued learning paths.
Based on: Appendix X: Resources and Links
Read Transcript - Episode 38: Resources and Links
Transcript
Alex: Welcome back. Episode 38 is the companion you keep open after the workshop ends. It is the resource shelf: official docs, accessibility guides, tools, communities, and learning paths, all gathered in one place.
Jamie: I like that framing, because a workshop can move fast. Having one bookmarked page means you are not trying to remember every link from memory.
Alex: Exactly. The appendix is meant to travel with you, especially if you keep it in your own copy of the workshop materials. It is organized into 16 numbered areas, so you can jump by heading instead of scrolling forever.
Jamie: And there are navigation tips right at the top, which is a small kindness. Screen reader users can use heading navigation with H, major headings with 2, and tables with T. Low vision users get reminders about zoom, column layout, and descriptive link text.
Alex: There is also a simple browser habit worth keeping: when you open a link from this reference, use your new-tab command if you want the appendix to stay available. On Windows, Ctrl+Enter is one option in many browser contexts.
Jamie: The first resource area centers on Accessibility Agents. How should learners treat that project after the workshop?
Alex: Treat Accessibility Agents as a living catalog. It grows over time, so the useful habit is not memorizing a fixed list, but knowing where the main repository, getting started guide, full reference guide, setup guide, contributing guide, security policy, and license live.
Jamie: And just to keep the curriculum straight, Challenge 15 is browse-first. Learners are not required to fork the Accessibility Agents repository just to complete that discovery challenge.
Alex: Right. If you do create a fork later, its address follows the pattern github.com, slash, your username, slash, accessibility-agents. From VS Code, you can clone it, open the folder, and use Copilot Chat if that is part of your setup.
Jamie: The appendix mentions a daily briefing command too, right?
Alex: Yes. Once the repository is open, you can open Copilot Chat with Ctrl+Alt+I if that shortcut works for your keymap, or use the Command Palette and run Chat: Open Chat. Then you can try the daily briefing prompt shown in the guide. If you want the agents to respond in ways that fit your work, copy preferences.example.md to preferences.md inside .github/agents, add your GitHub username, your most-used repositories, and your preferred output style, then commit that file.
Jamie: The next group of links is the official GitHub accessibility guidance. These feel especially important because they are not random blog posts.
Alex: Yes, they come from GitHub's accessibility documentation. There are screen reader guides for repositories, issues, pull requests, Copilot in VS Code, custom instructions, and getting started with custom agents for accessibility. There is also an accessibility settings overview for things like motion reduction, color modes, and hovercard behavior.
Jamie: So if GitHub changes visually, those guides are a better first stop than guessing from an old screenshot.
Alex: Exactly. Then the appendix points to GitHub Skills, which is GitHub's free interactive learning platform. A course runs inside GitHub: you create a repository from a template, Mona opens an issue with instructions, you make the change, and GitHub Actions checks your work.
Jamie: That sounds nice for learners who want practice without setting up a separate course account.
Alex: It is. The screen reader flow is familiar too: start the course, create the repository, go to Issues with G then I, move by headings to the Step 1 issue, read the instructions, complete the task, and return to the comments after Mona responds. The appendix even calls out comment navigation, including the 9 shortcut pattern used by NVDA and JAWS in some GitHub pages.
Jamie: And after this workshop, GitHub Skills can become a practice track. Start with Introduction to GitHub, then keep building toward pull requests, merge conflicts, code review, and release workflows.
Alex: Yes, and it pairs well with broader learning paths like freeCodeCamp and The Odin Project. GitHub Skills strengthens the collaboration mechanics, while those other paths can deepen HTML, CSS, JavaScript, testing, and project-building practice.
Jamie: The screen reader section is one I would not want buried. It gathers downloads, docs, and quick references in one place.
Alex: For Windows users, NVDA and JAWS each have official documentation and command references. NVDA is free and open source, and JAWS is a widely used commercial screen reader. Both have commands for headings, buttons, links, tables, forms, and reading context.
Jamie: And the point is not that everyone must use the same screen reader. It is that each learner can find the right official reference for their own setup.
Alex: Exactly. For Apple users, VoiceOver is built into macOS and iOS. The appendix points learners toward VoiceOver documentation and quick command references, including the VO modifier keys and common navigation patterns.
Jamie: It also leaves room for other screen readers, which matters globally. Not everyone is using the same device, operating system, or language environment.
Alex: Yes. I would use this part as a setup checklist: install or update your screen reader, keep its command reference handy, and practice the web navigation commands that show up again and again in GitHub and VS Code.
Jamie: Let us talk about VS Code, because a lot of the workshop workflows end up there.
Alex: The VS Code resources include product documentation, accessibility guidance, keyboard shortcut references, and editor features that help with source control. A few settings are especially useful: screen reader optimized mode, accessible diff viewing, terminal accessibility, and enough zoom or contrast to reduce strain.
Jamie: And there is a quick install path for the GitHub Pull Requests and Issues extension.
Alex: Right. In VS Code, open the Extensions view with Ctrl+Shift+X, search for GitHub Pull Requests and Issues, and install the extension from GitHub. If you prefer the command line, the extension identifier is GitHub.vscode-pull-request-github.
Jamie: That extension is useful because it brings issues and pull requests into the editor, instead of forcing every review step into the browser.
Alex: Then the appendix moves into Copilot resources: the main Copilot documentation, custom instructions, and guides for Copilot in VS Code with screen readers. The important distinction is that custom instructions shape how Copilot responds, while custom agents can package a more specific role or workflow.
Jamie: And agentic workflows connect back to what learners already practiced: read the issue, gather context, make a branch, change files, test, explain the result, and prepare a pull request.
Alex: Yes. Spec-driven development adds another layer. With Spec Kit, you write a clearer specification before implementation, then use slash commands such as specify, plan, and tasks to move from idea to plan to work items. It is a way to make intent explicit before code starts changing.
Alex: There is also a practical toolbox section for GitHub CLI, GitHub Desktop, Copilot in the CLI, and GitHub Mobile.
Jamie: The CLI can sound intimidating, but the commands listed are contributor-shaped. Install gh, authenticate, clone a repository, list issues, create a pull request, check pull request status, and open things in the browser when needed.
Alex: Exactly. The most useful gh commands are the ones that save a trip through several web pages: gh repo clone, gh issue list, gh issue view, gh pr create, gh pr status, gh pr checkout, and gh pr view. You do not need to learn every command on day one.
Jamie: And Copilot in the CLI adds two helper moves: explain a command you do not understand, or suggest a command for what you are trying to do.
Alex: Yes. You install the gh copilot extension, then ask for an explanation or suggestion. You still review the command before running it, especially if it changes files, deletes anything, or affects remote branches.
Jamie: GitHub Desktop and GitHub Mobile round that out. Desktop can make commits, branches, and diffs feel more approachable, and mobile is good for notifications, comments, issue triage, and quick reviews.
Alex: And the mobile apps include accessibility support from the operating system, such as screen reader compatibility, dynamic type, color settings, and touch exploration patterns. I would not use mobile for every coding task, but it is very useful for staying connected to a project.
Jamie: The best-practices section is packed. It is almost a toolbox for being easier to collaborate with.
Alex: That is a good way to say it. Saved replies help you reuse common responses without retyping them. Pinned issues keep high-priority issues visible, and pinned comments, introduced in February 2026, let maintainers highlight one important comment inside a longer thread.
Jamie: Then there are links to exact lines of code. Those use the file URL plus a line marker, like L10 or L10-L20, so people land on the same place you are discussing.
Alex: And if you need the link to stay stable, use a permalink from a specific commit instead of a moving branch. That way, even if the file changes later, your review comment still points to the old version you meant.
Jamie: I also noticed issue-to-discussion conversion, team mentions, collapsible Markdown sections, and co-authored commits.
Alex: Yes. Convert an issue to a discussion when the topic is more open-ended than actionable. Use team mentions like at-org-slash-team when a whole group needs notification. Use details and summary tags to hide long logs or optional context. And add Co-authored-by trailers to a commit message when more than one person contributed.
Jamie: Watch, star, and fork are easy to mix up, so I am glad they are explained together.
Alex: Watch controls notifications, star bookmarks or shows appreciation, and fork creates your own copy under your account. CODEOWNERS is another collaboration feature: it automatically requests review from the right people, such as docs reviewers for documentation, accessibility specialists for UI changes, security reviewers for authentication code, and a default owner for everything else.
Jamie: The appendix also points to GitHub Sponsors and advanced Markdown.
Alex: Sponsors is for financially supporting maintainers and projects when that option is enabled. Advanced Markdown covers task lists, aligned tables, Mermaid diagrams, math expressions, footnotes, and alert callout blocks. Those features can make issues, pull requests, and documentation clearer when they are used with care.
Jamie: Once learners are ready to contribute beyond the workshop, the appendix gives search ideas.
Alex: Yes. Bookmark searches for accessibility issues, good first issues, documentation fixes, help wanted labels, and repositories that mention screen readers, WCAG, ARIA, or inclusive design. Accessibility Agents, GLOW, and other meaningful repositories can all be valid places to contribute, depending on your goals and the project's contribution rules.
Jamie: And the standards section helps people check their work against something more reliable than personal preference.
Alex: Right. Keep WCAG, WAI tutorials, and the ARIA Authoring Practices Guide nearby. For testing, tools like axe DevTools, WAVE, Lighthouse, browser accessibility inspectors, and manual keyboard checks can help, but no automated tool catches everything. For Git itself, the official Git documentation, the Pro Git book, and interactive practice tools such as Learn Git Branching are good companions.
Jamie: There is also a GitHub keyboard shortcut section. The simplest reminder is that pressing question mark on many GitHub pages opens the shortcut overlay.
Alex: A few shortcuts are worth practicing early: GitHub search focus, repository navigation shortcuts, the Issues shortcut G then I, and shortcuts that move through files, comments, or pull request tabs. If a shortcut conflicts with your screen reader or browser, use the command that is most reliable for your setup.
Jamie: I appreciate that the appendix does not assume everyone has the same next step. It has learning pathways by role and by time available.
Alex: Yes. A documentation contributor might practice issues, Markdown, and pull request review. A developer might focus on branches, tests, code review, and CI results. A tester might build skill with reproducible bug reports and accessibility testing. A maintainer might study templates, CODEOWNERS, pinned content, saved replies, and community health files.
Jamie: And if someone only has 15 minutes, they can still do something useful: read one guide, bookmark one search, review one issue, or practice one shortcut.
Alex: Exactly. With an hour, you might complete a GitHub Skills lesson. With a half day, you might investigate an issue, make a small fix, and prepare a review-ready draft pull request or a contribution plan.
Jamie: The community links matter too: GitHub Accessibility, the Accessibility Agents community, open source accessibility spaces, and groups where blind and low-vision developers share practical advice.
Alex: Yes, and communities work best when you read their contribution guide, code of conduct, and support expectations before posting. The workshop documentation itself is also part of your reference system. Your provisioned Learning Room repository is where Day 1 contributions happened: issue, branch, commit, pull request, and merge. That history is worth keeping.
Jamie: And at the end, there is a source list that ties the appendix back to official references, changelogs, GitHub docs, W3C materials, and related guides.
Alex: So the takeaway is simple: do not try to memorize every link. Bookmark the appendix, learn how it is organized, and return to it whenever you need the next reliable reference, tool, community, or practice path.
70. Episode 42: Accessing Workshop Materials
Downloading the repository, reading offline, keeping updated, audio format.
Based on: Appendix Y: Accessing Workshop Materials
Read Transcript - Episode 42: Accessing Workshop Materials
Transcript
Alex: Welcome back. Today we're making the workshop materials easier to reach, easier to save, and easier to come back to when you need them.
Jamie: I like this topic because it sounds simple until you're actually trying to find the right file five minutes before an exercise starts.
Alex: Exactly. The same content can show up as Markdown source files, HTML pages, a live website, a local folder on your computer, and even this podcast series. Each format has a different job in your workflow.
Jamie: So there isn't one perfect way to read the workshop. There are a few good doors into the same material.
Alex: Yes. The main course repository is Community-Access/git-going-with-github, and this appendix supports the pre-workshop setup chapter. If a facilitator gives you a workshop link or a Learning Room link, use that shared link first, then use the repository when you want to browse, download, or update the full set of materials.
Jamie: If I'm online and just want to read, where should I start?
Alex: Start with the HTML site at community-access.org when your facilitator points you there. In some workshop setups, the site may also be shared as a GitHub Pages URL that looks like organization dot github dot io slash Learning-Room. The landing page is usually index.html, and it acts like the workshop homepage.
Jamie: What makes that better than opening random files on GitHub?
Alex: The HTML version is built for reading. Internal links between chapters and appendices work like a website, and the pages include headings, skip-to-content links, breadcrumb navigation, and ARIA landmarks. With NVDA or JAWS, you can use H to move by heading, and you can use D in NVDA or R in JAWS to jump to the main landmark on a page.
Jamie: And for low vision learners, the browser is often the familiar place to control zoom, contrast, and spacing.
Alex: Right. The HTML pages are a good workshop default because they need almost no setup. Bookmark the URL so you can get back quickly, especially during live instruction when the group is moving from one chapter to another.
Alex: You can also read the files directly on GitHub.com without downloading anything.
Jamie: This is the part where I always wonder, am I supposed to click the README, the docs folder, or some tiny file name?
Alex: On the repository page, the README renders automatically and works like a front page. To read chapters and appendices, open the docs folder, then choose a file ending in .md. GitHub renders Markdown as formatted text, so you get headings, links, and code blocks instead of only raw punctuation.
Jamie: GitHub's file list can feel crowded with a screen reader. What are the useful shortcuts?
Alex: On the main repository page, press T to open the file finder, then type part of a file name to jump straight to it. In the file listing, treat it like a table or grid and move through rows with your screen reader's table navigation or arrow keys. Once you're inside a file, use H to move by heading, and use the breadcrumb links near the top to move back up through the path, such as repository, docs, then the file name.
Jamie: And the Raw button is for when you want the actual file content, not GitHub's pretty view?
Alex: Yes. The rendered view is better for reading. Raw is useful when you want to save the exact file, because the browser shows the plain source and you can save it from there.
Jamie: What if I want everything on my computer before the workshop, not just one page at a time?
Alex: If you have Git installed, cloning is the recommended route because it gives you a full copy that can be updated later. The command is git clone https://github.com/community-access/git-going-with-github.git. Then move into the folder that was created by the clone, usually with cd git-going-with-github; if your facilitator gave you a different repository such as a Learning Room, use that folder name instead.
Jamie: So cloning brings down more than just the chapters.
Alex: It brings the Markdown source, the HTML output, scripts, learning-room materials, templates, and project files. After cloning, you can open the folder in VS Code with code dot, then use the Explorer panel with Ctrl+Shift+E to browse the file tree. Arrow to a file and press Enter to open it.
Jamie: And if someone does not have Git installed or just does not want the command line?
Alex: Use Download ZIP from GitHub.com. Go to the repository page, find the green Code button near the top of the file listing, open the dropdown, choose Download ZIP, save the file, and extract it to a folder on your computer.
Jamie: That Code button can be a little slippery with a screen reader.
Alex: It is usually after the branch selector and near the repository description. In NVDA or JAWS browse mode, press B to move by buttons until you hear Code, then activate it with Enter or Space. Arrow through the menu until you find Download ZIP. Just remember that a ZIP is a snapshot; it will not update itself later.
Alex: Sometimes you only need one file, like one appendix, one chapter, or a screen reader cheat sheet.
Jamie: Please tell me I don't have to download the whole repository for that.
Alex: You don't. On GitHub.com, navigate to the file you want, then use the Raw button above the file content. When the raw file opens in the browser, press Ctrl+S on Windows or Linux, or Cmd+S on macOS, and save it where you want it.
Jamie: Does that work for the HTML files too?
Alex: Yes. Go into the html folder, open the .html file you want, choose Raw, and save it the same way. If you already cloned the repository, the file is already on your machine, so you can just copy it from the local folder.
Jamie: Before we go farther, what am I actually looking at inside the repository?
Alex: The docs folder has the Markdown source for the chapters and appendices. The html folder has pre-built web page versions, including html/docs for the chapter and appendix pages. The learning-room folder holds practice repository files such as challenges, group exercises, and setup guides, with matching HTML versions under html/learning-room.
Jamie: And the other folders are more project infrastructure?
Alex: Right. The .github folder contains issue templates, a pull request template, Copilot agents, and slash commands. The scripts folder contains the build script that converts Markdown to HTML. At the root of the repository, you will find the README, agendas, facilitator guide, contributing guide, and other project files.
Jamie: Let's say I downloaded the materials before traveling. Can I read everything without internet?
Alex: Yes. Markdown files open in any text editor because they are plain text with lightweight formatting. In VS Code, open a .md file and press Ctrl+Shift+V to open the Markdown preview, which renders headings, links, and code blocks in a more readable view.
Jamie: That preview is helpful for low vision users too, especially if VS Code is already set up with a preferred theme.
Alex: Exactly. VS Code's preview follows your editor environment, including high-contrast themes. For the most polished offline reading, open html/index.html in your browser and navigate from there; the local HTML pages support browser zoom and still link to each other.
Jamie: Do the accessibility features survive when the HTML files are local?
Alex: They do. The landmarks, heading structure, and skip links are embedded in the files, so the offline version behaves much like the online version. The links at the bottom of pages also help you move to nearby chapters and appendices without hunting through folders.
Jamie: So the simple recommendation is browser for reading, VS Code when I want to inspect or edit.
Alex: That's a solid split. Open html/index.html when you want a local homepage. Open the repository folder in VS Code when you want to browse files, read Markdown, or prepare an edit.
Alex: Materials change, so it helps to know how your copy gets updated.
Jamie: This is where cloning and ZIP downloads really behave differently.
Alex: They do. If you cloned with Git, open a terminal in your local copy, move into the repository folder, and run git pull. If you have not changed local files, Git usually updates cleanly. If you have local edits, Git may try to merge them, and the merge conflicts chapter is the place to go if files collide.
Jamie: And what about the HTML after pulling changes?
Alex: If you're maintaining a local HTML copy from the source, run npm run build:html after pulling so the generated pages match the latest Markdown. If you downloaded a ZIP, there is no one-command update. Download a fresh ZIP from the repository and replace your old folder.
Jamie: When would you choose each format?
Alex: For live workshop reading, use the online HTML site because it is current, accessible, and does not require setup. For a quick lookup, GitHub.com is convenient. For offline reference, use the local HTML folder. For contributing improvements, edit the Markdown files in docs. For archiving a copy, use a ZIP or a clone. For staying updated over time, clone is the best choice because git pull is repeatable.
Jamie: And this audio series is another format too, right?
Alex: Yes. The podcast is useful before reading if you want a preview, and after reading if you want reinforcement. It is also a good alternative when visual reading is tiring or when you want to review concepts away from the screen.
Jamie: What about printing or exporting? Some people still like a reference packet.
Alex: For printing, the HTML version is usually easiest: open the page in a browser and use print or save as PDF. For Markdown, use the VS Code preview and print from there, or copy the content into a tool that formats it the way you need. If accessibility matters for the exported file, check the result with your screen reader or magnification setup before depending on it.
Jamie: And if something looks different later because GitHub changed its interface?
Alex: Use the course repository and the facilitator's shared site as the source of truth for workshop content. For GitHub platform behavior, check GitHub's official documentation and changelog because buttons, menus, and shortcuts can change over time.
Jamie: So the big choice is not mysterious: online HTML for the live workshop, local HTML for offline reading, Markdown for editing, Git clone for updates, ZIP for a simple snapshot, and audio when listening is the better path.
Alex: Exactly. Pick the format that lets you stay oriented, keep moving, and return to the material when you need it.
71. Episode 43: GitHub Skills - Complete Course Catalog
All 36 GitHub Skills modules organized into six learning paths.
Based on: Appendix Z: GitHub Skills - Complete Course Catalog
Read Transcript - Episode 43: GitHub Skills - Complete Course Catalog
Transcript
Alex: Welcome back. Today we're looking at GitHub Skills, which is GitHub's free, interactive course library.
Jamie: This is the catalog where the learning happens inside GitHub itself, right? Not a separate video platform or another account to manage.
Alex: Right. A Skills course gives you a real repository, real issues, real pull requests, and a bot named Mona that responds to what you do. You practice in your own copy, so mistakes are expected and safe.
Jamie: I like that because it turns the catalog from a reading list into a set of little practice labs.
Alex: Exactly. The full catalog has 36 courses in this appendix: 3 used during the workshop, and 33 more organized into six paths for continued learning.
Jamie: So the goal is not to finish everything at once. It is to pick the path that fits what you want to build next.
Alex: Every GitHub Skills course follows a familiar pattern. You open the course page, choose Start course, copy the course repository into your own account with Use this template, and create a new repository.
Jamie: And then Mona shows up?
Alex: Usually within about 20 seconds. Mona opens an issue with Step 1 instructions, you complete the task, and she checks for the action. If the task is right, she posts the next instruction as a comment or opens the next issue.
Jamie: That sounds a lot like the GitHub workflows learners have already practiced: read an issue, make a change, open or review a pull request, and look for feedback.
Alex: Yes, and that is especially helpful for accessibility. Screen reader users can use the Issues tab, press G then I in GitHub keyboard shortcuts, and use heading navigation to find titles like Step 1. In NVDA or JAWS, pressing 9 can jump to the comments section where Mona's feedback appears.
Jamie: Low vision learners can keep their GitHub theme, zoom level, and font settings too, because the course content is just standard GitHub issues and comments.
Alex: And progress is visible in the Issues tab. Open issues are work still in progress, closed issues are finished steps, and the final closed issue includes the completion message. If you are scanning visually, the purple Closed badge is one useful sign that a step is done.
Jamie: Which Skills courses are part of the workshop itself?
Alex: There are three. Introduction to GitHub covers branches, commits, pull requests, and merging. Communicate Using Markdown covers headings, emphasis, links, code blocks, task lists, and tables. Review Pull Requests covers assigning reviewers, leaving comments, suggesting changes, approving, and merging.
Jamie: And Day 1 also has the Learning Room repository, where learners do the issue, branch, commit, pull request, and merge workflow in a provisioned repo.
Alex: Yes. The Skills courses reinforce those moves with Mona, while the Learning Room gives each learner a workshop space for the guided contribution flow.
Jamie: If someone did not finish those three Skills modules during the workshop, should they start there before browsing the rest?
Alex: Yes. Complete Introduction to GitHub, Communicate Using Markdown, and Review Pull Requests first. They give you the vocabulary and muscle memory for the other paths.
Alex: The six paths are ordered by topic, not by obligation. You can follow one path from top to bottom, or use the catalog like a roadmap and choose the courses that match your role.
Jamie: So if I want stronger Git basics, I do not need to jump into security or cloud work yet.
Alex: Exactly. Path 1 is Git Fundamentals. It starts with Introduction to Git, then Resolve Merge Conflicts, then Change Commit History.
Jamie: That sounds like the path for someone who wants to understand what is happening under the GitHub buttons.
Alex: Yes. Introduction to Git practices the Git command line and VS Code with branches, commits, and merges. Resolve Merge Conflicts builds on Introduction to GitHub and teaches why conflicts happen, how to read conflict markers, and how to resolve them in the web editor. Change Commit History builds on Introduction to Git and gets into amending commits, interactive rebase, squashing, and reordering history.
Jamie: What about learners who are more interested in open source teamwork than command-line depth?
Alex: That is Path 2, GitHub Collaboration. The recommended order is Introduction to Repository Management, Connect the Dots, GitHub Pages, and Release-Based Workflow.
Jamie: Repository management sounds broad. What does it include?
Alex: It includes branch protection, issue templates, labels, milestones, and settings that make a repository easier for contributors to use. Connect the Dots teaches cross-references between issues and pull requests. GitHub Pages publishes a site from a repository, and Release-Based Workflow covers tags, versions, and releases.
Jamie: So the management and advanced collaboration pieces live here: templates, labels, milestones, publishing, and release practice.
Alex: Right. If you help maintain a project, write documentation, manage issues, or prepare releases, this path is a strong next stop.
Jamie: Automation is the one that sounds powerful and a little intimidating.
Alex: Path 3 makes it approachable. It starts with Hello GitHub Actions, which introduces workflow files, triggers, jobs, steps, and a first automated run. Then Test with Actions teaches continuous integration, often shortened to CI, where tests run automatically on pushes and pull requests.
Jamie: And after that?
Alex: Reusable Workflows teaches shared workflows that other repositories can call, including matrix strategies for running variations. Write JavaScript Actions shows how to build a custom action. Then the path continues with Publish Docker Images, Deploy to Azure, AI in Actions, and Create AI-Powered Actions.
Jamie: So the order matters here because each course assumes you understand the basic workflow file before you automate more complicated work.
Alex: Exactly. If you want tests, deployments, publishing, or script automation, start with Hello GitHub Actions and work down from there.
Jamie: There is also a Copilot path, and that one is a lot bigger than I expected.
Alex: Path 4 focuses on GitHub Copilot. It begins with Getting Started with GitHub Copilot, then moves into Build Applications with Copilot Agent Mode, Copilot Code Review, Customize Your GitHub Copilot Experience, and Expand Your Team with Copilot.
Jamie: That moves from using Copilot as an assistant to shaping how it works with a project or team.
Alex: Yes. The later courses are Integrate MCP with Copilot, Scale Institutional Knowledge Using Copilot Spaces, Create Applications with the Copilot CLI, Your First Extension for GitHub Copilot, and Modernize Your Legacy Code with GitHub Copilot.
Jamie: So this path is for people who want AI help with coding, review, team knowledge, command-line workflows, extensions, or modernization.
Jamie: Security has its own path too, which feels important for anyone publishing code publicly.
Alex: Path 5 is Security. It includes Secure Code Game, Introduction to Secret Scanning, Secure Repository Supply Chain, Introduction to CodeQL, and Configure CodeQL Language Matrix.
Jamie: Can you unpack those a bit?
Alex: Secure Code Game gives practice finding and fixing vulnerable code patterns. Secret scanning focuses on avoiding exposed tokens, passwords, and keys. Supply chain security looks at dependencies and repository risk, while CodeQL introduces code scanning with queries. The language matrix course helps configure CodeQL across projects that use more than one language.
Jamie: That feels like the path for maintainers, but also for contributors who want to understand why a pull request might trigger security checks.
Alex: Exactly. It helps you read the signals that appear in a real project before you merge.
Jamie: And the sixth path is cloud and migration.
Alex: Yes. Path 6 includes Code with Codespaces, Migrate ADO Repository, and Idea to App with Spark. Codespaces gives you a cloud development environment in the browser. Migrate ADO Repository is for moving work from Azure DevOps, often called ADO, into GitHub. Idea to App with Spark focuses on building from an application idea toward a working app.
Jamie: That path seems useful when the question is less, how do I use GitHub, and more, how do I move or build a working environment around GitHub?
Alex: Exactly. It is a good fit for teams modernizing tools, learners who need a ready-to-code environment, and builders who want to connect an idea to an app workflow.
Jamie: The appendix also has a quick reference for all 36 courses. How should people use that without getting overwhelmed?
Alex: Use it when you already know the course name or topic. The path tables are better for choosing an order. The quick reference is better for scanning alphabetically and jumping straight to a Start course link.
Jamie: And the path tables include duration and prerequisite columns, right?
Alex: Yes. Most courses range from less than 30 minutes to about two hours. The prerequisite column tells you what to do first, and the order column gives a recommended route through the path.
Jamie: There are some navigation tips in the appendix too.
Alex: Yes. The learning paths are under level-three headings, so pressing 3 can move between paths in many screen readers. When you reach a course table, T moves to the table, and the course link is in the rightmost column. At high zoom, widening the browser can help if table columns look clipped.
Jamie: How would you fit GitHub Skills into a longer learning plan after the workshop?
Alex: During the workshop, focus on the three assigned modules and the Learning Room work. After the workshop, choose one path that matches your goal. If your pull requests feel shaky, choose Git Fundamentals or Collaboration. If you want tests and deployments, choose Actions. If you want safer repositories, choose Security.
Jamie: And if someone wants a simple progress tracker?
Alex: Copy the personal completion checklist into your own notes, a private repository, or a GitHub issue. Check off the three workshop courses, then each path course as you finish it. That gives you a record you can review later.
Jamie: I appreciate that it is not just a catalog. It becomes a plan: course name, path, prerequisite, duration, and proof that you completed it.
Alex: And if a course screen changes, lean on the standard GitHub landmarks: repository tabs, Issues, pull requests, headings, comments, open and closed states. Those are the same pieces you have been practicing throughout the workshop.
Alex: To start any course, go to the GitHub Skills catalog, open the module you want, choose Start course, use the template to create your copy, then watch the Issues tab for Mona's first step.
Jamie: And if someone wants the official sources behind the appendix?
Alex: Use the GitHub Skills catalog for current course listings, the GitHub Skills organization to inspect course repositories, and GitHub Skills Discussions for questions and feedback. For platform behavior, check the official GitHub documentation, the GitHub changelog, and GitHub Learning Pathways.
Jamie: So the big takeaway is simple: GitHub Skills lets you keep practicing in real GitHub repositories, with feedback, at your own pace. Pick the path that matches your next contribution, and let Mona guide the reps.
72. Episode 50: Advanced Git Operations
Cherry-pick, rebase, revert, reset, tags, bisect, clean, and other Git recovery tools.
Based on: Appendix E: Advanced Git Operations
Read Transcript - Episode 50: Advanced Git Operations
Transcript
Alex: Welcome back. Today we're getting into the Git commands people usually meet when the simple path gets messy: cherry-pick, rebase, reset, revert, tags, bisect, clean, and a few recovery tools.
Jamie: I like that you said when it gets messy, because these commands can sound intimidating. They also sound like the ones you reach for right when you're already stressed.
Alex: Exactly. This is not a speed run through powerful commands. It's a guide for choosing the least risky tool, checking where you are, and knowing how to back out when Git pauses or complains.
Jamie: And the appendix this episode pairs with gives multiple paths, right? VS Code, GitHub CLI, and regular Git in the terminal.
Alex: Yes. The outcome is the same, so use the path that fits your setup. If you're reading the appendix with a screen reader, the operations are organized as numbered sections, and the tool paths sit under them. If you're using low vision settings, the command examples are labeled and meant to stay readable when zoomed.
Jamie: This also connects nicely to Bonus Challenge E, Git History, because the goal there is not just doing commands. It's learning to read commits over time and use history as a clue instead of a wall of noise.
Alex: Let's start with cherry-pick. Cherry-pick takes one commit from somewhere else and applies that change to your current branch.
Jamie: So if I fixed a bug on the wrong branch, I don't have to bring the whole branch with me. I can move just that one fix.
Alex: Right. First you need the commit SHA, which is the commit's unique ID. In VS Code, you can open the Timeline view, look at the branch that contains the commit, and copy the SHA from the details. In the terminal, you might run git log feature/bug-fix --oneline, and Git will show short IDs like a1b2c3d next to the commit messages.
Jamie: Where does GitHub CLI fit here? I know gh is great for GitHub, but cherry-pick is local Git.
Alex: That's the distinction. gh can help you list commits from GitHub, for example with gh api against the repository commits endpoint, but the actual cherry-pick is git cherry-pick a1b2c3d. In VS Code, you can use the Command Palette, search for Git: Cherry Pick, and paste the SHA.
Jamie: And there are a few variations. A single commit, a range of commits, or no automatic commit if I want to inspect the changes first.
Alex: Yes. git cherry-pick a1b2c3d applies one commit. git cherry-pick a1b2c3d..e4f5g6h applies a range, older to newer, not including the first SHA. git cherry-pick --no-commit a1b2c3d applies the changes but lets you review before committing.
Jamie: What happens if Git says there is a conflict?
Alex: Git stops and marks the files, the same way it does during a merge conflict. Run git status so you can hear or read exactly which files need attention, fix the conflict markers, stage the files, then run git cherry-pick --continue. If you decide this was the wrong move, git cherry-pick --abort takes you back to where you started.
Jamie: Rebase is the one that makes people nervous, and honestly, fair.
Alex: Fair. Interactive rebase lets you edit a sequence of commits before you share them. You can combine several small commits, rewrite a vague commit message, reorder commits, drop an experiment, or pause to amend a commit.
Jamie: The scary part is that it rewrites history. When is that okay?
Alex: It's usually okay on your own local branch before other people depend on it. Be very cautious with commits that have already been pushed to a shared branch. If someone else has pulled that history, changing it can make their copy disagree with yours.
Jamie: How do you start without getting lost in the editor?
Alex: In VS Code, open the integrated terminal with Ctrl+Backtick and run git rebase -i HEAD~3 to edit the last three commits. You can also run git rebase -i main to edit everything since your branch split from main. If Git opens vim and you don't want that, set VS Code as your Git editor with git config --global core.editor code --wait.
Jamie: Then you get a list where each line starts with a command word, like pick.
Alex: Yes. pick keeps the commit. squash combines it with the commit above and lets you combine messages. fixup also combines it but drops that commit's message. reword edits the message, drop removes the commit, and edit pauses so you can change the commit.
Jamie: So three typo commits can become one clear commit before a pull request, and a message like fix stuff can become something useful.
Alex: Exactly. If the rebase goes sideways, git rebase --abort returns to the starting point. If there is a conflict, resolve the file, stage it, and run git rebase --continue. The important habit is to pause before pushing and make sure the history now says what you intended.
Alex: Now let's separate reset and revert, because both sound like undo, but they behave very differently.
Jamie: Reset feels like it changes where my branch points. Is that the right mental model?
Alex: Yes. git reset moves the branch pointer, and the mode controls what happens to your files. --soft undoes the commit but keeps the changes staged. --mixed keeps the changes but unstages them. --hard discards the changes from your working tree, so treat it as destructive unless you are very sure.
Jamie: So for the last commit, git reset --soft HEAD~1 is the gentler option. git reset HEAD~1 keeps the changes but unstages them. git reset --hard HEAD~1 is the danger zone.
Alex: That's a good read. In VS Code, you can undo the last commit from Source Control or search the Command Palette for Git undo actions. To unstage one file without undoing a commit, use VS Code's staged changes area, or run git restore --staged path/to/file. You may also see older examples using git reset HEAD path/to/file.
Jamie: Where does revert come in?
Alex: git revert creates a new commit that cancels out an older commit. It does not erase history, which makes it safer for shared branches and pull requests. You can run git revert a1b2c3d, git revert --no-edit a1b2c3d to accept the default message, or git revert --no-commit a1b2c3d to stage the reversal before committing.
Jamie: And merge commits need extra care, right?
Alex: They do. To revert a merge commit, Git needs to know which parent side to keep, so you use something like git revert -m 1 commit-sha. As a rule, use reset for private local cleanup, and use revert when the commit is already part of shared history.
Jamie: Tags feel calmer than reset and rebase. They mark important moments.
Alex: That's what they do. A tag points to a commit so you can find it later, often for a release like v1.0.0. Lightweight tags are simple pointers. Annotated tags include extra metadata and are usually better for releases.
Jamie: How would you create one?
Alex: In VS Code, you can use the Command Palette if your Git extension exposes tag commands. With GitHub CLI, gh release create v1.0.0 can create a GitHub Release and the underlying tag. In Git, git tag v1.0.0 creates a lightweight tag, while git tag -a v1.0.0 -m Release v1.0.0 creates an annotated one.
Jamie: And tags are local until you push them?
Alex: Right. git push origin v1.0.0 pushes one tag, and git push origin --tags pushes all local tags. You can list tags with git tag or git tag -l 'v1.*', inspect an annotated tag with git show v1.0.0, delete a local tag with git tag -d v1.0.0, and delete the remote tag with git push origin --delete v1.0.0.
Jamie: Detached HEAD is another phrase that sounds worse than it is.
Alex: It means you're looking at a specific commit instead of working on a branch name. If you only meant to inspect something, switch back with git switch main, or whatever branch you were on. If you made commits there and want to keep them, run git switch -c saved-work while you're still at that position. Now those commits are attached to a real branch.
Jamie: So don't panic, don't close everything, and if you made work there, make a branch before moving away.
Alex: Force pushing is where the safety habits really matter.
Jamie: I hear people say never force push, but then rebase workflows sometimes require it. What's the practical version?
Alex: Prefer git push --force-with-lease over git push --force. The lease version refuses to overwrite the remote branch if someone else pushed new work since your last fetch. You can also do a dry run first, such as git push --force-with-lease --dry-run, to check what Git plans to do.
Jamie: So the common case is: I rebased my own feature branch, and GitHub still has the old version of that same branch.
Alex: Yes. You fetch, rebase your branch onto main, resolve any conflicts, run git rebase --continue, and then push with git push --force-with-lease. Use it on your own branch, not on a shared main branch, and coordinate if anyone else may be working from the same branch.
Jamie: Bisect feels like Git turning into a detective tool.
Alex: It is. git bisect helps you find the commit that introduced a bug by checking commits between a known good point and a known bad point. Start with git bisect start, mark the current broken commit with git bisect bad, then mark a working commit with git bisect good followed by a tag, SHA, or branch name.
Jamie: Then Git checks out a commit in the middle and asks, does the bug happen here?
Alex: Exactly. You test, then run git bisect bad if the bug is present, or git bisect good if it is not. Git keeps narrowing the range until it identifies the likely commit. When you're done, git bisect reset returns you to your original branch.
Jamie: And if there is a test script, Git can run the checks for me?
Alex: Yes. git bisect run ./test-script.sh lets Git run the script at each step, using the exit code to decide good or bad. This is a strong match for Bonus Challenge E because you are using commit history as evidence. Tags, SHAs, branch names, and commit messages all become signposts.
Jamie: That's a nice shift. History is not just an archive. It's a tool for finding when behavior changed.
Alex: git clean removes untracked files, which means files Git is not currently tracking.
Jamie: That sounds useful for build leftovers, but also a little terrifying.
Alex: It should make you cautious. Always dry-run first with git clean -n, or git clean -dn if you want to include directories in the preview. That shows what would be deleted without deleting it.
Jamie: Then the flags decide how aggressive it gets.
Alex: Right. -n means dry run. -f means actually remove files. -d includes untracked directories. -x also removes ignored files, including things matched by .gitignore, so be very careful with it. If you want confirmation item by item, use git clean -i for interactive mode.
Jamie: Sometimes the problem is not my command. It's that GitHub blocks the push or the merge.
Alex: That's often branch protection doing its job. A protected branch may block direct pushes to main, require reviews, require status checks from CI, require the branch to be up to date, or limit who can push. It can feel like a wall, but it's usually there to keep the project stable.
Jamie: So the correct flow is to work on a branch, not to fight main.
Alex: Yes. Create a branch, make your changes, commit them, push your branch, open a pull request, wait for reviews and checks, then merge through the pull request when the rules are satisfied.
Jamie: What if my pull request says the branch is out of date?
Alex: You can update it in VS Code by fetching and merging or rebasing. In Git, one option is git merge main, which creates a merge commit. Another is git rebase main, which gives cleaner history but usually requires git push --force-with-lease afterward. GitHub CLI can also help with gh pr update-branch, and you can inspect protection settings on GitHub or through the GitHub API if you have access.
Jamie: Where does Copilot fit into all this without becoming a magic button?
Alex: Use it as a translator and reviewer. It can explain confusing Git output, suggest a conflict resolution, help write clearer commit messages, compare reset versus revert for your situation, debug a failing bisect run, or explain a branch protection error. In the terminal, Copilot CLI can suggest a command from a plain language request, while Copilot Chat is better when you want to paste context and ask for an explanation.
Jamie: But still read the command before running it, and don't paste secrets or private tokens into a chat.
Alex: Absolutely. Before any destructive command, run git status, check your current branch, and consider making a backup branch. Dry-run when the command supports it. Prefer revert on shared history. If you get into trouble, git reflog can show where your branch and HEAD have recently been, which can help you recover a lost position.
Jamie: So reflog is the emergency breadcrumb trail.
Alex: That's a good way to say it. git reflog lists recent movements, and if you are certain about the target, you can recover by creating a branch at that SHA or resetting back to it. For deeper reading, the Pro Git book is the core reference behind this appendix.
Jamie: Advanced Git is less about memorizing every command and more about slowing down enough to choose the safe one. Check where you are, make the smallest change that solves the problem, and leave yourself a way back.
73. Episode 51: Git Security for Contributors
Secrets, .gitignore, environment variables, push protection, and safe contributor habits.
Based on: Appendix F: Git Security for Contributors
Read Transcript - Episode 51: Git Security for Contributors
Transcript
Alex: Welcome back. Today we're talking about Git security for contributors, especially the everyday habit of keeping secrets out of a repository.
Jamie: And by secrets, we mean more than passwords, right? Because I hear that word and immediately wonder what actually counts.
Alex: Right. A secret is anything that lets a person or a program access something they should not be able to access. That includes API keys, GitHub personal access tokens, database passwords, private keys, cloud credentials, payment provider keys, and sometimes configuration files that contain those values.
Jamie: So if one of those lands in Git, the problem is not just that it looks embarrassing in a commit.
Alex: Exactly. If a secret reaches a public GitHub repository, even briefly, you should treat it as compromised. Bots scan public repositories constantly, Git history keeps old versions, forks can preserve the data, and search engines may index it. The consequences can be very real: cloud bills, private repo access, impersonation, or fraudulent use of a service. GitHub can automatically revoke some GitHub-issued tokens when it detects them, but third-party keys, like AWS or Stripe, usually need you to rotate them yourself, fast.
Jamie: How should someone use this appendix if they're listening first and reading later?
Alex: Use it as a practical reference. It starts with why leaks matter, then moves into prevention, then recovery, then daily habits. If you're using a screen reader, the code blocks contain exact patterns and commands, so switch into Focus Mode before copying. If you're low vision, the examples are meant to be easy to scan, and the checklist near the end works well as a repeatable pre-push routine.
Jamie: I like that it is not asking people to become security specialists before they make a contribution.
Alex: No, the goal is steady contributor hygiene. The appendix points back to GitHub's code security documentation and related security features as the authoritative reference, so when GitHub changes an interface or expands protection, that is where you confirm the current details.
Jamie: Let's start with the file I see everywhere but sometimes ignore: .gitignore.
Alex: A .gitignore file tells Git which untracked files to leave alone. If a file matches a pattern in .gitignore, it should not show up in git status, it should not be staged by git add, and it should not be committed. That makes it your first prevention layer for local files that do not belong in the repository.
Jamie: What goes in there for security purposes?
Alex: Environment files are the big one: .env, .env.local, .env.development, .env.production, and patterns like star dot env. Key files belong there too, such as .pem, .key, .p12, .pfx, id_rsa, and id_ed25519. Credential files also belong there, including credentials.json, secrets.json, config/secrets.yml, and .aws/credentials.
Jamie: And there are non-secret files that still create noise.
Alex: Yes. On macOS, that might be .DS_Store or .AppleDouble. On Windows, Thumbs.db and desktop.ini. Some teams ignore VS Code settings, though other teams intentionally commit shared settings, so check the project norm. Then there are build outputs and dependencies: node_modules, dist, build, Python __pycache__, .pyc files, virtual environments like .venv and venv, plus logs, temp files, and cache files.
Jamie: Here is the part that used to trip me up. If I add .env to .gitignore after Git already knows about .env, am I safe?
Alex: Not yet. .gitignore only prevents new untracked files from being added. To check a specific file, run git ls-files .env. If Git prints .env back to you, it is already tracked, so run git rm --cached .env to stop tracking it while keeping your local file. Then add .env to .gitignore and commit that change.
Jamie: What about the files I never want to commit anywhere, no matter which project I'm in?
Alex: That's a good use for a global gitignore. You can create one with touch ~/.gitignore_global, then tell Git to use it with git config --global core.excludesfile ~/.gitignore_global. Put operating system and editor clutter there. And when you create a new repository, GitHub offers language templates for .gitignore; for an existing Node project, the appendix shows downloading the Node template from github.com/github/gitignore and appending it to your .gitignore.
Jamie: So .gitignore keeps local secret files out. But where should the secret actually live when the code needs it?
Alex: The usual pattern is environment variables. Do not hardcode something like API_KEY equals sk-abc123 in your source file. Instead, the code reads from the environment, such as os.environ.get('API_KEY') in Python or process.env.API_KEY in JavaScript. The secret exists outside the repository, and the code only knows the variable name.
Jamie: A lot of projects use .env files for that locally.
Alex: They do, and .env is convenient for local development. It might contain GITHUB_TOKEN, DATABASE_URL, or STRIPE_SECRET_KEY for your own machine. The code can load it with a library like dotenv for JavaScript or python-dotenv for Python. But the .env file itself must stay in .gitignore.
Jamie: What if a team needs to share the real value?
Alex: Do not put it in Slack, email, a GitHub comment, or an issue. For GitHub Actions, store it in GitHub Actions Secrets under repository settings, then Secrets and variables, then Actions. In a workflow, you can pass it as an environment variable with something like API_KEY from secrets.API_KEY, so the workflow can use it without the value being written into code. For human sharing, use a shared password manager, and for production systems, use a real secrets manager such as AWS Secrets Manager or HashiCorp Vault.
Jamie: So the code can be public, the variable name can be public, but the value needs a protected home.
Alex: The most reliable daily habit is reviewing what you are about to commit before you commit it.
Jamie: This is where git add dot makes me nervous. It feels convenient, but I never know what else came along for the ride.
Alex: That is the risk. git add . stages everything in the working directory that Git can add. A safer habit is to stage specific files, like git add src/auth.js docs/README.md, when you know those are the intended changes. Or use git add -p, patch mode, which walks through changes chunk by chunk and asks whether to stage each one.
Jamie: After staging, how do I inspect the exact thing Git is going to record?
Alex: Run git status to hear which files are staged and which are not. Then run git diff --staged to review the full staged diff, or git diff --staged docs/config.md for one file. Look for hardcoded passwords, tokens, API keys, .env files, credential files, and TODO comments that mention private details. If your organization allows it, Copilot Chat can help review a staged diff for accidental secrets, but use the tools and data-sharing rules your project expects.
Jamie: That makes the commit feel less like a leap of faith and more like a final inspection.
Alex: Manual review is important, and automation can catch mistakes you miss.
Jamie: This is where pre-commit hooks come in, right? I know the term, but I want the plain version.
Alex: A pre-commit hook is a script that runs automatically when you try to make a commit. If it finds a likely secret or another problem, it blocks the commit and tells you what it found. You can then remove the problem, stage the cleaned change, and try again.
Jamie: The appendix mentions detect-secrets first. What is the workflow there?
Alex: detect-secrets is a Python-based tool and the recommended option in the appendix. You install it, scan the existing repository to create a baseline, review that baseline so known false positives are marked safe, install the pre-commit hook, and test it manually. The baseline matters because it keeps the tool focused on new suspicious changes instead of shouting about old harmless examples every time.
Jamie: And if someone prefers a different tool?
Alex: gitleaks is another option. It is Go-based, has simple installs on macOS and Windows, can scan the full repository history, and can scan staged changes, which means it checks what you are about to commit. The appendix also shows how to wire it into .git/hooks/pre-commit manually.
Jamie: Then there is the pre-commit framework, which sounds broader than one secret scanner.
Alex: Exactly. The pre-commit framework manages multiple hooks from a .pre-commit-config.yaml file in the repo root. You install the framework, add the config, install the hooks, and you can run them manually against all files. That is useful when a project wants secret scanning, formatting, linting, and other checks to run in one repeatable way.
Jamie: Okay, uncomfortable scenario. I committed a secret. What do I do first?
Alex: Rotate the secret immediately. That means create a new key, token, or password, update the service that uses it, and revoke the old one. Do this before you spend time cleaning Git history, because the exposed value may already have been copied.
Jamie: What if I committed it locally but did not push?
Alex: That is easier. If it was the last commit, git reset --soft HEAD~1 undoes the commit while keeping your changes staged. Then edit the file, remove the secret, make sure the secret file or pattern is in .gitignore, stage the cleaned version, and commit again.
Jamie: And if it was pushed to a public repository?
Alex: Still rotate first. Then you need to remove the secret from Git history, not just from the latest file. The appendix recommends git-filter-repo as the modern tool after installing it; it can remove a specific file from all history or replace a specific secret string throughout history. BFG Repo-Cleaner is the fast Java-based alternative; you download it from its project site, remove files from history, or provide a passwords.txt file with secret strings to replace.
Jamie: History cleanup sounds like something that can affect other contributors.
Alex: It can. Rewriting history usually means a force push of the cleaned history, and collaborators may need to re-clone or carefully reset their local copies. After the cleanup, ask GitHub to rescan if alerts remain. The short decision path is: rotate, decide whether it was only local or already pushed, remove the current exposure, clean history when needed, push the cleaned state, and verify alerts are resolved.
Jamie: GitHub also has built-in protection before a bad push lands, right?
Alex: Yes. GitHub secret scanning looks for known secret patterns, and push protection can block a push when GitHub detects a supported secret type. It is especially helpful because it interrupts the mistake before the secret becomes part of the public repository.
Jamie: Does that mean I can rely on it to catch every secret?
Alex: No. It covers many supported token formats and partner patterns, but it will not catch every custom password, private note, or unusual credential. If push protection blocks you, do not bypass it unless you are certain it is a false positive and your project policy allows the bypass. Remove the secret, rotate it if it was real, recommit the clean change, and push again.
Jamie: Where does someone check whether it is enabled?
Alex: In the repository settings, look for the code security area, then secret scanning and push protection if they are available for that repository and organization. GitHub interface names can shift, so the important thing is to check the repository's security settings and confirm the current status there.
Jamie: Let's talk about credentials on my own computer. Where should Git and command-line tools store them?
Alex: Not in a plain text file, not hardcoded in a script, and not pasted into git config. On macOS, use Keychain. On Windows, Git for Windows normally uses Credential Manager. On Linux, a libsecret-backed credential store is the safer option when it is installed and configured.
Jamie: How do I check what Git is using right now?
Alex: Run git config --global credential.helper to see the global helper. You can also check the local repository config if needed. For credentials that humans need to retrieve and share, use a password manager with secure sharing rather than a document, chat thread, or note file.
Jamie: If someone wants a simple routine before contributing to open source, what should they actually do?
Alex: Before committing, confirm .gitignore covers environment and credential files, stage only the files you intend to include, run git status, review git diff --staged, and let your hooks run. Before pushing, watch for secret scanning or push protection messages, and do not push emergency debug files or local configuration. For one-time repository setup, add a language-appropriate .gitignore, configure a global gitignore, set up hooks, store workflow values in GitHub Actions Secrets, and enable the available code security features.
Jamie: And maintainers have a few extra responsibilities.
Alex: They do. Maintainers should enable secret scanning and push protection where available, use branch protection where it fits the project, document how to report a leaked secret, and keep dependency alerts such as Dependabot visible. That way contributors are not relying only on memory; the repository itself helps protect the work.
Jamie: I appreciate how practical this is. Security here is not about being perfect. It is about building enough checks into your normal Git flow that one tired afternoon does not become a public incident.
74. Episode 52: GitHub Desktop
Using GitHub Desktop as an accessible alternative for cloning, branching, committing, and syncing.
Based on: Appendix H: GitHub Desktop
Read Transcript - Episode 52: GitHub Desktop
Transcript
Alex: Welcome back. Today we're looking at GitHub Desktop, which is Git in a dedicated graphical app instead of only in the browser, VS Code, or the terminal.
Jamie: I like this topic because a lot of people hear "use Git" and assume the command line is the only serious option.
Alex: It really isn't. GitHub Desktop is free, open source, made by GitHub, and available for Windows and macOS. The appendix works like a reference path through the app: what it can do, how to install and sign in, then cloning, branches, commits, syncing, conflicts, history, and recovery tools.
Jamie: So it's not replacing every tool. It's another way into the same Git workflow.
Alex: Exactly. The browser is still great for issues, pull requests, repository settings, and reviews. VS Code is strong when you're editing files and need an accessible diff or terminal nearby. The Git CLI is still the most complete tool, but GitHub Desktop can handle a lot of the everyday contribution loop in a calmer interface.
Jamie: What does GitHub Desktop actually cover well?
Alex: It covers the core work most contributors repeat all the time. You can clone repositories, create and switch branches, stage files, stage individual chunks of a file, write commit messages, commit, push, pull, open pull requests, resolve many merge conflicts, view history and diffs, cherry-pick commits, stash changes, restore them, undo commits, and discard changes.
Jamie: That's more than I expected. What's outside the app?
Alex: Some advanced Git operations are not in the Desktop interface. For interactive rebase, git bisect, git clean, annotated tags, or commit signing with GPG or SSH, use the terminal or VS Code's terminal. GitHub Desktop helps there too, because Repository, then Open in Terminal, opens you in the correct folder.
Jamie: That removes one of the scary parts, which is landing in the wrong directory and running a command against the wrong project.
Alex: Right. Also, the ordinary commit message fields are standard editable text fields, and many controls are reachable from the keyboard. For low vision users, system zoom and high contrast settings apply to the app, though the red and green diff colors may still be easier to read in VS Code with a custom theme.
Alex: Installation is straightforward. On Windows, you can install with winget using the package name GitHub.GitHubDesktop, or download the installer from desktop.github.com. On macOS, you can use Homebrew with brew install --cask github, or download the app, unzip it, and drag GitHub Desktop into Applications.
Jamie: And Linux?
Alex: GitHub Desktop is not officially supported on Linux. If you're on Linux, the better path is VS Code's Source Control panel, the Git CLI, or a supported Git GUI in your environment.
Jamie: Once it's installed, do learners need to make tokens or set up SSH keys before they can do anything?
Alex: No. On first launch, choose Sign in to GitHub.com. Your browser opens, you sign in to your GitHub account, authorize GitHub Desktop, and then switch back to the app. Desktop stores the credential securely in the system keychain, so you don't have to paste a token every time.
Jamie: What if someone's school or workplace uses GitHub Enterprise Server?
Alex: Then they choose Sign in to GitHub Enterprise Server and enter the organization's server URL. Same general idea, just a different GitHub host.
Jamie: Can we describe the interface without assuming someone can see the layout?
Alex: Yes. At the top, there is a toolbar with the current repository, the current branch, and the Fetch, Push, or Pull button. The left side has a Changes tab for uncommitted work and a History tab for past commits. The main area shows the selected file's diff or the details of a selected commit, and the bottom-left commit area has the summary field, the optional description field, and the commit button.
Jamie: So the controls that matter most are repository, branch, sync, changes, history, commit message, and commit button.
Alex: That's the practical map. You can press Tab to move through focus regions, and the branch selector is searchable: type part of a branch name, use Down Arrow to review matches, and press Enter to select. The commit button is announced with the branch name, usually like "Commit to main" or "Commit to feature-branch".
Jamie: Low vision learners may care about where the stable landmarks are.
Alex: The toolbar stays at the top, so repository, branch, and sync status remain in a predictable place. OS display scaling can enlarge the whole app. If the diff panel's colors or small symbols are hard to use, open the repository in VS Code for more theme, font, and diff options.
Alex: Cloning means making a local copy of a repository on your computer. From GitHub.com, go to the repository page, activate Code, then choose Open with GitHub Desktop. Desktop opens, confirms the repository URL, lets you choose a folder, and then you activate Clone.
Jamie: That's the path I would use if I was already browsing the repository and wanted the least typing.
Alex: From inside GitHub Desktop, use Ctrl+Shift+O on Windows or Cmd+Shift+O on macOS to open Clone a repository. The GitHub.com tab lets you browse repositories your account can access, and the URL tab lets you paste a repository URL. Choose the local path, activate Clone, and wait for the files to download.
Jamie: And if someone already uses GitHub CLI?
Alex: They can run gh repo clone owner/repo-name, then open that folder in GitHub Desktop. The command github followed by the path to the repository can launch Desktop on that local repo when the command is available on the system.
Jamie: Once the repo is local, branches are usually the next place people get nervous.
Alex: A branch is a named line of work. In GitHub Desktop, use the current branch control to create a new branch, give it a clear name, and base it on the right starting branch. If the branch only exists on your computer at first, Desktop will offer to publish it to GitHub when you're ready.
Jamie: And switching branches?
Alex: Use the same branch selector. Type to filter, arrow through matches, and press Enter on the branch you want. When a branch is truly finished and already merged or no longer needed, Desktop can delete it, but pause before deleting anything that still has unpushed or unmerged work.
Jamie: That warning is important. Deleting the wrong branch feels like dropping a notebook in a lake.
Alex: Exactly, so check the branch name, check whether it has been pushed, and check whether its pull request has been merged before you clean it up.
Alex: Committing starts in the Changes tab. Each changed file appears in the file list, and selecting a file shows its diff in the main area. Staging means choosing which changes will go into the next commit.
Jamie: So a commit doesn't have to include every changed file on my machine.
Alex: Right. You can stage whole files, or in many cases stage individual lines or hunks, which are small groups of nearby changed lines. That lets you make focused commits, like one commit for a typo fix and another for a documentation update, even if you edited both during the same work session.
Jamie: Then the summary field is where the commit message goes?
Alex: Yes. Write a short summary in the summary field, add a description if more context is useful, then activate the commit button. The button includes the branch name, so it gives you one more chance to notice whether you're committing to the branch you intended.
Jamie: After the commit, the work is still only local until it is pushed, right?
Alex: Correct. Push uploads your commits to GitHub. Pull downloads commits from GitHub and applies them to your local branch. Fetch checks GitHub for new commits without applying them yet, and GitHub Desktop's sync button changes depending on what is available; the app menus also list keyboard shortcuts for these commands on your operating system.
Jamie: And pull requests?
Alex: After you push a branch, GitHub Desktop can offer to create a pull request. Activating that opens GitHub.com in your browser, where you finish the title, description, reviewers, checks, and any template fields the project requires.
Jamie: How does GitHub Desktop help when the repository is a fork?
Alex: If you cloned a fork, Desktop can help you keep it up to date with the original repository by fetching and updating from upstream when that remote is configured. A remote is a saved connection to a copy of the repository on a server. If upstream is missing, you may need to add it in the terminal with git remote add upstream followed by the original repository URL, or use VS Code's terminal from the same folder.
Jamie: So Desktop can be the normal workspace, and the terminal can handle the setup step if the remote relationship is missing.
Alex: Exactly. Merge conflicts are another place where tools meet. A conflict happens when Git cannot automatically combine two edits to the same area of a file.
Jamie: What does the repair process look like?
Alex: Desktop identifies the conflicted files and offers to open them in your editor. In the file, choose the version you want, or combine both, remove the conflict markers, save the file, return to Desktop, mark the conflict as resolved if needed, and commit the merge. If the conflict is detailed or the diff is hard to understand, VS Code is often the better place to do the actual editing.
Alex: The History tab is where you review past commits. You can move through commits, hear or read the commit message, author, and changed files, and inspect the diff for a selected commit.
Jamie: Can you narrow that down when the history is long?
Alex: Yes, use filtering when available to search for commits, and use file-specific history when you need to understand how one file changed over time. You can also compare branches to see what one branch contains that another branch does not.
Jamie: Where does cherry-pick fit in?
Alex: Cherry-pick means copying one commit from one branch onto another branch without merging the whole branch. In Desktop, you select the commit from history, choose the cherry-pick action, and pick the target branch. If a conflict appears, resolve it the same way: open the file, fix the content, save, return, and continue.
Jamie: And stashing is the temporary shelf, right?
Alex: Exactly. If you have uncommitted changes but need to switch branches, stash them, switch branches, and restore the stash when you're ready. Desktop also lets you undo the last commit, discard changes in one file, or discard all changes, but discarding is destructive, so treat it like deleting text from your only copy.
Jamie: Let's talk plainly about accessibility. What works well, and where should learners be cautious?
Alex: GitHub Desktop works best for routine actions that use labeled controls: choosing a repository, choosing a branch, writing a commit message, committing, fetching, pushing, and pulling. Browser-based sign-in is familiar, standard text fields are announced as editable text, and system zoom or high contrast settings can help with visibility.
Jamie: The harder part is the diff, isn't it?
Alex: Often, yes. Diffs can be dense, and some information is communicated visually through colors, icons, indentation, and line positioning. NVDA and JAWS users on Windows can usually move through the main controls with Tab and menus, while VoiceOver users on macOS may rely more on Control+Option navigation, but complex diff review may still be smoother in VS Code.
Jamie: So when should someone leave Desktop and use another tool?
Alex: Use Desktop for the everyday flow: clone, branch, review a manageable change, commit, push, and start a pull request. Use VS Code when you need accessible editing, better diff themes, conflict resolution, or the integrated terminal. Use the browser for issues, pull request forms, reviews, project pages, and repository settings, and use the Git CLI for the advanced commands Desktop does not expose.
Alex: The safest source for exact commands and interface changes is the official GitHub Desktop documentation, along with the GitHub Desktop download site. For background on Git concepts, GitHub's About Git material is helpful, and for sign-in and credential behavior, GitHub's security documentation gives the broader context.
Jamie: And for accessibility expectations, WCAG is the larger standard vocabulary, even though your day-to-day choice may come down to which tool lets you read, edit, and verify your work most comfortably.
Alex: That's the takeaway. GitHub Desktop is a solid option when you want Git actions separated from your editor and less dependent on terminal commands. Keep VS Code, the browser, and the CLI nearby, and choose the tool that makes the current task clearest.
75. Episode 53: GitHub CLI Reference
Using the GitHub CLI for issues, pull requests, authentication, and automation-friendly workflows.
Based on: Appendix I: GitHub CLI Reference
Read Transcript - Episode 53: GitHub CLI Reference
Transcript
Alex: Welcome back. Today we're looking at the GitHub CLI, which is the `gh` command. It lets you work with GitHub issues, pull requests, repositories, and releases from your terminal.
Jamie: So this is different from `git`, right? Because I can already clone, branch, commit, and push with Git.
Alex: Exactly. `git` handles local version control: commits, branches, history, and moving code between your computer and a remote. `gh` handles GitHub-specific work: opening an issue, viewing a pull request, checking CI, creating a release, or opening the current repo in your browser.
Jamie: That distinction helps. Git is the version control tool, and `gh` is the GitHub workflow tool that sits beside it.
Alex: Yes. A good way to learn it is local first, then GitHub. Get comfortable with the Git basics, then add `gh` when you want the GitHub page information without hunting through a web interface. And after each command, listen to or read the result before you keep going.
Jamie: I like that it encourages smaller moves. Clone, inspect, branch, edit, commit, push, then open the pull request. Nothing has to be one giant leap.
Alex: To install `gh`, the path depends on your operating system. On Windows, you can use `winget install GitHub.cli`, or download the installer from cli.github.com. On macOS, the common Homebrew command is `brew install gh`.
Jamie: And Linux has a slightly longer setup, especially on Debian or Ubuntu, because you add the official GitHub CLI package source and then install `gh` with apt.
Alex: Right. The appendix gives the full Debian and Ubuntu command block, and it is worth copying from the official reference rather than retyping it from memory. Once installed, run `gh --version` to confirm the command is available.
Jamie: Then comes signing in, which is the part people sometimes worry about.
Alex: The command is `gh auth login`. It asks where you use GitHub, usually GitHub.com unless your organization uses Enterprise. Then it asks for your preferred protocol, HTTPS or SSH, and whether to authenticate with a browser.
Jamie: And if you choose the browser option, the terminal hands you off to sign in, then you come back to the terminal when GitHub confirms it worked.
Alex: Exactly. After that, `gh auth status` checks the signed-in account. `gh auth logout` signs out. `gh auth refresh` updates credentials or adds permissions, which GitHub calls scopes.
Jamie: One thing I appreciate is that the login prompt is plain text. Arrow keys move through choices, Enter confirms, and the browser step is only one part of the flow.
Alex: On Windows, the appendix recommends setting up Windows Terminal once and reusing it. Keep a dedicated shell profile for Git work, learn mark mode with Ctrl+Shift+M for reviewing and copying output line by line, and use Ctrl+Shift+P for the command palette. Stable font size and contrast also help a lot.
Jamie: And the setup advice is not only for screen reader users. Low vision users can scale the terminal and choose contrast settings, and sighted users can watch for the greater-than marker that shows the current interactive choice.
Alex: One safety note before we leave setup: stick with options shown in `gh --help` or the official CLI manual, especially in class or production work. Undocumented flags can change or disappear.
Alex: Repository commands are where `gh` starts feeling fast. `gh repo clone owner/repo-name` clones a repository and sets up the remote for you.
Jamie: So instead of copying a URL from the website, I can use the owner and repo name directly.
Alex: Exactly. If you need a fork, `gh repo fork owner/repo-name --clone` creates the fork and clones your fork in one flow. If you only want the fork on GitHub, use `gh repo fork owner/repo-name` without `--clone`.
Jamie: What about starting something new?
Alex: Use `gh repo create my-new-project`. You can add `--public`, `--private`, and a description. Then `gh repo view` shows details for the current repository, and `gh repo view owner/repo-name` shows details for another one.
Jamie: And `gh repo view --web` opens the repo in the browser when the web page really is useful.
Alex: Yes. You can list your repositories with `gh repo list`, raise the count with `--limit 50`, or list an organization's repos with `gh repo list my-org --limit 100`. There are also admin-level commands: `gh repo archive owner/repo-name`, and `gh repo delete owner/repo-name --confirm`.
Jamie: Delete with confirm sounds like a command to slow down around.
Alex: Definitely. Read the target repository name before pressing Enter. And if you're working from a fork, `gh repo sync` or `gh repo sync --branch main` helps bring your fork up to date with its upstream repository.
Jamie: Issues feel like a natural place for the CLI, because there is so much listing, filtering, and checking.
Alex: They are a great fit. `gh issue create` starts an interactive prompt for the title, body, labels, and related fields. If you already know the details, you can provide them inline with options like `--title`, `--body`, `--label`, and `--assignee @me`.
Jamie: And for a long accessibility report, typing everything into a prompt might not be ideal.
Alex: Right. Write the report in a Markdown file first, then run `gh issue create --title "Accessibility audit findings" --body-file ./report.md`. That lets you use your editor, spell check, search, and review commands before publishing.
Jamie: Once issues exist, how do you find the right one?
Alex: `gh issue list` shows open issues in the current repo. Add filters like `--label accessibility`, `--label "good first issue"`, `--assignee @me`, `--state closed`, or `--limit 50`. You can search with `gh issue list --search "screen reader"`, and you can point at another repository with `--repo owner/repo-name`.
Jamie: Viewing is where the accessibility benefit really shows up for me.
Alex: Yes. `gh issue view 42` renders the title, metadata, and Markdown body as plain terminal text. `gh issue view 42 --comments` includes comments, and `gh issue view 42 --web` opens the browser if you want the full web page.
Jamie: Plain text means I can review line by line instead of crossing through navigation regions, sidebars, buttons, and reactions.
Alex: For updates, use `gh issue comment 42 --body "I can reproduce this on Windows 11 with NVDA."` or `--body-file ./my-comment.md`. You can edit an issue title, add or remove labels, add an assignee, close it with a comment or a reason, and reopen it later. Maintainers can also pin an issue so it appears at the top of the Issues tab, or lock it to prevent new comments when a discussion is resolved or needs to cool down.
Alex: Pull requests follow a similar pattern, but they connect your branch to a review process. After you commit and push your branch, `gh pr create` walks you through the title, body, base branch, and other details.
Jamie: And if I already know what I want, I can create it without the prompt.
Alex: Yes. You can pass a title, body, base branch, and labels inline. You can also create a draft with `--draft`, use `--body-file` to pull the description from a Markdown file, or use `gh pr create --web` to open the browser form.
Jamie: Draft is useful when the work is visible but not ready for review yet.
Alex: Exactly. To keep track of review work, `gh pr list` shows open pull requests. Filters can narrow by author, assignee, label, base branch, or state. `gh pr view` shows the title, description, review status, and checks for the current branch's pull request.
Jamie: What if I need to inspect the actual code changes?
Alex: Use `gh pr diff` for the patch, or `gh pr view --web` if a visual web diff is better for that moment. You can also run `gh pr checkout 123` to check out someone else's pull request branch locally and test it.
Jamie: The review commands are the ones I always forget.
Alex: They are direct: approve, request changes, or leave a comment-only review. For status, `gh pr checks` shows CI results, `gh pr checks --watch` refreshes while checks run, and you can check the current branch's PR too. For merging, `gh pr merge` can prompt for the merge strategy, or you can specify merge, squash, or rebase, enable auto-merge when checks pass, and delete the branch after merging.
Jamie: And if the state changes, there are commands for that as well.
Alex: Yes. You can mark a draft ready for review, move a ready PR back to draft, update the branch with the latest base branch, close without merging, reopen a closed PR, and add a comment. The CLI is especially good when you know the PR number and the action you want.
Alex: Releases are another area where the CLI keeps repeatable work tidy. You can create a release interactively, create one with all details inline, or load notes from a file.
Jamie: And there are different release states, right? Published, pre-release, and draft.
Alex: Right. A pre-release signals that the version is not final, and a draft release lets maintainers prepare everything before publishing. You can upload files to a release, list releases, view one, download release assets, and delete a release when you have permission.
Jamie: Search is broader than the current repository.
Alex: It is. `gh search issues`, `gh search prs`, `gh search repos`, and `gh search code` let you search across GitHub from the terminal. You can combine search terms and filters when you need a short, focused result set.
Jamie: Labels and milestones fit into project maintenance.
Alex: Yes. You can list labels, create a label, clone labels from another repository, or delete a label. For milestones, you can list existing milestones and create new ones. Those commands help keep issue and PR organization consistent across repositories.
Jamie: The output formatting part feels powerful, but also like the place where people might get intimidated.
Alex: A little, but the idea is simple. Many `gh` commands can return JSON with `--json`, which means structured data instead of human-formatted text. For example, you can request issue fields, PR fields, or a list of issues as JSON.
Jamie: JSON is the format with names and values, so tools can pick out just the pieces you ask for.
Alex: Exactly. Then `--jq` filters that JSON right inside the command. You can list just issue numbers and titles, get the names of labels on an issue, count open PRs, or list reviewers who approved a PR.
Jamie: That is also good for screen reader output, because less output can mean less noise.
Alex: Yes. And if you want a custom text layout, `--template` uses Go templates. That is more advanced, but it can produce exactly the line format your team wants.
Jamie: Aliases are the friendly version of that idea: make the command shorter.
Alex: Right. `gh alias set` creates a shortcut, `gh alias list` shows your aliases, and `gh alias delete` removes one. You can also create a shell alias that runs a full shell command, not only a `gh` subcommand.
Jamie: Useful examples would be issues assigned to me, my open PRs, check CI for the current branch's PR, or view the current PR.
Alex: Those are exactly the kind of shortcuts worth keeping. Extensions go one step further by adding new `gh` commands. You can browse available extensions, install one, list installed extensions, update all of them or one specific extension, and remove an extension you no longer use.
Alex: Copilot can also appear in the CLI, if your account and environment support it. After a one-time setup, you can ask for a command suggestion or ask Copilot to explain a command you do not recognize.
Jamie: That sounds helpful, but I would still want to read the command before running it.
Alex: Absolutely. Treat suggestions as drafts. Confirm the command, confirm the repository, and confirm whether it changes anything before you press Enter.
Jamie: The appendix also mentions model selection and telemetry.
Alex: Yes. Copilot can choose a model automatically by default, or you can request a specific model when that option is available. And if you need to opt out of telemetry, use the documented Copilot CLI settings rather than guessing at configuration files.
Alex: Let's spend a moment on screen reader and low vision workflow, because this is where the CLI can be genuinely comfortable. Terminal output is plain text, there are no hidden page regions, and command results are easy to copy, save, search, or open in an editor.
Jamie: But plain text can still be too much if a command prints a hundred lines.
Alex: Exactly. Pipe output to `less` for page-by-page reading. Save output to a file and open it in VS Code or your preferred editor. Limit results with flags like `--limit 20`, and combine list commands with search terms so the result set starts smaller.
Jamie: I also like asking for one field when that is all I need.
Alex: Yes. Get just the PR title, just the issue body, or CI check status as a simple list. And for writing, compose the issue body or PR body in a text file first, then create the issue or pull request from that file.
Jamie: Any platform-specific habits?
Alex: On Windows with NVDA or JAWS, Windows Terminal mark mode can help you review and copy output. On macOS with VoiceOver, keep a familiar terminal profile and use your usual text navigation commands. Across platforms, one stable terminal and one stable editor setup usually beats switching tools every time something feels tricky.
Jamie: So when is the CLI faster than the web?
Alex: When you already know the object and the action: view issue 42, comment on PR 17, check CI, list my assigned issues, create a draft PR from this branch. The browser is still useful for visual review, settings pages, and final verification, but it does not have to be your starting point for every GitHub task.
Jamie: That makes the quick reference card make sense. Authentication, repos, issues, pull requests, releases, and Copilot are all there as reminders, not as commands to memorize all at once.
Alex: Exactly. Start with `gh auth status`, `gh issue list`, `gh issue view`, `gh pr create`, and `gh pr checks`. Add more commands as your real work asks for them.
Jamie: And use the official GitHub CLI manual and the GitHub Accessibility Lab CLI guide when you need the exact syntax.
Alex: That's the habit I want learners to leave with: use the terminal for clear, repeatable GitHub actions, verify each result, and switch to the browser only when it adds something useful.
76. Episode 54: Agent Installation and Setup
Installing accessibility agents, configuring for your environment, and verifying the setup.
Based on: Appendix : Agent Installation and Setup
Read Transcript - Episode 54: Agent Installation and Setup
Transcript
Alex: Welcome back. Today we're setting up accessibility agents across the tools people are most likely to use in this workshop: GitHub Copilot in VS Code, Claude Code, Gemini CLI, Claude Desktop, and Codex CLI.
Jamie: And before anybody worries that an agent is some separate mystery system, can we place it in the normal workflow?
Alex: Yes. An agent is a configured assistant you call while you work, usually from chat or a command line. It can help inspect code, draft changes, explain accessibility issues, or guide a test, but you still decide what to run, what to commit, and what evidence is ready to share.
Jamie: So the agent sits beside Git, GitHub, and VS Code. It doesn't replace the contribution workflow.
Alex: The biggest setup rule is tool currency. Accessibility agents rely on newer chat features, API behavior, and bug fixes, so old versions can fail in confusing ways.
Jamie: When you say newer, are we talking about a vague keep everything updated, or are there actual baselines?
Alex: There are baselines. As of May 2026, VS Code should be 1.113 or later, GitHub Copilot should be current from the VS Code Marketplace, Node.js should be version 18 or higher, Python should be 3.8 or higher, and Git should be 2.20 or higher.
Jamie: And the operating system matters too, right?
Alex: Right. Windows should be Windows 10 build 1909 or later, with PowerShell 5.1 or later for command-line tools. macOS should be 10.15 Catalina or later, and you may need to run xcode-select --install for command-line tools. Linux is centered on Ubuntu 20.04 LTS or later, with Debian, Fedora, and RHEL relatives also supported.
Jamie: What about memory and disk space? Some learners are on older laptops.
Alex: For GitHub Copilot in VS Code, Claude Code, and Claude Desktop, plan on at least 4 GB of RAM. Gemini CLI and Codex CLI can work with 2 GB, though more is always nicer. Disk space ranges from about 500 MB to 2 GB depending on the platform, and network access is required for most workflows, with Codex able to support some local modes.
Jamie: So before installing, know your machine, your account, and your connection.
Alex: Exactly. Copilot in VS Code needs VS Code, the Copilot and Copilot Chat extensions, Node.js, Git, a GitHub account, and internet access. Claude Code needs the Claude Code CLI and a Pro, Max, or Team subscription. Gemini CLI needs the Gemini CLI and a Google AI Studio API key. Claude Desktop needs the app, a Claude subscription, and MCP configuration. Codex CLI needs Node.js and the Codex CLI package.
Jamie: I like checking before fixing. What commands tell me whether the machine is ready?
Alex: For VS Code and Copilot, start with code --version. Then run code --list-extensions piped to grep -i copilot if your shell supports grep. Also check node --version, npm --version, and git --version.
Jamie: If the terminal prints a lot of text, what am I listening for?
Alex: For VS Code, you want 1.113.0 or higher. For extensions, you want entries like github.copilot and Copilot Chat. For Node.js, listen for v18.0.0 or higher, and for Git, v2.20.0 or higher.
Jamie: How do the other platforms check in?
Alex: Claude Code uses claude code --version and claude code whoami, plus node --version. Gemini CLI uses gemini --version, gemini config show, and node --version. Claude Desktop is checked inside the app under Settings, About. Codex CLI uses codex --version, node --version, and npm --version.
Alex: For most workshop learners, the recommended path is GitHub Copilot in VS Code. Install VS Code from code.visualstudio.com, open it once to make sure it starts, and then open the Extensions panel with Ctrl+Shift+X or through View, Extensions.
Jamie: Then search for GitHub Copilot?
Alex: Yes. Install both GitHub Copilot and GitHub Copilot Chat, both by GitHub. When VS Code prompts you, sign in with your GitHub account and allow the authentication flow to complete in the browser.
Jamie: Where do Node.js and the agents repository come in?
Alex: Install Node.js from nodejs.org, using version 18 LTS or later, then verify node --version and npm --version. If you are setting up the local Accessibility Agents catalog, clone https://github.com/Community-Access/accessibility-agents.git into your projects folder, enter that folder, and open it with code .
Jamie: That wording helps. Browsing the living catalog is not the same thing as being forced to fork it.
Alex: Exactly. For setup, cloning the catalog can make local agents discoverable. In VS Code, open Copilot Chat with Ctrl+Alt+I, type @, and listen for agent autocomplete suggestions. Also confirm that the .github/agents folder exists. If you want extra testing tools, you can install @axe-core/cli and pa11y globally for accessibility scanning, and playwright globally for browser testing.
Alex: Claude Code starts from npm install -g @anthropic-ai/claude-code. After that, run claude code auth and follow the browser login flow.
Jamie: And this is where the active Claude subscription matters.
Alex: Right. Once authenticated, clone the Accessibility Agents catalog if your workflow needs local access, move into that folder, and try claude code @daily-briefing morning briefing. Gemini CLI is similar at the command line: install it with npm install -g @google/gemini-cli, get an API key from ai.google.dev, set GEMINI_API_KEY in your environment, and test with gemini --version and gemini whoami.
Jamie: Claude Desktop sounds less command-line centered.
Alex: It is. Download Claude Desktop from claude.ai/download, install it, and open it. Then create or edit .mcp.json in your home folder. On macOS and Linux, that is usually ~/.mcp.json. On Windows, it is usually %USERPROFILE%\.mcp.json. The configuration points an MCP server named accessibility-agents at node, passes the path to the catalog's mcp-server index file, and can set PORT to 3000.
Jamie: Then quit and reopen the app?
Alex: Completely quit Claude Desktop, reopen it, and check the logs if the MCP server does not connect. For Codex CLI, install with npm install -g @codex-cli/core, run codex init, answer the interactive setup questions, and test with codex --version and codex role list. To try agents there, you can search roles with codex role search accessibility and run one with codex run @accessibility-lead.
Jamie: After all that, what proves the installation worked?
Alex: Use a short checklist. Confirm Node.js and Git report the expected versions. Confirm the accessibility-agents folder exists if you cloned it, and that .github/agents is inside it. Confirm typing @ in chat or the CLI shows agent names. Confirm the network can reach GitHub and that API checks like claude code whoami or gemini whoami succeed.
Jamie: And then run one tiny agent call instead of trying a full project.
Alex: Exactly. In Copilot Chat, open chat with Ctrl+Alt+I and type @daily-briefing morning briefing. In Claude Code, run claude code @daily-briefing morning briefing. In Gemini CLI, run gemini @daily-briefing morning briefing. In Claude Desktop, type the same agent request into chat. In Codex CLI, run codex run @daily-briefing morning briefing.
Jamie: If the agent responds with useful information, setup is basically alive.
Alex: Yes, and this is a good time to tune accessibility preferences. In VS Code, make sure screen reader support, Accessible View, keyboard shortcuts, high contrast themes, and terminal accessibility settings match how you work. You can also ask agents to answer in shorter chunks, include file paths before explanations, avoid giant tables, or pause before suggesting a command that changes files.
Jamie: Let's talk about the part everyone hits eventually: something installed, but nothing shows up.
Alex: For Copilot in VS Code, if agents do not appear after typing @, reinstall or update both Copilot extensions from the Marketplace. If you get a cannot find agents error, check that the full catalog was cloned and that .github/agents exists. If chat itself is not working, check GitHub sign-in, subscription or access, network restrictions, and extension status.
Jamie: The appendix also mentions cache and restart steps. When should someone use those?
Alex: If updates and sign-in checks do not help, close VS Code, clear the VS Code cache only as directed by current support guidance, then restart VS Code. A simple restart often refreshes extension state, authentication, and workspace indexing without touching project files.
Jamie: What about command-line tools?
Alex: For Claude Code, check authentication, subscription access, Node.js, and whether the claude command is on your PATH. For Gemini CLI, check the API key, environment variable spelling, network access, and gemini whoami. For Claude Desktop, check the .mcp.json path, JSON syntax, file permissions, the server path, logs, and whether the app was fully restarted. For Codex CLI, check Node.js, npm global install permissions, TOML or role configuration, and the fact that some role behavior may still be experimental.
Jamie: And the universal version of troubleshooting?
Alex: Restart the terminal after installing tools, check firewall or proxy blocks, verify exact versions, and copy exact error messages. When asking for help, include your operating system, tool versions, command you ran, what you expected, what happened instead, and any accessibility setup that affects the workflow. Do not paste API keys, tokens, or private account details.
Alex: Updates are not just housekeeping here. Agent support changes quickly, and accessibility fixes often arrive through editor updates, extension updates, CLI releases, and model provider changes.
Jamie: How often should learners update?
Alex: Before a workshop or capstone session, check VS Code, Copilot extensions, Node.js, and whichever CLI or desktop app you plan to use. In VS Code, use the normal app update flow, then open Extensions and update the GitHub Copilot extensions if updates are offered. For npm-based CLIs, rerun the install command with -g for the package you use, such as the Claude Code, Gemini, Codex, or testing tool packages.
Jamie: But don't create chaos five minutes before presenting.
Alex: Exactly. Update one tool at a time when possible, rerun the version checks, run the daily briefing test again, and keep short notes about what changed. If you are in the middle of a live exercise and your setup already works, wait unless the facilitator asks for an update.
Jamie: If setup still does not work, where should people go without feeling like they failed?
Alex: Start with the Accessibility Agents repository and its system requirements, then use the official documentation for the platform you are installing: VS Code Copilot, Claude Code, Gemini CLI, Claude Desktop, or Codex CLI. Release notes and provider documentation can explain behavior that changed recently. The learning cards for installation and setup are useful as quick reminders for commands, checks, and the minimum information to include in a help request.
Jamie: I like ending there. A working setup is great, but a clear help request is also progress. It means you know what you tried, what changed, and what evidence someone else can use to help you get unstuck.
77. Episode 55: Advanced Agent Patterns
Using agents for code review, pair programming, CI/CD integration, and team workflows.
Based on: Appendix : Advanced Agent Patterns
Read Transcript - Episode 55: Advanced Agent Patterns
Transcript
Alex: Welcome back. Today we're in an advanced companion appendix for the Accessibility Agents material, alongside the agents reference and the installation setup notes. The big idea is moving from one-off agent help to repeatable workflows that a team can use again and again. The appendix also points learners toward learning cards and reference links, so it works well as something you revisit while building.
Jamie: I like that framing, because advanced agent work can sound mysterious fast. But if we're talking about repeatable workflows, that feels more practical.
Alex: Exactly. In agent work, a pattern is a coordinated way to get a result, not a magic command. It might be an agent scanning first and a human reviewing after, or one agent delegating to several specialists, or a hook that runs a check before a pull request is ready to merge.
Jamie: So a pattern is the part you can reuse: who does what, when it runs, what gets checked, and what output you trust.
Alex: Let's start with agents and subagents. An agent is a standalone AI helper with a domain, like an ARIA specialist or a contrast checker. A subagent is another agent called by the first agent, usually through something like a runSubagent function in the parent agent's instructions or prompt file.
Jamie: That's the part I always want to ask about. If one agent can already answer, why bring in several?
Alex: Because deep audits have multiple kinds of questions. A web accessibility wizard might ask an ARIA specialist to check roles, a contrast agent to check colors, a keyboard navigation agent to check focus order, an image and headings agent to check structure, and a table specialist to inspect table markup. Then the parent agent collects the results into one report instead of making the user juggle five separate answers.
Jamie: That sounds powerful, but also like it could get messy. What keeps the agents from bouncing work around forever?
Alex: Good architecture. The parent delegates to specialists, but specialists should not call other specialists. If one subagent fails, the parent logs that failure and continues with the rest. The parent also passes enough context, like the HTML, CSS, document content, or issue description, so each specialist can reason from the same evidence.
Jamie: So subagents are best for deep audits, code review across several domains, document audits with platform-specific checks, and markdown audits where links and heading hierarchy both matter.
Alex: Skills are the next layer. A skill is a reusable multi-step workflow, usually bundled with reference files, templates, and sometimes scripts. Agents can call skills, and users can often invoke them directly with slash commands.
Jamie: So a skill is bigger than a prompt. It might include how to crawl pages, how to score severity, or how to export a report.
Alex: Right. The appendix describes a broad skills catalog, and the Accessibility Agents collection is a living catalog, so don't treat any count as permanent. The examples include web scanning, web severity scoring, remediation, CSV reporting, document scanning and remediation, markdown accessibility, CI/CD scanners, framework-specific patterns for React or Vue, Python development tools, testing support, and WCAG reference material.
Jamie: And using one could be as direct as typing a slash command in chat, like asking for web scanning with a URL, or report generation with findings data.
Alex: Yes. Custom agents can invoke skills too. If you're authoring your own skill, the pattern is usually a SKILL.md file inside a .github/skills folder, with a clear purpose, expected inputs, a workflow, output format, and references. Supporting folders often hold templates, scripts, and reference data, such as compliance mappings or example reports.
Jamie: That reuse matters. If a web wizard, an issue fixer, and a link checker all call the same scanning skill, the behavior stays more consistent and nobody has to copy the same workflow into three different agents.
Alex: Hooks are where agent help becomes automatic. A hook is a JSON configuration that triggers an agent action at a lifecycle event, such as file edit, file save, commit, pull request creation, or a scheduled nightly run.
Jamie: This is where my cautious side wakes up. Automatic checks can be helpful, but they can also interrupt people if they're too aggressive.
Alex: They need to be designed with care. A hook file might live at .github/hooks/accessibility.hooks.json and define items with a name, event, file pattern, agent, condition, action, severity, message, and labels. One hook might highlight ARIA violations while editing JSX, another might run a broader scan on save, another might append findings to a commit message, and a nightly markdown audit might create issues with accessibility labels.
Jamie: So the settings are not just technical. The team is deciding what becomes a warning, what blocks work, and what gets filed for later.
Alex: Exactly. Use blocking actions sparingly, especially while people are drafting. Warnings, scan-and-report actions, and created issues are often better early in a workflow. Also, hook support can vary by platform and tool, so check the current Copilot documentation, custom instruction support details, and custom agent documentation before depending on a hook in a real team process.
Alex: Browser tools let agents examine behavior, not just source code. Depending on the environment, that can include opening a page, taking a page snapshot, inspecting the DOM, moving focus, clicking controls, typing into fields, or running a controlled script to gather page state.
Jamie: That seems especially useful for accessibility, because a lot of problems only show up when someone actually interacts with the page.
Alex: Exactly. An audit can load a page, inspect headings and landmarks, check form labels, test keyboard movement, and gather evidence for a report. A smarter audit can look at the page content first and choose checks that fit the page, like spending more time on tables when the page contains data grids, or on form behavior when the page contains inputs.
Jamie: But this still isn't the same as a person testing with their own assistive technology, right?
Alex: Right. Browser tools can miss timing issues, authentication states, pop-ups, dynamic content, and the lived experience of a screen reader user. Workarounds include narrowing the test scope, giving the agent the exact state to inspect, saving snapshots, retrying flaky steps, and marking anything uncertain for manual verification. Automated behavior scanning is evidence, not a final verdict.
Jamie: This is where orchestration comes in, isn't it? The appendix has several patterns for coordinating the work instead of asking one giant question.
Alex: Yes. One pattern is parallel scanning, where a web accessibility wizard sends different parts of the audit to specialists and aggregates the findings. Another is cascading fixes, where an issue fixer applies one fix, checks the result, then moves to the next related problem. A third is skill-first work, where something like a testing coach starts with a known testing skill before giving advice. A fourth is report aggregation, where a cross-page analyzer gathers results across several pages and looks for repeated problems.
Jamie: That connects directly to code review. I would not want an agent approving my pull request, but I would love it to scan before a human review starts.
Alex: That's the right balance. In code review, the agent can do an initial pass for ARIA mistakes, contrast risk, missing labels, fragile focus behavior, test gaps, and documentation changes. Then the human reviewer decides what matters, checks the context, and asks follow-up questions. The agent can make the review faster, but it should not replace accountability.
Jamie: What about real-time pair programming? I hear people say the agent becomes a pair, but sometimes it feels more like a very talkative third person in the room.
Alex: That's a healthy way to treat it. Let the agent propose options, explain unfamiliar code, draft tests, or compare approaches, but keep the human conversation in charge. For accessibility work, ask it to explain the user impact of a choice, not just whether the code compiles. If it suggests a pattern, ask for the tradeoffs and what evidence would prove it works.
Alex: Advanced team use is where custom skills and shared preferences become valuable. A team can create a skill such as .github/skills/our-pattern-library/SKILL.md that captures its accessibility pattern library. That skill can define its purpose, included patterns, inputs, expected output, and usage examples.
Jamie: So instead of every developer asking the agent in a slightly different way, the team shares the prompt style, report format, severity language, and preferred fixes.
Alex: Exactly. The appendix also describes continuous evaluation hooks, platform-specific skill variants, and result caching. Continuous evaluation hooks can run checks in CI/CD so regressions are caught during the pipeline. Platform-specific variants let a React team and a Vue team share principles while using different code examples. Caching can keep repeated scans faster when the same pages, files, or reference data are inspected again.
Jamie: I want to add one team habit there: keep a log of what the agent suggested and what the team did with it.
Alex: Yes. A lightweight log can record the prompt, the suggestion, whether it was accepted, changed, or rejected, and why. Over time, that tells the team which prompts are useful, which checks are noisy, and where training or custom skills would help. It also gives maintainers a clearer audit trail when accessibility decisions come up later.
Jamie: How do you decide when to rely on an agent suggestion and when to override it?
Alex: Rely on it more when it points to verifiable evidence: a failing test, a WCAG mapping, a specific line of code, a reproducible keyboard path, or a screenshot and DOM snapshot that match what you can inspect. Override it when it conflicts with user needs, project requirements, security rules, maintainer guidance, or your own test results. Also be wary when the agent sounds confident but cannot show where the claim came from.
Jamie: So the agent can help you notice, compare, draft, and organize, but the team still owns the decision.
Alex: Exactly. If you're using this in the course flow, remember that Challenge 15, Discover Accessibility Agents, is browse-first and does not require forking the Accessibility Agents repository. Completing it unlocks Challenge 16, Capstone Project, plus Bonus Challenges A through E as a structured path. The capstone can contribute to Accessibility Agents, GLOW, or another meaningful repository, and review-ready drafts or contribution plans can be valid evidence. For Day 1 GitHub practice, the learner's provisioned Learning Room repository is still where the issue, branch, commit, pull request, and merge workflow happens.
Jamie: That brings it back to the practical goal. Use advanced patterns to make the work clearer, more consistent, and more accessible, but keep humans responsible for the final judgment.
78. Episode 56: Document Developer Tools
Managing documentation with version control, collaboration, accessibility, and developer workflows.
Based on: Appendix : Document Developer Tools
Read Transcript - Episode 56: Document Developer Tools
Transcript
Alex: Welcome back. Today we're looking at documents as part of a developer workflow, not as something that lives off to the side in somebody's downloads folder.
Jamie: I like that framing, because a lot of teams treat docs as separate from code until the docs are wrong, and then everyone is annoyed.
Alex: Exactly. If a README, setup guide, PDF handout, or release note explains how the software works, then it changes when the software changes. Version control gives that document a history, a review process, and a way to connect it to issues and pull requests.
Jamie: So putting documents in Git is not just archival. It's a collaboration tool.
Alex: Yes. Markdown is usually the easiest starting point because it is plain text, readable in a screen reader, friendly to Git diffs, and rendered nicely by GitHub. A Markdown file can hold headings, links, lists, tables, code examples, and image descriptions without requiring a special app just to review the change.
Jamie: But people still draft in Google Docs, Word, or a shared editor sometimes. Is that a problem?
Alex: Not if the team is clear about the handoff. Google Docs can be great for early drafting and comments. VS Code Live Share can be useful when two people want to edit a Markdown file together. The important part is that the review-ready version lands in the repository so it can be checked, discussed, and shipped with the code.
Jamie: And that also helps people avoid that classic problem where the code changed last week, but the instructions still describe the old screen.
Alex: Right. A good pull request can include the code change and the documentation change together. Reviewers can ask, did the behavior change, did the command change, did the screenshot change, and did we update the accessible description of the thing people need to use?
Jamie: The appendix for this episode talks about document accessibility agents. Since the catalog keeps growing, how should learners approach those names?
Alex: Treat the Accessibility Agents collection as a living catalog. The appendix gives a useful snapshot of document-focused helpers, but the repository is the place to check current names, inputs, and examples. The pattern is the part to learn: scan the document, find barriers, remediate what can be fixed safely, and leave a clear record of what still needs human review.
Jamie: Let's make that concrete. In Word, what are we listening for when an agent audits a file?
Alex: Common Word problems include a missing document title, headings that skip around, images without alt text, links that just say "click here," tables with merged cells, color used as the only signal, and the wrong language setting. An agent like @word-accessibility can report those findings. A remediator can sometimes repair structure or add placeholders, but placeholder alt text still needs a person who understands the image.
Jamie: Excel feels different because the document is data, not paragraphs.
Alex: Exactly. Excel accessibility often depends on clear header rows, simple table structure, visible rows and columns, named ranges where helpful, and explanations for complex formulas. Merged cells can be especially confusing because they make the grid harder to navigate. A scan can report issues sheet by sheet, and a remediation pass can unmerge table cells or mark headers, while still flagging formulas for review.
Jamie: And PowerPoint brings in slides, timing, visuals, and audio.
Alex: Yes. Slides need meaningful titles, readable contrast, alt text for images, speaker notes or transcripts when audio matters, and animations that are not too fast. If important text is baked into a background image, a screen reader may never get it. A remediation agent can help with placeholders, timing, and contrast, but the presenter still has to make sure the message is accurate.
Jamie: PDFs make me a little nervous, because they can look perfect visually and still be almost unusable.
Alex: That's a real risk. PDF/UA is the ISO standard for accessible PDFs, and it focuses on things like tagged structure, reading order, document language, bookmarks, alt text, searchable text, and labeled form fields. A PDF audit should tell you whether the file has a logical tag tree, whether headings and tables are represented correctly, and whether navigation works without sight.
Jamie: So a scan that says "no bookmarks" or "language not set" is not nitpicking.
Alex: Not at all. Those details affect how someone moves through the file. A PDF remediator may add tags, bookmarks, or labels, but scanned images still need OCR, and complex reading order often needs a careful human pass.
Jamie: What about EPUB? It is also a published document, but the structure is different.
Alex: EPUB accessibility leans on proper document structure, a reliable table of contents, correct reading order, image descriptions, metadata, and navigation that works across reading systems. The goal is not just that the book opens. The goal is that headings, chapters, notes, and media make sense when read nonvisually.
Jamie: The appendix also mentions supporting helpers, not just file-specific auditors.
Alex: Yes, and those are useful in real teams. A document inventory can list files in a folder and show audit status. A wizard can guide someone through an unfamiliar file type. Config agents can tune scanning rules. A cross-document analyzer can compare versions over time, and a CSV reporter can turn findings into a trackable report with accessibility mappings.
Jamie: The other side of the appendix is developer tools. That sounds less like checking a finished document and more like building accessible software in the first place.
Alex: That's the shift. Developer tool agents help with code, app behavior, test setup, custom instructions, and accessibility checks inside the build process. Again, the catalog changes over time, so learners should use the appendix as a guide to the kinds of work these agents support.
Jamie: For Python, what does accessibility even mean? A script does not have a button or a slide title.
Alex: Sometimes Python accessibility means making command-line tools readable and predictable. Use clear prompts, helpful error messages, real text instead of color-only status, stable output that works with screen readers, and documentation that explains inputs and results. If the tool writes logs or reports, those files need structure too.
Jamie: And wxPython is where a Python app becomes a desktop interface.
Alex: Right. With wxPython, labels need to be associated with controls, tab order needs to make sense, custom widgets need accessible names, and keyboard operation cannot be an afterthought. Native controls are often better than custom-drawn controls because operating systems and assistive technologies already know how to describe them.
Jamie: Desktop accessibility can get complicated fast. What should a learner notice first?
Alex: Start with the basics: can every feature be reached by keyboard, does focus move in a predictable order, are controls named clearly, does the app respect high contrast and text scaling, and do status messages get announced or exposed in a way assistive technology can use. Those checks catch a lot of barriers before you ever get to advanced testing.
Jamie: The appendix also references NVDA add-on development. That's pretty specific.
Alex: It is, and it matters because NVDA is an open source screen reader with an add-on ecosystem. The sample path, my-addon/addon/globalPlugins/myPlugin.py, points to the kind of file where a global plugin might live. An NVDA add-on should expose useful commands, avoid taking over common keystrokes, provide clear speech or braille output, and be tested with real tasks rather than just loading successfully.
Jamie: So even the add-on needs documentation: what it does, what keys it uses, what changed, and what limitations remain.
Alex: Yes. README files, changelogs, issue templates, and test notes are part of the accessibility surface. If people cannot understand how to install, configure, or troubleshoot the tool, the code is not really usable yet.
Jamie: Let's bring this into GitHub. Where do automated checks fit?
Alex: A repository can use GitHub Actions to run documentation and accessibility checks when someone opens a pull request. A workflow file like .github/workflows/accessibility.yml might install dependencies, build the docs site, lint Markdown, check links, run HTML validation, and execute accessibility tests.
Jamie: That sounds great, but a blind learner may wonder how they know what happened in that workflow.
Alex: The useful outputs are text-based: job names, logs, annotations, failed file names, line numbers, and downloadable artifacts. A failed check should tell you what broke and where to look. If it only says "accessibility failed" with no details, the workflow needs better reporting.
Jamie: Playwright shows up here too. That's the browser automation tool, right?
Alex: Right. Playwright can open pages, follow routes, interact with controls, and confirm that the rendered documentation still works. Paired with an accessibility scanner such as axe, it can catch missing accessible names, broken heading structure, low contrast in rendered HTML, and landmark problems.
Jamie: But not every format can be fully tested the same way.
Alex: Correct. Markdown can be linted and rendered. HTML can be scanned in a browser. Word, PowerPoint, Excel, PDF, and EPUB often need specialized tools and sometimes manual review. CI can still help by checking that source files exist, exported pages render, links work, and audit reports are attached to the pull request.
Jamie: Keeping documentation current sounds simple until the repository gets busy.
Alex: That's why teams connect docs to the same habits they use for code. An issue can ask whether documentation is affected. A branch can include the code and docs together. A pull request can show both diffs, and reviewers can block a merge if the instructions no longer match the behavior.
Jamie: This also connects to the course workflow. Day 1 contributions happen in the learner's own Learning Room repository, with an issue, branch, commit, pull request, and merge.
Alex: Yes. And later, when learners meet the Accessibility Agents catalog in Challenge 15, that challenge is browse-first. Completing it unlocks Challenge 16, the Capstone Project, plus the structured Bonus Challenges A through E. The capstone can involve Accessibility Agents, GLOW, or another meaningful repository, and a review-ready draft or contribution plan can count when it shows real progress.
Jamie: I appreciate that, because documentation work is often planning, auditing, and making the review path clear before the final file is perfect.
Alex: Exactly. Learning cards and reference links can help learners remember the checks: structure, text alternatives, contrast, language, reading order, forms, keyboard access, and automation. Authoritative references should include the current agent repository, GitHub and Copilot documentation, VS Code guidance, and the relevant accessibility standards for the file type.
Jamie: Can we walk through one practical pass from start to finish?
Alex: Sure. Say a team changes a setup command in a Python project. The contributor opens an issue, creates a branch, updates the code, edits the Markdown setup guide, and checks whether any screenshots, PDFs, or slide decks also mention the old command.
Jamie: Then the accessibility pass asks whether the docs are still usable, not just whether the command is spelled correctly.
Alex: Right. Images need alt text. Headings need a logical order. Links need meaningful names. Tables need headers. Contrast needs to work in rendered pages and exported slides. If there is a PDF, it needs tags, bookmarks, language, and reading order.
Jamie: And GitHub keeps the trail: issue, branch, commits, pull request conversation, workflow checks, review comments, and eventually the merge.
Alex: That's the workflow we want learners to practice. Documents belong beside code because they are part of the product people actually use. When accessibility checks are part of the same review path, documentation becomes easier to trust and easier to maintain.
Jamie: So the big takeaway is not that one magic tool fixes every document.
Alex: Right. Use the agents and developer tools as support, not as a substitute for judgment. Put documents in version control, write in formats that can be reviewed, scan what can be scanned, test what people actually use, and leave the next contributor a clear path forward.
79. Episode 79: What Comes Next
How to continue learning, contributing, and building confidence after the workshop.
Based on: Chapter 22: What Comes Next
Read Transcript - Episode 79: What Comes Next
Transcript
Alex: Welcome back. This is the closing conversation for the workshop, but it is not an ending. It is the moment where the live structure fades, and your own developer rhythm starts to matter.
Jamie: I like that, because after a workshop there can be this quiet drop-off. You had issues assigned, people nearby, and a schedule. Then suddenly it is just you and GitHub.
Alex: Exactly. So we are going to make the after-workshop path feel practical: what you built, what skills you can now claim, how to show the work, and how to keep learning without waiting for another event.
Jamie: And maybe how to avoid the classic trap of thinking, I finished the workshop, but I am not a real developer yet.
Alex: Start with what happened on Day 1. In your Learning Room repository, which was provisioned for you, you created real GitHub activity. You configured your account, adjusted accessibility settings, moved through repositories and files, filed issues, created branches, edited files, opened pull requests, responded to automated feedback, and merged work.
Jamie: That is a lot more than watching a demo. You also dealt with the things people usually meet later, like merge conflicts, reviews, labels, milestones, project boards, and notifications.
Alex: Right. Day 1 was the proof that you can navigate this environment and participate in a collaborative workflow. Not perfectly, not magically, but with enough orientation to keep going.
Jamie: And Day 2 moved from GitHub in the browser into building locally.
Alex: Yes. You installed and configured VS Code, cloned a repository, worked with Git on your computer, and practiced the mental model of working directory, staging area, and repository. You created branches, staged changes, committed, and pushed. You also explored Copilot, issue templates, fork-based contribution, the Accessibility Agents living catalog, and the capstone path.
Jamie: And the capstone part is broader than one project, right?
Alex: Yes. Challenge 16 is the Capstone Project, and it accepts meaningful work for Accessibility Agents, GLOW, or another repository where your contribution makes sense. A review-ready draft or a clear contribution plan can count as valid evidence. The important thing is that your GitHub profile now shows real traces: issues, pull requests, reviews, commits, and capstone evidence.
Alex: There is also a skills inventory hiding inside all of that work. Repository navigation applies to almost any GitHub project. Issue tracking applies to bug reports, feature requests, and project planning. Pull requests, code review, merge conflicts, and Git fundamentals show up in companies, open source projects, and school teams.
Jamie: And VS Code is not just a workshop tool. It is where a lot of daily development happens, no matter what language someone learns next.
Alex: Exactly. You also practiced accessibility awareness across the whole workshop, which means you were not only learning tools. You were learning to notice whether software includes people or creates barriers.
Jamie: There are a few skills learners may not recognize as skills, too. Reading documentation, for example, can feel like the thing you do because you are stuck.
Alex: And it is one of the strongest developer skills there is. You followed written guides, compared instructions with what was on screen, looked up references, and adjusted when something did not match. You also practiced asking for help with context: what you tried, what error you got, and what you expected to happen.
Jamie: So the hidden skill is not knowing every command by memory. It is being able to recover, communicate, and keep learning while the tools change.
Jamie: How does someone turn all of that into a portfolio without making it feel fake or inflated?
Alex: Start with your GitHub profile, because it is already connected to the evidence. Go to github.com/settings/profile and find the pinned repositories area. Pin repositories that show your best work, such as a project you created, a contribution repository you actually used, or a personal project you build after the workshop.
Jamie: So not every repository needs to be pinned. Choose the ones that help a visitor understand what you can do.
Alex: Exactly. Then create a profile README. That means making a repository with the same name as your GitHub username, with matching capitalization, and adding a README.md file. A simple version can say: Hi, I am your name, I am focused on these interests, here is recent work, and here is what I am learning.
Jamie: Recent work could include preparing a capstone contribution for Accessibility Agents, GLOW, or another meaningful repository, plus completing this workshop. What I am learning could name topics like Git, accessibility, JavaScript, Python, or AI-assisted development.
Alex: Yes. Keep it honest and current. Your contribution graph can also support the story, because issues, pull requests, commits, and reviews can all create activity. Consistency matters more than trying to produce a huge burst once in a while.
Jamie: There are some accessibility details worth naming here. In profile settings, pinned repositories are checkboxes, so a screen reader user can Tab through them and press Space to pin or unpin. The contribution graph may be announced as a table or grid, with day cells that include dates and counts.
Alex: For low-vision users, pinned repositories appear as cards, and at high zoom they may reflow into a single column, which can be easier to scan. Test your profile README in light and dark themes, especially if you use images. For sighted visitors, pinned repositories and the README are highly visible, so concise headings and a few clear bullets go a long way.
Jamie: What about practice after the workshop? Without live prompts, it is easy to either do nothing or pick something way too big.
Alex: A sustainable habit can be small. Once a week, open GitHub, review notifications, read one issue, make one small improvement, or write down one thing you learned. The goal is to keep your hands on the workflow so it stays familiar.
Jamie: Finding approachable issues is the part that can feel intimidating. Labels like good first issue are helpful, but they do not always mean easy.
Alex: True. Look for signals around the label. Is the issue clearly described? Does the repository have a README, contribution guide, or code of conduct? Are maintainers responding respectfully? A smaller documentation fix, typo correction, accessibility note, or reproduction step can be a very real contribution.
Jamie: And if you are not ready to claim an issue, you can ask a careful question.
Alex: Yes. You can say what you understand, what you are considering, and what you want to confirm before starting. That is professional. It is much better than silently struggling for hours or sending a huge pull request that does not match the project.
Alex: For deeper learning, give yourself lanes. For Git and version control, the Pro Git book is free and thorough, and chapters 2 and 3 are a useful starting point. Later, the advanced Git appendix can help with rebasing, cherry-picking, stashing, and other tools you do not need every day at first.
Jamie: For GitHub itself, the official documentation is worth bookmarking, and GitHub Skills gives you interactive practice. The GitHub Blog is useful when you want to keep up with feature changes and common practices.
Alex: For VS Code, the VS Code documentation covers settings, keybindings, and extensions, and the accessibility documentation goes deeper on screen reader support, high contrast, and keyboard navigation. For accessibility, keep WCAG 2.2 close, especially the quick reference, and use resources like WebAIM, Deque University, and the workshop appendix on accessibility standards.
Jamie: And AI-assisted development keeps changing, so it helps to return to official Copilot documentation, plus the workshop references for Copilot and agents. Use those tools as support, not as a replacement for understanding what you are changing.
Alex: For programming languages, choose based on what you want to build. Web interfaces often point toward HTML, CSS, and JavaScript. Data work might point toward Python. Automation and scripting can also begin with Python or shell basics. Interest is a strong filter, because you will stay with practice longer when the work connects to something you care about.
Jamie: GitHub Skills feels like a good bridge after this workshop because it still teaches by doing. Which courses would you suggest trying next?
Alex: Start with courses that reinforce the workflow you just learned: Introduction to GitHub, Communicate using Markdown, Review pull requests, Resolve merge conflicts, and GitHub Pages if you want to publish a simple site. If you are moving toward automation, look for courses on GitHub Actions. If you want more collaboration practice, choose pull request and project management courses.
Jamie: How does someone start one without getting lost?
Alex: Go to skills.github.com, choose a course, and select the start button. Most courses create a practice repository in your account, then guide you through issues, comments, and pull requests. Treat it like a safe lab. Read the instructions, make the smallest required change, wait for the bot feedback, and continue when the course updates.
Alex: Staying connected matters, too. Community Access resources can help you find support after the workshop, especially if you want spaces that understand accessibility, learning pace, and assistive technology.
Jamie: Open source can feel huge, though. How do you pick communities that are healthy?
Alex: Look for projects where maintainers communicate clearly, issues are organized, contribution guidance exists, and people are treated respectfully. You can also start by observing: read discussions, watch how reviews happen, and notice whether newcomers get useful responses.
Jamie: The accessibility community is also a place to keep learning. It includes developers, testers, designers, assistive technology users, educators, and advocates.
Alex: Yes, and that mix is valuable. Accessibility work improves when lived experience and technical skill meet. You can contribute by reporting barriers clearly, testing with assistive technology, improving documentation, reviewing designs, or helping code meet accessibility standards.
Jamie: What if someone wants to contribute back to this workshop itself?
Alex: That is welcome. Useful contributions include fixing typos, clarifying instructions, reporting confusing steps, improving alt text, suggesting accessibility notes, updating links, testing with a screen reader or magnification, or proposing new examples. Small fixes are not lesser contributions. They make the path easier for the next learner.
Jamie: And the workflow is the familiar one.
Alex: Yes. Open or find an issue, discuss the change if needed, create a branch, make the edit, commit it with a clear message, open a pull request, and respond to review. If the project asks for a different process, follow the contribution guide. That habit of reading the local instructions before acting will serve you everywhere.
Jamie: So contributing back is also practice. You are improving the material and rehearsing the same collaboration pattern in a real context.
Alex: If you get stuck after the workshop, slow the problem down. Write down where you are, what command or action you tried, what happened, and what you expected. Then check the README, the issue thread, the official documentation, and recent project activity.
Jamie: And if you ask for help, include the text of the error when you can, not just it did not work.
Alex: Exactly. Share your environment, the step you were on, what changed recently, and what you already tried. That gives another person something to work with. It also helps you notice the answer yourself sometimes.
Jamie: That is reassuring. Getting stuck is not evidence that you do not belong. It is part of the work.
Alex: Here is the final thought. You did not leave this workshop with only a certificate-shaped memory. You left with repositories, pull requests, commits, reviews, issues, settings, tools, and a better sense of how collaboration happens.
Jamie: And you do not have to keep the same pace as a workshop. You just need a pace you can return to.
Alex: Exactly. Keep one small habit alive. Read, try, commit, ask, review, and reflect. Over time, those small actions become a developer story you can point to with confidence.
Jamie: Congratulations on finishing the workshop. More importantly, congratulations on having a real next step.
Production
These episodes are generated with local neural text-to-speech models. Each episode is produced from the workshop chapter content using episode-specific scripts that ensure concept coverage, accessible language, and screen reader-friendly descriptions.
Source bundles and production documentation are in the podcasts/ directory.
Authoritative Sources
Use these official references when you need the current source of truth for this listing.
Section-Level Source Map
Use this map to verify facts for each major section in this file.
- Git Going with GitHub - Audio Series: Podcast site generator, Podcast feed output
- How to Use These Episodes: Listening order configuration, Podcast site generator
- Start Here / episode listings / transcripts: Podcast feed output, Podcast site generator, Podcast source directory
- Production: Podcast source directory, Podcast site generator