<?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: Muhammad Ali Kazmi</title>
    <description>The latest articles on DEV Community by Muhammad Ali Kazmi (@alikazmidev).</description>
    <link>https://dev.to/alikazmidev</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%2F195930%2F5a48d331-fbaa-47bc-bdb5-5edf1333097f.jpeg</url>
      <title>DEV Community: Muhammad Ali Kazmi</title>
      <link>https://dev.to/alikazmidev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alikazmidev"/>
    <language>en</language>
    <item>
      <title>The Complete Beginner to Advanced Guide to ChatGPT Codex</title>
      <dc:creator>Muhammad Ali Kazmi</dc:creator>
      <pubDate>Thu, 02 Apr 2026 15:13:46 +0000</pubDate>
      <link>https://dev.to/alikazmidev/the-complete-beginner-to-advanced-guide-to-chatgpt-codex-1pha</link>
      <guid>https://dev.to/alikazmidev/the-complete-beginner-to-advanced-guide-to-chatgpt-codex-1pha</guid>
      <description>&lt;p&gt;Most people use Codex like a smarter autocomplete.&lt;/p&gt;

&lt;p&gt;That is usually where the frustration starts.&lt;/p&gt;

&lt;p&gt;Codex works much better when you treat it like a teammate with access to your repo, tools, tests, and instructions. Once that clicks, the quality of the output changes fast.&lt;/p&gt;

&lt;p&gt;This guide is for both camps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the person opening Codex for the first time&lt;/li&gt;
&lt;li&gt;the person who already tried it, got mixed results, and wants a workflow they can trust&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I verified this guide against official OpenAI Codex docs and Help Center material on &lt;strong&gt;April 2, 2026&lt;/strong&gt;. Since Codex moves fast, that matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Codex Actually Is
&lt;/h2&gt;

&lt;p&gt;Codex is OpenAI's coding agent.&lt;/p&gt;

&lt;p&gt;It can work in your terminal, inside supported IDEs, inside the Codex app, and in cloud-backed workflows. According to OpenAI's Help Center, you can use it to write code, review changes, run commands, execute tests, and delegate work in isolated sandboxes.&lt;/p&gt;

&lt;p&gt;That means the right mental model is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ask for code and hope for the best.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give Codex the task, the context, the rules, and the definition of done.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That one shift fixes a surprising number of bad Codex sessions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Start in 5 Minutes
&lt;/h2&gt;

&lt;p&gt;As of April 2, 2026, OpenAI's Help Center says Codex is included with ChatGPT Plus, Pro, Business, and Enterprise/Edu plans, and temporarily also included with Free and Go.&lt;/p&gt;

&lt;p&gt;If you want the CLI, the official install command is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @openai/codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first run prompts you to sign in with your ChatGPT account or an API key.&lt;/p&gt;

&lt;p&gt;OpenAI's CLI docs also note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI support is available on macOS and Linux&lt;/li&gt;
&lt;li&gt;Windows support is experimental&lt;/li&gt;
&lt;li&gt;WSL is the recommended path on Windows for the best experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you prefer GUI-heavy workflows, the Codex app is worth a look. OpenAI positions it as the place for multiple parallel agents, worktrees, automations, and built-in git flows. If you already live in VS Code, Cursor, or Windsurf, the IDE extension is the most natural entry point.&lt;/p&gt;

&lt;p&gt;My recommendation is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with CLI if you want to learn the fundamentals&lt;/li&gt;
&lt;li&gt;Use the IDE extension if most of your work is file-by-file editing&lt;/li&gt;
&lt;li&gt;Use the Codex app when you want multiple concurrent threads, worktrees, or automations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Mental Model That Makes Codex Better
&lt;/h2&gt;

&lt;p&gt;OpenAI's best practices guide gives a simple default structure for prompts. Use these four parts every time:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Goal&lt;/td&gt;
&lt;td&gt;What exactly should change?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;Which files, folders, docs, errors, or examples matter?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Constraints&lt;/td&gt;
&lt;td&gt;What rules, architecture, safety limits, or conventions must be followed?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Done when&lt;/td&gt;
&lt;td&gt;How do we know the task is complete?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is the whole game.&lt;/p&gt;

&lt;p&gt;Most bad Codex output comes from missing one of these.&lt;/p&gt;

&lt;p&gt;For example, this is weak:&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.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Goal: Fix the login redirect loop for authenticated users.
Context: The issue is in `src/middleware.ts`, `src/lib/auth.ts`, and the `/login` flow. It started after the session cookie rename.
Constraints: Do not change the database schema. Keep the current JWT strategy. Avoid unrelated refactors.
Done when: Logged-in users can refresh `/dashboard` without being redirected to `/login`, and the auth test suite passes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That prompt is not fancy. It is just clear.&lt;/p&gt;

&lt;p&gt;Codex rewards clarity much more than clever prompting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your First Good Prompts
&lt;/h2&gt;

&lt;p&gt;If you are new, save these.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Fix a Bug
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Goal: Fix a bug in [feature].
Context: The problem appears in [files]. The current behavior is [bad behavior]. The expected behavior is [expected behavior]. Relevant error/output: [paste it].
Constraints: Keep the change minimal. Do not rename public APIs. No unrelated formatting changes.
Done when: The bug no longer reproduces, the relevant tests pass, and you explain the root cause in plain English.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Build a Feature
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Goal: Implement [feature].
Context: Follow the existing patterns in [files/components]. Use [library/tool] if possible. The UI/API should match [reference].
Constraints: Keep this scoped to [files or directories]. Add tests. Do not change unrelated modules.
Done when: The feature works end to end, tests pass, and the final diff is limited to the intended files.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Refactor Safely
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Goal: Refactor [module] for maintainability.
Context: Start by understanding the current flow in [files]. Identify risks before editing. There are existing callers in [paths].
Constraints: Preserve behavior. No public API breaks. Update tests if needed.
Done when: The code is simpler, behavior is unchanged, and you summarize what changed and what was intentionally left alone.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Debug Before Editing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do not edit anything yet.
First, inspect the relevant files, explain the likely root causes, rank them by confidence, and propose the smallest safe fix.
Only after that, ask for confirmation or proceed with the smallest fix if confidence is high.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last one is underrated.&lt;/p&gt;

&lt;p&gt;A lot of Codex frustration comes from asking for implementation before understanding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Beginner Workflow: What To Do on Real Tasks
&lt;/h2&gt;

&lt;p&gt;If you are just starting, use this sequence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Ask for a plan on anything non-trivial
&lt;/h3&gt;

&lt;p&gt;OpenAI explicitly recommends planning first for difficult or ambiguous tasks. In Codex, Plan mode exists for exactly this reason.&lt;/p&gt;

&lt;p&gt;If the task is bigger than a quick bug fix, do not start with code generation. Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use plan mode. Inspect the relevant files, ask clarifying questions if needed, then propose the implementation plan before writing code.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That reduces wasted edits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Point Codex at the right files
&lt;/h3&gt;

&lt;p&gt;Large repos are where vague prompting gets expensive.&lt;/p&gt;

&lt;p&gt;Tell Codex where to look:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exact files&lt;/li&gt;
&lt;li&gt;exact folder&lt;/li&gt;
&lt;li&gt;exact failing test&lt;/li&gt;
&lt;li&gt;exact error message&lt;/li&gt;
&lt;li&gt;exact screenshot or spec&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not make it guess the neighborhood.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Tell it what not to touch
&lt;/h3&gt;

