<?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: Phuc (Felix) Bui</title>
    <description>The latest articles on DEV Community by Phuc (Felix) Bui (@phuc).</description>
    <link>https://dev.to/phuc</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%2F500232%2F49bebb51-4b6f-468f-931f-52ed50be3068.jpeg</url>
      <title>DEV Community: Phuc (Felix) Bui</title>
      <link>https://dev.to/phuc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/phuc"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Phuc (Felix) Bui</dc:creator>
      <pubDate>Mon, 30 Jun 2025 10:49:47 +0000</pubDate>
      <link>https://dev.to/phuc/-klp</link>
      <guid>https://dev.to/phuc/-klp</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/phuc/i-was-tired-of-manually-tracking-my-github-repos-3b67" class="crayons-story__hidden-navigation-link"&gt;I Was Tired of Manually Tracking My GitHub Repos&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 href="/phuc" class="crayons-avatar  crayons-avatar--l  "&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%2F500232%2F49bebb51-4b6f-468f-931f-52ed50be3068.jpeg" alt="phuc profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/phuc" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Phuc (Felix) Bui
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Phuc (Felix) Bui
                
              
              &lt;div id="story-author-preview-content-2632028" 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="/phuc" 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%2F500232%2F49bebb51-4b6f-468f-931f-52ed50be3068.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Phuc (Felix) Bui&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;/div&gt;
          &lt;a href="https://dev.to/phuc/i-was-tired-of-manually-tracking-my-github-repos-3b67" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 28 '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/phuc/i-was-tired-of-manually-tracking-my-github-repos-3b67" id="article-link-2632028"&gt;
          I Was Tired of Manually Tracking My GitHub Repos
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/claudeai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;claudeai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/vibecoding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;vibecoding&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/phuc/i-was-tired-of-manually-tracking-my-github-repos-3b67" 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/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/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&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/phuc/i-was-tired-of-manually-tracking-my-github-repos-3b67#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              6&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;
            3 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;


</description>
      <category>github</category>
      <category>opensource</category>
      <category>claudeai</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>🚀 Stop Copy-Pasting NPM Publish Workflows - I Built a Reusable GitHub Action</title>
      <dc:creator>Phuc (Felix) Bui</dc:creator>
      <pubDate>Mon, 30 Jun 2025 10:39:31 +0000</pubDate>
      <link>https://dev.to/phuc/stop-copy-pasting-npm-publish-workflows-i-built-a-reusable-github-action-46gi</link>
      <guid>https://dev.to/phuc/stop-copy-pasting-npm-publish-workflows-i-built-a-reusable-github-action-46gi</guid>
      <description>&lt;p&gt;Ever find yourself copying the same GitHub Actions workflow across multiple npm packages? I got tired of maintaining duplicate publishing workflows, so I built a reusable action that handles it all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem 😤
&lt;/h2&gt;

&lt;p&gt;I was copy-pasting this same workflow across 10+ repositories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setup Node.js and PNPM&lt;/li&gt;
&lt;li&gt;Run tests (if they exist)&lt;/li&gt;
&lt;li&gt;Update package.json version&lt;/li&gt;
&lt;li&gt;Build the package&lt;/li&gt;
&lt;li&gt;Publish to NPM&lt;/li&gt;
&lt;li&gt;Commit changes back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every time I wanted to improve the workflow, I had to update it in multiple repos. Not fun!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution ✨
&lt;/h2&gt;

&lt;p&gt;I created &lt;strong&gt;&lt;a href="https://github.com/marketplace/actions/publish-npm-package-on-release" rel="noopener noreferrer"&gt;Publish NPM Action&lt;/a&gt;&lt;/strong&gt; - a single reusable action that handles the entire npm publishing pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🧪 &lt;strong&gt;Smart testing&lt;/strong&gt; - Automatically detects and runs tests&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Version sync&lt;/strong&gt; - Updates package.json with your release tag&lt;/li&gt;
&lt;li&gt;🏗️ &lt;strong&gt;Flexible building&lt;/strong&gt; - Works with any build system&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Git integration&lt;/strong&gt; - Commits build files back to your repo&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;Secure publishing&lt;/strong&gt; - Handles NPM authentication safely&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Usage - Dead Simple 💫
&lt;/h2&gt;

&lt;p&gt;Just create &lt;code&gt;.github/workflows/publish.yml&lt;/code&gt;:&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish on Release&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
  &lt;span class="na"&gt;packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;publish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
          &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish NPM Package&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;phucbm/publish-npm-action@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;npm-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.NPM_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Create a release, and your package automatically publishes to NPM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Configuration 🛠️
&lt;/h2&gt;

