<?xml version="1.0" encoding="UTF-8"?>
<!-- This is an Atom feed. Paste this address into a feed reader to follow new posts. Human-readable index: https://sanchay.sh/blog/ -->

<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Sanchay Pahalwani - Writing</title>
    <subtitle>Real-time systems and AI-first products, shipped end to end.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://sanchay.sh/blog/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://sanchay.sh/blog/"/>
    <link rel="hub" href="https://pubsubhubbub.appspot.com/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-08-26T00:00:00+00:00</updated>
    <id>https://sanchay.sh/blog/atom.xml</id>
    <entry xml:lang="en">
        <title>How this site is built</title>
        <published>2026-08-26T00:00:00+00:00</published>
        <updated>2026-08-26T00:00:00+00:00</updated>
        <author><name>Sanchay Pahalwani</name></author>
        
        <link rel="alternate" type="text/html" href="https://sanchay.sh/blog/how-this-site-is-built/"/>
        <id>https://sanchay.sh/blog/how-this-site-is-built/</id>
        <content type="html" xml:base="https://sanchay.sh/blog/how-this-site-is-built/">&lt;p&gt;The homepage of this site is a single hand-written HTML file. No framework, inline
CSS, a few dozen lines of vanilla JS. I wanted to keep it that way and still have a
place to write, so the blog is built by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt;, a static
site generator that ships as one binary.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-rules&quot;&gt;The rules&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;The deploy output is a closed allowlist. If the build produces a file the script
does not expect, the deploy fails.&lt;&#x2F;li&gt;
&lt;li&gt;The homepage never passes through a build tool. The build script copies it into
the output directory after Zola runs, byte for byte.&lt;&#x2F;li&gt;
&lt;li&gt;Syntax highlighting happens at build time.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-build&quot;&gt;The build&lt;&#x2F;h2&gt;
&lt;p&gt;The whole pipeline is a short shell script:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;rm&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -rf&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; dist&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; --root&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; site build&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; --output-dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;$PWD&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt;&#x2F;dist&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;cp&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; index.html 404.html dist&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;cp&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -R&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; assets dist&#x2F;assets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Posts are markdown files with TOML front matter. A post is a draft until the
&lt;code&gt;draft = true&lt;&#x2F;code&gt; line is deleted, and drafts never reach production builds. The feed
lives at &lt;a href=&quot;&#x2F;blog&#x2F;atom.xml&quot;&gt;&#x2F;blog&#x2F;atom.xml&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
    </entry>
</feed>
