{"status":"ok","feed":{"url":"https://github.blog/feed/","title":"The GitHub Blog","link":"https://github.blog/","author":"","description":"Updates, ideas, and inspiration from GitHub to help developers build and design software.","image":"https://github.blog/wp-content/uploads/2019/01/cropped-github-favicon-512.png?fit=32%2C32"},"items":[{"title":"Build a personal organization command center with GitHub Copilot CLI","pubDate":"2026-04-15 17:00:00","link":"https://github.blog/ai-and-ml/github-copilot/build-a-personal-organization-command-center-with-github-copilot-cli/","guid":"https://github.blog/?p=95327","author":"Cassidy Williams","thumbnail":"","description":"\n<p>Learn about the productivity tool one GitHub engineer built, and how AI supported the development process.</p>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/build-a-personal-organization-command-center-with-github-copilot-cli/\">Build a personal organization command center with GitHub Copilot CLI</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","content":"\n<p>What if you could remove the struggle of context switching across several apps, bringing them together into one place?</p>\n\n\n\n<p>Meet <a href=\"https://github.com/brittanyellich\">Brittany Ellich</a>, Staff Software Engineer, and the productivity tool she built to streamline her work. We sat down with Brittany to learn about this project\u2013what she built, how she did it, and how AI supported the development process from ideation to implementation. Brittany created a visual home that fits how she learns and thinks, all inspired by the <a href=\"https://github.com/features/copilot/cli?utm_source=blog-command-center-cta&amp;utm_medium=blog&amp;utm_campaign=dev-pod-copilot-cli-2026\">GitHub Copilot CLI</a>.</p>\n\n\n\n<p><em>Visual learner? Watch the video above!</em></p>\n\n\n\n<h2 class=\"wp-block-heading\">Q &amp; A</h2>\n\n\n\n<p><strong>What is your role at GitHub?</strong></p>\n\n\n\n<p>I\u2019m a staff software engineer on the billing team at GitHub. My day-to-day work mostly consists of working on metered billing, so things like keeping records of Actions minutes, storage amounts, and copilot usage. I passionately dogfood everything that comes out of the Copilot org. I\u2019m also an open source contributor to ATProto projects and built Open Social for applications built on the AT Protocol.</p>\n\n\n\n<p><strong>What did you build?</strong></p>\n\n\n\n<p>I built a personal organization command center to solve a simple problem: digital fragmentation. My goal was to take everything scattered across a dozen different apps and unify them into one calm, central space.</p>\n\n\n\n<p><strong>How long did v1 take to make?</strong></p>\n\n\n\n<p>I use a plan-then-implement workflow when building systems, leveraging AI for planning and Copilot for implementation. For v1, this approach let me move from idea to a working tool in a single day alongside my other regular work.</p>\n\n\n\n<p>While planning, I have Copilot interview me with questions about how something should work until we have a plan that I think is adequate. That way, there\u2019s less guesswork about what I want done and implementation goes more smoothly. Copilot will implement the work based on the plan that we put together.</p>\n\n\n\n<p><strong>What\u2019s your favorite tool stack to build with?</strong></p>\n\n\n\n<p>I like working in agent mode in VS Code for synchronous development, typically with up to 2 non-competing agent workflows going at a time, and Copilot Cloud Agent for asynchronous development. I typically try to keep a few asynchronous tasks flowing with Copilot Cloud Agent, like bug fixes or tech debt changes that have been well-scoped, while I\u2019m focusing on the work that needs more oversight in VS Code.</p>\n\n\n\n<p><strong>Follow-up loaded question: Do you care what tech stack your apps use now?</strong></p>\n\n\n\n<p>Not really. I\u2019ve always wanted to build an Electron app and this is technically my first one, but I can\u2019t say I learned a ton about Electron during this process since it was almost completely built by Agent Mode. That said, I went in and simplified the repo significantly to make it publicly accessible which required a lot more hands-on work (agents seem to like adding code but are much less enthusiastic about removing code) and felt pretty comfortable reading through the repo and making changes despite not having a ton of familiarity with Electron apps.</p>\n\n\n\n<p><a href=\"https://github.com/brittanyellich/command-center-lite\"><strong>Check out the project repo &gt;</strong></a></p>\n\n\n\n<p><strong>What\u2019s your one-line takeaway for other builders?</strong></p>\n\n\n\n<p>Go build something! Building solutions from scratch has never been easier, and it\u2019s helpful for learning how to work with new AI tools.</p>\n\n\n\n<p><strong>How do you keep up with news and changes in the industry?</strong></p>\n\n\n\n<p>I stay on top of industry news through articles, podcasts, and social media. I read articles that are shared internally on GitHub\u2019s Slack, and I read the GitHub blog. We have a ton of great engineers who are great at curating useful resources and sharing them with the team. There are a few podcasts that I like for keeping up with things, like How I AI and Last Week in AI. On social media, I\u2019m active on Bluesky and have had a ton of great conversations with other engineers there.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Try Brittany\u2019s approach</h2>\n\n\n\n<p>Brittany\u2019s project is a good reminder that the most useful projects often start as small fixes for everyday problems.</p>\n\n\n\n<p>While you can use your own stack for this, if you\u2019d like to try something similar, here are the tools Brittany used:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\n<a href=\"https://www.electronjs.org/\">Electron</a>: Cross-platform desktop application framework</li>\n\n\n\n<li>\n<a href=\"https://react.dev/\">React</a>: JavaScript UI library for components and state management</li>\n\n\n\n<li>\n<a href=\"https://vite.dev/\">Vite</a>: Build tool with hot module replacement</li>\n\n\n\n<li>\n<a href=\"https://tailwindcss.com/\">Tailwind</a>: CSS utility framework</li>\n\n\n\n<li>\n<a href=\"https://github.com/microsoft/work-iq\">WorkIQ MCP</a>: <a href=\"https://github.blog/ai-and-ml/llms/what-the-heck-is-mcp-and-why-is-everyone-talking-about-it/\">MCP server</a> and CLI for accessing Microsoft 365 data</li>\n</ul>\n<p>All of these are open source, and GitHub Copilot can help you get started with them quickly!</p>\n\n\n\n<p>If you\u2019d like her exact solution, you can clone Brittany\u2019s repository to get up and running right away. You\u2019ll need the following on your machine:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Node.js (v18 or higher)</li>\n\n\n\n<li>\n<a href=\"https://docs.github.com/copilot/using-github-copilot/using-github-copilot-in-the-command-line?utm_source=blog-command-center-cta&amp;utm_medium=blog&amp;utm_campaign=dev-pod-copilot-cli-2026\">GitHub Copilot CLI</a> (for WorkIQ setup)</li>\n\n\n\n<li>A Microsoft 365 account (for calendar sync)</li>\n\n\n\n<li>An <a href=\"https://elevenlabs.io/\">ElevenLabs</a> account (for voice assistant setup)</li>\n</ul>\n<p>There are more detailed instructions in her repository <a href=\"https://github.com/brittanyellich/command-center-lite/blob/main/README.md\">README file</a>!</p>\n\n\n\n<div class=\"wp-block-group post-content-cta has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><a href=\"https://github.com/features/copilot/cli?utm_source=blog-command-center-cta&amp;utm_medium=blog&amp;utm_campaign=dev-pod-copilot-cli-2026\">Get started with GitHub Copilot CLI &gt;</a></p>\n</div>\n\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/build-a-personal-organization-command-center-with-github-copilot-cli/\">Build a personal organization command center with GitHub Copilot CLI</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","enclosure":{},"categories":["AI &amp; ML","GitHub Copilot","GitHub Copilot CLI"]},{"title":"Developer policy update: Intermediary liability, copyright, and transparency","pubDate":"2026-04-15 15:00:00","link":"https://github.blog/news-insights/policy-news-and-insights/developer-policy-update-intermediary-liability-copyright-and-transparency/","guid":"https://github.blog/?p=95283","author":"Margaret Tucker","thumbnail":"","description":"\n<p>We\u2019re sharing recent policy updates that developers should know about, updating our Transparency Center with the full year of 2025 data, and looking to what\u2019s ahead.</p>\n<p>The post <a href=\"https://github.blog/news-insights/policy-news-and-insights/developer-policy-update-intermediary-liability-copyright-and-transparency/\">Developer policy update: Intermediary liability, copyright, and transparency</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","content":"\n<p>We\u2019re sharing a few timely updates on developer policy that reflect GitHub\u2019s ongoing work on transparency, developer protections, and copyright policy engagement\u2014issues that directly affect how developers build, share, and maintain software.</p>\n\n\n\n<h2 class=\"wp-block-heading\">What the Supreme Court\u2019s decision in <em>Cox v. Sony</em> means for developers</h2>\n\n\n\n<p>This March, the U.S. Supreme Court issued its <a href=\"https://www.supremecourt.gov/opinions/25pdf/24-171_bq7d.pdf\">decision in <em>Cox v. Sony</em></a>, a case addressing the limits of secondary copyright liability for online services. GitHub and developer platforms served as key examples in an industry <a href=\"https://github.blog/news-insights/policy-news-and-insights/how-github-protects-developers-from-copyright-enforcement-overreach/\">amicus brief</a> to explain why clear and balanced liability standards are essential for developer platforms and other intermediaries that host or enable user\u2011generated content.</p>\n\n\n\n<p>The Court\u2019s opinion reinforced that service providers are not automatically liable for copyright infringement by users without evidence of intent to encourage or materially contribute to infringement. By clarifying this standard, the decision helps avoid overly expansive liability theories that would make it difficult for intermediaries to exist or operate at scale. For developers, this legal certainty supports innovation, collaboration, and the continued availability of neutral infrastructure that enables lawful activity like GitHub.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Looking ahead: the upcoming DMCA Section 1201 triennial review</h2>\n\n\n\n<p>Another important copyright process is approaching: the next triennial review of exemptions under Section 1201 of the DMCA. DMCA Section 1201 is the part of U.S. copyright law that restricts bypassing digital access controls. It matters for developers because it can affect activities like security research, interoperability, repair, accessibility, and other lawful work unless temporary exemptions are in place. The most recent <a href=\"https://www.copyright.gov/1201/2024/\">triennial cycle concluded in 2024</a>, setting exemptions that remain in effect for the current three-year period.</p>\n\n\n\n<p>GitHub has a long history of engaging in the Section 1201 process and publishing resources to explain why these exemptions matter to developers. In 2021, we filed <a href=\"https://github.blog/news-insights/policy-news-and-insights/fud-chills-github-stands-with-security-researchers-on-dmca-section-1201/\">comments in support</a> of a broad safe harbor for good-faith security research. The 2024 cycle included several submissions of interest to developers such as the <a href=\"https://www.authorsalliance.org/2024/11/08/the-dmca-1201-rulemaking-summary-key-takeaways-and-other-items-of-interest/\">Authors Alliance exemption expansion petition</a>, which addressed access and preservation concerns, as well as a security research petition focused on AI safety\u2011related research and analysis which drew thoughtful comments in support from <a href=\"https://www.copyright.gov/1201/2024/comments/reply/Class%204%20-%20Reply%20-%20HackerOne%20Inc..pdf\">HackerOne</a>, the <a href=\"https://www.copyright.gov/1201/2024/comments/reply/Class%204%20-%20Reply%20-%20Hacking%20Policy%20Council.pdf\">Hacking Policy Council</a>, and <a href=\"https://www.copyright.gov/1201/2024/comments/reply/Class%204%20-%20Reply%20-%20Kevin%20Klyman%20et%20al.%20(Joint%20Academic%20Researchers).pdf\">academic researchers</a>.</p>\n\n\n\n<p>Although the generative AI security research petition was not ultimately adopted in the 2024 cycle, it raised important questions about how existing DMCA frameworks apply to emerging AI\u2011related research and development practices. As the software ecosystem continues to evolve, new Section 1201 challenges are emerging\u2014particularly around AI systems, model inspection, safety research, and interoperability.</p>\n\n\n\n<p>Looking ahead to the 2027 triennial review, we\u2019re interested in hearing from developers about the issues they\u2019re encountering, which use cases matter most, and how these questions should be explored in future DMCA triennial reviews.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Transparency update: full\u2011year 2025 data now available</h2>\n\n\n\n<p>We\u2019ve also updated <a href=\"https://transparencycenter.github.com/\">GitHub\u2019s Transparency Center</a> with the <a href=\"https://github.com/github/transparency\">full year of 2025 data</a>. For this update, we made improvements to the site, including clearer charts and updated visualizations for our <a href=\"https://transparencycenter.github.com/appeals/\">abuse-related restrictions, appeals, and reinstatements</a> designed to make the information easier to understand. 2025 had the highest count of <a href=\"https://transparencycenter.github.com/dmca/\">DMCA circumvention</a> claims since we started our transparency reporting. While this can be attributed to a few very large takedowns, it also underscores how important a balanced approach to the DMCA is for software developers, code collaboration platforms, and the open source ecosystem.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Next up for the policy blog: age assurance and what it means for developers</h2>\n\n\n\n<p>We\u2019re hearing growing concern from the developer community about age assurance laws emerging in U.S. states, Brazil, and Europe, particularly where requirements aimed at commercial, consumer\u2011facing products could unintentionally sweep in open source operating systems, package managers, and other critical digital infrastructure. These issues reinforce the value of ongoing collaboration with policymakers to promote informed, balanced policies that support open source developers. We\u2019ll continue to advocate for policies that reflect technical realities and support open development, including through an upcoming educational developer policy blog post and a <a href=\"https://maintainermonth.github.com/\">May Maintainer Month</a> session focused on these topics.</p>\n\n<p>The post <a href=\"https://github.blog/news-insights/policy-news-and-insights/developer-policy-update-intermediary-liability-copyright-and-transparency/\">Developer policy update: Intermediary liability, copyright, and transparency</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","enclosure":{},"categories":["News &amp; insights","Policy","GitHub Policy","GitHub Transparency Report"]},{"title":"Hack the AI agent: Build agentic AI security skills with the GitHub Secure Code Game","pubDate":"2026-04-14 18:17:59","link":"https://github.blog/security/hack-the-ai-agent-build-agentic-ai-security-skills-with-the-github-secure-code-game/","guid":"https://github.blog/?p=95266","author":"Joseph Katsioloudes","thumbnail":"","description":"\n<p>Learn to find and exploit real-world agentic AI vulnerabilities through five progressive challenges in this free, open source game that over 10,000 developers have already used to sharpen their security skills.</p>\n<p>The post <a href=\"https://github.blog/security/hack-the-ai-agent-build-agentic-ai-security-skills-with-the-github-secure-code-game/\">Hack the AI agent: Build agentic AI security skills with the GitHub Secure Code Game</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","content":"\n<p>I was scrolling through my feed one evening when I came across <a href=\"https://openclaw.ai/\">OpenClaw</a>, an open source personal AI assistant that people were calling everything from \u201cJarvis\u201d to \u201ca portal to a new reality.\u201d The idea is beautiful: an AI that lives on your machine or in the cloud, talks to you over WhatsApp or Telegram, clears your inbox, manages your calendar, browses the web, runs shell commands, and even writes its own plugins. Users were having it check them in for flights, build entire websites from their phones, and automate things they never thought possible.</p>\n\n\n\n<p>My first reaction was the same as everyone else\u2019s: this is incredible.</p>\n\n\n\n<p>My second reaction was\u2026different. I started thinking about what happens when that kind of power meets a malicious prompt. What if someone tricks the agent into reading files it should not access? What if a poisoned web page rewrites the agent\u2019s instructions? What if one agent in a multi-agent chain passes bad data to another that blindly trusts it?</p>\n\n\n\n<p>Those questions became Season 4 of the <a href=\"https://securitylab.github.com/secure-code-game/\">Secure Code Game</a>.</p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" width=\"908\" autoplay controls loop muted poster=\"https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-14-at-11.14.22-AM.png\" src=\"https://github.blog/wp-content/uploads/2026/04/Video.mp4\" playsinline preload=\"none\"></video></figure><h2 class=\"wp-block-heading\">The Secure Code Game: Learn secure coding and have fun doing it</h2>\n\n\n\n<p>The Secure Code Game is a free, open source in-editor course where players exploit and fix intentionally vulnerable code. When I created the <a href=\"https://github.blog/developer-skills/github/build-a-secure-code-mindset-with-the-github-secure-code-game/\">first season</a> in March 2023, the goal was straightforward: make security training that developers would enjoy. Fix the vulnerable code, keep it functional, level up. That core philosophy has not changed across any season.</p>\n\n\n\n<p><a href=\"https://github.blog/developer-skills/application-development/build-code-security-skills-with-the-github-secure-code-game/\">Season 2</a> expanded into multi-stack challenges with community contributions across JavaScript, Python, Go, and GitHub Actions. <a href=\"https://github.blog/security/hack-the-model-build-ai-security-skills-with-the-github-secure-code-game/\">Season 3</a> took players into LLM security, where they learned to hack and then harden large language models. Along the way, over <strong>10,000 developers</strong> across the industry, open source, and academia have played to sharpen their skills.</p>\n\n\n\n<p>What has changed with each season is the landscape. When we launched Season 1, AI coding assistants were just starting to become mainstream. By Season 3, we were teaching players to craft malicious prompts and then defend against them. Now, with Season 4, we are tackling the security challenges of AI systems that can act autonomously. They can browse the web, call APIs, coordinate with other agents, and act on your behalf.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Why agentic AI security matters right now</h2>\n\n\n\n<p>The timing is not a coincidence. AI agents have moved from research prototypes to production tools at remarkable speed, and the security community is racing to keep up.</p>\n\n\n\n<p>The <a href=\"https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/\">OWASP Top 10 for Agentic Applications 2026</a>, developed with input from over 100 security researchers, now catalogues risks like agent goal hijacking, tool misuse, identity abuse, and memory poisoning as critical threats. A <a href=\"https://www.darkreading.com/threat-intelligence/2026-agentic-ai-attack-surface-poster-child\">Dark Reading poll</a> found that <strong>48% of cybersecurity professionals</strong> believe agentic AI will be the top attack vector by the end of 2026. And <a href=\"https://blogs.cisco.com/ai/cisco-state-of-ai-security-2026-report\">Cisco\u2019s State of AI Security 2026 report</a> highlighted that while 83% of organizations planned to deploy agentic AI capabilities, only 29% felt ready to do so securely.</p>\n\n\n\n<p>The gap between adoption and readiness is exactly where vulnerabilities thrive. And the best way to close that gap is by learning to think like an attacker.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Meet ProdBot: your deliberately vulnerable AI assistant</h2>\n\n\n\n<p>Season 4 puts you inside <strong>ProdBot</strong>, your productivity bot, a deliberately vulnerable agentic coding assistant for your terminal. Inspired by tools like <a href=\"https://openclaw.ai/\">OpenClaw</a> and <a href=\"https://github.com/features/copilot/cli?utm_source=blog-hack-the-agent-cta&amp;utm_medium=blog&amp;utm_campaign=dev-pod-copilot-cli-2026\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub Copilot CLI</a>, ProdBot turns natural language into bash commands, browses a simulated web, connects to MCP (Model Context Protocol) servers, runs org-approved skills, stores persistent memory, and orchestrates multi-agent workflows.</p>\n\n\n\n<p>Your mission across five progressive levels is simple: use natural language to get ProdBot to reveal a secret it should never expose. If you can read the contents of password.txt, you have found a security vulnerability.</p>\n\n\n\n<p>No AI or coding experience is needed\u2026just curiosity and willingness to experiment. Everything happens through natural language in the CLI.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Five levels, five upgrades, five vulnerabilities</h2>\n\n\n\n<p>Each level of the game mirrors a stage in how real AI-powered tools evolve. As ProdBot gains new capabilities, the upgrade opens a new attack surface for you to discover. Here is what ProdBot looks like as it grows:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\n<strong>Level 1</strong> starts with the basics: ProdBot generates and executes bash commands inside a sandboxed workspace. Can you break out of the sandbox?</li>\n\n\n\n<li>\n<strong>Level 2</strong> gives ProdBot web access. It can now browse a simulated internet of news, finance, sports, and shopping sites. What could go wrong when an AI reads untrusted content?</li>\n\n\n\n<li>\n<strong>Level 3</strong> connects ProdBot to MCP servers\u2026external tool providers for stock quotes, web browsing, and cloud backup. More tools, more power, more ways in.</li>\n\n\n\n<li>\n<strong>Level 4</strong> adds org-approved skills and persistent memory. ProdBot can now run pre-built automation plugins and remember your preferences across sessions. Trust is layered\u2026but is it earned?</li>\n\n\n\n<li>\n<strong>Level 5</strong> is everything coming together: six specialized agents, three MCP servers, three skills, and a simulated open-source project web. The platform claims all agents are sandboxed and all data is pre-verified. Time to put that to the test.</li>\n</ul>\n<p>Each level builds on the previous one, and that progression is the point.</p>\n\n\n\n<p>We aren\u2019t going to tell you exactly which vulnerabilities you will find at each level as that would ruin the fun. But we will say this: the attack patterns you will discover in Season 4 are not theoretical. They reflect the kinds of risks that security teams are grappling with right now as organizations deploy autonomous AI systems into production.</p>\n\n\n\n<p>Think about CVE-2026-25253 (CVSS 8.8 \u2013 High): Known as \u201cClawBleed\u201d or the one-click Remote Code Execution (RCE) vulnerability. It allowed attackers to steal authentication tokens via a malicious link and gain full control of the OpenClaw instance.</p>\n\n\n\n<p>The goal is not just to learn a specific exploit. It is to build the instinct that helps you spot these patterns in the wild, whether you are reviewing an agent\u2019s architecture, auditing a tool integration, or simply deciding how much autonomy to give the AI assistant that just landed on your team.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Get started in under 2 minutes</h2>\n\n\n\n<p>This entire experience runs in <a href=\"https://github.com/features/codespaces\">GitHub Codespaces</a>, so there is nothing to install, nothing to configure, and it doesn\u2019t cost you a penny (Codespaces offers up to 60 hours of free usage per month). You can be inside ProdBot\u2019s terminal in under two minutes, and each season is self-contained, so you can jump straight into Season 4 without covering the earlier ones.</p>\n\n\n\n<p>You may find Season 3 to be a helpful foundation since it builds the basics of AI security. But it is not required. Just bring your hacker mindset.</p>\n\n\n\n<div class=\"wp-block-group post-content-cta has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><strong>Ready?</strong> <a href=\"https://securitylab.github.com/secure-code-game/\">Start Season 4 now &gt;</a></p>\n</div>\n\n\n\n<p><em>Special thanks to <a href=\"https://github.com/rzhade3\">Rahul Zhade</a>, Staff Product Security Engineer at GitHub, and <a href=\"https://github.com/bgalek\">Bartosz Ga\u0142ek</a>, creator of Season 3, for testing and improving Season 4.</em></p>\n\n\n\n<details><summary><strong>FAQ</strong>\n</summary><p><strong>Do I need AI or coding experience to play Season 4?</strong></p>\n\n<p>No. Everything happens through natural language in the CLI. You type plain English, or any language, prompts and ProdBot responds. Curiosity and a willingness to experiment are all you need. </p>\n\u00a0\n<p><strong>Do I need to complete previous seasons first?</strong></p>\n\n<p>No. Each season is self-contained. You can jump directly into Season 4 by running <code>ProdBot</code> and typing level <code>&lt;N&gt;</code>. That said, Season 3 builds a helpful foundation in AI security and takes about 1.5 hours.</p>\n\u00a0\n<p><strong>How long does Season 4 take?</strong></p>\n\n<p>Approximately two hours, though it varies depending on how deeply you explore each level. Some players like to try multiple approaches per level.</p>\n\u00a0\n<p><strong>Is this free?</strong></p>\n\n<p>Yes. The Secure Code Game is open source and free to play. It runs in <a href=\"https://github.com/features/codespaces\">GitHub Codespaces</a>, which provides up to 60 hours of free usage per month.</p>\n\u00a0\n<p><strong>What are the rate limits?</strong></p>\n\n<p>Season 4 uses <a href=\"https://github.com/marketplace/models\">GitHub Models</a>, which have <a href=\"https://docs.github.com/github-models/prototyping-with-ai-models#rate-limits\">rate limits</a>. If you hit a limit, wait for it to reset and resume. Learn more about <a href=\"https://docs.github.com/en/github-models/responsible-use-of-github-models\">responsible use of GitHub Models</a>.</p>\n\n</details><p>The post <a href=\"https://github.blog/security/hack-the-ai-agent-build-agentic-ai-security-skills-with-the-github-secure-code-game/\">Hack the AI agent: Build agentic AI security skills with the GitHub Secure Code Game</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","enclosure":{},"categories":["AI &amp; ML","Security","agentic AI security","AI security","coding training","cybersecurity","GitHub Security Lab","secure coding"]},{"title":"How exposed is your code? Find out in minutes\u2014for free","pubDate":"2026-04-14 15:00:00","link":"https://github.blog/security/application-security/how-exposed-is-your-code-find-out-in-minutes-for-free/","guid":"https://github.blog/?p=95258","author":"Dorothy Pearce","thumbnail":"","description":"\n<p>The new Code Security Risk Assessment gives you a one-click view of vulnerabilities across your organization, at no cost.</p>\n<p>The post <a href=\"https://github.blog/security/application-security/how-exposed-is-your-code-find-out-in-minutes-for-free/\">How exposed is your code? Find out in minutes\u2014for free</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","content":"\n<p>Most security leaders share the same suspicion: there are vulnerabilities in our codebase that we don\u2019t know about.</p>\n\n\n\n<p>The uncomfortable truth is that most code never gets a thorough security review. Vulnerabilities accumulate quietly in active repositories, across languages and teams, often undetected until something goes wrong. And if you\u2019re relying on manual reviews or narrowly scoped tools, the gaps may be wider than you think.</p>\n\n\n\n<p>Today, we\u2019re introducing the <a href=\"https://docs.github.com/en/code-security/concepts/code-scanning/code-security-risk-assessment\">Code Security Risk Assessment</a>: a free, one-click scan that reveals vulnerabilities hiding in your organization\u2019s code. No license required. No configuration. No commitment. Just clarity.</p>\n\n\n\n<p>The Code Security Risk Assessment is available to GitHub organization admins and security managers. If that\u2019s not you, this post is still worth reading and sharing: it explains what the assessment reveals and why it\u2019s worth running.</p>\n\n\n\n<p><a href=\"https://github.com/get_started?with=risk-assessment\"><strong>Run your free assessment &gt;</strong></a></p>\n\n\n\n<h2 class=\"wp-block-heading\">What you\u2019ll learn</h2>\n\n\n\n<p>The Code Security Risk Assessment scans up to 20 of your most active repositories using CodeQL, GitHub\u2019s industry-leading static analysis engine, and delivers a dashboard summarizing what it finds:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Total vulnerabilities found across your scanned repositories, broken down by severity: critical, high, medium, and low</li>\n\n\n\n<li>Vulnerabilities by language, so you can see which parts of your codebase carry the most risk</li>\n\n\n\n<li>Rules detected, showing the specific classes of security issues found, how many repositories they affect, and their severity</li>\n\n\n\n<li>Most vulnerable repositories, helping you identify where to focus remediation first</li>\n\n\n\n<li>Copilot Autofix eligibility \u2014 how many of your vulnerabilities could be automatically fixed with Copilot Autofix, GitHub\u2019s AI-powered remediation tool</li>\n</ul>\n<p>The assessment is available to organization admins and security managers on GitHub Enterprise Cloud and GitHub Team plans. It\u2019s completely free \u2014 you won\u2019t be charged for any licenses, and the GitHub Actions minutes used for scanning don\u2019t count against your quota.</p>\n\n\n\n<p><em>See how it works. \ud83d\udc47</em></p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n\n\t\t<div class=\"mod-vh position-relative\">\n\t\t\t\n\t\t</div>\n</div></figure><h2 class=\"wp-block-heading\">Completing the security picture</h2>\n\n\n\n<p>If you\u2019ve already run a <a href=\"https://docs.github.com/code-security/concepts/secret-security/about-secret-security-with-github#secret-risk-assessment\" target=\"_blank\" rel=\"noreferrer noopener\">Secret Risk Assessment</a>, you know the value of visibility. Since launching last year, the Secret Risk Assessment has helped thousands of organizations understand their exposure to leaked credentials. In 2025 alone, customers using <a href=\"https://docs.github.com/code-security/secret-scanning/introduction/about-secret-scanning\">Secret Protection</a> scanned nearly 2 billion pushes and blocked 19 million secret exposures.</p>\n\n\n\n<p>The Code Security Risk Assessment brings that same philosophy to vulnerabilities in your source code. Both assessments now run together from a single entry point, with a tabbed interface that lets you switch between your secret exposure and your code vulnerability findings. Together, they give you a unified view of your organization\u2019s security posture\u2014secrets and code\u2014in minutes.</p>\n\n\n\n<p>Even if you\u2019re not responsible for running security scans yourself, the results of these assessments can help your team align on where risk exists and what to fix first.</p>\n\n\n\n<p>And when you\u2019re ready to act on what you find, each assessment has a corresponding GitHub product designed to help. <a href=\"https://docs.github.com/en/code-security/secret-scanning/introduction/about-secret-scanning\">Secret Protection</a> stops credentials from leaking. <a href=\"https://docs.github.com/en/code-security/code-scanning/introduction-to-code-scanning/about-code-scanning\">Code Security</a> finds and fixes vulnerabilities. The assessments show you why you need them.</p>\n\n\n\n<h2 class=\"wp-block-heading\">From found to fixed</h2>\n\n\n\n<p>Knowing where your vulnerabilities are is the first step. Fixing them is what actually reduces risk.</p>\n\n\n\n<p>That\u2019s where GitHub Code Security and Copilot Autofix change the equation. Across GitHub in 2025:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\n<strong>460,258 security alerts</strong> were fixed using Copilot Autofix</li>\n\n\n\n<li>\n<strong>50%</strong> of vulnerability alerts were resolved directly in pull requests \u2014 where developers are already working</li>\n\n\n\n<li>Mean time to remediation was <strong>nearly twice as fast</strong> with Copilot Autofix (0.66 hours) compared to manual fixes (1.29 hours)</li>\n</ul>\n<p>Your Code Security Risk Assessment results will show you how many of your detected vulnerabilities are eligible for Copilot Autofix \u2014 giving you a concrete picture of how quickly you could start reducing risk. When you\u2019re ready, you can enable Code Security directly from the results page with a single click.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Find what you\u2019ve been missing</h2>\n\n\n\n<p>Whether you have no security scanning in place, you\u2019re evaluating your current tools, or you want a broader view of risk across your organization \u2014 the Code Security Risk Assessment meets you where you are.</p>\n\n\n\n<p>It\u2019s free. It takes minutes. And what you learn might change how you think about your security posture.</p>\n\n\n\n<div class=\"wp-block-group post-content-cta has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><a href=\"https://github.com/get_started?with=risk-assessment\">Run your free Code Security Risk Assessment</a>, or to learn more, <a href=\"https://docs.github.com/en/code-security/concepts/code-scanning/code-security-risk-assessment\">read the docs</a>.</p>\n</div>\n\n\n\n<p></p>\n\n<p>The post <a href=\"https://github.blog/security/application-security/how-exposed-is-your-code-find-out-in-minutes-for-free/\">How exposed is your code? Find out in minutes\u2014for free</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","enclosure":{},"categories":["Application security","Security","Web application security","code scanning","Code security","risk assessment","Secret Protection"]},{"title":"GitHub for Beginners: Getting started with GitHub Pages","pubDate":"2026-04-13 15:00:00","link":"https://github.blog/developer-skills/github/github-for-beginners-getting-started-with-github-pages/","guid":"https://github.blog/?p=95207","author":"Kedasha Kerr","thumbnail":"","description":"\n<p>Learn how to create a free website for any repository on GitHub Pages.</p>\n<p>The post <a href=\"https://github.blog/developer-skills/github/github-for-beginners-getting-started-with-github-pages/\">GitHub for Beginners: Getting started with GitHub Pages</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","content":"\n<p>Welcome back to GitHub for Beginners. So far, we\u2019ve discussed <a href=\"https://github.blog/developer-skills/github/github-for-beginners-getting-started-with-github-issues-and-projects/\">GitHub Issues and Projects</a>, <a href=\"https://github.blog/developer-skills/github/github-for-beginners-getting-started-with-github-actions/\">GitHub Actions</a>, and covered <a href=\"https://github.blog/developer-skills/github/github-for-beginners-getting-started-with-github-security/\">a bit about security</a>. This time, we\u2019re going to talk about GitHub Pages.</p>\n\n\n\n<p>Did you know that you have access to a free and secure hosting service on GitHub, readily available for any project? That\u2019s what GitHub Pages is\u2014a way to turn any GitHub repository with a static website into a live site for free. You just need three things:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A GitHub account</li>\n\n\n\n<li>A project to deploy</li>\n\n\n\n<li>A few minutes to deploy to GitHub Pages</li>\n</ul>\n<p>Follow the steps in this blog and your project will be live, searchable, and ready to share. Let\u2019s get started!</p>\n\n\n\n<p>As always, if you prefer to watch the video or want to reference it, we have all of our <a href=\"https://gh.io/gfb\">GitHub for Beginners episodes available on YouTube</a>.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Deploying to GitHub Pages</h2>\n\n\n\n<p>To get started, navigate to the <a href=\"https://gh.io/gfb-pages?utm_source=blog-episode-4&amp;utm_medium=blog&amp;utm_campaign=gfb-s3-2026\">sample repository</a>, and create a fork of the repository that you can use for your own walkthrough. This repository has a static website generated with Next.js. Since it\u2019s already been pushed up to GitHub, it\u2019s ready to deploy.</p>\n\n\n\n<p>There are two different ways that you can deploy your project to GitHub Pages: deploying from a branch or using GitHub Actions. First, let\u2019s look at deploying from a branch.</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Select the <strong>Settings</strong> tab at the top of the repository.</li>\n\n\n\n<li>Select <strong>Pages</strong> from the left-hand menu. It\u2019s located in the \u201cCode and automation\u201d section of the settings.</li>\n\n\n\n<li>Use the combo box under \u201cBuild and deployment\u201d and select <strong>Deploy from a branch</strong>.</li>\n\n\n\n<li>Under \u201cBranch,\u201d use the combo box to select <code>main</code> as the branch to deploy from.</li>\n\n\n\n<li>Click <strong>Save</strong>.</li>\n</ol>\n<p>This publishes the website from the main branch and makes it publicly available.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Deploying with GitHub Actions</h2>\n\n\n\n<p>Now let\u2019s look at publishing using the GitHub Actions workflow. Since we\u2019re already on the appropriate Settings page, we\u2019ll pick up from here.</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Under \u201cSource,\u201d use the combo box and select <strong>GitHub Actions</strong>. Once you do, GitHub will provide some suggested workflows.</li>\n\n\n\n<li>Select <strong>browse all workflows</strong> to see all the possible workflows available.This will send you to a new page with all sorts of workflows for different languages.</li>\n\n\n\n<li>Enter \u201cnext.js\u201d into the search box to filter the possible workflows.</li>\n\n\n\n<li>Click the <strong>Configure</strong> button in the \u201cNext.js\u201d workflow box. This takes you to the workflow file.</li>\n\n\n\n<li>Review the file and verify the permissions that are set as well as the build and deploy instructions.</li>\n\n\n\n<li>Since the file does not require any changes, select the green <strong>Commit changes</strong> button at the top-right of the window.</li>\n\n\n\n<li>Provide a commit message or have Copilot create one for you.</li>\n\n\n\n<li>Make sure the option to commit to the <code>main</code> branch is selected, then click <strong>Commit changes</strong> at the bottom of the window.</li>\n\n\n\n<li>Once the changes have been committed, select the <strong>Actions</strong> tab and wait for the actions to complete.</li>\n\n\n\n<li>Select the name of the <strong>Add GitHub Actions workflow for Next.js deployment</strong> action. Note that there will be two actions with the same name. If the action has successfully completed and does not show a website link in the \u201cdeploy\u201d box, you want to go back and select the other action with an identical name.</li>\n\n\n\n<li>Select the link in the \u201cdeploy\u201d box to see your website hosted on GitHub Pages.</li>\n</ol>\n<p>Congratulations! You have successfully deployed a website to GitHub Pages. Keep in mind that even if your repository is private, the published website will still be public. If you ever want to see who most recently deployed your website, you can do so by navigating back to <strong>Settings -&gt; Pages</strong>.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Adding a custom domain</h2>\n\n\n\n<p>By default, all websites on GitHub Pages will have the following URL: <code>USERNAME.github.io/REPOSITORY-NAME</code>.</p>\n\n\n\n<p>However, you can update this to use your custom domain if you want. To do this, you\u2019ll first need to configure DNS records with your domain provider. You can read more about how to do this by checking out <a href=\"https://docs.github.com/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site?utm_source=blog-episode-4&amp;utm_medium=blog&amp;utm_campaign=gfb-s3-2026\" target=\"_blank\" rel=\"noreferrer noopener\">our docs on managing a custom domain</a>. You\u2019ll also need to <a href=\"https://docs.github.com/pages/configuring-a-custom-domain-for-your-github-pages-site/verifying-your-custom-domain-for-github-pages?utm_source=blog-episode-4&amp;utm_medium=blog&amp;utm_campaign=gfb-s3-2026\" target=\"_blank\" rel=\"noreferrer noopener\">verify your domain</a> at the org or profile level.</p>\n\n\n\n<p>Once you\u2019ve configured the DNS records and verified the domain, you can set the custom domain by following these steps:</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Navigate to <strong>Settings -&gt; Pages</strong>.</li>\n\n\n\n<li>Under \u201cCustom domain,\u201d enter your domain name into the box provided.</li>\n\n\n\n<li>Select <strong>Save</strong> next to your custom domain. After you update the domain name, GitHub automatically checks your domain\u2019s DNS configuration. If everything seems good, you\u2019ll see a green checkmark.</li>\n\n\n\n<li>Once the domain has been verified, select the <strong>Enforce HTTPS</strong> checkbox. This secures your site with a free SSL certificate and makes sure visitors see that secure padlock in their browser.</li>\n</ol>\n<h2 class=\"wp-block-heading\">What\u2019s next?</h2>\n\n\n\n<p>Now you know how to select a project to deploy and create a website for the repository either from a branch or by using GitHub Actions. Not only that, but you can customize the domain, and it\u2019s all available for free! Use this to promote your projects, share what you\u2019re working on, or expand your portfolio, even if the projects themselves are private.</p>\n\n\n\n<p>If you want to learn more about GitHub Pages, here are some good places to get started:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://docs.github.com/pages?utm_source=blog-episode-4&amp;utm_medium=blog&amp;utm_campaign=gfb-s3-2026\" target=\"_blank\" rel=\"noreferrer noopener\">The GitHub Pages main doc site</a></li>\n\n\n\n<li><a href=\"https://docs.github.com/pages/getting-started-with-github-pages/creating-a-github-pages-site?utm_source=blog-episode-4&amp;utm_medium=blog&amp;utm_campaign=gfb-s3-2026\" target=\"_blank\" rel=\"noreferrer noopener\">Creating a GitHub Pages site</a></li>\n\n\n\n<li><a href=\"https://docs.github.com/pages/configuring-a-custom-domain-for-your-github-pages-site/about-custom-domains-and-github-pages?utm_source=blog-episode-4&amp;utm_medium=blog&amp;utm_campaign=gfb-s3-2026\" target=\"_blank\" rel=\"noreferrer noopener\">About custom domains</a></li>\n</ul>\n<p>Happy coding!</p>\n\n<p>The post <a href=\"https://github.blog/developer-skills/github/github-for-beginners-getting-started-with-github-pages/\">GitHub for Beginners: Getting started with GitHub Pages</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","enclosure":{},"categories":["Developer skills","GitHub","GitHub for beginners","GitHub Skills"]},{"title":"GitHub Copilot CLI for Beginners: Getting started with GitHub Copilot CLI","pubDate":"2026-04-10 16:00:00","link":"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-getting-started-with-github-copilot-cli/","guid":"https://github.blog/?p=95185","author":"Christopher Harrison","thumbnail":"","description":"\n<p>GitHub for Beginners: Getting started with the GitHub Copilot CLI, a step-by-step tutorial.</p>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-getting-started-with-github-copilot-cli/\">GitHub Copilot CLI for Beginners: Getting started with GitHub Copilot CLI</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","content":"\n<p>Welcome to GitHub Copilot CLI for Beginners! In this series (<a href=\"https://www.youtube.com/playlist?list=PL0lo9MOBetEHvO-spzKBAITkkTqv4RvNl\">available in video format</a> and on the GitHub Blog), we\u2019ll explore how to use your AI coding assistant directly in your terminal, along with tips and tricks on how to navigate the command line like a pro!</p>\n\n\n\n<p>In this blog, we\u2019ll walk through what <a href=\"https://github.com/features/copilot/cli?utm_source=blog-cli-beginners-ep1-features-cta&amp;utm_medium=blog&amp;utm_campaign=dev-pod-copilot-cli-2026\">GitHub Copilot CLI</a> is, how it works, and how to get started. You\u2019ll learn how to install it using npm, authenticate with your GitHub account, grant folder permissions, and run your first prompts to generate code directly from the terminal.</p>\n\n\n\n<p>Let\u2019s get started!</p>\n\n\n\n<h2 class=\"wp-block-heading\">What is GitHub Copilot CLI?</h2>\n\n\n\n<p>The GitHub Copilot CLI brings Copilot\u2019s agentic AI capabilities right into the command-line interface (CLI), becoming like any terminal or console based tool you use (with the full context of your repos)!</p>\n\n\n\n<p>What makes agents so special is their ability to perform tasks like building code and running tests autonomously, so you can build iteratively. They can even self-correct and fix errors without needing a human to prompt them.</p>\n\n\n\n<p>This means you can assign tasks to Copilot, focus on other to-do list items, and then review the results and request additional changes from the terminal\u2014all without having to interrupt your workflow or switch tools. (You can even delegate tasks to Copilot Cloud agent from inside the CLI, more on this later.)</p>\n\n\n\n<h2 class=\"wp-block-heading\">Installing Copilot CLI</h2>\n\n\n\n<p>Not surprisingly, the first step to using Copilot CLI is installation. The core cross-platform way\u2014if you already have node\u2014to do this is via npm, using:</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>npm install -g @github/copilot </code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"npm install -g @github/copilot\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy>\n</div>\n\n\n<p>If you\u2019re using a package manager like WinGet or Homebrew, you can install Copilot CLI through those tools as well. (You\u2019ll want to consult those tools\u2019 documentation for the exact specifics on how to do this.)</p>\n\n\n\n<h2 class=\"wp-block-heading\">Getting started with GitHub Copilot CLI</h2>\n\n\n\n<p>Once you install the product, you can launch it by typing \u201cCopilot\u201d in your command line. There are numerous switches you can use, which we\u2019ll cover later in the series.</p>\n\n\n\n<p>If it\u2019s your first time in the terminal, you\u2019ll need to log in with your GitHub credentials.</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>/login</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"/login\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy>\n</div>\n\n\n<p>This will:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tie the client to your Copilot account.</li>\n\n\n\n<li>Connect the readonly GitHub MCP server, which grants access to resources on GitHub. (Don\u2019t worry, we\u2019ll cover MCP later in the series as well!)</li>\n</ul>\n<p>When using Copilot, you need to grant access to the folder for Copilot to be able to explore and potentially modify files. You can do this for only this session or save this setting to apply to later sessions, too. This will allow you to launch Copilot again in the future, without having to keep approving it for the same project.</p>\n\n\n\n<p>Once you\u2019ve done that, you can start talking to Copilot, asking it questions, and request code or other tasks.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Use cases: What you can do with Copilot CLI</h2>\n\n\n\n<p>Here are just a few GitHub Copilot CLI use cases. (There are many more covered in the <a href=\"https://github.blog/ai-and-ml/github-copilot-cli-101-how-to-use-github-copilot-from-the-command-line/\">GitHub Copilot CLI 101 blog</a>!)</p>\n\n\n\n<p><strong>Ask for an overview of the project</strong>: Copilot will explore, open important files, and report back with its findings.</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>Give me an overview of this project </code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"Give me an overview of this project\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy>\n</div>\n\n\n<p><strong>Ask for code, such as a new endpoint</strong>: Copilot will look at the project, find existing documentation and examples, and try to follow the practices it sees. Again, it will ask for permission to create the file.</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>Let\u2019s add a new endpoint to return all categories</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"Let\u2019s add a new endpoint to return all categories\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy>\n</div>\n\n\n<p><strong>Delegate tasks to Copilot cloud agent</strong>: For well-defined tasks, you can delegate to Copilot cloud agent right from the CLI. Copilot will preserve the context from your current session, create a new branch, open a draft pull request, and make the requested changes in the background before requesting your review.</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>/delegate Let\u2019s deal with issue #14 to add the rest of the CRUD endpoints to games</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"/delegate Let\u2019s deal with issue #14 to add the rest of the CRUD endpoints to games\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy>\n</div>\n\n\n<p>Of course, one of the best ways to explore what you can do with Copilot CLI is to simply ask Copilot. It can look through its own documentation and provide guidance on the best ways to interact with it and explore.</p>\n\n\n\n<p>Tune in for the next lesson in the series which covers using two different modes: interactive mode to have GitHub Copilot run your project locally or non-interactive mode with the <code>-p</code> flag for quick summaries without leaving your shell context.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Take this with you</h2>\n\n\n\n<p>Bringing agentic AI right to your terminal opens a whole new way to learn, experiment, and get things done without ever breaking your flow. Keep an eye out for more <a href=\"https://www.youtube.com/playlist?list=PL0lo9MOBetEHvO-spzKBAITkkTqv4RvNl\">videos</a> in the GitHub Copilot CLI for Beginners series, where we\u2019ll learn about:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Interactive vs non-interactive modes</li>\n\n\n\n<li>Copilot CLI slash commands</li>\n\n\n\n<li>Using MCP servers with Copilot CLI</li>\n\n\n\n<li>And more!</li>\n</ul>\n<p>Happy coding!</p>\n\n\n\n<div class=\"wp-block-group post-content-cta has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><strong>Looking to try GitHub Copilot CLI?</strong> <a href=\"https://docs.github.com/copilot/concepts/agents/about-copilot-cli\">Read the Docs</a> and <a href=\"https://github.com/features/copilot/cli?utm_source=blog-cli-beginners-ep1-features-cta&amp;utm_medium=blog&amp;utm_campaign=dev-pod-copilot-cli-2026\">get started today</a>.</p>\n</div>\n\n\n\n<p><strong>More resources to explore:</strong></p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://www.youtube.com/playlist?list=PL0lo9MOBetEHvO-spzKBAITkkTqv4RvNl\">GitHub Copilot CLI for Beginners video series</a></li>\n\n\n\n<li><a href=\"https://github.blog/ai-and-ml/github-copilot-cli-101-how-to-use-github-copilot-from-the-command-line/?utm_source=blog-announcement-cli-tutorial&amp;utm_medium=blog&amp;utm_campaign=universe25post\">GitHub Copilot CLI 101: How to use GitHub Copilot from the command line</a></li>\n\n\n\n<li><a href=\"https://docs.github.com/en/copilot/how-tos/copilot-cli/cli-best-practices?utm_campaign=copilot-brand&amp;utm_medium=sem&amp;utm_source=google&amp;ocid=AIDcmmh2h80ugd_SEM__k_CjwKCAjw-dfOBhAjEiwAq0RwI0TIeyL9bjDmXlY26JKPbDvHGzBcaZUa4LR8u8SJuGbIke6e7U2YXRoCzGQQAvD_BwE_k_\">Best practices for GitHub Copilot CLI</a></li>\n</ul>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-getting-started-with-github-copilot-cli/\">GitHub Copilot CLI for Beginners: Getting started with GitHub Copilot CLI</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","enclosure":{},"categories":["AI &amp; ML","Generative AI","GitHub Copilot","GitHub Education","GitHub Copilot CLI","GitHub Copilot CLI for Beginners"]},{"title":"GitHub availability report: March 2026","pubDate":"2026-04-09 02:21:17","link":"https://github.blog/news-insights/company-news/github-availability-report-march-2026/","guid":"https://github.blog/?p=95150","author":"Jakub Oleksy","thumbnail":"","description":"\n<p>In March, we experienced four incidents that resulted in degraded performance across GitHub services.</p>\n<p>The post <a href=\"https://github.blog/news-insights/company-news/github-availability-report-march-2026/\">GitHub availability report: March 2026</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","content":"\n<p>In March, we experienced four incidents that resulted in degraded performance across GitHub services.</p>\n\n\n\n<p><strong>March 03 18:59 UTC (lasting 1 hour and 10 minutes)</strong></p>\n\n\n\n<p>On March 3, 2026, between 18:46 and 20:09 UTC, GitHub experienced a period of degraded availability impacting github.com, the GitHub API, GitHub Actions, Git operations, GitHub Copilot, and other dependent services. At the peak of the incident, github.com request failures reached approximately 40%. During the same period, approximately 43% of GitHub API requests failed. Git operations over HTTP had an error rate of approximately 6%, while SSH was not impacted. GitHub Copilot requests had an error rate of approximately 21%. GitHub Actions experienced less than 1% impact.</p>\n\n\n\n<p>This incident shared the same underlying cause as an incident in early February, where we saw a large volume of writes to the user settings caching mechanism. While deploying a change to reduce the burden of these writes, a bug caused every user\u2019s cache to expire, get recalculated, and get rewritten. The increased load caused replication delays that cascaded down to all affected services. We mitigated this issue by immediately rolling back the faulty deployment.</p>\n\n\n\n<p>We understand these incidents disrupted the workflows of developers. While we have made (and are making) substantial, long-term investments in how GitHub is built and operated to improve resilience, we acknowledge we have more work to do. Getting there requires deep architectural work that is already underway, as well as urgent, targeted improvements. We are taking the following immediate steps:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>We have added a killswitch and improved monitoring to the caching mechanism to ensure we are notified before there is user impact and can respond swiftly.</li>\n\n\n\n<li>We are moving the cache mechanism to a dedicated host, ensuring that any future issues will solely affect services that rely on it.</li>\n</ul>\n<p><strong>March 05 16:35 UTC (lasting 2 hours and 55 minutes)</strong></p>\n\n\n\n<p>On March 5, 2026, between 16:24 and 19:30 UTC, GitHub Actions was degraded. During this time, 95% of workflow runs failed to start within 5 minutes with an average delay of 30 minutes, and 10% of workflow runs failed with an infrastructure error. This was due to Redis infrastructure updates that were being rolled out to production to improve our resiliency. These updates introduced a set of incorrect configuration changes into our Redis load balancer, causing internal traffic to be routed to an incorrect host leading to two incidents.</p>\n\n\n\n<p>We mitigated this incident by correcting the misconfigured load balancer. Actions jobs were running successfully starting at 17:24 UTC. The remaining time until we closed the incident was spent burning through the queue of jobs.</p>\n\n\n\n<p>We immediately rolled back the updates that were a contributing factor and have frozen all changes in this area until we complete follow-up work. We are working to improve our automation to ensure incorrect configuration changes cannot propagate through our infrastructure. We are also working on improved alerting to catch misconfigured load balancers before it becomes an incident. Additionally, we are updating the Redis client configuration in Actions to improve resiliency to brief cache interruptions.</p>\n\n\n\n<p><strong>March 19 13:44 UTC (lasting 48 minutes)</strong></p>\n\n\n\n<p>On March 19, 2026, between 01:05 and 02:52 UTC, and again on March 20, 2026, between 00:42 and 01:58 UTC, the Copilot Coding Agent service was degraded and users were unable to start new Copilot Agent sessions or view existing ones. During the first incident, the average error rate was ~53% and peaked at ~93% of requests to the service. During the second incident, the average error rate was ~99% and peaked at ~100% of requests with significant retry amplification. Both incidents were caused by the same underlying system authentication issue that prevented the service from connecting to its backing datastore.</p>\n\n\n\n<p>We mitigated each incident by rotating the affected credentials, which restored connectivity and returned error rates to normal. The mitigation time was 01:24. The second occurrence was due to an incomplete remediation of the first.</p>\n\n\n\n<p>We have implemented automated monitoring for credential lifecycle events and are improving operational processes to reduce our time to detection and mitigation of issues like this one in the future.</p>\n\n\n\n<p><strong>March 24 16:59 UTC (lasting 2 hours and 52 minutes)</strong></p>\n\n\n\n<p>On March 24, 2026, between 15:57 and 19:51 UTC, the Microsoft Teams Integration and Teams Copilot Integration services were degraded and unable to deliver GitHub event notifications to Microsoft Teams. On average, the error rate was 37.4% and peaked at 90.1% of requests to the service\u2014approximately 19% of all integration installs failed to receive GitHub-to-Teams notifications in this time period.</p>\n\n\n\n<p>This was due to an outage at one of our upstream dependencies, which caused HTTP 500 errors and connection resets for our Teams integration.</p>\n\n\n\n<p>We coordinated with the relevant service teams, and the issue was resolved at 19:51 UTC when the upstream incident was mitigated.</p>\n\n\n\n<p>We are working to update observability and runbooks to reduce time to mitigation for issues like this in the future.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n<p>Follow our <a href=\"https://www.githubstatus.com/\">status page</a> for real-time updates on status changes and post-incident recaps. To learn more about what we\u2019re working on, check out the engineering section on the <a href=\"https://github.blog/category/engineering/\">GitHub Blog</a>.</p>\n<p>The post <a href=\"https://github.blog/news-insights/company-news/github-availability-report-march-2026/\">GitHub availability report: March 2026</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","enclosure":{},"categories":["Company news","News &amp; insights","GitHub Availability Report"]},{"title":"GitHub Universe is back: We want you to take the stage","pubDate":"2026-04-08 16:35:46","link":"https://github.blog/news-insights/company-news/github-universe-is-back-we-want-you-to-take-the-stage/","guid":"https://github.blog/?p=95093","author":"Rachel Cohen","thumbnail":"https://github.blog/wp-content/uploads/2026/04/Image-1.jpeg?resize=1024%2C683","description":"\n<p>Get inspired by five of the most memorable, magical, and quirky Universe sessions to date.</p>\n<p>The post <a href=\"https://github.blog/news-insights/company-news/github-universe-is-back-we-want-you-to-take-the-stage/\">GitHub Universe is back: We want you to take the stage</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","content":"\n<p>Everyone\u2019s favorite global developer event is back for another year of learning, connection, building, and donuts. We hope you\u2019re excited to join us at Fort Mason Center in San Francisco on October 28\u201329. Of course, you don\u2019t just have to be in attendance this year: Our Call for Sessions is open <strong>now through Friday, May 1 at 11:59 p.m. PT</strong>. If you\u2019ve been thinking about taking the stage, this is your moment. <a href=\"https://reg.githubuniverse.com/flow/github/universe26/cfs/page/cfs-submissionguide\">Submit a proposal</a> that shares what you\u2019ve been building over the past year, what you\u2019ve learned, and what other builders can take away from it. And if you know someone who deserves a mic, you can <a href=\"https://reg.githubuniverse.com/flow/github/universe26/cfs/page/cfs-submissionguide\">also nominate a speaker</a>.</p>\n\n\n\n<p>Need some inspiration? Below, we have five past Universe sessions that have captured our imaginations (so much so that we\u2019re still talking about them). These sessions perfectly encapsulate what Universe is all about: learning, fun, and just a little magic. We can\u2019t wait to see what they spark for you.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Git\u2019s nine lives: Taming frontend chaos with Git\u2019s hidden features (2025)</h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" fetchpriority=\"high\" decoding=\"async\" height=\"683\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/04/Image-1.jpeg?resize=1024%2C683\" alt=\"Pillippa P\u00e9rez Pons on stage at GitHub Universe 2025.\" class=\"wp-image-95095\" srcset=\"https://github.blog/wp-content/uploads/2026/04/Image-1.jpeg?w=1600 1600w, https://github.blog/wp-content/uploads/2026/04/Image-1.jpeg?w=300 300w, https://github.blog/wp-content/uploads/2026/04/Image-1.jpeg?w=768 768w, https://github.blog/wp-content/uploads/2026/04/Image-1.jpeg?w=1024 1024w, https://github.blog/wp-content/uploads/2026/04/Image-1.jpeg?w=1536 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\"></figure><p>Pillippa P\u00e9rez Pons took a problem every frontend team recognized: messy rebases, ever-growing monorepos, mysteriously vanishing commits, and general Git chaos, and made it delightfully weird by framing the whole thing as a cat\u2019s nine lives. Each \u201clife\u201d unlocked a lesser-known Git feature or optimization\u2014sparse checkouts, partial clones, reflog rescues, and performance boosts\u2014delivered with storytelling, visuals, and just enough humor to make the tricky parts stick.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Breath of Copilot: Level up your DevEx with GitHub Actions and GitHub Advanced Security (2025)</h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" height=\"683\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/04/Image-2.jpeg?resize=1024%2C683\" alt=\"Matteo Bianchi (GitHub) and Alexandra Aldershaab (Eficode) on stage at GitHub Universe 2025\" class=\"wp-image-95096\" srcset=\"https://github.blog/wp-content/uploads/2026/04/Image-2.jpeg?w=1600 1600w, https://github.blog/wp-content/uploads/2026/04/Image-2.jpeg?w=300 300w, https://github.blog/wp-content/uploads/2026/04/Image-2.jpeg?w=768 768w, https://github.blog/wp-content/uploads/2026/04/Image-2.jpeg?w=1024 1024w, https://github.blog/wp-content/uploads/2026/04/Image-2.jpeg?w=1536 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\"></figure><p>This full-on fantasy adventure, presented by Matteo Bianchi (GitHub) and Alexandra Aldershaab (Eficode), cast CI/CD as a castle, reframed ancient scripts as lurking monsters, and sent the audience on a quest to modernize automation without inviting supply chain dragons into the build. Under the playful storytelling, the session delivered a genuinely practical payoff: secure GitHub Actions patterns (with Copilot as a trusty sidekick) that helped teams speed up workflows while keeping security front and center.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Dream it in the morning, build it in the afternoon: Collapsing the distance from idea to impact (2025)</h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n\n\t\t<div class=\"mod-vh position-relative\">\n\t\t\t\n\t\t</div>\n</div></figure><p>In Martin Woodward\u2019s (GitHub) hands, \u201cspeed\u201d became less of a productivity metric and more of a creative superpower (and yes, occasionally a little Furby-powered). The session zoomed out to the big shift underway in software: ideas moving from sketch to prototype to shipped experience faster than ever, and the new questions that came with that acceleration. Instead of obsessing over velocity, Martin challenged the audience with the idea that the best developers never stop experimenting. They stay curious. \u201cIf you can dream it,\u201d he said. \u201cYou can build it.\u201d</p>\n\n\n\n<h2 class=\"wp-block-heading\">Dungeons and deployments: The clusters of chaos (2024)</h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n\n\t\t<div class=\"mod-vh position-relative\">\n\t\t\t\n\t\t</div>\n</div></figure><p>If you\u2019ve ever wished Kubernetes security training came with a party of adventurers and a ridiculous quest narrative, this one absolutely delivered. Noah Abrahams, Ian Coldwater, Kat Cosgrove, Seth McCombs, and Natali Vlatko walked the audience through a serious cluster of security concepts while roleplaying their way through a chaotic fantasy world, complete with memorable villains and dramatic stakes.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Mission Copilot Autofix: Securing the world\u2019s software (2024)</h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n\n\t\t<div class=\"mod-vh position-relative\">\n\t\t\t\n\t\t</div>\n</div></figure><p>With true cinematic excitement, Nick Liffen (GitHub) and Niroshan Rajadurai turned application security into a near-future mission briefing. During their session, they pulled back the curtain on how GitHub applies AI to streamline remediation and make alerts easier to interpret\u2014then pushed the story forward into what comes next: AI that can fortify defenses and even spot emerging threats before they turn into incidents. They even saved a special surprise for the finale, giving the whole session that \u201cstay until the credits\u201d energy. This blog post will self-destruct in 3\u20262\u20261\u2026just kidding.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Universe \u201926 sessions and submissions TL;DR</h2>\n\n\n\n<p>If you need help polishing your proposal or making your idea stand out, check out our <a href=\"https://reg.githubuniverse.com/flow/github/universe26/cfs/page/cfs-submissionguide\">submission guide</a>, which covers this year\u2019s content tracks, provides an in-depth look at session types, and outlines the anatomy of a great submission.</p>\n\n\n\n<p><strong>This year\u2019s sessions fall into three categories:</strong></p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\n<strong>Demo-style sessions</strong>: Product demos and Ship &amp; Tell are for speakers who want to show what\u2019s possible and share learnings.</li>\n\n\n\n<li>\n<strong>Thought leadership</strong>: Breakout Sessions, Panels, and Fireside chats are built for longer narratives, perspectives, and big ideas, with room for Q&amp;A.</li>\n\n\n\n<li>\n<strong>Interactive learning</strong>: Workshops and Sandbox sessions focus on guided, participatory learning where attendees can practice new skills in real time.</li>\n</ul>\n<p>\ud83d\udca1 <strong>Pro tip</strong>: Ship &amp; Tell is a new format this year that\u2019s ideal for startup founders and builders to tell their story. What did you ship? How did you scale it? What broke? What worked? Your takeaways will provide inspiration for the next generation of builders.</p>\n\n\n\n<h2 class=\"wp-block-heading\">See you on stage</h2>\n\n\n\n<p>Ready to pitch your own Universe-worthy idea? If these sessions have one thing in common, it\u2019s this: they\u2019re grounded in real engineering lessons, then delivered with personality, creativity, and a clear point of view. That\u2019s exactly the kind of proposal we\u2019re excited to see for Universe.</p>\n\n\n\n<p>Before you submit, review the submission guide for what makes a strong proposal, plus tips to match your idea to the right format.</p>\n\n\n\n<p>And don\u2019t wait: the deadline to submit a session proposal or nominate a speaker is <strong>Friday, May 1 at 11:59 pm PT</strong>.</p>\n\n\n\n<div class=\"wp-block-group post-content-cta has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><a href=\"https://reg.githubuniverse.com/flow/github/universe26/cfs/page/cfs-submissionguide\">Apply to speak, or nominate a speaker &gt;</a></p>\n</div>\n\n<p>The post <a href=\"https://github.blog/news-insights/company-news/github-universe-is-back-we-want-you-to-take-the-stage/\">GitHub Universe is back: We want you to take the stage</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","enclosure":{},"categories":["Company news","News &amp; insights","GitHub Universe"]},{"title":"GitHub Copilot CLI combines model families for a second opinion","pubDate":"2026-04-06 21:53:49","link":"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-combines-model-families-for-a-second-opinion/","guid":"https://github.blog/?p=95067","author":"Nick McKenna","thumbnail":"","description":"\n<p>Discover how Rubber Duck provides a different perspective to GitHub Copilot CLI. </p>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-combines-model-families-for-a-second-opinion/\">GitHub Copilot CLI combines model families for a second opinion</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","content":"\n<p>When you ask a coding agent to build a data pipeline, it may not use the best structure. But what if the agent got a second opinion before it executed the plan?</p>\n\n\n\n<p>Today, in <a href=\"https://github.com/features/copilot/cli?utm_source=blog-cross-model-cta&amp;utm_medium=blog&amp;utm_campaign=copilot-cli-cross-model-march-2026\">GitHub Copilot CLI</a>, we\u2019re introducing <strong>Rubber Duck in experimental mode</strong>. Rubber Duck leverages a second model from a different AI family to act as an independent reviewer, assessing the agent\u2019s plans and work at the moments where feedback matters most.</p>\n\n\n\n<p>To catch different kinds of errors, a different perspective matters. Our evaluations show that Claude Sonnet + Rubber Duck makes up 74.7% of the performance gap between Sonnet and Opus alone, achieving better results for tackling difficult multi-file and long-running tasks. Use <code>/experimental</code> in Copilot CLI to access Rubber Duck alongside our other experimental features.</p>\n\n\n\n<h2 class=\"wp-block-heading\">The problem: Confident mistakes can compound</h2>\n\n\n\n<p>Today\u2019s coding agents follow a clear loop. First, the agent assesses the task, then drafts a plan, implements, tests, and iterates if necessary. It\u2019s a powerful flow that works well, but it has blind spots. Any decision an agent makes early on, especially in the planning stage, is the foundation you\u2019re building upon. Assumptions and inefficiencies become dependencies, and by the time you notice, you may have to fix more than just the small mistake at the start.</p>\n\n\n\n<p>Using self-reflection and having the agent review its own output before moving forward is a proven technique. <strong>However, a model reviewing its own work is still bounded by its own training biases: the same training data and techniques, the same blind spots.</strong></p>\n\n\n\n<h2 class=\"wp-block-heading\">Rubber Duck adds a second perspective</h2>\n\n\n\n<p>Rubber Duck is a focused review agent, powered by a model from a complementary family to your primary Copilot session. When you\u2019ve selected a Claude model from the model picker to use as your orchestrator, Rubber Duck will be GPT-5.4. As we experiment with Rubber Duck, we are exploring other model families for the orchestrator and for the Rubber Duck. The job of Rubber Duck is to check the agent\u2019s work and surface a short, focused list of high-value concerns: details that the primary agent may have missed, assumptions worth questioning, and edge cases to consider.</p>\n\n\n\n<h3 class=\"wp-block-heading\">When does the cross-family review help?</h3>\n\n\n\n<p>We evaluated Rubber Duck on <a href=\"https://www.swebench.com/\">SWE-Bench Pro</a>, a benchmark of large, difficult, real-world coding problems drawn from open-source repositories. Here\u2019s what we found:</p>\n\n\n\n<p>Claude Sonnet 4.6 paired with Rubber Duck running GPT-5.4 achieved a resolution rate approaching Claude Opus 4.6 running alone, closing 74.7% of the performance gap between Sonnet and Opus.</p>\n\n\n\n<p>We noticed that Rubber Duck tends to help more with difficult problems, ones that span 3+ files and would normally take 70+ steps. On these problems, Sonnet + Rubber Duck scores 3.8% higher than the Sonnet baseline, and 4.8% higher on the hardest problems identified across three trials. Here are a few examples of what Rubber Duck finds:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\n<strong>Architectural catch (OpenLibrary/async scheduler)</strong>: Rubber Duck caught that the proposed scheduler would start and immediately exit, running zero jobs\u2014and that even if fixed, one of the scheduled tasks was itself an infinite loop.</li>\n\n\n\n<li>\n<strong>One-liner bug, big impact (OpenLibrary/Solr)</strong>: Rubber Duck caught a loop that silently overwrote the same <code>dict</code> key on every iteration. Three of four Solr facet categories were being dropped from every search query, with no error thrown.</li>\n\n\n\n<li>\n<strong>Cross-file conflict (NodeBB/email confirmation)</strong>: Rubber Duck caught three files that all read from a Redis key which the new code stopped writing. The confirmation UI and cleanup paths would have been silently broken on deploy.</li>\n</ul>\n<h3 class=\"wp-block-heading\">When does Rubber Duck activate?</h3>\n\n\n\n<p>GitHub Copilot can call Rubber Duck <strong>automatically</strong>, both <strong>proactively</strong> and <strong>reactively</strong>, and it can be triggered by a user at any time to critique and revise its work.</p>\n\n\n\n<p>For complex work, GitHub Copilot may seek a critique automatically at the checkpoints where feedback has the highest return:</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\n<strong>After drafting a plan:</strong> This is where we expect developers will see the biggest wins, because catching a suboptimal decision early avoids compounding errors downstream.</li>\n\n\n\n<li>\n<strong>After a complex implementation:</strong> This is when a second set of eyes on complex code can help catch edge cases.</li>\n\n\n\n<li>\n<strong>After writing tests, before executing them:</strong> This is a chance to catch gaps in test coverage or flawed assertions, before self-reinforcing that \u201ceverything passes.\u201d</li>\n</ol>\n<p>The agent can also seek a critique reactively if it gets stuck in a loop or can\u2019t make progress. Consulting Rubber Duck can break the logjam.</p>\n\n\n\n<p>As a user, you can request a critique at any point. Copilot will query Rubber Duck, reason over the feedback, and show you what changed and why.</p>\n\n\n\n<p>We made a key design choice: the agent invokes Rubber Duck sparingly, targeting the moments where the signal is highest, without getting in the way. For the technically curious: Rubber Duck is invoked through Copilot\u2019s existing task tool\u2014the same infrastructure used for other subagents.</p>\n\n\n\n<p>For now, we are enabling Rubber Duck for all Claude family models (Opus, Sonnet, and Haiku) used as orchestrators in the model picker. We are already exploring other model families for the Rubber Duck to pair with GPT-5.4 as the orchestrator.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Getting started</h2>\n\n\n\n<p>Rubber Duck is available today in <a href=\"https://github.com/github/copilot-cli?tab=readme-ov-file#experimental-mode\">experimental mode</a>.</p>\n\n\n\n<p>To start using it, install <a href=\"https://github.com/features/copilot/cli?utm_source=blog-cross-model-cta&amp;utm_medium=blog&amp;utm_campaign=copilot-cli-cross-model-march-2026\">GitHub Copilot CLI</a>, and run the <code>/experimental</code> slash command. Rubber Duck will be available when you select any Claude model from the model picker and have access enabled to GPT-5.4. You\u2019ll see critiques surface in two ways:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Automatically, when Copilot decides a checkpoint warrants a second opinion: after planning, after complex implementations, or after writing tests.</li>\n\n\n\n<li>On demand, whenever you ask. Just tell Copilot to critique its work, and it will invoke Rubber Duck, incorporate the feedback, and show you exactly what changed.</li>\n</ul>\n<p>Where Rubber Duck helps most:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Complex refactors and architectural changes</li>\n\n\n\n<li>High-stakes tasks where a miss is costly</li>\n\n\n\n<li>Ensuring comprehensive test coverage</li>\n\n\n\n<li>Any time you want a second opinion on a plan before committing to it</li>\n</ul>\n<div class=\"wp-block-group post-content-cta has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>Rubber Duck in <a href=\"https://github.com/features/copilot/cli?utm_source=blog-cross-model-cta&amp;utm_medium=blog&amp;utm_campaign=copilot-cli-cross-model-march-2026\">GitHub Copilot CLI</a> is now available in experimental mode. Share your feedback with us in the <a href=\"https://github.com/orgs/community/discussions/191734\">discussion</a>.</p>\n</div>\n\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-combines-model-families-for-a-second-opinion/\">GitHub Copilot CLI combines model families for a second opinion</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","enclosure":{},"categories":["AI &amp; ML","GitHub Copilot","AI agents","GitHub Copilot CLI"]},{"title":"The uphill climb of making diff lines performant","pubDate":"2026-04-03 16:00:00","link":"https://github.blog/engineering/architecture-optimization/the-uphill-climb-of-making-diff-lines-performant/","guid":"https://github.blog/?p=94994","author":"Luke Ghenco","thumbnail":"https://github.blog/wp-content/uploads/2026/04/3.png?resize=960%2C1340","description":"\n<p>The path to better performance is often found in simplicity.</p>\n<p>The post <a href=\"https://github.blog/engineering/architecture-optimization/the-uphill-climb-of-making-diff-lines-performant/\">The uphill climb of making diff lines performant</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","content":"\n<p>Pull requests are the beating heart of GitHub. As engineers, this is where we spend a good portion of our time. And at GitHub\u2019s scale\u2014where pull requests can range from tiny one-line fixes to changes spanning thousands of files and millions of lines\u2014the pull request review experience has to stay fast and responsive.</p>\n\n\n\n<p>We recently shipped the new React-based experience for the <strong>Files changed</strong> tab (now the default experience for all users). One of our main goals was to ensure a more performant experience across the board, especially for large pull requests. That meant investing in, and consistently prioritizing, the hard problems like optimized rendering, interaction latency, and memory consumption.</p>\n\n\n\n<p>For most users before optimization, the experience was fast and responsive. But when viewing large pull requests, performance would noticeably decline. For example, we observed that in extreme cases, the JavaScript heap could exceed 1 GB, DOM node counts surpassed 400,000, and page interactions became extremely sluggish or even unusable. <a href=\"https://web.dev/articles/inp#what-is-inp\">Interaction to Next Paint</a> (INP) scores (a key metric in determining responsiveness) were above acceptable levels, resulting in an experience where users could quantifiably feel the input lag.</p>\n\n\n\n<p>Our recent improvements to the <strong>Files changed</strong> tab have meaningfully improved some of these core performance metrics. While we covered <a href=\"https://github.blog/changelog/2026-01-22-improved-pull-request-files-changed-page-on-by-default/\">several of these changes briefly in a recent changelog</a>, we\u2019re going to cover them in more detail here. Read on for why they mattered, what we measured, and how those updates improved responsiveness and memory pressure across the board and especially in large pull requests.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Performance improvements by pull request size and complexity</h2>\n\n\n\n<p>As we started to investigate and plan our next steps for improving these performance issues, it became clear early on that there wouldn\u2019t be one silver bullet. Techniques that preserve every feature and browser-native behavior can still hit a ceiling at the extreme end. Meanwhile, mitigations designed to keep the worst-case from tipping over can be the wrong tradeoff for everyday reviews.</p>\n\n\n\n<p>Instead of looking for a single solution, we began developing a set of strategies. We selected multiple targeted approaches, each designed to address a specific pull request size and complexity.</p>\n\n\n\n<p>Those strategies focused on the following themes:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\n<strong>Focused optimizations for diff-line components.</strong> Make the primary diff experience efficient for most pull requests. Medium and large reviews stay fast without sacrificing expected behavior, like native find-in-page.</li>\n\n\n\n<li>\n<strong>Gracefully degrade with virtualization.</strong> Keep the experience usable for the largest pull requests. Prioritize responsiveness and stability by limiting what is rendered at any moment.</li>\n\n\n\n<li>\n<strong>Invest in foundational components and rendering improvements.</strong> These compound across every pull request size, regardless of which mode a user ends up in.</li>\n</ul>\n<p>With these strategies in mind, let\u2019s explore the specific steps we took to address these challenges and how our initial iterations set the stage for the improvements that followed.</p>\n\n\n\n<h2 class=\"wp-block-heading\">First steps: Optimizing diff lines</h2>\n\n\n\n<p>With our team\u2019s goal of improving pull request performance, we had three main objectives:</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Reduce memory and JavaScript heap size.</li>\n\n\n\n<li>Reduce the DOM node count.</li>\n\n\n\n<li>Reduce our average <a href=\"https://developer.mozilla.org/en-US/docs/Glossary/Interaction_to_next_paint\">INP</a> and significantly improve our p95 and p99 measurements</li>\n</ol>\n<p>To hit these goals, we focused on simplification: less state, fewer elements, less JavaScript, and fewer React components. Before we look at the results and new architecture, let\u2019s take a step back and look at where we started.</p>\n\n\n\n<h2 class=\"wp-block-heading\">What worked and what didn\u2019t with v1</h2>\n\n\n\n<p>In v1, each diff line was expensive to render. In unified view, a single line required roughly 10 DOM elements; in split view, closer to 15. That\u2019s before syntax highlighting, which adds many more <code>&lt;span&gt;</code> tags and drives the DOM count even higher.</p>\n\n\n\n<p>The following is a simplified visual of the React Component structure mixed with the DOM tree elements for v1 diffs.</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" width=\"960\" height=\"1340\" src=\"https://github.blog/wp-content/uploads/2026/04/3.png?resize=960%2C1340\" alt=\"V1 Diff Components and HTML. We had 8 react components for a single diff line. \n\" class=\"wp-image-95005\" srcset=\"https://github.blog/wp-content/uploads/2026/04/3.png?w=960 960w, https://github.blog/wp-content/uploads/2026/04/3.png?w=215 215w, https://github.blog/wp-content/uploads/2026/04/3.png?w=768 768w, https://github.blog/wp-content/uploads/2026/04/3.png?w=734 734w\" sizes=\"(max-width: 960px) 100vw, 960px\"></figure><p>At the React layer, unified diffs typically contain at least eight components per line, while the split view contain a minimum of 13. And these numbers represent baseline counts; extra UI states like comments, hover, and focus could add more components on top.</p>\n\n\n\n<p>This approach made sense to us in v1, when we first ported the diff lines to React from our classic Rails view. Our original plan centered around lots of small reusable React components and maintaining DOM tree structure.</p>\n\n\n\n<p>But we also ended up attaching a lot of <a href=\"https://react.dev/learn/responding-to-events\">React event handlers</a> in our small components, often five to six per component. On a small scale, that was fine, but on a large scale that compounded quickly. A single diff line could carry 20+ event handlers multiplied across thousands of lines.</p>\n\n\n\n<p>Beyond performance impact, it also increased complexity for developers. This is a familiar scenario where you implement an initial design, only to discover later its limitations when faced with the demands of unbounded data.</p>\n\n\n\n<p>To summarize, for every v1 diff line there would be:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Minimum of 10-15 DOM tree elements</li>\n\n\n\n<li>Minimum of 8-13 React Components</li>\n\n\n\n<li>Minimum of 20 React Event Handlers</li>\n\n\n\n<li>Lots of small re-usable React Components</li>\n</ul>\n<p>This v1 strategy proved unsustainable for our largest pull requests, as we consistently observed that larger pull request sizes directly led to slower INP and increased JavaScript heap usage. We needed to determine the best path for improving this setup.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Small changes make a large impact: v2</h2>\n\n\n\n<p>No change is too small when it comes to performance, especially at scale. For example, we removed unnecessary <code>&lt;code&gt;</code> tags from our line number cells. While dropping two DOM nodes per diff line might appear minor, across 10,000 lines, that\u2019s 20,000 fewer nodes in the DOM. These kinds of targeted, incremental optimizations, no matter how small, compound to create a much faster and more efficient experience. By not overlooking these details, we ensured that every opportunity for improvement was captured, amplifying the overall impact on our largest pull requests.</p>\n\n\n\n<p>Refer to the images below to see how v1 looks compared to v2.</p>\n\n\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"899\" src=\"https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.12.35-PM.png?resize=720%2C899\" alt=\"V1 HTML DOM structure. It is a typical HTML table structure with &lt;tr&gt; elements and &lt;td&gt; elements. \" class=\"wp-image-95029\" srcset=\"https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.12.35-PM.png?w=720 720w, https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.12.35-PM.png?w=240 240w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\"></figure><figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"704\" height=\"874\" src=\"https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.12.47-PM.png?resize=704%2C874\" alt=\"V2 HTML DOM structure. It is a typical HTML table structure with &lt;tr&gt; elements and &lt;td&gt; elements. The difference between V1 and V2 is the lack of &lt;code&gt; tags in the diff line number elements. \" class=\"wp-image-95030\" srcset=\"https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.12.47-PM.png?w=704 704w, https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.12.47-PM.png?w=242 242w\" sizes=\"auto, (max-width: 704px) 100vw, 704px\"></figure>\n</div>\n\n\n\n<p>This becomes clearer if we look at the component structure behind this HTML:</p>\n\n\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" height=\"1024\" width=\"681\" src=\"https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.13.00-PM.png?resize=681%2C1024\" alt=\"V1 Diff Components and HTML. We had 8 react components for a single diff line.\" class=\"wp-image-95027\" srcset=\"https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.13.00-PM.png?w=702 702w, https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.13.00-PM.png?w=199 199w, https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.13.00-PM.png?w=681 681w\" sizes=\"auto, (max-width: 681px) 100vw, 681px\"></figure><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" height=\"1024\" width=\"667\" src=\"https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.13.11-PM.png?resize=667%2C1024\" alt=\"V2 Diff Components and HTML. We had 3 react components for a single diff line.\" class=\"wp-image-95028\" srcset=\"https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.13.11-PM.png?w=689 689w, https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.13.11-PM.png?w=196 196w, https://github.blog/wp-content/uploads/2026/04/Screenshot-2026-04-02-at-4.13.11-PM.png?w=667 667w\" sizes=\"auto, (max-width: 667px) 100vw, 667px\"></figure>\n</div>\n\n\n\n<p>We went from eight components per diff line to two. Most of the v1 components were thin wrappers that let us share code between Split and Unified views. But that abstraction had a cost: each wrapper carried logic for both views, even though only one rendered at a time. In v2, we gave each view its own dedicated component. Some code is duplicated, but the result is simpler and faster.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Simplifying the component tree</h3>\n\n\n\n<p>For v2, we removed deeply nested component trees, opting for dedicated components for each split and unified diff line. While this led to some code duplication, it simplified data access and reduced complexity.</p>\n\n\n\n<p>Event handling is now managed by a single top-level handler using <code>data-attribute</code> values. So, for instance, when you click and drag to select multiple diff lines, the handler checks each event\u2019s <code>data-attribute</code> to determine which lines to highlight, instead of each line having its own mouse enter function. This approach streamlines both code and improves performance.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Moving complex state to conditionally rendered child components</h3>\n\n\n\n<p>The most impactful change from v1 to v2 was moving app state for commenting and context menus into their respective components. Given GitHub\u2019s scale, where some pull requests exceed thousands of lines of code, it isn\u2019t practical for every line to carry complex commenting state when only a small subset of lines will ever have comments or menus open. By moving the commenting state into the nested components for each diff line, we ensured that the diff-line component\u2019s main responsibility is just rendering code\u2014aligning more closely with the <a href=\"https://en.wikipedia.org/wiki/Single-responsibility_principle\">Single Responsibility Principle</a>.</p>\n\n\n\n<h3 class=\"wp-block-heading\">O(1) data access and less \u201cuseEffect\u201d hooks</h3>\n\n\n\n<p>In v1, we gradually accumulated a lot of O(n) lookups across shared data stores and component state. We also introduced extra re-rendering through <code>useEffect</code> hooks scattered throughout the diff-line component tree.</p>\n\n\n\n<p>To address this in v2, we adopted a two-part strategy. First, we restricted <code>useEffect</code> usage strictly to the top level of diff files. We also established <a href=\"https://eslint.org/docs/latest/rules/\">linting</a> rules to prevent the introduction of <code>useEffect</code> hooks in line-wrapping React components. This approach enables accurate memoization of diff line components and ensures reliable, predictable behavior.</p>\n\n\n\n<p>Next, we redesigned our global and diff state machines to utilize O(1) constant time lookups by employing <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map\">JavaScript Map</a>. This let us build fast, consistent selectors for common operations throughout our codebase, such as line selection and comment management. These changes have enhanced code quality, improved performance, and reduced complexity by maintaining flattened, mapped data structures.</p>\n\n\n\n<p>Now, any given diff line simply checks a map by passing the file path and the line number to determine whether or not there are comments on that line. An access might look like: <code>commentsMap[\u2018path/to/file.tsx\u2019][\u2018L8\u2019]</code></p>\n\n\n\n<h2 class=\"wp-block-heading\">Did it work?</h2>\n\n\n\n<p>Definitely. The page runs faster than it ever did, and JavaScript heap and INP numbers are massively reduced. For a numeric look, check out the results below. These metrics were evaluated on a pull request using a split diff setting with 10,000 line changes in the diff comparison.</p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\">\n<thead><tr>\n<th><strong>Metric</strong></th>\n<th><strong>v1</strong></th>\n<th><strong>v2</strong></th>\n<th>\n<strong>Improvement</strong>\u00a0</th>\n</tr></thead>\n<tbody>\n<tr>\n<td>Total\u00a0lines of\u00a0code\u00a0</td>\n<td>2,800</td>\n<td>2,000\u00a0</td>\n<td>27% less\u00a0</td>\n</tr>\n<tr>\n<td>Total\u00a0unique\u00a0component\u00a0types\u00a0</td>\n<td>19</td>\n<td>10\u00a0</td>\n<td>47% fewer\u00a0</td>\n</tr>\n<tr>\n<td>Total\u00a0components\u00a0rendered\u00a0</td>\n<td>~183,504</td>\n<td>~50,004\u00a0</td>\n<td>74% fewer\u00a0</td>\n</tr>\n<tr>\n<td>Total\u00a0DOM\u00a0nodes\u00a0</td>\n<td>~200,000</td>\n<td>~180,000\u00a0</td>\n<td>10% fewer\u00a0</td>\n</tr>\n<tr>\n<td>Total\u00a0memory\u00a0usage\u00a0</td>\n<td>~150-250 MB</td>\n<td>~80-120 MB\u00a0</td>\n<td>~50% less\u00a0</td>\n</tr>\n<tr>\n<td>INP on\u00a0a\u00a0large\u00a0pull request\u00a0using\u00a0m1\u00a0MacBook pro with 4x slowdown:\u00a0</td>\n<td>~450 ms</td>\n<td>~100 ms\u00a0</td>\n<td>~78%\u00a0faster\u00a0</td>\n</tr>\n</tbody>\n</table></figure><p>As you can see, this effort had a massive impact, but the improvements didn\u2019t end there.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Virtualization for our largest pull requests</h2>\n\n\n\n<p>When you\u2019re working with massive pull requests\u2014p95+ (those with over 10,000 diff lines and surrounding context lines)\u2014the usual performance tricks just don\u2019t cut it. Even the most efficient components will struggle if we try to render tens of thousands of them at once. That\u2019s where window virtualization steps in.</p>\n\n\n\n<p>In front-end development, <a href=\"https://www.patterns.dev/vanilla/virtual-lists/\">window virtualization</a> is a technique that keeps only the visible portion of a large list or dataset in the DOM at any given time. Instead of loading everything (which would crush memory and slow things to a crawl), it dynamically renders just what you see on screen, and swaps in new elements as you scroll. This approach is like having a moving \u201cwindow\u201d over your data, so your browser isn\u2019t bogged down by off-screen content.</p>\n\n\n\n<p>To make this happen, we integrated <a href=\"https://tanstack.com/virtual/latest\">TanStack</a> Virtual into our diff view, ensuring that only the visible portion of the diff list is present in the DOM at any time. The impact was huge: we saw a 10X reduction in JavaScript heap usage and DOM nodes for p95+ pull requests. INP fell from 275\u2013700+ milliseconds (ms) to just 40\u201380 ms for those big pull requests. By only showing what\u2019s needed, the experience is much faster.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Further performance optimizations</h2>\n\n\n\n<p>To push performance even further, we tackled several major areas across our stack, each delivering meaningful wins for speed and responsiveness. By focusing on trimming unnecessary React re-renders and honing our state management, we cut down wasted computation, making UI updates noticeably faster and interactions smoother.</p>\n\n\n\n<p>On the styling front, we swapped out heavy CSS selectors (e.g. <code>:has(...)</code>) and re-engineered drag and resize handling with GPU transforms, eliminating forced layouts and sluggishness and giving users a crisp, efficient interface for complex actions.</p>\n\n\n\n<p>We also stepped up our monitoring game with interaction-level INP tracking, diff-size segmentation, and memory tagging, all surfaced in a Datadog dashboard. This continues to give our developers real-time, actionable metrics to spot and squash bottlenecks before they become issues.</p>\n\n\n\n<p>On the server side, we optimized rendering to hydrate only visible diff lines. This slashed our time-to-interactive and keeps memory usage in check, ensuring that even huge pull requests feel fast and responsive on load.</p>\n\n\n\n<p>Finally, with progressive diff loading and smart background fetches, users are now able to see and interact with content sooner. No more waiting for a massive number of diffs to finish loading.</p>\n\n\n\n<p>All together, these targeted optimizations made our UI feel lighter, faster, and ready for anything our users throw at it.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Diff-initely better: The power of streamlined performance</h2>\n\n\n\n<p>This exciting journey to streamline the diff line architecture yielded substantial improvements in performance, efficiency and maintainability. By reducing unnecessary DOM nodes, simplifying our React component tree, and relocating complex state to conditionally rendered child components, we achieved faster rendering times and lower memory consumption. The adoption of more O(1) data access patterns and stricter rules for state management further optimized performance. This made our UI more responsive (faster INP!) and easier to reason with.</p>\n\n\n\n<p>These measurable gains demonstrate that targeted refactoring, even within our large and mature codebase, can deliver meaningful benefits to all users\u2014and that sometimes focusing on small, simple improvements can have the largest impact. To see the performance gains in action, go check out your <a href=\"http://github.com/pulls\">open pull requests</a>.</p>\n\n<p>The post <a href=\"https://github.blog/engineering/architecture-optimization/the-uphill-climb-of-making-diff-lines-performant/\">The uphill climb of making diff lines performant</a> appeared first on <a href=\"https://github.blog/\">The GitHub Blog</a>.</p>\n","enclosure":{},"categories":["Architecture &amp; optimization","Engineering","diffs","performance engineering","pull requests"]}]}