&lt;p&gt;Need customization? The action is highly configurable:&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="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish NPM Package&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;phucbm/publish-npm-action@v1&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;npm-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.NPM_TOKEN }}&lt;/span&gt;
    &lt;span class="c1"&gt;# node-version: '20'                               # Node.js version, default is '18'&lt;/span&gt;
    &lt;span class="c1"&gt;# build-command: 'npm run build:prod'              # Build command, default is 'pnpm build'&lt;/span&gt;
    &lt;span class="c1"&gt;# output-dir: 'build/'                             # Output directory, default is 'dist/'&lt;/span&gt;
    &lt;span class="c1"&gt;# target-branch: 'develop'                         # Target branch, default is 'main'&lt;/span&gt;
    &lt;span class="c1"&gt;# skip-tests: 'true'                               # Skip tests, default is 'false'&lt;/span&gt;
    &lt;span class="c1"&gt;# commit-files: 'CHANGELOG.md docs/ types/'        # Additional files to commit, default is ''&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect for different project setups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React apps&lt;/strong&gt;: &lt;code&gt;output-dir: 'build/'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript libs&lt;/strong&gt;: &lt;code&gt;commit-files: 'types/'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monorepos&lt;/strong&gt;: Custom build commands and paths&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Benefits 🎯
&lt;/h2&gt;