&lt;p&gt;This is where many people lose control of the diff.&lt;/p&gt;

&lt;p&gt;If you do not want a refactor, say so.&lt;/p&gt;

&lt;p&gt;If you do not want renamed files, say so.&lt;/p&gt;

&lt;p&gt;If you do not want dependency changes, say so.&lt;/p&gt;

&lt;p&gt;A lot of Codex quality is really scope control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Tell it how to verify the work
&lt;/h3&gt;

&lt;p&gt;OpenAI's best practices guide is very clear here: do not stop at asking Codex to make a change. Ask it to create tests when needed, run checks, confirm the behavior, and review the result.&lt;/p&gt;

&lt;p&gt;A solid line to add is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run the relevant tests, lint/type checks if applicable, and review the diff for regressions before you consider the task complete.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Review like a teammate wrote it
&lt;/h3&gt;

&lt;p&gt;Codex is good. It is not exempt from review.&lt;/p&gt;

&lt;p&gt;You should still check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;did it solve the actual problem?&lt;/li&gt;
&lt;li&gt;did it change more than necessary?&lt;/li&gt;
&lt;li&gt;did it preserve existing behavior?&lt;/li&gt;
&lt;li&gt;did it add the right tests?&lt;/li&gt;
&lt;li&gt;did it quietly break something adjacent?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you accept output without review, the problem is not Codex. The problem is process.&lt;/p&gt;




&lt;h2&gt;
  
  
  The First Two Files Serious Users Set Up
&lt;/h2&gt;

&lt;p&gt;Once you get one or two good sessions, stop repeating yourself manually.&lt;/p&gt;

&lt;p&gt;OpenAI's docs say the next step is reusable guidance through &lt;code&gt;AGENTS.md&lt;/code&gt; and durable configuration through &lt;code&gt;config.toml&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;OpenAI describes &lt;code&gt;AGENTS.md&lt;/code&gt; as an open-format README for agents. It is the best place to encode how Codex should work in a repo.&lt;/p&gt;

&lt;p&gt;A practical starter file should cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repo layout&lt;/li&gt;
&lt;li&gt;build, test, and lint commands&lt;/li&gt;
&lt;li&gt;engineering conventions&lt;/li&gt;
&lt;li&gt;do-not rules&lt;/li&gt;
&lt;li&gt;what done means&lt;/li&gt;
&lt;li&gt;how to verify work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A minimal starter looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# AGENTS.md&lt;/span&gt;

&lt;span class="gu"&gt;## Repo map&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; App code: &lt;span class="sb"&gt;`src/`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Tests: &lt;span class="sb"&gt;`tests/`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Shared utilities: &lt;span class="sb"&gt;`src/lib/`&lt;/span&gt;

&lt;span class="gu"&gt;## Commands&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Dev: &lt;span class="sb"&gt;`pnpm dev`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Test: &lt;span class="sb"&gt;`pnpm test`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Lint: &lt;span class="sb"&gt;`pnpm lint`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Typecheck: &lt;span class="sb"&gt;`pnpm typecheck`&lt;/span&gt;

&lt;span class="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Keep diffs minimal.
&lt;span class="p"&gt;-&lt;/span&gt; Do not rename public APIs without explicit instruction.
&lt;span class="p"&gt;-&lt;/span&gt; Follow existing folder conventions.
&lt;span class="p"&gt;-&lt;/span&gt; Add or update tests for behavior changes.

&lt;span class="gu"&gt;## Done when&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Relevant tests pass.
&lt;span class="p"&gt;-&lt;/span&gt; Lint and typecheck pass.
&lt;span class="p"&gt;-&lt;/span&gt; Final diff is reviewed for regressions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenAI also recommends keeping &lt;code&gt;AGENTS.md&lt;/code&gt; short and practical.&lt;/p&gt;

&lt;p&gt;That is correct.&lt;/p&gt;

&lt;p&gt;Do not turn it into a manifesto.&lt;/p&gt;

&lt;p&gt;If Codex makes the same mistake twice, update &lt;code&gt;AGENTS.md&lt;/code&gt;. That is a much better loop than rewriting the same instruction in every prompt.&lt;/p&gt;

&lt;p&gt;The CLI also has &lt;code&gt;/init&lt;/code&gt; to scaffold a starter &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;config.toml&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A sane starting point for local work is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;model&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"gpt-5.4"&lt;/span&gt;
&lt;span class="py"&gt;approval_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"on-request"&lt;/span&gt;
&lt;span class="py"&gt;sandbox_mode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"workspace-write"&lt;/span&gt;
&lt;span class="py"&gt;web_search&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cached"&lt;/span&gt;
&lt;span class="py"&gt;model_reasoning_effort&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"high"&lt;/span&gt;

&lt;span class="nn"&gt;[features]&lt;/span&gt;
&lt;span class="py"&gt;multi_agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;shell_snapshot&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why these matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;approval_policy = "on-request"&lt;/code&gt; keeps you in control without constant friction&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sandbox_mode = "workspace-write"&lt;/code&gt; is a good default for normal repo work&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;web_search = "cached"&lt;/code&gt; uses OpenAI's web search cache by default, which the docs position as safer than blindly fetching arbitrary live pages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model_reasoning_effort&lt;/code&gt; should go up as tasks get more complex&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenAI's guidance here is sensible: keep approvals and sandboxing tight by default, then loosen only for trusted repos and specific workflows.&lt;/p&gt;

&lt;p&gt;That is the right default attitude.&lt;/p&gt;




&lt;h2&gt;
  
  
  Intermediate Workflow: How People Move Past One-Off Prompts
&lt;/h2&gt;

&lt;p&gt;This is where Codex starts becoming a real system instead of a novelty.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use one thread per task
&lt;/h3&gt;

&lt;p&gt;OpenAI explicitly warns against using one giant thread per project.&lt;/p&gt;

&lt;p&gt;That leads to bloated context and worse results over time.&lt;/p&gt;

&lt;p&gt;Use one thread per coherent task. If the work branches, fork the thread.&lt;/p&gt;

&lt;p&gt;Useful session controls from the docs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/fork&lt;/code&gt; to branch the conversation while keeping context&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/compact&lt;/code&gt; when the thread is getting long&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/resume&lt;/code&gt; to pick work back up&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/status&lt;/code&gt; to inspect the current session state&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Review inside the workflow
&lt;/h3&gt;

&lt;p&gt;Codex supports review loops, not just code generation.&lt;/p&gt;

&lt;p&gt;OpenAI documents &lt;code&gt;/review&lt;/code&gt; for reviewing a branch, commit, or uncommitted changes. That is worth using, especially after larger diffs.&lt;/p&gt;

&lt;p&gt;A strong pattern is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask Codex to implement&lt;/li&gt;
&lt;li&gt;Ask Codex to run checks&lt;/li&gt;
&lt;li&gt;Ask Codex to review its own diff against your repo rules&lt;/li&gt;
&lt;li&gt;Then do your human review&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Keep verification explicit
&lt;/h3&gt;

