<?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: Raja Irfan Ahmed</title>
    <description>The latest articles on DEV Community by Raja Irfan Ahmed (@rajairfanahmed).</description>
    <link>https://dev.to/rajairfanahmed</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%2F3923274%2F96aa98fc-dfb5-4efb-9720-41a8f300b68a.png</url>
      <title>DEV Community: Raja Irfan Ahmed</title>
      <link>https://dev.to/rajairfanahmed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rajairfanahmed"/>
    <language>en</language>
    <item>
      <title>I Built a GitHub Achievement Automation Toolkit (CLI + Local Dashboard)</title>
      <dc:creator>Raja Irfan Ahmed</dc:creator>
      <pubDate>Sun, 10 May 2026 13:10:46 +0000</pubDate>
      <link>https://dev.to/rajairfanahmed/i-built-a-github-achievement-automation-toolkit-cli-local-dashboard-22im</link>
      <guid>https://dev.to/rajairfanahmed/i-built-a-github-achievement-automation-toolkit-cli-local-dashboard-22im</guid>
      <description>&lt;p&gt;Have you ever looked at a GitHub profile and wondered how people get badges like Pull Shark, Galaxy Brain, and Quickdraw?? If so, this post is for you.&lt;/p&gt;

&lt;p&gt;I created a toolkit that automates GitHub achievement tasks. You can use it from your terminal or a local browser dashboard. No cloud, no third-party service; your tokens stay on your machine.&lt;/p&gt;




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

&lt;p&gt;The toolkit handles the repetitive GitHub actions that trigger achievement milestones&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pair Extraordinaire — co-authored commits on merged PRs (tiers: 1 / 10 / 24 / 48)&lt;/li&gt;
&lt;li&gt;Pull Shark — merged pull requests (tiers: 2 / 16 / 128 / 1024)&lt;/li&gt;
&lt;li&gt;Galaxy Brain — accepted answers in Discussions (tiers: 2 / 8 / 16 / 32)&lt;/li&gt;
&lt;li&gt;Quickdraw — close an issue within 5 minutes (single tier)&lt;/li&gt;
&lt;li&gt;YOLO — merge a PR without a code review (single tier)&lt;/li&gt;
&lt;li&gt;Starstruck — star milestones on one repository (tiers: 16 / 128 / 512 / 4096)&lt;/li&gt;
&lt;li&gt;Public Sponsor — verifies your public sponsorship status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You run it from the CLI or the dashboard. It checks your GitHub REST rate limit first. Then, it uses delays and controls to avoid throttling. It also shows the API reset ETA live.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two Modes
&lt;/h2&gt;

&lt;p&gt;CLI (&lt;code&gt;npm start&lt;/code&gt;) — Terminal menus powered by Ink. Use them for setup, running achievements, checking status, and repo helpers.&lt;/p&gt;

&lt;p&gt;Dashboard (&lt;code&gt;npm run web:dev&lt;/code&gt;) — A local Next.js app (port 3000) with four tabs&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tab&lt;/th&gt;
&lt;th&gt;What it shows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overview&lt;/td&gt;
&lt;td&gt;.env check, token validity, repo access, Discussions status, rate limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Achievements&lt;/td&gt;
&lt;td&gt;Pick a tier, hit Run or Resume — one job is active at a time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;History&lt;/td&gt;
&lt;td&gt;Paginated local log with links to GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Settings&lt;/td&gt;
&lt;td&gt;Env summary (no secrets shown)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "Stop run" button is cooperative. It waits for the current GitHub request to finish before stopping. No hard kills, no broken states.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works (Two Accounts Required)
&lt;/h2&gt;

&lt;p&gt;You need two GitHub accounts: a main account (where the badges appear) and a helper account (acts as the second party for co-authoring, PR reviews, discussion answers, etc.).&lt;/p&gt;

