<?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: Aqsa Zafar</title>
    <description>The latest articles on DEV Community by Aqsa Zafar (@aqsa_zafar_e47324954dca66).</description>
    <link>https://dev.to/aqsa_zafar_e47324954dca66</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%2F3691117%2F0058fcae-3078-452d-a205-834bd009a152.png</url>
      <title>DEV Community: Aqsa Zafar</title>
      <link>https://dev.to/aqsa_zafar_e47324954dca66</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aqsa_zafar_e47324954dca66"/>
    <language>en</language>
    <item>
      <title>I’ve been using Claude Code hooks with jq and a small Python script to log bash commands and clean tool output automatically.

It made my terminal workflow far more predictable. Sharing the full breakdown here in case it helps others.</title>
      <dc:creator>Aqsa Zafar</dc:creator>
      <pubDate>Wed, 11 Feb 2026 05:04:55 +0000</pubDate>
      <link>https://dev.to/aqsa_zafar_e47324954dca66/ive-been-using-claude-code-hooks-with-jq-and-a-small-python-script-to-log-bash-commands-and-clean-1cl</link>
      <guid>https://dev.to/aqsa_zafar_e47324954dca66/ive-been-using-claude-code-hooks-with-jq-and-a-small-python-script-to-log-bash-commands-and-clean-1cl</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aqsa_zafar_e47324954dca66/building-a-terminal-based-ai-automation-pipeline-with-claude-code-hooks-jq-3bef" class="crayons-story__hidden-navigation-link"&gt;Building a Terminal-Based AI Automation Pipeline with Claude Code Hooks + jq&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/aqsa_zafar_e47324954dca66" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3691117%2F0058fcae-3078-452d-a205-834bd009a152.png" alt="aqsa_zafar_e47324954dca66 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/aqsa_zafar_e47324954dca66" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Aqsa Zafar
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Aqsa Zafar
                
              
              &lt;div id="story-author-preview-content-3247786" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/aqsa_zafar_e47324954dca66" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3691117%2F0058fcae-3078-452d-a205-834bd009a152.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Aqsa Zafar&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/aqsa_zafar_e47324954dca66/building-a-terminal-based-ai-automation-pipeline-with-claude-code-hooks-jq-3bef" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 11&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aqsa_zafar_e47324954dca66/building-a-terminal-based-ai-automation-pipeline-with-claude-code-hooks-jq-3bef" id="article-link-3247786"&gt;
          Building a Terminal-Based AI Automation Pipeline with Claude Code Hooks + jq
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/vibecoding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;vibecoding&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cli"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cli&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/aqsa_zafar_e47324954dca66/building-a-terminal-based-ai-automation-pipeline-with-claude-code-hooks-jq-3bef" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/aqsa_zafar_e47324954dca66/building-a-terminal-based-ai-automation-pipeline-with-claude-code-hooks-jq-3bef#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


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

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

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

&lt;/div&gt;




</description>
      <category>vibecoding</category>
      <category>automation</category>
      <category>cli</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building a Terminal-Based AI Automation Pipeline with Claude Code Hooks + jq</title>
      <dc:creator>Aqsa Zafar</dc:creator>
      <pubDate>Wed, 11 Feb 2026 05:01:53 +0000</pubDate>
      <link>https://dev.to/aqsa_zafar_e47324954dca66/building-a-terminal-based-ai-automation-pipeline-with-claude-code-hooks-jq-3bef</link>
      <guid>https://dev.to/aqsa_zafar_e47324954dca66/building-a-terminal-based-ai-automation-pipeline-with-claude-code-hooks-jq-3bef</guid>
      <description>&lt;p&gt;When I started using Claude Code inside the terminal, I noticed something important.&lt;/p&gt;

&lt;p&gt;Prompts are flexible. But flexibility also means variability.&lt;/p&gt;

&lt;p&gt;If you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Predictable formatting&lt;/li&gt;
&lt;li&gt;Structured logging&lt;/li&gt;
&lt;li&gt;Validation before execution&lt;/li&gt;
&lt;li&gt;Cleaned terminal output&lt;/li&gt;
&lt;li&gt;Error detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prompts alone are not enough.&lt;/p&gt;

&lt;p&gt;Hooks give you control.&lt;/p&gt;

&lt;p&gt;In this post, I’ll show you how I combine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;post-tool-use&lt;/code&gt; hooks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jq&lt;/code&gt; for JSON parsing&lt;/li&gt;
&lt;li&gt;A small Python script for output cleaning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple: turn Claude Code into a predictable automation layer inside the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. How Hooks Actually Work
&lt;/h2&gt;