&lt;p&gt;If your project has specific commands, put them in &lt;code&gt;AGENTS.md&lt;/code&gt; and repeat them in the prompt when needed.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;After the change, run `pnpm test auth`, then `pnpm lint`, then review the diff for auth regressions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex is much more reliable when it can see the finish line.&lt;/p&gt;




&lt;h2&gt;
  
  
  Advanced Workflow: Worktrees, Subagents, MCP, Skills, Automations
&lt;/h2&gt;

&lt;p&gt;This is where Codex gets genuinely powerful.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Worktrees for parallel work
&lt;/h3&gt;

&lt;p&gt;OpenAI's worktree docs are one of the most practical parts of the whole Codex stack.&lt;/p&gt;

&lt;p&gt;Worktrees let Codex run multiple independent tasks in the same project without interfering with each other. The docs frame Local as your foreground workspace and Worktree as a background workspace.&lt;/p&gt;

&lt;p&gt;That matters because the common mistake is obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one active task in your local checkout&lt;/li&gt;
&lt;li&gt;another Codex task editing the same branch&lt;/li&gt;
&lt;li&gt;confusion, collisions, messy git state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worktrees fix that.&lt;/p&gt;

&lt;p&gt;OpenAI's documented advantages are straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;work in parallel without disturbing local setup&lt;/li&gt;
&lt;li&gt;queue background work while you stay focused on the foreground&lt;/li&gt;
&lt;li&gt;hand work back into local later when you are ready to inspect or test&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want Codex doing one larger task while you keep shipping something else, use a worktree.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Subagents for truly parallel tasks
&lt;/h3&gt;

&lt;p&gt;OpenAI says Codex can spawn specialized agents in parallel and then consolidate the results.&lt;/p&gt;

&lt;p&gt;This is useful when the task is actually parallel, not just large.&lt;/p&gt;

&lt;p&gt;Good examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one agent reviews security&lt;/li&gt;
&lt;li&gt;one agent reviews bugs&lt;/li&gt;
&lt;li&gt;one agent inspects flaky tests&lt;/li&gt;
&lt;li&gt;one agent maps the codebase around a subsystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bad example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;splitting a tightly coupled change across five agents that all want the same files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenAI also notes two important constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;subagents only run when you explicitly ask for them&lt;/li&gt;
&lt;li&gt;they cost more tokens than a single-agent run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use them when parallelism is real, not because it sounds advanced.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. MCP when the context lives outside the repo
&lt;/h3&gt;

&lt;p&gt;OpenAI's docs are crisp on MCP: use it when the context Codex needs lives outside the repo and changes frequently.&lt;/p&gt;

&lt;p&gt;That means things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;internal docs&lt;/li&gt;
&lt;li&gt;ticketing systems&lt;/li&gt;
&lt;li&gt;dashboards&lt;/li&gt;
&lt;li&gt;design systems&lt;/li&gt;
&lt;li&gt;external APIs&lt;/li&gt;
&lt;li&gt;runbooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you keep pasting the same outside context into prompts, that is usually an MCP smell.&lt;/p&gt;

&lt;p&gt;OpenAI's warning here is also important: do not wire in every tool on day one. Start with one or two tools that remove a real manual loop.&lt;/p&gt;

&lt;p&gt;That is good advice. Tool sprawl makes agents worse, not better.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Skills when you repeat the same workflow
&lt;/h3&gt;

&lt;p&gt;OpenAI's rule of thumb is excellent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you keep reusing the same prompt or correcting the same workflow, it should probably become a skill.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Skills are great for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;incident summaries&lt;/li&gt;
&lt;li&gt;release note drafting&lt;/li&gt;
&lt;li&gt;repeated debugging flows&lt;/li&gt;
&lt;li&gt;checklist-based PR reviews&lt;/li&gt;
&lt;li&gt;migration planning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep each skill narrow. One job. Clear input. Clear output.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Automations when the workflow is stable
&lt;/h3&gt;

&lt;p&gt;OpenAI puts this nicely: skills define the method, automations define the schedule.&lt;/p&gt;

&lt;p&gt;That is the right order.&lt;/p&gt;

&lt;p&gt;Do not automate a workflow that still needs a lot of steering.&lt;/p&gt;

&lt;p&gt;Once it is predictable, automations are useful for things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI failure summaries&lt;/li&gt;
&lt;li&gt;recent commit summaries&lt;/li&gt;
&lt;li&gt;scheduled repo health checks&lt;/li&gt;
&lt;li&gt;standup drafts&lt;/li&gt;
&lt;li&gt;recurring analysis jobs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Codex Gets Stuck, And How To Recover Fast
&lt;/h2&gt;

&lt;p&gt;This is the section you will come back to.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symptom: Codex makes a big messy diff
&lt;/h3&gt;

&lt;p&gt;Likely cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the prompt was too open-ended&lt;/li&gt;
&lt;li&gt;no file scope was given&lt;/li&gt;
&lt;li&gt;no constraints were stated&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Redo this with the smallest safe change.
Only edit the files directly involved.
Do not refactor unrelated code.
Explain the exact files you plan to change before editing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Symptom: Codex edits before understanding the bug
&lt;/h3&gt;

&lt;p&gt;Likely cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you asked for implementation too early&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stop coding.
Inspect the relevant files and logs first.
List the most likely root causes, rank them by confidence, and propose the smallest fix.
Do not edit anything until that analysis is complete.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Symptom: Codex solves the wrong problem
&lt;/h3&gt;

&lt;p&gt;Likely cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the goal was vague&lt;/li&gt;
&lt;li&gt;done criteria were missing&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reset the task.
Goal: [one sentence]
Context: [files, errors, references]
Constraints: [rules]
Done when: [testable outcomes]
Repeat your understanding of the task before making changes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Symptom: Codex keeps repeating the same mistakes across sessions
&lt;/h3&gt;

&lt;p&gt;Likely cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repo rules live only in your head&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;Move the rule into &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is exactly what OpenAI recommends. Repeated friction should become reusable guidance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symptom: Codex is good on small tasks and weak on bigger ones
&lt;/h3&gt;

&lt;p&gt;Likely cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you skipped planning&lt;/li&gt;
&lt;li&gt;the thread is too broad&lt;/li&gt;
&lt;li&gt;the task should be broken down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use Plan mode&lt;/li&gt;
&lt;li&gt;split the work into smaller tasks&lt;/li&gt;
&lt;li&gt;use one thread per task&lt;/li&gt;
&lt;li&gt;fork when the work branches&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Symptom: Two Codex tasks step on each other
&lt;/h3&gt;

&lt;p&gt;Likely cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple live threads on the same files or branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;Use git worktrees.&lt;/p&gt;

&lt;p&gt;OpenAI explicitly warns against running live threads on the same files without worktrees.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symptom: Codex cannot verify the result well
&lt;/h3&gt;

&lt;p&gt;Likely cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the repo does not expose clear commands&lt;/li&gt;
&lt;li&gt;test and lint steps were not provided&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;Put the actual commands in &lt;code&gt;AGENTS.md&lt;/code&gt;, then restate them in the task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symptom: Codex needs information from outside the repo
&lt;/h3&gt;

&lt;p&gt;Likely cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing external context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;Use MCP for repeatable outside context. If it is a one-off research task, use web search carefully. OpenAI's config docs note that cached web search is the default and should still be treated as untrusted.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Copy-Paste Rescue Prompts
&lt;/h2&gt;