&lt;p&gt;The main account owns a test repository. The team adds the helper as a collaborator with write access. Each account gets its own Personal Access Token (classic).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ghp_your_main_account_token
&lt;span class="nv"&gt;GITHUB_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-main-username
&lt;span class="nv"&gt;TARGET_REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-main-username/your-test-repo-name
&lt;span class="nv"&gt;HELPER_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ghp_your_helper_account_token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both tokens stay in a &lt;code&gt;.env&lt;/code&gt; file on your machine; never committed, never sent anywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Setup (4 Steps)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Part A — Main account + test repo&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new repo under your main account&lt;/li&gt;
&lt;li&gt;Enable Discussions: Repo Settings → General → Features → Discussions (needed for Galaxy Brain)&lt;/li&gt;
&lt;li&gt;Note your &lt;code&gt;TARGET_REPO&lt;/code&gt; as &lt;code&gt;username/repo-name&lt;/code&gt; (not the full URL)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Part B — Helper account + collaborator invite&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in as your helper account&lt;/li&gt;
&lt;li&gt;From your main account: repo Settings → Collaborators → invite the helper with write access&lt;/li&gt;
&lt;li&gt;Accept the invite from the helper account&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Part C — Generate tokens&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Main account token: scope &lt;code&gt;repo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Helper account token: scopes &lt;code&gt;repo&lt;/code&gt; + &lt;code&gt;write:discussion&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Part D — Install and run&lt;/strong&gt;&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://github.com/rajairfanahmed/github-achievement-unlocker-badge-automation-toolkit
&lt;span class="nb"&gt;cd &lt;/span&gt;github-achievement-unlocker-badge-automation-toolkit
npm &lt;span class="nb"&gt;install&lt;/span&gt;      &lt;span class="c"&gt;# automatically creates .env from .env.example&lt;/span&gt;
&lt;span class="c"&gt;# fill in your .env values&lt;/span&gt;
npm start        &lt;span class="c"&gt;# CLI&lt;/span&gt;
npm run web:dev  &lt;span class="c"&gt;# Dashboard at localhost:3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  A Note on Public Sponsor and Starstruck
&lt;/h2&gt;

&lt;p&gt;We manage these two in distinct ways. The tool does not provide hacks or shortcuts for them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public Sponsor&lt;/strong&gt; — You sponsor on GitHub first (real sponsorship). The tool only verifies your account's public sponsor state afterward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starstruck&lt;/strong&gt; — Requires real stars from real users. The tool can poll your star count and help you track progress, but the stars have to be genuine.&lt;/p&gt;




&lt;h2&gt;
  
  
  Local State, Not GitHub State
&lt;/h2&gt;

&lt;p&gt;The system saves progress to &lt;code&gt;achievements-data-&amp;lt;username&amp;gt;.json&lt;/code&gt; in the project root. Git has ignored this file. It tracks local operation history and tier progress. It does not interact with GitHub's badge system in a direct manner. GitHub awards badges on its end based on the actual actions performed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Wrong&lt;/th&gt;
&lt;th&gt;Right&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TARGET_REPO=https://github.com/user/repo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TARGET_REPO=user/repo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same token for both accounts&lt;/td&gt;
&lt;td&gt;Separate tokens, separate accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helper invited but invite not accepted&lt;/td&gt;
&lt;td&gt;Helper must accept the invite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;GITHUB_TOKEN="ghp_..."&lt;/code&gt; with quotes&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;GITHUB_TOKEN=ghp_...&lt;/code&gt; without quotes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Built On
&lt;/h2&gt;