&lt;p&gt;Claude Code triggers lifecycle events such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pre-tool-use&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;post-tool-use&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session-start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session-end&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user-prompt-submit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a hook is registered for one of these events, Claude passes a structured JSON payload to the hook &lt;strong&gt;via standard input (stdin)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That detail matters.&lt;/p&gt;

&lt;p&gt;Your hook script reads the event JSON from stdin, processes it, and optionally prints modified output.&lt;/p&gt;

&lt;p&gt;So every example below assumes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Claude pipes event JSON into your hook command via stdin.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. Inspecting the Hook Payload with jq
&lt;/h2&gt;

&lt;p&gt;Every hook receives JSON like this:&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;"tool_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;"bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool_input"&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;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ls -a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"List all files including hidden ones"&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;"tool_response"&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;"stdout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"file1&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;file2&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You rarely need the entire payload. You usually need specific fields.&lt;/p&gt;

&lt;p&gt;Install &lt;code&gt;jq&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;macOS&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;brew &lt;span class="nb"&gt;install &lt;/span&gt;jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ubuntu&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;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Extract Specific Fields
&lt;/h2&gt;

&lt;p&gt;Since Claude pipes JSON into stdin, your hook command can read directly from it.&lt;/p&gt;

&lt;p&gt;Extract command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.tool_input.code'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extract description: ""&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.tool_input.description'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Combine both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'"\(.tool_input.code) - \(.tool_input.description)"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-r&lt;/code&gt; flag prints raw output (no quotes).&lt;/p&gt;

&lt;p&gt;This is the foundation for logging and enforcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Logging Every Bash Command (post-tool-use Hook)
&lt;/h2&gt;

&lt;p&gt;Now let’s make it real.&lt;/p&gt;

&lt;p&gt;Goal: log every Bash command Claude executes.&lt;/p&gt;

&lt;p&gt;Why &lt;code&gt;post-tool-use&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Because I want to log what actually ran, not what was proposed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal Hook Configuration Example
&lt;/h2&gt;

&lt;p&gt;Inside your Claude settings (user-level or project-level), the hook entry looks like this conceptually:&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;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post-tool-use"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&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;"tool"&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"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jq -r '&lt;/span&gt;&lt;span class="se"&gt;\"\\&lt;/span&gt;&lt;span class="s2"&gt;(.tool_input.code) - &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;(.tool_input.description)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;' &amp;gt;&amp;gt; ~/.claude/bash-command-log.txt"&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;What happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bash tool runs&lt;/li&gt;
&lt;li&gt;Claude triggers &lt;code&gt;post-tool-use&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;JSON payload is piped into &lt;code&gt;jq&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Extracted values are appended to log file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now your terminal activity becomes traceable.&lt;/p&gt;

&lt;p&gt;This is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debugging&lt;/li&gt;
&lt;li&gt;Workflow auditing&lt;/li&gt;
&lt;li&gt;Understanding automation patterns&lt;/li&gt;
&lt;li&gt;Reviewing repeated commands&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Cleaning Tool Output with Python (Post-Processing Layer)
&lt;/h2&gt;

&lt;p&gt;Now let’s improve readability.&lt;/p&gt;

&lt;p&gt;Large outputs like:&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="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can flood the interface.&lt;/p&gt;