&lt;p&gt;These are the ones I would actually keep in a note.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rescue Prompt 1: Plan Before Touching Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use plan mode.
Inspect the relevant files first, ask any clarifying questions, and propose the implementation plan.
Do not write code yet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rescue Prompt 2: Smallest Safe Fix
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix this with the smallest safe change.
No unrelated refactors.
No dependency changes.
No file moves unless absolutely necessary.
Explain the intended diff before editing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rescue Prompt 3: Understand Before Editing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First explain:
1. what the current code is doing
2. where the bug most likely is
3. what the smallest fix is
4. what could regress if we change it
Then implement only after that analysis.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rescue Prompt 4: Tight Review Loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;After making the change:
- add or update tests if needed
- run the relevant test, lint, and typecheck commands
- review the diff for regressions
- summarize what changed, what was verified, and any remaining risk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rescue Prompt 5: Stay Inside the Lane
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Only work in these files:
- `src/...`
- `tests/...`
If you believe another file must change, stop and justify it first.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rescue Prompt 6: Turn This Into Durable Guidance
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You made the same mistake twice on this repo.
Write a short retrospective and propose the exact `AGENTS.md` update that would prevent it next time.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last prompt is how you stop paying the same tax repeatedly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Advanced Users Usually Figure Out
&lt;/h2&gt;

&lt;p&gt;After enough Codex usage, the lessons are consistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Better repos get better Codex output
&lt;/h3&gt;

&lt;p&gt;If your project has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clear structure&lt;/li&gt;
&lt;li&gt;real tests&lt;/li&gt;
&lt;li&gt;reliable commands&lt;/li&gt;
&lt;li&gt;a useful &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;stable conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Codex looks much smarter.&lt;/p&gt;

&lt;p&gt;That is not magic. The environment is simply legible.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Planning is not overhead
&lt;/h3&gt;

&lt;p&gt;People skip planning because they want speed.&lt;/p&gt;

&lt;p&gt;Then they burn that time back in rework.&lt;/p&gt;

&lt;p&gt;OpenAI's documentation leans hard toward planning for difficult tasks, and I think that is the correct default.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Reusability beats prompt gymnastics
&lt;/h3&gt;

&lt;p&gt;A reusable &lt;code&gt;AGENTS.md&lt;/code&gt;, one or two good skills, and a sane config file will outperform heroic one-off prompts over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Parallelism only helps when the task is actually parallel
&lt;/h3&gt;

&lt;p&gt;Use worktrees and subagents when the work can truly branch.&lt;/p&gt;

&lt;p&gt;Do not force parallelism into tightly coupled edits.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Codex is strongest when it can inspect, change, run, and verify
&lt;/h3&gt;

&lt;p&gt;The more artificial the environment, the worse the results.&lt;/p&gt;

&lt;p&gt;If Codex cannot see the repo properly, cannot run the right commands, or cannot verify success, you are leaving a big part of the product unused.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If you only remember three things from this guide, make it these:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use Goal + Context + Constraints + Done when in every serious prompt.&lt;/li&gt;
&lt;li&gt;Put recurring rules into &lt;code&gt;AGENTS.md&lt;/code&gt; instead of repeating yourself forever.&lt;/li&gt;
&lt;li&gt;Ask Codex to plan, verify, and review, not just generate code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the difference between random AI help and a workflow you can actually depend on.&lt;/p&gt;

&lt;p&gt;Codex is not hard to use.&lt;/p&gt;

&lt;p&gt;But it is easy to use badly.&lt;/p&gt;

&lt;p&gt;Once you stop treating it like a code slot machine and start treating it like an engineer with tools, it becomes much more useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Official Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/learn/best-practices" rel="noopener noreferrer"&gt;OpenAI Codex best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/cli" rel="noopener noreferrer"&gt;OpenAI Codex CLI docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/config-basic" rel="noopener noreferrer"&gt;OpenAI Codex config basics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/app/worktrees" rel="noopener noreferrer"&gt;OpenAI Codex worktrees docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/codex/subagents" rel="noopener noreferrer"&gt;OpenAI Codex subagents docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.openai.com/en/articles/11369540-codex-in-chatgpt" rel="noopener noreferrer"&gt;OpenAI Help Center: Using Codex with your ChatGPT plan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/introducing-upgrades-to-codex/" rel="noopener noreferrer"&gt;OpenAI: Introducing upgrades to Codex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If OpenAI changes the product behavior after April 2, 2026, treat the links above as the source of truth and update your workflow accordingly.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Complete Beginner's Guide to GSD (Get Shit Done) Framework for Claude Code</title>
      <dc:creator>Muhammad Ali Kazmi</dc:creator>
      <pubDate>Tue, 17 Mar 2026 21:36:51 +0000</pubDate>
      <link>https://dev.to/alikazmidev/the-complete-beginners-guide-to-gsd-get-shit-done-framework-for-claude-code-24h0</link>
      <guid>https://dev.to/alikazmidev/the-complete-beginners-guide-to-gsd-get-shit-done-framework-for-claude-code-24h0</guid>
      <description>&lt;p&gt;If you've been using Claude Code, you've probably hit that wall. You know the one, everything is going great, Claude is writing perfect code, and then suddenly around the 50% context mark, things start to fall apart. Code gets sloppy. Requirements get forgotten. Claude starts "being more concise" (translation: cutting corners).&lt;/p&gt;

&lt;p&gt;This is called &lt;strong&gt;context rot&lt;/strong&gt;, and it's the #1 reason vibecoding has a bad reputation.&lt;/p&gt;

&lt;p&gt;The GSD (Get Shit Done) framework solves this. Let me walk you through everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is GSD?
&lt;/h2&gt;

&lt;p&gt;GSD is an open-source, lightweight meta-prompting and spec-driven development system built specifically for Claude Code. Created by &lt;strong&gt;Lex Christopherson&lt;/strong&gt; (aka glittercowboy), it has exploded to &lt;strong&gt;31,000+ GitHub stars&lt;/strong&gt; and is trusted by engineers at Amazon, Google, Shopify, and Webflow.&lt;/p&gt;

&lt;p&gt;At its core, GSD does one thing: &lt;strong&gt;it keeps Claude Code operating at peak quality throughout your entire project&lt;/strong&gt;, no matter how large or complex.&lt;/p&gt;

&lt;p&gt;How? By breaking your project into small, well-defined tasks -- each executed in a &lt;strong&gt;fresh 200K-token context window&lt;/strong&gt; by specialized sub-agents. Your main session stays lean at 30-40% context usage while the heavy lifting happens in isolated, pristine environments.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It's not magic. It's just really good context engineering wrapped in a workflow that doesn't get in your way."&lt;br&gt;
-- Lex Christopherson, GSD Creator&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why Should You Care?
&lt;/h2&gt;

