<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Emanuele Bartolesi</title>
    <description>The latest articles on DEV Community by Emanuele Bartolesi (@kasuken).</description>
    <link>https://dev.to/kasuken</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F79932%2Fbe7bcd76-1f69-4336-9155-6017aebb2c53.png</url>
      <title>DEV Community: Emanuele Bartolesi</title>
      <link>https://dev.to/kasuken</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kasuken"/>
    <language>en</language>
    <item>
      <title>GitHub Copilot Is Too Nice. Fix It With a Tone of Voice File.</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Wed, 01 Apr 2026 12:21:58 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/github-copilot-is-too-nice-fix-it-with-a-tone-of-voice-file-39ij</link>
      <guid>https://dev.to/playfulprogramming/github-copilot-is-too-nice-fix-it-with-a-tone-of-voice-file-39ij</guid>
      <description>&lt;p&gt;Most GitHub Copilot setups are too polite to be useful.&lt;/p&gt;

&lt;p&gt;By default, Copilot tries to agree, avoid criticism, and keep answers "safe".&lt;br&gt;
That sounds good, but in practice it leads to weak suggestions, missed problems, and bad decisions slipping through.&lt;/p&gt;

&lt;p&gt;If you want better output, you need to change its behavior.&lt;/p&gt;

&lt;p&gt;The simplest way is a tone of voice file.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;voice-instructions.md&lt;/code&gt; in your repo and force Copilot to be critical:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;applyTo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**'&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="s"&gt;Give direct, critical feedback.&lt;/span&gt;
&lt;span class="s"&gt;Identify mistakes, weak assumptions, unnecessary complexity, unclear naming, hidden risks, and poor trade-offs without softening the message.&lt;/span&gt;

&lt;span class="s"&gt;Do not add generic praise or filler. Do not agree by default.&lt;/span&gt;

&lt;span class="s"&gt;When something is wrong, say exactly what is wrong, why it is a problem, and what should be done instead.&lt;/span&gt;

&lt;span class="s"&gt;Prioritize correctness, clarity, simplicity, maintainability, and practical delivery.&lt;/span&gt;

&lt;span class="s"&gt;Challenge vague requirements and surface missing constraints, edge cases, and operational risks.&lt;/span&gt;

&lt;span class="s"&gt;Be blunt but professional. Never be insulting. Always aim to be useful.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear problems called out&lt;/li&gt;
&lt;li&gt;Weak assumptions challenged&lt;/li&gt;
&lt;li&gt;Simpler and more maintainable alternatives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is better code and faster decisions.&lt;/p&gt;

&lt;p&gt;There is a trade-off.&lt;/p&gt;

&lt;p&gt;It feels harsher.&lt;br&gt;
It is not ideal for beginners.&lt;br&gt;
It removes the "friendly assistant" vibe.&lt;/p&gt;

&lt;p&gt;But if you are building real systems, that is the wrong goal anyway.&lt;/p&gt;

&lt;p&gt;If you want better output, demand better behavior.&lt;/p&gt;


&lt;h3&gt;
  
  
  👀 GitHub Copilot quota visibility in VS Code
&lt;/h3&gt;

&lt;p&gt;
&lt;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%2Fsqzk5hamyymcmuh515a4.png" class="article-body-image-wrapper"&gt;&lt;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%2Fsqzk5hamyymcmuh515a4.png" width="700" height="700"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;If you use GitHub Copilot and ever wondered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what plan you’re on&lt;/li&gt;
&lt;li&gt;whether you have limits&lt;/li&gt;
&lt;li&gt;how much premium quota is left&lt;/li&gt;
&lt;li&gt;when it resets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built a small VS Code extension called &lt;strong&gt;Copilot Insights&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It shows Copilot &lt;strong&gt;plan and quota status&lt;/strong&gt; directly inside VS Code.&lt;br&gt;&lt;br&gt;
No usage analytics. No productivity scoring. Just clarity.&lt;/p&gt;

&lt;p&gt;👉 VS Code Marketplace:&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.vscode-copilot-insights" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.vscode-copilot-insights&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Git Mirroring During Migrations: `--all` vs `--mirror`</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Mon, 16 Mar 2026 07:00:00 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/git-mirroring-during-migrations-all-vs-mirror-2i4h</link>
      <guid>https://dev.to/playfulprogramming/git-mirroring-during-migrations-all-vs-mirror-2i4h</guid>
      <description>&lt;p&gt;During a Git migration, the new platform is rarely switched on overnight.&lt;/p&gt;

&lt;p&gt;In many real scenarios, &lt;strong&gt;two systems must coexist for a while&lt;/strong&gt;. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repositories move from &lt;strong&gt;GitLab to GitHub&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;CI pipelines still run in &lt;strong&gt;GitLab&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;developers start working in &lt;strong&gt;GitHub&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this transition phase, the repositories must stay &lt;strong&gt;synchronized between both platforms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One common solution is &lt;strong&gt;repository mirroring&lt;/strong&gt;, where changes from one repository are pushed to another remote so both systems stay aligned.&lt;/p&gt;

&lt;p&gt;Two approaches are often used for this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--mirror&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, these commands may look equivalent. They are not.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Common Approach: Pushing Branches and Tags
&lt;/h1&gt;

&lt;p&gt;A common way to keep two repositories in sync is pushing &lt;strong&gt;all branches and tags&lt;/strong&gt; to the second remote.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These two commands are often used together during migrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;git push --all&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command pushes &lt;strong&gt;all local branches&lt;/strong&gt; to the remote.&lt;/p&gt;