&lt;p&gt;Instead of manually scanning it, intercept and clean it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hook Command (Conceptual)
&lt;/h2&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;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post-tool-use"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python3 ~/.claude/hooks/clean_validate_hook.py"&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;Claude pipes JSON into that script via stdin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Python Script: clean_validate_hook.py
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSONDecodeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tool_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="n"&gt;stdout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tool_response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stdout&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Remove common ANSI color codes
&lt;/span&gt;&lt;span class="n"&gt;clean_output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\x1b\[[0-9;]*m&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Limit preview length
&lt;/span&gt;&lt;span class="n"&gt;preview_limit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;preview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;preview_limit&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;preview&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads event JSON from stdin&lt;/li&gt;
&lt;li&gt;Extracts &lt;code&gt;stdout&lt;/code&gt; safely&lt;/li&gt;
&lt;li&gt;Removes common ANSI color codes&lt;/li&gt;
&lt;li&gt;Limits output to first 10 lines&lt;/li&gt;
&lt;li&gt;Prints a clean preview&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can extend it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detect errors&lt;/li&gt;
&lt;li&gt;Highlight warnings&lt;/li&gt;
&lt;li&gt;Add timestamps&lt;/li&gt;
&lt;li&gt;Save summaries to a log file&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. What This Pipeline Actually Gives You
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;Hooks&lt;/li&gt;
&lt;li&gt;jq&lt;/li&gt;
&lt;li&gt;A small Python script&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You now have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structured command logging&lt;/li&gt;
&lt;li&gt;Controlled output formatting&lt;/li&gt;
&lt;li&gt;Automatic enforcement layer&lt;/li&gt;
&lt;li&gt;Repeatable terminal behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude stops being just a prompt interface. It becomes programmable middleware inside your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Security Considerations
&lt;/h2&gt;

&lt;p&gt;Hooks run with your environment’s permissions.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Validate input&lt;/li&gt;
&lt;li&gt;Avoid exposing secrets&lt;/li&gt;
&lt;li&gt;Keep scripts under version control&lt;/li&gt;
&lt;li&gt;Review commands before registering them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat hooks like infrastructure, not shortcuts.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Where This Can Break
&lt;/h2&gt;

&lt;p&gt;Be realistic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If payload structure changes, jq filters must update&lt;/li&gt;
&lt;li&gt;If tool output changes format, parsing may fail&lt;/li&gt;
&lt;li&gt;Over-filtering can hide useful debugging data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep hooks small. Keep them explicit.&lt;/p&gt;

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

&lt;p&gt;Once you start intercepting tool events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You stop reacting to output&lt;/li&gt;
&lt;li&gt;You start shaping it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s the difference between using a tool and engineering a workflow.&lt;/p&gt;

&lt;p&gt;If you want to see the full structured walkthrough, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hook setup inside Claude&lt;/li&gt;
&lt;li&gt;jq parsing patterns&lt;/li&gt;
&lt;li&gt;Advanced matchers&lt;/li&gt;
&lt;li&gt;Subagents&lt;/li&gt;
&lt;li&gt;MCP integrations&lt;/li&gt;
&lt;li&gt;GitHub Actions automation&lt;/li&gt;
&lt;li&gt;Plugin development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve documented everything step by step here:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://youtube.com/playlist?list=PL-F5kYFVRcIvZQ_LEbdLIZrohgbf-Vock&amp;amp;si=GycVGYKDNAgykfFt" rel="noopener noreferrer"&gt;Claude Code Course — Step-by-Step Guide from CLI to Real Workflows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re already using Claude Code in the terminal, I’m curious:&lt;/p&gt;

&lt;p&gt;Are you still relying on prompts, or are you intercepting the pipeline?&lt;/p&gt;

&lt;p&gt;Because once you control lifecycle events, your terminal becomes predictable.&lt;/p&gt;

&lt;p&gt;Happy Learning!&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>automation</category>
      <category>cli</category>
      <category>ai</category>
    </item>
    <item>
      <title>I was reading the docs, but still felt lost.

Things only started making sense when I learned Claude Code in the right order.

This post explains that order.</title>
      <dc:creator>Aqsa Zafar</dc:creator>
      <pubDate>Sun, 25 Jan 2026 05:29:57 +0000</pubDate>
      <link>https://dev.to/aqsa_zafar_e47324954dca66/i-was-reading-the-docs-but-still-felt-lost-things-only-started-making-sense-when-i-learned-1p50</link>
      <guid>https://dev.to/aqsa_zafar_e47324954dca66/i-was-reading-the-docs-but-still-felt-lost-things-only-started-making-sense-when-i-learned-1p50</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/aqsa_zafar_e47324954dca66" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3691117%2F0058fcae-3078-452d-a205-834bd009a152.png" alt="aqsa_zafar_e47324954dca66"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/aqsa_zafar_e47324954dca66/learning-claude-code-the-order-that-finally-made-sense-to-me-4mlj" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Learning Claude Code: the order that finally made sense to me&lt;/h2&gt;
      &lt;h3&gt;Aqsa Zafar ・ Jan 3&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#automation&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#coding&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#developer&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>automation</category>
      <category>coding</category>
      <category>developer</category>
    </item>
    <item>
      <title>Learning Python Changed How I Approach Problems</title>
      <dc:creator>Aqsa Zafar</dc:creator>
      <pubDate>Sun, 25 Jan 2026 05:26:23 +0000</pubDate>
      <link>https://dev.to/aqsa_zafar_e47324954dca66/learning-python-changed-how-i-approach-problems-23jg</link>
      <guid>https://dev.to/aqsa_zafar_e47324954dca66/learning-python-changed-how-i-approach-problems-23jg</guid>
      <description>&lt;p&gt;I didn’t pick Python because it was trendy.&lt;/p&gt;

&lt;p&gt;I picked it because I wanted my code to make sense when I looked at it weeks later.&lt;/p&gt;

&lt;p&gt;That one decision changed how I work with software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Python Forces You to Think Clearly
&lt;/h2&gt;

&lt;p&gt;In the beginning, Python feels easy.&lt;/p&gt;

&lt;p&gt;That’s not the important part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What matters is this:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You spend less time fighting syntax and more time thinking about logic.&lt;/p&gt;

&lt;p&gt;When the language stays out of your way, mistakes become obvious.&lt;/p&gt;

&lt;p&gt;You start asking better questions.&lt;/p&gt;

&lt;p&gt;That’s where learning actually happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Learning Python Really Looks Like
&lt;/h2&gt;

&lt;p&gt;Most people expect instant results.&lt;/p&gt;

&lt;p&gt;That’s not how it works.&lt;/p&gt;

&lt;h3&gt;
  
  
  First phase: Getting comfortable
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;variables and data types&lt;/li&gt;
&lt;li&gt;conditions and loops&lt;/li&gt;
&lt;li&gt;functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing fancy.&lt;/p&gt;

&lt;p&gt;But you start seeing patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Second phase: Working with real input
&lt;/h3&gt;

&lt;p&gt;Now you deal with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;files that aren’t clean&lt;/li&gt;
&lt;li&gt;values that are missing or wrong&lt;/li&gt;
&lt;li&gt;code that breaks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where most learners quit.&lt;/p&gt;

&lt;p&gt;This is also where Python starts paying off.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;real problems are messy&lt;br&gt;
Python is built for that mess&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Third phase: Writing code you can trust
&lt;/h3&gt;

&lt;p&gt;You begin to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;separate logic into functions&lt;/li&gt;
&lt;li&gt;reuse code without copying&lt;/li&gt;
&lt;li&gt;read errors instead of fearing them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, Python stops feeling “easy”.&lt;/p&gt;

&lt;p&gt;It starts feeling reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small Changes That Made a Big Difference
&lt;/h2&gt;

&lt;p&gt;Earlier, I wrote code like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It worked.&lt;/p&gt;

&lt;p&gt;Until it didn’t.&lt;/p&gt;

&lt;p&gt;Later, I wrote code like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="n"&gt;user_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same output.&lt;/p&gt;

&lt;p&gt;Very different mindset.&lt;/p&gt;

&lt;p&gt;Now the code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is readable&lt;/li&gt;
&lt;li&gt;is reusable&lt;/li&gt;
&lt;li&gt;breaks less often&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This shift matters more than any framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Python Helped Me Build, Not Just Learn
&lt;/h2&gt;

&lt;p&gt;Python didn’t just teach me syntax.&lt;/p&gt;

&lt;p&gt;It helped me build things that solved actual problems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cleaning data&lt;/li&gt;
&lt;li&gt;automating repetitive tasks&lt;/li&gt;
&lt;li&gt;testing ideas quickly&lt;/li&gt;
&lt;li&gt;fixing bugs without panic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once that happens, confidence comes naturally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Many People Struggle With Python
&lt;/h2&gt;

&lt;p&gt;Not because Python is hard.&lt;/p&gt;

&lt;p&gt;Because they jump too fast.&lt;/p&gt;

&lt;p&gt;They skip:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strong basics&lt;/li&gt;
&lt;li&gt;functions&lt;/li&gt;
&lt;li&gt;real practice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then they blame libraries.&lt;/p&gt;

&lt;p&gt;The foundation matters more than the tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  If You’re Learning Python Now
&lt;/h2&gt;

&lt;p&gt;Focus on this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;write small programs&lt;/li&gt;
&lt;li&gt;finish what you start&lt;/li&gt;
&lt;li&gt;revisit your own code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Progress comes from clarity, not speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Structured Python Path (Free)
&lt;/h2&gt;

&lt;p&gt;I’m currently building a Python for Data Science course.&lt;/p&gt;

&lt;p&gt;It’s not finished yet, and that’s intentional.&lt;/p&gt;

&lt;p&gt;I’m releasing it in parts.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;first 5 lessons are already live on YouTube&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They start from the basics and move slowly into real usage, with examples you’ll actually see in data work.&lt;/p&gt;

&lt;p&gt;You can access them here:&lt;br&gt;
👉 &lt;a href="https://youtube.com/playlist?list=PL-F5kYFVRcIuzH3W5Kqm4eqUp9IJLLhp4&amp;amp;si=VJr1mU2bQHa-9Bks" rel="noopener noreferrer"&gt;Python for Data Science – Beginner to Practical Full Course&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ll keep adding lessons as the course grows, keeping the foundation strong instead of rushing ahead.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>ai</category>
      <category>datascience</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Aqsa Zafar</dc:creator>
      <pubDate>Mon, 05 Jan 2026 12:45:35 +0000</pubDate>
      <link>https://dev.to/aqsa_zafar_e47324954dca66/-10pd</link>
      <guid>https://dev.to/aqsa_zafar_e47324954dca66/-10pd</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/aqsa_zafar_e47324954dca66" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3691117%2F0058fcae-3078-452d-a205-834bd009a152.png" alt="aqsa_zafar_e47324954dca66"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/aqsa_zafar_e47324954dca66/a-practical-roadmap-to-learn-generative-ai-without-wasting-months-396f" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;A Practical Roadmap to Learn Generative AI (Without Wasting Months)&lt;/h2&gt;
      &lt;h3&gt;Aqsa Zafar ・ Jan 5&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#deeplearning&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#rag&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mcp&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>deeplearning</category>
      <category>rag</category>
      <category>mcp</category>
    </item>
    <item>
      <title>A Practical Roadmap to Learn Generative AI (Without Wasting Months)</title>
      <dc:creator>Aqsa Zafar</dc:creator>
      <pubDate>Mon, 05 Jan 2026 12:44:40 +0000</pubDate>
      <link>https://dev.to/aqsa_zafar_e47324954dca66/a-practical-roadmap-to-learn-generative-ai-without-wasting-months-396f</link>
      <guid>https://dev.to/aqsa_zafar_e47324954dca66/a-practical-roadmap-to-learn-generative-ai-without-wasting-months-396f</guid>
      <description>&lt;p&gt;Most learning guides jump straight into tools. That’s why many people stall halfway through.&lt;/p&gt;

&lt;p&gt;Generative AI is not about tools first. It’s about &lt;strong&gt;foundations&lt;/strong&gt;, &lt;strong&gt;systems thinking&lt;/strong&gt;, and &lt;strong&gt;how things actually run&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If your goal is to build generative AI systems, not just try demos, the learning order matters.&lt;/p&gt;

&lt;p&gt;This article lays out that order. It also points to structured learning paths that match each stage. Those are optional. They exist to save time, not replace thinking.&lt;/p&gt;

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

&lt;p&gt;Many learners start with “build GenAI apps” without understanding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how data is structured&lt;/li&gt;
&lt;li&gt;how models are trained and evaluated&lt;/li&gt;
&lt;li&gt;how systems fail in production&lt;/li&gt;
&lt;li&gt;how cost, latency, and reliability trade off&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Skipping basics doesn’t make learning faster. It pushes the confusion downstream.&lt;/p&gt;

&lt;p&gt;A roadmap isn’t about speed. It’s about avoiding rework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 1 — Python &amp;amp; Programming Fundamentals
&lt;/h2&gt;

&lt;p&gt;Generative AI work is code-first.&lt;/p&gt;

&lt;p&gt;You should be comfortable writing Python that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reads and transforms data&lt;/li&gt;
&lt;li&gt;calls APIs&lt;/li&gt;
&lt;li&gt;implements basic algorithms&lt;/li&gt;
&lt;li&gt;runs locally and in the cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this layer is weak, everything above it feels fragile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision lens&lt;/strong&gt;&lt;br&gt;
If reading Python that handles APIs or data still slows you down, start here. If you already write Python comfortably, move on.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to focus on
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python basics (variables, loops, functions)&lt;/li&gt;
&lt;li&gt;Data structures (lists, dictionaries, DataFrames)&lt;/li&gt;
&lt;li&gt;Debugging and testing&lt;/li&gt;
&lt;li&gt;Jupyter / Colab workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Optional structured paths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://imp.i384100.net/xLeD31" rel="noopener noreferrer"&gt;AI Python for Beginners&lt;/a&gt; — Coursera&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datacamp.pxf.io/POeN9e" rel="noopener noreferrer"&gt;Introduction to Python for Data Science&lt;/a&gt; — DataCamp&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://trk.udemy.com/qzQX9n" rel="noopener noreferrer"&gt;Python for AI and Machine Learning&lt;/a&gt; — Udemy&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://click.linksynergy.com/deeplink?id=Vrr1tRSwXGM&amp;amp;mid=53187&amp;amp;murl=https%3A%2F%2Fwww.udacity.com%2Fcourse%2Fai-programming-python-nanodegree--nd089" rel="noopener noreferrer"&gt;AI Programming with Python Nanodegree&lt;/a&gt; — Udacity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Skipping this stage usually costs more time later than it saves now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 2 — Data Handling &amp;amp; Machine Learning Basics
&lt;/h2&gt;

&lt;p&gt;Generative systems sit on top of machine learning.&lt;/p&gt;

&lt;p&gt;If you don’t understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;supervised vs unsupervised learning&lt;/li&gt;
&lt;li&gt;evaluation and validation&lt;/li&gt;
&lt;li&gt;feature engineering&lt;/li&gt;
&lt;li&gt;workflow automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then model behavior feels unpredictable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision lens&lt;/strong&gt;&lt;br&gt;
If accuracy metrics, overfitting, or evaluation still feel unclear, this stage matters more than any GenAI tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mental models to build
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;how models learn patterns&lt;/li&gt;
&lt;li&gt;where bias and leakage come from&lt;/li&gt;
&lt;li&gt;why generalization fails&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Optional structured paths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://datacamp.pxf.io/POeN9e" rel="noopener noreferrer"&gt;Machine Learning Scientist with Python&lt;/a&gt; — DataCamp&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datacamp.pxf.io/rQdLbQ[](url)" rel="noopener noreferrer"&gt;Data Scientist in Python&lt;/a&gt; — DataCamp&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://trk.udemy.com/2aNJDO" rel="noopener noreferrer"&gt;Machine Learning &amp;amp; AI Engineering with Python&lt;/a&gt; — Udemy&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://imp.i384100.net/9W1W9E" rel="noopener noreferrer"&gt;ML specializations on Coursera&lt;/a&gt; (regression, classification, evaluation)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This stage explains &lt;em&gt;why&lt;/em&gt; models behave the way they do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 3 — Deep Learning &amp;amp; Neural Networks
&lt;/h2&gt;

&lt;p&gt;Modern generative systems are neural-network based. Treating them as black boxes leads to shallow understanding.&lt;/p&gt;

&lt;p&gt;You should understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what neural networks actually learn&lt;/li&gt;
&lt;li&gt;how training works (loss, backpropagation)&lt;/li&gt;
&lt;li&gt;how representations form&lt;/li&gt;
&lt;li&gt;why attention and transformers matter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This stage is conceptual, not math-heavy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision lens&lt;/strong&gt;&lt;br&gt;
If transformers still feel like buzzwords instead of mechanisms, pause here before moving on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional structured paths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://imp.i384100.net/3ej3BM" rel="noopener noreferrer"&gt;Deep learning paths on Coursera&lt;/a&gt; or Udemy (for example, &lt;a href="https://trk.udemy.com/RGA3q7" rel="noopener noreferrer"&gt;Deep Learning A–Z&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://imp.i384100.net/MAP3zP" rel="noopener noreferrer"&gt;Generative AI with Large Language Models&lt;/a&gt; — Coursera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, classic ML concepts start connecting to modern generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 4 — Generative AI Systems
&lt;/h2&gt;

&lt;p&gt;Now foundations turn into systems.&lt;/p&gt;

&lt;p&gt;This stage connects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transformer architecture&lt;/li&gt;
&lt;li&gt;prompt design fundamentals&lt;/li&gt;
&lt;li&gt;retrieval-augmented generation (RAG)&lt;/li&gt;
&lt;li&gt;embeddings and vector stores&lt;/li&gt;
&lt;li&gt;evaluation for generation (not accuracy scores)&lt;/li&gt;
&lt;li&gt;failure modes and responsible use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where many people start and why many struggle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision lens&lt;/strong&gt;&lt;br&gt;
If you want systems that work beyond demos, this stage matters more than model size or tooling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional structured paths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://imp.i384100.net/MAP3zP" rel="noopener noreferrer"&gt;Generative AI with Large Language Models&lt;/a&gt; — Coursera&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://trk.udemy.com/2aNJDO" rel="noopener noreferrer"&gt;Machine Learning, Data Science &amp;amp; AI Engineering with Python&lt;/a&gt; — Udemy&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://click.linksynergy.com/deeplink?id=Vrr1tRSwXGM&amp;amp;mid=53187&amp;amp;murl=https%3A%2F%2Fwww.udacity.com%2Fcourse%2Fgenerative-ai--nd608" rel="noopener noreferrer"&gt;Applied Generative AI Engineering&lt;/a&gt; — Udacity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, you stop building toy examples and start thinking like a system designer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 5 — Projects &amp;amp; Real Workflows
&lt;/h2&gt;

&lt;p&gt;Courses build understanding. Projects expose gaps.&lt;/p&gt;

&lt;p&gt;Focus on workflows that include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data ingestion and cleaning&lt;/li&gt;
&lt;li&gt;model selection and tuning&lt;/li&gt;
&lt;li&gt;batch and real-time inference&lt;/li&gt;
&lt;li&gt;logging, monitoring, and failure handling&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;RAG-based search assistant&lt;/li&gt;
&lt;li&gt;code assistant using LLM APIs&lt;/li&gt;
&lt;li&gt;multimodal pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, courses support learning. They no longer drive it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Should Not Jump to Advanced Courses Yet
&lt;/h2&gt;

&lt;p&gt;Pause if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python code still feels hard to read&lt;/li&gt;
&lt;li&gt;evaluation metrics are confusing&lt;/li&gt;
&lt;li&gt;you can’t explain how a model learns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Structured programs don’t fix missing fundamentals. Practice does.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use This Roadmap
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Fix coding and data foundations&lt;/li&gt;
&lt;li&gt;Build core ML understanding&lt;/li&gt;
&lt;li&gt;Learn deep learning concepts&lt;/li&gt;
&lt;li&gt;Design generative systems&lt;/li&gt;
&lt;li&gt;Apply through real workflows&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Courses are tools. Order is what makes them useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources Referenced (by Gap)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you need Python structure&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://imp.i384100.net/xLeD31" rel="noopener noreferrer"&gt;AI Python for Beginners&lt;/a&gt; — Coursera&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datacamp.pxf.io/POeN9e" rel="noopener noreferrer"&gt;Introduction to Python for Data Science&lt;/a&gt; — DataCamp&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://click.linksynergy.com/deeplink?id=Vrr1tRSwXGM&amp;amp;mid=53187&amp;amp;murl=https%3A%2F%2Fwww.udacity.com%2Fcourse%2Fai-programming-python-nanodegree--nd089" rel="noopener noreferrer"&gt;AI Programming with Python&lt;/a&gt; — Udacity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you need ML depth&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://datacamp.pxf.io/POeN9e" rel="noopener noreferrer"&gt;Machine Learning Scientist with Python&lt;/a&gt; — DataCamp&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datacamp.pxf.io/rQdLbQ" rel="noopener noreferrer"&gt;Data Scientist in Python&lt;/a&gt; — DataCamp&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://trk.udemy.com/2aNJDO" rel="noopener noreferrer"&gt;Machine Learning &amp;amp; AI Engineering with Python&lt;/a&gt; — Udemy&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://imp.i384100.net/9W1W9E" rel="noopener noreferrer"&gt;ML specializations&lt;/a&gt; on Coursera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you need GenAI system understanding&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://imp.i384100.net/MAP3zP" rel="noopener noreferrer"&gt;Generative AI with Large Language Models&lt;/a&gt; — Coursera&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://trk.udemy.com/2aNJDO" rel="noopener noreferrer"&gt;Machine Learning, Data Science &amp;amp; AI Engineering with Python&lt;/a&gt; — Udemy&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://click.linksynergy.com/deeplink?id=Vrr1tRSwXGM&amp;amp;mid=53187&amp;amp;murl=https%3A%2F%2Fwww.udacity.com%2Fcourse%2Fgenerative-ai--nd608" rel="noopener noreferrer"&gt;Applied Generative AI Engineering&lt;/a&gt; — Udacity&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Note
&lt;/h2&gt;

&lt;p&gt;If you already know your gaps, structured programs can save months.&lt;br&gt;
If you don’t, fix the order first. No course can compensate for that.&lt;/p&gt;

&lt;p&gt;Happy learning.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deeplearning</category>
      <category>rag</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Learning Claude Code: the order that finally made sense to me</title>
      <dc:creator>Aqsa Zafar</dc:creator>
      <pubDate>Sat, 03 Jan 2026 10:17:41 +0000</pubDate>
      <link>https://dev.to/aqsa_zafar_e47324954dca66/learning-claude-code-the-order-that-finally-made-sense-to-me-4mlj</link>
      <guid>https://dev.to/aqsa_zafar_e47324954dca66/learning-claude-code-the-order-that-finally-made-sense-to-me-4mlj</guid>
      <description>&lt;p&gt;When I first started using Claude Code, the documentation helped explain features, but I still struggled to understand how everything fit together in real workflows.&lt;/p&gt;

&lt;p&gt;I knew what each piece did in isolation.&lt;br&gt;
I didn’t know &lt;strong&gt;when&lt;/strong&gt; or &lt;strong&gt;why&lt;/strong&gt; to use them.&lt;/p&gt;

&lt;p&gt;I kept getting stuck on questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What actually runs locally?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do context, hooks, and subagents interact?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Where does MCP fit without overcomplicating things?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How is this different from a normal CLI or automation setup?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of jumping between topics, I wrote down a &lt;strong&gt;learning order&lt;/strong&gt; that helped me build a clear mental model.&lt;/p&gt;

&lt;p&gt;This isn’t the only way to learn Claude Code.&lt;br&gt;
It’s just the sequence that reduced confusion for me.&lt;/p&gt;

&lt;h3&gt;
  
  
  The sequence that worked for me
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. What Claude Code is (and what it isn’t)
&lt;/h4&gt;

&lt;p&gt;Before touching setup, I needed clarity on scope:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This isn’t just “Claude in a terminal”&lt;/li&gt;
&lt;li&gt;It’s a structured system with context, tools, and automation hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That framing mattered.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Installation (CLI + VS Code)
&lt;/h4&gt;

&lt;p&gt;Getting both set up early helped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI for understanding how commands actually run&lt;/li&gt;
&lt;li&gt;VS Code for visibility and iteration&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Basic CLI usage
&lt;/h4&gt;

&lt;p&gt;Before abstractions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run commands&lt;/li&gt;
&lt;li&gt;See outputs&lt;/li&gt;
&lt;li&gt;Break things&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This grounded everything else.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Slash commands and context handling
&lt;/h4&gt;

&lt;p&gt;This is where Claude Code starts feeling different from chat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commands change behavior&lt;/li&gt;
&lt;li&gt;Context accumulation explains why responses differ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing advanced yet — just observing patterns.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Claude.md and behavior control
&lt;/h4&gt;

&lt;p&gt;Once context made sense, Claude.md finally clicked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistent instructions&lt;/li&gt;
&lt;li&gt;Predictable behavior&lt;/li&gt;
&lt;li&gt;Fewer “why did it respond like that?” moments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teaching this earlier felt too abstract for me.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Output styles and skills
&lt;/h4&gt;

&lt;p&gt;This was the first point where behavior customization felt concrete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Output styles show visible changes&lt;/li&gt;
&lt;li&gt;Skills make those changes reusable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seeing results mattered more than theory here.&lt;/p&gt;

&lt;h4&gt;
  
  
  7. Hooks with practical examples
&lt;/h4&gt;

&lt;p&gt;Hooks only made sense once I had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stable commands&lt;/li&gt;
&lt;li&gt;Predictable output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using them for logging, cleanup, or small workflow tweaks made the idea stick.&lt;/p&gt;

&lt;h4&gt;
  
  
  8. Subagents and delegation
&lt;/h4&gt;

&lt;p&gt;At this stage, delegation felt natural instead of magical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One agent, one responsibility&lt;/li&gt;
&lt;li&gt;Clear boundaries&lt;/li&gt;
&lt;li&gt;Less mental overload&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  9. MCP basics, then local tools
&lt;/h4&gt;

&lt;p&gt;I intentionally kept MCP late:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Early exposure just added confusion&lt;/li&gt;
&lt;li&gt;After hooks and subagents, MCP felt like an extension, not a leap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Local tools were especially helpful for understanding real integrations.&lt;/p&gt;

&lt;h4&gt;
  
  
  10. Using it alongside GitHub Actions and YAML
&lt;/h4&gt;

&lt;p&gt;Only after everything above did automation make sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code as part of a system&lt;/li&gt;
&lt;li&gt;Not a replacement for CI/CD&lt;/li&gt;
&lt;li&gt;A collaborator inside workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final thoughts
&lt;/h3&gt;

&lt;p&gt;Experienced users may find this obvious.&lt;br&gt;
But for me, learning Claude Code linearly — instead of feature-hopping — made the tool much easier to reason about.&lt;/p&gt;

&lt;p&gt;Other orders probably work too.&lt;br&gt;
This is simply what helped me move from “I’ve read the docs” to “I understand how this fits together.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;I turned these notes into a short, step-by-step playlist so I could revisit concepts as I learned.&lt;/p&gt;

&lt;p&gt;Playlist: &lt;strong&gt;&lt;a href="https://youtube.com/playlist?list=PL-F5kYFVRcIvZQ_LEbdLIZrohgbf-Vock&amp;amp;si=XObAuRMlJT7T3yrY" rel="noopener noreferrer"&gt;Claude Code Tutorial Series&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>coding</category>
      <category>developer</category>
    </item>
  </channel>
</rss>