&lt;p&gt;Here's the reality of Claude Code without a framework:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Context Utilization&lt;/th&gt;
&lt;th&gt;Quality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0-30%&lt;/td&gt;
&lt;td&gt;Peak quality, thorough work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30-50%&lt;/td&gt;
&lt;td&gt;Good but starting to rush&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50-70%&lt;/td&gt;
&lt;td&gt;Corner-cutting, missed requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70%+&lt;/td&gt;
&lt;td&gt;Hallucinations, forgotten context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GSD ensures every task runs in the 0-30% sweet spot. &lt;strong&gt;Every. Single. Time.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Before vs After
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Without GSD:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start a project in Claude Code&lt;/li&gt;
&lt;li&gt;First 3-4 tasks go great&lt;/li&gt;
&lt;li&gt;Context fills up&lt;/li&gt;
&lt;li&gt;Quality degrades silently&lt;/li&gt;
&lt;li&gt;You restart sessions, lose context, repeat&lt;/li&gt;
&lt;li&gt;Code inconsistencies pile up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;With GSD:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define your project once&lt;/li&gt;
&lt;li&gt;GSD creates a roadmap with phases&lt;/li&gt;
&lt;li&gt;Each task runs in a fresh sub-agent context&lt;/li&gt;
&lt;li&gt;Quality stays consistent from task 1 to task 100&lt;/li&gt;
&lt;li&gt;Clean git history with atomic commits&lt;/li&gt;
&lt;li&gt;Everything is documented and traceable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Installation (2 Minutes)
&lt;/h2&gt;

&lt;p&gt;Getting started is dead simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx get-shit-done-cc@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installer will ask you two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Runtime&lt;/strong&gt; -- Choose Claude Code (or OpenCode, Gemini CLI, Codex, Copilot, Antigravity if you use those)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location&lt;/strong&gt; -- Global (all projects) or Local (current project only)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For beginners, I recommend &lt;strong&gt;Claude Code + Global&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify Installation
&lt;/h3&gt;

&lt;p&gt;Open Claude Code and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/gsd:help
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see the help menu, you're good to go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommended: Skip Permissions Mode
&lt;/h3&gt;

&lt;p&gt;GSD spawns multiple agents that run commands. Getting prompted to approve every &lt;code&gt;git commit&lt;/code&gt; and &lt;code&gt;date&lt;/code&gt; command defeats the purpose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--dangerously-skip-permissions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, add granular permissions to &lt;code&gt;.claude/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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&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;"allow"&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="s2"&gt;"Bash(date:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(echo:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(cat:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(ls:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(mkdir:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git add:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git commit:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git status:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git log:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git diff:*)"&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;h2&gt;
  
  
  The GSD Workflow (Step by Step)
&lt;/h2&gt;

&lt;p&gt;GSD follows a disciplined 6-step cycle. Think of it like a mini software development lifecycle, but without the enterprise BS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New Project -&amp;gt; Discuss Phase -&amp;gt; Plan Phase -&amp;gt; Execute Phase -&amp;gt; Verify Work -&amp;gt; Complete Milestone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's walk through each step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Initialize Your Project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/gsd:new-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where the magic starts. GSD will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interview you&lt;/strong&gt; -- Ask questions until it fully understands your project (goals, constraints, tech preferences, edge cases)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research&lt;/strong&gt; -- Spawn parallel agents to investigate the domain (libraries, best practices, pitfalls)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract requirements&lt;/strong&gt; -- Separate what's v1, v2, and out of scope&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a roadmap&lt;/strong&gt; -- Map requirements to executable phases&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You approve the roadmap, and you're ready to build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Files created:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PROJECT.md&lt;/code&gt; -- Your project vision (always loaded for context)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REQUIREMENTS.md&lt;/code&gt; -- Scoped requirements with phase traceability&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ROADMAP.md&lt;/code&gt; -- Phases mapped to requirements&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;STATE.md&lt;/code&gt; -- Living state document for decisions and blockers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.planning/research/&lt;/code&gt; -- Research findings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Come prepared with a detailed description. The more specific you are upfront, the fewer follow-up questions GSD needs to ask. Include goals, target users, core features, constraints, and tech stack preferences.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Discuss the Phase
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/gsd:discuss-phase 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the step most beginners skip -- &lt;strong&gt;don't&lt;/strong&gt;. This is where you shape the implementation.&lt;/p&gt;

&lt;p&gt;Your roadmap has a sentence or two per phase. That's not enough context to build something the way &lt;em&gt;you&lt;/em&gt; imagine it. GSD analyzes the phase and identifies gray areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visual features?&lt;/strong&gt; -- Layout, density, interactions, empty states&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APIs/CLIs?&lt;/strong&gt; -- Response format, error handling, flags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content systems?&lt;/strong&gt; -- Structure, tone, depth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each gray area, it asks targeted questions. Your answers go into &lt;code&gt;CONTEXT.md&lt;/code&gt;, which feeds directly into planning and execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; Without this step, Claude makes assumptions. With it, Claude builds exactly what you envisioned.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Plan twice. Prompt once." -- Mauvis Ledford&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 3: Plan the Phase
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/gsd:plan-phase 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GSD now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Researches&lt;/strong&gt; -- How to implement this phase (guided by your CONTEXT.md)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plans&lt;/strong&gt; -- Creates 2-3 atomic task plans in XML structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifies&lt;/strong&gt; -- Checks plans against requirements, loops until they pass&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each plan is small enough to execute in a fresh context window. This is the secret sauce -- no single task ever gets degraded context.&lt;/p&gt;

&lt;p&gt;Here's what an atomic plan looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;task&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"auto"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Create login endpoint&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;files&amp;gt;&lt;/span&gt;src/app/api/auth/login/route.ts&lt;span class="nt"&gt;&amp;lt;/files&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;action&amp;gt;&lt;/span&gt;
    Use jose for JWT (not jsonwebtoken - CommonJS issues).
    Validate credentials against users table.
    Return httpOnly cookie on success.
  &lt;span class="nt"&gt;&amp;lt;/action&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;verify&amp;gt;&lt;/span&gt;curl -X POST localhost:3000/api/auth/login returns 200&lt;span class="nt"&gt;&amp;lt;/verify&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;done&amp;gt;&lt;/span&gt;Valid credentials return cookie, invalid return 401&lt;span class="nt"&gt;&amp;lt;/done&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/task&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Precise instructions. No guessing. Verification built in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Execute the Phase
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/gsd:execute-phase 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where you sit back and watch GSD work. It:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Groups plans into waves&lt;/strong&gt; -- Independent tasks run in parallel, dependent tasks wait&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spawns fresh sub-agents&lt;/strong&gt; -- Each gets 200K tokens purely for implementation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commits per task&lt;/strong&gt; -- Every completed task gets its own atomic git commit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifies against goals&lt;/strong&gt; -- Checks the codebase delivers what the phase promised
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  WAVE 1 (parallel)          WAVE 2 (parallel)          WAVE 3
  +-----------+ +-----------+  +-----------+ +-----------+  +-----------+
  | User      | | Product   |  | Orders    | | Cart      |  | Checkout  |
  | Model     | | Model     |  | API       | | API       |  | UI        |
  +-----------+ +-----------+  +-----------+ +-----------+  +-----------+
       |            |               ^            ^               ^
       +------------+---------------+------------+               |
           Dependencies flow forward through waves
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Walk away, come back to completed work with clean git history.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Verify Your Work
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/gsd:verify-work 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Automated tests check that code compiles and passes. But does the feature &lt;em&gt;work&lt;/em&gt; the way you expected? GSD:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extracts testable deliverables&lt;/strong&gt; -- What you should be able to do now&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walks you through each one&lt;/strong&gt; -- "Can you log in with email?" Yes/no.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagnoses failures&lt;/strong&gt; -- Spawns debug agents to find root causes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creates fix plans&lt;/strong&gt; -- Ready for re-execution&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If everything passes, move on. If something's broken, run &lt;code&gt;/gsd:execute-phase&lt;/code&gt; again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Rinse and Repeat
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/gsd:discuss-phase 2
/gsd:plan-phase 2
/gsd:execute-phase 2
/gsd:verify-work 2
...
/gsd:complete-milestone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Loop through all phases. When done, &lt;code&gt;/gsd:complete-milestone&lt;/code&gt; archives everything and tags the release.&lt;/p&gt;

