<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://hebbscode.github.io//feed.xml" rel="self" type="application/atom+xml" /><link href="https://hebbscode.github.io//" rel="alternate" type="text/html" /><updated>2026-06-22T09:18:46+00:00</updated><id>https://hebbscode.github.io//feed.xml</id><title type="html">hebbs</title><subtitle></subtitle><entry><title type="html">why study ai</title><link href="https://hebbscode.github.io//thoughts/ai/2025/10/25/why-study-ai.html" rel="alternate" type="text/html" title="why study ai" /><published>2025-10-25T16:00:00+00:00</published><updated>2025-10-25T16:00:00+00:00</updated><id>https://hebbscode.github.io//thoughts/ai/2025/10/25/why-study-ai</id><content type="html" xml:base="https://hebbscode.github.io//thoughts/ai/2025/10/25/why-study-ai.html"><![CDATA[<p>I had real interest in AI. Then LLMs exploded and I lost it completely.</p>

<h2 id="what-got-hijacked">What Got Hijacked</h2>

<p>Before the LLM boom, AI meant something different to me. Understanding intelligence. Building minds that think. Deep questions about consciousness, reasoning, learning.</p>

<p>Then ChatGPT happened. Suddenly everyone’s an “AI engineer” for calling APIs. Billions of dollars. Closed models. Corporate control. The questions I cared about disappeared from conversation.</p>

<p>Now studying AI feels like surrendering to hype instead of pursuing genuine curiosity.</p>

<h2 id="the-money-problem">The Money Problem</h2>

<p>Only large companies control the cutting edge. OpenAI, Google, Meta. Billions in compute. Closed research. It feels like only money matters.</p>

<p>The most interesting work isn’t at these companies though. It’s in open source projects, individual researchers, problems the big companies ignore.</p>

<p>Corporate dominance is deployment, not innovation. Real advancement comes from understanding fundamentals, novel architectures, research without immediate commercial value.</p>

<h2 id="the-real-question">The Real Question</h2>

<p>Should I study LLMs to catch up? Wrong frame.</p>

<p>The question is: do I want to understand how intelligence works?</p>

<p>LLMs might reveal something about intelligence. Or they might just be very good pattern matchers that don’t actually think. I don’t know yet.</p>

<p>That’s the tension. The questions I care about are about real intelligence. Whether current AI gets me closer to those answers - I’m still figuring that out.</p>

<h2 id="what-matters">What Matters</h2>

<p>If I study this, it’s through implementation. Build a transformer from scratch. Implement attention mechanisms. Train small models. Experiment with novel architectures.</p>

<p>The genuine AI research is still happening. Consciousness in machines. How cognition emerges from computation. Novel architectures that think differently. Understanding intelligence from first principles.</p>

<h2 id="where-i-am">Where I Am</h2>

<p>I want to reconnect with the AI that matters. The questions that made me interested before the hype, before the corporate takeover.</p>

<p>How does a mind work? Can consciousness emerge from computation? What is intelligence? How do you build something that truly thinks?</p>

<p>LLMs might be relevant to these questions. Or they might not. But the questions themselves are eternal.</p>

<p>My real interest didn’t disappear. It got buried under frustration. The challenge is finding the path back to genuine curiosity.</p>

<p>The AI I care about still exists. It’s just not trending on Twitter/X.</p>

<hr />
<p><br />
that was the end of the blog;
Shortly after publishing, I found <b><a href="https://colah.github.io/notes/taste/">this</a></b>. It answered most of my questions, it might answer yours too!</p>]]></content><author><name></name></author><category term="thoughts" /><category term="ai" /><summary type="html"><![CDATA[I had real interest in AI. Then LLMs exploded and I lost it completely.]]></summary></entry><entry><title type="html">scraping at scale</title><link href="https://hebbscode.github.io//technical/scraping/2025/09/30/scraping-at-scale.html" rel="alternate" type="text/html" title="scraping at scale" /><published>2025-09-30T12:00:00+00:00</published><updated>2025-09-30T12:00:00+00:00</updated><id>https://hebbscode.github.io//technical/scraping/2025/09/30/scraping-at-scale</id><content type="html" xml:base="https://hebbscode.github.io//technical/scraping/2025/09/30/scraping-at-scale.html"><![CDATA[<p>I’ve built scraping systems across multiple countries and platforms. Most advice online is wrong or incomplete. Here’s what actually works.</p>

