<?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/"
     xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>WebbyFox Blog — Rizwan Mansuri</title>
    <link>https://rizwan.mansuri.uk/blog/</link>
    <atom:link href="https://rizwan.mansuri.uk/blog/feed.xml" rel="self" type="application/rss+xml" />
    <description>Practical articles on Django, Python, Wagtail, AI and web development — written from experience building production systems for UK Government, Gov.ie, HSBC and LSEG.</description>
    <language>en-gb</language>
    <copyright>© 2026 Rizwan Mansuri</copyright>
    <managingEditor>mr.mansuri@gmail.com (Rizwan Mansuri)</managingEditor>
    <webMaster>mr.mansuri@gmail.com (Rizwan Mansuri)</webMaster>
    <lastBuildDate>Wed, 09 Sep 2026 09:00:00 +0000</lastBuildDate>
    <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
    <generator>webbyfox.com</generator>
    <docs>https://www.rssboard.org/rss-specification</docs>
    <ttl>1440</ttl>
    <image>
      <url>https://rizwan.mansuri.uk/og-image.png</url>
      <title>WebbyFox Blog — Rizwan Mansuri</title>
      <link>https://rizwan.mansuri.uk/blog/</link>
    </image>

    <item>
      <title>AI-Assisted Python Web Development: Building Django Apps With Coding Agents</title>
      <link>https://rizwan.mansuri.uk/blog/ai-assisted-python-web-development/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/ai-assisted-python-web-development/</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>AI</category>
      <category>Testing</category>
      <category>Workflow</category>
      <description><![CDATA[A working method for building Django applications with AI coding agents, written from a year of doing it. Starts from why reports of AI-assisted productivity are so contradictory: generation became free but understanding the system, deciding what to change and verifying it is safe did not, so the speedup is large on greenfield CRUD and near zero on a mature codebase whose invariants are undocumented. Gives a blast-radius map for delegation - serializers, admin classes, factories and rule-driven refactors handed over whole; views and business logic delegated with edge cases specified up front; migrations, permissions, auth and money drafted but owned line by line; data modelling and architecture decided by a human first. Covers context engineering: a CLAUDE.md stating stack, layering rules, explicit prohibitions and the test commands, and why pointing at a real file in your repo constrains output better than any adjective. Details the six defects generated Django keeps repeating - querysets fetched by pk without tenancy scoping (a straight IDOR that every authenticated test passes), N+1 queries invisible on dev data, DRF serializers with fields = "__all__" that leak the column added next year, multi-step writes with no transaction.atomic and Celery dispatch racing the commit, naive datetime.now(), and confidently invented APIs. Then migrations specifically (read sqlmigrate, watch for table rewrites, use AddIndexConcurrently with atomic = False, never edit an applied migration), tests as the specification rather than an afterthought with assertNumQueries on every list endpoint, and the CI gates - ruff, mypy with django-stubs, makemigrations --check, pip-audit - that turn recurring review comments into unmergeable builds. Closes with the seven-step workflow, the long-term cost of learning less from reviewing than from writing, and an 11-point review checklist.]]></description>
    </item>

    <item>
      <title>Build an MCP Server in Django: Give AI Agents Safe Access to Your App</title>
      <link>https://rizwan.mansuri.uk/blog/django-mcp-server/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/django-mcp-server/</guid>
      <pubDate>Tue, 25 Aug 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>MCP</category>
      <category>AI</category>
      <category>ASGI</category>
      <description><![CDATA[A production guide to exposing a Django application over the Model Context Protocol so Claude and other AI agents can use it. Covers what MCP actually is (JSON-RPC 2.0 plus three primitives - model-invoked tools, client-invoked resources, user-invoked prompts) and why the choice between them decides who holds the trigger; transports, and why streamable HTTP is the one you deploy; mounting a FastMCP server alongside Django in a single ASGI application with a Starlette router, including the lifespan trap that breaks most first attempts because mounted sub-apps never receive lifespan events; writing tools against Django's async ORM with aget/acreate/async-for and sync_to_async(thread_sensitive=True) for everything else, plus why N+1 queries hurt more when an agent calls a tool a dozen times per conversation; designing tool signatures a language model can actually route to - the docstring is the prompt, fewer broad tools beat many narrow ones, errors as recoverable messages, ToolAnnotations for destructive operations; resources and prompts for context and canned workflows; and the section most tutorials skip - per-request bearer-token authentication in ASGI middleware, a ContextVar carrying the resolved Django user, scoping every queryset to that user, and treating tool output as untrusted input because prompt injection can arrive through your own database. Closes with production concerns (stateless_http for multi-worker deploys, per-tool timeouts, audit logging, per-token rate limits, result-set caps, versioning through tool names) and a 10-point checklist.]]></description>
    </item>

    <item>
      <title>Django Security Checklist: OWASP, Cryptography, and Zero-Trust</title>
      <link>https://rizwan.mansuri.uk/blog/django-security-checklist/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/django-security-checklist/</guid>
      <pubDate>Tue, 23 Jun 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>Security</category>
      <category>OWASP</category>
      <category>Cryptography</category>
      <description><![CDATA[A practical Django security checklist for production — hardening the security-critical settings (SECRET_KEY, DEBUG, ALLOWED_HOSTS, HTTPS/HSTS, secure cookies), mapping the OWASP Top 10 to concrete Django defenses (SQL injection via the ORM, XSS via autoescaping and format_html, broken access control via queryset scoping, SSRF), authentication and session hardening with Argon2 password hashing, password validators, rate limiting and MFA, cryptography done right (django.core.signing TimestampSigner, Fernet field encryption, the secrets module), a zero-trust model for views and service-to-service calls, and supply-chain security with pip-audit and hash-pinned requirements. Includes manage.py check --deploy and a full production checklist.]]></description>
    </item>

    <item>
      <title>GraphQL vs REST: Building a Django GraphQL API with Strawberry</title>
      <link>https://rizwan.mansuri.uk/blog/graphql-vs-rest-django-strawberry/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/graphql-vs-rest-django-strawberry/</guid>
      <pubDate>Tue, 16 Jun 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>GraphQL</category>
      <category>Strawberry</category>
      <category>REST</category>
      <description><![CDATA[A practical GraphQL vs REST comparison, then a hands-on Django GraphQL API built with Strawberry — when to choose each, setting up strawberry-graphql-django, defining types and queries straight from Python type hints, mutations with input types, solving the N+1 problem with the DjangoOptimizerExtension and DataLoaders, authentication and field-level permissions, a GraphQL vs REST performance comparison, and an 8-point production checklist.]]></description>
    </item>

    <item>
      <title>Testing Async Django Code: Celery Tasks, Channels, and WebSockets</title>
      <link>https://rizwan.mansuri.uk/blog/testing-async-django-code/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/testing-async-django-code/</guid>
      <pubDate>Fri, 05 Jun 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>Celery</category>
      <category>Channels</category>
      <category>Testing</category>
      <description><![CDATA[A practical guide to testing the async parts of Django — Celery tasks (eager mode, mocking the call site, retries via celery.exceptions.Retry, chord/group workflows), Channels consumers (WebsocketCommunicator, database_sync_to_async, the savepoint trap with transactional_db), routing tests against the real ASGI application, group_send tests without a browser using a second communicator, the eager-vs-real-broker decision and when each is worth it, plus CI configuration (asyncio_mode=auto, timeouts everywhere, InMemoryChannelLayer, two-job split). Includes a 10-point production checklist.]]></description>
    </item>

    <item>
      <title>PostgreSQL for Django Developers: Beyond Raw SQL</title>
      <link>https://rizwan.mansuri.uk/blog/postgresql-for-django-developers/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/postgresql-for-django-developers/</guid>
      <pubDate>Fri, 29 May 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>PostgreSQL</category>
      <category>Performance</category>
      <description><![CDATA[Use PostgreSQL's best features straight from the Django ORM — JSONField querying and GIN indexes, full-text search with weighted SearchVectorField, trigram fuzzy matching, window functions, recursive CTEs, pgtrigger database triggers, and performance tuning with EXPLAIN, index types and connection pooling. Each example paired with the raw SQL it compiles to.]]></description>
    </item>

    <item>
      <title>Type Hints in Django: From Optional to Generic Django Models</title>
      <link>https://rizwan.mansuri.uk/blog/type-hints-django-generic-models/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/type-hints-django-generic-models/</guid>
      <pubDate>Fri, 22 May 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>Type Hints</category>
      <category>Mypy</category>
      <description><![CDATA[Modern Django typing for 2026 — null vs Optional, typed Managers and QuerySets with django-stubs, closed TypedDicts, the Self type, PEP 695 generic syntax, custom generic Django models, type-safe JSONField with Pydantic, and a complete typed app you can copy.]]></description>
    </item>

    <item>
      <title>Complete Django Caching Guide: Redis, Per-View, Template, ORM</title>
      <link>https://rizwan.mansuri.uk/blog/django-caching-guide/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/django-caching-guide/</guid>
      <pubDate>Fri, 15 May 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>Performance</category>
      <category>Redis</category>
      <description><![CDATA[Every layer of Django caching covered — Redis backend setup, per-view caching, template fragments, low-level cache API, ORM patterns, invalidation strategies, and cache stampede protection.]]></description>
    </item>

    <item>
      <title>AI-Native Architecture: Designing Django Applications Built Around Intelligence</title>
      <link>https://rizwan.mansuri.uk/blog/ai-native-architecture/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/ai-native-architecture/</guid>
      <pubDate>Tue, 12 May 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>AI</category>
      <category>Architecture</category>
      <description><![CDATA[Move beyond bolt-on AI. Design Django apps where intelligence is a load-bearing layer — async queues, token budgets, prompt registries, RAG, model routing, human-in-the-loop.]]></description>
    </item>

    <item>
      <title>Profiling Python for Energy Efficiency: Beyond Performance</title>
      <link>https://rizwan.mansuri.uk/blog/profiling-python-energy-efficiency/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/profiling-python-energy-efficiency/</guid>
      <pubDate>Sat, 09 May 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Performance</category>
      <description><![CDATA[Fast code isn't always green code. Measure CPU energy with pyRAPL, track CO₂ with CodeCarbon, fix the Django patterns silently burning the most power.]]></description>
    </item>

    <item>
      <title>Python 3.15: Every New Feature Worth Knowing</title>
      <link>https://rizwan.mansuri.uk/blog/python-3-15-new-features/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/python-3-15-new-features/</guid>
      <pubDate>Fri, 08 May 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Performance</category>
      <description><![CDATA[Lazy imports, frozendict, sentinel type, comprehension unpacking, UTF-8 default, Tachyon profiler, and an 8–9% JIT boost. Every production-relevant change with working code.]]></description>
    </item>

    <item>
      <title>Are Farming Robots Worth the Cost? A Practical ROI Analysis</title>
      <link>https://rizwan.mansuri.uk/blog/are-farming-robots-worth-the-cost/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/are-farming-robots-worth-the-cost/</guid>
      <pubDate>Wed, 06 May 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Robotics</category>
      <category>Python</category>
      <description><![CDATA[Hardware costs, labour savings, hidden costs, and a Python break-even calculator. Honest look at when commercial and DIY ag robots actually pay for themselves.]]></description>
    </item>

    <item>
      <title>AI-Powered Precision Farming Robots</title>
      <link>https://rizwan.mansuri.uk/blog/ai-precision-farming-robots/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/ai-precision-farming-robots/</guid>
      <pubDate>Fri, 01 May 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>AI</category>
      <category>Robotics</category>
      <description><![CDATA[GPS waypoint missions over MQTT, on-device TFLite weed detection on Raspberry Pi, variable-rate sprayer control over GPIO PWM, nightly Claude crop advisor.]]></description>
    </item>

    <item>
      <title>Generative AI with Python: From API Calls to Production Patterns</title>
      <link>https://rizwan.mansuri.uk/blog/genai-python-guide/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/genai-python-guide/</guid>
      <pubDate>Thu, 30 Apr 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>GenAI</category>
      <description><![CDATA[LLM mental models, token arithmetic, prompt engineering, structured output, tool use, embeddings, RAG, streaming, retries, prompt caching, cost tracking.]]></description>
    </item>

    <item>
      <title>AI Exposure by Occupation: Inside Karpathy's Job Market Visualizer</title>
      <link>https://rizwan.mansuri.uk/blog/karpathy-ai-job-exposure-visualizer/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/karpathy-ai-job-exposure-visualizer/</guid>
      <pubDate>Fri, 24 Apr 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>AI</category>
      <category>Python</category>
      <category>Django</category>
      <description><![CDATA[342 US occupations scored for AI exposure by an LLM pipeline. Software devs hit 8–9/10. What that means and how to build the scoring pipeline in Python and Django.]]></description>
    </item>

    <item>
      <title>Wagtail Custom Admin: Views, Menu Items, and ModelAdmin</title>
      <link>https://rizwan.mansuri.uk/blog/wagtail-custom-admin/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/wagtail-custom-admin/</guid>
      <pubDate>Tue, 10 Mar 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Wagtail</category>
      <category>Python</category>
      <category>Django</category>
      <description><![CDATA[Extend the Wagtail admin with snippets, SnippetViewSet, custom menu items, admin views, lifecycle hooks, dashboard panels, and permissions — with working code for each.]]></description>
    </item>

    <item>
      <title>Django Admin Customization Tricks: Beyond ModelAdmin</title>
      <link>https://rizwan.mansuri.uk/blog/django-admin-customization-tricks/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/django-admin-customization-tricks/</guid>
      <pubDate>Sat, 14 Feb 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>Admin</category>
      <description><![CDATA[Advanced Django admin patterns — custom list filters, async bulk actions, custom AdminSite views, performance fixes, inlines, and audit trails. All stock Django, no third-party skin.]]></description>
    </item>

    <item>
      <title>Deploying Wagtail to Production: Docker, Nginx, and PostgreSQL</title>
      <link>https://rizwan.mansuri.uk/blog/wagtail-production-deployment/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/wagtail-production-deployment/</guid>
      <pubDate>Sun, 18 Jan 2026 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Wagtail</category>
      <category>Django</category>
      <category>DevOps</category>
      <description><![CDATA[Full production setup: Dockerfile, docker-compose, Nginx, Gunicorn, PostgreSQL, Redis, WhiteNoise, volume-mounted media, SSL with Certbot, health checks.]]></description>
    </item>

    <item>
      <title>Build a Crypto Portfolio Tracker with Django and the CoinGecko API</title>
      <link>https://rizwan.mansuri.uk/blog/crypto-portfolio-tracker-django-coingecko/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/crypto-portfolio-tracker-django-coingecko/</guid>
      <pubDate>Thu, 25 Dec 2025 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Django</category>
      <category>Python</category>
      <description><![CDATA[Live price updates over WebSocket, Celery Beat refreshing prices every five minutes, price alerts, and a full DRF API — all on the free CoinGecko tier, no API key required.]]></description>
    </item>

    <item>
      <title>Wagtail StreamField: A Deep Dive with Custom Blocks</title>
      <link>https://rizwan.mansuri.uk/blog/wagtail-streamfield-custom-blocks/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/wagtail-streamfield-custom-blocks/</guid>
      <pubDate>Thu, 20 Nov 2025 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Wagtail</category>
      <category>Python</category>
      <description><![CDATA[Every block type, custom StructBlock, ListBlock, nested StreamBlock, ChooserBlocks, block templates, querying StreamField data, and handling rename migrations.]]></description>
    </item>

    <item>
      <title>RAG with Django: Chat Over Your Wagtail CMS Content</title>
      <link>https://rizwan.mansuri.uk/blog/rag-django-wagtail-cms-chat/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/rag-django-wagtail-cms-chat/</guid>
      <pubDate>Wed, 12 Nov 2025 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Django</category>
      <category>Wagtail</category>
      <category>AI</category>
      <description><![CDATA[pgvector + OpenAI embeddings + Claude API — build a retrieval-augmented chat API for Wagtail with streaming responses and auto-indexing on page publish.]]></description>
    </item>

    <item>
      <title>Wagtail vs Django CMS: Technical Comparison and Editor Experience</title>
      <link>https://rizwan.mansuri.uk/blog/wagtail-vs-django-cms/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/wagtail-vs-django-cms/</guid>
      <pubDate>Wed, 15 Oct 2025 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Wagtail</category>
      <category>Django</category>
      <description><![CDATA[StreamField vs placeholders, Wagtail admin vs frontend editing toolbar, plugin systems, multi-site, search, and headless. Hands-on breakdown of which CMS to pick and why.]]></description>
    </item>

    <item>
      <title>Wagtail Headless CMS with Next.js: A Practical Guide</title>
      <link>https://rizwan.mansuri.uk/blog/wagtail-headless-cms-nextjs/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/wagtail-headless-cms-nextjs/</guid>
      <pubDate>Mon, 22 Sep 2025 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Wagtail</category>
      <category>Next.js</category>
      <description><![CDATA[Wagtail API v2, CORS, custom API fields, ISR, StreamField rendering in React, responsive image renditions, and draft preview mode — the complete headless guide.]]></description>
    </item>

    <item>
      <title>Automated Greenhouse Control with Python: MQTT, PID, Django Dashboard</title>
      <link>https://rizwan.mansuri.uk/blog/greenhouse-automation-python-mqtt/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/greenhouse-automation-python-mqtt/</guid>
      <pubDate>Thu, 14 Aug 2025 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>IoT</category>
      <description><![CDATA[Sensors publish over MQTT, a Python PID controller drives vents and irrigation, Django persists the time-series, Django Channels streams live data to a dashboard.]]></description>
    </item>

    <item>
      <title>How to Add an AI Chatbot to Any Django Site in a Weekend</title>
      <link>https://rizwan.mansuri.uk/blog/django-ai-chatbot-weekend/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/django-ai-chatbot-weekend/</guid>
      <pubDate>Mon, 28 Jul 2025 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Django</category>
      <category>Python</category>
      <category>AI</category>
      <description><![CDATA[Build a streaming Claude chatbot in two days — Django model, SSE endpoint, session history, floating widget, rate limiting, and production checklist.]]></description>
    </item>

    <item>
      <title>Robotic Crop Monitoring with Python: Django + Computer Vision</title>
      <link>https://rizwan.mansuri.uk/blog/robotic-farming-python-crop-monitoring/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/robotic-farming-python-crop-monitoring/</guid>
      <pubDate>Thu, 12 Jun 2025 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Python</category>
      <category>Django</category>
      <category>AI</category>
      <category>Robotics</category>
      <description><![CDATA[Raspberry Pi robot captures plant images, POSTs to a Django REST API, Celery analyses each image with Claude Vision, Django Channels pushes real-time disease alerts.]]></description>
    </item>

    <item>
      <title>Build a Blog with Wagtail: Complete Beginner Tutorial</title>
      <link>https://rizwan.mansuri.uk/blog/build-blog-with-wagtail/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/build-blog-with-wagtail/</guid>
      <pubDate>Tue, 15 Apr 2025 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Wagtail</category>
      <category>Python</category>
      <category>Tutorial</category>
      <description><![CDATA[From pip install to a published post — page models, StreamField body, tag filtering, pagination, RSS feed, and SEO fields. The complete step-by-step Wagtail beginner guide.]]></description>
    </item>

    <item>
      <title>How to Set Up Wagtail with Elasticsearch</title>
      <link>https://rizwan.mansuri.uk/blog/wagtail-elasticsearch-setup/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/wagtail-elasticsearch-setup/</guid>
      <pubDate>Wed, 05 Mar 2025 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Wagtail</category>
      <category>Django</category>
      <category>Elasticsearch</category>
      <description><![CDATA[Install the client, configure the backend, define search fields, add autocomplete, boost fields for relevance, filter results, index StreamField, zero-downtime reindexing.]]></description>
    </item>

    <item>
      <title>Django REST API + Celery: Async AI Tasks Without Blocking Your Workers</title>
      <link>https://rizwan.mansuri.uk/blog/django-celery-async-ai-tasks/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/django-celery-async-ai-tasks/</guid>
      <pubDate>Thu, 03 Oct 2024 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Django</category>
      <category>Python</category>
      <category>Celery</category>
      <category>AI</category>
      <description><![CDATA[Stop blocking Django workers on slow LLM calls. Build a 202 Accepted → Celery task → poll pattern with AITask model, exponential backoff, SSE streaming, priority queues.]]></description>
    </item>

    <item>
      <title>Muslims in India: Data and Visual Evidence of Marginalization</title>
      <link>https://rizwan.mansuri.uk/blog/muslims-india-marginalization-data/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/muslims-india-marginalization-data/</guid>
      <pubDate>Sat, 18 Nov 2023 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Data</category>
      <category>Policy</category>
      <description><![CDATA[Official government data — Sachar Report, Census 2011, NCRB, Election Commission — shows under-representation in every institution and below national-average development indicators.]]></description>
    </item>

    <item>
      <title>Django REST API Best Practices</title>
      <link>https://rizwan.mansuri.uk/blog/django-rest-api-best-practices/</link>
      <guid isPermaLink="true">https://rizwan.mansuri.uk/blog/django-rest-api-best-practices/</guid>
      <pubDate>Tue, 07 Nov 2023 09:00:00 +0000</pubDate>
      <dc:creator>Rizwan Mansuri</dc:creator>
      <category>Django</category>
      <category>Python</category>
      <category>DRF</category>
      <description><![CDATA[Production-proven patterns for structuring DRF projects — serializers, authentication, permissions, filtering, pagination, versioning, error handling, and testing.]]></description>
    </item>

  </channel>
</rss>