&lt;p&gt;Want to build more? &lt;code&gt;/gsd:new-milestone&lt;/code&gt; starts the next version.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Mode: For Smaller Tasks
&lt;/h2&gt;

&lt;p&gt;Not everything needs the full workflow. For ad-hoc tasks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/gsd:quick
&amp;gt; What do you want to do? "Add dark mode toggle to settings"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quick mode gives you GSD guarantees (atomic commits, state tracking) without the full research and planning overhead.&lt;/p&gt;

&lt;p&gt;You can add flags for more thorough work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--discuss&lt;/code&gt; -- Gather your preferences first&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--research&lt;/code&gt; -- Investigate approaches before planning&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--full&lt;/code&gt; -- Add plan-checking and post-execution verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flags are composable: &lt;code&gt;/gsd:quick --discuss --research --full&lt;/code&gt; gives you the full experience in a lighter package.&lt;/p&gt;




&lt;h2&gt;
  
  
  Essential Commands Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:new-project&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Initialize a new project with full planning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:discuss-phase N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Capture implementation decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:plan-phase N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Research + plan + verify for a phase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:execute-phase N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute plans in parallel waves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:verify-work N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manual user acceptance testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:quick&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ad-hoc task with GSD guarantees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:progress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Where am I? What's next?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:map-codebase&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Analyze existing codebase (brownfield)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:debug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Systematic debugging with persistent state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:pause-work&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Save state for later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:resume-work&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restore from last session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/gsd:help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show all commands&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Configuration: Model Profiles
&lt;/h2&gt;

&lt;p&gt;GSD lets you control which Claude model each agent uses. This is crucial for managing costs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Profile&lt;/th&gt;
&lt;th&gt;Planning&lt;/th&gt;
&lt;th&gt;Execution&lt;/th&gt;
&lt;th&gt;Verification&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;quality&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;balanced&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;budget&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Haiku&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Switch profiles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/gsd:set-profile budget
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Pitfalls (And How to Avoid Them)
&lt;/h2&gt;

&lt;p&gt;Based on hundreds of user reports across Reddit, Hacker News, and Twitter, here are the mistakes every beginner makes:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Using GSD for Tiny Tasks
&lt;/h3&gt;

&lt;p&gt;GSD's full workflow spawns multiple agents. For a color change or a typo fix, that's massive overkill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Use &lt;code&gt;/gsd:quick&lt;/code&gt; for small tasks, or just prompt Claude directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Rushing Through the Discussion Phase
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;/gsd:discuss-phase&lt;/code&gt; exists because Claude makes assumptions when you don't specify preferences. Skipping it means you'll iterate more later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Spend 5-10 minutes in the discussion phase. It saves hours of back-and-forth.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Not Mapping Existing Codebases
&lt;/h3&gt;

&lt;p&gt;Starting GSD on an existing project without context leads to conflicts with existing patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Always run &lt;code&gt;/gsd:map-codebase&lt;/code&gt; first for brownfield projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Ignoring Token Costs
&lt;/h3&gt;

&lt;p&gt;GSD is token-heavy. Multiple users reported burning through Pro plan ($20/mo) limits quickly. One user reported a 4:1 overhead ratio -- for every 1 token writing code, 4 tokens went to orchestration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; The Max plan ($100-200/mo) is strongly recommended for regular GSD usage. Use the &lt;code&gt;budget&lt;/code&gt; model profile for less critical phases.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Vague Project Descriptions
&lt;/h3&gt;

&lt;p&gt;Vague input at &lt;code&gt;/gsd:new-project&lt;/code&gt; triggers excessive follow-up questions and unfocused research.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Prepare a detailed description before starting. Include: goals, target users, core features, constraints, and tech preferences.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Not Clearing Context Between Phases
&lt;/h3&gt;

&lt;p&gt;Letting context accumulate across phases defeats GSD's purpose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Use &lt;code&gt;clear&lt;/code&gt; between major phases to keep your session lean.&lt;/p&gt;




&lt;h2&gt;
  
  
  GSD vs Other Frameworks
&lt;/h2&gt;

&lt;p&gt;The spec-driven development space has exploded. Here's how GSD compares:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Philosophy&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GSD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lightweight spec-driven, context-rot prevention&lt;/td&gt;
&lt;td&gt;Solo devs, multi-phase projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BMAD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise SDLC, 21+ agents&lt;/td&gt;
&lt;td&gt;Teams, enterprise projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ralph Loop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-iterating autonomy&lt;/td&gt;
&lt;td&gt;Bulk refactors, overnight runs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Superpowers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Skills + guardrails&lt;/td&gt;
&lt;td&gt;Speed-focused workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spec Kit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Static markdown specs&lt;/td&gt;
&lt;td&gt;Vendor-independent workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GSD's sweet spot: &lt;strong&gt;You're a solo developer or small team building something non-trivial, and you want consistent quality without enterprise ceremony.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As one Hacker News user put it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I love the focus on defining what needs to be done and the criteria for completion. These are great practices with or without AI."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Real-World Results
&lt;/h2&gt;

&lt;p&gt;Here's what actual users are reporting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mauvis Ledford&lt;/strong&gt; (LinkedIn): Spent 8 hours testing GSD, compressed 2-3 days of work into ~1 day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steve Adams&lt;/strong&gt; (Hacker News): Successfully delegated Effect pipeline refactoring, DuckDB error parsing, and test suite auditing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max Buckley&lt;/strong&gt; (LinkedIn): Completed a 6-month research project (comparing GLiNER, Mistral 7B, and Claude Haiku for NER) in days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Esteban Torres&lt;/strong&gt; (Blog): GSD produced functionally correct code on first execution for a BlogWatcher UI, requiring only minor stylistic tweaks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not everyone loves it though. Some users find it "so slow, too detailed" for their workflow, and others report that the overhead doesn't pay off for simple projects. Know your use case.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to Use GSD vs When to Skip It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use GSD When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Building a multi-page app or complex feature&lt;/li&gt;
&lt;li&gt;Working on a project spanning multiple sessions&lt;/li&gt;
&lt;li&gt;You need consistent quality across dozens of tasks&lt;/li&gt;
&lt;li&gt;Refactoring large existing codebases&lt;/li&gt;
&lt;li&gt;You want clean, traceable git history&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Skip GSD When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Quick bug fixes or one-liner changes&lt;/li&gt;
&lt;li&gt;Initial prototyping/exploration&lt;/li&gt;
&lt;li&gt;You're on a tight token budget (Pro plan)&lt;/li&gt;
&lt;li&gt;The task is simple enough for a single prompt&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  My Workflow Tips
&lt;/h2&gt;

