<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
  <url>
    <loc>https://sahilchalke.com/</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/qa-verify-and-record</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/test-runner-loop</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/write-e2e-from-ticket</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/write-unit-tests</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/diff-review</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/pr-reviewer</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/resolve-review-comments</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/conventional-commit</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/jj-workflow</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/react-prop-chain</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/react-stale-closure</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/react-notify-modal</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/code-quality</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/start-feature</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/issue-file-upload</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/skills/slack-relay</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/uses</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/toolkit</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/Sahil-Chalke-Resume.pdf</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/writing-a-coding-agent-by-hand</loc>
    <lastmod>2026-09-06</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/writing-a-coding-agent-by-hand.png</image:loc>
      <image:title>I wrote a coding agent by hand</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/building-a-production-grade-rag-pipeline</loc>
    <lastmod>2026-09-05</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/building-a-production-grade-rag-pipeline.png</image:loc>
      <image:title>Production RAG: what the demo leaves out</image:title>
    </image:image>
    <image:image>
      <image:loc>https://sahilchalke.com/blog/rag-pipeline-architecture.webp</image:loc>
      <image:title>Three-layer architecture diagram. Offline indexing sends 41 PDFs through PyPDFLoader, a recursive character splitter and OpenAI embeddings into a Qdrant Cloud collection that stores a dense and a BM25 sparse vector per chunk. Query time is a LangGraph state machine running retrieve, rerank, grade and generate, with a not-relevant branch that rewrites the query and loops back to retrieval for up to two retries. The serving layer puts a Next.js frontend on Vercel and a FastAPI backend on Render, with LangSmith tracing every run and an offline RAGAS suite scoring it.</image:title>
    </image:image>
    <image:image>
      <image:loc>https://sahilchalke.com/blog/rag-langsmith-trace.webp</image:loc>
      <image:title>LangSmith trace view of one graph run for the question what does LoRA freeze during fine-tuning. The waterfall shows a LangGraph root span at 3.25 seconds and 2.811 thousand tokens costing 0.0005 dollars, broken into retrieve_node at 0.85 seconds, grade_node at 1.13 seconds wrapping a gpt-4o-mini call, route_after_grade at 0.00 seconds, and generate_node at 1.21 seconds. The right panel shows the grade node input, listing the retrieved chunk IDs and their page content.</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/your-download-count-is-lying-to-you</loc>
    <lastmod>2026-08-23</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/your-download-count-is-lying-to-you.png</image:loc>
      <image:title>Your download count is lying to you</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/building-a-terminal-ui-in-rust-with-ratatui</loc>
    <lastmod>2026-08-23</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/building-a-terminal-ui-in-rust-with-ratatui.png</image:loc>
      <image:title>Building a terminal UI in Rust with Ratatui</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/shipping-a-cli-to-homebrew-pypi-and-crates-io</loc>
    <lastmod>2026-08-23</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/shipping-a-cli-to-homebrew-pypi-and-crates-io.png</image:loc>
      <image:title>Shipping a CLI to Homebrew, PyPI and crates.io</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/react-19-in-production-what-actually-changed</loc>
    <lastmod>2026-08-23</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/react-19-in-production-what-actually-changed.png</image:loc>
      <image:title>React 19 in production: what actually changed</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/schema-driven-ui-rendering-content-from-a-type</loc>
    <lastmod>2026-08-23</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/schema-driven-ui-rendering-content-from-a-type.png</image:loc>
      <image:title>Schema-driven UI: this post is a data structure</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/what-mcp-is-and-what-it-replaces</loc>
    <lastmod>2026-08-23</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/what-mcp-is-and-what-it-replaces.png</image:loc>
      <image:title>MCP, explained by what it actually replaces</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/rag-or-long-context-how-to-choose</loc>
    <lastmod>2026-08-23</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/rag-or-long-context-how-to-choose.png</image:loc>
      <image:title>RAG or long context: how to actually choose</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/how-real-time-collaborative-editing-works</loc>
    <lastmod>2026-08-23</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/how-real-time-collaborative-editing-works.png</image:loc>
      <image:title>How real-time collaborative editing works</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/micro-frontends-make-the-complexity-earn-it</loc>
    <lastmod>2026-08-23</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/micro-frontends-make-the-complexity-earn-it.png</image:loc>
      <image:title>Micro-frontends: make the complexity earn it</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/typescript-patterns-that-survive-a-big-codebase</loc>
    <lastmod>2026-08-23</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/typescript-patterns-that-survive-a-big-codebase.png</image:loc>
      <image:title>The TypeScript patterns that survive a big codebase</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/recalldsa-spaced-repetition-for-dsa</loc>
    <lastmod>2026-08-21</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/recalldsa-spaced-repetition-for-dsa.png</image:loc>
      <image:title>RecallDSA: spaced repetition for coding interview practice</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/lazygocd-terminal-ui-for-gocd</loc>
    <lastmod>2026-08-21</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/lazygocd-terminal-ui-for-gocd.png</image:loc>
      <image:title>lazygocd: a terminal dashboard for GoCD that feels local</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/what-claude-code-leaves-on-disk</loc>
    <lastmod>2026-08-18</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/what-claude-code-leaves-on-disk.png</image:loc>
      <image:title>What Claude Code leaves on disk, and what you can build from it</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/turn-repeat-work-into-ai-skills</loc>
    <lastmod>2026-07-01</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/turn-repeat-work-into-ai-skills.png</image:loc>
      <image:title>Stop re-explaining yourself to the AI: turn repeat work into skills</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/debug-with-ai-not-guesses</loc>
    <lastmod>2026-06-25</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/debug-with-ai-not-guesses.png</image:loc>
      <image:title>Debug with the AI, not by guessing: a hypothesis-first loop</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/make-ai-grill-your-plan</loc>
    <lastmod>2026-06-20</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/make-ai-grill-your-plan.png</image:loc>
      <image:title>Make the AI argue with you before you build</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/aws-shared-responsibility-model</loc>
    <lastmod>2026-07-01</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/aws-shared-responsibility-model.png</image:loc>
      <image:title>Security of the cloud vs security in the cloud</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/aws-regions-availability-zones</loc>
    <lastmod>2026-06-30</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/aws-regions-availability-zones.png</image:loc>
      <image:title>Regions, zones and edges: the geography of the cloud</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/aws-three-types-of-storage</loc>
    <lastmod>2026-06-29</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/aws-three-types-of-storage.png</image:loc>
      <image:title>Block, file, object: the only three kinds of cloud storage</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/how-dns-actually-works</loc>
    <lastmod>2026-06-22</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/how-dns-actually-works.png</image:loc>
      <image:title>How DNS actually works (and why it breaks your deploys)</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/load-balancers-and-cdns</loc>
    <lastmod>2026-06-10</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/load-balancers-and-cdns.png</image:loc>
      <image:title>Load balancers &amp; CDNs, explained at a chai stall</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/docker-in-one-sentence</loc>
    <lastmod>2026-05-24</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/docker-in-one-sentence.png</image:loc>
      <image:title>Docker in one sentence: a beginner's mental model</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/spaced-repetition-for-engineers</loc>
    <lastmod>2026-05-08</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/spaced-repetition-for-engineers.png</image:loc>
      <image:title>Stop forgetting what you learn: spaced repetition for engineers</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/killing-flaky-tests</loc>
    <lastmod>2026-04-28</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/killing-flaky-tests.png</image:loc>
      <image:title>Tests that don't lie: how to kill flaky tests</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/working-with-ai-pair-programmers</loc>
    <lastmod>2026-04-09</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/working-with-ai-pair-programmers.png</image:loc>
      <image:title>The blank file is dead: how to actually work with AI pair programmers</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/feeding-context-to-llms</loc>
    <lastmod>2026-03-26</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/feeding-context-to-llms.png</image:loc>
      <image:title>Garbage in, confident nonsense out: feeding context to an LLM</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/choosing-boring-technology</loc>
    <lastmod>2026-03-11</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/choosing-boring-technology.png</image:loc>
      <image:title>Boring technology wins: how to choose a stack</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/linux-commands-worth-knowing</loc>
    <lastmod>2026-02-22</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/linux-commands-worth-knowing.png</image:loc>
      <image:title>The Linux commands I reach for every single day</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/what-happens-when-you-deploy</loc>
    <lastmod>2026-02-06</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/what-happens-when-you-deploy.png</image:loc>
      <image:title>From localhost to the world: what actually happens when you deploy</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/ghostty-tmux-claude-code</loc>
    <lastmod>2026-07-02</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/ghostty-tmux-claude-code.png</image:loc>
      <image:title>A terminal-native setup for coding with an AI: Ghostty, tmux, Claude Code</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/guardrail-hooks-for-a-coding-agent</loc>
    <lastmod>2026-07-02</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/guardrail-hooks-for-a-coding-agent.png</image:loc>
      <image:title>Guardrails for a coding agent: hooks that just say no</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/quality-gate-hooks-that-keep-diffs-clean</loc>
    <lastmod>2026-07-02</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/quality-gate-hooks-that-keep-diffs-clean.png</image:loc>
      <image:title>The quiet hooks that keep your diffs clean</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://sahilchalke.com/blog/fan-out-then-refute-multi-agent-review</loc>
    <lastmod>2026-07-02</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.7</priority>
    <image:image>
      <image:loc>https://sahilchalke.com/og/fan-out-then-refute-multi-agent-review.png</image:loc>
      <image:title>Fan out, then refute: reviewing code with a panel of agents</image:title>
    </image:image>
  </url>
</urlset>