&lt;p&gt;This project is based on and improved from the original work by &lt;a href="https://github.com/n0/GitHub-Achievement-CLI" rel="noopener noreferrer"&gt;n0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This version includes several updates&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A local Next.js dashboard&lt;/li&gt;
&lt;li&gt;A live rate limit display&lt;/li&gt;
&lt;li&gt;Achievement cards with tier protection (finished tiers can't be rerun)&lt;/li&gt;
&lt;li&gt;Cooperative stop behavior&lt;/li&gt;
&lt;li&gt;History pagination&lt;/li&gt;
&lt;li&gt;Post-install bootstrap for .env&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 18+&lt;/li&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;Two GitHub accounts&lt;/li&gt;
&lt;li&gt;A test repository owned by the main account&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Repo
&lt;/h2&gt;

&lt;p&gt;Everything is open source. Check the setup guide, the &lt;code&gt;.env.example&lt;/code&gt;, and the dashboard at:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/rajairfanahmed/github-achievement-unlocker-badge-automation-toolkit" rel="noopener noreferrer"&gt;github.com/rajairfanahmed/github-achievement-unlocker-badge-automation-toolkit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this saves you time, drop a star — it helps others find it.&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🚀I Built a Chrome Extension That Runs Entire Coursera Courses on Autopilot</title>
      <dc:creator>Raja Irfan Ahmed</dc:creator>
      <pubDate>Sun, 10 May 2026 12:54:38 +0000</pubDate>
      <link>https://dev.to/rajairfanahmed/i-built-a-chrome-extension-that-runs-entire-coursera-courses-on-autopilot-3cmi</link>
      <guid>https://dev.to/rajairfanahmed/i-built-a-chrome-extension-that-runs-entire-coursera-courses-on-autopilot-3cmi</guid>
      <description>&lt;p&gt;🚀 I Built a Chrome Extension That Automates Entire Coursera Courses&lt;/p&gt;

&lt;p&gt;If you have ever taken a course on Coursera, you know the routine.&lt;/p&gt;

&lt;p&gt;Play a video. Wait. Click next. Open a reading. Mark it complete. Start a quiz. Repeat&lt;/p&gt;

&lt;p&gt;After a while, it doesn’t feel like learning — it feels like doing the same actions again and again.&lt;/p&gt;

&lt;p&gt;So I decided to build something for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;💡 The Idea&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I didn’t want a small automation script.&lt;/p&gt;

&lt;p&gt;I needed a tool that could manage a whole course from beginning to end. I wanted it to work without needing me to intervene all the time.&lt;/p&gt;

&lt;p&gt;Something that could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. Navigate through lessons without manual input.&lt;/li&gt;
&lt;li&gt;2. Handle videos, readings, and quizzes&lt;/li&gt;
&lt;li&gt;3. And continue running without breaking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A one-click autopilot specifically designed for managing courses.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;⚙️ What It Does?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once you start it, the extension takes over.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎬 Plays videos with automatic playback and speed control.&lt;/li&gt;
&lt;li&gt;⏭ Moves to the next lesson when done&lt;/li&gt;
&lt;li&gt;📖 Marks readings as complete&lt;/li&gt;
&lt;li&gt;🧠 Solves quizzes using AI&lt;/li&gt;
&lt;li&gt;🔁 Keeps progressing until the course is finished&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need to keep clicking anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;🧠 AI Quiz Solving&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This was the most interesting part to build.&lt;/p&gt;

&lt;p&gt;The extension:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extracts questions directly from the page&lt;/li&gt;
&lt;li&gt;Sends them to AI (Claude or ChatGPT)&lt;/li&gt;
&lt;li&gt;Parses the response&lt;/li&gt;
&lt;li&gt;Fills answers automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also use it more safely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fill in answers only&lt;/li&gt;
&lt;li&gt;Review them yourself before submitting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;🧩 The Real Challenge&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Automation sounds simple, but real websites are messy.&lt;/p&gt;

&lt;p&gt;Things break easily&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Videos pause randomly&lt;/li&gt;
&lt;li&gt;Buttons change behavior&lt;/li&gt;
&lt;li&gt;Quizzes have different formats&lt;/li&gt;
&lt;li&gt;Pages don’t always load the same way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal wasn’t just automation — it was making it stable.&lt;/p&gt;

&lt;p&gt;So a lot of effort went into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detecting what is happening on the page&lt;/li&gt;
&lt;li&gt;Handling edge cases&lt;/li&gt;
&lt;li&gt;Preventing loops and failures&lt;/li&gt;
&lt;li&gt;Keeping everything running smoothly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;🔄 How I Approached It?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of treating everything differently, I simplified the logic.&lt;/p&gt;

&lt;p&gt;Every step in a course is just one of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video&lt;/li&gt;
&lt;li&gt;Reading&lt;/li&gt;
&lt;li&gt;Quiz&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the system keeps checking:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;gt; “What type of page is this, and what should I do next?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That made the whole flow predictable and easier to control.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;⚡ Why I Built This?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Mainly to remove friction&lt;/p&gt;

&lt;p&gt;When something is repetitive, it kills momentum.&lt;/p&gt;

&lt;p&gt;This tool doesn’t skip learning. Instead, it cuts out pointless manual tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## 💭 Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This project ended up being more than I expected.&lt;/p&gt;

&lt;p&gt;It wasn’t just about automation, but about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building something that runs continuously&lt;/li&gt;
&lt;li&gt;Handling real-world unpredictability&lt;/li&gt;
&lt;li&gt;Integrating AI in a practical way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the primary goal is to create something genuinely useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## 🔗 Project Link&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want to check it out or try it&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/rajairfanahmed/coursera-automation-tool" rel="noopener noreferrer"&gt;Coursera Automation Tool&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
