<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Saṃhitā — Notes</title>
  <subtitle>Field notes by Yesudeep Jose Mangalapilly.</subtitle>
  <link href="https://yesudeep.com/feed.xml" rel="self"/>
  <link href="https://yesudeep.com/blog/"/>
  <id>https://yesudeep.com/blog/</id>
  <updated>2026-07-03T00:00:00+00:00</updated>
  <author><name>Yesudeep Jose Mangalapilly</name></author>
  <entry>
    <title>Can I Use This Library?</title>
    <link href="https://yesudeep.com/blog/can-i-use-this-library/"/>
    <id>https://yesudeep.com/blog/can-i-use-this-library/</id>
    <updated>2026-07-03T00:00:00+00:00</updated>
    <published>2026-07-03T00:00:00+00:00</published>
    <summary>A strict CSP quietly turns every dependency into a security decision. Here is the tree I walk to make it — per library, and across a whole app.</summary>
  </entry>
  <entry>
    <title>The Header That Can't Be Cached</title>
    <link href="https://yesudeep.com/blog/the-header-that-cant-be-cached/"/>
    <id>https://yesudeep.com/blog/the-header-that-cant-be-cached/</id>
    <updated>2026-07-03T00:00:00+00:00</updated>
    <published>2026-07-03T00:00:00+00:00</published>
    <summary>Cache-Control from first principles — and why a page carrying a CSP nonce must be told never to be stored, not merely "don't cache."</summary>
  </entry>
  <entry>
    <title>Trust No Script</title>
    <link href="https://yesudeep.com/blog/trust-no-script/"/>
    <id>https://yesudeep.com/blog/trust-no-script/</id>
    <updated>2026-07-03T00:00:00+00:00</updated>
    <published>2026-07-03T00:00:00+00:00</published>
    <summary>Why a strict Content Security Policy is one of the hardest headers to deploy — and how to read a real one with Google's CSP Evaluator.</summary>
  </entry>
  <entry>
    <title>The URL Is the Hash</title>
    <link href="https://yesudeep.com/blog/the-url-is-the-hash/"/>
    <id>https://yesudeep.com/blog/the-url-is-the-hash/</id>
    <updated>2026-06-30T00:00:00+00:00</updated>
    <published>2026-06-30T00:00:00+00:00</published>
    <summary>Content-addressing on the wire — how the web quietly became a content-addressed store, where fingerprinted URLs and Subresource Integrity are real Merkle edges and the cache that looks most like one isn't.</summary>
  </entry>
  <entry>
    <title>You Don't Want Separate Repos</title>
    <link href="https://yesudeep.com/blog/you-dont-want-separate-repos/"/>
    <id>https://yesudeep.com/blog/you-dont-want-separate-repos/</id>
    <updated>2026-06-29T00:00:00+00:00</updated>
    <published>2026-06-29T00:00:00+00:00</published>
    <summary>A repository is a database; splitting a subproject out trades a content hash for a version string — and there's only one case where that trade is actually forced.</summary>
  </entry>
  <entry>
    <title>A Language That Can't Loop Forever</title>
    <link href="https://yesudeep.com/blog/a-language-that-cant-loop-forever/"/>
    <id>https://yesudeep.com/blog/a-language-that-cant-loop-forever/</id>
    <updated>2026-06-26T00:00:00+00:00</updated>
    <published>2026-06-26T00:00:00+00:00</published>
    <summary>Bazel's Starlark forbids unbounded loops and recursion on purpose, and gets analyzability, caching, and parallelism in return. Buck2 quietly allows recursion back — and the split shows which restriction is load-bearing.</summary>
  </entry>
  <entry>
    <title>A Little Uncertainty Buys a Lot of Space</title>
    <link href="https://yesudeep.com/blog/a-little-uncertainty-buys-a-lot-of-space/"/>
    <id>https://yesudeep.com/blog/a-little-uncertainty-buys-a-lot-of-space/</id>
    <updated>2026-06-26T00:00:00+00:00</updated>
    <published>2026-06-26T00:00:00+00:00</published>
    <summary>Bloom filters trade a small chance of being wrong for an enormous saving in memory — a bargain storage engines take and build systems, so far, refuse.</summary>
  </entry>
  <entry>
    <title>node_modules Is the Heaviest Object in the Universe</title>
    <link href="https://yesudeep.com/blog/node-modules-is-the-heaviest-object-in-the-universe/"/>
    <id>https://yesudeep.com/blog/node-modules-is-the-heaviest-object-in-the-universe/</id>
    <updated>2026-06-26T00:00:00+00:00</updated>
    <published>2026-06-26T00:00:00+00:00</published>
    <summary>The same "the hash is the identity" idea that powers a build cache also explains why pnpm stores on disk what npm copies a hundred times over.</summary>
  </entry>
  <entry>
    <title>The Build That Restarts Itself</title>
    <link href="https://yesudeep.com/blog/the-build-that-restarts-itself/"/>
    <id>https://yesudeep.com/blog/the-build-that-restarts-itself/</id>
    <updated>2026-06-26T00:00:00+00:00</updated>
    <published>2026-06-26T00:00:00+00:00</published>
    <summary>Inside Skyframe, Bazel's incremental engine — and the strange trick at its heart.</summary>
  </entry>
  <entry>
    <title>The Grain of the Machine</title>
    <link href="https://yesudeep.com/blog/the-grain-of-the-machine/"/>
    <id>https://yesudeep.com/blog/the-grain-of-the-machine/</id>
    <updated>2026-06-26T00:00:00+00:00</updated>
    <published>2026-06-26T00:00:00+00:00</published>
    <summary>A processor isn't a featureless calculator — it has a shape: words, cache lines, vector lanes. Code that moves with that grain runs many times faster than code that fights it, on the very same data. Here's the shape, and a measured case where the same arithmetic runs 22× slower against it.</summary>
  </entry>
  <entry>
    <title>The Hash Is the Identity</title>
    <link href="https://yesudeep.com/blog/the-hash-is-the-identity/"/>
    <id>https://yesudeep.com/blog/the-hash-is-the-identity/</id>
    <updated>2026-06-26T00:00:00+00:00</updated>
    <published>2026-06-26T00:00:00+00:00</published>
    <summary>Content-addressing in the build cache — content-addressed storage and Merkle trees turn a build cache into a shared resource, so your build is proportional to anyone's change.</summary>
  </entry>
  <entry>
    <title>The Widest Box Is the Bug</title>
    <link href="https://yesudeep.com/blog/the-widest-box-is-the-bug/"/>
    <id>https://yesudeep.com/blog/the-widest-box-is-the-bug/</id>
    <updated>2026-06-26T00:00:00+00:00</updated>
    <published>2026-06-26T00:00:00+00:00</published>
    <summary>A flamegraph turns thousands of stack samples into one picture where the slow code is, almost literally, the biggest thing on the screen.</summary>
  </entry>
  <entry>
    <title>There Are No Phases</title>
    <link href="https://yesudeep.com/blog/there-are-no-phases/"/>
    <id>https://yesudeep.com/blog/there-are-no-phases/</id>
    <updated>2026-06-26T00:00:00+00:00</updated>
    <published>2026-06-26T00:00:00+00:00</published>
    <summary>Buck2's DICE engine collapses load, analysis, and execution into a single graph — and the decision to rebuild rather than adopt.</summary>
  </entry>
  <entry>
    <title>Utils Is Where Modularity Goes to Die</title>
    <link href="https://yesudeep.com/blog/utils-is-where-modularity-goes-to-die/"/>
    <id>https://yesudeep.com/blog/utils-is-where-modularity-goes-to-die/</id>
    <updated>2026-06-26T00:00:00+00:00</updated>
    <published>2026-06-26T00:00:00+00:00</published>
    <summary>Module boundaries should follow the dependency graph, not your folder intuitions — and "optimal" can be defined precisely.</summary>
  </entry>
  <entry>
    <title>With the Grain</title>
    <link href="https://yesudeep.com/blog/with-the-grain/"/>
    <id>https://yesudeep.com/blog/with-the-grain/</id>
    <updated>2026-06-26T00:00:00+00:00</updated>
    <published>2026-06-26T00:00:00+00:00</published>
    <summary>The original turned a big integer into bytes one byte at a time, fighting the machine. The rewrite went with its grain — whole machine words, packed in C. That structural choice is why it's still ~15× faster fifteen years on, even as CPython sped up underneath it.</summary>
  </entry>
  <entry>
    <title>The Build Is Proportional to the Change</title>
    <link href="https://yesudeep.com/blog/build-is-proportional-to-change/"/>
    <id>https://yesudeep.com/blog/build-is-proportional-to-change/</id>
    <updated>2026-06-25T00:00:00+00:00</updated>
    <published>2026-06-25T00:00:00+00:00</published>
    <summary>What every build system is really doing — and the one decision that separates the ones that scale.</summary>
  </entry>
  <entry>
    <title>Scaffolding a Typographic Portfolio Site</title>
    <link href="https://yesudeep.com/blog/scaffolding-a-typographic-portfolio-site/"/>
    <id>https://yesudeep.com/blog/scaffolding-a-typographic-portfolio-site/</id>
    <updated>2026-05-26T00:00:00+00:00</updated>
    <published>2026-05-26T00:00:00+00:00</published>
    <summary>The design philosophy behind this site — why it's built from durable tools and a purposeful type system instead of a framework, and why every choice is aimed at lasting.</summary>
  </entry>
  <entry>
    <title>The Patch Bram Applied</title>
    <link href="https://yesudeep.com/blog/the-patch-bram-applied/"/>
    <id>https://yesudeep.com/blog/the-patch-bram-applied/</id>
    <updated>2026-04-09T00:00:00+00:00</updated>
    <published>2026-04-09T00:00:00+00:00</published>
    <summary>A small contribution to Vim, the man who took it, and the editor I still open every morning.</summary>
  </entry>
  <entry>
    <title>Designing an API That Outlives You</title>
    <link href="https://yesudeep.com/blog/designing-an-api-that-outlives-you/"/>
    <id>https://yesudeep.com/blog/designing-an-api-that-outlives-you/</id>
    <updated>2026-02-12T00:00:00+00:00</updated>
    <published>2026-02-12T00:00:00+00:00</published>
    <summary>I wrote watchdog in 2010. Fifteen years and three maintainers later it still ships the same public API I designed — here's what made it last.</summary>
  </entry>
  <entry>
    <title>Everything Is an Action</title>
    <link href="https://yesudeep.com/blog/everything-is-an-action/"/>
    <id>https://yesudeep.com/blog/everything-is-an-action/</id>
    <updated>2025-01-20T00:00:00+00:00</updated>
    <published>2025-01-20T00:00:00+00:00</published>
    <summary>The architecture of Firebase Genkit rests on one primitive — a self-describing, observable, callable function — and the whole SDK is layers of specializations of it.</summary>
  </entry>
  <entry>
    <title>Reading a Codebase</title>
    <link href="https://yesudeep.com/blog/reading-a-codebase/"/>
    <id>https://yesudeep.com/blog/reading-a-codebase/</id>
    <updated>2025-01-15T00:00:00+00:00</updated>
    <published>2025-01-15T00:00:00+00:00</published>
    <summary>A method for taking real software apart at the source level — find the one type everything hangs from, extract the algebra, and learn what the designers refused to allow.</summary>
  </entry>
  <entry>
    <title>I like the way Aquamacs looks.  I don’t use it because it feels different</title>
    <link href="https://yesudeep.com/blog/aquamacs-vs-stock-emacs/"/>
    <id>https://yesudeep.com/blog/aquamacs-vs-stock-emacs/</id>
    <updated>2009-12-14T00:00:00+00:00</updated>
    <published>2009-12-14T00:00:00+00:00</published>
    <summary>Why I keep stock GNU Emacs over Aquamacs — one consistent editor across every OS.</summary>
  </entry>
  <entry>
    <title>Even faster String.prototype.trim() implementation in JavaScript</title>
    <link href="https://yesudeep.com/blog/even-faster-string-trim/"/>
    <id>https://yesudeep.com/blog/even-faster-string-trim/</id>
    <updated>2009-07-31T00:00:00+00:00</updated>
    <published>2009-07-31T00:00:00+00:00</published>
    <summary>A faster, non-regex String.prototype.trim() — later adopted into early JS frameworks.</summary>
  </entry>
  <entry>
    <title>Making the browser download scripts in parallel</title>
    <link href="https://yesudeep.com/blog/parallel-script-loading/"/>
    <id>https://yesudeep.com/blog/parallel-script-loading/</id>
    <updated>2009-07-29T00:00:00+00:00</updated>
    <published>2009-07-29T00:00:00+00:00</published>
    <summary>Loading multiple scripts concurrently instead of the browser’s serial default.</summary>
  </entry>
  <entry>
    <title>memcache.js for Google App Engine application front-ends?</title>
    <link href="https://yesudeep.com/blog/memcache-js-for-app-engine/"/>
    <id>https://yesudeep.com/blog/memcache-js-for-app-engine/</id>
    <updated>2009-07-25T00:00:00+00:00</updated>
    <published>2009-07-25T00:00:00+00:00</published>
    <summary>Caching AJAX responses on the client by mapping App Engine’s datastore to JS objects.</summary>
  </entry>
  <entry>
    <title>Implementing a Pythonic range() function in JavaScript</title>
    <link href="https://yesudeep.com/blog/pythonic-range-in-javascript/"/>
    <id>https://yesudeep.com/blog/pythonic-range-in-javascript/</id>
    <updated>2009-07-25T00:00:00+00:00</updated>
    <published>2009-07-25T00:00:00+00:00</published>
    <summary>A Python-style range() helper instead of typing out a sequence by hand.</summary>
  </entry>
</feed>