&lt;p&gt;After researching extensively and talking to GSD power users, here are the productivity hacks that stand out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use separate git worktrees&lt;/strong&gt; for quick tasks while maintaining your primary branch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test uncertain features with &lt;code&gt;/gsd:quick --research&lt;/code&gt;&lt;/strong&gt; before committing to your roadmap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design tokens first, components second, screens third&lt;/strong&gt; -- prevents cascading redesigns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture stray ideas with &lt;code&gt;/gsd:add-todo&lt;/code&gt;&lt;/strong&gt; instead of derailing your current phase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;/gsd:stats&lt;/code&gt;&lt;/strong&gt; to track your project progress and git metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For brownfield projects, always &lt;code&gt;/gsd:map-codebase&lt;/code&gt; first&lt;/strong&gt; -- this prevents Claude from fighting your existing patterns&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Getting Help
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Official Docs&lt;/strong&gt;: The GSD Mintlify documentation is excellent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord&lt;/strong&gt;: Run &lt;code&gt;/gsd:join-discord&lt;/code&gt; to join the community (active and helpful)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X Community&lt;/strong&gt;: 1,200+ members sharing tips and workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Issues&lt;/strong&gt;: Report bugs and feature requests&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;GSD doesn't make Claude Code smarter. It makes Claude Code &lt;strong&gt;reliable&lt;/strong&gt;. By solving context rot through disciplined context engineering, every task gets the full power of Claude's 200K context window.&lt;/p&gt;

&lt;p&gt;The learning curve is minimal -- install with one command, follow the 6-step workflow, and let GSD handle the complexity behind the scenes. The creator said it best:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The complexity is in the system, not in your workflow."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're serious about building with AI, GSD is worth the investment. Not because it's magic, but because it's engineering discipline applied to AI workflows. And in a world of vibecoding chaos, discipline is the superpower.&lt;/p&gt;

&lt;p&gt;Now go get shit done.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about GSD? Found a workflow tip I missed? Connect with me on LinkedIn -- I'd love to hear about your experience with the framework.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>gemini</category>
    </item>
    <item>
      <title>I Built an Email Validation Library and Published It on npm. Here's Everything I Learned</title>
      <dc:creator>Muhammad Ali Kazmi</dc:creator>
      <pubDate>Fri, 26 Dec 2025 05:57:12 +0000</pubDate>
      <link>https://dev.to/alikazmidev/i-built-an-email-validation-library-and-published-it-on-npm-heres-everything-i-learned-1em5</link>
      <guid>https://dev.to/alikazmidev/i-built-an-email-validation-library-and-published-it-on-npm-heres-everything-i-learned-1em5</guid>
      <description>&lt;h2&gt;
  
  
  A Quick Intro
&lt;/h2&gt;

&lt;p&gt;Hey, I'm Muhammad Ali Kazmi, a Full Stack Developer from Karachi, Pakistan with 5+ years of experience building web applications. I've worked on everything from AI-powered SaaS platforms to fintech apps, mostly using React, Node.js, and TypeScript.&lt;/p&gt;

&lt;p&gt;You can find me on &lt;a href="https://github.com/kazmiali" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, &lt;a href="https://linkedin.com/in/alikazmidev" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, or check out my work at &lt;a href="https://developerkazmi.web.app" rel="noopener noreferrer"&gt;developerkazmi.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, onto the story...&lt;/p&gt;

&lt;p&gt;So I spent the last few weeks building an email validation library from scratch and publishing it on npm. Not because the world desperately needed another npm package, but because I wanted to deeply understand how email validation actually works. And honestly, the existing solutions frustrated me.&lt;/p&gt;

&lt;p&gt;In this post, I'll share everything: why I built it, what I learned, the technical decisions that made it 3x faster than alternatives, and how you can use this same approach to build your own npm packages.&lt;/p&gt;

&lt;p&gt;Let's dive in...&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Going To Cover:
&lt;/h2&gt;

&lt;p&gt;• Why I started this project&lt;br&gt;
• The 5 layers of email validation most developers don't know about&lt;br&gt;
• How I made it 3x faster than the competition&lt;br&gt;
• The tech stack decisions (and why)&lt;br&gt;
• How to publish your first npm package&lt;br&gt;
• What I'd do differently next time&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Build Another Email Validator?
&lt;/h2&gt;

&lt;p&gt;Here's the thing. I was using &lt;code&gt;deep-email-validator&lt;/code&gt; in a project. It worked fine, but every time I dug into the code, I found things that bothered me:&lt;/p&gt;

&lt;p&gt;• The TypeScript types were outdated (still using 3.8)&lt;br&gt;
• No bulk validation support&lt;br&gt;
• No caching (validating the same email twice meant doing all the work again)&lt;br&gt;
• Error messages were generic strings like "Invalid email"&lt;br&gt;
• The regex validation wasn't even RFC 5322 compliant&lt;/p&gt;

&lt;p&gt;I thought to myself: "How hard can it be to build something better?"&lt;/p&gt;

&lt;p&gt;Famous last words.&lt;/p&gt;

&lt;p&gt;Turns out, email validation is way more complex than most people think. But that complexity is exactly what made this project worth building.&lt;/p&gt;
&lt;h2&gt;
  
  
  The 5 Layers of Email Validation
&lt;/h2&gt;

&lt;p&gt;Most developers think email validation is just a regex check. Run a pattern, get a boolean, done.&lt;/p&gt;

&lt;p&gt;That's maybe 20% of proper email validation.&lt;/p&gt;

&lt;p&gt;Here's what a production-ready email validator actually needs to check:&lt;/p&gt;
&lt;h3&gt;
  
  
  Layer 1: Regex (Format Validation)
&lt;/h3&gt;

&lt;p&gt;Does the email look like an email? This needs to follow RFC 5322, the actual standard for email formats.&lt;/p&gt;

&lt;p&gt;Fun fact: these are all technically valid emails:&lt;br&gt;
• &lt;code&gt;"john doe"@example.com&lt;/code&gt; (quoted strings)&lt;br&gt;
• &lt;code&gt;user+tag@example.com&lt;/code&gt; (plus addressing)&lt;br&gt;
• &lt;code&gt;user@[192.168.1.1]&lt;/code&gt; (IP address domains)&lt;/p&gt;

&lt;p&gt;Most regex patterns people use from Stack Overflow would reject half of these.&lt;/p&gt;
&lt;h3&gt;
  
  
  Layer 2: Typo Detection
&lt;/h3&gt;

&lt;p&gt;Is &lt;code&gt;user@gmial.com&lt;/code&gt; a valid email format? Yes.&lt;br&gt;
Does Gmail actually exist at &lt;code&gt;gmial.com&lt;/code&gt;? No.&lt;/p&gt;

&lt;p&gt;This layer catches common typos and suggests corrections. "Did you mean gmail.com?"&lt;/p&gt;
&lt;h3&gt;
  
  
  Layer 3: Disposable Email Detection
&lt;/h3&gt;

&lt;p&gt;Mailinator. Guerrillamail. 10minutemail.&lt;/p&gt;

&lt;p&gt;There are over 40,000 disposable email services out there. If you're not blocking these, enjoy your database full of fake users.&lt;/p&gt;
&lt;h3&gt;
  
  
  Layer 4: MX Record Validation
&lt;/h3&gt;