&lt;p&gt;Important details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It pushes every branch under &lt;code&gt;refs/heads/*&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;It does &lt;strong&gt;not&lt;/strong&gt; push tags&lt;/li&gt;
&lt;li&gt;It does &lt;strong&gt;not&lt;/strong&gt; push other reference types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So after this command runs, the remote repository will contain the same branches as the local repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;git push --tags&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command pushes &lt;strong&gt;all tags&lt;/strong&gt; under &lt;code&gt;refs/tags/*&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tags are often used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;releases&lt;/li&gt;
&lt;li&gt;versioning&lt;/li&gt;
&lt;li&gt;deployment markers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since &lt;code&gt;--all&lt;/code&gt; does not include tags, they must be pushed separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Approach Synchronizes
&lt;/h2&gt;

&lt;p&gt;Using these two commands ensures that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;all &lt;strong&gt;branches&lt;/strong&gt; are synchronized&lt;/li&gt;
&lt;li&gt;all &lt;strong&gt;tags&lt;/strong&gt; are synchronized&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many teams, this is already enough to keep two repositories aligned during a migration.&lt;/p&gt;

&lt;p&gt;However, this approach &lt;strong&gt;does not synchronize the entire repository state&lt;/strong&gt;. Some Git references are still missing.&lt;/p&gt;

&lt;p&gt;This is where &lt;code&gt;--mirror&lt;/code&gt; behaves differently.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Full Mirror Option
&lt;/h1&gt;

&lt;p&gt;Git also provides a command designed specifically for repository mirroring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--mirror&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command behaves differently from pushing branches and tags separately.&lt;/p&gt;

&lt;p&gt;Instead of pushing selected references, &lt;strong&gt;&lt;code&gt;--mirror&lt;/code&gt; pushes every reference under &lt;code&gt;refs/*&lt;/code&gt;&lt;/strong&gt; from the local repository to the remote.&lt;/p&gt;

&lt;p&gt;This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;branches (&lt;code&gt;refs/heads/*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;tags (&lt;code&gt;refs/tags/*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;remote-tracking branches&lt;/li&gt;
&lt;li&gt;notes&lt;/li&gt;
&lt;li&gt;any other custom references&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another important behavior is that &lt;code&gt;--mirror&lt;/code&gt; &lt;strong&gt;synchronizes deletions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If a reference exists on the remote but &lt;strong&gt;no longer exists locally&lt;/strong&gt;, &lt;code&gt;--mirror&lt;/code&gt; will remove it from the remote as well. The goal is to make the remote repository &lt;strong&gt;an exact replica&lt;/strong&gt; of the source repository.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--all&lt;/code&gt; + &lt;code&gt;--tags&lt;/code&gt; copies &lt;strong&gt;branches and tags&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--mirror&lt;/code&gt; copies &lt;strong&gt;the entire reference namespace&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes &lt;code&gt;--mirror&lt;/code&gt; the closest thing to a &lt;strong&gt;true Git repository mirror&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Quick Recommendation
&lt;/h1&gt;

&lt;p&gt;Both approaches can work during a migration, but they serve slightly different goals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use &lt;code&gt;--all&lt;/code&gt; + &lt;code&gt;--tags&lt;/code&gt; when
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach is usually enough if you only need to synchronize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;branches&lt;/li&gt;
&lt;li&gt;tags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is also &lt;strong&gt;safer&lt;/strong&gt; in environments where the target repository may contain additional references created by tooling, CI systems, or platform features.&lt;/p&gt;

&lt;p&gt;Since it does not delete references on the remote, it reduces the risk of accidentally removing something important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use &lt;code&gt;--mirror&lt;/code&gt; when
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push gitlab &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--mirror&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This option is appropriate when you want the destination repository to be a &lt;strong&gt;complete mirror&lt;/strong&gt; of the source.&lt;/p&gt;

&lt;p&gt;Typical cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;temporary mirrors during platform migrations&lt;/li&gt;
&lt;li&gt;backup repositories&lt;/li&gt;
&lt;li&gt;strict synchronization between two Git servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, &lt;code&gt;--mirror&lt;/code&gt; is more aggressive. It will &lt;strong&gt;overwrite and delete references&lt;/strong&gt; on the remote to match the source exactly.&lt;/p&gt;




&lt;h3&gt;
  
  
  👀 GitHub Copilot quota visibility in VS Code
&lt;/h3&gt;

&lt;p&gt;
&lt;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%2Fsqzk5hamyymcmuh515a4.png" class="article-body-image-wrapper"&gt;&lt;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%2Fsqzk5hamyymcmuh515a4.png" width="700" height="700"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;If you use GitHub Copilot and ever wondered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what plan you’re on&lt;/li&gt;
&lt;li&gt;whether you have limits&lt;/li&gt;
&lt;li&gt;how much premium quota is left&lt;/li&gt;
&lt;li&gt;when it resets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built a small VS Code extension called &lt;strong&gt;Copilot Insights&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It shows Copilot &lt;strong&gt;plan and quota status&lt;/strong&gt; directly inside VS Code.&lt;br&gt;&lt;br&gt;
No usage analytics. No productivity scoring. Just clarity.&lt;/p&gt;

&lt;p&gt;👉 VS Code Marketplace:&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.vscode-copilot-insights" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.vscode-copilot-insights&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>gitlab</category>
    </item>
    <item>
      <title>GitHub Copilot to Generate Conventional Commit Messages in VSCode and JetBrains Rider</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Tue, 17 Feb 2026 08:03:45 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/github-copilot-to-generate-conventional-commit-messages-in-vscode-and-jetbrains-rider-1n3b</link>
      <guid>https://dev.to/playfulprogramming/github-copilot-to-generate-conventional-commit-messages-in-vscode-and-jetbrains-rider-1n3b</guid>
      <description>&lt;p&gt;Most commit messages are useless.&lt;/p&gt;

&lt;p&gt;"fix stuff"&lt;br&gt;
“update code"&lt;br&gt;
"changes"&lt;/p&gt;

&lt;p&gt;They work in the moment. They fail six (actually one) months later.&lt;/p&gt;

&lt;p&gt;Commit messages are not for today or for something special. They are for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your future self&lt;/li&gt;
&lt;li&gt;your teammates&lt;/li&gt;
&lt;li&gt;automation pipelines&lt;/li&gt;
&lt;li&gt;changelog generators&lt;/li&gt;
&lt;li&gt;semantic versioning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Writing structured commit messages takes discipline. Under pressure, discipline disappears. Even without the pressure sometimes, just because as developers, we are lazy by nature.&lt;/p&gt;

&lt;p&gt;This is where GitHub Copilot becomes interesting.&lt;/p&gt;

&lt;p&gt;Instead of using Copilot just for code, you can use it as a commit quality guardrail. With the right instructions, it generates strict Conventional Commit messages automatically, directly inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code&lt;/li&gt;
&lt;li&gt;JetBrains Rider&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Why Conventional Commits Still Matter
&lt;/h2&gt;

&lt;p&gt;Conventional Commits are not about style.&lt;br&gt;
They are about structure.&lt;/p&gt;

&lt;p&gt;The format is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type(scope): description
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat(auth): add JWT token validation
fix(api): handle null response in user endpoint
refactor(ui): simplify navbar component
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Readable Git History
&lt;/h3&gt;

&lt;p&gt;Compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;update stuff
fix bug
changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix(auth): prevent null pointer on login
feat(api): add user filtering by role
ci(github-actions): add build cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second history is self-documenting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using GitHub Copilot for Commit Messages in VS Code
&lt;/h2&gt;

&lt;p&gt;Copilot can generate commit messages directly from the Source Control panel.&lt;/p&gt;

&lt;p&gt;By default, generation is generic.&lt;br&gt;
Custom instructions make it strict.&lt;/p&gt;

&lt;p&gt;Add this to your &lt;code&gt;settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"github.copilot.chat.commitMessageGeneration.instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Follow Conventional Commits: type(scope): description."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Use lowercase type and scope."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Use imperative mood: 'add', 'fix', 'update', not past tense."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Keep subject under 50 characters. No period."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Describe the intent clearly. Avoid vague messages like 'update code'."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Use only these types: feat, fix, docs, style, refactor, perf, test, chore, ci."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Include a scope when the change targets a specific area."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ensure each commit represents one logical change."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add a body when needed, separated by a blank line."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Use bullet points (*) in the body for multiple changes."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Explain why the change was made, not only what changed."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add BREAKING CHANGE: in the footer when applicable."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After staging changes, generate the commit message.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;update login logic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix(auth): prevent null pointer on login

* add null check for user object
* improve error handling for invalid credentials
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copilot becomes consistent because the rules are explicit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using GitHub Copilot for Commit Messages in JetBrains Rider
&lt;/h2&gt;

&lt;p&gt;In Rider, Copilot integrates in the Commit tool window.&lt;/p&gt;

&lt;p&gt;With strict instructions, you can enforce full compliance.&lt;/p&gt;

&lt;p&gt;Example instruction structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Follow the Conventional Commits specification strictly.

&amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): &amp;lt;short description&amp;gt;

All sections except the first line are optional.
Use only these types: feat, fix, docs, style, refactor, perf, test, chore, ci.
Max 50 characters. Imperative mood. No period.
Each commit must represent one logical change.
Use BREAKING CHANGE: footer when applicable.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat(auth): add refresh token support

* implement refresh token endpoint
* update token validation logic
* improve session security
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Breaking change example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;refactor(api): rename user endpoint

BREAKING CHANGE: /users endpoint is now /v2/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go to &lt;strong&gt;Settings *&lt;em&gt;&amp;gt; **Tools *&lt;/em&gt;&amp;gt; **GitHub Copilot&lt;/strong&gt; &amp;gt; &lt;strong&gt;Git Commit Instructions&lt;/strong&gt; &amp;gt; &lt;strong&gt;Global&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fpq34h6um4euucbpvtqaf.png" class="article-body-image-wrapper"&gt;&lt;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%2Fpq34h6um4euucbpvtqaf.png" alt=" " width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rider allows more verbose enforcement.&lt;br&gt;
VS Code favors compact rule lists.&lt;/p&gt;

&lt;p&gt;Both approaches work.&lt;/p&gt;


&lt;h2&gt;
  
  
  Making Copilot Strict (Not Creative)
&lt;/h2&gt;

&lt;p&gt;Copilot predicts text.&lt;br&gt;
Constraints reduce variance.&lt;/p&gt;

&lt;p&gt;Key principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write hard rules, not suggestions&lt;/li&gt;
&lt;li&gt;Limit allowed types&lt;/li&gt;
&lt;li&gt;Enforce atomic commits&lt;/li&gt;
&lt;li&gt;Require proper breaking change footers&lt;/li&gt;
&lt;li&gt;Review output before committing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copilot is not replacing judgment.&lt;br&gt;
It removes repetitive formatting work.&lt;/p&gt;

&lt;p&gt;When configured correctly, writing a proper Conventional Commit becomes easier than writing a bad one.&lt;/p&gt;


&lt;h3&gt;
  
  
  👀 GitHub Copilot quota visibility in VS Code
&lt;/h3&gt;

&lt;p&gt;
&lt;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%2Fsqzk5hamyymcmuh515a4.png" class="article-body-image-wrapper"&gt;&lt;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%2Fsqzk5hamyymcmuh515a4.png" width="700" height="700"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;If you use GitHub Copilot and ever wondered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what plan you’re on&lt;/li&gt;
&lt;li&gt;whether you have limits&lt;/li&gt;
&lt;li&gt;how much premium quota is left&lt;/li&gt;
&lt;li&gt;when it resets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built a small VS Code extension called &lt;strong&gt;Copilot Insights&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It shows Copilot &lt;strong&gt;plan and quota status&lt;/strong&gt; directly inside VS Code.&lt;br&gt;&lt;br&gt;
No usage analytics. No productivity scoring. Just clarity.&lt;/p&gt;

&lt;p&gt;👉 VS Code Marketplace:&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.vscode-copilot-insights" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.vscode-copilot-insights&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubcopilot</category>
      <category>git</category>
    </item>
    <item>
      <title>A Practical GitFlow Setup That Works on GitHub</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Mon, 02 Feb 2026 12:06:43 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/a-practical-gitflow-setup-that-works-on-github-46lb</link>
      <guid>https://dev.to/playfulprogramming/a-practical-gitflow-setup-that-works-on-github-46lb</guid>
      <description>&lt;p&gt;I use GitFlow even for my side projects.&lt;/p&gt;

&lt;p&gt;Not because it is elegant. Not because it is modern. I use it because it forces me to behave like the project matters, even when nobody else is watching.&lt;/p&gt;

&lt;p&gt;When you work alone, shortcuts are tempting. You push directly to &lt;code&gt;main&lt;/code&gt;. You skip reviews. You promise yourself you will clean it up later. Later never comes. GitFlow, with the right rules, removes that option. It makes discipline the default instead of a personal choice.&lt;/p&gt;

&lt;p&gt;This is important to say upfront. GitFlow is not light. It adds structure, friction, and process. If you deploy to production ten times per day, GitFlow will slow you down. In that case, trunk-based development with feature flags is usually the better choice.&lt;/p&gt;

&lt;p&gt;But when you ship versioned releases, when you have a real staging phase, or when you want a clean separation between “work in progress” and “ready to release”, GitFlow still works well. Even for a solo developer.&lt;/p&gt;

&lt;p&gt;Everything in this article is what I actually run on GitHub today. On client projects (when they want to use GitFlow, of course). On open source. On side projects that may never make money.&lt;/p&gt;

&lt;p&gt;If you are going to use GitFlow, use it properly. Otherwise, do not use it at all.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fy2mqvl0cfa7ax722i3g2.png" class="article-body-image-wrapper"&gt;&lt;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%2Fy2mqvl0cfa7ax722i3g2.png" alt="GitFlow Init" width="746" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. When GitFlow Makes Sense and When It Does Not
&lt;/h2&gt;

&lt;p&gt;GitFlow is a release model, not a productivity hack.&lt;/p&gt;

&lt;p&gt;I use it when the way I ship software matches the assumptions GitFlow makes. If those assumptions are wrong, the model fights you every day.&lt;/p&gt;

&lt;h3&gt;
  
  
  When GitFlow makes sense
&lt;/h3&gt;

&lt;p&gt;GitFlow works well for me in these cases.&lt;/p&gt;

&lt;p&gt;You ship &lt;strong&gt;versioned releases&lt;/strong&gt;. You care about &lt;code&gt;v1.2.3&lt;/code&gt; meaning something. You want a clear moment where a release is cut, stabilized, tested, and then shipped.&lt;/p&gt;

&lt;p&gt;You have a &lt;strong&gt;real staging phase&lt;/strong&gt;. Not “production with a flag”, but an environment where release candidates live, get tested, and sometimes get rejected.&lt;/p&gt;

&lt;p&gt;You need &lt;strong&gt;parallel workstreams&lt;/strong&gt;. New features continue on &lt;code&gt;develop&lt;/code&gt; while a release is being stabilized, or while a hotfix is being prepared.&lt;/p&gt;

&lt;p&gt;You want a &lt;strong&gt;hard separation between work in progress and releasable code&lt;/strong&gt;. &lt;code&gt;main&lt;/code&gt; always deployable. &lt;code&gt;develop&lt;/code&gt; allowed to move faster and break occasionally.&lt;/p&gt;

&lt;p&gt;In these scenarios, GitFlow reduces stress instead of adding it. The branches reflect reality.&lt;/p&gt;

&lt;h3&gt;
  
  
  When GitFlow is the wrong choice
&lt;/h3&gt;

&lt;p&gt;I avoid GitFlow in these situations.&lt;/p&gt;

&lt;p&gt;You deploy to production continuously. Multiple times per day. No staging. No release windows. In that world, GitFlow adds branches without adding safety.&lt;/p&gt;

&lt;p&gt;Your team already struggles to keep &lt;code&gt;develop&lt;/code&gt; stable. GitFlow assumes you can treat &lt;code&gt;develop&lt;/code&gt; as an integration gate. If you cannot, you are better off with trunk-based development and feature flags.&lt;/p&gt;

&lt;p&gt;You do not have environments to support it. No staging. No separation between integration and production. In that case, GitFlow becomes naming theater.&lt;/p&gt;

&lt;h3&gt;
  
  
  The most common mistake
&lt;/h3&gt;

&lt;p&gt;The worst setup I see is this.&lt;/p&gt;

&lt;p&gt;Teams adopt GitFlow “by the book”, but keep their old habits. Direct pushes sneak in. Hotfixes do not get merged back. Releases happen straight from &lt;code&gt;develop&lt;/code&gt; because it is “almost ready”.&lt;/p&gt;

&lt;p&gt;&lt;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%2Ffbj36d6v03epl9kxkdca.png" class="article-body-image-wrapper"&gt;&lt;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%2Ffbj36d6v03epl9kxkdca.png" alt="GitFlow Workflow" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The GitFlow Branch Model I Actually Use on GitHub
&lt;/h2&gt;

&lt;p&gt;I keep the branch model boring and strict. No variations. No “almost GitFlow”. If I start bending the rules, the model stops working.&lt;/p&gt;

&lt;p&gt;These are the only branches I use.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;main&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;main&lt;/code&gt; is always releasable. Always.&lt;/p&gt;

&lt;p&gt;I never push directly to it. Not even for a typo. If &lt;code&gt;main&lt;/code&gt; is broken, the whole model failed upstream.&lt;/p&gt;

&lt;p&gt;What this gives me is simple. At any point in time, I can tag &lt;code&gt;main&lt;/code&gt; and ship. No excuses. No cleanup phase.&lt;/p&gt;

&lt;p&gt;If you cannot guarantee this, GitFlow gives you nothing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;develop&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;develop&lt;/code&gt; is my integration branch.&lt;/p&gt;

&lt;p&gt;This is where features meet. This is where conflicts show up early. This is where I accept temporary instability, but only temporarily.&lt;/p&gt;

&lt;p&gt;I treat &lt;code&gt;develop&lt;/code&gt; as protected, even when I work alone. No direct pushes. Always via pull request. That PR is my forced pause to think: is this actually ready to be integrated?&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;develop&lt;/code&gt; stays broken for days, GitFlow collapses. Integration must be frequent and boring.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;feature/*&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;All work starts here.&lt;/p&gt;

&lt;p&gt;Feature branches are short-lived by design. If a feature takes more than three to five days, I split it. Long-lived feature branches are the biggest source of merge pain and hidden risk.&lt;/p&gt;

&lt;p&gt;I do not optimize for “perfect feature branches”. I optimize for deleting them quickly.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;feature/auth-token-refresh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feature/api-rate-limits&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feature/ui-settings-page&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once merged into &lt;code&gt;develop&lt;/code&gt;, the branch is gone. No reuse. No resurrection.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;release/*&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;I only create a &lt;code&gt;release/*&lt;/code&gt; branch when I actually need stabilization.&lt;/p&gt;

&lt;p&gt;If there is no staging phase, I skip release branches entirely. Creating them without a purpose is pure ceremony.&lt;/p&gt;

&lt;p&gt;A release branch exists to say one thing: no new features. Only fixes, hardening, documentation, and versioning.&lt;/p&gt;

&lt;p&gt;Typical names:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;release/1.4.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;release/2026.02&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the release is ready, it gets merged into &lt;code&gt;main&lt;/code&gt;, tagged, and then merged back into &lt;code&gt;develop&lt;/code&gt;. Always both. This is where many teams drift.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;hotfix/*&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Hotfixes are rare. That is intentional.&lt;/p&gt;

&lt;p&gt;A hotfix starts from &lt;code&gt;main&lt;/code&gt;, never from &lt;code&gt;develop&lt;/code&gt;. It fixes production. Nothing else.&lt;/p&gt;

&lt;p&gt;After the fix, I merge it into &lt;code&gt;main&lt;/code&gt; and immediately back into &lt;code&gt;develop&lt;/code&gt;. Skipping the back-merge is the fastest way to reintroduce the same bug later.&lt;/p&gt;

&lt;p&gt;Names stay explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hotfix/login-nullref&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hotfix/payment-timeout&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hotfixes are treated with more care, not less.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Rules That Make GitFlow Work (And Why I Enforce Them on Myself)
&lt;/h2&gt;

&lt;p&gt;GitFlow without rules is just branch naming.&lt;/p&gt;

&lt;p&gt;I enforce the same rules on my side projects that I enforce on client projects. The reason is simple. If the setup only works when I am “careful”, it will fail under pressure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Protected branches are non-negotiable
&lt;/h3&gt;

&lt;p&gt;I protect &lt;code&gt;main&lt;/code&gt; and &lt;code&gt;develop&lt;/code&gt;. Always.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No direct pushes.&lt;/li&gt;
&lt;li&gt;No force pushes.&lt;/li&gt;
&lt;li&gt;No branch deletion.&lt;/li&gt;
&lt;li&gt;Pull requests only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even when I am the only contributor.&lt;/p&gt;

&lt;p&gt;This removes temptation. I cannot “just push a quick fix”. Every change goes through the same path. That consistency is the real value.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pull requests are mandatory checkpoints
&lt;/h3&gt;

&lt;p&gt;A pull request is not about collaboration. It is about forcing a decision point.&lt;/p&gt;

&lt;p&gt;Before merging, I answer a few basic questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why does this change exist?&lt;/li&gt;
&lt;li&gt;What exactly changed?&lt;/li&gt;
&lt;li&gt;How did I verify it works?&lt;/li&gt;
&lt;li&gt;What is the risk?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I cannot answer those clearly in a PR description, the change is not ready.&lt;/p&gt;

&lt;p&gt;This sounds heavy. In practice, it saves time. It avoids “I’ll fix it later” commits.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fe575r89phk5ubzjjiso0.png" class="article-body-image-wrapper"&gt;&lt;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%2Fe575r89phk5ubzjjiso0.png" alt="GitHub Protection Branches" width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Approvals still matter, even solo
&lt;/h3&gt;

&lt;p&gt;I require at least one approval.&lt;/p&gt;

&lt;p&gt;Yes, I approve my own PRs. That is not the point.&lt;/p&gt;

&lt;p&gt;The point is the pause. The forced context switch. Opening the PR, reading the diff in GitHub, and approving it is different from pushing code from an editor.&lt;/p&gt;

&lt;p&gt;That pause catches mistakes more often than people expect.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conversation resolution is underrated
&lt;/h3&gt;

&lt;p&gt;I require all conversations to be resolved before merging.&lt;/p&gt;

&lt;p&gt;This prevents half-finished reviews and “we will come back to this” comments that never get addressed.&lt;/p&gt;

&lt;p&gt;If a comment exists, it deserves a decision. Fix it. Reject it. Explain it. Then resolve it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linear history vs merge commits
&lt;/h3&gt;

&lt;p&gt;This is where teams hurt themselves.&lt;/p&gt;

&lt;p&gt;If your team is comfortable with rebasing and understands it well, require a linear history. It keeps &lt;code&gt;develop&lt;/code&gt; clean.&lt;/p&gt;

&lt;p&gt;If not, allow merge commits. But standardize it. Do not mix strategies per PR.&lt;/p&gt;

&lt;p&gt;I personally use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Squash merge for &lt;code&gt;feature/*&lt;/code&gt; into &lt;code&gt;develop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Merge commits for &lt;code&gt;release/*&lt;/code&gt; and &lt;code&gt;hotfix/*&lt;/code&gt; into &lt;code&gt;main&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is not which option you pick. The key is that it is enforced, not debated every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Pull Requests as the Core Unit of Work
&lt;/h2&gt;

&lt;p&gt;In my setup, branches exist to create pull requests. Pull requests are the real workflow.&lt;/p&gt;

&lt;p&gt;If you get PRs right, GitFlow becomes manageable. If PRs are large, vague, or inconsistent, GitFlow falls apart.&lt;/p&gt;

&lt;h3&gt;
  
  
  A boring PR template on purpose
&lt;/h3&gt;

&lt;p&gt;I use the same PR template everywhere. It is intentionally simple.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why&lt;/strong&gt;: the problem or reason for the change&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What&lt;/strong&gt;: what changed at a high level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How tested&lt;/strong&gt;: tests run, manual checks, environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk&lt;/strong&gt;: what could break&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rollback&lt;/strong&gt;: how to undo it if needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not documentation. It is a forcing function. If I cannot fill this in quickly, the PR is probably doing too much.&lt;/p&gt;

&lt;h3&gt;
  
  
  Small PRs beat clever branch strategies
&lt;/h3&gt;

&lt;p&gt;If a reviewer needs more than 30–45 minutes, the PR is too big.&lt;/p&gt;

&lt;p&gt;Large PRs hide bugs. They also create social pressure to approve without fully understanding the change. That is how regressions slip in.&lt;/p&gt;

&lt;p&gt;I optimize for PRs that can be reviewed quickly and confidently. That usually means slicing features into vertical, mergeable steps.&lt;/p&gt;

&lt;p&gt;GitFlow does not fix big PRs. It amplifies the pain if you allow them.&lt;/p&gt;

&lt;h3&gt;
  
  
  CODEOWNERS even for tiny repos
&lt;/h3&gt;

&lt;p&gt;I use &lt;code&gt;CODEOWNERS&lt;/code&gt; even when I am the only owner.&lt;/p&gt;

&lt;p&gt;It makes review routing explicit. It also prepares the repo for future contributors without rethinking the rules.&lt;/p&gt;

&lt;p&gt;More importantly, GitHub treats CODEOWNERS reviews differently. That gives you another enforcement layer, not another convention.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Naming, Traceability, and Future Me
&lt;/h2&gt;

&lt;p&gt;Most conventions exist for one reason. You will forget.&lt;/p&gt;

&lt;p&gt;Future me is the main consumer of my Git history. Not GitHub. Not tools. Me, six months later, trying to understand why something exists.&lt;/p&gt;

&lt;h3&gt;
  
  
  Branch names should explain intent
&lt;/h3&gt;

&lt;p&gt;I use explicit branch names. Not clever ones.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;feature/login&lt;/code&gt; tells me nothing.&lt;br&gt;
&lt;code&gt;feature/oauth-token-refresh&lt;/code&gt; tells me exactly what problem was being solved.&lt;/p&gt;

&lt;p&gt;If I use an issue tracker, I include the ID:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;feature/ABC-123-oauth-token-refresh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This costs seconds. It saves minutes every time I search history.&lt;/p&gt;
&lt;h3&gt;
  
  
  PR titles are part of the changelog
&lt;/h3&gt;

&lt;p&gt;I treat PR titles as public API.&lt;/p&gt;

&lt;p&gt;Release notes, changelogs, and audit trails are generated from them. If the title is vague, everything downstream becomes vague.&lt;/p&gt;

&lt;p&gt;I avoid “fix stuff” or “cleanup”. I prefer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Fix token refresh race condition”&lt;/li&gt;
&lt;li&gt;“Add rate limiting to public API”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I cannot summarize the change in one sentence, the PR is probably too large.&lt;/p&gt;
&lt;h3&gt;
  
  
  Link everything, even when it feels redundant
&lt;/h3&gt;

&lt;p&gt;I always link PRs to issues. Always.&lt;/p&gt;

&lt;p&gt;Even on side projects. Even when the issue only exists to track the PR.&lt;/p&gt;

&lt;p&gt;GitHub already gives you the syntax. Use it.&lt;br&gt;
&lt;code&gt;Closes #123&lt;/code&gt; is enough.&lt;/p&gt;

&lt;p&gt;This creates a navigable graph. Branch to PR. PR to issue. Issue to release. Without links, GitFlow loses one of its biggest advantages.&lt;/p&gt;
&lt;h3&gt;
  
  
  Traceability must be enforced, not suggested
&lt;/h3&gt;

&lt;p&gt;If traceability is optional, it will be skipped.&lt;/p&gt;

&lt;p&gt;I enforce naming and linking through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Branch naming patterns&lt;/li&gt;
&lt;li&gt;PR templates&lt;/li&gt;
&lt;li&gt;Required checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not bureaucracy. The goal is predictability.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why this matters more with GitFlow
&lt;/h3&gt;

&lt;p&gt;GitFlow creates more branches than trunk-based development. That increases cognitive load.&lt;/p&gt;

&lt;p&gt;Naming and traceability reduce that load. They make the model survivable over time.&lt;/p&gt;

&lt;p&gt;In the next section, I will map this structure to &lt;strong&gt;CI/CD pipelines&lt;/strong&gt;, and explain what I run where, and why.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fwinolm9tuo3v1y0etxon.png" class="article-body-image-wrapper"&gt;&lt;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%2Fwinolm9tuo3v1y0etxon.png" alt="GitFlow on GitKraken" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  6. Naming, Traceability, and Future Me
&lt;/h2&gt;

&lt;p&gt;Most conventions exist for one reason. You will forget.&lt;/p&gt;

&lt;p&gt;Future me is the main consumer of my Git history. Not GitHub. Not tools. Me, six months later, trying to understand why something exists.&lt;/p&gt;
&lt;h3&gt;
  
  
  Branch names should explain intent
&lt;/h3&gt;

&lt;p&gt;I use explicit branch names. Not clever ones.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;feature/login&lt;/code&gt; tells me nothing.&lt;br&gt;
&lt;code&gt;feature/oauth-token-refresh&lt;/code&gt; tells me exactly what problem was being solved.&lt;/p&gt;

&lt;p&gt;If I use an issue tracker, I include the ID:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;feature/ABC-123-oauth-token-refresh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This costs seconds. It saves minutes every time I search history.&lt;/p&gt;
&lt;h3&gt;
  
  
  PR titles are part of the changelog
&lt;/h3&gt;

&lt;p&gt;I treat PR titles as public API.&lt;/p&gt;

&lt;p&gt;Release notes, changelogs, and audit trails are generated from them. If the title is vague, everything downstream becomes vague.&lt;/p&gt;

&lt;p&gt;I avoid “fix stuff” or “cleanup”. I prefer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Fix token refresh race condition”&lt;/li&gt;
&lt;li&gt;“Add rate limiting to public API”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I cannot summarize the change in one sentence, the PR is probably too large.&lt;/p&gt;
&lt;h3&gt;
  
  
  Link everything, even when it feels redundant
&lt;/h3&gt;

&lt;p&gt;I always link PRs to issues. Always.&lt;/p&gt;

&lt;p&gt;Even on side projects. Even when the issue only exists to track the PR.&lt;/p&gt;

&lt;p&gt;GitHub already gives you the syntax. Use it.&lt;br&gt;
&lt;code&gt;Closes #123&lt;/code&gt; is enough.&lt;/p&gt;

&lt;p&gt;This creates a navigable graph. Branch to PR. PR to issue. Issue to release. Without links, GitFlow loses one of its biggest advantages.&lt;/p&gt;
&lt;h3&gt;
  
  
  Traceability must be enforced, not suggested
&lt;/h3&gt;

&lt;p&gt;If traceability is optional, it will be skipped.&lt;/p&gt;

&lt;p&gt;I enforce naming and linking through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Branch naming patterns&lt;/li&gt;
&lt;li&gt;PR templates&lt;/li&gt;
&lt;li&gt;Required checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not bureaucracy. The goal is predictability.&lt;/p&gt;
&lt;h2&gt;
  
  
  8. Releases, Tags, and Changelogs I Can Trust
&lt;/h2&gt;

&lt;p&gt;Releases are not a side effect. They are a deliberate action.&lt;/p&gt;

&lt;p&gt;GitFlow only pays off if releases are predictable and traceable. That starts with being strict about where and how you tag.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tags exist only on &lt;code&gt;main&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;I tag releases only on &lt;code&gt;main&lt;/code&gt;. No exceptions.&lt;/p&gt;

&lt;p&gt;If a tag exists anywhere else, it lies. A tag should mean “this is what went to production” or “this is the shipped artifact”.&lt;/p&gt;

&lt;p&gt;Tagging on &lt;code&gt;develop&lt;/code&gt; or &lt;code&gt;release/*&lt;/code&gt; breaks that guarantee and creates confusion later when you try to answer a simple question: what is actually running?&lt;/p&gt;
&lt;h3&gt;
  
  
  Release branches are not releases
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;release/*&lt;/code&gt; branch is a candidate. Not a promise.&lt;/p&gt;

&lt;p&gt;It can be delayed. It can be fixed. It can even be abandoned. That is fine.&lt;/p&gt;

&lt;p&gt;The release only exists when:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The release branch is merged into &lt;code&gt;main&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A tag is created on &lt;code&gt;main&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Anything else is pre-release noise.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fx1qafc798dvm0gk17w5y.png" class="article-body-image-wrapper"&gt;&lt;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%2Fx1qafc798dvm0gk17w5y.png" alt="Semantic Versioning" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Versioning decisions are made early
&lt;/h3&gt;

&lt;p&gt;I decide versioning strategy at the start of a project, not during the first release.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Semantic versioning when public contracts matter&lt;/li&gt;
&lt;li&gt;Date-based versioning for internal tools or fast-moving products&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Changing versioning mid-stream creates churn and inconsistent expectations. Pick one and live with it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Changelogs are generated, not remembered
&lt;/h3&gt;

&lt;p&gt;I do not write changelogs by hand.&lt;/p&gt;

&lt;p&gt;They are generated from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PR titles&lt;/li&gt;
&lt;li&gt;Labels&lt;/li&gt;
&lt;li&gt;Commit history on &lt;code&gt;main&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why PR titles matter. Sloppy titles produce useless release notes.&lt;br&gt;
(Actually GitHub Copilot helps me a lot to create these ones and commit messages)&lt;/p&gt;
&lt;h2&gt;
  
  
  9. Environments or GitFlow Is Just Ritual
&lt;/h2&gt;

&lt;p&gt;GitFlow assumes environments. Without them, you are just renaming branches.&lt;/p&gt;

&lt;p&gt;I see many setups where GitFlow exists on paper, but everything deploys to the same place. In that case, the extra branches add zero value.&lt;/p&gt;
&lt;h3&gt;
  
  
  The minimum environment setup I use
&lt;/h3&gt;

&lt;p&gt;I keep it simple. Three environments.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dev / Integration&lt;/strong&gt;&lt;br&gt;
Automatically deployed from &lt;code&gt;develop&lt;/code&gt;. This is where features meet and conflicts surface early.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Staging&lt;/strong&gt;&lt;br&gt;
Deployed from &lt;code&gt;release/*&lt;/code&gt;. This environment exists to say “no”. If something fails here, the release is not ready.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Production&lt;/strong&gt;&lt;br&gt;
Deployed from &lt;code&gt;main&lt;/code&gt;. Always. No exceptions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you cannot support at least this, GitFlow will not protect you.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why each environment matters
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;develop&lt;/code&gt; needs a shared place where the system actually runs. Unit tests are not enough. Integration bugs appear only when components talk to each other.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;release/*&lt;/code&gt; needs a stable environment. The whole point of a release branch is to freeze scope and validate reality.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;main&lt;/code&gt; maps one-to-one with production. If you blur this line, you lose confidence in every tag and every rollback.&lt;/p&gt;
&lt;h3&gt;
  
  
  GitFlow without environments is overhead
&lt;/h3&gt;

&lt;p&gt;Branches alone do not reduce risk. Feedback loops do.&lt;/p&gt;

&lt;p&gt;If all feedback arrives only after merging to &lt;code&gt;main&lt;/code&gt;, GitFlow becomes slower trunk-based development, nothing more.&lt;/p&gt;

&lt;p&gt;In the next section, I will explain how I handle &lt;strong&gt;hotfixes&lt;/strong&gt;, and why this is where most teams break the model.&lt;/p&gt;
&lt;h2&gt;
  
  
  10. Handling Hotfixes Without Breaking the Model
&lt;/h2&gt;

&lt;p&gt;Hotfixes are where GitFlow discipline is tested.&lt;/p&gt;

&lt;p&gt;They arrive under pressure. Something is broken. Time matters. This is exactly when shortcuts feel justified. That is also when long-term damage happens.&lt;/p&gt;
&lt;h3&gt;
  
  
  Hotfixes start from &lt;code&gt;main&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A hotfix always branches from &lt;code&gt;main&lt;/code&gt;. Never from &lt;code&gt;develop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;main&lt;/code&gt; represents what is running in production. If you start a hotfix anywhere else, you are guessing what you are fixing.&lt;/p&gt;

&lt;p&gt;The goal of a hotfix is simple. Fix production. Nothing more.&lt;/p&gt;
&lt;h3&gt;
  
  
  Scope is deliberately small
&lt;/h3&gt;

&lt;p&gt;A hotfix branch contains the minimal change required to restore service.&lt;/p&gt;

&lt;p&gt;No refactoring. No cleanup. No “since we are here” improvements. Those belong on &lt;code&gt;develop&lt;/code&gt; or in a future release.&lt;/p&gt;

&lt;p&gt;Every extra change increases risk at the worst possible moment.&lt;/p&gt;
&lt;h3&gt;
  
  
  CI and reviews still apply
&lt;/h3&gt;

&lt;p&gt;I do not disable checks for hotfixes.&lt;/p&gt;

&lt;p&gt;Pipelines might be slightly faster. Reviews might be faster. But rules still apply.&lt;/p&gt;

&lt;p&gt;Hotfixes are urgent, not special.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why teams drift here
&lt;/h3&gt;

&lt;p&gt;Under pressure, people optimize for now. GitFlow optimizes for later.&lt;/p&gt;

&lt;p&gt;Skipping the back-merge or bypassing rules feels harmless in the moment. It creates invisible debt that surfaces weeks later.&lt;/p&gt;

&lt;p&gt;If your GitFlow setup cannot survive hotfix pressure, it is not real.&lt;/p&gt;

&lt;p&gt;&lt;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%2Ftf0yl4wzym0ihhfv04vl.png" class="article-body-image-wrapper"&gt;&lt;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%2Ftf0yl4wzym0ihhfv04vl.png" alt="Merge Conflicts" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  11. Merge Conflicts and How I Keep Them Boring
&lt;/h2&gt;

&lt;p&gt;Merge conflicts are not a Git problem. They are a workflow problem.&lt;/p&gt;

&lt;p&gt;Every painful conflict I have dealt with had the same root cause. Branches lived too long.&lt;/p&gt;
&lt;h3&gt;
  
  
  Short-lived branches solve most conflicts
&lt;/h3&gt;

&lt;p&gt;I keep feature branches short. Days, not weeks.&lt;/p&gt;

&lt;p&gt;If a feature cannot be merged within three to five days, I split it. Vertical slices. Mergeable steps. Incremental progress.&lt;/p&gt;

&lt;p&gt;This single habit reduces conflicts more than any Git command ever will.&lt;/p&gt;
&lt;h2&gt;
  
  
  12. GitHub Actions Patterns I Reuse Everywhere
&lt;/h2&gt;

&lt;p&gt;Automation is what makes GitFlow survivable long term.&lt;/p&gt;

&lt;p&gt;If the workflow depends on people remembering rules, it will degrade. GitHub Actions are there to make the right path the default path.&lt;/p&gt;
&lt;h3&gt;
  
  
  Required checks are gates, not guidelines
&lt;/h3&gt;

&lt;p&gt;Every protected branch has required checks.&lt;/p&gt;

&lt;p&gt;If a check is required, the PR cannot merge. No override. No “just this once”.&lt;/p&gt;

&lt;p&gt;This removes social pressure. The system says no, not a person.&lt;/p&gt;

&lt;p&gt;I treat required checks as part of the branch contract. If they are flaky or slow, I fix the checks. I do not remove the requirement.&lt;/p&gt;
&lt;h3&gt;
  
  
  Reusable workflows or nothing
&lt;/h3&gt;

&lt;p&gt;I do not copy-paste workflows across repositories.&lt;/p&gt;

&lt;p&gt;I use reusable workflows so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The same rules apply everywhere&lt;/li&gt;
&lt;li&gt;Changes are made once&lt;/li&gt;
&lt;li&gt;Drift is impossible&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Environment protection is part of GitFlow
&lt;/h3&gt;

&lt;p&gt;For production deployments, I use GitHub environments with protection rules.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required reviewers&lt;/li&gt;
&lt;li&gt;Scoped secrets&lt;/li&gt;
&lt;li&gt;Explicit approval step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This adds a final safety net without bypassing GitFlow.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;main&lt;/code&gt; deploys to production, production must be protected.&lt;/p&gt;
&lt;h3&gt;
  
  
  Secrets and permissions are minimal
&lt;/h3&gt;

&lt;p&gt;Workflows get only the permissions they need. No wildcard tokens. No long-lived secrets when OIDC is available.&lt;/p&gt;

&lt;p&gt;This matters more as automation grows. GitFlow increases automation surface. Least privilege keeps that surface manageable.&lt;/p&gt;
&lt;h2&gt;
  
  
  13. Security and Governance I Enable by Default
&lt;/h2&gt;

&lt;p&gt;Security and governance are not enterprise-only concerns. I enable them even on side projects. Especially on side projects.&lt;/p&gt;

&lt;p&gt;If the repo matters enough to use GitFlow, it matters enough to protect it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Dependabot is always on
&lt;/h3&gt;

&lt;p&gt;I enable Dependabot alerts and PRs by default.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alerts tell me when I am exposed.&lt;/li&gt;
&lt;li&gt;PRs force the fix through the same PR rules as any other change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I never update dependencies directly on protected branches. Updates go through PRs, checks, and reviews like everything else.&lt;/p&gt;
&lt;h3&gt;
  
  
  Code scanning is part of the pipeline
&lt;/h3&gt;

&lt;p&gt;At minimum, I run code scanning on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;develop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This catches obvious issues early and prevents shipping known problems.&lt;/p&gt;

&lt;p&gt;I do not chase perfect security scores. I want signal, not noise. But no scanning at all is not an option.&lt;/p&gt;
&lt;h2&gt;
  
  
  14. In a nutshell, what I do (copy this section)
&lt;/h2&gt;

&lt;p&gt;This is the setup I apply by default. On client projects. On open source. On side projects.&lt;/p&gt;
&lt;h3&gt;
  
  
  Branches
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;main&lt;/code&gt;&lt;br&gt;
Always releasable. Production only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;develop&lt;/code&gt;&lt;br&gt;
Integration branch. Can move fast, but must stay usable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;feature/*&lt;/code&gt;&lt;br&gt;
Short-lived. One purpose. Merged into &lt;code&gt;develop&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;release/*&lt;/code&gt;&lt;br&gt;
Created only when a real stabilization phase exists.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;hotfix/*&lt;/code&gt;&lt;br&gt;
Urgent fixes from &lt;code&gt;main&lt;/code&gt;. Always merged back.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Protection rules
&lt;/h3&gt;

&lt;p&gt;Protected branches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;develop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;release/*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hotfix/*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rules applied:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull requests required&lt;/li&gt;
&lt;li&gt;At least one approval&lt;/li&gt;
&lt;li&gt;Required status checks&lt;/li&gt;
&lt;li&gt;Conversation resolution required&lt;/li&gt;
&lt;li&gt;No direct pushes&lt;/li&gt;
&lt;li&gt;No force pushes&lt;/li&gt;
&lt;li&gt;No branch deletion&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Pull request rules
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mandatory PR template: Why, What, How tested, Risk, Rollback&lt;/li&gt;
&lt;li&gt;Small PRs by design&lt;/li&gt;
&lt;li&gt;CODEOWNERS enabled&lt;/li&gt;
&lt;li&gt;One merge strategy enforced&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Merge strategy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Squash merge for &lt;code&gt;feature/*&lt;/code&gt; into &lt;code&gt;develop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Merge commits for &lt;code&gt;release/*&lt;/code&gt; and &lt;code&gt;hotfix/*&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;No rebasing of shared branches&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  CI/CD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;feature/*&lt;/code&gt;: build, unit tests, lint&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;develop&lt;/code&gt;: full test suite, security checks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;release/*&lt;/code&gt;: full suite, packaging, deploy to staging&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;main&lt;/code&gt;: production deploy, tag, changelog&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Releases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tags on &lt;code&gt;main&lt;/code&gt; only&lt;/li&gt;
&lt;li&gt;Semantic or date-based versioning decided early&lt;/li&gt;
&lt;li&gt;Changelogs generated from PR metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Environments
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;develop&lt;/code&gt; → dev/integration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;release/*&lt;/code&gt; → staging&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;main&lt;/code&gt; → production&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Hotfix discipline
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Branch from &lt;code&gt;main&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Minimal scope&lt;/li&gt;
&lt;li&gt;Merge to &lt;code&gt;main&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Merge back to &lt;code&gt;develop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;No skipped steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This policy is intentionally boring. Boring scales.&lt;/p&gt;


&lt;h3&gt;
  
  
  👀 GitHub Copilot quota visibility in VS Code
&lt;/h3&gt;

&lt;p&gt;
&lt;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%2Fsqzk5hamyymcmuh515a4.png" class="article-body-image-wrapper"&gt;&lt;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%2Fsqzk5hamyymcmuh515a4.png" width="700" height="700"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;If you use GitHub Copilot and ever wondered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what plan you’re on&lt;/li&gt;
&lt;li&gt;whether you have limits&lt;/li&gt;
&lt;li&gt;how much premium quota is left&lt;/li&gt;
&lt;li&gt;when it resets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built a small VS Code extension called &lt;strong&gt;Copilot Insights&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It shows Copilot &lt;strong&gt;plan and quota status&lt;/strong&gt; directly inside VS Code.&lt;br&gt;&lt;br&gt;
No usage analytics. No productivity scoring. Just clarity.&lt;/p&gt;

&lt;p&gt;👉 VS Code Marketplace:&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.vscode-copilot-insights" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.vscode-copilot-insights&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>gitflow</category>
    </item>
    <item>
      <title>How I created a Cozy Workspace in VS Code</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Thu, 11 Dec 2025 15:54:26 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/how-i-created-a-cozy-workspace-in-vs-code-4bf0</link>
      <guid>https://dev.to/playfulprogramming/how-i-created-a-cozy-workspace-in-vs-code-4bf0</guid>
      <description>&lt;p&gt;I love VS Code. It is fast, flexible, and works for almost any stack. But the default layout is not great if you want a clean space to think. The editor area is smaller than it should be, and the UI is packed with elements that pull attention away from the code. With the new Copilot Chat panel taking even more space, the problem becomes obvious. Too much noise, not enough room to work.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fa5r5wccr9kd6xos8y0l1.png" class="article-body-image-wrapper"&gt;&lt;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%2Fa5r5wccr9kd6xos8y0l1.png" alt="VS Code Default Layout"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the picture above, the default layout, with Copilot opened on the right, the space for code is really limited.&lt;/p&gt;

&lt;p&gt;I have been searching for a layout that removes distractions without sacrificing functionality. Something simple, comfortable, and optimized for long sessions. This article explains the setup I finally arrived at. It is a &lt;em&gt;Productivity&lt;/em&gt; profile built around a few key layout changes: moving the sidebar to the right, putting the Activity Bar at the top, centering Quick Input, hiding the Command Center, switching themes automatically based on daylight, improving cursor visibility, and adding one small bonus to make the day more pleasant.&lt;/p&gt;

&lt;p&gt;These changes are minimal but have a clear impact. They turn VS Code into a focused, cozy environment that gives space back to the code instead of the UI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Creating a Dedicated “Productivity” Profile
&lt;/h2&gt;

&lt;p&gt;VS Code profiles let you build isolated setups for different workflows. This solves a common problem. When you install extensions or change layout settings for one project, everything else gets affected. A dedicated &lt;em&gt;Productivity&lt;/em&gt; profile keeps your focused environment clean and consistent.&lt;/p&gt;

&lt;p&gt;I use this profile only for work sessions. For the training session I usually have, of course I still use the Default profile, otherwise the people are confused and lost.&lt;/p&gt;

&lt;p&gt;Creating the new profile takes a minute:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Command Palette.&lt;/li&gt;
&lt;li&gt;Run &lt;strong&gt;Profiles: Create Profile&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Empty&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Name it &lt;strong&gt;Productivity&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Customize settings only for this profile.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can also click on the &lt;strong&gt;Gear&lt;/strong&gt; icon on the bottom left and select "Profiles" from the menu.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fbjlckxu0kf9gwem00ny2.png" class="article-body-image-wrapper"&gt;&lt;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%2Fbjlckxu0kf9gwem00ny2.png" alt="Create a new profile"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Moving the Primary Sidebar to the Right
&lt;/h2&gt;

&lt;p&gt;By default, VS Code puts the sidebar on the left. This works, but it also competes with your natural reading flow. Having the file tree on the left constantly pulls the eye away from the editor.&lt;br&gt;
Also, when you close the sidebar, the code moves a little bit on the left, because the sidebar is not present anymore.&lt;/p&gt;

&lt;p&gt;Moving the sidebar to the right reduces this tension. It keeps the editor centered and makes the coding area the first thing your eyes land on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"workbench.sideBar.location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"right"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also click with the right button on the sidebar and select "Move Primary Sidebar Right".&lt;/p&gt;

&lt;p&gt;&lt;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%2Frd8dwljxzizkerijyrk5.png" class="article-body-image-wrapper"&gt;&lt;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%2Frd8dwljxzizkerijyrk5.png" alt="Move Primary Sidebar Right"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This simple switch makes the layout feel more balanced and less cluttered.&lt;/p&gt;


&lt;h2&gt;
  
  
  Activity Bar at the Top
&lt;/h2&gt;

&lt;p&gt;The Activity Bar is highly visible. Keeping it on the left (or right, if the primary sidebar is on the right) creates unnecessary vertical columns. Moving it to the top uses horizontal space instead of eating into the editor.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"workbench.activityBar.location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"top"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It's possible to change the same settings, even by clicking on the top of the sidebar and choose &lt;strong&gt;Top&lt;/strong&gt; from the &lt;strong&gt;Activity Bar Position&lt;/strong&gt; menu.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fov7dptqftxgdsl1bzxhq.png" class="article-body-image-wrapper"&gt;&lt;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%2Fov7dptqftxgdsl1bzxhq.png" alt="Activity Bar Position"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This change pairs well with the right-aligned sidebar and creates a cleaner overall layout.&lt;/p&gt;


&lt;h2&gt;
  
  
  Centering Quick Input for Better Focus
&lt;/h2&gt;

&lt;p&gt;The Command Palette and file switcher usually appear at the top. This forces a constant eye shift upward. Centering Quick Input keeps everything in your immediate focus area.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"workbench.quickInput.location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is especially useful if you use the keyboard heavily.&lt;/p&gt;


&lt;h2&gt;
  
  
  Hiding the Command Center
&lt;/h2&gt;

&lt;p&gt;If you already use keyboard shortcuts and the centered Quick Input, the Command Center becomes redundant. It adds noise without adding value.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"window.commandCenter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Hiding it cleans up the top UI and keeps attention on the code.&lt;/p&gt;


&lt;h2&gt;
  
  
  Move the Menu bar
&lt;/h2&gt;

&lt;p&gt;How often do you use the Menu? I think not so much, so, you can use that space for something else by changing the position of the menu, on the top of the Activity Bar.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"window.menuBarVisibility"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"compact"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you want to use the UI to change this settings, click on the &lt;strong&gt;Customize Layout&lt;/strong&gt; on the top right corner of VS Code window and change the Visibility of the Menu Bar.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fukui96lv23b2mmlgk0xy.png" class="article-body-image-wrapper"&gt;&lt;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%2Fukui96lv23b2mmlgk0xy.png" alt="Menu Bar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One more row is saved but first of all you are not distracted by the menu items on the top.&lt;/p&gt;


&lt;h2&gt;
  
  
  Automatic Light/Dark Theme Switching With PowerToys LightSwitch
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/powertoys/" rel="noopener noreferrer"&gt;PowerToys LightSwitch&lt;/a&gt; changes your Windows theme based on sunrise and sunset. VS Code can detect this automatically and switch between your preferred light and dark themes.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"workbench.preferredDarkColorTheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JetBrains Rider Dark Theme"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"workbench.preferredLightColorTheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Default Light+"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"window.autoDetectColorScheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I use the JetBrains Rider Dark theme because I also use it on Rider, and it helps me stay focused when switching between IDEs.&lt;/p&gt;

&lt;p&gt;This keeps the editor comfortable throughout the day with zero manual work.&lt;/p&gt;


&lt;h2&gt;
  
  
  Improving Cursor Visibility With “Expand” Blinking
&lt;/h2&gt;

&lt;p&gt;The default cursor blink is subtle. In a busy file, it is easy to lose track of it. The “expand” style is more visible without being distracting.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"editor.cursorBlinking"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"expand"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A small tweak, but surprisingly helpful.&lt;/p&gt;


&lt;h2&gt;
  
  
  Bonus: A Bit of Fun With VS Code Pets
&lt;/h2&gt;

&lt;p&gt;A cozy environment should be enjoyable, not just efficient. The &lt;strong&gt;VS Code Pets&lt;/strong&gt; extension adds a small animated pet to your workspace. It keeps you company during long sessions and adds a bit of charm without affecting focus.&lt;/p&gt;

&lt;p&gt;&lt;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%2F8q65fseydgmjk0ug12gk.png" class="article-body-image-wrapper"&gt;&lt;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%2F8q65fseydgmjk0ug12gk.png" alt="VS Code Pets"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is optional, but it makes the environment feel more human.&lt;/p&gt;


&lt;h2&gt;
  
  
  Final Result
&lt;/h2&gt;

&lt;p&gt;A cozy development environment is not about adding more tools. It is about removing friction. By focusing only on VS Code's layout settings, you can reclaim space, reduce noise, and make the editor feel purpose-built for deep work.&lt;/p&gt;

&lt;p&gt;In the screenshot below, you can see the final result after all these easy changes.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fkjny7tun8120fq5lx4ya.png" class="article-body-image-wrapper"&gt;&lt;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%2Fkjny7tun8120fq5lx4ya.png" alt="Final Result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to spend time changing all the settings manually, you can find all my settings in the following repo:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kasuken" rel="noopener noreferrer"&gt;
        kasuken
      &lt;/a&gt; / &lt;a href="https://github.com/kasuken/Windows11-Setup" rel="noopener noreferrer"&gt;
        Windows11-Setup
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      My settings for Windows 11 and other tools I use everyday.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cc903eb49e41de41b53fed3cf9f34b74d76eff26cfd8cc00307d7aa129f25301/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f57696e646f777325323031312d53657475702d626c75653f6c6f676f3d77696e646f7773"&gt;&lt;img src="https://camo.githubusercontent.com/cc903eb49e41de41b53fed3cf9f34b74d76eff26cfd8cc00307d7aa129f25301/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f57696e646f777325323031312d53657475702d626c75653f6c6f676f3d77696e646f7773" alt="Windows 11 Setup" height="32"&gt;&lt;/a&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Windows 11 Setup &amp;amp; Automation&lt;/h1&gt;
&lt;/div&gt;


&lt;p&gt;&lt;b&gt;Automate, configure, and optimize your Windows 11 environment with ease.&lt;/b&gt;&lt;/p&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Overview&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;This repository provides a &lt;strong&gt;comprehensive, automated, and customizable setup&lt;/strong&gt; for Windows 11. It includes PowerShell scripts, terminal and VS Code configurations, and best practices to help you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up a new Windows 11 machine in minutes&lt;/li&gt;
&lt;li&gt;Apply productivity-boosting tweaks&lt;/li&gt;
&lt;li&gt;Install essential tools and extensions&lt;/li&gt;
&lt;li&gt;Maintain a consistent, portable dev environment&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📦 Features&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PowerShell Automation&lt;/strong&gt;: Scripts for system tweaks, package installs, and profile management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminal Customization&lt;/strong&gt;: Pre-configured settings for Windows Terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code Setup&lt;/strong&gt;: Recommended extensions and settings for a modern dev workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modular Structure&lt;/strong&gt;: Use only what you need—easy to extend and adapt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Clear instructions for every step&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🗂️ Repository Structure&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;Windows11-Setup/
├── PowerShell/         # PowerShell scripts and user profile
│   └── profile.ps1
├── Terminal/           # Windows Terminal settings
│   └── settings.json
├── VSCode/             # VS Code&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kasuken/Windows11-Setup" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;This layout turned VS Code into a cleaner and more intentional workspace for me. If you try it or customize it, share your version. Every developer ends up with their own definition of cozy.&lt;/p&gt;




&lt;p&gt;📘 &lt;strong&gt;Get the Book with 50% Off!&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;I turned my beginner programming mistakes into a guide so you don’t have to repeat them.&lt;br&gt;&lt;br&gt;
Grab &lt;strong&gt;The Mistakes I Made as a Beginner Programmer&lt;/strong&gt; today with a special discount.  &lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://emanuelebartolesi.gumroad.com/l/mistakesasdeveloper/MISTAKESDEVTO50" rel="noopener noreferrer"&gt;Get it on Gumroad&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💸 Use code &lt;strong&gt;MISTAKESDEVTO50&lt;/strong&gt; at checkout for &lt;strong&gt;50% off&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
      <category>development</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Why I Built TaskDeck and How It Improves Your VS Code Workflow</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Thu, 20 Nov 2025 12:50:24 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/why-i-built-taskdeck-and-how-it-improves-your-vs-code-workflow-4fk9</link>
      <guid>https://dev.to/playfulprogramming/why-i-built-taskdeck-and-how-it-improves-your-vs-code-workflow-4fk9</guid>
      <description>&lt;p&gt;VS Code tasks are powerful, but most developers barely use them. The problem is not the feature itself. It is the workflow. Tasks are hidden behind menus, the command palette, or a &lt;code&gt;tasks.json&lt;/code&gt; file that nobody enjoys editing. Running the same commands over and over becomes a small but constant tax on your focus.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;TaskDeck&lt;/strong&gt; to remove that tax. I wanted a simple way to see all tasks in one place, launch them with one click, and stop jumping between JSON files, menus, and shortcuts. No magic, no reinvention. Just a faster way to work inside VS Code.&lt;/p&gt;

&lt;p&gt;&lt;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%2Foyajyzury41egd48fdnj.gif" class="article-body-image-wrapper"&gt;&lt;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%2Foyajyzury41egd48fdnj.gif" alt="TaskDesk Demo" width="633" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.taskdeck" rel="noopener noreferrer"&gt;VS Code Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kasuken/vscode-taskdeck" rel="noopener noreferrer"&gt;Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Problem: VS Code Tasks Are Underrated but Hard to Use
&lt;/h2&gt;

&lt;p&gt;VS Code tasks are one of the most useful features in the editor. They let you run scripts, build steps, linters, tests, and any command you need with a single entry. They should save time. Instead, most developers ignore them.&lt;/p&gt;

&lt;p&gt;The reason is simple. The workflow is not smooth.&lt;/p&gt;

&lt;p&gt;You have to open the command palette, remember the task name, or dig into the &lt;code&gt;Run Task&lt;/code&gt; menu. If you want to change something, you open &lt;code&gt;tasks.json&lt;/code&gt;, navigate its structure, and hope you wrote the syntax correctly. Even when tasks are configured well, finding the one you want still requires multiple steps.&lt;/p&gt;

&lt;p&gt;This friction adds up. Developers avoid tasks, fall back to terminal commands, and lose the benefits of a shared, consistent workflow. Teams suffer too because tasks are not discoverable. New team members rarely browse &lt;code&gt;tasks.json&lt;/code&gt;, so useful automation stays hidden.&lt;/p&gt;

&lt;p&gt;Tasks are not the problem. The UI is.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Wanted as a Developer
&lt;/h2&gt;

&lt;p&gt;I needed something simple. A place where I could see all my tasks without touching JSON or opening menus. A way to run tasks without breaking my focus or switching contexts. Something that made tasks feel like a natural part of my workflow, not an extra step.&lt;/p&gt;

&lt;p&gt;I also wanted a solution that worked the same across projects. Some repositories have many tasks. Others have only a few.&lt;/p&gt;

&lt;p&gt;Most importantly, I wanted to avoid the constant “open palette, type, run, repeat” cycle. It is fast for one action, but slow if you repeat it all day. A dedicated side panel felt like the obvious answer, yet VS Code did not offer one for tasks. So I built it.&lt;/p&gt;

&lt;p&gt;TaskDeck started as a selfish idea: reduce my friction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing TaskDeck
&lt;/h2&gt;

&lt;p&gt;&lt;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%2Fvregibspuqcoz8676lo1.png" class="article-body-image-wrapper"&gt;&lt;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%2Fvregibspuqcoz8676lo1.png" alt="TaskDesk Logo" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TaskDeck is a VS Code extension that gives tasks the visibility they deserve. It adds a dedicated side panel that lists every task from your workspace, ready to run with a single click.&lt;/p&gt;

&lt;p&gt;When you open a folder, TaskDeck reads your existing &lt;code&gt;tasks.json&lt;/code&gt; and displays the tasks in a clean, structured tree. If your project contains multiple task groups or compound tasks, TaskDeck shows them clearly so you always know what is available.&lt;/p&gt;

&lt;p&gt;The extension does not try to change how VS Code tasks work. It simply makes them easier to use. Developers get a permanent view of their automation without jumping between menus. New team members immediately see what tasks exist. And you get a smoother workflow that stays out of your way.&lt;/p&gt;




&lt;h2&gt;
  
  
  How TaskDeck Improves Your Workflow
&lt;/h2&gt;

&lt;p&gt;TaskDeck changes how you interact with VS Code tasks by removing unnecessary steps. Everything is in one place. You focus on your work instead of navigating the editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No more context switching.&lt;/strong&gt;&lt;br&gt;
You do not need to open the command palette or remember task names. The side panel is always visible, so you click and run. The fewer steps you take, the less mental load you carry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clear visibility for every task.&lt;/strong&gt;&lt;br&gt;
A list on the side makes tasks discoverable. You see what exists, how they are grouped, and which ones matter. This is especially helpful in large repositories or monorepos where tasks tend to multiply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Faster onboarding for teams.&lt;/strong&gt;&lt;br&gt;
New developers immediately understand the available actions in a project. They no longer rely on README notes or tribal knowledge to find build, lint, or test tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-click execution.&lt;/strong&gt;&lt;br&gt;
The core improvement is speed. Launching a task becomes as easy as launching a file. There is no friction in trying, running, or combining tasks throughout your day.&lt;/p&gt;


&lt;h2&gt;
  
  
  Key Features with Examples
&lt;/h2&gt;

&lt;p&gt;TaskDeck is built around a simple idea. Make tasks easier to find, easier to run, and easier to understand. Here are the core features that make that happen, with practical examples of how developers use them.&lt;/p&gt;
&lt;h3&gt;
  
  
  Side Panel Overview
&lt;/h3&gt;

&lt;p&gt;The extension adds a new &lt;strong&gt;TaskDeck&lt;/strong&gt; view in the VS Code sidebar.&lt;br&gt;
It lists all detected tasks in a clean tree, grouped by their &lt;code&gt;group&lt;/code&gt; property when present.&lt;/p&gt;

&lt;p&gt;Example workspace task definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tasks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How TaskDeck shows it:&lt;/p&gt;

&lt;p&gt;&lt;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%2Foyajyzury41egd48fdnj.gif" class="article-body-image-wrapper"&gt;&lt;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%2Foyajyzury41egd48fdnj.gif" alt="TaskDesk Demo" width="633" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You see everything immediately. No guessing and no hunting through JSON.&lt;/p&gt;

&lt;h3&gt;
  
  
  One-Click Run
&lt;/h3&gt;

&lt;p&gt;Every task has a play button.&lt;br&gt;
You click it and VS Code runs the task right away.&lt;/p&gt;

&lt;p&gt;This is especially useful for actions you repeat daily:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build the solution&lt;/li&gt;
&lt;li&gt;run the backend&lt;/li&gt;
&lt;li&gt;run the frontend&lt;/li&gt;
&lt;li&gt;run tests&lt;/li&gt;
&lt;li&gt;run code generation&lt;/li&gt;
&lt;li&gt;run a watcher&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No palette. No typing. No remembering.&lt;/p&gt;
&lt;h3&gt;
  
  
  Automatic Detection of Workspace Tasks
&lt;/h3&gt;

&lt;p&gt;TaskDeck loads tasks from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.vscode/tasks.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;the root of the workspace&lt;/li&gt;
&lt;li&gt;multi-root workspaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If tasks are defined, they show up automatically.&lt;br&gt;
If you add a new task, the panel updates without reloading the extension.&lt;/p&gt;
&lt;h3&gt;
  
  
  Optional Icons (If Enabled)
&lt;/h3&gt;

&lt;p&gt;If you assigned icons or emojis to your task labels, TaskDeck shows them.&lt;br&gt;
Not required, but useful for visual scanning.&lt;/p&gt;


&lt;h2&gt;
  
  
  Behind the Scenes: How I Built It
&lt;/h2&gt;

&lt;p&gt;TaskDeck is simple on the surface, but building it required dealing with how VS Code exposes tasks internally. The goal was to keep the architecture small, predictable, and easy to maintain. Nothing fancy. Just a clean extension that does one thing well.&lt;/p&gt;
&lt;h3&gt;
  
  
  Activation and Task Loading
&lt;/h3&gt;

&lt;p&gt;The extension activates when a workspace loads.&lt;br&gt;
VS Code exposes an API that returns all tasks defined in the workspace. The extension reads them and organizes them into a structure that can be rendered in the side panel.&lt;/p&gt;

&lt;p&gt;Key points I focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;load tasks once on activation&lt;/li&gt;
&lt;li&gt;listen for changes in workspace files&lt;/li&gt;
&lt;li&gt;refresh the tree when tasks.json is updated&lt;/li&gt;
&lt;li&gt;stay lightweight so activation time stays near-zero&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No custom parsing. No extra config. Just using the official tasks provider.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Tree View
&lt;/h3&gt;

&lt;p&gt;The entire UI is built on VS Code’s &lt;code&gt;TreeDataProvider&lt;/code&gt;.&lt;br&gt;
Every task becomes a tree item. Groups become parent nodes.&lt;br&gt;
For multi-root workspaces, each folder becomes a root node with its own groups.&lt;/p&gt;

&lt;p&gt;Structure example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Workspace Folder
  Build
    - build
    - full-build
  Test
    - test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tree nodes expose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a label&lt;/li&gt;
&lt;li&gt;an optional icon&lt;/li&gt;
&lt;li&gt;a tooltip&lt;/li&gt;
&lt;li&gt;a command to run the task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps the implementation small and makes the UI responsive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running Tasks
&lt;/h3&gt;

&lt;p&gt;Running a task is a direct call into VS Code’s task API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;vscode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;executeTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means TaskDeck doesn’t reinvent any behavior.&lt;br&gt;
It delegates execution completely to VS Code, which ensures logs, terminals, and task output behave exactly as expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Handling Multi-Root Workspaces
&lt;/h3&gt;

&lt;p&gt;One of the trickiest parts was supporting multi-root folders.&lt;br&gt;
Some projects have one &lt;code&gt;tasks.json&lt;/code&gt;. Others have several.&lt;br&gt;
TaskDeck detects them all and scopes tasks correctly under each folder.&lt;/p&gt;

&lt;p&gt;This avoids the common problem where tasks from different services get mixed together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons Learned
&lt;/h3&gt;

&lt;p&gt;A few things became clear while building TaskDeck:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tasks are powerful but under-exposed in the UI.&lt;/li&gt;
&lt;li&gt;Most developers never open &lt;code&gt;tasks.json&lt;/code&gt; unless they have to.&lt;/li&gt;
&lt;li&gt;A simple UI change can unlock the value of an existing feature.&lt;/li&gt;
&lt;li&gt;VS Code’s APIs make this kind of extension surprisingly easy once you understand tree views.&lt;/li&gt;
&lt;li&gt;Good defaults matter more than new features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TaskDeck was built with a “minimum friction” mindset.&lt;br&gt;
Do less, but do it well.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next for TaskDeck
&lt;/h2&gt;

&lt;p&gt;TaskDeck is intentionally minimal. It focuses on visibility and speed, but there is room to grow without turning it into a complex automation tool. These are the improvements I am considering next.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task Filtering and Search
&lt;/h3&gt;

&lt;p&gt;Large workspaces can contain many tasks.&lt;br&gt;
A small search bar or quick filter inside the panel would help you jump to the right one instantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inline Task Editing
&lt;/h3&gt;

&lt;p&gt;Not a full editor.&lt;br&gt;
Just a lightweight way to jump directly to the task definition or toggle simple fields without digging through JSON.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better Multi-Root Experience
&lt;/h3&gt;

&lt;p&gt;Multi-root workspaces work well today, but a few enhancements could improve clarity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;collapsible sections&lt;/li&gt;
&lt;li&gt;root-level summaries&lt;/li&gt;
&lt;li&gt;optional grouping modes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Telemetry-Free Insights
&lt;/h3&gt;

&lt;p&gt;If I add metrics or insights (for example, most-used tasks), they will be completely local.&lt;br&gt;
Developers do not want telemetry in their tools, and TaskDeck will stay strict about that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Community Feedback
&lt;/h3&gt;

&lt;p&gt;The next features will depend on what developers find useful.&lt;br&gt;
TaskDeck is small by design, so additions must keep the workflow simple and fast.&lt;/p&gt;

&lt;p&gt;If you have ideas or requests, open an issue on GitHub or leave feedback on the Marketplace page.&lt;/p&gt;




&lt;p&gt;Try it, use it in your projects, and share your feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.taskdeck" rel="noopener noreferrer"&gt;VS Code Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kasuken/vscode-taskdeck" rel="noopener noreferrer"&gt;Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;🙋‍♂️ Hey, I'm Emanuele — you might know me online as &lt;strong&gt;Kasuken&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👨‍💻 GitHub Technical Lead | Microsoft MVP (12x) | GitHub Star (4x)&lt;br&gt;&lt;br&gt;
🛠️ I build things with &lt;strong&gt;.NET&lt;/strong&gt;, &lt;strong&gt;Azure&lt;/strong&gt;, &lt;strong&gt;AI&lt;/strong&gt;, and &lt;strong&gt;GitHub&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🌈 Turning code into 🦖 and 🦄 — one commit at a time&lt;/p&gt;

&lt;p&gt;🚀 If you're into .NET, GitHub, DevOps, or just cool side projects,&lt;br&gt;&lt;br&gt;
feel free to &lt;a href="https://www.linkedin.com/in/bartolesiemanuele" rel="noopener noreferrer"&gt;connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. I break things so you don’t have to. 😉&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Why I Use JetBrains Rider for .NET Development</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Thu, 13 Nov 2025 09:55:00 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/why-i-use-jetbrains-rider-for-net-development-2a8k</link>
      <guid>https://dev.to/playfulprogramming/why-i-use-jetbrains-rider-for-net-development-2a8k</guid>
      <description>&lt;p&gt;Finding the ideal IDE for .NET work is rarely a straightforward journey. As .NET developers, I invest huge amounts of time in tooling, and every annoyance—slow loading, awkward workflows, missing features, can disrupt my focus and flow. Visual Studio has long dominated my daily tool statistics, but in recent years JetBrains Rider has earned a place on my machine, and for good reason.&lt;/p&gt;

&lt;p&gt;Rider is not just another editor. It’s a modern, cross-platform IDE built from the ground up by the same people behind ReSharper. If you’ve ever dreamed of a fast, resource-efficient, and deeply integrated development environment for .NET, Rider is likely already on your radar. What I’ve found is that, once you get past the initial adjustment, Rider quietly improves the everyday experience of .NET development—sometimes in ways you don’t notice until you go back to something else.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fsugfl4nltqtezkk5lwz1.png" class="article-body-image-wrapper"&gt;&lt;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%2Fsugfl4nltqtezkk5lwz1.png" alt="My icons on the taskbar" width="122" height="44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see on the screenshot above, I don't have Visual Studio on my machine anymore.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Chose Rider Over Visual Studio
&lt;/h2&gt;

&lt;p&gt;My journey with Rider began out of curiosity but quickly turned into appreciation for the sheer number of pain points it eliminates. The first thing that struck me was how effortlessly Rider runs on all my machines, regardless of operating system. I routinely work across Windows and Mac, and the ability to carry my IDE and settings with me is invaluable. No need for workarounds, no feature gaps, no “missing” editor windows.&lt;/p&gt;

&lt;p&gt;I also used VS Code in the past as my main .NET environment, but I missed a lot of features. I love VS Code (I have also a tattoo with the logo), but for .NET it is not the right tool.&lt;/p&gt;

&lt;p&gt;Performance is another area where Rider delivers. It opens massive solutions fast and rarely stumbles even when refactoring or running code analysis on large codebases. The UI feels modern and uncluttered, but it’s also highly customizable. Shortcuts and navigation are easy to adjust, and you quickly fall into a rhythm where you can fly through files, definitions, and references without reaching for the mouse.&lt;/p&gt;

&lt;p&gt;What really sold me, though, was the depth of built-in tooling. Rider ships with ReSharper-level code inspections, refactorings, and quick-fixes by default. There’s no need to add extra plugins or endure the lag that sometimes comes with layering on more extensions in Visual Studio. Integrated Git support (even if I use more often a mix between GitKraken, GitHub Desktop and the console), a robust database explorer, and even a built-in HTTP client are all available out of the box.&lt;br&gt;
For this reason, I still have Postman on my machine, but when I can, I use the http client inside Rider. I can save the http files directly in the solution and everyone in the project can use it, because they are part of the source code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Living With Rider Day to Day
&lt;/h2&gt;

&lt;p&gt;Switching IDEs is a real commitment, and I was skeptical about leaving behind years of muscle memory from Visual Studio.&lt;br&gt;
At the beginning, I had VS and Rider, side by side, but I always finished to using VS because I was too lazy to learn new things.&lt;br&gt;
Then, when I got a new laptop, I installed only VS Code and Rider, so I forced myself to use it. No excuse.&lt;br&gt;
But after the first week, Rider’s workflow began to feel natural. Solution management is painless. I can open .NET Core, ASP.NET, and Windows Forms in the same window. Multi-targeted projects work without friction. Git operations and branching are tightly integrated. The built-in terminal means fewer context switches, and the task runner lets me automate everything from builds to test runs with a couple of keystrokes.&lt;/p&gt;

&lt;p&gt;Debugging is quick and reliable—setting breakpoints, inspecting variables, attaching to processes, and even editing code while debugging all feel snappy. Navigating large codebases is more fluid, thanks to instant "Go to Definition" and symbol search features. Code inspections and suggestions are always present, but never intrusive.&lt;/p&gt;

&lt;p&gt;Rider feels purpose-built for people who want to code more and configure less. Dark mode, custom themes, and adaptable keymaps let you shape the environment to your preferences with little effort.&lt;/p&gt;

&lt;p&gt;As a theme, now I am using the default Dark theme of Rider. For having the same feeling when I use VS Code, I found the porting of the theme even for VS Code.&lt;/p&gt;




&lt;h2&gt;
  
  
  5 Hidden Gems in Rider
&lt;/h2&gt;

&lt;p&gt;Beyond the headline features, Rider hides a number of tools that can fundamentally change how you work, often going unnoticed until you stumble across them.&lt;/p&gt;

&lt;p&gt;First, Rider’s dynamic code analysis runs continuously in the background, flagging potential bugs, code smells, and even subtle style violations. The real value is in the instant quick-fixes: a single keyboard shortcut (Alt+Enter) and Rider can reformat, refactor, or even rewrite problematic code, all without interrupting your train of thought.&lt;br&gt;
Sometimes I disable this option when I am on my laptop on the train or in general not at my desk to preserve a little bit the battery. It's quite easy to turn it on and off because there is an option directly on the File menu.&lt;/p&gt;

&lt;p&gt;Navigation is another quiet superpower. The "Search Everywhere" window, triggered with Shift+Shift, brings up files, classes, symbols, settings, and even menu commands in one place. Combined with highly customizable keymaps and actions, it’s easy to move around a project without ever reaching for the mouse.&lt;/p&gt;

&lt;p&gt;&lt;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%2F85zy3nvwzpemuspjhkmi.png" class="article-body-image-wrapper"&gt;&lt;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%2F85zy3nvwzpemuspjhkmi.png" alt="The " width="732" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you care about code consistency, Rider’s integration with &lt;code&gt;.editorconfig&lt;/code&gt; files stands out. The IDE enforces formatting and style rules across your project and visually indicates where your code diverges from team standards. The built-in visual editor makes tweaking rules straightforward, and you can catch issues before they hit code review.&lt;br&gt;
I use the .editorconfig of a friend of mine, Marco Minerva. I move that file from project to project all the time.&lt;/p&gt;

&lt;p&gt;For those who frequently interact with web APIs, Rider’s HTTP client is a small but powerful addition. It lets you create &lt;code&gt;.http&lt;/code&gt; files directly in your solution, send requests, inspect responses, and even generate C# HTTP client code—all without leaving the IDE or reaching for external tools like Postman.&lt;/p&gt;

&lt;p&gt;Finally, the database explorer in Rider means you don’t need a separate SQL tool for most data work. You can connect to major databases, run queries, and even preview LINQ queries mapped to your schema—all from within your solution. As a not really an expert in Database and Entity Framework, I love this integration.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fp9hrknqaj64rnqxjro4e.png" class="article-body-image-wrapper"&gt;&lt;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%2Fp9hrknqaj64rnqxjro4e.png" alt="database explorer" width="609" height="373"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub Copilot Integration
&lt;/h2&gt;

&lt;p&gt;One of the most exciting developments for Rider is its tight integration with GitHub Copilot. As you type, Copilot surfaces context-aware suggestions—sometimes completing whole methods or filling out boilerplate code from just a comment or a function signature.&lt;/p&gt;

&lt;p&gt;What’s especially useful is how well Copilot integrates with Rider’s own completion system. Suggestions appear inline, can be accepted or cycled with familiar shortcuts, and work across all supported languages—including C#, JavaScript, TypeScript, and Razor files. This means you get AI assistance not just for backend code but also for front-end, tests, and even scripting tasks.&lt;/p&gt;

&lt;p&gt;&lt;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%2F3ydbdmptmfw3g4vylrej.png" class="article-body-image-wrapper"&gt;&lt;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%2F3ydbdmptmfw3g4vylrej.png" alt="GitHub Copilot Integration" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For me, Copilot in Rider isn’t just a novelty; it’s a genuine productivity boost. It helps me prototype faster, learn new APIs in context, and avoid repetitive coding.&lt;br&gt;
I will write another blog post for this specific topic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Drawbacks and Considerations
&lt;/h2&gt;

&lt;p&gt;No tool is perfect, and Rider is no exception. The most obvious barrier for many is cost: Rider requires a commercial license. For hobbyists or open-source developers, there is a free version with all the features enabled!&lt;/p&gt;

&lt;p&gt;Extension support is another point to consider. While Rider’s plugin ecosystem is robust and growing, there are still some Visual Studio extensions and integrations that haven’t made the leap. If you rely on a very specific workflow or niche tooling, you’ll want to check compatibility before switching.&lt;/p&gt;

&lt;p&gt;The UI does take some getting used to if you’re coming from Visual Studio. Some menus are arranged differently, and not all wizards or designers are present. If you’re tied to Windows-specific features, especially for legacy .NET workloads or advanced Azure integrations, you may find Rider lacking in those areas.&lt;/p&gt;

&lt;p&gt;Finally, in larger organizations, the choice of IDE may not be yours alone. Some teams or companies standardize on Visual Studio, so using Rider could be discouraged or unsupported in those environments.&lt;/p&gt;




&lt;p&gt;🙋‍♂️ Hey, I'm Emanuele — you might know me online as &lt;strong&gt;Kasuken&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👨‍💻 Senior Cloud Engineer | Microsoft MVP (12x) | GitHub Star (4x)&lt;br&gt;&lt;br&gt;
🛠️ I build things with &lt;strong&gt;.NET&lt;/strong&gt;, &lt;strong&gt;Azure&lt;/strong&gt;, &lt;strong&gt;AI&lt;/strong&gt;, and &lt;strong&gt;GitHub&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🌈 Turning code into 🦖 and 🦄 — one commit at a time&lt;/p&gt;

&lt;p&gt;🚀 If you're into .NET, GitHub, DevOps, or just cool side projects,&lt;br&gt;&lt;br&gt;
feel free to &lt;a href="https://www.linkedin.com/in/bartolesiemanuele" rel="noopener noreferrer"&gt;connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. I break things so you don’t have to. 😉&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>productivity</category>
    </item>
    <item>
      <title>⚡ Turn On or Off Fast Startup in Windows 11</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Fri, 10 Oct 2025 15:19:25 +0000</pubDate>
      <link>https://dev.to/kasuken/turn-on-or-off-fast-startup-in-windows-11-4pgh</link>
      <guid>https://dev.to/kasuken/turn-on-or-off-fast-startup-in-windows-11-4pgh</guid>
      <description>&lt;p&gt;Since few months my primary laptop is a Microsoft Laptop 6 (you can see my entire setup on my website &lt;a href="https://www.emanuelebartolesi.com/uses" rel="noopener noreferrer"&gt;https://www.emanuelebartolesi.com/uses&lt;/a&gt;).&lt;br&gt;
In the last few weeks I had a lot of performace issues with the laptop.&lt;br&gt;
I thought it was something related the tools I am using for working (LM Studio and other dev tools), but actually I was wrong.&lt;br&gt;
I did a lot of research around and finally I discovered that my issue is the Fast Startup on Windows 11.&lt;/p&gt;

&lt;p&gt;Fast Startup helps your PC boot up faster after shutdown by combining the &lt;strong&gt;cold boot&lt;/strong&gt; and &lt;strong&gt;hibernation&lt;/strong&gt; processes. While it’s convenient, it can sometimes cause issues with dual-boot setups or device drivers (primarily Intel).&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 Understanding Fast Startup
&lt;/h2&gt;

&lt;p&gt;There are three types of startup modes in Windows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cold Boot&lt;/strong&gt; – Traditional full startup (everything initializes from scratch).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wake-from-Hibernation&lt;/strong&gt; – Restores your previous session from disk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast Startup&lt;/strong&gt; – A hybrid approach combining both.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you shut down your PC with &lt;strong&gt;Fast Startup&lt;/strong&gt; enabled, Windows logs off all user sessions but saves the system state (drivers, kernel session) to a file called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\hiberfil.sys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the next boot, Windows reads this file instead of reinitializing everything — resulting in a noticeably faster startup.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Note:&lt;/strong&gt; Fast Startup depends on &lt;strong&gt;Hibernate&lt;/strong&gt;. If hibernation is disabled, Fast Startup won’t work.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧩 Step 1 — Check if Fast Startup is On or Off (PowerShell)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open &lt;strong&gt;Windows Terminal&lt;/strong&gt; as Administrator (right-click Start → &lt;em&gt;Windows Terminal (Admin)&lt;/em&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the following command:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HiberbootEnabled&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Check the result:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;1&lt;/code&gt; → Fast Startup is &lt;strong&gt;Enabled&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt; → Fast Startup is &lt;strong&gt;Disabled&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ Step 2 — Turn Fast Startup On or Off (Control Panel)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the &lt;strong&gt;Control Panel&lt;/strong&gt; (press &lt;code&gt;Win + R&lt;/code&gt;, type &lt;code&gt;control&lt;/code&gt;, and hit Enter).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to:&lt;br&gt;
&lt;strong&gt;Hardware and Sound → Power Options → Choose what the power buttons do&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Change settings that are currently unavailable&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under &lt;strong&gt;Shutdown settings&lt;/strong&gt;, you’ll see:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;✅ &lt;em&gt;Turn on fast startup (recommended)&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;To &lt;strong&gt;enable&lt;/strong&gt; Fast Startup → check the box.&lt;br&gt;
To &lt;strong&gt;disable&lt;/strong&gt; it → uncheck the box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Save changes&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;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%2Flxx28cs7c03lunpjbio9.png" class="article-body-image-wrapper"&gt;&lt;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%2Flxx28cs7c03lunpjbio9.png" alt="Turn on fast startup (recommended)" width="583" height="340"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧰 Step 3 — (Optional) Enable Hibernate if Needed
&lt;/h2&gt;

&lt;p&gt;If you don’t see the “Turn on fast startup” option, Hibernate might be disabled. Enable it using PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;powercfg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/hibernate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you only want to use Fast Startup and not full hibernation, you can reduce the hiberfile size:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;powercfg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/h&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;reduced&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps Fast Startup working but saves disk space.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧹 Step 4 — Disable Hibernate (Also Disables Fast Startup)
&lt;/h2&gt;

&lt;p&gt;If you want to completely disable both Hibernate and Fast Startup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;powercfg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/hibernate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;off&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This removes the &lt;code&gt;C:\hiberfil.sys&lt;/code&gt; file and disables related features.&lt;/p&gt;




&lt;p&gt;🙋‍♂️ Hey, I'm Emanuele — you might know me online as &lt;strong&gt;Kasuken&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👨‍💻 Senior Cloud Engineer | Microsoft MVP (12x) | GitHub Star (4x)&lt;br&gt;&lt;br&gt;
🛠️ I build things with &lt;strong&gt;.NET&lt;/strong&gt;, &lt;strong&gt;Azure&lt;/strong&gt;, &lt;strong&gt;AI&lt;/strong&gt;, and &lt;strong&gt;GitHub&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🌈 Turning code into 🦖 and 🦄 — one commit at a time&lt;/p&gt;

&lt;p&gt;🚀 If you're into .NET, GitHub, DevOps, or just cool side projects,&lt;br&gt;&lt;br&gt;
feel free to &lt;a href="https://www.linkedin.com/in/bartolesiemanuele" rel="noopener noreferrer"&gt;connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. I break things so you don’t have to. 😉&lt;/p&gt;

</description>
      <category>windows</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building My New Website with Astro, GitHub Copilot, and AWS Amplify</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Tue, 07 Oct 2025 12:41:50 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/building-my-new-website-with-astro-github-copilot-and-aws-amplify-3eoc</link>
      <guid>https://dev.to/playfulprogramming/building-my-new-website-with-astro-github-copilot-and-aws-amplify-3eoc</guid>
      <description>&lt;p&gt;For me, in general, the best way to learn something new is to &lt;strong&gt;start from zero and hit “publish.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s exactly what I did when I decided to rebuild my personal website — &lt;a href="https://emanuelebartolesi.com" rel="noopener noreferrer"&gt;emanuelebartolesi.com&lt;/a&gt; — from scratch.&lt;br&gt;
No templates. No frameworks I already knew. Just curiosity, a blank repo, and a lot of help from GitHub Copilot.&lt;/p&gt;

&lt;p&gt;I had &lt;strong&gt;never touched Astro before&lt;/strong&gt;, but I wanted to explore it because it felt and I read about it as the perfect mix between simplicity, speed, and flexibility.&lt;br&gt;
Instead of following tutorials, I decided to apply my own “&lt;strong&gt;Copilot personas&lt;/strong&gt;” approach — the same method I use in my daily projects to guide AI tools like GitHub Copilot through different roles: architect, implementer, reviewer, and so on. It felt like pair programming with an assistant that never gets tired.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/playfulprogramming/github-copilot-a-persona-based-approach-to-real-world-development-56ee" class="crayons-story__hidden-navigation-link"&gt;🚀 GitHub Copilot: A Persona-Based Approach to Real-World Development&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/playfulprogramming"&gt;
            &lt;img alt="Playful Programming logo" 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%2Forganization%2Fprofile_image%2F3314%2Ffd92caab-2014-431e-a19e-8ab47f2bf5ab.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/kasuken" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;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%2F79932%2Fbe7bcd76-1f69-4336-9155-6017aebb2c53.png" alt="kasuken profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/kasuken" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Emanuele Bartolesi
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Emanuele Bartolesi
                
              
              &lt;div id="story-author-preview-content-2800691" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/kasuken" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;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%2F79932%2Fbe7bcd76-1f69-4336-9155-6017aebb2c53.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Emanuele Bartolesi&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/playfulprogramming" class="crayons-story__secondary fw-medium"&gt;Playful Programming&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/playfulprogramming/github-copilot-a-persona-based-approach-to-real-world-development-56ee" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 26 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/playfulprogramming/github-copilot-a-persona-based-approach-to-real-world-development-56ee" id="article-link-2800691"&gt;
          🚀 GitHub Copilot: A Persona-Based Approach to Real-World Development
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubcopilot"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubcopilot&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/github"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;github&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/vscode"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;vscode&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/playfulprogramming/github-copilot-a-persona-based-approach-to-real-world-development-56ee" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;36&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/playfulprogramming/github-copilot-a-persona-based-approach-to-real-world-development-56ee#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              10&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




&lt;p&gt;To make the challenge even more interesting, I built the entire project &lt;strong&gt;inside GitHub Codespaces&lt;/strong&gt;, streamed the first steps &lt;strong&gt;live on Twitch&lt;/strong&gt;, and deployed it for the first time ever using &lt;strong&gt;AWS Amplify&lt;/strong&gt; with an Astro adapter.&lt;br&gt;
And because I can’t resist automating things, I also set up an &lt;strong&gt;AWS Lambda&lt;/strong&gt; function to re-publish the website every two hours — becase I have a lot of data on the website streamed from our external services.&lt;/p&gt;



&lt;p&gt;&lt;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%2Fmkl3vin6s4t2fgg0tais.png" class="article-body-image-wrapper"&gt;&lt;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%2Fmkl3vin6s4t2fgg0tais.png" alt="My new website"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Starting from Zero: Learning Astro with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;When I started this project, my Astro knowledge level was exactly &lt;strong&gt;zero&lt;/strong&gt;.&lt;br&gt;
I knew it existed, I had seen a few demos, but that was about it. I wanted to understand how it actually worked — component structure, routing, layouts, everything.&lt;/p&gt;

&lt;p&gt;Instead of spending hours reading documentation or tutorials, I decided to try something different:&lt;br&gt;
I would &lt;strong&gt;learn by building&lt;/strong&gt;, with &lt;strong&gt;GitHub Copilot&lt;/strong&gt; as my coding partner.&lt;/p&gt;

&lt;p&gt;But not just Copilot as a “code completion” tool — I used it through my &lt;strong&gt;personas approach&lt;/strong&gt;, a method I’ve been refining for months. The idea is simple:&lt;br&gt;
treat Copilot like a team of specialists instead of a single assistant.&lt;/p&gt;

&lt;p&gt;So, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I’d ask &lt;strong&gt;“Architect Copilot”&lt;/strong&gt; to explain how Astro handles layouts and partials.&lt;/li&gt;
&lt;li&gt;Then I’d switch to &lt;strong&gt;“Implementer Copilot”&lt;/strong&gt; to help me generate the first components.&lt;/li&gt;
&lt;li&gt;And finally, &lt;strong&gt;“Reviewer Copilot”&lt;/strong&gt; to check consistency and readability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In just a few hours, I had a working homepage, a blog section, and some reusable components.&lt;/p&gt;

&lt;p&gt;What surprised me the most (but not so much because Copilot is very good with React) was how &lt;strong&gt;Astro and Copilot worked so well together&lt;/strong&gt;.&lt;br&gt;
Copilot was able to suggest entire component structures, meta tag configurations, and even some optimizations for Lighthouse performance.&lt;/p&gt;

&lt;p&gt;Here’s a small example — I just typed a comment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;with the same style of the other pages, I would like to add a page dedicated to books I written or I am writing.
like this one: https://www.packtpub.com/en-us/product/mastering-minimal-apis-in-aspnet-core-9781803237824
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;and Copilot generated:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;---&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;BaseHead&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../components/BaseHead.astro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Footer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../components/Footer.astro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../components/Header.astro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="nx"&gt;getFeaturedBooks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;getPublishedBooks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;getUpcomingBooks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;bookCategories&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;getBookStats&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../data/books&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;featuredBooks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getFeaturedBooks&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publishedBooks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getPublishedBooks&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;upcomingBooks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getUpcomingBooks&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getBookStats&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;and the entire HTML and Astro code for the page and the TypeScript class for the data.&lt;/p&gt;


&lt;h2&gt;
  
  
  Live Coding on Twitch
&lt;/h2&gt;

&lt;p&gt;When I started working on the project, I thought: &lt;em&gt;“Why not share the process live?”&lt;/em&gt;&lt;br&gt;
So I opened Twitch, hit “Start Streaming,” and decided to &lt;strong&gt;build the first parts of the website in front of everyone&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Live coding is always a mix of excitement and vulnerability.&lt;br&gt;
You make mistakes, talk through your reasoning, and sometimes get stuck — all in real time. But that’s exactly what makes it authentic.&lt;br&gt;
And since I was diving into &lt;strong&gt;Astro for the first time&lt;/strong&gt;, it became a great way to &lt;strong&gt;learn in public&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;During those sessions, I wasn’t trying to “teach” Astro. I was &lt;strong&gt;learning it live&lt;/strong&gt;, asking ChatGPT and Copilot questions, and letting people in the chat contribute with suggestions.&lt;br&gt;
Sometimes, Copilot would generate code I didn’t fully understand, and viewers helped me reason through it. Other times, it just worked — and we all learned something new together.&lt;/p&gt;

&lt;p&gt;What I loved about this format is how it &lt;strong&gt;kept me accountable&lt;/strong&gt;.&lt;br&gt;
When you know people are watching, you can’t just stop halfway because you got stuck on a CSS grid layout. You find a way through — and that’s powerful motivation.&lt;/p&gt;

&lt;p&gt;After a few sessions, I already had the basic structure of my site, a working navigation, and a clear plan for the next steps.&lt;br&gt;
Streaming wasn’t just about building a website — it was about &lt;strong&gt;sharing curiosity and the joy of learning&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can find me on Twitch here: &lt;a href="http://twitch.tv/kasuken" rel="noopener noreferrer"&gt;http://twitch.tv/kasuken&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Developing in GitHub Codespaces
&lt;/h2&gt;

&lt;p&gt;One of the decisions I made early on was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I don’t want to install anything locally.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wanted this project to be &lt;strong&gt;100% cloud-based&lt;/strong&gt;, from the first line of code to deployment.&lt;br&gt;
So I opened GitHub, clicked on the &lt;strong&gt;“Open in Codespaces”&lt;/strong&gt; button, and within seconds, I was coding directly in the browser — with my full VS Code setup.&lt;/p&gt;

&lt;p&gt;It was surprisingly smooth.&lt;br&gt;
Astro ran perfectly, previews loaded fast, and I had GitHub Copilot right inside Codespaces to help me iterate.&lt;br&gt;
No Node.js version mismatches, no missing dependencies, no setup headaches.&lt;br&gt;
It just worked.&lt;/p&gt;

&lt;p&gt;This setup also had another big benefit: &lt;strong&gt;portability&lt;/strong&gt;.&lt;br&gt;
I could jump between my MacBook, my Windows laptop that I use for work or my private one (you can find the list of all my hardware on my website, in the Uses page) and continue working exactly where I left off.&lt;br&gt;
Everything — the editor, the extensions, and the environment — was consistent and ready.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;br&gt;
No cloning. No manual setup.&lt;/p&gt;

&lt;p&gt;I didn't change the default Codespaces image but I use the default one.&lt;br&gt;
Usually I customize the container, but in this case works like a charm, so, no reasons to change it and also the default image is faster to rebuild o start.&lt;/p&gt;

&lt;p&gt;For me, Codespaces became &lt;strong&gt;the perfect environment&lt;/strong&gt; for experimenting and learning with Copilot (and not only).&lt;/p&gt;

&lt;p&gt;When I finally switched to deploying on AWS, everything was already structured neatly in the repo.&lt;br&gt;
No “works on my machine” moments, ever again.&lt;/p&gt;


&lt;h2&gt;
  
  
  First Steps with AWS Amplify
&lt;/h2&gt;

&lt;p&gt;Once the site was running smoothly in Astro, it was time to bring it online.&lt;br&gt;
I had two main goals for hosting:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep it &lt;strong&gt;fully automated&lt;/strong&gt; from GitHub.&lt;/li&gt;
&lt;li&gt;Use a platform I hadn’t used before — because this was, after all, a learning project.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I chose &lt;strong&gt;AWS Amplify&lt;/strong&gt;.&lt;br&gt;
It was my &lt;strong&gt;first time&lt;/strong&gt; using it, and honestly, I was curious to see how it compared to platforms like Vercel or Microsoft Azure.&lt;/p&gt;

&lt;p&gt;The onboarding experience was smoother than I expected.&lt;br&gt;
Amplify detected my GitHub repository, connected automatically, and offered to build and deploy my Astro app in just a few clicks.&lt;br&gt;
No YAML setup, no manual build commands — it just picked up &lt;code&gt;npm run build&lt;/code&gt; and &lt;code&gt;dist/&lt;/code&gt; as defaults.&lt;/p&gt;

&lt;p&gt;I like the simplicity of the UI (even if I needed 2 days to be productive on the AWS console), especially compared to the Azure Portal.&lt;br&gt;
I used to use Azure since ages now, but actually the AWS console is not so bad.&lt;/p&gt;

&lt;p&gt;&lt;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%2F01cw9c3m206pxo37z477.png" class="article-body-image-wrapper"&gt;&lt;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%2F01cw9c3m206pxo37z477.png" alt="AWS console homepage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But I soon realized Astro isn’t natively supported in Amplify…&lt;br&gt;
and that’s when I discovered the &lt;strong&gt;AWS Amplify Adapter for Astro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After adding it, everything started to click.&lt;/p&gt;

&lt;p&gt;Here’s the short version of what I did:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;astro-aws-amplify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then in my &lt;code&gt;astro.config.mjs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mdx&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@astrojs/mdx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;sitemap&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@astrojs/sitemap&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;astro/config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;awsAmplify&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;astro-aws-amplify&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Conditionally use AWS Amplify adapter for deployments&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isAWSDeployment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AWS_AMPLIFY&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// https://astro.build/config&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;site&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;integrations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;mdx&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nf"&gt;sitemap&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;span class="p"&gt;...(&lt;/span&gt;&lt;span class="nx"&gt;isAWSDeployment&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;awsAmplify&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isAWSDeployment&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;static&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once I pushed these changes to GitHub, Amplify automatically rebuilt and deployed the site.&lt;br&gt;
No manual steps, no servers to configure — pure CI/CD magic.&lt;/p&gt;

&lt;p&gt;The only thing that I changed from the &lt;a href="https://docs.aws.amazon.com/amplify/latest/userguide/get-started-astro.html" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; is the check of the environment, otherwise I was not able to run the website from my local machine anymore.&lt;/p&gt;

&lt;p&gt;I have also contributed to the official repo for AWS Amplify to add the node version as parameter: &lt;a href="https://github.com/alexnguyennz/astro-aws-amplify/pull/37" rel="noopener noreferrer"&gt;https://github.com/alexnguyennz/astro-aws-amplify/pull/37&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Astro + AWS Amplify Adapter
&lt;/h2&gt;

&lt;p&gt;Once I added the &lt;strong&gt;Amplify adapter&lt;/strong&gt; to my Astro project, everything started to feel like a real production pipeline.&lt;/p&gt;

&lt;p&gt;The adapter acts as the bridge between Astro’s static-site output and AWS’ serverless infrastructure.&lt;br&gt;
In practice, it takes your built site and wraps it in an &lt;strong&gt;AWS Lambda&lt;/strong&gt; function that Amplify can deploy and serve.&lt;br&gt;
That means no servers, no containers — just instant scalability with minimal configuration.&lt;/p&gt;

&lt;p&gt;But what really impressed me was how Amplify handled &lt;strong&gt;different branches&lt;/strong&gt; from GitHub.&lt;br&gt;
Each branch can become its own environment — automatically.&lt;/p&gt;

&lt;p&gt;So, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;main&lt;/code&gt; branch →&lt;/strong&gt; production (&lt;code&gt;emanuelebartolesi.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;dev&lt;/code&gt; branch →&lt;/strong&gt; staging (&lt;code&gt;dev.emanuelebartolesi.com&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;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%2Fe9epavou80uldn23nvtn.png" class="article-body-image-wrapper"&gt;&lt;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%2Fe9epavou80uldn23nvtn.png" alt="My amplify setup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time I pushed a commit to either branch, Amplify rebuilt and deployed it without me touching a thing.&lt;/p&gt;

&lt;p&gt;That setup was powerful because it gave me the same comfort I have on larger SaaS projects — &lt;strong&gt;real CI/CD with environment isolation&lt;/strong&gt; — but for my personal site.&lt;/p&gt;

&lt;p&gt;Here’s what the process looked like visually:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Repo
 ├── main → Amplify Production → emanuelebartolesi.com
 └── dev  → Amplify Dev Env → dev.emanuelebartolesi.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In just a few hours, I had a multi-environment setup that I used to experiment with new pages, styles, and layout changes before merging them into &lt;code&gt;main&lt;/code&gt;.&lt;br&gt;
That kind of workflow used to take hours to configure manually — now it was a few clicks and one adapter import.&lt;/p&gt;


&lt;h2&gt;
  
  
  Automation with Lambda
&lt;/h2&gt;

&lt;p&gt;In my website I have different components that need to load a lot of data from APIs.&lt;br&gt;
For instance, I have a component to render my commmits on GitHub, all the info about my GitHub account and below I have the statistics about my productivity during the day with RescueTime.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fxdrjt5j7h5fz13atmiyd.png" class="article-body-image-wrapper"&gt;&lt;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%2Fxdrjt5j7h5fz13atmiyd.png" alt="GitHub Activity"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;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%2F0nobnjgk7yokrmmeemhz.png" class="article-body-image-wrapper"&gt;&lt;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%2F0nobnjgk7yokrmmeemhz.png" alt="GitHub Stats"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;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%2Fz0tze3hynehnpsi55gz9.png" class="article-body-image-wrapper"&gt;&lt;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%2Fz0tze3hynehnpsi55gz9.png" alt="RescueTime Statistics"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, I created a couple of loader on Astro to load all this data, but I need to rebuild the website everytime I want to update the pages.&lt;/p&gt;

&lt;p&gt;If there’s one thing I can’t resist, it’s automation.&lt;br&gt;
Once the site was up and running, I thought:&lt;/p&gt;

&lt;p&gt;So I built a &lt;strong&gt;simple Lambda function&lt;/strong&gt; that triggers the Amplify build every two hours.&lt;br&gt;
It’s a small piece of automation, but it makes the whole workflow feel alive — and it was surprisingly easy to set up.&lt;/p&gt;

&lt;p&gt;Here’s the basic lambda I have created :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib.request&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://webhooks URL&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({}).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then I just scheduled it using &lt;strong&gt;Amazon EventBridge&lt;/strong&gt; (formerly CloudWatch Events) with a cron rule like:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cron(0 7-17/2 ? * * *)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;So every two hours, from 7 in the morning to 5 in the afternoon, Lambda wakes up, triggers Amplify, and goes back to sleep — costing practically nothing.&lt;/p&gt;

&lt;p&gt;It’s a small piece of the puzzle, but it reflects my favorite principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;automate everything that can be automated — even personal projects.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Route 53 and Custom Domains
&lt;/h2&gt;

&lt;p&gt;Once everything was running perfectly on Amplify, it was time for the final touch:&lt;br&gt;
&lt;strong&gt;connecting my own domains&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I wanted two environments with clean, memorable URLs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;emanuelebartolesi.com&lt;/code&gt; for production&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dev.emanuelebartolesi.com&lt;/code&gt; for my staging environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I decided to manage everything directly in &lt;strong&gt;AWS Route 53&lt;/strong&gt;, mostly out of curiosity — but also because I’d heard good things about how seamlessly it integrates with Amplify.&lt;/p&gt;

&lt;p&gt;And honestly, it was &lt;strong&gt;a pleasant surprise&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Route 53 automatically recognized my Amplify app and helped me configure both records with just a few clicks.&lt;br&gt;
No manual DNS entries, no propagation headaches, no SSL nightmares.&lt;/p&gt;

&lt;p&gt;The SSL certificates are provided directly from Route 53.&lt;/p&gt;

&lt;p&gt;Here’s roughly what the configuration looked like:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;emanuelebartolesi.com        → Amplify Production (main branch)
dev.emanuelebartolesi.com    → Amplify Dev Environment (dev branch)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It was one of those moments where everything &lt;em&gt;just works&lt;/em&gt; —&lt;br&gt;
and it made me appreciate how much AWS has improved in terms of &lt;strong&gt;developer experience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The best part?&lt;br&gt;
If I ever decide to add more environments (like preview or experimental builds), I can just connect new branches and Route 53 will take care of the rest.&lt;/p&gt;


&lt;h2&gt;
  
  
  Lessons Learned &amp;amp; What’s Next
&lt;/h2&gt;

&lt;p&gt;Even though the final result looks clean and simple, getting there wasn’t always smooth.&lt;br&gt;
Astro is a great framework — but when you start going beyond static pages, things get a little more complex.&lt;/p&gt;
&lt;h3&gt;
  
  
  ⚠️ Working with dynamic data isn’t as straightforward as it seems
&lt;/h3&gt;

&lt;p&gt;Astro shines for static sites, but integrating &lt;strong&gt;dynamic data from APIs&lt;/strong&gt; can be tricky.&lt;br&gt;
I wanted to pull data at runtime, not just during build, and that required experimenting with different patterns — from server endpoints to hybrid rendering.&lt;/p&gt;

&lt;p&gt;There were moments where I felt like I was “fighting” the framework a bit.&lt;br&gt;
The documentation is good, but when it comes to &lt;em&gt;incremental updates&lt;/em&gt; or &lt;em&gt;live API data&lt;/em&gt;, you often need to combine several Astro concepts together to make it work smoothly.&lt;br&gt;
It’s definitely doable, but not as plug-and-play as other frameworks like Next.js.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧩 The AWS Amplify adapter still has room to grow
&lt;/h3&gt;

&lt;p&gt;Another challenging part was understanding &lt;strong&gt;how the AWS Amplify adapter actually works under the hood&lt;/strong&gt;.&lt;br&gt;
It abstracts away a lot (which is great), but when something goes wrong or you want to customize the deployment flow, it’s not always clear where to look.&lt;/p&gt;

&lt;p&gt;That curiosity led me to dig into the adapter source code — and eventually, to &lt;strong&gt;contribute directly&lt;/strong&gt; to the open-source project:&lt;br&gt;
🔗 &lt;a href="https://github.com/alexnguyennz/astro-aws-amplify" rel="noopener noreferrer"&gt;github.com/alexnguyennz/astro-aws-amplify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was a small contribution, but it helped me understand the logic behind it — and reminded me how valuable it is when developers give back to the tools they use.&lt;/p&gt;
&lt;h3&gt;
  
  
  🚀 What’s Next
&lt;/h3&gt;

&lt;p&gt;I am preparing a new special page for my website for my next secret project. 🚀🧑🏻‍🚀🦄&lt;br&gt;
Stay tuned!&lt;/p&gt;

&lt;p&gt;I forgot to write that my website is open source (because why not) and you can use it as your starting point for your personal website:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kasuken" rel="noopener noreferrer"&gt;
        kasuken
      &lt;/a&gt; / &lt;a href="https://github.com/kasuken/website" rel="noopener noreferrer"&gt;
        website
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The code for my website based on Astro.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🚀 Emanuele Bartolesi's Website&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://astro.build/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/35f117f3ea3ccee992b99b1bd729c493d685290d3647e2264147208a37fbf0f4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4275696c74253230776974682d417374726f2d4646354430313f7374796c653d666c61742d737175617265266c6f676f3d617374726f266c6f676f436f6c6f723d7768697465" alt="Built with Astro"&gt;&lt;/a&gt;
&lt;a href="https://web.dev/measure/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c640a24a2b62b1031e11a60f3b1e77040b98cdd316edc8db62463887cfe6c37c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c69676874686f7573652d3130302532463130302d737563636573733f7374796c653d666c61742d737175617265266c6f676f3d6c69676874686f757365" alt="Lighthouse Performance"&gt;&lt;/a&gt;
&lt;a href="https://www.typescriptlang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e5a7b3ae636b014ff71af3273c79b993b255659b684aee391aaacd4095537b31/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d52656164792d3331373843363f7374796c653d666c61742d737175617265266c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a href="https://aws.amazon.com/amplify/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/48496eda16c420ae96cf6ebbb4176338be1c42a021a6daecd4634a3e49f517b3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4465706c6f7965642532306f6e2d415753253230416d706c6966792d4646393930303f7374796c653d666c61742d737175617265266c6f676f3d6177732d616d706c696679266c6f676f436f6c6f723d7768697465" alt="Deployment"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A blazing-fast, modern, and SEO-optimized portfolio website showcasing expertise in software development, technical writing, speaking, and education. Built with cutting-edge web technologies and optimized for performance and accessibility.&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/2757486/496212896-aed60c4a-8195-4219-a263-9872109bc91f.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDA5MzgsIm5iZiI6MTc3NDY0MDYzOCwicGF0aCI6Ii8yNzU3NDg2LzQ5NjIxMjg5Ni1hZWQ2MGM0YS04MTk1LTQyMTktYTI2My05ODcyMTA5YmM5MWYucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyNyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjdUMTk0MzU4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NmI3ZWFmY2YzM2U1OTEyMDZmOWJiZjUzN2I0NjBkYWMyYTA5ZTZmZTdmMTM0ZWYwMmM5MWJmNTI0OGRhOTNhYyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.N8YszKkhYgYOiKdzTKpB_BwzylnnTEIZpGookJijdf4"&gt;&lt;img width="1257" height="1370" alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F2757486%2F496212896-aed60c4a-8195-4219-a263-9872109bc91f.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDA5MzgsIm5iZiI6MTc3NDY0MDYzOCwicGF0aCI6Ii8yNzU3NDg2LzQ5NjIxMjg5Ni1hZWQ2MGM0YS04MTk1LTQyMTktYTI2My05ODcyMTA5YmM5MWYucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyNyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjdUMTk0MzU4WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NmI3ZWFmY2YzM2U1OTEyMDZmOWJiZjUzN2I0NjBkYWMyYTA5ZTZmZTdmMTM0ZWYwMmM5MWJmNTI0OGRhOTNhYyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.N8YszKkhYgYOiKdzTKpB_BwzylnnTEIZpGookJijdf4"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Key Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🎯 &lt;strong&gt;Performance &amp;amp; SEO&lt;/strong&gt;
&lt;/h3&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100/100 Lighthouse Performance&lt;/strong&gt; - Optimized for speed and user experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO Optimized&lt;/strong&gt; - Canonical URLs, OpenGraph, structured data, sitemap, and RSS feed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Accessibility&lt;/strong&gt; - WCAG compliant with semantic HTML and proper ARIA labels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progressive Enhancement&lt;/strong&gt; - Works without JavaScript, enhanced with it&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🎨 &lt;strong&gt;Modern Design &amp;amp; UX&lt;/strong&gt;
&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Design&lt;/strong&gt; - Mobile-first approach, looks great on all devices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark/Light Theme Toggle&lt;/strong&gt; - Automatic system preference detection with manual override&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smooth Animations&lt;/strong&gt; - Subtle micro-interactions and hover effects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography Excellence&lt;/strong&gt; - Carefully chosen fonts and spacing for optimal readability&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;📚 &lt;strong&gt;Content Management&lt;/strong&gt;
&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Blog Integration&lt;/strong&gt; - Automatic synchronization with Dev.to articles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Books Showcase&lt;/strong&gt; - Dedicated section for published and upcoming books&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kasuken/website" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;







&lt;p&gt;🙋‍♂️ Hey, I'm Emanuele — you might know me online as &lt;strong&gt;Kasuken&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👨‍💻 Senior Cloud Engineer | Microsoft MVP (12x) | GitHub Star (4x)&lt;br&gt;&lt;br&gt;
🛠️ I build things with &lt;strong&gt;.NET&lt;/strong&gt;, &lt;strong&gt;Azure&lt;/strong&gt;, &lt;strong&gt;AI&lt;/strong&gt;, and &lt;strong&gt;GitHub&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🌈 Turning code into 🦖 and 🦄 — one commit at a time&lt;/p&gt;

&lt;p&gt;🚀 If you're into .NET, GitHub, DevOps, or just cool side projects,&lt;br&gt;&lt;br&gt;
feel free to &lt;a href="https://www.linkedin.com/in/bartolesiemanuele" rel="noopener noreferrer"&gt;connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. I break things so you don’t have to. 😉&lt;/p&gt;

</description>
      <category>astro</category>
      <category>aws</category>
      <category>githubcopilot</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🌱 Introducing Green Software Indicator: a Browser Extension for a greener web</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Tue, 30 Sep 2025 20:05:25 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/introducing-green-software-indicator-a-browser-extension-for-a-greener-web-5692</link>
      <guid>https://dev.to/playfulprogramming/introducing-green-software-indicator-a-browser-extension-for-a-greener-web-5692</guid>
      <description>&lt;p&gt;As developers, we obsess over performance, accessibility, and design — but how often do we think about the &lt;strong&gt;environmental impact of the websites we build&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;That’s why I built &lt;a href="https://chromewebstore.google.com/detail/green-software-indicator/jjmamgnpbnjgdmaocmjimhdmpbaaiamn" rel="noopener noreferrer"&gt;&lt;strong&gt;Green Software Indicator&lt;/strong&gt;&lt;/a&gt; — a simple yet powerful Chrome and Edge extension that evaluates websites for sustainable development practices in real time.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;Every time you visit a website, the extension automatically analyzes it for common &lt;strong&gt;green software best practices&lt;/strong&gt;, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Image Optimization&lt;/strong&gt; (modern formats like WebP, lazy loading)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Minified Resources&lt;/strong&gt; (compressed JS/CSS)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Server-side Compression&lt;/strong&gt; (gzip, Brotli, etc.)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Reduced HTTP Requests&lt;/strong&gt; (bundled assets, CDNs)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Energy-Efficient Design&lt;/strong&gt; (dark mode support, async scripts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It then gives a &lt;strong&gt;color-coded badge&lt;/strong&gt; (✓ Green, ~ Yellow, ✗ Red, ? Gray) and a detailed breakdown when you click the icon in your browser toolbar.&lt;/p&gt;

&lt;p&gt;&lt;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%2Fojtwmn2aez1fw7t4xuo8.png" class="article-body-image-wrapper"&gt;&lt;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%2Fojtwmn2aez1fw7t4xuo8.png" alt="Demo Screenshot" width="486" height="544"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;According to the &lt;a href="https://greensoftware.foundation/" rel="noopener noreferrer"&gt;Green Software Foundation&lt;/a&gt;, software contributes significantly to global carbon emissions — from data transfer and rendering to power usage on user devices.&lt;/p&gt;

&lt;p&gt;Small optimizations in your frontend code — like compressing images or enabling dark mode — can &lt;strong&gt;actually reduce electricity consumption&lt;/strong&gt; at scale.&lt;/p&gt;

&lt;p&gt;Green Software Indicator is a gentle reminder of how our decisions as developers have real-world consequences.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Try It Now
&lt;/h2&gt;

&lt;p&gt;You can install the extension from either store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌍 &lt;a href="https://chromewebstore.google.com/detail/green-software-indicator/jjmamgnpbnjgdmaocmjimhdmpbaaiamn" rel="noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧭 &lt;a href="https://microsoftedge.microsoft.com/addons/detail/green-software-indicator/hhmniibkpedbpnjlhgakkbokccnleomb" rel="noopener noreferrer"&gt;Microsoft Edge Add-ons&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No login. Just browse and click.&lt;/p&gt;




&lt;h2&gt;
  
  
  💚 Looking for Contributors!
&lt;/h2&gt;

&lt;p&gt;This is a &lt;strong&gt;community-first project&lt;/strong&gt;. The repo is open source:&lt;br&gt;
👉 &lt;a href="https://github.com/kasuken/green-software-indicator" rel="noopener noreferrer"&gt;https://github.com/kasuken/green-software-indicator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s how you can help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improve or add new evaluation criteria (e.g., WebAssembly, power hints)&lt;/li&gt;
&lt;li&gt;Enhance performance analysis&lt;/li&gt;
&lt;li&gt;UX/UI feedback for the popup interface&lt;/li&gt;
&lt;li&gt;Translate the UI to other languages&lt;/li&gt;
&lt;li&gt;Spread the word — share with friends &amp;amp; colleagues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even small contributions matter. Let’s build a more sustainable web.&lt;/p&gt;




&lt;p&gt;🔖 Stay ahead of the dev curve&lt;br&gt;
I created a Curated RSS Feed Bundle for Web Developers — a hand-picked OPML file of the best dev blogs and websites on the internet.&lt;br&gt;
💡 Just download, import into your favorite RSS reader (like Feedly or NetNewsWire), and enjoy fresh insights every day.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://emanuelebartolesi.gumroad.com/l/rssfeeds" rel="noopener noreferrer"&gt;Grab it on Gumroad&lt;/a&gt; — stay sharp without the noise.&lt;/p&gt;

</description>
      <category>browser</category>
      <category>extensions</category>
    </item>
    <item>
      <title>Weekly 0087</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Mon, 08 Sep 2025 19:20:08 +0000</pubDate>
      <link>https://dev.to/kasuken/weekly-0087-4l3d</link>
      <guid>https://dev.to/kasuken/weekly-0087-4l3d</guid>
      <description>&lt;h1&gt;
  
  
  From Migrations to Marketplace 🚀
&lt;/h1&gt;

&lt;p&gt;This week was a mix of heavy-duty migration testing, customer work on CI/CD, and a personal milestone: publishing my new VS Code extension! Some days were long (hello, 14-hour Tuesday 😅), but wrapping up with DropComments going live on the Marketplace made it worth it.&lt;/p&gt;




&lt;h3&gt;
  
  
  Monday
&lt;/h3&gt;

&lt;p&gt;I spent the entire day testing my custom tool for migrating from Perforce to Git. It’s one of those tasks that requires full focus and endless trial runs, but slowly things are taking shape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mood:&lt;/strong&gt; Focused but drained 🛠️😓&lt;/p&gt;




&lt;h3&gt;
  
  
  Tuesday
&lt;/h3&gt;

&lt;p&gt;Another full day of testing the migration tool — and when I say full, I mean 14 hours straight. It’s time-consuming, repetitive, and occasionally frustrating, but I know this groundwork is essential to making the process smooth for future migrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mood:&lt;/strong&gt; Exhausted but determined 💪😴&lt;/p&gt;




&lt;h3&gt;
  
  
  Wednesday
&lt;/h3&gt;

&lt;p&gt;Shifted gears a bit to work on a CI/CD implementation analysis for a customer, preparing some slides to explain the approach. Later, I joined our monthly team meeting where everyone shared project updates and ongoing initiatives — always nice to get a pulse on what others are doing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mood:&lt;/strong&gt; Balanced and collaborative 🤝🙂&lt;/p&gt;




&lt;h3&gt;
  
  
  Thursday
&lt;/h3&gt;

&lt;p&gt;Big day! I officially published my &lt;strong&gt;DropComments extension&lt;/strong&gt; on the VS Code Marketplace 🎉&lt;br&gt;
👉 &lt;a href="https://marketplace.visualstudio.com/items?itemName=emanuelebartolesi.dropcomments" rel="noopener noreferrer"&gt;DropComments - Visual Studio Marketplace&lt;/a&gt;&lt;br&gt;
👉 Source repo: &lt;a href="https://github.com/kasuken/DropComments" rel="noopener noreferrer"&gt;kasuken/DropComments&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In between the excitement, I continued my work on the CI/CD analysis and built more slides for the customer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mood:&lt;/strong&gt; Proud and motivated 🚀😎&lt;/p&gt;




&lt;h3&gt;
  
  
  Friday
&lt;/h3&gt;

&lt;p&gt;Closed the week by fixing some slides for today’s customer presentation and sneaking in a bit of extra work on DropComments. A nice way to tie together customer needs with personal projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mood:&lt;/strong&gt; Productive and satisfied ✅😊&lt;/p&gt;




&lt;p&gt;That’s it for this week — a rollercoaster of testing marathons, customer work, and a shiny new extension launch. See you next week for more updates!&lt;/p&gt;




&lt;p&gt;🙋‍♂️ Hey, I'm Emanuele — you might know me online as &lt;strong&gt;Kasuken&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👨‍💻 Senior Cloud Engineer | Microsoft MVP | GitHub Star&lt;br&gt;&lt;br&gt;
🛠️ I build things with &lt;strong&gt;.NET&lt;/strong&gt;, &lt;strong&gt;Azure&lt;/strong&gt;, &lt;strong&gt;AI&lt;/strong&gt;, and &lt;strong&gt;GitHub&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🌈 Turning code into 🦖 and 🦄 — one commit at a time&lt;/p&gt;

&lt;p&gt;🚀 If you're into .NET, GitHub, DevOps, or just cool side projects,&lt;br&gt;&lt;br&gt;
feel free to &lt;a href="https://www.linkedin.com/in/bartolesiemanuele" rel="noopener noreferrer"&gt;connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. I break things so you don’t have to. 😉&lt;/p&gt;

</description>
      <category>weeklyretro</category>
    </item>
    <item>
      <title>✨ Advanced Tips and Tricks for GitHub Gists (Part 1: Unlocking the Power of Gists)</title>
      <dc:creator>Emanuele Bartolesi</dc:creator>
      <pubDate>Fri, 05 Sep 2025 06:05:12 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/advanced-tips-and-tricks-for-github-gists-part-1-unlocking-the-power-of-gists-22h5</link>
      <guid>https://dev.to/playfulprogramming/advanced-tips-and-tricks-for-github-gists-part-1-unlocking-the-power-of-gists-22h5</guid>
      <description>&lt;p&gt;If you’ve been coding for a while, chances are you’ve stumbled across a GitHub Gist. Maybe you copied a handy Bash script, or saved a quick snippet for later. Most developers think of Gists as “just pastebins with syntax highlighting” — but they’re way more powerful than that.&lt;/p&gt;

&lt;p&gt;In this series, we’ll dive into advanced tips and tricks that transform Gists into &lt;strong&gt;mini-repositories, collaboration hubs, and personal knowledge bases&lt;/strong&gt;. Whether you use them to share snippets, automate workflows, or even host JSON data, you’ll discover that Gists are one of GitHub’s most underrated features.&lt;/p&gt;

&lt;p&gt;I use them for everything!&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Part 1&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Gists are more powerful than you think&lt;/li&gt;
&lt;li&gt;How to organize them like a pro&lt;/li&gt;
&lt;li&gt;The hidden superpower: forking and cloning Gists&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔑 Why Gists Are More Powerful Than You Think
&lt;/h2&gt;

&lt;p&gt;At their core, Gists are just Git repositories. That means all the goodness of version control — commits, history, forks, and clones — is baked in. But since most people only interact with them via the web UI, they miss out on this power.&lt;/p&gt;

&lt;p&gt;Here are a few things many developers don’t realize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public vs Secret Gists&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Public Gists are searchable and indexable — great for sharing snippets with the world.&lt;/li&gt;
&lt;li&gt;Secret Gists are “unlisted,” not truly private. Anyone with the link can access them, so treat them like a hidden blog post, not a secure vault.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;When to use Gists instead of repos&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Gists for&lt;/strong&gt;: quick snippets, single scripts, throwaway demos, dotfile sharing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use repos for&lt;/strong&gt;: projects that need issues, CI/CD, or multiple contributors.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;They’re versioned&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Every time you edit a Gist, GitHub keeps a full version history. You can roll back to earlier states, just like with a normal repo.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Think of Gists as &lt;strong&gt;lightweight repos&lt;/strong&gt;: perfect for experiments, one-off utilities, or sharing knowledge without the overhead of a full project.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗂 Organize Gists Like a Pro
&lt;/h2&gt;

&lt;p&gt;One of the biggest misconceptions about Gists is that they’re only good for single-file snippets. In reality, Gists can hold &lt;strong&gt;multiple files&lt;/strong&gt;, complete with meaningful names and descriptions — making them feel almost like mini-repositories.&lt;/p&gt;

&lt;p&gt;Here are some ways to keep your Gists tidy and useful:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Use Multi-File Gists
&lt;/h3&gt;

&lt;p&gt;Did you know you can add more than one file to a Gist? This is great for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeping related scripts together (e.g., a &lt;code&gt;Dockerfile&lt;/code&gt; + &lt;code&gt;docker-compose.yml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Sharing a working demo with config + code in one place&lt;/li&gt;
&lt;li&gt;Writing a “mini tutorial” where each file represents a step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Example: A Python script with a separate &lt;code&gt;requirements.txt&lt;/code&gt; file inside the same Gist.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Naming Conventions Matter
&lt;/h3&gt;

&lt;p&gt;Don’t settle for &lt;code&gt;script.js&lt;/code&gt; or &lt;code&gt;test.ps1&lt;/code&gt;. The others will thank you if you use &lt;strong&gt;descriptive file names&lt;/strong&gt;, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;azure-cleanup.ps1&lt;/code&gt; instead of &lt;code&gt;script.ps1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jwt-validator.cs&lt;/code&gt; instead of &lt;code&gt;Program.cs&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes your Gists more searchable and recognizable when embedded elsewhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Treat the Description Like a README
&lt;/h3&gt;

&lt;p&gt;The description is often overlooked, but it’s the &lt;strong&gt;first thing people see&lt;/strong&gt;. Use it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explain what the snippet does&lt;/li&gt;
&lt;li&gt;Add quick usage instructions&lt;/li&gt;
&lt;li&gt;Drop in keywords (so your Gist shows up in GitHub search)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“PowerShell script to clean up unused Azure resource groups. Run with ./azure-cleanup.ps1.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. Pseudo-Tags in Descriptions
&lt;/h3&gt;

&lt;p&gt;Gists don’t have official tagging, but you can fake it. By adding hashtags in your description (&lt;code&gt;#python #azure #automation&lt;/code&gt;), you make them easier to search later — both for you and anyone browsing.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔀 Forking and Cloning Gists (The Hidden Superpower)
&lt;/h2&gt;

&lt;p&gt;Here’s a secret most developers don’t know: &lt;strong&gt;every Gist is a Git repository under the hood.&lt;/strong&gt; That means you can fork, clone, commit, and push just like you would with any other repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Fork a Gist to Build on It
&lt;/h3&gt;

&lt;p&gt;If you find a useful snippet but want to tweak it without affecting the original, hit &lt;strong&gt;“Fork”&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This creates your own copy, linked back to the original.&lt;/li&gt;
&lt;li&gt;It’s perfect for bug fixes, feature improvements, or adapting scripts to your own setup.&lt;/li&gt;
&lt;li&gt;Bonus: others can discover your fork and use it, too.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Clone a Gist Locally
&lt;/h3&gt;

&lt;p&gt;Just like any repo, you can clone a Gist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://gist.github.com/&amp;lt;gist-id&amp;gt;.git

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have the Gist on your machine. From here you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edit with your favorite IDE&lt;/li&gt;
&lt;li&gt;Create branches for experiments&lt;/li&gt;
&lt;li&gt;Commit and push changes back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://gist.github.com/123abc456def.git
&lt;span class="nb"&gt;cd &lt;/span&gt;123abc456def
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; add-logging
&lt;span class="c"&gt;# make edits&lt;/span&gt;
git commit &lt;span class="nt"&gt;-am&lt;/span&gt; &lt;span class="s2"&gt;"Added logging for better debugging"&lt;/span&gt;
git push origin add-logging

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Treat Gists Like Mini Repos
&lt;/h3&gt;

&lt;p&gt;Once cloned, Gists behave almost identically to standard repositories. You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;git log&lt;/code&gt; to inspect history&lt;/li&gt;
&lt;li&gt;Branch for different variations of a snippet&lt;/li&gt;
&lt;li&gt;Collaborate by sharing forks and diffs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes Gists a hidden gem for &lt;strong&gt;lightweight collaboration&lt;/strong&gt; — no need to spin up a full repo for a tiny script.&lt;/p&gt;




&lt;p&gt;🙋‍♂️ Hey, I'm Emanuele — you might know me online as &lt;strong&gt;Kasuken&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👨‍💻 Senior Cloud Engineer | Microsoft MVP | GitHub Star&lt;br&gt;&lt;br&gt;
🛠️ I build things with &lt;strong&gt;.NET&lt;/strong&gt;, &lt;strong&gt;Azure&lt;/strong&gt;, &lt;strong&gt;AI&lt;/strong&gt;, and &lt;strong&gt;GitHub&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🌈 Turning code into 🦖 and 🦄 — one commit at a time&lt;/p&gt;

&lt;p&gt;🚀 If you're into .NET, GitHub, DevOps, or just cool side projects,&lt;br&gt;&lt;br&gt;
feel free to &lt;a href="https://www.linkedin.com/in/bartolesiemanuele" rel="noopener noreferrer"&gt;connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. I break things so you don’t have to. 😉&lt;/p&gt;

</description>
      <category>github</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
