<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Aamir Shahzad - Notes</title>
    <link>https://aamirshahzad.uk</link>
    <description>Software Engineer specializing in Scalable Django Architectures, Technical SEO, and Applied AI. Currently documenting experiments with Large Language Models.</description>
    <language>en-GB</language>
    <lastBuildDate>Wed, 20 May 2026 23:47:27 GMT</lastBuildDate>
    <atom:link href="https://aamirshahzad.uk/feed.xml" rel="self" type="application/rss+xml"/>
    <managingEditor>info@aamirshahzad.uk (Aamir Shahzad)</managingEditor>
    <webMaster>info@aamirshahzad.uk (Aamir Shahzad)</webMaster>
    <image>
      <url>https://aamirshahzad.uk/og-image.png</url>
      <title>Aamir Shahzad - Notes</title>
      <link>https://aamirshahzad.uk</link>
    </image>
    
    <item>
      <title><![CDATA[Which LLM For Which Task (And Why I Didn't Self-Host)]]></title>
      <link>https://aamirshahzad.uk/notes/which-llm-for-which-task</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/which-llm-for-which-task</guid>
      <description><![CDATA[Lessons from building a platform that needed to pick the right model for each task. Spoiler: 'just use GPT-4' isn't a strategy.]]></description>
      <pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>LLM</category>
      <category>OpenAI</category>
      <category>Claude</category>
      <category>Model Selection</category>
      <category>Architecture</category>
    </item>
    <item>
      <title><![CDATA[Controlling 20,000 Requests Without Burning Money or Getting Banned]]></title>
      <link>https://aamirshahzad.uk/notes/request-cost-control-llm</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/request-cost-control-llm</guid>
      <description><![CDATA[What I learned building request control for a multi-service LLM platform. Real patterns, real mistakes.]]></description>
      <pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>LLM</category>
      <category>Redis</category>
      <category>Celery</category>
      <category>RabbitMQ</category>
      <category>Cost Control</category>
      <category>Architecture</category>
    </item>
    <item>
      <title><![CDATA[Why SEO is a Must-Learn Skill in 2025 (And It's Not What You Think)]]></title>
      <link>https://aamirshahzad.uk/notes/why-seo-is-must-learn-skill-2025</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/why-seo-is-must-learn-skill-2025</guid>
      <description><![CDATA[SEO isn't just about rankings anymore. It's about visibility in AI Overviews, building trust signals, and understanding how machines interpret your content. Here's why every digital professional needs SEO now.]]></description>
      <pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>SEO</category>
      <category>Digital Marketing</category>
      <category>Career</category>
      <category>AI</category>
      <category>Content Strategy</category>
    </item>
    <item>
      <title><![CDATA[What I Learned from SEO: Surviving the 2024-2025 Algorithm Chaos]]></title>
      <link>https://aamirshahzad.uk/notes/what-i-learned-from-seo-2024-2025</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/what-i-learned-from-seo-2024-2025</guid>
      <description><![CDATA[The March 2024 core update changed everything. Here's what I learned about surviving Google's algorithm changes, why AI content strategies failed, and the lessons that shaped modern SEO.]]></description>
      <pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>SEO</category>
      <category>Google Algorithm</category>
      <category>AI Content</category>
      <category>E-E-A-T</category>
      <category>Lessons Learned</category>
    </item>
    <item>
      <title><![CDATA[When Matrices Stopped Being Scary (Linear Algebra for AI, Part 3)]]></title>
      <link>https://aamirshahzad.uk/notes/linear-algebra-part-3-matrices-svd</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/linear-algebra-part-3-matrices-svd</guid>
      <description><![CDATA[How I learned matrices, eigenvalues, and SVD by connecting them to neural networks, PCA, and LoRA fine-tuning. The practical understanding that made AI systems click.]]></description>
      <pubDate>Fri, 25 Apr 2025 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>AI</category>
      <category>Math</category>
      <category>Learning</category>
      <category>Matrices</category>
      <category>SVD</category>
      <category>LoRA</category>
    </item>
    <item>
      <title><![CDATA[The Week Vectors Finally Made Sense (Linear Algebra for AI, Part 2)]]></title>
      <link>https://aamirshahzad.uk/notes/linear-algebra-part-2-vectors-similarity</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/linear-algebra-part-2-vectors-similarity</guid>
      <description><![CDATA[How I learned to see vectors, dot products, and norms as practical tools for AI systems. The visual explanations that finally made embeddings and similarity click.]]></description>
      <pubDate>Tue, 18 Mar 2025 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>AI</category>
      <category>Math</category>
      <category>Learning</category>
      <category>Vectors</category>
      <category>Embeddings</category>
    </item>
    <item>
      <title><![CDATA[Why I'm Learning Linear Algebra as a Web Developer (Part 1)]]></title>
      <link>https://aamirshahzad.uk/notes/why-linear-algebra-for-web-developers</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/why-linear-algebra-for-web-developers</guid>
      <description><![CDATA[The mathematical foundations behind modern AI systems and why understanding them matters for building better applications. Part 1 of my learning journey.]]></description>
      <pubDate>Mon, 10 Feb 2025 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>AI</category>
      <category>Math</category>
      <category>Learning</category>
      <category>Linear Algebra</category>
    </item>
    <item>
      <title><![CDATA[Why Did My Celery Workers Keep Dying at 3am? (Debugging Python Memory Leaks)]]></title>
      <link>https://aamirshahzad.uk/notes/celery-memory-leaks</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/celery-memory-leaks</guid>
      <description><![CDATA[A deep dive into debugging Celery worker crashes in production. How I fixed memory fragmentation and database connection leaks in Django/Python using max-tasks-per-child.]]></description>
      <pubDate>Thu, 05 Dec 2024 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>Python</category>
      <category>Celery</category>
      <category>Debugging</category>
      <category>Production</category>
      <category>Memory</category>
      <category>Django</category>
    </item>
    <item>
      <title><![CDATA[How Did One Failed Request Turn Into 3,000? (Understanding Retry Storms)]]></title>
      <link>https://aamirshahzad.uk/notes/retry-storms</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/retry-storms</guid>
      <description><![CDATA[A practical guide to preventing retry storms in distributed systems. Learn exponential backoff, circuit breakers, and jitter strategies that protect your services from cascading failures.]]></description>
      <pubDate>Wed, 20 Nov 2024 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>Distributed Systems</category>
      <category>Python</category>
      <category>Reliability</category>
      <category>Architecture</category>
      <category>Celery</category>
    </item>
    <item>
      <title><![CDATA[How Do You Stop an LLM from Inventing Prices? (Preventing AI Hallucinations in Production)]]></title>
      <link>https://aamirshahzad.uk/notes/llm-output-validation</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/llm-output-validation</guid>
      <description><![CDATA[A practical guide to preventing LLM hallucinations in production systems. Learn how to validate AI-generated content using Pydantic schemas, fallback chains, and output validation before it reaches your customers.]]></description>
      <pubDate>Tue, 15 Oct 2024 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>LLM</category>
      <category>Python</category>
      <category>AI</category>
      <category>Pydantic</category>
      <category>Production</category>
      <category>OpenAI</category>
    </item>
    <item>
      <title><![CDATA[Why Was Our AI Taking 1.2 Seconds to Write an Email? (Optimizing LLM Validation)]]></title>
      <link>https://aamirshahzad.uk/notes/llm-validation-latency</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/llm-validation-latency</guid>
      <description><![CDATA[A practical guide to reducing LLM response validation latency. Learn parallel validation, tiered checking, caching strategies, and streaming validation to cut validation time from 400ms to 20ms.]]></description>
      <pubDate>Sun, 08 Sep 2024 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>LLM</category>
      <category>Python</category>
      <category>Performance</category>
      <category>Pydantic</category>
      <category>OpenAI</category>
      <category>Optimization</category>
    </item>
    <item>
      <title><![CDATA[Why Did Our Queue Crash on Black Friday? (Understanding Queue Sizing and Backpressure)]]></title>
      <link>https://aamirshahzad.uk/notes/queue-sizing-backpressure</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/queue-sizing-backpressure</guid>
      <description><![CDATA[A practical guide to sizing message queues and implementing backpressure. Learn how to prevent queue overflow, handle traffic spikes, and build systems that degrade gracefully under load.]]></description>
      <pubDate>Sat, 22 Jun 2024 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>RabbitMQ</category>
      <category>Architecture</category>
      <category>Celery</category>
      <category>Queues</category>
      <category>Python</category>
      <category>Performance</category>
    </item>
    <item>
      <title><![CDATA[Why Did Our Search Get Slower Every Month? (PostgreSQL Full-Text Search Limits)]]></title>
      <link>https://aamirshahzad.uk/notes/postgres-fulltext-limits</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/postgres-fulltext-limits</guid>
      <description><![CDATA[A practical guide to understanding PostgreSQL full-text search limits. Learn when to stick with PostgreSQL and when to migrate to Elasticsearch, with real performance numbers from a 2M record vehicle search.]]></description>
      <pubDate>Fri, 10 May 2024 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>PostgreSQL</category>
      <category>Elasticsearch</category>
      <category>Database</category>
      <category>Performance</category>
      <category>Search</category>
      <category>Django</category>
    </item>
    <item>
      <title><![CDATA[Why Were New Listings Taking 15 Minutes to Appear? (From Batch to Event-Driven)]]></title>
      <link>https://aamirshahzad.uk/notes/batch-to-event-driven</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/batch-to-event-driven</guid>
      <description><![CDATA[How we reduced data processing latency from 15 minutes to 30 seconds by switching from cron jobs to event-driven architecture with AWS Lambda and SQS. A practical guide to real-time data pipelines.]]></description>
      <pubDate>Fri, 15 Mar 2024 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>AWS</category>
      <category>Architecture</category>
      <category>Lambda</category>
      <category>Event-Driven</category>
      <category>Python</category>
      <category>SQS</category>
    </item>
    <item>
      <title><![CDATA[The XLSX From Hell: When Shapes Break Everything]]></title>
      <link>https://aamirshahzad.uk/notes/xlsx-shapes-nightmare</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/xlsx-shapes-nightmare</guid>
      <description><![CDATA[Auto-fill an Excel template with shapes? I tried 4 approaches. Only the dumbest one worked.]]></description>
      <pubDate>Sat, 20 Jan 2024 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>Python</category>
      <category>Excel</category>
      <category>DataEngineering</category>
      <category>Automation</category>
    </item>
    <item>
      <title><![CDATA[Building Dashboards Leadership Actually Uses]]></title>
      <link>https://aamirshahzad.uk/notes/grafana-dashboards-leadership</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/grafana-dashboards-leadership</guid>
      <description><![CDATA[I built 5 dashboards. Leadership used 1. Here's what made the winner different and how I fixed the others.]]></description>
      <pubDate>Fri, 05 Jan 2024 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>Grafana</category>
      <category>DataVisualization</category>
      <category>Metrics</category>
      <category>ProductThinking</category>
    </item>
    <item>
      <title><![CDATA[Scheduled Jobs That Actually Recover From Failures]]></title>
      <link>https://aamirshahzad.uk/notes/scheduled-jobs-error-handling</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/scheduled-jobs-error-handling</guid>
      <description><![CDATA[A script that runs isn't the same as a script that works. How I made nightly jobs self-healing with retries, checkpoints, and loud failures.]]></description>
      <pubDate>Fri, 15 Dec 2023 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>Celery</category>
      <category>Python</category>
      <category>Automation</category>
      <category>ErrorHandling</category>
      <category>Backend</category>
    </item>
    <item>
      <title><![CDATA[When the Frontend Sends a Query as a String]]></title>
      <link>https://aamirshahzad.uk/notes/query-builder-string-parsing</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/query-builder-string-parsing</guid>
      <description><![CDATA[I was becoming a human SQL interface for 50+ engineers. So I built a query parser that let them self-serve with typo suggestions.]]></description>
      <pubDate>Fri, 01 Dec 2023 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>FastAPI</category>
      <category>Python</category>
      <category>QueryParsing</category>
      <category>InternalTools</category>
    </item>
    <item>
      <title><![CDATA[How I Turned a 4-Hour Report Into a Button Click]]></title>
      <link>https://aamirshahzad.uk/notes/4-hour-report-to-one-click</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/4-hour-report-to-one-click</guid>
      <description><![CDATA[Watching an analyst spend 4 hours on VLOOKUPs every Monday, I built a Python automation that found 4x more anomalies in 45 seconds.]]></description>
      <pubDate>Wed, 15 Nov 2023 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>Automation</category>
      <category>Python</category>
      <category>Pandas</category>
      <category>FastAPI</category>
      <category>Productivity</category>
    </item>
    <item>
      <title><![CDATA[The Page That Made 147 Database Queries (Fixing N+1 in Django)]]></title>
      <link>https://aamirshahzad.uk/notes/django-orm-optimization</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/django-orm-optimization</guid>
      <description><![CDATA[How I reduced an auction listing page from 147 queries to 3 using select_related, prefetch_related, and annotations.]]></description>
      <pubDate>Sat, 19 Aug 2023 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>Django</category>
      <category>ORM</category>
      <category>Performance</category>
      <category>PostgreSQL</category>
      <category>Optimization</category>
    </item>
    <item>
      <title><![CDATA[Why Did Two Users Just Bid the Same Amount? (The Polling Problem)]]></title>
      <link>https://aamirshahzad.uk/notes/websockets-live-auctions</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/websockets-live-auctions</guid>
      <description><![CDATA[When polling caused duplicate bids in our live auction system, we learned the hard way why WebSockets matter for real-time features.]]></description>
      <pubDate>Sat, 12 Aug 2023 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>WebSockets</category>
      <category>Django</category>
      <category>RealTime</category>
      <category>Architecture</category>
      <category>Auctions</category>
    </item>
    <item>
      <title><![CDATA[How Do You Process 200GB of Vehicle Data Every Day?]]></title>
      <link>https://aamirshahzad.uk/notes/processing-200gb-vehicle-data-daily</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/processing-200gb-vehicle-data-daily</guid>
      <description><![CDATA[Building a daily ETL pipeline that downloads, deduplicates, transforms, and indexes millions of vehicle listings before users wake up.]]></description>
      <pubDate>Sat, 05 Aug 2023 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>ETL</category>
      <category>Python</category>
      <category>AWS</category>
      <category>S3</category>
      <category>Elasticsearch</category>
      <category>Celery</category>
    </item>
    <item>
      <title><![CDATA[How Do You Build a Search API with 30+ Optional Filters?]]></title>
      <link>https://aamirshahzad.uk/notes/building-search-api-filters</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/building-search-api-filters</guid>
      <description><![CDATA[Configuration over code: how I avoided 30 if-statements and built a maintainable search API with Elasticsearch and Django REST Framework.]]></description>
      <pubDate>Sat, 29 Jul 2023 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>Elasticsearch</category>
      <category>API</category>
      <category>Django</category>
      <category>Architecture</category>
      <category>Search</category>
      <category>DRF</category>
    </item>
    <item>
      <title><![CDATA[Why Did Toyota Searches Take 3x Longer Than Lamborghini?]]></title>
      <link>https://aamirshahzad.uk/notes/elasticsearch-routing-by-make</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/elasticsearch-routing-by-make</guid>
      <description><![CDATA[Elasticsearch's default sharding spread our data randomly. Custom routing by vehicle make made searches 5x faster. Here's how.]]></description>
      <pubDate>Sat, 22 Jul 2023 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>Elasticsearch</category>
      <category>Performance</category>
      <category>Architecture</category>
      <category>Search</category>
      <category>Database</category>
    </item>
    <item>
      <title><![CDATA[How Do You Deduplicate 3 Million Records Without Running Out of Memory?]]></title>
      <link>https://aamirshahzad.uk/notes/deduplicating-millions-records-miller</link>
      <guid isPermaLink="true">https://aamirshahzad.uk/notes/deduplicating-millions-records-miller</guid>
      <description><![CDATA[When Pandas crashed processing 40 million rows, I discovered Miller CLI. Here's how streaming beats loading for massive CSV deduplication.]]></description>
      <pubDate>Sat, 15 Jul 2023 00:00:00 GMT</pubDate>
      <author>info@aamirshahzad.uk (Aamir Shahzad)</author>
      <category>Python</category>
      <category>ETL</category>
      <category>Data</category>
      <category>Performance</category>
      <category>Miller</category>
    </item>
  </channel>
</rss>