&lt;p&gt;Since switching to this action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;15-line workflows&lt;/strong&gt; instead of 80+ lines&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Centralized updates&lt;/strong&gt; - improve once, benefits everywhere&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Zero maintenance&lt;/strong&gt; per repository&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Consistent publishing&lt;/strong&gt; across all projects&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Less copy-paste errors&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Setup Guide 📋
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add NPM token&lt;/strong&gt; to GitHub Secrets as &lt;code&gt;NPM_TOKEN&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy the workflow&lt;/strong&gt; above to &lt;code&gt;.github/workflows/publish.yml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a release&lt;/strong&gt; with semantic versioning (e.g., &lt;code&gt;v1.2.3&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the magic&lt;/strong&gt; happen! 🪄&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The action handles everything: tests, builds, version updates, and publishing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Out! 🚀
&lt;/h2&gt;

&lt;p&gt;The action is available on the &lt;a href="https://github.com/marketplace/actions/publish-npm-package-on-release" rel="noopener noreferrer"&gt;GitHub Marketplace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have feedback or feature requests? Drop them in the &lt;a href="https://github.com/phucbm/publish-npm-action" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your npm publishing workflow like? Have you automated it?&lt;/strong&gt; Drop a comment below! 👇&lt;/p&gt;

</description>
      <category>github</category>
      <category>npm</category>
      <category>automation</category>
      <category>workflow</category>
    </item>
    <item>
      <title>I Was Tired of Manually Tracking My GitHub Repos</title>
      <dc:creator>Phuc (Felix) Bui</dc:creator>
      <pubDate>Sat, 28 Jun 2025 01:58:42 +0000</pubDate>
      <link>https://dev.to/phuc/i-was-tired-of-manually-tracking-my-github-repos-3b67</link>
      <guid>https://dev.to/phuc/i-was-tired-of-manually-tracking-my-github-repos-3b67</guid>
      <description>&lt;p&gt;Picture this: You're maintaining 20+ GitHub repositories. You want to check which ones are getting stars, which have open issues that need attention, and maybe see how your overall portfolio is performing.&lt;/p&gt;

&lt;p&gt;So you open GitHub... click on repo 1... check stars... back button... repo 2... check issues... back button...&lt;/p&gt;

&lt;p&gt;Yeah, that was my Friday night routine. &lt;strong&gt;Terrible.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Aha!" Moment (And My AI Pair Programming Session)
&lt;/h2&gt;

&lt;p&gt;I was staring at a Google Sheet for work when it hit me: &lt;em&gt;What if I could just pull all my GitHub data directly into a spreadsheet?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Perfect time for some &lt;strong&gt;vibe coding&lt;/strong&gt;. I fired up Claude AI and we started brainstorming. Google Sheets has Apps Script (basically JavaScript), GitHub has an API, and I had a Friday night free. &lt;strong&gt;Perfect storm.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What started as a simple idea quickly evolved into something way more powerful thanks to Claude's suggestions - rate limiting, error handling, beautiful formatting, even a roadmap for future features.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built: GitSheet
&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%2Fvubv3alevrivbfoq8jp5.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%2Fvubv3alevrivbfoq8jp5.gif" alt="gitsheet results" width="600" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitSheet automatically fetches ALL your public repositories and displays:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ Stars, forks, watchers&lt;/li&gt;
&lt;li&gt;🐛 Open issues (separate from PRs!)&lt;/li&gt;
&lt;li&gt;🔄 Open pull requests
&lt;/li&gt;
&lt;li&gt;📋 License info, language, size&lt;/li&gt;
&lt;li&gt;📅 Creation and update dates&lt;/li&gt;
&lt;li&gt;🍴 Fork detection&lt;/li&gt;
&lt;li&gt;🔗 Direct links to each repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The best part?&lt;/strong&gt; One button click updates everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Approach
&lt;/h2&gt;

&lt;p&gt;Here's the basic flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Apps Script calls GitHub API&lt;/strong&gt; to get user repositories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parse and clean the data&lt;/strong&gt; (GitHub mixes issues with PRs, so I separate them)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Populate Google Sheets&lt;/strong&gt; with beautiful formatting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add progress indicators&lt;/strong&gt; because waiting is less painful with feedback
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified version of the core function&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getGitHubStats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://api.github.com/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/repos`&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UrlFetchApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&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;repos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContentText&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

  &lt;span class="c1"&gt;// Process and format data&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stargazers_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forks_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// ... more fields&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;h2&gt;
  
  
  The Cool Technical Bits
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Smart Rate Limiting:&lt;/strong&gt; GitHub API has limits, so I added delays between requests and batch processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue vs PR Separation:&lt;/strong&gt; GitHub's API counts PRs as issues. I make separate calls to get accurate counts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error Handling:&lt;/strong&gt; If one repo fails, the script continues with the others. No total failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beautiful Formatting:&lt;/strong&gt; Auto-sizing columns, number formatting, alternating row colors. It looks &lt;em&gt;professional&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Google Sheets Though?
&lt;/h2&gt;

&lt;p&gt;I considered building a web app, but Google Sheets has some serious advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero hosting costs&lt;/strong&gt; 💰&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Familiar interface&lt;/strong&gt; - everyone knows spreadsheets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in features&lt;/strong&gt; - sorting, filtering, charts, export&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharing capabilities&lt;/strong&gt; - send read-only copies to team members&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile access&lt;/strong&gt; - works on phones automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus, you can create pivot tables, charts, and do analysis without writing more code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Template Effect"
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting. I can share this as a Google Sheets template. Anyone can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy my template&lt;/li&gt;
&lt;li&gt;Change the username to theirs&lt;/li&gt;
&lt;li&gt;Hit "update"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boom&lt;/strong&gt; - instant GitHub analytics&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No installation, no signup, no configuration. Just copy and go.&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%2Fbii5gsk6rr5ifr6yh7wy.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%2Fbii5gsk6rr5ifr6yh7wy.gif" alt="setup process" width="720" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Version 1.0 is read-only, but I'm already thinking about v2.0:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write operations&lt;/strong&gt; - edit repo descriptions directly in the sheet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulk tag management&lt;/strong&gt; - update topics across multiple repos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical tracking&lt;/strong&gt; - see how your repos grow over time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team features&lt;/strong&gt; - track organization repositories&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;If you want to give GitSheet a shot:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://docs.google.com/spreadsheets/d/1yDYncOyZMl9EgtafObJzCeg7FK4h5qTmEUhycpOi6zo" rel="noopener noreferrer"&gt;View the template&lt;/a&gt; (you can see my actual data)&lt;/li&gt;
&lt;li&gt;File → Make a copy&lt;/li&gt;
&lt;li&gt;Follow the simple setup instructions&lt;/li&gt;
&lt;li&gt;Watch your GitHub stats populate automatically&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole setup takes about 30 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vibe coding with AI is incredibly productive.&lt;/strong&gt; Having Claude as a coding partner meant I could focus on the vision while getting help with implementation details, error handling, and even product strategy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Sheets is more powerful than you think.&lt;/strong&gt; Apps Script turns it into a legitimate development platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APIs + Spreadsheets = Magic.&lt;/strong&gt; This combination unlocks so many possibilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple solutions win.&lt;/strong&gt; I could have built a complex web app, but a spreadsheet does everything I need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Templates are viral.&lt;/strong&gt; Making something easily copyable dramatically increases adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Win
&lt;/h2&gt;

&lt;p&gt;The real satisfaction isn't the stars or the technical achievement. It's opening one tab, seeing all my repositories at a glance, and immediately knowing which ones need attention.&lt;/p&gt;

&lt;p&gt;No more tab switching. No more manual checking. Just data, beautifully organized, updating with one click.&lt;/p&gt;

&lt;p&gt;Sometimes the best solutions are the simplest ones.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What do you think?&lt;/strong&gt; Have you built anything similar? What's your favorite "simple solution to an annoying problem" project?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;P.S. - The code is open source if you want to peek under the hood or contribute features!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>claudeai</category>
      <category>vibecoding</category>
    </item>
  </channel>
</rss>