&lt;p&gt;Even if the domain looks legit, does it actually have mail servers configured? This requires DNS lookups to check for MX records.&lt;/p&gt;

&lt;p&gt;No MX records = domain can't receive emails = invalid.&lt;/p&gt;
&lt;h3&gt;
  
  
  Layer 5: SMTP Verification
&lt;/h3&gt;

&lt;p&gt;The final boss. Actually connect to the mail server and ask: "Hey, does this mailbox exist?"&lt;/p&gt;

&lt;p&gt;This is slow (network calls), unreliable (some servers block verification), and optional. But when you need to know for sure, this is how you do it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Making It 3x Faster
&lt;/h2&gt;

&lt;p&gt;Here's where it got interesting.&lt;/p&gt;

&lt;p&gt;The original &lt;code&gt;deep-email-validator&lt;/code&gt; validates emails sequentially. One at a time. No caching. Every validation hits the network for DNS and SMTP.&lt;/p&gt;

&lt;p&gt;I wanted something that could process 100 emails in under 5 seconds.&lt;/p&gt;
&lt;h3&gt;
  
  
  Solution 1: Concurrent Processing
&lt;/h3&gt;

&lt;p&gt;Instead of validating emails one by one, I built a bulk processor that runs validations in parallel with configurable concurrency.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;validateBulk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;onProgress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Progress: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&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;10 concurrent validations means roughly 10x faster bulk processing. Simple math, big impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution 2: Rate Limiting Built-In
&lt;/h3&gt;

&lt;p&gt;But wait. If you're hammering mail servers with verification requests, you'll get blacklisted. Fast.&lt;/p&gt;

&lt;p&gt;I implemented a token bucket rate limiter that controls requests per domain and globally:&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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;validateBulk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;rateLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;perDomain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="p"&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;This prevents abuse while still keeping things fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution 3: Early Exit
&lt;/h3&gt;

&lt;p&gt;If the regex check fails, why bother checking MX records? I added an early exit option that stops validation on first failure.&lt;/p&gt;

&lt;p&gt;With early exit enabled, invalid emails get rejected in &amp;lt; 1ms instead of waiting for network calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution 4: Lazy Loading
&lt;/h3&gt;

&lt;p&gt;The disposable email list has 40,000+ domains. Loading that into memory on every import is wasteful.&lt;/p&gt;

&lt;p&gt;I implemented lazy loading. The dataset only loads when you actually try to validate against it. Faster startup, lower memory footprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;Here's what I used and why:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript 5.3+&lt;/strong&gt; (strict mode)&lt;br&gt;
• Modern type system with template literals&lt;br&gt;
• Better inference than older versions&lt;br&gt;
• Strict mode catches bugs at compile time&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node.js 20+&lt;/strong&gt;&lt;br&gt;
• Latest LTS with native ES modules&lt;br&gt;
• Better performance&lt;br&gt;
• Built-in fetch (finally)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vitest&lt;/strong&gt; (not Jest)&lt;br&gt;
• 10x faster test runs&lt;br&gt;
• Native ESM support&lt;br&gt;
• Same API as Jest, so easy migration&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tsup&lt;/strong&gt; (not tsc directly)&lt;br&gt;
• Zero config bundling&lt;br&gt;
• Dual ESM + CommonJS output&lt;br&gt;
• Proper tree-shaking&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom Validation Utils&lt;/strong&gt; (not Zod)&lt;br&gt;
• Zero dependencies for runtime validation&lt;br&gt;
• Smaller bundle size&lt;br&gt;
• Zod-compatible API for easy migration later&lt;/p&gt;
&lt;h2&gt;
  
  
  The Final Results
&lt;/h2&gt;

&lt;p&gt;After weeks of work, here's what I shipped:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;644 tests passing&lt;/strong&gt; with 90%+ coverage&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5 validators:&lt;/strong&gt;&lt;br&gt;
• Regex (RFC 5322 compliant)&lt;br&gt;
• Typo detection (suggests corrections)&lt;br&gt;
• Disposable email blocking (40,000+ domains)&lt;br&gt;
• MX record validation (with retry logic)&lt;br&gt;
• SMTP verification (optional, for when you really need it)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt;&lt;br&gt;
• Single validation: &amp;lt; 150ms (without SMTP)&lt;br&gt;
• Bulk 100 emails: &amp;lt; 5 seconds&lt;br&gt;
• Package size: ~31KB gzipped&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Experience:&lt;/strong&gt;&lt;br&gt;
• Full TypeScript support&lt;br&gt;
• Three presets (strict, balanced, permissive)&lt;br&gt;
• Detailed error messages with suggestions&lt;br&gt;
• Reputation scoring (0-100)&lt;/p&gt;
&lt;h2&gt;
  
  
  Publishing to npm
&lt;/h2&gt;

&lt;p&gt;This was my first npm package, so here's what I learned:&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Get Your package.json Right
&lt;/h3&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@mailtester/core"&lt;/span&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;"1.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;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dist/index.cjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dist/index.d.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files"&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="s2"&gt;"dist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"README.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"LICENSE"&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;The &lt;code&gt;files&lt;/code&gt; field is crucial. It controls what actually gets published.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Test With npm pack
&lt;/h3&gt;

&lt;p&gt;Before publishing, run &lt;code&gt;npm pack&lt;/code&gt; to see exactly what will be in your package. Check the size. Make sure no secrets or dev files are included.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Publish Beta First
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm publish &lt;span class="nt"&gt;--tag&lt;/span&gt; beta &lt;span class="nt"&gt;--access&lt;/span&gt; public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Publish as beta, test in a real project, fix any issues, then publish stable.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Create GitHub Release
&lt;/h3&gt;

&lt;p&gt;Tag your release, write release notes, push to GitHub. This gives users confidence that the package is maintained.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start with the API design, not the implementation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I spent a lot of time refactoring because I didn't nail down the public API first. Next time, I'd write the README before writing any code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write tests for the public API first.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This forces you to think about how users will actually use your library. My best tests were the ones I wrote before implementing the feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't over-engineer v1.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had plans for plugins, caching layers, browser builds, machine learning... I cut most of it. Ship something that works, then iterate.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;The package is live on npm:&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; @mailtester/core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basic usage:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;validateBulk&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;@mailtester/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Single email&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true/false&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 0-100 reputation score&lt;/span&gt;

&lt;span class="c1"&gt;// Bulk validation&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;validateBulk&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email1@test.com&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="s1"&gt;email2@test.com&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;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;📦 &lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@mailtester/core" rel="noopener noreferrer"&gt;npmjs.com/package/@mailtester/core&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/kazmiali/mailtester" rel="noopener noreferrer"&gt;github.com/kazmiali/mailtester&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📚 &lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://kazmiali.github.io/mailtester/" rel="noopener noreferrer"&gt;kazmiali.github.io/mailtester&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I'm planning to add:&lt;br&gt;
• In-memory LRU caching (v1.1)&lt;br&gt;
• Enhanced reputation scoring with configurable weights&lt;br&gt;
• CLI tool for quick validations&lt;br&gt;
• Maybe a browser build&lt;/p&gt;

&lt;p&gt;If you found this useful, star the repo on GitHub. It helps more than you'd think.&lt;/p&gt;

&lt;p&gt;And if you build something cool with it, let me know. I'd love to see what you create.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
