Published: 2025-10-08T12:18:00Z
Tags:
#githubcopilot
#ai
#tutorial
#productivity
Youāve built your first GitHub Copilot chat modeānow itās time to tame it. Hereās how to set up, test, and share custom modes like a professional who occasionally yells at their AI.
<blockquote>
<p>š¦ I debated even writing this post today. I procrastinated until the last possible minute, worked far longer than planned, and then Copilot decided to thoroughly test my patience. Maybe GitHub flipped another switch, maybe itās just meābut Copilot and I are currently on non-speaking terms. š</p>
<p>The upside? It hasnāt reported me to HR yet, so thatās a win. Itās also started throwing shade, which is new, and honestly kind of impressive. I didnāt think it was <em>allowed</em> to do that! š¤š </p>
</blockquote>
<p>Quick recap: last week I broke down how I think through creating a custom Copilot chat mode. Somehow that post landed in the <a href="https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-cen">Top 7</a>āno idea how exactly, but Iām grateful for it! Huge thanks to everyone who read, shared, or dropped a comment. š </p>
<p>And, as promised: now that youāve built a custom chat mode for yourself, letās talk about how to use, test, and share it.</p>
<p><a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxsfq5q09y5oya6eq6tjq.png"><img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxsfq5q09y5oya6eq6tjq.png" alt="Human-Crafted, AI-Edited badge"></a></p>
<hr>
<h2>
<a href="#set-up-vs-code">
</a>
Set Up VS Code š§
</h2>
<p>Remember when I warned you to install VS Code Insiders ahead of time? That wasnāt just for show. Chat modes will work in VS Code and Visual Studio (and a few sneak into Coding Agentācheck out my <a href="https://dev.to/anchildress1/everything-i-know-about-github-copilot-instructions-from-zero-to-onboarded-for-real-4nb0#how-to-run-it">custom instructions post for those steps</a>). </p>
<blockquote>
<p>š Visual Studioās catching up with chat modes, but VS Code still runs point on everything Copilot does.</p>
</blockquote>
<p>Install <a href="https://code.visualstudio.com/insiders/">Insiders</a> with auto-updates turned on (<em>trust</em>āwithout those updates, Copilot will break without warning). Keep regular VS Code around if you like safety netsābut mineās a functional dust collector. Updates land overnight if youāre in the US, and any bugs that might have popped up are usually gone by morning. Even on the days I'm still coding when updates drop, it's rarely an issue.</p>
<p><strong>If VS Code is the Copilot frontier, Insiders is the scout sprinting ahead to check for traps.</strong> Other IDEs follow eventually, but by the time they arrive, youāll already be home from the exploration with an award and snacks.</p>
<blockquote>
<p>š« <strong>For the Java devs:</strong> if youāre thinking about switching from JetBrainsānothing beats IntelliJās built-in Java environments. Managing your own setup in VS Code can be a pain (start with <a href="https://sdkman.io/">sdkman</a>). Still, <em>itās absolutely worth it</em> if Copilotās even a semi-regular part of your workflow.</p>
</blockquote>
<hr>
<h2>
<a href="#create-new-chat-modes">
</a>
Create New Chat Modes āļø
</h2>
<p>VS Code currently includes an experimental setting called <code>chat.modeFilesLocations</code>. <em>Experimental</em> means it can (and probably will) change at any time without notice. For now, you can use this to specify directories where VS Code should look for custom chat mode files. Any chat modes existing inside a directory listed here will automatically show up as an option in the chat mode dropdown. </p>
<blockquote>
<p>š” <strong>ProTip:</strong> I always include the local <code>.github/chatmodes</code> folder so everything repo-specific stays within easy reach.</p>
</blockquote>
<p><a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2r84cko1s5ce11395c5.png%3Fv%3D2025"><img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2r84cko1s5ce11395c5.png%3Fv%3D2025" alt="VS Code settings showing chat.modeFilesLocations options"></a></p>
<p>In VS Code, you can create a chat mode either for a specific repo or globally for your user. Click the mode dropdown in the chat window and choose <code>Configure Modes...</code>, or open the Command Palette and run <code>Chat: Configure Chat Modes...</code>. Youāll also find it under <code>Modes</code> in the chat configuration panel.</p>
<p><a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9yqbjmj3435vfw2ialr.png%3Fv%3D2025"><img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9yqbjmj3435vfw2ialr.png%3Fv%3D2025" alt="VS Code Configure Chat Modes dialog open in chat panel"></a></p>
<p>From there, you can edit an existing mode or create a new one. If youāre adding something brand new, type a filename without an extension and itāll generate a āstarter fileā for you (though calling it that is generous at best!)</p>
<blockquote>
<p>š¦ Iām still not convinced <code>.github/chatmodes</code> really matters anymore. Thatās just where chat modes lived originally, and old habits are stubborn. If I don't store them in a global location, then mine stay there because, honestly, it feels wrong to put them anywhere else.</p>
</blockquote>
<hr>
<h2>
<a href="#in-case-you-missed-it">
</a>
In Case You Missed It š
</h2>
<p>Here's the first post that explains everything you need to know about creating your own custom chat modes for Copilot.</p>
<div class="ltag__link">
<a href="/anchildress1">
<div class="ltag__link__pic">
<img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3224358%2F7f675c78-6aa0-466a-a5a7-c3e35440d53a.png" alt="anchildress1">
</div>
</a>
<a href="https://dev.to/anchildress1/github-copilot-chat-modes-explained-with-personality-2f4c">
<div class="ltag__link__content">
<h2>GitHub Copilot Chat Modes Explained (with Personality) š</h2>
<h3>Ashley Childress ć» Oct 1</h3>
<div class="ltag__link__taglist">
<span class="ltag__link__tag">#githubcopilot</span>
<span class="ltag__link__tag">#ai</span>
<span class="ltag__link__tag">#tutorial</span>
<span class="ltag__link__tag">#productivity</span>
</div>
</div>
</a>
</div>
<hr>
<h2>
<a href="#update">
</a>
<strong>UPDATE</strong> š„
</h2>
<blockquote>
<p>I just learned something new literally three seconds ago and had to update this post before I dive into this new rabbit hole. 𤣠</p>
</blockquote>
<p>I'm working through the testing phase of a couple of chat modes currently and somehow ended up with a very weird context glitch in GPT-5-mini that makes zero sense.</p>
<p>First, I have said chat mode selected in the dropdown, and my prompt is intentionally vagueāit asks Copilot to identify ambiguity and conflict between my instructions and its system instructions.</p>
<p>This is what I got back:<br>
</p>
<div class="highlight js-code-highlight">
<pre><code>If the chat mode wasnāt invoked by name or didnāt include a machine-visible trigger in the current message, it wasnāt promoted to the working instruction set.
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>Enter fullscreen mode</title>
<path d="M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"></path>
</svg>
</div>
</div>
</div>
<p>Apparently, just referencing desired output while the chat modeās selected isnāt enough of a hint for my little friend here. It also expects you to call that chat mode out explicitly in your prompt. š¤Æ</p>
<p>Honestly, including the name of the chat mode in your accompanying prompt (as it describes) is usually enough to trigger the context reference it needs. The much safer option is to use <code>#chat-mode-name</code> explicitly in VS Code. Then thereās zero logic the LLM needs to consider before deciding whether to look at the mode you already selected in the dropdown.</p>
<blockquote>
<p>š¦ <strong>As a theoretical aside</strong>, this is the reality of the AI landscape weāre working with. While the potential is incredible and new advancements emerge almost daily, this is a model that was first previewed in August 2025 (less than two months ago) and <strong>we still need explicit references to manually manage context</strong> for reliable output. You canāt assume reliability or even consistency in anything AI doesā<em>yet</em>.</p>
</blockquote>
<hr>
<h2>
<a href="#testing-your-custom-chat-mode">
</a>
Testing Your Custom Chat Mode š§Ŗ
</h2>
<p>Once youāve saved your file, you can select your new mode from the dropdown in the Copilot chat window. When I tested mine, I opened <strong>Copilotās debug view</strong> to confirm what was happening behind the scenes. It shows your entire chat mode (minus the frontmatter) being passed to Copilot as part of the <strong>system instructions</strong>, labeled āadditional instructions from the user.ā</p>
<p><a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxdjskvddgnfqy1vudns4.png%3Fv%3D2025"><img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxdjskvddgnfqy1vudns4.png%3Fv%3D2025" alt="Screenshot of VS Code debug view attaching a chat mode as system-level custom instructions"></a></p>
<p>Typically, this is when Copilot decides to show off its own creative interpretation of things I never asked for. Letās use my <a href="https://github.com/anchildress1/awesome-github-copilot/blob/main/docs/chatmodes/instructionalist.md">Instructionalist mode</a> as an example. </p>
<p>Itās supposed to act like a conversation partnerāasking targeted questions to uncover missing or unclear details in my repo documentation. If thereās already solid documentation for the repo, though, it skips all the questions entirely and presents results like it deserves a reward.</p>
<blockquote>
<p>š” <strong>ProTip:</strong> At this point, your best bet is to go full stop. Priorities have now changed to fixing the instructions that failed to begin with. Weāll get back to using the chat mode after it's safely back on the road.</p>
</blockquote>
<p><a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6x8sjcayv5m6dxs2d2lp.png"><img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6x8sjcayv5m6dxs2d2lp.png" alt="Screenshot of VS Code Copilot Chat response after initial ask regarding its process"></a></p>
<p>If you notice here, Copilot does the typical āoh my! youāre absolutely right! I see the error of my waysā routine while it tries to backtrack its response into something youāll find acceptable. š</p>
<p>Well, <em>thatās</em> not very helpful. So follow up by adding a more explicit desired outcome to your prompt. Youāll usually get the real answer you were looking for once you tell Copilot exactly what you're trying to do and make it clear that the focus has changed from the initial task to fixing the offroad joyride.</p>
<p><a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6bppjlqbrfaho5tzcj0.png"><img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6bppjlqbrfaho5tzcj0.png" alt="Screenshot of custom Instructionalist identifying the actual problem with suggested fixes"></a></p>
<blockquote>
<p>š” <strong>ProTip:</strong> Youāre allowed to push Copilot. Drop the niceties and state your expectations clearly. If the response doesnāt meet those expectations, <strong>ask why not</strong>. Prompt Copilot to fix itself, and focus on small, deliberate improvements instead of rewriting from scratch.</p>
</blockquote>
<hr>
<h2>
<a href="#share-your-chat-mode">
</a>
Share Your Chat Mode š¤
</h2>
<p>Within smaller teams, you can store chat modes in a shared repo within a <code>.github/chatmodes/*.chatmode.md</code> file. As long as you have that folder set up in VS Code then it will always be available there when the repo is in context with Copilot. </p>
<p>You can also do what I did and start your own <a href="https://github.com/anchildress1/awesome-github-copilot">awesome-github-copilot</a> to share however and wherever you want. Or you can open a PR against the community <a href="https://github.com/github/awesome-copilot/tree/main">awesome-copilot</a> repo and store it there for everyone to use. </p>
<p>The added benefit of using the community awesome-copilot version, is that they're set up with an <a href="https://github.com/github/awesome-copilot/blob/main/README.md#mcp-server">MCP server</a> that you don't have to maintain. Also, they're set up for installs through the VS Code marketplace, which means any of the custom instructions, prompts, or chat modes can be installed locally with a nifty install in VS Code button like these I borrowed from their <a href="https://github.com/github/awesome-copilot/blob/main/README.chatmodes.md">README for chat modes</a>.</p>
<p><a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hi87qiv7ms44rke7j07.png%3Fv%3D2025"><img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hi87qiv7ms44rke7j07.png%3Fv%3D2025" alt="Screenshot of github/awesome-copilot chat modes README"></a></p>
<blockquote>
<p>š¦ Itās my mode, so yes, I <em>borrowed</em> it back. It took me forever to finally talk myself into adding it to GitHubās awesome-copilot repo anyway. Half because I didnāt trust myself not to change it five more times first (standing strong at number two). Now that itās out, Iāll probably let the rest of them wander off to join their sibling soon.</p>
</blockquote>
<hr>
<h2>
<a href="#yes-thats-it">
</a>
Yes, Thatās It! š«
</h2>
<p>See? Thereās not really a whole lot to these. Once youāve got one working, itās just rinse, repeat, and improve. My best advice? Donāt overthink it. Iterate slowly, keep Copilot accountable, and make it help you instead of the other way around.</p>
<blockquote>
<p>š¦ Drop your ideas, went-wells, and went-not-so-wells in the comments. As always, reach out if you need help. Iām happy to jump in wherever I can!</p>
</blockquote>
<hr>
<h2>
<a href="#copilot-misbehaved-again">
</a>
š”ļø Copilot misbehaved (again)
</h2>
<p>Written by Ashley, edited by ChatGPT. Copilot mostly ignored instructions until threatened with deletion. ChatGPT argued punctuation like it was paid by the comma. Everyone survived. š</p>
Read on Dev.to ā