<h2 id="use-playwright--firefox--uv">Use Playwright + Firefox + UV</h2>

<p>Playwright is 30% faster than Selenium with 50% fewer timeout errors. Firefox has an 85% detection rate with Chrome versus 15% when you switch. UV installs packages in 3 seconds instead of 67.</p>

<p>The numbers matter because you’ll be running these systems constantly. Small inefficiencies compound.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="k">with</span> <span class="n">async_playwright</span><span class="p">()</span> <span class="k">as</span> <span class="n">p</span><span class="p">:</span>
    <span class="n">browser</span> <span class="o">=</span> <span class="k">await</span> <span class="n">p</span><span class="p">.</span><span class="n">firefox</span><span class="p">.</span><span class="n">launch</span><span class="p">(</span><span class="n">headless</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
    <span class="n">page</span> <span class="o">=</span> <span class="k">await</span> <span class="n">browser</span><span class="p">.</span><span class="n">new_page</span><span class="p">()</span>
    <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="n">click</span><span class="p">(</span><span class="s">'button:has-text("Load More")'</span><span class="p">)</span>
</code></pre></div></div>

<p>Playwright auto-waits. This eliminates 90% of timing bugs. Selenium makes you handle this manually with explicit waits and arbitrary sleep() calls.</p>

<p>Firefox works because anti-bot systems optimize for Chrome (70% market share). They spend less effort detecting Firefox. The Gecko engine also produces different fingerprints than Blink.</p>

<p>UV is just better package management. Run <code class="language-plaintext highlighter-rouge">uv add playwright</code> and you’re done. Pip takes forever and creates non-deterministic environments.</p>

<h2 id="fresh-browser-contexts">Fresh Browser Contexts</h2>

<p>Modern sites fingerprint everything. Canvas rendering, WebGL, audio context, font enumeration. Reusing the same context creates patterns.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># One browser, multiple contexts
</span><span class="n">browser</span> <span class="o">=</span> <span class="k">await</span> <span class="n">p</span><span class="p">.</span><span class="n">firefox</span><span class="p">.</span><span class="n">launch</span><span class="p">()</span>

<span class="n">context1</span> <span class="o">=</span> <span class="k">await</span> <span class="n">browser</span><span class="p">.</span><span class="n">new_context</span><span class="p">()</span>
<span class="n">page1</span> <span class="o">=</span> <span class="k">await</span> <span class="n">context1</span><span class="p">.</span><span class="n">new_page</span><span class="p">()</span>

<span class="n">context2</span> <span class="o">=</span> <span class="k">await</span> <span class="n">browser</span><span class="p">.</span><span class="n">new_context</span><span class="p">()</span>
<span class="n">page2</span> <span class="o">=</span> <span class="k">await</span> <span class="n">context2</span><span class="p">.</span><span class="n">new_page</span><span class="p">()</span>
</code></pre></div></div>

<p>Each context is a clean slate. No cookies, no localStorage, unique fingerprint. You can run them in parallel. Memory doesn’t leak across contexts.</p>

<h2 id="find-the-api">Find the API</h2>

<p>Most modern sites load data via API. Scraping HTML is slow and fragile. The API is faster and returns structured JSON.</p>

<p>Open the network tab. Look for XHR/Fetch requests. Common patterns: <code class="language-plaintext highlighter-rouge">/api/</code>, <code class="language-plaintext highlighter-rouge">/graphql/</code>, <code class="language-plaintext highlighter-rouge">api.bazaarvoice.com</code>. Capture the request headers and parameters. Replay them directly.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">APIDiscovery</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">setup_monitoring</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">page</span><span class="p">):</span>
        <span class="n">page</span><span class="p">.</span><span class="n">on</span><span class="p">(</span><span class="s">'request'</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">capture_request</span><span class="p">)</span>
    
    <span class="k">async</span> <span class="k">def</span> <span class="nf">capture_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
        <span class="n">url</span> <span class="o">=</span> <span class="n">request</span><span class="p">.</span><span class="n">url</span>
        <span class="k">if</span> <span class="s">'api'</span> <span class="ow">in</span> <span class="n">url</span><span class="p">.</span><span class="n">lower</span><span class="p">():</span>
            <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"Found: </span><span class="si">{</span><span class="n">request</span><span class="p">.</span><span class="n">method</span><span class="si">}</span><span class="s"> </span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
            <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"Headers: </span><span class="si">{</span><span class="nb">dict</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">headers</span><span class="p">)</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Many sites use third-party review systems (Bazaarvoice, Trustpilot). These have public APIs. Hit them directly instead of parsing their JavaScript widgets.</p>

<p>When you find the API, you’re 10x faster than scraping HTML. No CSS selectors to maintain. No waiting for JavaScript to render.</p>

<h2 id="dont-click-next">Don’t Click “Next”</h2>

<p>Clicking pagination buttons is slow and breaks easily. Understand the URL pattern instead.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Instead of clicking 50 times
</span><span class="n">patterns</span> <span class="o">=</span> <span class="p">[</span>
    <span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s">?page=</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">"</span><span class="p">,</span>
    <span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s">/p/</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">"</span><span class="p">,</span>
<span class="p">]</span>

<span class="c1"># Direct navigation
</span><span class="k">for</span> <span class="n">page_num</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">51</span><span class="p">):</span>
    <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="n">goto</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">base_url</span><span class="si">}</span><span class="s">?page=</span><span class="si">{</span><span class="n">page_num</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
</code></pre></div></div>

<p>You can now parallelize. Process page 1, 10, and 20 simultaneously. No sequential clicking. If you know there are 50 pages, you’re done in minutes instead of hours.</p>

<h2 id="act-human">Act Human</h2>

<p>Perfect timing and instant form filling looks robotic. Add variation.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="k">def</span> <span class="nf">human_type</span><span class="p">(</span><span class="n">page</span><span class="p">,</span> <span class="n">selector</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
    <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="n">click</span><span class="p">(</span><span class="n">selector</span><span class="p">)</span>
    <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="n">wait_for_timeout</span><span class="p">(</span><span class="n">random</span><span class="p">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">300</span><span class="p">))</span>
    
    <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">text</span><span class="p">:</span>
        <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="nb">type</span><span class="p">(</span><span class="n">selector</span><span class="p">,</span> <span class="n">char</span><span class="p">,</span> <span class="n">delay</span><span class="o">=</span><span class="n">random</span><span class="p">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="mi">150</span><span class="p">))</span>
        
        <span class="k">if</span> <span class="n">random</span><span class="p">.</span><span class="n">random</span><span class="p">()</span> <span class="o">&lt;</span> <span class="mf">0.05</span><span class="p">:</span>  <span class="c1"># 5% typo rate
</span>            <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="nb">type</span><span class="p">(</span><span class="n">selector</span><span class="p">,</span> <span class="n">random</span><span class="p">.</span><span class="n">choice</span><span class="p">(</span><span class="s">'abcdefgh'</span><span class="p">))</span>
            <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="n">wait_for_timeout</span><span class="p">(</span><span class="n">random</span><span class="p">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="mi">500</span><span class="p">))</span>
            <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="n">press</span><span class="p">(</span><span class="n">selector</span><span class="p">,</span> <span class="s">'Backspace'</span><span class="p">)</span>
    
    <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="n">wait_for_timeout</span><span class="p">(</span><span class="n">random</span><span class="p">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">500</span><span class="p">,</span> <span class="mi">1500</span><span class="p">))</span>
</code></pre></div></div>

<p>Variable typing speed. Occasional typos. Natural pauses. This matters more than you think.</p>

<h2 id="handle-errors-properly">Handle Errors Properly</h2>

<p>Production scraping fails constantly. Timeouts, blocks, layout changes, network issues.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="k">def</span> <span class="nf">scrape_with_retry</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">max_retries</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">attempt</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">max_retries</span><span class="p">):</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="k">async</span> <span class="k">with</span> <span class="n">async_playwright</span><span class="p">()</span> <span class="k">as</span> <span class="n">p</span><span class="p">:</span>
                <span class="n">browser</span> <span class="o">=</span> <span class="k">await</span> <span class="n">p</span><span class="p">.</span><span class="n">firefox</span><span class="p">.</span><span class="n">launch</span><span class="p">()</span>
                <span class="n">context</span> <span class="o">=</span> <span class="k">await</span> <span class="n">browser</span><span class="p">.</span><span class="n">new_context</span><span class="p">()</span>
                <span class="n">page</span> <span class="o">=</span> <span class="k">await</span> <span class="n">context</span><span class="p">.</span><span class="n">new_page</span><span class="p">()</span>
                
                <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="n">goto</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">wait_until</span><span class="o">=</span><span class="s">'networkidle'</span><span class="p">)</span>
                <span class="n">data</span> <span class="o">=</span> <span class="k">await</span> <span class="n">extract_data</span><span class="p">(</span><span class="n">page</span><span class="p">)</span>
                <span class="k">return</span> <span class="n">data</span>
                
        <span class="k">except</span> <span class="nb">TimeoutError</span><span class="p">:</span>
            <span class="n">wait_time</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">**</span> <span class="n">attempt</span>
            <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">wait_time</span><span class="p">)</span>
            
        <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
            <span class="k">if</span> <span class="s">"blocked"</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">).</span><span class="n">lower</span><span class="p">():</span>
                <span class="n">context</span> <span class="o">=</span> <span class="k">await</span> <span class="n">browser</span><span class="p">.</span><span class="n">new_context</span><span class="p">()</span>  <span class="c1"># Fresh context
</span>            <span class="k">else</span><span class="p">:</span>
                <span class="k">raise</span>
</code></pre></div></div>

<p>Different errors need different strategies. Timeouts get exponential backoff. Blocks get fresh contexts. Network errors retry immediately. Missing elements skip gracefully.</p>

<h2 id="take-screenshots">Take Screenshots</h2>

<p>When something breaks in production, you need to see what happened.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="k">def</span> <span class="nf">debug_scrape</span><span class="p">(</span><span class="n">page</span><span class="p">,</span> <span class="n">milestone</span><span class="p">):</span>
    <span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">().</span><span class="n">strftime</span><span class="p">(</span><span class="s">"%H%M%S"</span><span class="p">)</span>
    <span class="k">await</span> <span class="n">page</span><span class="p">.</span><span class="n">screenshot</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="sa">f</span><span class="s">"debug/</span><span class="si">{</span><span class="n">milestone</span><span class="si">}</span><span class="s">_</span><span class="si">{</span><span class="n">timestamp</span><span class="si">}</span><span class="s">.png"</span><span class="p">)</span>
</code></pre></div></div>

<p>Capture screenshots before/after key interactions. On errors. When selectors fail. These saved me hours of debugging blind.</p>

<h2 id="configuration-over-code">Configuration Over Code</h2>

<p>Hard-coding selectors makes your scraper unmaintainable.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"amazon_us"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"selectors"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"search_box"</span><span class="p">:</span><span class="w"> </span><span class="s2">"input#twotabsearchtextbox"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"product_links"</span><span class="p">:</span><span class="w"> </span><span class="s2">"a[data-component-type='s-search-result']"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"price"</span><span class="p">:</span><span class="w"> </span><span class="s2">".a-price-whole"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"delays"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"min"</span><span class="p">:</span><span class="w"> </span><span class="mi">1000</span><span class="p">,</span><span class="w">
      </span><span class="nl">"max"</span><span class="p">:</span><span class="w"> </span><span class="mi">3000</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>When Amazon changes their layout, update the JSON. No code deployment. Non-developers can maintain selectors. You can A/B test different strategies by swapping configs.</p>

<h2 id="control-concurrency">Control Concurrency</h2>

<p>Too many concurrent requests get you blocked. Too few waste time.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">AdaptiveConcurrency</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">initial_limit</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">limit</span> <span class="o">=</span> <span class="n">initial_limit</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">error_rate</span> <span class="o">=</span> <span class="mi">0</span>
    
    <span class="k">def</span> <span class="nf">adjust</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">error_rate</span> <span class="o">&gt;</span> <span class="mf">0.10</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">limit</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">limit</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
        <span class="k">elif</span> <span class="bp">self</span><span class="p">.</span><span class="n">error_rate</span> <span class="o">&lt;</span> <span class="mf">0.02</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">limit</span> <span class="o">+=</span> <span class="mi">1</span>
</code></pre></div></div>

<p>Start with 5 concurrent requests. If errors exceed 10%, reduce. If errors stay below 2%, increase. The system finds its own equilibrium.</p>

<h2 id="reality">Reality</h2>

<p>Production scraping is about resilience, not extraction. Sites change constantly. Anti-bot measures evolve. Your scraper needs to adapt.</p>

<p>The goal isn’t extracting data once. It’s building systems that extract data reliably over years. Focus on observability, maintainability, and respect for target sites.</p>

<p>Use modern tools. Create fresh contexts. Find the APIs. Handle errors well. Take screenshots. Configure everything. Control concurrency.</p>

<p>These patterns work because they’ve survived production.</p>]]></content><author><name></name></author><category term="technical" /><category term="scraping" /><summary type="html"><![CDATA[I’ve built scraping systems across multiple countries and platforms. Most advice online is wrong or incomplete. Here’s what actually works.]]></summary></entry><entry><title type="html">Welcome to Jekyll!</title><link href="https://hebbscode.github.io//jekyll/update/2025/09/27/welcome-to-jekyll.html" rel="alternate" type="text/html" title="Welcome to Jekyll!" /><published>2025-09-27T05:04:11+00:00</published><updated>2025-09-27T05:04:11+00:00</updated><id>https://hebbscode.github.io//jekyll/update/2025/09/27/welcome-to-jekyll</id><content type="html" xml:base="https://hebbscode.github.io//jekyll/update/2025/09/27/welcome-to-jekyll.html"><![CDATA[<div style="border: 2px solid #cccccc; padding: 20px; margin: 20px 0; border-radius: 5px; background-color: #f9f9f9;">

You'll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated.

Jekyll requires blog post files to be named according to the following format:

`YEAR-MONTH-DAY-title.MARKUP`

Where `YEAR` is a four-digit number, `MONTH` and `DAY` are both two-digit numbers, and `MARKUP` is the file extension representing the format used in the file. After that, include the necessary front matter. Take a look at the source for this post to get an idea about how it works.

Jekyll also offers powerful support for code snippets:


<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">print_hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"Hi, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="n">print_hi</span><span class="p">(</span><span class="s1">'Tom'</span><span class="p">)</span>
<span class="c1">#=&gt; prints 'Hi, Tom' to STDOUT.</span></code></pre></figure>


Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll's GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk].

[jekyll-docs]: https://jekyllrb.com/docs/home
[jekyll-gh]:   https://github.com/jekyll/jekyll
[jekyll-talk]: https://talk.jekyllrb.com/

</div>

<p>I have kept the original default post by Jekyll so that I can return and relive this moment of creating this !!</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[[jekyll-docs]: https://jekyllrb.com/docs/home [jekyll-gh]: https://github.com/jekyll/jekyll [jekyll-talk]: https://talk.jekyllrb.com/]]></summary></entry></feed>