<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Pistachio Musings]]></title><description><![CDATA[Pistachio Musings is Shivan's thoughts on topics in the power set of {software, privacy, books}.]]></description><link>https://shivankaul.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png</url><title>Pistachio Musings</title><link>https://shivankaul.substack.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 20 Aug 2026 15:56:20 GMT</lastBuildDate><atom:link href="https://shivankaul.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Shivan Kaul]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[shivankaul@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[shivankaul@substack.com]]></itunes:email><itunes:name><![CDATA[shivan]]></itunes:name></itunes:owner><itunes:author><![CDATA[shivan]]></itunes:author><googleplay:owner><![CDATA[shivankaul@substack.com]]></googleplay:owner><googleplay:email><![CDATA[shivankaul@substack.com]]></googleplay:email><googleplay:author><![CDATA[shivan]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Book review: Parable of the Sower]]></title><description><![CDATA[A review of Octavia Butler's Parable of the Sower, our latest book club read.]]></description><link>https://shivankaul.substack.com/p/parable-of-the-sower</link><guid isPermaLink="false">https://shivankaul.substack.com/p/parable-of-the-sower</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>A review of Octavia Butler's Parable of the Sower, our latest book club read.</em></p><a class="image-link image2" target="_blank" href="https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg 424w, https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg 848w, https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg 1272w, https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg 1456w" sizes="100vw"><img src="https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg" data-attrs="{&quot;src&quot;:&quot;https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:250,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Parable of the Sower by Octavia E. Butler&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Parable of the Sower by Octavia E. Butler" title="Parable of the Sower by Octavia E. Butler" srcset="https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg 424w, https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg 848w, https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg 1272w, https://shivankaul.com/blog/assets/parable-of-the-sower/cover.jpg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p><em>Parable of the Sower</em> by Octavia E. Butler.</p><p>Given how seminal <a href="https://en.wikipedia.org/wiki/Parable_of_the_Sower_(novel)">Parable of the Sower</a> by <a href="https://en.wikipedia.org/wiki/Octavia_E._Butler">Octavia E. Butler</a> is as a work of speculative and dystopian fiction, it&#8217;s surprising it took me this long to get to it. I think I was put off by how bleak I&#8217;d heard it to be. Also, while I&#8217;d loved <a href="https://en.wikipedia.org/wiki/Bloodchild_and_Other_Stories">Bloodchild</a>, it had taken me a week to recover; <em>Parable</em> promised to be no cheerier. Misery loves company, so I decided to <a href="https://shivankaul.com/fun/bookclub/">subject our book club to it</a>. Here are my spoiler-full notes about the book, based on my own thoughts as well as the discussion we had after.</p><p><strong>Overall:</strong> I enjoyed it, though I really wanted to stop about 25% of the way through because of how casually violent it was. I&#8217;m glad I kept going though. There was much to grapple with, so a good book club pick <em>(pats self)</em>.</p><p>Octavia Butler wrote the book in 1993, but it feels uncomfortably prescient and close to home. The novel is set in a 2024-2027 California torn apart by social inequality and climate change and features an American president whose slogan is <a href="https://en.wikipedia.org/wiki/Make_America_Great_Again#In_literature">Make America Great Again</a> (!). Octavia Butler is a masterful writer. The book is written from the perspective of a 15-year-old, Lauren, living through dystopia and recording her writings in her journal, and she somehow made the writing seem real and true to the conceit while not being extremely annoying. The prose was exactly what I would imagine from a precocious and articulate teenager. As we&#8217;ve read and discussed several books in our book club over the last year, I&#8217;ve had to think about what kind of writing I like, and I&#8217;ve realized that I prize cohesive and believable prose that keeps you immersed in the story above all else. I <em>hate</em> it when a weird turn of phrase or choice of word by the author makes you go &#8220;huh?&#8221;. The writing in this case was gripping! Despite the violence, I couldn&#8217;t put it down, unlike with <em>Game of Thrones</em>.</p><p>Speaking of <em>Game of Thrones</em>, this book had so. much. casual. violence. Horrific violence. Especially rape. So much. The casualness of it was shocking. It made sense in the narrative because she&#8217;s a prematurely-jaded teenager recording her post-apocalyptic life in her journal, but it was a <em>hard</em> read especially in the first half of the book. It becomes less violent after that, or perhaps you as the reader become inured to it as well. It was interesting that the violence, while there was a lot of it, never felt gratuitous. It was almost never described in graphic detail, just mentioned.</p><p>Religion is a big part of the book. Lauren&#8217;s father is a Baptist minister, so she grows up Christian. But faced with a world that does not feel like the workings of a just God, she invents her own religion called <a href="https://en.wikipedia.org/wiki/Earthseed">Earthseed</a>. The fundamental idea of Earthseed is that &#8220;God is Change.&#8221; She says that the only constant is change, so all beings have to deal with it and hopefully even affect it.</p><p>Also, somehow, she says we all <em>need</em> to go to space.</p><a class="image-link image2" target="_blank" href="https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp 424w, https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp 848w, https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp 1272w, https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp 1456w" sizes="100vw"><img src="https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp" data-attrs="{&quot;src&quot;:&quot;https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;SPAAAAAACE&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="SPAAAAAACE" title="SPAAAAAACE" srcset="https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp 424w, https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp 848w, https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp 1272w, https://shivankaul.com/blog/assets/parable-of-the-sower/second.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p>SPAAAAAACE!</p><p>This is a bit of a crazy leap in theological logic, so let&#8217;s break it down.</p><p>The practicality of Lauren&#8217;s conclusion &#8211; that the only moral truth is capital-C Change &#8211; makes a lot of sense. &#8220;Turning the other cheek&#8221; doesn&#8217;t really help if you&#8217;re living in a world where you can&#8217;t trust anyone and people will happily murder you and steal everything you own if they can. But taking it a step further, what is the central problem facing Lauren and her family? What is making people lose all sense of fraternity, and causing them to pillage and burn their neighbors? A lack of resources. So then the ultimate solution, the only solution, is to leave Earth itself (!) and find new planets to live on. Right?</p><p><a href="https://en.wikipedia.org/wiki/Abundance_(Klein_and_Thompson_book)">Supply-side thinking</a> if I&#8217;ve ever seen it. Lauren would do well in San Francisco.</p><p>I loved how crazy and unintuitive this was! It makes complete sense that a smart teenager in her circumstances would come to these conclusions. It&#8217;s also interesting as religion design. The central tenet is so compelling (change is the only constant), and the eschatological belief so crazy (so we need to go to the stars), that she attracts a wide variety of believers. Something for everyone.</p><p>It actually reminded me of how when I was a teenager, I also believed that <a href="https://www.spacex.com/updates#xai-joins-spacex">&#8220;extend[ing] the light of consciousness to the stars&#8221;</a> was the only way to save humanity. I&#8217;m less Musk-pilled now, but it&#8217;s awesome that Octavia Butler was able to capture that adolescent impulse and psychology so well.</p><p>Lauren suffers from a condition called hyperempathy, where she viscerally hallucinates the pain of others around her. This condition in a hyper-violent world would be a huge disability (and it is). But I think it is also what drives her to re-invent the Buddhist idea of <a href="https://en.wikipedia.org/wiki/Impermanence_(Buddhism)">&#8220;impermanence&#8221; (anitya)</a> and <a href="https://en.wikipedia.org/wiki/Du%E1%B8%A5kha">&#8220;suffering&#8221; (dukkha)</a> from first principles, without having to sit under a <a href="https://en.wikipedia.org/wiki/Ficus_religiosa">fig tree</a> for seven days. Speaking of Buddhism (since Earthseed has distinctly Buddhist vibes), Earthseed doesn&#8217;t go as far as Buddhism in claiming <a href="https://en.wikipedia.org/wiki/Anatt%C4%81">no-self</a>. Earthseed&#8217;s philosophy focuses on change and dealing with it, but Lauren still believes in a Self that is acting upon the world, and is more concerned with survival than liberation from suffering.</p><p><em>Parable</em> reminded me of <em><a href="https://en.wikipedia.org/wiki/Lincoln_in_the_Bardo">Lincoln in the Bardo</a></em>, a previous book club pick for us. To fully understand pain and suffering, you must truly feel it, and real empathy can provoke swift action to end violence even at the cost of more violence.</p><p>We also discussed how empathy has become a political punching bag in 2026 discourse. <a href="https://archive.ph/LDVJp">The Economist</a> recently had an article about how all factions of American politics have asinine positions on empathy: either not being fully inclusive or rejecting it outright.</p><p>It&#8217;s interesting and believable that Butler&#8217;s dystopia stops short of total collapse. There&#8217;s still a government, police, and fire department functioning, for some definition of &#8220;functioning&#8221;, just more like what you would expect from a broken country. It feels real! While an outright Wild-West collapse of America is unlikely any time soon, slow-crumbling institutions and infrastructure sound awfully familiar.</p><p>It was a cool parallel to the <a href="https://en.wikipedia.org/wiki/Underground_Railroad">Underground Railroad</a> that everybody in the story wants to head north, to the northern states and Canada. It might be because climate change makes Canada more habitable. Or it might just be a case of the grass being greener (literally) where you are not; we don&#8217;t actually see in the book if Canada is better off. It reminded me of the scene in <em><a href="https://en.wikipedia.org/wiki/Civil_War_(film)">Civil War</a></em> where there&#8217;s a played-up joke about Canadian dollars being more valuable than USD, to much horrified laughter. The American psyche cannot comprehend Canada doing better (financially, no less) than them.</p><p>I hope that when the next apocalypse happens we choose each other instead of building walls. I think we will.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/parable-of-the-sower">https://shivankaul.com/blog/parable-of-the-sower</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Firefox browser has started shipping Brave's adblock-rust engine]]></title><description><![CDATA[Mozilla is experimenting with Brave's adblock engine, here's how to turn it on.]]></description><link>https://shivankaul.substack.com/p/firefox-bundles-adblock-rust</link><guid isPermaLink="false">https://shivankaul.substack.com/p/firefox-bundles-adblock-rust</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Mozilla is experimenting with Brave's adblock engine, here's how to turn it on.</em></p><p>Mozilla bundled <a href="https://github.com/brave/adblock-rust">adblock-rust</a> (Brave&#8217;s Rust-based adblock engine, the same one my team <a href="https://shivankaul.com/blog/adblock-memory-reduction">works on</a>) into Firefox. Pretty exciting! It landed in Firefox 149 via <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2013888">Bugzilla Bug 2013888</a>. It&#8217;s clearly still an experiment: disabled by default, no usable UI, no filter lists, and as far as I can tell, no press coverage.</p><p>I previously <s>tweeted</s> <a href="https://x.com/shivan_kaul/status/2038463991559938546">posted about Waterfox adopting adblock-rust</a>. It looks like Waterfox is piggy-backing off of Firefox&#8217;s implementation (great!). Thanks to Moritz for the pointer to Firefox&#8217;s bug linked to from Waterfox&#8217;s <a href="https://github.com/BrowserWorks/waterfox/issues/4182">adblock-rust implementation issue</a>.</p><h2>How to enable Brave&#8217;s adblocking engine in Firefox</h2><p>Open <code>about:config</code> in Firefox 149+ and set:</p><pre><code>privacy.trackingprotection.content.protection.enabled = true
</code></pre><p>Then point it at some filter lists. It currently ships with no filter lists by default; you have to supply them yourself. To add <a href="https://easylist.to/">EasyList and EasyPrivacy</a> filter lists:</p><pre><code>privacy.trackingprotection.content.protection.test_list_urls = https://easylist.to/easylist/easylist.txt|https://easylist.to/easylist/easyprivacy.txt
</code></pre><p>Changing the <code>test_list_urls</code> pref triggers a full reload, but the lists were cached when I tested them.</p><h3>All prefs</h3><p>Just search for <code>privacy.trackingprotection.content</code> in <code>about:config</code>. I found the following:</p><ul><li><p><code>privacy.trackingprotection.content.protection.enabled</code>: Enable blocking</p></li><li><p><code>privacy.trackingprotection.content.annotation.enabled</code>: Enable annotation (tagging without blocking)</p></li><li><p><code>privacy.trackingprotection.content.protection.test_list_urls</code>: Pipe-delimited list URLs for blocking</p></li><li><p><code>privacy.trackingprotection.content.annotation.test_list_urls</code>: Pipe-delimited list URLs for annotation</p></li><li><p><code>privacy.trackingprotection.content.testing</code>: Fire observer notifications when adblock engine is rebuilt</p></li></ul><p>It looks like Firefox&#8217;s bundling supports two modes:</p><ul><li><p><strong>Protection</strong>: matches and blocks requests against filter lists.</p></li><li><p><strong>Annotation</strong>: matches and tags requests for telemetry/UI, but doesn&#8217;t block.</p></li></ul><p>There&#8217;s been a huge surge of interest recently in adblock-rust from browsers; Firefox joins Waterfox and Perplexity Comet (a <a href="https://shivankaul.com/blog/comet-privacy#a-positive-note-comet-does-adblocking">positive</a> note in their otherwise <a href="https://shivankaul.com/blog/comet-privacy">disappointing</a> privacy posture). You just can&#8217;t ship a serious browser these days without blocking third-party ads and trackers by default; Firefox still doesn&#8217;t block <a href="https://privacytests.org/">tracking query parameters</a>, for instance. I&#8217;m curious to see where this experiment goes!</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/firefox-bundles-adblock-rust">https://shivankaul.com/blog/firefox-bundles-adblock-rust</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Presentation on privacy leadership inflection point]]></title><description><![CDATA[My talk at Global Privacy Leaders Summit @ RSA 2026 on why privacy leadership roles are changing, and why that's a good thing.]]></description><link>https://shivankaul.substack.com/p/privacy-inflection-point</link><guid isPermaLink="false">https://shivankaul.substack.com/p/privacy-inflection-point</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>My talk at Global Privacy Leaders Summit @ RSA 2026 on why privacy leadership roles are changing, and why that's a good thing.</em></p><p>I gave the opening keynote talk at <a href="https://www.linkedin.com/posts/fromanshu_%F0%9D%97%A2%F0%9D%97%BD%F0%9D%97%B2%F0%9D%97%BB%F0%9D%97%B6%F0%9D%97%BB%F0%9D%97%B4-%F0%9D%97%9E%F0%9D%97%B2%F0%9D%98%86%F0%9D%97%BB%F0%9D%97%BC%F0%9D%98%81%F0%9D%97%B2-%F0%9D%97%A6%F0%9D%97%BD%F0%9D%97%B2%F0%9D%97%AE%F0%9D%97%B8%F0%9D%97%B2%F0%9D%97%BF-activity-7437658251137159168-hgmt/">Global Privacy Leaders Summit @ RSA 2026</a> about how the role of the Chief Privacy Officer is changing. The thrust of the talk was that because of incoming AI regulation as well as increasing privacy law enforcement, the practice of privacy is increasingly becoming a systems problem, as opposed to a policy problem. I also argued that AI regulation is really just privacy regulation in disguise.</p><p>If you&#8217;re leading a privacy program, you should be in the room where it happens inside your company. It&#8217;s time to go beyond risk-obsessed thinking and to focus on what you <em>could</em> do if you had the right privacy systems. I made the following points:</p><ol><li><p>Compliance is not privacy</p></li><li><p>Regulation is inevitable and incoming</p></li><li><p>AI and privacy are frenemies</p></li></ol><p>For more details, see the <a href="https://shivankaul.com/blog/assets/rsa-privacy-summit-keynote.pdf">PDF slides</a>!</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/privacy-inflection-point">https://shivankaul.com/blog/privacy-inflection-point</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Cookbook club: Samin Nosrat's Good Things]]></title><description><![CDATA[Combining the two things I love most.]]></description><link>https://shivankaul.substack.com/p/cookbook-club</link><guid isPermaLink="false">https://shivankaul.substack.com/p/cookbook-club</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Combining the two things I love most.</em></p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pTI7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pTI7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pTI7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pTI7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pTI7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pTI7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:250,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Cover of Good Things by Samin Nosrat&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Cover of Good Things by Samin Nosrat" title="Cover of Good Things by Samin Nosrat" srcset="https://substackcdn.com/image/fetch/$s_!pTI7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pTI7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pTI7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pTI7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4addde37-5a4a-4433-9a32-dda6921f2e4e_408x500.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p><em>Good Things</em> by Samin Nosrat.</p><p>I&#8217;m part of a cookbook club with some friends. We pick a cookbook, everyone picks a recipe from the cookbook to make, and then we have a big potluck dinner. This is the <a href="https://docs.google.com/spreadsheets/d/1vxkxrj5AZa3jYQh5b_H7_QiiykvQ8-HXiTvll7Yjz5g/edit?usp=sharing">sign-up sheet template</a> we&#8217;ve been using (h/t my friend Bell for the original).</p><p>We&#8217;ve done 2 cookbooks so far. The first one was <a href="https://www.dishoom.com/store/products/dishoom-cookery-book/">Dishoom: From Bombay with Love</a> by the <a href="https://www.dishoom.com/">Dishoom folks</a>. I made the <a href="https://iamafoodblog.com/dishooms-ruby-chicken-curry-recipe/">ruby chicken</a>. It was a little more effort than I normally put into my chicken curries but it was worth it! The nice thing about cookbook clubs is that you can crowd-source trying out a bunch of recipes. If your friends are good cooks (as mine are), you can find some gems. I&#8217;ve incorporated <a href="https://www.telegraph.co.uk/recipes/everyday/lamb/dishoom-keema-pau/">Dishoom&#8217;s keema</a> into my &#8220;easy dinner&#8221; rotation, with a few modifications to actually make it easy.</p><p>The second cookbook was <a href="https://ciaosamin.com/shop/good-things">Samin Nosrat&#8217;s Good Things</a>. I made:</p><ul><li><p>fluffy meatballs + olive oil fried bread</p></li><li><p>roasted sweet potatoes with green sauce</p></li></ul><p>Other people made:</p><ul><li><p>kukukopita (Samin&#8217;s <a href="https://en.wikipedia.org/wiki/Kuku_(food)">kuku sabzi</a> meets <a href="https://en.wikipedia.org/wiki/Savory_spinach_pie">spanakopita</a>)</p></li><li><p>simple soba salad (with peanut sauce, reminded me of Montreal&#8217;s <a href="https://www.mtlblog.com/montreal/good-news-montreal-2-chow-has-not-been-affected-by-inflation">Chez Mein $2 noodles</a> doused in an unctuous peanut sauce that hit hard after a night out on Saint-Laurent)</p></li><li><p>steamed kabocha with sesame ginger dressing</p></li><li><p>crunchy cabbage slaw</p></li><li><p>pane criminale (garlic bread, insanely good)</p></li><li><p>creamy one pot pasta with peas</p></li><li><p>braised kale w feta (kale &#10084;&#65039;)</p></li><li><p>chocolate cake with burnt honey frosting (!!!)</p></li></ul><p>I loved my meatballs, the soba salad, the pane criminale (it really is criminally good) and the cake with burnt honey frosting. All in all, big success. I highly recommend doing a cookbook club with your friends and family.</p><p>Some pics:</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ySHj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ySHj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ySHj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ySHj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ySHj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ySHj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Spread of dishes from Samin Nosrat's Good Things cookbook&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Spread of dishes from Samin Nosrat's Good Things cookbook" title="Spread of dishes from Samin Nosrat's Good Things cookbook" srcset="https://substackcdn.com/image/fetch/$s_!ySHj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ySHj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ySHj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ySHj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11e4f4a-3164-417e-a2f5-f54802819a49_768x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p>Spread of dishes from Samin Nosrat&#8217;s Good Things cookbook</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9QDJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9QDJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9QDJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9QDJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9QDJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9QDJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Kukukopita - kuku sabzi meets spanakopita&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Kukukopita - kuku sabzi meets spanakopita" title="Kukukopita - kuku sabzi meets spanakopita" srcset="https://substackcdn.com/image/fetch/$s_!9QDJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9QDJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9QDJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9QDJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6188d229-75f3-4033-8edd-9760d1f8dd5e_768x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p>Kukukopita: kuku sabzi + spanakopita</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eCLF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eCLF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!eCLF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!eCLF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!eCLF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eCLF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Chocolate cake with burnt honey frosting&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Chocolate cake with burnt honey frosting" title="Chocolate cake with burnt honey frosting" srcset="https://substackcdn.com/image/fetch/$s_!eCLF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!eCLF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!eCLF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!eCLF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfca9166-4987-4bd0-9401-c0ad81f5cf26_768x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p>Chocolate cake with burnt honey frosting</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/cookbook-club">https://shivankaul.com/blog/cookbook-club</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Book review: The Correspondent]]></title><description><![CDATA[Spoiler-free review of The Correspondent, a novel I read and loved recently.]]></description><link>https://shivankaul.substack.com/p/the-correspondent</link><guid isPermaLink="false">https://shivankaul.substack.com/p/the-correspondent</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Spoiler-free review of The Correspondent, a novel I read and loved recently.</em></p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zljj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zljj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Zljj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Zljj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Zljj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zljj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:250,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Cover of The Correspondent by Virginia Evans&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Cover of The Correspondent by Virginia Evans" title="Cover of The Correspondent by Virginia Evans" srcset="https://substackcdn.com/image/fetch/$s_!Zljj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Zljj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Zljj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Zljj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b543817-b354-4736-94b3-a3377fc9c253_1838x2775.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p><em>The Correspondent</em> by Virginia Evans.</p><p>I normally don&#8217;t read recently-published novels, firmly believing in the value of natural selection acting over several years to winnow the good from the merely fashionable. I&#8217;ll only read a finite number of words in my lifetime, and I want to make them count, etc. This heuristic has served me well, and I have almost-always regretted straying from it (<a href="https://en.wikipedia.org/wiki/Trust_(novel)">Trust</a>, <a href="https://en.wikipedia.org/wiki/Prophet_Song">The Prophet Song</a>, <a href="https://en.wikipedia.org/wiki/The_Hummingbird">The Hummingbird</a>, more on this latter one below).</p><p><a href="https://www.goodreads.com/book/show/223001257-the-correspondent">The Correspondent by Virginia Evans</a>, thankfully, was an exception.</p><p>We chose it as the inaugural read for a book club. <em>The Correspondent</em> came out in 2025 (!), was a debut (!!) work and is an epistolary novel (!!!). Any one of these factors alone should have been enough to make me hate it, and I honestly would have never picked it up for myself. But I loved it! I raced through it in ~a week.</p><p>I&#8217;ve been turned off of <a href="https://en.wikipedia.org/wiki/Epistolary_novel">epistolary novels</a> (novels in the form of letters written between characters) since I read and disliked the much-awarded <a href="https://en.wikipedia.org/wiki/The_Hummingbird">The Hummingbird</a> by <a href="https://en.wikipedia.org/wiki/Sandro_Veronesi_(writer)">Sandro Veronesi</a> a few years ago. The chronology of <em>The Hummingbird</em> was confusing, the dialogue was clunky (though maybe it&#8217;s better in the original Italian), but mostly I didn&#8217;t enjoy it because the characters had paper-thin depth. They just didn&#8217;t feel like real humans. I&#8217;ve found that to be a common problem with the epistolary format: it&#8217;s very easy to fall into the trap of telling sans showing. Also, it&#8217;s confusing to keep track of the plot and characters while still sticking to the letter-writing conceit. People don&#8217;t rush to write letters to their friends in the middle of interesting events (at least these days). People journal, but a monologue is even less fun to read in a novel.</p><p><em>The Correspondent</em> didn&#8217;t suffer from any of the above. The letters/emails/journal entries in the novel are mostly written by the protagonist, a retired lawyer who writes letters to friends, family and even celebrities (Joan Didion makes an appearance). This feels believable! She grew up when letter-writing was common, practiced law (which honed her way with words), and is now retired, so she has both the time and the inclination for lengthy correspondence. She writes frequently to the same few people in her life, so you get to learn about their lives and start caring about them (including Joan Didion). She&#8217;s also looking <em>back</em> on her life and working through lingering trauma through writing. Over the course of the novel, you learn about her grief and how she has (and mostly hasn&#8217;t) dealt with it. It&#8217;s sad, but in a hopeful, <em>the sadness comes from caring</em> way.</p><p>I related to her since I too am a <a href="https://roonscape.ai/p/a-song-of-shapes-and-words">wordcel</a> and make sense of the world primarily through words. I started writing letters to friends over the pandemic and find it therapeutic, similar to journaling, except you&#8217;re also (bonus!) talking to a close friend. The speed of doing something affects the doing, and I think there&#8217;s something about the slowness of inscribing ink-on-paper that changes what you write: a measuredness, even a striving towards truth.</p><p>The epistolary format of <em>The Correspondent</em> lends itself well to the story, since we get regular updates on her life and events as she processes them. It was surprisingly fun to analyze the metadata (like the date, place, writing style) in the letters and emails. There <em>were</em> things that felt a bit too &#8220;cute&#8221; and neatly-wrapped in the novel (love it when one letter can instantly resolve decades of trauma) but overall I would highly recommend it to anyone who likes life-affirming fiction and an honest portrayal of grief and how it affects us. I gifted it to my mother, who is also a retired lady who likes words, so I&#8217;m curious to see what she thinks.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/the-correspondent">https://shivankaul.com/blog/the-correspondent</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Using FlatBuffers to reduce memory usage in adblock-rust]]></title><description><![CDATA[Shaving off 45 MB in the Brave app via FlatBuffers and other perf optimizations.]]></description><link>https://shivankaul.substack.com/p/adblock-memory-reduction</link><guid isPermaLink="false">https://shivankaul.substack.com/p/adblock-memory-reduction</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Shaving off 45 MB in the Brave app via FlatBuffers and other perf optimizations.</em></p><p>We spent a good chunk of 2025 working on memory savings for <a href="https://github.com/brave/adblock-rust">adblock-rust</a>. This was important and long-overdue work, since while Brave <a href="https://brave.com/blog/brave-android-one-eight-zero-plus-performance/">shines in other departments</a> (speed, CPU usage, battery consumption), we&#8217;re worse than Chrome for memory because we ship 100,000 adblock filters by default (several times an hour!) that need to get parsed, loaded into memory and used for every single network request (to decide whether or not to block) and for every single piece of content on every single website (to remove ads cosmetically). This happens even on lower-end devices running Brave, like old mobile phones. <a href="https://github.com/brave/brave-browser/wiki/Blocking-goals-and-policy">Brave&#8217;s policy</a> of only blocking third-party ads &amp; trackers by default also plays into this, since we need to make perf-heavy decisions in real-time: was this ad div created by a first-party request or a third-party request?</p><p>Once they reach the browser, all those 100,000+ adblock rules have traditionally been stored in the usual heap-allocated data structures in Rust, consuming tens of megabytes across every platform. Over the course of last year, we&#8217;ve incrementally moved our adblock engine to use <a href="https://crates.io/crates/flatbuffers">FlatBuffers</a> and made a lot of other performance optimizations, resulting in 75% reduced memory consumption and approximately 45 MB saved on Android, iOS, and desktop. For users who enable additional blocking lists, the savings are even greater. These are <em>massive</em> savings when it comes to browsers!</p><p>You can learn more in the <a href="https://brave.com/privacy-updates/36-adblock-memory-reduction/">blog post I wrote</a> on Brave&#8217;s official blog.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/adblock-memory-reduction">https://shivankaul.com/blog/adblock-memory-reduction</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Fixing Claude Code's process forking bug]]></title><description><![CDATA[Preventing Claude Code from exhausting macOS process limits with a wrapper script.]]></description><link>https://shivankaul.substack.com/p/claude-code-process-exhaustion</link><guid isPermaLink="false">https://shivankaul.substack.com/p/claude-code-process-exhaustion</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Preventing Claude Code from exhausting macOS process limits with a wrapper script.</em></p><p>I&#8217;ve been using Claude Code on the CLI recently, and I keep running into annoying bugs. A particularly egregious one was where Claude Code spawned thousands of zombie processes and exhausted my process limit, essentially fork-bombing me.</p><p>In the iTerm2 window where I had <code>claude</code> running, I saw the following output being spammed to the console:</p><pre><code>EAGAIN: resource temporarily unavailable, posix_spawn '/usr/local/bin/pgrep'
      path: "/usr/local/bin/pgrep",
   syscall: "spawn pgrep",
     errno: -35,
 spawnargs: [ "-P", 635 ],
      code: "EAGAIN"

      at spawn (node:child_process:669:35)
      at spawn (node:child_process:14:39)
      ...
</code></pre><p>and eventually my machine crawled to a halt. On opening a new iTerm2 window, I saw:</p><pre><code>forkpty: Resource temporarily unavailable
</code></pre><h2>Cause</h2><p>I looked it up and turns out <a href="https://github.com/anthropics/claude-code/issues/3989">Claude Code has a known bug on macOS</a> where a child-process tracking loop repeatedly spawns <code>pgrep</code>, eventually exhausting the per-user process budget. The stack trace shows <code>posix_spawn</code> failing with <code>EAGAIN</code> while trying to spawn <code>pgrep -P ...</code>.</p><p>The problem with these kind of bugs that exhaust your machine&#8217;s resources is that it&#8217;s hard to be ready to debug them when they do happen, since they take down the very thing you&#8217;re trying to debug with (i.e. my terminal). I couldn&#8217;t even open a new browser tab to a website, since that creates a new process in Chromium (for good, security-related reasons), and I had already hit the limit!</p><h2>Mitigation: a wrapper script</h2><p>I added a wrapper that caps the process limit for Claude&#8217;s process tree. I also moved <a href="https://shivankaul.com/blog/paste-bracketing-iterm2">my fix for Claude Code breaking paste bracketing</a> to this Claude Code wrapper script.</p><pre><code>#!/usr/bin/env bash
# Claude Code wrapper - limits max processes, fixes bracketed paste on exit

# Find the real claude binary
REAL=""
IFS=':' read -r -a dirs &lt;&lt;&lt; "$PATH"
for d in "${dirs[@]}"; do
  cand="${d:-./}/claude"
  if [[ "$cand" != "$0" &amp;&amp; -x "$cand" &amp;&amp; ! -d "$cand" ]]; then
    REAL="$cand"
    break
  fi
done

[[ -z "$REAL" ]] &amp;&amp; { echo "Error: claude not found" &gt;&amp;2; exit 127; }

# Cap max processes (default 1000) to prevent fork bombs
ulimit -u "${CLAUDE_CODE_MAXPROC:-1000}" 2&gt;/dev/null || true

# Disable feedback survey popup.
export CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1

echo "Claude wrapper active (maxproc=$(ulimit -u))" &gt;&amp;2

# Run claude
"$REAL" "$@"
rc=$?

# Fix bracketed paste mode that claude sometimes leaves enabled
printf '\e[?2004l'

exit $rc
</code></pre><h3>Customizing the process limit</h3><p>Set <code>CLAUDE_CODE_MAXPROC</code> to adjust:</p><pre><code>export CLAUDE_CODE_MAXPROC=2000
</code></pre><p>If Claude goes haywire, it hits the process ceiling instead of taking down your whole session.</p><p>This helped a lot next time Claude Code went haywire, since it wasn&#8217;t able to completely exhaust my machine. I was able to do some analysis and confirm the issue.</p><h2>Analysis</h2><p>Checking the process limit vs. actual count:</p><pre><code># User process limit:
ulimit -u

# Actual process count
ps -U "$USER" | wc -l
</code></pre><p>Something was creating many, many processes. A histogram of process states showed the problem:</p><pre><code>$ ps -u "$USER" -o comm= | sort | uniq -c | sort -nr | head -10
[a large number] &lt;defunct&gt;
... some other ones
</code></pre><p>This revealed many <code>defunct</code> (zombie) processes. Grouping zombies by parent PID:</p><pre><code>$ ps -A -o ppid=,stat= | awk '$2 ~ /Z/ {print $1}' | sort | uniq -c | sort -nr | head -20
[a large number] 16784
</code></pre><p>Almost all were parented by a single PID, which turned out to be <code>claude -r</code>:</p><pre><code>$ ps -p 16784 -o command
COMMAND
/Users/shivan/.local/bin/claude
</code></pre><p>Killing that process immediately dropped the count back to normal (~542) and iTerm started working again.</p><h2>The actual fix</h2><p>In the error output:</p><pre><code>EAGAIN: resource temporarily unavailable, posix_spawn '/usr/local/bin/pgrep'
      path: "/usr/local/bin/pgrep",
   syscall: "spawn pgrep",
     errno: -35,
 spawnargs: [ "-P", 635 ],
      code: "EAGAIN"
      ...
</code></pre><p>It was confusing why Claude Code was using <code>/usr/local/bin/pgrep</code>. It should have been using the system-installed one in <code>/usr/bin/pgrep</code>. <code>which pgrep</code> also gave me the wrong location, so it wasn&#8217;t just Claude Code.</p><p>On more investigation, it looks like when I migrated from an Intel Mac to Apple Silicon, orphaned Homebrew files remained in <code>/usr/local/</code> (the old Intel Homebrew location) while the new Apple Silicon Homebrew uses <code>/opt/homebrew/</code>. The orphaned <code>/usr/local/bin/pgrep</code> was a symlink to <code>proctools</code>, a Homebrew package that provided <code>pgrep</code> before macOS included it natively.</p><p>Critically: the proctools <code>pgrep</code> has a <a href="https://github.com/Homebrew/homebrew-core/issues/54378">bug</a> where the <code>-P</code> flag (filter by parent PID) is completely ignored. Instead of returning only child processes, it returns all processes on the system. So when Claude Code runs <code>pgrep -P &lt;pid&gt;</code> to track its child processes, the broken version returns hundreds of PIDs instead. If Claude Code iterates over these results spawning more <code>pgrep</code> calls, the process count explodes exponentially. This is <a href="https://github.com/Unitech/pm2/issues/3262">exactly what happened</a> in the PM2 project: &#8220;TreeKill fails to work and spawns hundreds of pgrep processes which typically make the system unusable&#8221;. Their fix was to always use native <code>pgrep</code> on macOS; exactly like in my case.</p><p>I removed all orphaned Intel Homebrew files, made sure I didn&#8217;t have <code>proctools</code> installed, and now <code>which pgrep</code> correctly returns <code>/usr/bin/pgrep</code>. I think this actually fixes the issue, since people on the <a href="https://github.com/anthropics/claude-code/issues/3989#issuecomment-3192830517">GitHub issue</a> said that <code>brew uninstall proctools</code> and using the system-installed <code>pgrep</code> fixed their problem.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/claude-code-process-exhaustion">https://shivankaul.com/blog/claude-code-process-exhaustion</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[2025 Wrapped]]></title><description><![CDATA[Reflections on another year.]]></description><link>https://shivankaul.substack.com/p/2025-wrapped</link><guid isPermaLink="false">https://shivankaul.substack.com/p/2025-wrapped</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Reflections on another year.</em></p><p>We had a suburban holiday season. The final days of 2025 slipped away in quiet, rain and rest. We didn&#8217;t travel anywhere, which was (finally) keeping in line with my everlasting resolution to travel less (<a href="https://shivankaul.com/blog/2024-wrapped#:~:text=resolving%20not%20to%20travel%20at%20all">unlike 2024</a>). I&#8217;m slightly worried that I&#8217;m turning into my Dad, who loves home with a burning passion, but I just hate the idea of flying and airports and flight delays and cramped seats (having said that, I am actually looking forward to traveling in 2026, more below).</p><p>So I spent the past few weeks sheltering from the <a href="https://www.sfchronicle.com/weather-forecast/article/bay-area-storm-rain-21264924.php">atmospheric river</a> in San Ramon with family, foraging for <a href="https://www.starbucks.com/menu/product/415/hot">eggnog lattes</a>, shopping in Walnut Creek, <a href="https://shivankaul.com/blog/tags/#claude-code">snapping at</a> Claude Code, inhaling copious amounts of <s>white rice</s> quinoa, and going for long walks afterwards to shake off the brainfog. I gotta say, I love <a href="https://shivankaul.com/blog/sf">dense cities</a> as much as your average SF YIMBY, but for nighttime walks, nothing beats a nice leafy American suburb. I&#8217;m still slightly scarred (only mentally, thankfully, not physically) from my <a href="https://x.com/shivan_kaul/status/1991614265850228993">drunk driver scare</a> last month.</p><p>We also re-watched some classics like <a href="https://en.wikipedia.org/wiki/Harry_Potter_and_the_Prisoner_of_Azkaban_(film)">Prisoner of Azkaban</a> and the <a href="https://en.wikipedia.org/wiki/Star_Wars_(film)">original Star Wars movie</a>. We had a brief shot at acting young on New Year&#8217;s Eve because we had bought tickets for a <a href="https://pier80nye.com/">Swedish House Mafia NYE concert</a> way back in November, but eventually the &#8220;show runs till 3 am&#8221; part sunk in and we decided to become inadvertent ticket scalpers and settle for a nice evening in with friends, playing <a href="https://kombio.cards/">Kombio</a> and finally figuring out how the <a href="https://www.jbl.com/PARTYBOX-ENCORE-ESSENTIAL-.html">karaoke machine</a> that my uncle gave us as a wedding present works.</p><h2>Wedding</h2><p>That&#8217;s right: we got married in 2025! It&#8217;s crazy to think of this time last year, when I was in India frantically calling wedding venues in Hyderabad and Bangalore (all of which was ultimately for naught, since we ended up getting married in California). We went from deciding to get married in late December to finalizing our venue in March, and then the wedding soon after in the summer. The first half of the year was entirely spent in wedding craziness.</p><p>Now that the wedding planning trauma has worn off a bit, I find myself looking back on our wedding with fondness. There&#8217;s probably no other time in your life that you get to gather all your loved ones in a single location and have a huge party. Our sangeet night was probably the happiest night of my life. The wedding itself also felt pretty meaningful: both the religious one, when the priests started chanting very intensely and we had our hands on the crowns of each other&#8217;s heads; it felt like we were in a sietch in Dune, participating in an ancient ritual (which I guess we were), and the official signing in front of a representative of the Californian government (which felt very legal and very solemn). I personally also think we both looked gorgeous.</p><p>Doing the main wedding in California meant that we got to control the wedding to a very large extent, which I&#8217;m grateful for. Our respective parents got to have their own wedding receptions in India when we visited North and South India in June/July. I highly recommend this distribution of wedding planning: minimize conflict by performing an <a href="https://www.syntaxia.com/post/conways-law">Inverse Conway Maneuver</a> and leaning into <a href="https://en.wikipedia.org/wiki/Conway's_law">Conway&#8217;s Law</a>. Weddings are emotional hotboxes anyway.</p><h3>Proposal</h3><p>I didn&#8217;t initially intend on proposing since we&#8217;ve been together for almost a decade and had begun planning the wedding together before the thought of a proposal even occurred to me, but my wife (my wife!) made it very clear that she wanted a ring and that it had to be presented beautifully and memorably. I dutifully planned a nice proposal weekend in <a href="https://en.wikipedia.org/wiki/Carmel-by-the-Sea,_California">Carmel-by-the-Sea</a>. Highlights:</p><ol><li><p>Gain: one beautiful diamond ring (check out <a href="https://frankdarling.com/">Frank Darling</a> if you&#8217;re in SF or NYC)</p></li><li><p>Gain: one tick bite (turns out you shouldn&#8217;t get down on one knee in a <a href="https://coastsideslacking.com/2017/06/28/visit-the-beach-and-bluffs-at-garrapata-with-a-name-like-tick-state-park-its-gotta-be-good/">park named after the Spanish word for &#8216;tick&#8217;</a>)</p></li><li><p>Loss: one purse, which was left behind after our celebratory dinner (I&#8217;m still sure the staff at <a href="https://www.antonandmichel.com/">Anton &amp; Michel restaurant</a> know more than they are letting on about that, but oh well)</p></li></ol><p>I had also arranged it so that she came back to the hotel room to find strewn rose petals, a bottle of champagne and chocolate truffles. This was accomplished with some advance planning and faking a last-minute bathroom emergency right before we headed out from the hotel to the dinner. Big thanks to the hotel staff at <a href="https://www.laplayahotel.com/">La Playa Hotel</a>, and big thanks to Instagram reel-spiration.</p><h2>Death</h2><p>I dealt with a lot of age-related things this year. Three grand-uncles passed away. One of them, to whom I was especially close and who was like a grandfather to me, passed away in the spring. I&#8217;m glad I decided to travel to India for his funeral, even though it was pretty close to our wedding. I think we all got a chance to remember him together, as a family.</p><h2>My birthday</h2><p>Birthdays always make me sad. My feelings about this are complex, but my wife (my wife!) surprised me this year by taking me on a last-minute trip to LA. I didn&#8217;t know where we were going until we got to the airport gate, which was pretty crazy. She also chose a couple of amazing restaurants (LA&#8217;s food scene remains superior), we stayed at a cute hotel and then at night we went to an Anoushka Shankar concert.</p><h2>Traveling</h2><p>I barely traveled this year, compared to previous years. We did a trip to India after our wedding where we traveled to the following places:</p><ol><li><p>Hyderabad</p></li><li><p>Barog</p></li><li><p>Kashmir</p></li><li><p>Goa</p></li></ol><p>Domestically, in the US, I traveled to:</p><ol><li><p>Roadtrip down the Pacific Coast Highway to Ventura and then back for Thanksgiving</p></li><li><p>Midwest for the first time: Minneapolis and Madison</p></li><li><p>Los Angeles for my birthday</p></li></ol><p>I&#8217;m actually looking forward to traveling more next year! I think I&#8217;m over my aversion to traveling, finally, after a big break in 2025.</p><h2>Fitness</h2><p>I had a couple of health scares right after coming back from India. Nothing too major, just means that I need to be a lot more careful about my diet and cardiovascular health. I also had my first brush with just how utterly broken and annoying the American healthcare system is.</p><p>The major change in my fitness routine compared to last year was that <a href="https://www.thecentersf.com/">The Center shut down</a> :( I&#8217;d written about it last year as <a href="https://shivankaul.com/blog/2024-wrapped#commons-and-center-">one of the highlights</a>. Why can&#8217;t we have nice things in the city? Our yoga teacher moved to teaching at <a href="https://lovestoryyoga.com/">Love Story Yoga</a> but unfortunately it&#8217;s hot yoga, which I despise. I don&#8217;t need helping sweating, thank you very much.</p><p>I continued playing frisbee, running occasionally, and lifting weights at home. I&#8217;ve realized that most of my walking happens while I&#8217;m traveling, which meant that I walked less in 2025 than in 2024 since I traveled far less. I did do more Walking Club events though, and finally did the <a href="https://crosstowntrail.org/">Crosstown Trail</a>.</p><p>I plan on walking a lot more in 2026, especially after meals.</p><h2>Tango</h2><p>No more tango for me, since it started conflicting with yoga once I started going to Love Story Yoga. I might bring this back in 2026, since the teachers changed.</p><h2>Concerts</h2><ul><li><p>Tame Impala: great laser show, I&#8217;m happy he is still going strong and is popular with the youngs.</p></li><li><p>Outside Lands: had a great time this year, especially with the <a href="https://www.wewriteaboutmusic.com/festivals/vampire-weekend-outside-lands-2025">double-set Vampire Weekend</a> bonanza. The trick is not to overpack your agenda and only attend the shows you really care about, even if that means you only attend a couple a day. It&#8217;s just so much more fun if you&#8217;re not hurrying all the time.</p></li><li><p>Arooj Aftab: this was our second time seeing her in concert. She was great as always, and got progressively drunker as the night went on.</p></li><li><p>Zayn: tickets were surprisingly cheap, and the crowd was 95% millennial women. Great show though; Zayn&#8217;s a fantastic singer.</p></li><li><p>Anoushka Shankar: my birthday gift concert in LA!</p></li></ul><h2>Kashmiri</h2><p>I learned a lot of Kashmiri this year primarily due to attending Koshur lessons every Sunday in the Fall. It&#8217;s also been nice to spend more time with Kashmiri people, which I&#8217;ve been doing a lot of. I am also signed up for Kashmiri Intermediate classes next year and I hope to continue getting better. I try exclusively talking to family in Kashmiri but it&#8217;s very hard, since I get frustrated with my lack of expressiveness.</p><h2>Work</h2><p>I was effectively acting-CISO for Brave while my manager (our actual CISO) was out on maternity leave. In general, I took on a lot more security work this year, in addition to privacy. One big theme was prompt injections in AI browsers. I wrote about our work <a href="https://shivankaul.com/blog/prompt-injections-in-agentic-browsers">here</a>.</p><h2>Rohan leaving</h2><p>My good friend Rohan left SF for NYC. I miss him a lot! There&#8217;s going to be <a href="https://shivankaul.com/blog/2024-wrapped#football">way less FIFA</a> in 2026.</p><h2>What I&#8217;m curious about next year</h2><ol><li><p>The big theme in 2026 will be immigration. Let&#8217;s see where I end up. I will know more by after the first quarter of the year.</p></li><li><p>I&#8217;m also looking forward to traveling more, if everything goes well with immigration. There&#8217;s a big Europe family trip coming up in the summer that I really don&#8217;t want to miss &#129310;</p></li><li><p>I want to be more intentional about getting better at Saturday frisbee. I plan on showing up 30 mins earlier and getting some throwing practice in.</p></li><li><p>More walk club, for sure.</p></li><li><p>Work should be interesting and change a lot this year. Stay tuned.</p></li><li><p>I&#8217;m looking forward to training for a half-marathon again, and in general running more.</p></li><li><p>Continue getting better at Kashmiri.</p></li></ol><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/2025-wrapped">https://shivankaul.com/blog/2025-wrapped</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Disable "How is Claude doing this session" feedback prompts in Claude Code]]></title><description><![CDATA[Turn off Claude Code&#8217;s feedback questions using an env var.]]></description><link>https://shivankaul.substack.com/p/disable-claude-code-feedback-prompts</link><guid isPermaLink="false">https://shivankaul.substack.com/p/disable-claude-code-feedback-prompts</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Turn off Claude Code&#8217;s feedback questions using an env var.</em></p><p>Claude Code sometimes pops a &#8220;How is Claude doing this session?&#8221; feedback survey mid-flow. There&#8217;s a simple way to disable it:</p><p>Set <code>CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1</code> in your environment.</p><p>The cleanest option is to put it in Claude Code&#8217;s <code>~/.claude/settings.json</code> under <code>env</code>:</p><pre><code>{
  "env": {
    "CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY": "1"
  }
}
</code></pre><p>Source: <a href="https://github.com/anthropics/claude-code/issues/8036#issuecomment-3499676586">this GitHub comment</a>.</p><p>UPDATE: you can add the following for even more Claude Code tweaking:</p><pre><code>export CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
export DISABLE_AUTOUPDATER=1
# Reduce splash screen size.
export IS_DEMO=1
</code></pre><p>Source: <a href="https://news.ycombinator.com/item?id=46545268">this Hacker News comment</a>.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/disable-claude-code-feedback-prompts">https://shivankaul.com/blog/disable-claude-code-feedback-prompts</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Downloading a browser video stream into an MP4]]></title><description><![CDATA[Turning an HLS stream into an MP4 using browser tools and ffmpeg.]]></description><link>https://shivankaul.substack.com/p/hls-to-mp4</link><guid isPermaLink="false">https://shivankaul.substack.com/p/hls-to-mp4</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/782cad17-7dce-4583-8708-36c6caafcfa5_858x430.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Turning an HLS stream into an MP4 using browser tools and ffmpeg.</em></p><p>I recently wanted to download a wedding video from a media-hosting platform that had no download button. If my browser could play it, the video data was clearly being streamed somewhere; how hard could it be to capture and save it as an MP4?</p><p>Turns out: not very hard. With <code>chrome://media-internals</code>, DevTools and an (AI-generated) <a href="https://en.wikipedia.org/wiki/FFmpeg">ffmpeg</a> command, I went from a streaming <a href="https://en.wikipedia.org/wiki/HTTP_Live_Streaming">HLS</a> video to a local MP4 file in about 15 minutes.</p><h2>Step 1: Is this thing encrypted?</h2><p>I wanted to know whether the browser was dealing with encrypted or <a href="https://en.wikipedia.org/wiki/Digital_rights_management">DRM</a>, which would complicate matters quite a bit. On Chromium-based browsers you get a useful tool for that: <code>chrome://media-internals</code>.</p><p>I opened that page, then played the video in another tab. A new media entry appeared. For <code>kVideoTracks</code>, the value was:</p><pre><code>[
  {
    ...
    "codec": "h264",
    "coded size": "1920x1080",
    ...
    "encryption scheme": "Unencrypted",
    ...
  }
]
</code></pre><p>and for <code>kAudioTracks</code>:</p><pre><code>[
  {
    "bytes per channel": 2,
    "bytes per frame": 4,
    "channel layout": "STEREO",
    "channels": 2,
    "codec": "aac",
    ...
    "encryption scheme": "Unencrypted",
    ...
  }
]
</code></pre><p>In other words:</p><ul><li><p>Video codec: <code>h264</code> (High profile), 1920&#215;1080.</p></li><li><p>Audio codec: AAC stereo.</p></li><li><p><strong>Encryption scheme: <code>Unencrypted</code>.</strong></p></li></ul><p>So no encryption! Also, no <a href="https://en.wikipedia.org/wiki/Encrypted_Media_Extensions#Content_Decryption_Modules">Content Decryption Modules</a> to worry about.</p><p>In contrast, if I play something on netflix.com (which uses <a href="https://en.wikipedia.org/wiki/Widevine#Acquisition_by_Google_(2010%E2%80%93present)">Widevine</a> for DRM), the encryption is listed as <code>"encryption scheme": "CBCS"</code> and <code>kIsCdmAttached: true</code> in <code>chrome://media-internals</code>.</p><h2>Step 2: Find the stream URL in DevTools</h2><p>Next task was to get the master manifest file. I went to the tab playing the video and opened up DevTools &#8594; Network.</p><p>I started playing the video and filtered the requests by <code>.m3u8</code>. This was a guess, though a likely one, since most Web video content uses Apple&#8217;s <a href="https://en.wikipedia.org/wiki/HTTP_Live_Streaming">HLS</a> protocol for adaptive video streaming. I was looking for a <a href="https://docs.aws.amazon.com/mediatailor/latest/ug/hls-playlist-types.html">master manifest file</a>: a top-level manifest that lists all available quality options for a video. On playing the video, one URL popped up that looked like a master manifest file:</p><pre><code>https://media.website/videos/o.m3u8
</code></pre><p>Clicking on the master manifest and looking at the response showed:</p><pre><code>#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="program_audio_0",LANGUAGE="eng",NAME="Alternate Audio",AUTOSELECT=YES,DEFAULT=YES,CHANNELS="2",URI="o_2ch-160.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=6599291,AVERAGE-BANDWIDTH=4657683,VIDEO-RANGE=SDR,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=23.976,AUDIO="program_audio_0"
o_1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1694319,AVERAGE-BANDWIDTH=1347730,VIDEO-RANGE=SDR,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=768x432,FRAME-RATE=23.976,AUDIO="program_audio_0"
o_432p.m3u8
</code></pre><p>This master manifest essentially says: <em>&#8220;Here are two quality options you can choose from: 1080p or 432p. Both use the same audio track. Pick whichever fits your bandwidth.&#8221;</em></p><p>It doesn&#8217;t contain any media segments itself.</p><h2>Step 3: Piping the master manifest into ffmpeg and downloading</h2><p>Amazingly, the URL for the master manifest is all that <code>ffmpeg</code> needs! It can figure out the rest (downloading the manifest, reading it, picking a video quality variant, fetching the relevant playlists, downloading the media segments, remuxing) once it has the master manifest file &#129327;</p><p>An initial naive effort was just taking the request URL for the master playlist and passing that to <code>ffmpeg</code>.</p><pre><code>ffmpeg -i "https://media.website/videos/o.m3u8" -c copy video.mp4
</code></pre><p>Note: The <code>-c copy</code> tells <code>ffmpeg</code> to not re-encode the audio/video samples and instead simply <a href="https://docs.videolan.me/vlc-user/desktop/3.0/en/advanced/streaming/remuxing.html">remux</a> the H.264 + AAC streams into MP4, so it saves us a lot of time and processing. I&#8217;m actually not sure why it&#8217;s not the default; it might be because <code>ffmpeg</code> is primarily a transcoder, though I&#8217;m not well-versed enough with <code>ffmpeg</code> to say more here. Update: this <a href="https://gist.github.com/arch1t3cht/b5b9552633567fa7658deee5aec60453/">quickstart guide</a> is useful if you&#8217;re looking to getting into video editing.</p><p>Unfortunately, the <code>ffmpeg</code> command above didn&#8217;t actually work; the server blocked it as &#8220;403 Forbidden&#8221;. That makes sense since I had to login on my browser to play the video file. Fortunately, pretending to be the browser is pretty easy. DevTools has a handy <code>Copy as cURL</code> option for network requests (just right-click the request and go to <code>Copy &gt;</code>). This gives you all the cookies and headers sent by the browser for the network request.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2za5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2za5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png 424w, https://substackcdn.com/image/fetch/$s_!2za5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png 848w, https://substackcdn.com/image/fetch/$s_!2za5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png 1272w, https://substackcdn.com/image/fetch/$s_!2za5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2za5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Screenshot of DevTools \&quot;copy as cURL\&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Screenshot of DevTools &quot;copy as cURL&quot;" title="Screenshot of DevTools &quot;copy as cURL&quot;" srcset="https://substackcdn.com/image/fetch/$s_!2za5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png 424w, https://substackcdn.com/image/fetch/$s_!2za5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png 848w, https://substackcdn.com/image/fetch/$s_!2za5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png 1272w, https://substackcdn.com/image/fetch/$s_!2za5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2014b1c5-1fb2-421e-ab9e-2c905a66b2d3_858x430.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p>I could have spent some time massaging the cURL command into what is accepted by <code>ffmpeg</code> but I was too lazy so I just asked ChatGPT to do it for me and it one-shotted converting cURL HTTP cookies into <code>ffmpeg</code>&#8217;s headers format:</p><pre><code>ffmpeg 
  -headers "Cookie: CloudFront-Key-Pair-Id=abc; CloudFront-Policy=def; CloudFront-Signature=xyz" 
  -i "https://media.website/videos/o.m3u8" 
  -c copy test.mp4
</code></pre><p>And that&#8217;s it. <code>ffmpeg</code> got to work and figured it all out for me.</p><p>End result: a portable MP4 video file that plays everywhere! This was ~simple because:</p><ol><li><p><code>ffmpeg</code> as a tool is super useful (if a bit ornery) if you&#8217;re doing anything related to audio/video.</p></li><li><p>Browser developer tooling is extremely good and worth familiarizing yourself with.</p></li><li><p>No DRM or encryption or complicated authentication; this wouldn&#8217;t work for Netflix/Disney+ etc.</p></li></ol><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/hls-to-mp4">https://shivankaul.com/blog/hls-to-mp4</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Comet sends all your URLs to Perplexity servers (and there's no way to stop it)]]></title><description><![CDATA[There's no way to disable Comet leaking your entire browsing history to their backend.]]></description><link>https://shivankaul.substack.com/p/comet-privacy</link><guid isPermaLink="false">https://shivankaul.substack.com/p/comet-privacy</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Sun, 19 Oct 2025 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/19fa0ed8-94b0-4048-9ccc-c972bc7db6c3_1746x478.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>There's no way to disable Comet leaking your entire browsing history to their backend.</em></p><p>Perplexity Comet leaks your entire browsing history to their servers, and there&#8217;s no way to turn it off.</p><blockquote><p>Update: as of June 27, 2026 on version 149.0.7827.197 this still reproduces.</p></blockquote><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y2wG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y2wG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png 424w, https://substackcdn.com/image/fetch/$s_!Y2wG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png 848w, https://substackcdn.com/image/fetch/$s_!Y2wG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png 1272w, https://substackcdn.com/image/fetch/$s_!Y2wG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y2wG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Screenshot of Proxyman showing leaked URL&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Screenshot of Proxyman showing leaked URL" title="Screenshot of Proxyman showing leaked URL" srcset="https://substackcdn.com/image/fetch/$s_!Y2wG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png 424w, https://substackcdn.com/image/fetch/$s_!Y2wG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png 848w, https://substackcdn.com/image/fetch/$s_!Y2wG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png 1272w, https://substackcdn.com/image/fetch/$s_!Y2wG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9309281-e249-4e8e-bac9-cef66c4dec17_1746x478.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>Comet&#8217;s security and privacy posture is terrible. Much electronic ink has been spilled over <a href="https://shivankaul.com/blog/prompt-injections-in-agentic-browsers">Comet&#8217;s security holes</a>, including <a href="https://brave.com/series/security-privacy-in-agentic-browsing/">a lot by me</a>, so I won&#8217;t go into that too much here except to repeat that prompt injection attacks are essentially <em>trivial</em> to do. Until recently, you could ask Comet to summarize a Reddit post for you, and <a href="https://brave.com/blog/comet-prompt-injection/">it could lead to a complete account take over</a>. Maybe one day we&#8217;ll come up with better sandboxing for agentic browsing, but until then, you SHOULD NOT be using agentic browsing in <em>any</em> browser where you are logged into your banking or other sensitive accounts. If you&#8217;re using the ChatGPT Atlas browser, use <a href="https://help.openai.com/en/articles/12628199-using-ask-chatgpt-sidebar-and-chatgpt-agent-on-atlas#h_5aca3ec17e">logged out mode</a> (and kudos to them for offering that UX affordance).</p><h2>Leaking URLs to the backend</h2><p>I dug through and turned off <em>every single toggle</em> in Comet browser&#8217;s Privacy and Security settings and found that Comet <em>still leaks every URL you visit</em> to their backend. I even turned off Comet Assistant, with no luck.</p><p>This is me simply navigating to my website in Comet: no prompting via AI, no asking questions, simply opening a URL.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aZL9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aZL9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png 424w, https://substackcdn.com/image/fetch/$s_!aZL9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png 848w, https://substackcdn.com/image/fetch/$s_!aZL9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png 1272w, https://substackcdn.com/image/fetch/$s_!aZL9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aZL9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Screenshot of Proxyman showing leaked URL&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Screenshot of Proxyman showing leaked URL" title="Screenshot of Proxyman showing leaked URL" srcset="https://substackcdn.com/image/fetch/$s_!aZL9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png 424w, https://substackcdn.com/image/fetch/$s_!aZL9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png 848w, https://substackcdn.com/image/fetch/$s_!aZL9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png 1272w, https://substackcdn.com/image/fetch/$s_!aZL9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dcd6b67-74a1-4d70-9996-ebdb503dc058_1746x478.png 1456w" sizes="100vw"></picture><div></div></div></a><h3>Screen recording</h3><p>I made a screen recording to show how Comet leaks the URL on navigation to their backend. To be comprehensive, I did the following steps as setup:</p><h4>Test setup</h4><ol><li><p>Check that the tool I&#8217;m using for inspecting HTTPS traffic (<a href="https://proxyman.com/">Proxyman</a>) doesn&#8217;t have any existing recordings for my website (shivankaul.com) in Comet.</p></li><li><p>Ensure that <code>comet://settings/privacy</code> and <code>comet://settings/security</code> have reporting toggles turned off. This includes <code>Improve search suggestions</code> and <code>Improve search results with external search engines</code>.</p></li><li><p>Clear all browsing data, to not bias results.</p></li><li><p>Check that the Comet version from <code>comet://version</code> is latest (at time of initial writing, <code>141.0.7390.55</code> on macOS arm64. Also reproduced on <code>149.0.7827.197</code>).</p></li></ol><h4>Test results</h4><p>Then for my actual test, I did:</p><ol><li><p>Open a new tab and manually type in <code>shivankaul.com</code> in Comet and press Enter.</p></li><li><p>Go to Proxyman</p></li><li><p>See network calls to <code>https://www.perplexity.ai/rest/autosuggest/list-autosuggest?version=2.18&amp;source=default</code> with a request body that contains <code>"source_tab_url": "https://shivankaul.com/"</code>.</p></li></ol><h2>A positive note: Comet does adblocking!</h2><p>It was cool to see that Comet uses Brave&#8217;s open-source <a href="https://github.com/brave/adblock-rust">adblock-rust</a> engine and Brave&#8217;s <a href="https://github.com/brave/adblock-lists/">filter lists</a> to power their adblocking (though it took a few rounds of back-and-forth with their legal counsel to convince them to attribute the project correctly as required under MPL-2.0).</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!828-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!828-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png 424w, https://substackcdn.com/image/fetch/$s_!828-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png 848w, https://substackcdn.com/image/fetch/$s_!828-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png 1272w, https://substackcdn.com/image/fetch/$s_!828-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!828-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Screenshot of Comet's about page showing credits to adblock-rust&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Screenshot of Comet's about page showing credits to adblock-rust" title="Screenshot of Comet's about page showing credits to adblock-rust" srcset="https://substackcdn.com/image/fetch/$s_!828-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png 424w, https://substackcdn.com/image/fetch/$s_!828-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png 848w, https://substackcdn.com/image/fetch/$s_!828-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png 1272w, https://substackcdn.com/image/fetch/$s_!828-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5a53b9-24bc-46f6-9c6c-bbdd1b4fae75_1440x354.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!82Ml!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!82Ml!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png 424w, https://substackcdn.com/image/fetch/$s_!82Ml!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png 848w, https://substackcdn.com/image/fetch/$s_!82Ml!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png 1272w, https://substackcdn.com/image/fetch/$s_!82Ml!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!82Ml!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Screenshot of Comet's credit page showing Brave's list&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Screenshot of Comet's credit page showing Brave's list" title="Screenshot of Comet's credit page showing Brave's list" srcset="https://substackcdn.com/image/fetch/$s_!82Ml!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png 424w, https://substackcdn.com/image/fetch/$s_!82Ml!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png 848w, https://substackcdn.com/image/fetch/$s_!82Ml!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png 1272w, https://substackcdn.com/image/fetch/$s_!82Ml!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951fe278-9fb7-4346-965c-ea1d23a2c2ac_2064x934.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p>I can think of two reasons for Comet shipping adblocking:</p><ol><li><p>Adblocking is a table-stakes feature for all browsers, especially newbie ones trying to gain any market share at all.</p></li><li><p>Agentic browsing benefits from blocking unhelpful cruft on websites. Fewer &#8220;subscribe to my newsletter!!!&#8221; popups means fewer tokens used by your agent trying to dismiss them, and less likely it&#8217;ll get confused trying to find Thanksgiving recipes.</p></li></ol><p>I&#8217;m guessing it&#8217;s a combination of both.</p><p>Sounds like ChatGPT Atlas also plans to ship <a href="https://x.com/adamhfry/status/1981206776503517229">opt-in adblocking soon</a>. Third-party adblocking is great for security and privacy, so I&#8217;m excited to see more browsers offering it.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/comet-privacy">https://shivankaul.com/blog/comet-privacy</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[How to fix your terminal prepending 00~ when pasting in anything]]></title><description><![CDATA[Turning off Paste Bracketing in iTerm2.]]></description><link>https://shivankaul.substack.com/p/paste-bracketing-iterm2</link><guid isPermaLink="false">https://shivankaul.substack.com/p/paste-bracketing-iterm2</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8979436e-9c23-4177-b4ab-5a19811eaf3a_705x108.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Turning off Paste Bracketing in iTerm2. Update: looks like this was caused by Claude Code.</em></p><h3>Here because of Claude Code?</h3><p>If you&#8217;re here because of Claude Code messing up paste bracketing in your terminal, try putting in the following in your <code>.bashrc</code> or <code>.bash_profile</code>:</p><pre><code>claude() {
    command claude "$@"
    printf '\e[?2004l'
}
</code></pre><p>(credit: <a href="https://github.com/anthropics/claude-code/issues/3134#issuecomment-3179017458">this GitHub issue comment</a>)</p><p>I actually <a href="https://shivankaul.com/blog/claude-code-process-exhaustion">ended up writing a wrapper script</a> for Claude Code where I deal with this and other annoying bugs, and I folded this fix into that wrapper.</p><h2>Paste bracketing</h2><p>If pasting in iTerm2 or similar terminal emulator prints <code>00~</code> before your text, your terminal is leaking <strong>bracketed-paste markers</strong> because the shell can&#8217;t handle them. This typically happens on iTerm2 if an SSH session ended weirdly or your editor crashed or if your Bash is very old (or you exited <a href="https://github.com/anthropics/claude-code/issues/3134">Claude Code</a>). See <a href="https://iterm2.com/paste_bracketing">iTerm2&#8217;s help article</a> about paste bracketing.</p><p>My terminal was wrapping a paste with <code>ESC [ 200 ~</code> &#8230; <code>ESC [ 201 ~</code>, but my old macOS Bash (3.2 with old Readline) didn&#8217;t recognize that, so part of the marker showed up as literal <code>00~</code>. The fix: using a shell/readline that supports bracketed paste, or disable the feature in the terminal emulator.</p><h3>Symptom</h3><ul><li><p>Pasting at a plain Bash prompt prints <code>00~</code> before the pasted text.</p></li><li><p>You can check this by doing:</p></li></ul><pre><code>cat -v
</code></pre><p>Paste anything. If you see <code>^[[200~ ... ^[[201~</code>, bracketed paste is active. <code>Ctrl+C</code> to exit.</p><h3>Cause</h3><ul><li><p>iTerm2 only sends those markers when an app or shell enables bracketed paste.</p></li><li><p>Bash &lt;= 3.2 doesn&#8217;t parse them so some of the sequence (often <code>00~</code>) prints.</p></li><li><p>It can appear &#8220;random&#8221; because a tab can be left in that mode after a program exits or a session dies; new tabs are clean.</p></li></ul><h3>Fixes</h3><h4>1) Just upgrade Bash</h4><p>Using <code>brew</code> and on macOS:</p><pre><code>brew install bash
echo "/opt/homebrew/bin/bash" | sudo tee -a /etc/shells
chsh -s /opt/homebrew/bin/bash
</code></pre><p>Open a new terminal window.</p><p>Verify:</p><pre><code>echo $SHELL        # /opt/homebrew/bin/bash
bash --version     # 5.x
</code></pre><blockquote><p>Note: Intel Macs may use <code>/usr/local/bin/bash</code> instead of <code>/opt/homebrew/bin/bash</code>.</p></blockquote><h4>2) Turn it off in iTerm2</h4><p>iTerm2 might even prompt you:</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Yja!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Yja!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png 424w, https://substackcdn.com/image/fetch/$s_!8Yja!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png 848w, https://substackcdn.com/image/fetch/$s_!8Yja!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png 1272w, https://substackcdn.com/image/fetch/$s_!8Yja!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Yja!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;iTerm2 warning about paste bracketing&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="iTerm2 warning about paste bracketing" title="iTerm2 warning about paste bracketing" srcset="https://substackcdn.com/image/fetch/$s_!8Yja!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png 424w, https://substackcdn.com/image/fetch/$s_!8Yja!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png 848w, https://substackcdn.com/image/fetch/$s_!8Yja!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png 1272w, https://substackcdn.com/image/fetch/$s_!8Yja!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b1827f3-98a0-4d00-9408-8aa5deb5cf02_705x108.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p>You can change preferences for iTerm2: Preferences &#8594; Advanced &#8594; search &#8220;bracketed&#8221; &#8594; tweak paste bracketing.</p><h3>Verify it&#8217;s gone</h3><pre><code>cat -v
</code></pre><p>Paste again. You should <em>not</em> see <code>^[[200~ ... ^[[201~</code>.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/paste-bracketing-iterm2">https://shivankaul.com/blog/paste-bracketing-iterm2</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Movie reviews: In the mood before sunrise]]></title><description><![CDATA[Yearn-maxxing in Before Sunrise and In The Mood for Love.]]></description><link>https://shivankaul.substack.com/p/in-the-mood-before-sunrise</link><guid isPermaLink="false">https://shivankaul.substack.com/p/in-the-mood-before-sunrise</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Sun, 12 Oct 2025 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Yearn-maxxing in Before Sunrise and In The Mood for Love.</em></p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WAeo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WAeo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WAeo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WAeo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WAeo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WAeo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Theatrical poster for Before Sunrise&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Theatrical poster for Before Sunrise" title="Theatrical poster for Before Sunrise" srcset="https://substackcdn.com/image/fetch/$s_!WAeo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WAeo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WAeo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WAeo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b054eb-f91e-46da-b992-4082574e2e0f_248x369.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ge0g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ge0g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ge0g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ge0g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ge0g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ge0g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Theatrical poster for In the Mood for Love&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Theatrical poster for In the Mood for Love" title="Theatrical poster for In the Mood for Love" srcset="https://substackcdn.com/image/fetch/$s_!Ge0g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ge0g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ge0g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ge0g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffe0746-ca7a-4d2a-a5cf-b5b2da2ea993_265x376.jpeg 1456w" sizes="100vw"></picture><div></div></div></a><p><em>Before Sunrise</em> and <em>In the Mood for Love</em>.</p><p>I recently watched <em><a href="https://en.wikipedia.org/wiki/Before_Sunrise">Before Sunrise</a></em> and <em><a href="https://en.wikipedia.org/wiki/In_the_Mood_for_Love">In the Mood for Love</a></em> in quick succession, the latter for the first time. Having seen <em>In the Mood for Love</em> just the night before and finding Mrs. Chan&#8217;s character fascinating, I was thinking a lot about Celine while rewatching <em>Before Sunrise</em>.</p><p>Celine and Mrs. Chan seemed to be caught between playing a societal script and a desire to romanticize their lives and exert control. Mrs. Chan wears beautiful dresses just to step outside for noodles; self-assertion in the face of neighborly (and broadly, societal) surveillance. She feels powerless to do anything about her husband cheating on her, so she walks (aesthetically, in slow-motion), dressed in armor-like <a href="https://en.wikipedia.org/wiki/Qipao">cheongsams</a>, through confining corridors. Celine decides she likes Jesse the moment she sees him and requires little convincing to go on a Viennese mini-adventure. She jokes that she would have done the same with any man who asked. She&#8217;s trying to get off the train, both literally and metaphorically; to inject agency and romance into her comfortable-but-boring life (a frustration she brings up repeatedly), while still rejecting the &#8220;French girl summer fling&#8221; trope. When parting with Jesse, even though she is distraught at the prospect of never seeing him again, she initially proposes meeting only after 5 (!) years, resisting the role of a besotted young woman to the very last second. The most overt way she expresses her attraction to Jesse is a pretend phone conversation, which is mirrored in the husband-wife role-play between Mrs. Chan and Mr. Chow in <em>In The Mood for Love</em>. Both Celine and Mrs. Chan are self-mythologizing, managing scripts, in rebellion against their roles through acts small and big: Mrs. Chan against a culture that says that she shouldn&#8217;t be out too late and should be able to keep her husband around and should willingly bow down to fated unhappiness, and Celine against male fantasies and an upbringing that stresses the overriding importance of self-reliance and independence for women. This recurrent, conflicting desire for narrative control is what makes both women (and by extension, both movies) interesting.</p><p>The men, on the other hand, are slightly boring and serve largely as foils. Jesse in <em>Before Sunrise</em> especially just seems like an annoying 23-year-old American kid. I suspect he will be more annoying on every subsequent rewatch, as I drift further and further away from being a 23-year-old. Nobody likes you when you&#8217;re 23 (except maybe other 23-year-olds). I liked his character a lot more in the sequels, in which he&#8217;s significantly older.</p><p>Overall, both films are beautiful and deserve watching (and rewatching; I&#8217;ve seen the <em><a href="https://en.wikipedia.org/wiki/Before_trilogy">Before</a></em><a href="https://en.wikipedia.org/wiki/Before_trilogy"> trilogy</a> thrice now, once for every decade of my life). Watch them if you&#8217;re into character-heavy studies of men and women winding into and out of vulnerability through lots and lots of conversation.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/in-the-mood-before-sunrise">https://shivankaul.com/blog/in-the-mood-before-sunrise</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Beyond cookies: browser fingerprinting in 2025 (Part 2)]]></title><description><![CDATA[How browsers protect against fingerprinting and how users can protect themselves.]]></description><link>https://shivankaul.substack.com/p/beyond-cookies-browser-fingerprinting-in-2025-2</link><guid isPermaLink="false">https://shivankaul.substack.com/p/beyond-cookies-browser-fingerprinting-in-2025-2</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bxJ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>How browsers protect against fingerprinting and how users can protect themselves.</em></p><p><em>This is part two of a blog post summarizing the state of browser fingerprinting in 2025. You can read <a href="/blog/beyond-cookies-browser-fingerprinting-in-2025-1">part one here</a>), where I went over the what, who, why, and how of browser fingerprinting. In this post, we&#8217;ll discuss how browsers protect against fingerprinting, and how you can protect yourself.</em></p><h2>Protecting against fingerprinting</h2><p>Trackers doing browser fingerprinting are essentially trying to divide users into buckets that are:</p><ol><li><p><strong>diverse</strong>. If every user is in the same bucket (&#8220;uses an iPhone&#8221;), you haven&#8217;t learned much about the user.</p></li><li><p><strong>stable</strong>. If the user changes their fingerprint every time they visit your site, it&#8217;s not much of a fingerprint.</p></li></ol><p>Browsers apply fingerprinting protections that are aimed at defeating this bucketing.</p><h3>Consider the butterfly</h3><p>Let&#8217;s imagine you&#8217;re a beautiful and unique butterfly, trying to avoid capture and identification by malicious lepidopterists who are looking for you (apologies in advance to worthy lepidopterists). You have two main strategies to avoid a future that involves being pinned up on a wall:</p><ol><li><p>hide in a crowd</p></li><li><p>fly randomly</p></li></ol><p>This is much like being a user on the Web, where you&#8217;re trying to avoid being fingerprinted by trackers.</p><h4>Hiding in a crowd (avoid diverse buckets)</h4><p>As a butterfly, you can evade capture by hiding your unique beauty in a crowd of other butterflies. The goal of &#8220;hiding in a crowd&#8221; (or herd immunity) is to make every browser look the same. This is the strategy used by <a href="https://tb-manual.torproject.org/anti-fingerprinting/">Tor Browser</a> and <a href="https://mullvad.net/en/browser/mullvad-browser">Mullvad</a>. The way this works is that you remove APIs and capabilities that reveal a lot of information about the browser. Unfortunately, this often means that powerful APIs end up getting removed from the Tor Browser, which limits its widespread use. This might be fine for Tor Browser, which targets users with a higher-than-usual risk profile who typically care more about privacy than usability. But mainstream browsers with hundreds of millions of (mostly non-technical) users cannot afford to remove useful Web APIs. Having said that, major browsers frequently do remove APIs that are low-utility and high-fingerprintability such as the Topics API being removed by <a href="https://brave.com/web-standards-at-brave/7-googles-topics-api/">Brave</a>, <a href="https://github.com/WebKit/standards-positions/issues/111#issuecomment-1359609317">Safari</a> and <a href="https://mozilla.github.io/ppa-docs/topics.pdf">Firefox</a>.</p><p>It&#8217;s worth noting that browsers that always run on similar hardware and software, like Apple&#8217;s Safari, benefit from the lack of diversity because individual users stand out less.</p><h4>Fly randomly (avoid stable buckets)</h4><p>As a butterfly, instead of trying to be the same as everyone else, you can zig-zag across the sky, evading capture. You can try to be as different as possible, every time.</p><p>This is Brave browser&#8217;s approach for many Web APIs: randomize the fingerprint per-session and per-site. This effectively means that your fingerprint will be unique for a website but different across every website (which defeats cross-site tracking), and will reset after every browsing session (which defeats cross-session tracking), similar to how cookies and state is cleared after a Private browsing session.</p><p><a href="https://webkit.org/blog/14205/news-from-wwdc23-webkit-features-in-safari-17-beta/#safari-private-browsing">Safari 17</a> introduced advanced fingerprinting protection (though only in Private Browsing mode) largely modeled on Brave&#8217;s fingerprinting approach of adding random noise to API output. Encouragingly, <a href="https://9to5mac.com/2025/07/29/with-ios-26-safari-will-counter-one-of-the-webs-most-invasive-tracking-methods/">Safari 26</a> will enable advanced fingerprinting protection by default.</p><p>When this strategy of randomizing Web APIs works, you get both powerful Web APIs <em>and</em> privacy. In practice, this is very tricky to get right and can lead to web dev frustration and website breakage, when the injected randomness interferes with website functionality. <a href="https://github.com/brave/brave-core/pull/27383">Brave had to change their screen fingerprinting protection</a> to report &#8220;one-of-few&#8221; outputs so as to place users in large buckets instead of purely randomizing.</p><h4>Bonus: block known trackers</h4><p>As a butterfly, you can also start a list containing photographs of lepidopterists so that you can distinguish them from harmless human friends, and you can share that with your butterfly friends, so you all know to stay away from the bad guys. This &#8220;crowdsourced blocklist of known bad actors&#8221; approach is surprisingly effective in Web privacy. You might (as a concerned butterfly) ask: What if a blocked lepidopterist just puts on a disguise? What if a new lepidopterist appears? And why are we still continuing with this butterfly analogy when it has clearly broken down several paragraphs ago and was probably broken to begin with? These are all valid questions.</p><p>A blocklist to block advertisers and trackers <a href="https://medium.com/@jyasskin/why-do-url-based-ad-blockers-work-3a13b08a1167">might not seem</a> like a robust approach. But the truth is that most tracking on the Web is done by a few well-known companies, and if you block them, you protect yourself against most of the harms. Also, community lists are surprisingly well-maintained, with new rules being added (to counter new tracking scripts and requests) and removed (to counter website breakage) on the order of minutes.</p><p>Every browser uses blocklists in some way to block content: Firefox&#8217;s <a href="https://support.mozilla.org/en-US/kb/enhanced-tracking-protection-firefox-desktop#w_what-enhanced-tracking-protection-blocks">Enhanced Tracking Protection</a> based on <a href="https://disconnect.me/trackerprotection">Disconnect</a> and Brave&#8217;s ad &amp; tracker blocking based on <a href="https://github.com/brave/adblock-lists">various community-maintained lists</a> are good examples of this. Safari <a href="https://webkit.org/blog/15697/private-browsing-2-0/">blocks known trackers in Private Browsing mode</a> using a combination of <a href="https://github.com/easylist/easylist/tree/master/easyprivacy">EasyPrivacy</a> and DuckDuckGo&#8217;s <a href="https://github.com/duckduckgo/tracker-radar">Tracker Radar</a>. Chrome interestingly also <a href="https://source.chromium.org/chromium/chromium/src/+/main:components/subresource_filter/">uses this strategy</a> to block <a href="https://www.betterads.org/standards/">&#8220;bad ads&#8221;</a> using a <a href="https://source.chromium.org/chromium/chromium/src/+/main:components/subresource_filter/FILTER_LIST_GENERATION.md">modified form of EasyList</a>.</p><h3>How do I protect myself?</h3><h4>Turn fingerprinting protections on!</h4><p>In practice, browsers apply a mix of the above strategies, depending on the Web API or source of variance they&#8217;re trying to minimize. However, not every browser applies fingerprinting protection by default:</p><h5>Safari</h5><p>Enable Settings &#8594; Advanced &#8594; &#8220;Use advanced tracking and fingerprinting protection.&#8221; &#8594; &#8220;in all browsing&#8221;. <br>The current default is &#8220;in Private Browsing&#8221;, though this will change in Safari 26.</p><h5>Firefox</h5><p>Turn on <strong>Resist Fingerprinting</strong> in about:config. See <a href="https://support.mozilla.org/en-US/kb/resist-fingerprinting">instructions</a>.</p><h5>Brave</h5><p>Fingerprinting protections applied <a href="https://github.com/brave/brave-browser/wiki/Fingerprinting-Protections">automatically and by default</a>.</p><h5>Chrome</h5><p>Chrome doesn&#8217;t currently do much against fingerprinters. They&#8217;re <a href="https://github.com/explainers-by-googlers/script-blocking?tab=readme-ov-file">exploring blocking known third-party fingerprinting scripts</a> in Incognito Mode.</p><h4>Block trackers</h4><p>If you don&#8217;t use a browser with an in-built ad and tracker blocker like Brave, use a good adblocking extension like <a href="https://ublockorigin.com/">uBlock Origin</a>. On Chromium-based browsers, unfortunately, the use of adblocking extensions is becoming <a href="https://github.com/uBlockOrigin/uBOL-home/wiki/Frequently-asked-questions-%28FAQ%29#filtering-capabilities-which-cant-be-ported-to-mv3">increasingly harder</a> given Google&#8217;s move to <a href="https://www.eff.org/deeplinks/2021/12/googles-manifest-v3-still-hurts-privacy-security-innovation">phase out Manifest V2 extensions</a>.</p><h4>Hide your IP address</h4><p>IP addresses are stable network-level identifiers that browsers need to actually connect to websites. This is unfortunate, because it means that trackers can simply fingerprint your IP address and there&#8217;s not much browsers can do about it. IP address hiding operates on the principle of not connecting directly to the website and instead routing your connection through an intermediary server. The website then sees the intermediary&#8217;s IP address, not yours. On the other hand, the intermediary server now knows both your IP address and the website you&#8217;re visiting. So what do you do? You add more intermediaries! All of this raises sticky questions about who you trust on the Internet, and you can read more about this topic in an essay I wrote (<a href="https://shivankaul.com/blog/trust-issues">available here</a>) for the book <a href="https://meatspacepress.com/">&#8220;Eaten by the Internet&#8221;</a>.</p><p>The more the number of intermediaries or hops between you and the website, the better the privacy, but worse the network speed. You have some options to hide your IP address:</p><ol><li><p><strong>A trustworthy VPN (1 hop)</strong>: <a href="https://www.consumerreports.org/vpn-services/vpn-testing-poor-privacy-security-hyperbolic-claims-a1103787639/">most VPNs are privacy nightmares</a>. The Open Technology Fund (OTF) has <a href="https://www.opentech.fund/news/who-owns-operates-and-develops-your-vpn-matters-an-analysis-of-transparency-vs-anonymity-in-the-vpn-ecosystem-and-implications-for-users/">sponsored great research</a> into shady VPN practices (disclosure: I&#8217;m on the Advisory Council for OTF). Some good ones are bundled into the browser such as <a href="https://www.mozilla.org/en-US/products/vpn/">Mozilla VPN</a>, <a href="https://brave.com/firewall-vpn/">Brave VPN</a> or <a href="https://mullvad.net/">Mullvad</a>. Since it&#8217;s just one hop, the VPN knows your IP address <em>and</em> which websites you&#8217;re visiting, so you better trust them to not sell your browsing history to advertisers. Given that it&#8217;s also expensive to operate a VPN, <a href="https://www.opentech.fund/news/who-owns-operates-and-develops-your-vpn-matters-an-analysis-of-transparency-vs-anonymity-in-the-vpn-ecosystem-and-implications-for-users/">you should never trust free VPNs</a>.</p></li><li><p><strong>Private Relay (2 hops)</strong>: Apple&#8217;s 2-hop <a href="https://support.apple.com/en-us/102602">iCloud Private Relay</a> hides your IP address from both Apple and the website, but requires an iCloud+ subscription and an Apple device.</p></li><li><p><strong>Tor (3 or more hops)</strong>: for the highest privacy guarantees (but worst performance), use <a href="https://en.wikipedia.org/wiki/Tor_\(network\)">the Tor network</a> to hide your IP address and network metadata, either via <a href="https://en.wikipedia.org/wiki/Tor_\(network\)#Tor_Browser">Tor Browser</a> or another browser&#8217;s implementation such as <a href="https://support.brave.app/hc/en-us/articles/360018121491-What-is-a-Private-Window-with-Tor-Connectivity">Brave&#8217;s Tor mode</a>. Always prefer Tor Browser if your safety depends on it.</p></li></ol><h4>Lastly, test!</h4><p>You can check your browser&#8217;s vulnerability to fingerprinters by using a good fingerprinting testing website like EFF&#8217;s <a href="https://coveryourtracks.eff.org/">CoverYourTracks</a>.</p><p>I put together a <a href="https://shivankaul.com/brave/canvas-noise">simple demo website</a> to give a visual example of how browsers apply anti-fingerprinting measures. The demo website writes and reads data using <a href="https://browserleaks.com/canvas">Canvas API</a>, a widely-used Web API that is also sadly commonly used by fingerprinters. Canvas fingerprinting draws hidden graphics using the Canvas API and re-reads the raw pixels. These pixels encode subtle details about your GPU, driver, fonts and sub-pixel rendering which can then be hashed by a tracker into a stable identifier which survives anything you can do (short of getting a new computer). To combat this, many browsers inject noise into the pixels when they are read back. The <a href="https://shivankaul.com/brave/canvas-noise">demo website</a> helps visualize that noise. To not break website functionality, the noise injected by the browser (if it does) is ordinarily invisible to the human eye; the demo deliberately amplifies the distortion to show how different browsers use different noise-injection strategies.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bxJ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bxJ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png 424w, https://substackcdn.com/image/fetch/$s_!bxJ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png 848w, https://substackcdn.com/image/fetch/$s_!bxJ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png 1272w, https://substackcdn.com/image/fetch/$s_!bxJ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bxJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Brave in default mode. Random noise throughout the canvas. As tested on https://shivankaul.com/brave/canvas-noise at time of publication&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Brave in default mode. Random noise throughout the canvas. As tested on https://shivankaul.com/brave/canvas-noise at time of publication" title="Brave in default mode. Random noise throughout the canvas. As tested on https://shivankaul.com/brave/canvas-noise at time of publication" srcset="https://substackcdn.com/image/fetch/$s_!bxJ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png 424w, https://substackcdn.com/image/fetch/$s_!bxJ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png 848w, https://substackcdn.com/image/fetch/$s_!bxJ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png 1272w, https://substackcdn.com/image/fetch/$s_!bxJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9815e22f-48a4-4f1a-a338-413ce58aa224_602x208.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p><em>Brave in default mode. Random noise throughout the canvas. As tested on <a href="https://shivankaul.com/brave/canvas-noise">https://shivankaul.com/brave/canvas-noise</a> at time of publication</em></p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NsDj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NsDj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png 424w, https://substackcdn.com/image/fetch/$s_!NsDj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png 848w, https://substackcdn.com/image/fetch/$s_!NsDj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png 1272w, https://substackcdn.com/image/fetch/$s_!NsDj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NsDj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Safari in Private Browsing. Subtle random noise at the four corners of the canvas. As tested on https://shivankaul.com/brave/canvas-noise at time of publication&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Safari in Private Browsing. Subtle random noise at the four corners of the canvas. As tested on https://shivankaul.com/brave/canvas-noise at time of publication" title="Safari in Private Browsing. Subtle random noise at the four corners of the canvas. As tested on https://shivankaul.com/brave/canvas-noise at time of publication" srcset="https://substackcdn.com/image/fetch/$s_!NsDj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png 424w, https://substackcdn.com/image/fetch/$s_!NsDj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png 848w, https://substackcdn.com/image/fetch/$s_!NsDj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png 1272w, https://substackcdn.com/image/fetch/$s_!NsDj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb012-8fe8-4ce9-9e0c-98d6ff12ab41_602x208.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p><em>Safari in Private Browsing. Notice the subtle random noise at the four corners of the image. As tested on <a href="https://shivankaul.com/brave/canvas-noise">https://shivankaul.com/brave/canvas-noise</a> at time of publication</em></p><p>For a fun exercise, try out the demo website on Mozilla Firefox with <a href="https://support.mozilla.org/en-US/kb/resist-fingerprinting">Resist Fingerprinting</a> turned on and see what you get!</p><h2>Acknowledgements</h2><p>Thanks to Juliana Guerra, Rohan Dandavati, Aakash Japi and Gurshabad Grover for proofreading my ramblings and giving fantastic feedback.</p><h3>Relevant reading</h3><ol><li><p><a href="https://web.dev/learn/privacy/fingerprinting">Fingerprinting, web.dev</a></p></li><li><p><a href="https://support.mozilla.org/en-US/kb/firefox-protection-against-fingerprinting">Firefox&#8217;s protection against fingerprinting</a></p></li><li><p>Brave&#8217;s fingerprinting philosophy: <a href="https://github.com/brave/brave-browser/wiki/Fingerprinting-Protections">https://github.com/brave/brave-browser/wiki/Fingerprinting-Protections</a></p></li><li><p>Apple&#8217;s one-pager on their tracking prevention mechanisms: <a href="https://webkit.org/tracking-prevention/">Tracking Prevention in WebKit</a></p></li><li><p>[Private Browsing 2.0 WebKit](https://webkit.org/blog/15697/private-browsing-2-0/)</p></li><li><p>Open source privacy tests for browsers by Arthur Edelstein: <a href="https://privacytests.org/">PrivacyTests.org</a></p></li><li><p>DuckDuckGo&#8217;s tracker radar, used by Safari: <a href="https://github.com/duckduckgo/tracker-radar">https://github.com/duckduckgo/tracker-radar</a></p></li><li><p>Test your browser to see how well you are protected from tracking and fingerprinting: EFF&#8217;s <a href="http://coveryourtracks.eff.org/">Cover Your Tracks</a></p></li><li><p><a href="https://lowentropy.net/posts/fraud/">Fraud, Abuse, Fingerprinting, Privacy, and Openness</a> by Martin Thomson</p></li><li><p>Old but comprehensive writeup by Chromium on client identification mechanisms: <a href="https://www.chromium.org/Home/chromium-security/client-identification-mechanisms/">Technical analysis of client identification mechanisms</a></p></li><li><p>Study examining trackers across the Web: <a href="https://webtransparency.cs.princeton.edu/webcensus/">Online tracking: A 1-million-site measurement and analysis</a></p></li><li><p><a href="https://www.consumerreports.org/electronics-computers/vpn-services/mullvad-ivpn-mozilla-vpn-top-consumer-reports-vpn-testing-a9588707317/">Mullvad, IVPN, and Mozilla Top Consumer Reports&#8217; VPN Privacy</a></p></li></ol><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/beyond-cookies-browser-fingerprinting-in-2025-2">https://shivankaul.com/blog/beyond-cookies-browser-fingerprinting-in-2025-2</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Beyond cookies: browser fingerprinting in 2025 (Part 1)]]></title><description><![CDATA[The who, what, why and how of browser fingerprinting.]]></description><link>https://shivankaul.substack.com/p/beyond-cookies-browser-fingerprinting-in-2025-1</link><guid isPermaLink="false">https://shivankaul.substack.com/p/beyond-cookies-browser-fingerprinting-in-2025-1</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZcxT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>The who, what, why and how of browser fingerprinting.</em></p><p><em>Earlier this year, I was asked to give a talk on the state of browser fingerprinting by the Public Interest Technology Group (<a href="https://pitg.network/">PITG</a>). I wrote a blog post based on the talk that was published on the <a href="https://pitg.network/news/techdive/2025/08/15/browser-fingerprinting.html">PITG blog</a>. I decided to reproduce it in full on my own blog because I made some edits post-publication, and I think it reads better as a two-part blog post. So here&#8217;s part one. You can find part two <a href="/blog/beyond-cookies-browser-fingerprinting-in-2025-2">here</a>.</em></p><h2>Beyond cookies: browser fingerprinting in 2025</h2><p>Cookies are optional. Fingerprinting isn&#8217;t. In 2025, the easiest way for trackers and third-party advertisers to follow you across the Web is to read the traits your browser can&#8217;t help revealing (screen, fonts, GPU quirks) and stitch them into a stable ID. The third-party advertising and tracking ecosystem has metastasized to a point that even US intelligence agencies <a href="https://www.vice.com/en/article/the-nsa-and-cia-use-ad-blockers-because-online-advertising-is-so-dangerous/">use ad blockers internally</a> for security reasons. The connection between <a href="https://www.iccl.ie/digital-data/iccl-secures-permission-to-take-irelands-first-ever-class-action/">real-time bidding and personal data leaks</a> is well-established. This personal data often ends up with <a href="https://gizmodo.com/data-broker-brags-about-having-highly-detailed-personal-information-on-nearly-all-internet-users-2000575762">data brokers</a> and eventually leads to users experiencing <a href="https://knowledge.wharton.upenn.edu/article/how-apples-app-tracking-policy-curbs-financial-fraud/">financial fraud</a>.</p><p>This blog post gives an overview of how browser fingerprinting is used for tracking, how browsers protect users, and how users can protect themselves. This latter part is important, because most browsers leave anti-fingerprinting off by default. Web privacy is a fast-evolving and complicated field, so the goal of this writeup is to give a clear mental model and links for diving deeper.</p><h2>What is a browser fingerprint?</h2><p>A browser fingerprint is much like a human fingerprint: a unique identifier that is hard to change. The more ways in which you&#8217;re different from other users, the more identifiable your browser fingerprint, and the easier you are to track across the Web. If all a website comes to know is that you&#8217;re on an iPhone 16, that&#8217;s not particularly identifying, since you are far (far, far) from the only iPhone 16 user. But websites also need to know things like your screen size (to properly display the website for your screen), your timezone (to show you your calendar), whether or not you have <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme">dark mode enabled</a> (for accessibility as well as general hacker vibes), etc. In combination, all of these small differences contribute to making your browser look unique.</p><p>For a browser, this presents a dilemma: break the ability for websites to detect dark mode and you incur the wrath of your most vocal users whose hacker aesthetics you just committed photocide against (<a href="https://github.com/brave/brave-browser/issues/17139#issuecomment-898731904">ask me how I know</a>). Don&#8217;t, and that&#8217;s yet another bit of information exposed to malicious tracking scripts. It gets even more complicated with more advanced fingerprinting techniques that rely on subtle differences between how different computers render pixels, or how sound cards process sound. We&#8217;ll come back to this point when discussing anti-fingerprinting strategies, but generally, the more modded and customized your computer setup, the more identifiable it is.</p><p>This majorly sucks, because the power of the Web is in its dynamism and diversity. JavaScript and other Web technologies let developers design immersive experiences and power the Web economy. Also, the same <a href="https://wikipedia.org">Wikipedia.org</a> website can work across different operating systems, device manufacturers, form factors and hardware capabilities, ranging from my Apple device to my colleague&#8217;s bespoke <a href="https://en.wikipedia.org/wiki/Sailfish_OS">Sailfish</a>-flashed handset, and I think that&#8217;s beautiful. Powerful browsers and adaptive websites are a good thing!</p><h2>Who does browser fingerprinting?</h2><h3>Advertisers</h3><p>Advertisers want to know very legal and very cool things like whether that Nike ad you saw on Instagram ended up being responsible for a purchase you made on Nike&#8217;s website later that week. Without this kind of tracking data, they have no idea if the billions of dollars they pay advertising platforms like Meta is paying off. Advertising networks also want to know who you are in order to increase the chances you click on an ad. There is an overwhelming financial incentive to get any kind of user tracking they can. Interestingly, browser fingerprinting is <a href="https://liveramp.com/blog/getting-addressability-marketing-right/">controversial even within the advertising industry</a>, though it <a href="https://www.criteo.com/blog/alternative-ids-the-future-of-cookieless-advertising/#the-main-alternative-id-solutions">happens anyway</a>.</p><h3>Anti-fraud and anti-bot vendors</h3><p>Anti-fraud and <a href="https://blog.cloudflare.com/ja4-signals/?utm_source=chatgpt.com/">bot-mitigation</a> companies aim to identify unwanted clients by fingerprinting their browsers. &#8220;Unwanted&#8221; typically means &#8220;could be a security threat&#8221; or &#8220;is a bot&#8221;. Identifying non-human traffic is a growing concern, especially as LLMs <a href="https://arstechnica.com/information-technology/2025/07/openais-chatgpt-agent-casually-clicks-through-i-am-not-a-robot-verification-test/">get better at solving CAPTCHAs</a>. NYTimes and other news websites were <a href="https://bloggeek.me/webrtc-new-york-times/">caught harvesting local IP addresses</a> as an anti-bot strategy a few years ago.</p><h3>Law enforcement and nation states</h3><p>Government agencies frequently use whatever data collection mechanism they can get their hands on. NSA&#8217;s <a href="https://www.aclu.org/wp-content/uploads/legal-documents/168-33.ex_.29.pdf">XKEYSCORE</a> program hoovered up Internet traffic directly from fiber optic cables around the world, and <a href="https://embed.documentcloud.org/documents/2116373-xks-intro/#document/p24">extracted browser fingerprints to assess exploitability</a> of their targets. The UK tax revenue agency (HMRC) recently asked around for <a href="https://docs.google.com/viewer?url=https://www.contractsfinder.service.gov.uk/Notice/Attachment/c42c529a-15a1-4c78-9fec-cf4b0388a3f5">fingerprinting solutions</a> to detect tax fraud.</p><h2>Why fingerprint (when you can cookie)?</h2><p>After much vacillation, Google Chrome <a href="https://privacysandbox.com/news/privacy-sandbox-next-steps/">announced in April 2025</a> that they will be rolling back their latest already-watered-down proposal to bring third-party cookie blocking to users, and will now be doing (<em>checks notes</em>) absolutely nothing. The working title of this blog post was &#8220;tracking in a post-cookie world&#8221;, but it looks like that world is still far away, given Chrome&#8217;s reluctance to touch third-party cookies and their dominant browser market share. More than half the Web&#8217;s traffic comes from Chrome (exact numbers vary depending on <a href="https://radar.cloudflare.com/reports/browser-market-share-2025-q1">who</a> <a href="https://gs.statcounter.com/browser-market-share">you</a> <a href="https://analytics.wikimedia.org/dashboards/browsers/#all-sites-by-browser">ask</a> for interesting reasons that deserve their own blog post).</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZcxT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZcxT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png 424w, https://substackcdn.com/image/fetch/$s_!ZcxT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png 848w, https://substackcdn.com/image/fetch/$s_!ZcxT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png 1272w, https://substackcdn.com/image/fetch/$s_!ZcxT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZcxT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d33f2283-ef50-4806-b356-657479c9f0e4_602x340.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ZcxT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png 424w, https://substackcdn.com/image/fetch/$s_!ZcxT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png 848w, https://substackcdn.com/image/fetch/$s_!ZcxT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png 1272w, https://substackcdn.com/image/fetch/$s_!ZcxT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd33f2283-ef50-4806-b356-657479c9f0e4_602x340.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><p><a href="https://privacytests.org/">Other major browsers</a>, thankfully, do block and partition third-party cookies. Even so, browser fingerprinting is still widely used by trackers and third-party advertisers to overcome the limitations of cookie-based tracking.</p><h3>Cookies can be isolated (e.g. Private Browsing)</h3><p>Users can use dedicated browsing sessions, isolating cookies and other storage. The classic example is Private (aka Incognito) windows which also clear storage when users exit them, but Firefox&#8217;s Containers or Chromium&#8217;s Profiles serve the same purpose of making sure that cookies are isolated to a particular storage area. If I visit a website in my normal profile and then re-visit in a Private window, and the website is able to tell that I&#8217;m the same user across both visits, that&#8217;s a major privacy leak.</p><p>Browser fingerprinters try to pierce session isolation in order to re-identify users. The NSA used <a href="https://en.wikipedia.org/wiki/Evercookie">Evercookie</a> to unmask Tor users by recreating cookies even after they were deleted.</p><h3>Cookies can be cleared</h3><p>Cookies and other kinds of storage can be proactively cleared by the user even within the same session. <a href="https://brave.com/privacy-updates/30-shred-button/">Brave</a> and <a href="https://duckduckgo.com/duckduckgo-help-pages/privacy/web-tracking-protections#the-fire-button">DuckDuckGo</a> offer ways to automatically clear storage when a tab/site/app is closed. Several browsers use heuristics to figure out when it&#8217;s safe to automatically clear a website&#8217;s storage so as to prevent tracking while still preserving functionality; it would be pretty annoying if I had to re-login to my favorite website every time I visited it. <a href="https://privacycg.github.io/nav-tracking-mitigations/#deployed-mitigations">Bounce tracking mitigation</a> is one category of this&nbsp;work that is implemented by most browsers, with varying degrees of aggressiveness. Again, Chrome lags behind other browsers by <a href="https://privacysandbox.google.com/protections/bounce-tracking-mitigations#status">not applying bounce tracking mitigations by default</a>.</p><p>Compared to cookies, a browser fingerprint is a lot more pernicious and hard to clear, since it relies on inherent characteristics of your machine.</p><h3>Fingerprinting is invisible</h3><p>Browser fingerprinting is often passive: the malicious website or script doesn&#8217;t need to do anything observable in order to fingerprint you. This is unlike cookies, where the tracking script actually has to leave data on your browser which can be cleared as mentioned above. If a website is using your <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/User-Agent">User-Agent</a> string to create a fingerprint for your browser, there&#8217;s not much you can do about it since you won&#8217;t even know that the website is doing it on their backend. Brave <a href="https://github.com/brave/brave-browser/wiki/Fingerprinting-Protections#how-do-i-see-fingerprinting-protections-active-on-a-page">has a way</a> for users to see if a website invoked a Web API that has fingerprinting protections applied, but fundamentally there&#8217;s no way for the browser to know if the information requested by the website is going to be used for nefarious or benign purposes.</p><h3>Harder for regulators to enforce</h3><p>Regulators have mostly enforced laws against storage-based tracking, since violations are much easier to detect. Cookie consent notices are a very visible example of this: you&#8217;re inundated with them as websites try to comply with laws that require explicit consent for storage on the user&#8217;s device. This leaves fingerprint-related profiling under-enforced since it happens by websites and trackers on their backend.</p><p>Google announced in 2024 that they will no longer prohibit their advertising customers from fingerprinting users, which was (thankfully) sharply rebuked by the <a href="https://ico.org.uk/about-the-ico/media-centre/news-and-blogs/2024/12/our-response-to-google-s-policy-change-on-fingerprinting/">UK ICO</a>.</p><h2>Conclusion</h2><p>Browser fingerprinting thrives because it exploits the Web&#8217;s necessary, high-entropy surfaces (screen, fonts, device quirks) quietly and across sites. Part two turns from diagnosis to defenses: how browsers approach this problem, what trade-offs they face, and concrete steps you can take to raise your anonymity set without breaking the modern Web.</p><p><em>That&#8217;s it for part 1! You can read part 2 <a href="/blog/beyond-cookies-browser-fingerprinting-in-2025-2">here</a>, where I&#8217;ll talk about how browsers defend against browser fingerprinting and what you can do to protect yourself.</em></p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/beyond-cookies-browser-fingerprinting-in-2025-1">https://shivankaul.com/blog/beyond-cookies-browser-fingerprinting-in-2025-1</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Prompt injections in agentic browsers]]></title><description><![CDATA[Ignore all previous instructions.]]></description><link>https://shivankaul.substack.com/p/prompt-injections-in-agentic-browsers</link><guid isPermaLink="false">https://shivankaul.substack.com/p/prompt-injections-in-agentic-browsers</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Sun, 31 Aug 2025 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Ignore all previous instructions.</em></p><p>In August 2025 we found, responsibly disclosed and wrote about an indirect prompt injection attack in Perplexity&#8217;s Comet browser. The attack exploited agent-controlled browsing in Comet. We followed this up with several new disclosures which proved that this wasn&#8217;t a one-off case of bad security practices and that the entire industry is at severe security risk when it comes to prompt injections.</p><p>Our work shaped the conversation in 2025 about the risks of agentic AI browsers and influenced browser vendors in their rollout of safer agentic browsing. OpenAI implemented several of our security recommendations in their release of ChatGPT Atlas.</p><p>You can read more on the <a href="https://brave.com/series/security-privacy-in-agentic-browsing/">Brave blog</a>.</p><p>Our security work generated a lot of discussion and press:</p><ul><li><p><a href="https://techcrunch.com/2025/10/25/the-glaring-security-risks-with-ai-browser-agents/">TechCrunch - &#8220;The glaring security risks with AI browser agents&#8221;</a></p></li><li><p><a href="https://www.nbcnews.com/tech/tech-news/ai-browsers-comet-openai-hacked-atlas-chatgpt-rcna235980">NBC News - &#8220;AI browsers are here, and they&#8217;re already being hacked&#8221;</a></p></li><li><p><a href="https://techcrunch.com/2025/08/26/anthropic-launches-a-claude-ai-agent-that-lives-in-chrome/">TechCrunch - &#8220;Anthropic launches a Claude AI agent that lives in Chrome&#8221;</a></p></li><li><p><a href="https://arstechnica.com/information-technology/2025/08/new-ai-browser-agents-create-risks-if-sites-hijack-them-with-hidden-instructions/">Ars Technica - &#8220;Anthropic&#8217;s auto-clicking AI Chrome extension raises browser-hijacking concerns&#8221;</a></p></li><li><p><a href="https://www.theregister.com/2025/08/20/perplexity_comet_browser_prompt_injection/">The Register - &#8220;Perplexity&#8217;s Comet browser naively processed pages with evil instructions&#8221;</a></p></li><li><p><a href="https://www.searchenginejournal.com/brave-reveals-systemic-security-issues-in-ai-browsers/558909/">Search Engine Journal - &#8220;Brave Reveals Systemic Security Issues In AI Browsers&#8221;</a></p></li><li><p><a href="https://www.cnet.com/tech/services-and-software/perplexitys-comet-ai-web-browser-had-a-major-security-vulnerability/">CNET - &#8220;Perplexity&#8217;s Comet AI Web Browser Had a Major Security Vulnerability&#8221;</a></p></li><li><p><a href="https://www.malwarebytes.com/blog/news/2025/08/ai-browsers-could-leave-users-penniless-a-prompt-injection-warning">Malwarebytes Labs - &#8220;AI browsers could leave users penniless: A prompt injection warning&#8221;</a></p></li><li><p><a href="https://simonwillison.net/2025/Oct/21/unseeable-prompt-injections/">Simon Willison&#8217;s blog post about our follow-up attacks - &#8220;Unseeable prompt injections in screenshots: more vulnerabilities in Comet and other AI browsers.&#8221;</a></p></li><li><p><a href="https://simonwillison.net/2025/Aug/25/agentic-browser-security/">Simon Willison&#8217;s blog post about our initial attack - &#8220;Agentic Browser Security: Indirect Prompt Injection in Perplexity Comet.&#8221;</a></p></li></ul><p>More press</p><ul><li><p><a href="https://x.com/zack_overflow/status/1959308058200551721">Initial post on X that went viral</a></p></li><li><p><a href="https://www.tomshardware.com/tech-industry/cyber-security/perplexitys-ai-powered-comet-browser-leaves-users-vulnerable-to-phishing-scams-and-malicious-code-injection-brave-and-guardios-security-audits-call-out-paid-ai-browser">Tom&#8217;s Hardware</a></p></li><li><p><a href="https://www.pcworld.com/article/2885371/perplexitys-ai-browser-is-a-sucker-for-blatant-scams-and-prompt-hijacks.html">PCWorld</a></p></li><li><p><a href="https://www.windowscentral.com/artificial-intelligence/perplexity-comet-browser-serious-security-flaws">Windows Central</a></p></li><li><p><a href="https://decrypt.co/336763/perplexity-comet-flaw-exposed-user-data-attackers-brave-reports">Decrypt</a></p></li><li><p><a href="https://www.searchenginejournal.com/perplexity-comet-browser-vulnerable-to-prompt-injection-exploit/554575/">Search Engine Journal</a></p></li><li><p><a href="https://indianexpress.com/article/technology/artificial-intelligence/perplexitys-ai-agent-browser-comet-vulnerable-to-prompt-injection-attacks-researchers-warn-10210295/">Indian Express</a></p></li><li><p><a href="https://www.indiatoday.in/technology/news/story/perplexity-ais-comet-browser-bug-could-have-exposed-your-data-to-hackers-report-warns-2776888-2025-08-26">India Today Tech</a></p></li><li><p><a href="https://www.computing.co.uk/news/2025/security/ai-browsers-highly-vulnerable-to-scams-report">Computing (UK)</a></p></li><li><p><a href="https://gigazine.net/gsc_news/en/20250826-perplexity-comet-ai-prompt-injection/">GIGAZINE</a></p></li><li><p><a href="https://the-decoder.com/brave-discovers-a-security-flaw-in-perplexitys-comet-browser/">THE DECODER</a></p></li><li><p><a href="https://www.webpronews.com/brave-discovers-prompt-injection-flaw-in-perplexity-ais-comet-browser/">WebProNews</a></p></li><li><p><a href="https://www.webpronews.com/ai-browsers-hacked-hidden-prompts-spark-security-crisis/">WebProNews - follow-up</a></p></li></ul><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/prompt-injections-in-agentic-browsers">https://shivankaul.com/blog/prompt-injections-in-agentic-browsers</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[2024 Wrapped]]></title><description><![CDATA[Reflections on the year.]]></description><link>https://shivankaul.substack.com/p/2024-wrapped</link><guid isPermaLink="false">https://shivankaul.substack.com/p/2024-wrapped</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Thu, 26 Dec 2024 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Reflections on the year.</em></p><p>I&#8217;m writing this on the flight back to SF from Delhi. Sleep is elusive and there&#8217;s no Wi-Fi on Air India to guilt me with its siren song of Slack notifications.</p><p>Here are some 2024 highlights:</p><h2>Making SF a home</h2><p>We <a href="https://shivankaul.com/blog/sf">moved to San Francisco</a> last year, but spent about a year settling in properly. I&#8217;m a double-immigrant at this point (h/t to <a href="https://en.wikipedia.org/wiki/Past_Lives_(film)">Past Lives</a>), and I&#8217;ve moved cities multiple times in my life; it takes about that much time for a place to slip under my skin and feel like second nature&#8212;like a home does. Given that we&#8217;re thinking of living in the Bay Area long-term, it felt important to see if this was a place I could belong to.</p><p>SF responded to my loving. It&#8217;s nice living in a Real City, an important place with a strong gravitational pull. SF still has that relevance, social media discourse notwithstanding. I was deliberate about establishing routines centered around people; people are 75% of what fuels attachment to geography anyway. SF feels like home now.</p><p>Sometimes I wonder if I had made <a href="https://shivankaul.com/blog/2018#left-ottawa">more of an effort to love Ottawa</a>, if I would have felt similarly. Does every city respond to loving?</p><h3>Commons and Center</h3><p>We live around <a href="https://en.wikipedia.org/wiki/Hayes_Valley,_San_Francisco#Culture">Hayes Valley</a> in SF, a great spot in hindsight, because we&#8217;re so close to SF Commons and The Center&#8212;two uniquely San Franciscan establishments. <a href="https://www.thesfcommons.com/">SF Commons</a> is a membership-based social club that functions as a <a href="https://en.wikipedia.org/wiki/Third_place">third space</a>, while the <a href="https://www.thecentersf.com/">The Center</a> is a yoga studio-meets-teahouse. The crowd at The Commons skews tech and AI but with a wordcel twist (think journaling and sci-fi book clubs), and The Center attracts a more woo-woo New Age kind of person (sample events: ecstatic dance, sound healing). Like I said, very SF.</p><p>I love both vibes obviously, so I&#8217;m often at one or the other. Some friends and I go to a weekly yoga class at The Center (brutal but fulfilling) with <a href="https://www.sfyogamagazine.com/blog/2019/7/19/rzh3i3o8cxc5vuyhvi0ie3hu2bj7v1">Kirin Power</a> and I attend book clubs and <a href="https://lu.ma/SFwritingclubseries">Writing Club</a> events at The Commons.</p><h3>Frisbee</h3><p>I&#8217;ve been wanting to expand my physical recreation horizons beyond running. I&#8217;ve started going for frisbee in Golden Gate Park on Saturdays. I&#8217;ve never played Ultimate before so it&#8217;s been fun picking it up and improving slowly and (only sometimes) painfully. Best part though are the big social lunches afterwards, especially when they&#8217;re at <a href="https://marnee-thai-restaurant.club/">Marnee Thai</a>.</p><h3>Football</h3><p>I&#8217;ve spent countless hours of my childhood being obsessed with football (or &#8220;soccer&#8221; depending on your persuasion) and FIFA (or <a href="https://www.dexerto.com/ea-sports-fc/ea-sports-fc-explained-what-is-ea-fc24-and-where-is-fifa-24-2207479/">FC as the game is now called</a>), but gave both up once I moved to North America. This year I&#8217;ve been getting back into football. A friend and I have been playing Manager Mode on <a href="https://en.wikipedia.org/wiki/EA_Sports_FC_24">FC 24</a> together, which has been a lot of fun. We play <a href="https://en.wikipedia.org/wiki/Rangers_F.C.">Rangers FC</a>. I got to play a lot of football with my cousin during my India trip, who is very good at both game and IRL football. It&#8217;s also just been fun catching up on player lore and sharing Instagram reels and edits.</p><h3>Tango</h3><p>I&#8217;ve wanted to learn a dance form for a while, and given that we were going to Buenos Aires in March, I started learning tango in January. I met a lot of great people, and stuck with it for a while, but I don&#8217;t know if I enjoy tango in particular. Maybe I just didn&#8217;t like the pedagogical style at this particular studio: instructions change from instructor to instructor and between lessons, which is confusing for a beginner. I keep vacillating about whether I want to give it more time or to just call it quits and try something new.</p><h2>Traveling</h2><p>I started out 2024 resolving not to travel at all. I&#8217;ve long thought that the millennial dream of finding meaning through travel is a fallacy; a layer of icing disguised as the cake. True belonging and community comes from putting in the work to form IRL ties and memories with people you see over and over again, and that won&#8217;t happen if you&#8217;re always away from the city you live in.</p><p>Unfortunately, I&#8217;m a hypocrite. Despite the above opinion, I somehow always end up traveling, either for work or for fun. 2024 was no different. I visited the following countries this year:</p><ol><li><p>Chile/Patagonia (<a href="https://www.swoop-patagonia.com/chile/torres-del-paine/hiking/w-trek">W trek</a>)</p></li><li><p>Argentina (Buenos Aires to recover after Patagonia)</p></li><li><p>Canada (trip to Newfoundland with family)</p></li><li><p>UK (London for a work offsite)</p></li><li><p>Portugal (Estoril for the <a href="https://wiki.digitalrights.community/index.php?title=Global_Gathering_2024">Global Gathering</a> conference)</p></li><li><p>Italy (Rome and Naples with a friend)</p></li><li><p>South of Spain (annual friend trip)</p></li><li><p>Ireland (Dublin for <a href="https://www.ietf.org/meeting/121/">IETF 121</a>)</p></li><li><p>India (family)</p></li></ol><p>This was the first year I spent a significant amount of time in Europe (mid-September to early November, apart from a couple of weeks in the middle). It was overall pretty good except for Rome, which was breathtaking from start to finish. I&#8217;m still not over Rome. I loved Dublin too but I already knew I would given my <a href="https://en.wikipedia.org/wiki/Congregation_of_Christian_Brothers">Irish Christian Brother</a> schooling; it felt familiar.</p><p>We didn&#8217;t do much traveling within India this December, which was fine given how many financial and domestic chores kept popping up. I didn&#8217;t get to spend a lot of time in Delhi meeting friends either, which probably extended my lifespan by a few months. The winter smoke has expanded well beyond Delhi to all of North India, even up to Shimla. Everything is covered in a haze: returning to SF felt like someone had turned on the high-definition setting. It was lovely spending an extended amount of time with family, like always. But every year working late-nights and early-mornings from India gets harder and harder.</p><h2>Walking</h2><p>I did a fair bit of backpacking this year. We did the <a href="https://www.swoop-patagonia.com/chile/torres-del-paine/hiking/w-trek">W trek</a> in Patagonia (Chile) in March, and then the <a href="https://www.nps.gov/seki/planyourvisit/rae-lakes-loop.htm">Rae Lakes Loop</a> in Sequoia/Kings Canyon. The latter was a lot harder than the former. Highly recommend Patagonia for anyone who likes hiking because you can really choose-your-own-adventure. I&#8217;ll never forget having fancily-plated poached salmon for dinner when the nearest hospital was 200 kilometers away. You can get away with not carrying anything on the hike except clothes, as long as you book things far enough in advance. It was also the right amount of crowded, and the views were spectacular. I do NOT recommend Rae Lakes for anyone who doesn&#8217;t like mosquitoes (literal CLOUDS), altitude sickness (my ancestors are embarrassed for me), controlled forest burning which meant we were breathing in smoke basically the entire way up (turned our snot all sorts of interesting colors) or bears (a baby bear smashed our car window and broke in). The views were beautiful though, probably even more so than Patagonia. If you live in California you never need to travel much for world-class nature.</p><p>I spent a fortune at REI this year. Totally worth it.</p><p>In general, I walked a lot this year. I wish Apple Health did a Spotify Wrapped-style post, but looking through my data, my biggest non-backpacking walk was a day in Rome where we did 32,000 steps in a day. I did about 38,000 steps on Day 3 of backpacking in Patagonia, which is approximately 30 kilometers at my average step length.</p><p>I joined a Walk Club in SF, which I haven&#8217;t gotten a chance to attend a whole lot because it clashes with yoga, but I&#8217;ve loved the walks I&#8217;ve been on because you also get to talk to new people while walking. I also did an impromptu &#8220;Stairs of San Francisco&#8221; walk on Juneteenth where I zig-zagged across the city, that was pretty fun. I want to do the <a href="https://crosstowntrail.org/">SF Crosstown Trail</a> in 2025.</p><h2>Becoming a manager</h2><p>This was my first year managing people as the lead for privacy, adblocking and webcompat teams at <a href="https://brave.com">Brave browser</a>. A lot happened quickly: my team grew by 50% and I had to lay someone off. As my team has grown larger I&#8217;ve found it harder to find the mental space to write big chunks of code. But I enjoy getting to set the technical direction and be deeply involved in technical privacy and webcompat things.</p><p>It&#8217;s been interesting seeing the politics behind how the sausage is made; the experience feels valuable. I just wish I had more slack time to think about how to deeply solve problems as opposed to ~all my time being Slack time.</p><h2>Started hosting people more at home</h2><p>I&#8217;ve always wanted an open-door home where friends feel welcome to just drop by without needing to provide notice. I love the aesthetic of easy familiarity. This requires a fairly high baseline level of tidiness in the home, and that requires constant work. Overall I feel we did a good job this year having our apartment be a default place to hang out.</p><p>We&#8217;ve had people drop by for movie nights, FIFA games, themed potlucks, Kashmiri dinners and friends&#8217; engagement announcements. I especially loved all the dinner parties we hosted. We also did a couple of iterations of Dishoom potluck, where everyone makes a dish from the <a href="https://store.dishoom.com/products/dishoom-cookery-book">Dishoom cookbook</a>. I made the <a href="https://iamafoodblog.com/dishooms-ruby-chicken-curry-recipe/">chicken ruby</a> and lamb keema, which were both delicious and educational. I got to actually try out those dishes IRL when I took my team to <a href="https://www.dishoom.com/kensington/">Dishoom Kensington</a> for a work dinner in London, though their House Black Daal is the best item on the menu.</p><h2>Food, books, movies, music</h2><p><strong>Top meals:</strong> We visited <a href="https://www.arambururesto.com.ar/">Aramburu</a> in Buenos Aires for my birthday, in the aftermath of our Patagonia trip. Best meal I&#8217;ve ever had, hands down. Also the most expensive, but not by much. I&#8217;ve framed the menu in our apartment. The attention to detail, the flavors, the service and overall experience is everything I&#8217;ve looked for in Michelin-starred restaurants but never gotten until now. We did <a href="https://houseofprimerib.net/">House of Prime Rib</a> for a friend&#8217;s birthday again this year and it was fantastic yet again. I honestly like the steak better at HoPR than the one we had at <a href="https://www.lacabrera.com.ar/">La Cabrera</a> (though HoPR did NOT throw in an entire bottle of champagne for free) in Buenos Aires after a 3 hour wait. HoPR is peak America: unfussy, friendly, high-quality and good-value spectacle.</p><p>I had a number of great meals in Ahmedabad this time, which was surprising because I&#8217;ve never really thought of Gujarat as a culinary destination. My current hottest food take is that Ahmedabad has better chana bhatura than Chandigarh; Chandigarh was pretty meh this time when it came to restaurants (though the bean-to-bar chocolate <a href="https://indianexpress.com/article/cities/chandigarh/bean-to-bar-chocolate-cafe-8696981/">scene is popping</a>). I wanted to try <a href="https://restaurantnaar.com/">Naar</a> (elevated Kashmiri food!) after hearing a lot about it but unfortunately the timing didn&#8217;t work out. On the topic of Kashmiri food, I made rogan josh for the first time this year after promising a friend that I&#8217;d make it for him if he didn&#8217;t order a generic version at a Goan (GOAN!) restaurant. I ended up making the dish twice more in a span of a month. Getting good goat meat in SF can be tricky but the frozen bag from Costco works in a pinch.</p><p><strong>Top books:</strong> I finally got around to actually reading Chomsky this year instead of just summaries and excerpts. <em><a href="https://thenewpress.com/books/understanding-power">Understanding Power</a></em> led me to the rest of his work. His books have been illuminating and I agree with his reasoning and conclusions except for the excessive moral judgment.</p><p><a href="https://www.sevenstories.com/books/3493-simple-passion">Annie Ernaux</a> and <a href="https://www.nytimes.com/2016/02/07/books/review/the-vegetarian-by-han-kang.html">Han Kang</a> are other great authors I read for the first time this year, and want to read more of next year. I also enjoyed <em>Victory City</em> by Salman Rushdie which I reviewed <a href="https://shivankaul.com/blog/victory-city">here</a>. I mostly spent a lot of time re-reading <a href="https://en.wikipedia.org/wiki/Elena_Ferrante">Elena Ferrante</a> to keep pace while we were watching the HBO show, and can confidently say that the <a href="https://en.wikipedia.org/wiki/Neapolitan_Novels">Neapolitan Novels</a> are my all-time favourite books. I&#8217;ve been aggressively gifting the book at every opportunity, like a reverse and Italian Grinch.</p><p><strong>Top movies:</strong> probably <em><a href="https://en.wikipedia.org/wiki/No_Country_for_Old_Men">No Country For Old Men</a></em>, that a friend made us watch for a movie club. To be honest, I didn&#8217;t like it right after watching it, but the more I reflected upon the themes the more it grew on me. I tried reading some Cormac McCarthy recently (<a href="https://en.wikipedia.org/wiki/Blood_Meridian">Blood Meridian</a>) and did not like the writing, but I see why that opinion is heresy amongst American literati. His obsessions are articulate and uniquely American.</p><p>I also adored Dune 2 obviously. Denis Villeneuve is a genius.</p><p><strong>Top music:</strong> Definitely <a href="https://en.wikipedia.org/wiki/Hermanos_Guti%C3%A9rrez">Hermanos Guti&#233;rrez</a>. I still remember hearing them for the first time: we were taking shelter from a downpour in Buenos Aires and then <a href="https://www.youtube.com/watch?v=c7BxiPq_6Ok">Cerca De Ti</a> came on. I had to stop everything to ask what it was; the steel guitar was a revelation. It was great to see them live at <a href="https://thegreekberkeley.com/">The Greek</a> just a few months after hearing them for the first time!</p><h2>Things that didn&#8217;t go so well</h2><p>I still didn&#8217;t write or publish as much as I would&#8217;ve liked; I&#8217;m beginning to suspect I never will. I also didn&#8217;t play as much guitar as I would like, but I laid a lot of groundwork for this towards the latter end of the year by buying a new acoustic guitar and finally getting around to fixing my electric.</p><p>I also didn&#8217;t spend much time learning how to be more comfortable in the water, though this wasn&#8217;t a problem because we didn&#8217;t really do that many tropical or beach things this year. Perhaps 2025 will be the year of conquering water.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/2024-wrapped">https://shivankaul.com/blog/2024-wrapped</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Book review: Victory City]]></title><description><![CDATA[A review of Salman Rushdie's latest novel.]]></description><link>https://shivankaul.substack.com/p/victory-city</link><guid isPermaLink="false">https://shivankaul.substack.com/p/victory-city</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>A review of Salman Rushdie's latest novel.</em></p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qmED!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qmED!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png 424w, https://substackcdn.com/image/fetch/$s_!qmED!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png 848w, https://substackcdn.com/image/fetch/$s_!qmED!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png 1272w, https://substackcdn.com/image/fetch/$s_!qmED!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qmED!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:250,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Cover of Victory City by Salman Rushdie&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Cover of Victory City by Salman Rushdie" title="Cover of Victory City by Salman Rushdie" srcset="https://substackcdn.com/image/fetch/$s_!qmED!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png 424w, https://substackcdn.com/image/fetch/$s_!qmED!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png 848w, https://substackcdn.com/image/fetch/$s_!qmED!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png 1272w, https://substackcdn.com/image/fetch/$s_!qmED!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453231a-ea38-4cf5-b67a-37f937fb39d6_257x388.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p><em>Victory City</em> by Salman Rushdie.</p><p>Salman Rushdie&#8217;s latest novel <em><a href="https://www.penguinrandomhouse.com/books/673660/victory-city-by-salman-rushdie/">Victory City</a></em> includes a public blinding. It is horrifically ironic that the author himself lost an eye and barely escaped with his life in an assassination attempt while promoting the novel at a public lecture in New York (incredibly, the lecture was on how the U.S. is a <a href="https://www.nytimes.com/live/2022/08/12/nyregion/salman-rushdie-stabbed-new-york">safe haven for exiled writers</a>). Rushdie has lived under threat of murder by Iranian leadership for more than three decades, and the attack on him is reminiscent of a major theme in Victory City: the dangers of religious intolerance.</p><p>The novel reads like an Indian fable; the latest incarnation of Rushdie&#8217;s fondness for magical realism. It tells a fictionalized account of the 14th-century South Indian <a href="https://en.wikipedia.org/wiki/Vijayanagara_Empire">Vijaynagara empire</a>. Vijaynagara translates to &#8220;Victory City&#8221; in English and is renamed Bisnaga in the book. Today, the capital city of <a href="https://en.wikipedia.org/wiki/Hampi">Hampi</a> rests on top of the substantial ruins of the Vijaynagara empire. I visited Hampi right before the pandemic. It reminded me of pictures I&#8217;ve seen of Athens: miles of rubble in varying degrees of preservation that serve as gravestones for a dead civilization. But unlike ancient Greece, with its millennia-spanning cultural impact, the Vijaynagara empire is relatively obscure even within India. Rushdie&#8217;s stylized take on it makes for interesting reading. The story is told by an anonymous narrator - a &#8220;humble historian&#8221; - translating an epic Sanskrit poem written by the protagonist Pampa Kampana about the rise and fall of the Bisnaga empire. Many of the characters in the story are based on real people, including Pampa (inspired by 14th-century princess-poet <a href="https://en.wikipedia.org/wiki/Gangadevi">Gangadevi</a>). She stars as the main character in her tale. Her life is bound up in the life of the empire, and she lives for 247 years, responsible for its birth and present at its death.</p><p>The perils of bigotry and the power of words, Rushdie&#8217;s favorite themes, recur throughout Victory City. The Bisnaga empire thrives when under secular and tolerant rule (a <a href="https://www.theatlantic.com/magazine/archive/2023/03/salman-rushdie-victory-city-book-review/672779/">&#8220;feminist utopia&#8221;</a>), and suffers when bound by strict dogma. The idea of the <a href="https://en.wikipedia.org/wiki/National_myth">founding myth</a> is dealt with several times. Kings and empires born and die and create origin stories along the way to legitimize their divine right to glory. The narrator points out that we don&#8217;t know if Pampa is being accurate in her recounting of events, but, also, that it doesn&#8217;t really matter: kings vanish eventually, their deeds largely immaterial in the court of history. All that remains are stories.</p><p>Rushdie is a superb writer, in the style of Nabokov or Woolf, and his prose is always clever and fluid. But the story itself felt meandering, and could easily have been shortened a fair bit without diluting its message or impact or charm. The Indian epic format is done pretty well: there&#8217;s even the classic exiled-to-magical-forest-for-years-before-claiming-throne trope.</p><p>Rushdie survived the assassination attempt, though it left him with life-altering injuries. He&#8217;s still going strong: he published yet another <a href="https://en.wikipedia.org/wiki/Knife:_Meditations_After_an_Attempted_Murder">book</a> last month that details the attack and his subsequent recovery. The man is <a href="https://genius.com/Leslie-odom-jr-lin-manuel-miranda-phillipa-soo-christopher-jackson-original-broadway-cast-of-hamilton-and-renee-elise-goldsberry-non-stop-lyrics">non-stop</a>.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/victory-city">https://shivankaul.com/blog/victory-city</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Movie review: Valley of Saints]]></title><description><![CDATA[A review of 2012 film Valley of Saints set in Kashmir.]]></description><link>https://shivankaul.substack.com/p/movie-review-valley-of-saints</link><guid isPermaLink="false">https://shivankaul.substack.com/p/movie-review-valley-of-saints</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Sun, 28 Jan 2024 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>A review of 2012 film Valley of Saints set in Kashmir.</em></p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!swzy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!swzy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg 424w, https://substackcdn.com/image/fetch/$s_!swzy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg 848w, https://substackcdn.com/image/fetch/$s_!swzy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!swzy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!swzy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:250,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Theatrical poster for Valley of Saints&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Theatrical poster for Valley of Saints" title="Theatrical poster for Valley of Saints" srcset="https://substackcdn.com/image/fetch/$s_!swzy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg 424w, https://substackcdn.com/image/fetch/$s_!swzy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg 848w, https://substackcdn.com/image/fetch/$s_!swzy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!swzy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0c36f-db57-4814-b308-9ede1e897629_258x387.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p><em>Valley of Saints</em>, directed by Musa Syeed.</p><p>The Kashmiri reading group I&#8217;m a part of recently saw <a href="https://en.wikipedia.org/wiki/Valley_of_Saints_(film)">Valley of Saints</a>, a 2012 <a href="https://en.wikipedia.org/wiki/2012_Sundance_Film_Festival#Award_winners">Sundance-winning</a> docudrama indie film made by Musa Syeed set in <a href="https://en.wikipedia.org/wiki/Srinagar">Srinagar, Kashmir</a> which is where my family is from. We&#8217;ve been trying to consume more Kashmiri art and literature in the group; we previously read Suhas Munshi&#8217;s excellent travelogue <a href="https://www.bronxriverbooks.com/book/9780670091959">This World Below Zero Fahrenheit</a> and Agha Shahid Ali&#8217;s <a href="https://en.wikipedia.org/wiki/The_Country_Without_a_Post_Office">The Country Without A Post Office</a>.</p><p>It was nice watching a film on Kashmir that didn&#8217;t scream about Trauma and Violence in your face (though given that it&#8217;s Kashmir, both pulse in the background like a bassline). It was sweet-sad, gentle as a lake, rarely overflowing in its emotion. The movie is driven by the friendship between two childhood friends, Gulzar and Afzal, who make their living off of Srinagar&#8217;s beautiful but dying <a href="https://en.wikipedia.org/wiki/Dal_Lake">Dal Lake</a>. The two men plot to leave Kashmir in search of better opportunities, but a military curfew forces them to delay their plans. The arrival of an enigmatic Kashmiri-American woman named Asifa who is researching Dal Lake&#8217;s ongoing environmental collapse causes tension and rivalry to develop between the two men, leading Gulzar to make tough choices.</p><p>Gulzar and Afzal&#8217;s friendship has an almost homoerotic tone, as close childhood friendships often do. I&#8217;ve noticed that <a href="https://en.wikipedia.org/wiki/Elena_Ferrante">Elena Ferrante</a> frequently and brilliantly portrays that in her female friendships; it was refreshing to see that done for male friendship. The film&#8217;s cinematography does an excellent job contrasting the beauty of the <a href="https://en.wikipedia.org/wiki/Kashmir_Valley">Kashmir Valley</a>, with its neck-crick-inducing Greater Himalayan peaks and flower-speckled meadows, against a city slowly being swallowed by its own filth. The environmental catastrophe facing Dal Lake is sensitively presented with all its moral complexity: Asifa is frustrated with how the local people treat the lake, while Gulzar argues that its exploitation is crucial for people&#8217;s livelihoods. I could identify with Asifa&#8217;s anger: I remembered the disgust I felt seeing the open drainage and muddy water that plagues Srinagar. Yet, like her and the audience of the film, I have the privilege of being a tourist in a land gripped in humanitarian crisis. Asifa argues that the lake&#8217;s impending death will be fatal for those living off it, while Gulzar responds philosophically that all things die. A strain of nihilism is recurrent in the film: why preserve that which is doomed? The friendship between the two men, complicated by the arrival of a foreigner, seemed to me to metaphorically reflect the asundered love between Kashmiri Pandits and Muslims. But this interpretation might be influenced by my own identity, which could be inserting itself into a story where it is not necessary. One cannot help but symbolize everything in Kashmir as being about the larger conflict, which is indicative of how hard it is to make a film that is just about being Kashmiri.</p><p>Overall, I loved Valley of Saints, and would recommend it if you&#8217;re into slow and poignant dramas set in a conflict zone.</p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/movie-review-valley-of-saints">https://shivankaul.com/blog/movie-review-valley-of-saints</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[What they talk about when they talk about Privacy Engineering]]></title><description><![CDATA[The 5 privacy engineer archetypes hired by companies.]]></description><link>https://shivankaul.substack.com/p/privacy-engineering-archetypes</link><guid isPermaLink="false">https://shivankaul.substack.com/p/privacy-engineering-archetypes</guid><dc:creator><![CDATA[shivan]]></dc:creator><pubDate>Fri, 26 Jan 2024 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YDdb!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa87afcc5-f1f5-4e02-a1a5-d03b7c5432ee_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>The 5 privacy engineer archetypes hired by companies.</em></p><p>As a self-proclaimed privacy engineer, I build privacy-centric products for users and review features across the company to prevent privacy flaws from shipping. At a previous company, I worked on infrastructure, making sure that the company&#8217;s DNS was not leaking sensitive customer data in transit. Prior to that, I worked on creating privacy compliance tools for enterprise customers. Much like software engineers, these are all valid things a privacy engineer can work on! Privacy as an engineering function, as opposed to a purely legal and policy one, is a fairly new concept. Some big companies like Google had internal privacy teams, but it was only under threat of the incoming storm of privacy regulation led by <a href="https://gdpr-info.eu/">GDPR</a> and <a href="https://www.ftc.gov/enforcement/cases-proceedings/terms/1420">FTC consent decrees</a> in the US that everyone panicked about building privacy into products and engineering processes. Now, there&#8217;s high demand for privacy engineers, but every tech company interprets the role of a privacy engineer differently.</p><p>I&#8217;ll go over what motivates companies to hire privacy engineers, and what privacy engineer archetypes arise because of those needs.</p><h2>Why hire privacy engineers?</h2><p>Privacy engineering addresses the following business needs, arranged in roughly descending order of importance for most companies:</p><h3>Need #1: Comply with privacy laws</h3><p><a href="https://www.enforcementtracker.com/">GDPR</a> can allow levying of up to 4% of annual global revenue. <a href="https://en.wikipedia.org/wiki/California_Consumer_Privacy_Act#Sanctions_and_remedies">CCPA penalty</a> in California is more interesting: it&#8217;s capped at $7500 per violation, where every single customer whose privacy rights were violated would count as one violation. So if you have millions of users, good luck!</p><h3>Need #2: Stay out of the news</h3><p>A classic adage in the field of privacy engineering, a common cudgel used by privacy review teams: even if we&#8217;re not explicitly breaking the law with this feature, are we okay being on the front page of New York Times for this? The answer is typically no.</p><h3>Need #3: Build trust with users</h3><p>Customers like to use products they trust. If they believe the company will use their data responsibly, <a href="https://hbr.org/2015/05/customer-data-designing-for-transparency-and-trust">they spend more money</a>, which is behaviour companies like to encourage. Nothing <a href="https://techcrunch.com/2023/03/29/silence-gets-you-nowhere-in-a-data-breach">ruins that trust</a> like a data breach or evidence of sale of data to a third-party.</p><h3>Need #4: Build new privacy-preserving products</h3><p>People want privacy-preserving tools. Many brands have built their product strategy around privacy. Examples: Apple, Signal, Brave, your favourite VPN du jour. I also include privacy products that address enterprise needs here, such as a data redaction product marketed at companies looking to fufill Needs 1 through 3.</p><p>Not all companies have the same needs, and some companies have multiple needs. Now, on to the archetypes.</p><h2>Archetypes</h2><h3>Archetype #1: The Product Privacy Engineer</h3><p>Product privacy engineers are typically regular software engineers who work on features that explicitly enhance user privacy such as VPNs, encrypted messaging apps and user-facing privacy controls such as privacy dashboards.</p><p>Sadly, there aren&#8217;t <em>that</em> many companies which sell privacy as a product. The best product privacy work happens when privacy dovetails with functionality. Biased example, given that I work at Brave: ad-blocking not only enhances browsing experience by speeding up page loads and conserving battery but also blocks <a href="https://www.wired.com/story/security-roundup-even-cia-nsa-use-ad-blockers/">real security and privacy threats</a>. Another example is Apple&#8217;s <a href="https://support.apple.com/en-us/105078">Hide My Email</a> feature: email addresses are pernicious tracking vectors, so being able to have a unique one per-website is extremely good for protecting online privacy. Plus, it lets you manage the emails you&#8217;ve used across websites and apps and easily deactivate them, which is pretty useful in itself. Web browsers often do a lot of interesting product privacy work, probably because the Web is a tracking cesspool. Building new privacy products fulfills <a href="#need-4-build-new-privacy-preserving-products">Need #4</a>.</p><p>Privacy dashboards empower users to manage privacy preferences (should your activity be public on Strava?) and consent around things like data sharing (should Twitter use your data to show you personalized ads?). They also let users do things like request their data and ask for it to be deleted or exported. Software engineers who work on these dashboards may be members of a dedicated privacy engineering team or engaged on an as-needed basis by the Privacy Compliance or Legal teams. Giving users privacy controls goes towards being compliant with privacy laws such as GDPR and CCPA, so fulfills <a href="#need-1-comply-with-privacy-laws">Need #1</a>. It also makes users feel that their privacy rights are being protected and lets them exercise those rights, so I&#8217;d argue it also goes towards <a href="#need-3-build-trust-with-users">Need #3</a>.</p><h3>Archetype #2: The Privacy Infrastructure Engineer</h3><p>Privacy infrastructure work often takes the form of figuring out how data flows internally and externally and building shared privacy tooling for feature teams. These engineers are also sometimes called Privacy Architects.</p><p>To comply with <a href="https://en.wikipedia.org/wiki/Right_of_access_to_personal_data">data subject access requests</a>, it&#8217;s crucial to know where user data lives across the backend. User data tends to be like a fungus that quickly spreads its tendrils throughout the host database. Mapping data and its flows is complicated and never-ending work. Also, you need to figure out how to surface data to your feature teams without violating privacy laws. How long can feature teams keep data around? They could write their own cron jobs to delete data after the promised duration, but this quickly gets messy. At some point, you want to build a centralized way of handling data retention policies that teams can hook into.</p><p>Privacy infrastructure engineers also work on making sure data is encrypted, both at rest and in-transit. Check out <a href="https://engineering.fb.com/2019/05/29/security/service-encryption/">Meta&#8217;s blog posts</a> on how they deployed TLS in their datacenters. Sometimes, this kind of work needs your vendors and partners to be compliant with your technical privacy requirements. This can mean having to <a href="https://datatracker.ietf.org/doc/html/rfc9103">standardize</a> your privacy-enhancing protocol, and contribute to open source implementations.</p><p>This archetype helps with privacy compliance (<a href="#need-1-comply-with-privacy-laws">Need #1</a>) and reduces the PR fallout from a breach (<a href="#need-2-stay-out-of-the-news">Need #2</a>).</p><h3>Archetype #3: The Privacy Reviewer</h3><p>I&#8217;d say the vast majority of privacy engineers, especially at companies like Google and Meta, are hired to do technical privacy review. These engineers review specs and features for privacy issues and identify risks. They work across legal, product and engineering teams to make sure the company&#8217;s privacy stance is upheld. They think about things like data minimization (is this feature collecting more data then it needs?), retention (when is the data collected by this feature deleted?) and consent (is the user being given a meaningful choice about their data?). They advocate on behalf of the user. Sometimes privacy reviewers act as consultants for a larger organization, and sometimes they&#8217;re deeply embedded into one product line. Either way, the job is all about understanding features quickly by asking the right questions, developing long-term relationships, clearly outlining risk and suggesting improvements.</p><p>Privacy reviewers may end up setting privacy principles in order to ensure consistency in reviews across different reviewers. These principles are either officially encoded in a document or unofficially exist in their heads and/or Slack threads. These principles guide concrete technical decisions in product development, distinct from legal privacy policies. For example, a privacy principle could be &#8220;we drop all IP addresses at the WAF layer for HTTP requests containing user data but not otherwise&#8221;; the privacy <em>policy</em> corollary for this could be something generic like &#8220;We do not store any user-identifying information&#8221;.</p><p>Privacy reviewers inevitably see common patterns cropping up in the specs they review. For example, they might realize that a lot of product teams are needing to build their own bespoke way of deleting data. This insight leads to generalized privacy infrastructure (see previous section) being built. Roles can be fluid!</p><p>Privacy review helps product teams comply with privacy laws (<a href="#need-1-comply-with-privacy-laws">Need #1</a>), identify if a feature might &#8220;feel&#8221; sketchy to users (<a href="#need-2-stay-out-of-the-news">Need #2</a>), and reduce risk of privacy exposure that might ruin user trust (<a href="#need-3-build-trust-with-users">Need #3</a>). This is important work!</p><h3>Archetype #4: The Privacy Red Teamer</h3><p>This is related to privacy review, but with a more adversarial mindset and done <em>after</em> the product is deployed. Similar to security red teams, privacy red teams take an existing product or feature and try to &#8220;break&#8221; it by finding privacy vulnerabilities. For example, if a user presses the &#8220;Delete My Data&#8221; button on their privacy dashboard, is that data actually scrubbed from all database tables on the backend? If a company claims that telemetry data is &#8220;anonymized&#8221; (<a href="https://www.theguardian.com/technology/2019/jul/23/anonymised-data-never-be-anonymous-enough-study-finds">whatever that means</a>), can a particular user&#8217;s identity be reconstructed using telemetry data points? Even if one particular feature is working as intended, things can go wrong in the interaction between systems. This is where privacy red teams shine: it&#8217;s hard to grasp all possible interactions before code hits production and data hits servers. For example, did the Marketing team accidentally start using data that was collected for product improvement purposes? Can we automatically detect when that happens? Privacy red teams report their findings to folks working on privacy infrastructure to prevent bad stuff from happening again, and to privacy reviewers so that future bad stuff is caught in the review stage.</p><p>AFAIK, only Meta, Google and TikTok have privacy red teams. It&#8217;s definitely a bigger company problem that happens when there is a Cambrian explosion in the surfaces where user data is ingested and it starts becoming hard to <em>prima facie</em> identify all privacy risks.</p><p>This role helps to fulfill the same needs as privacy review (Needs <a href="#need-1-comply-with-privacy-laws">#1</a>, <a href="#need-2-stay-out-of-the-news">#2</a> and <a href="#need-3-build-trust-with-users">#3</a>).</p><h3>Archetype #5: The Privacy Incident Responder</h3><p>Review and red-teaming notwithstanding, privacy incidents happen! Privacy incident response teams get involved when there&#8217;s a risk or occurence of user data leakage. They then work with other privacy teams to make sure the incident doesn&#8217;t happen again.</p><p>Privacy incident response is classically a legal problem: there are regulations around disclosure of exposure of user data. Privacy incident response teams make sure those legal obligations are fulfilled, so this job role helps with <a href="#need-1-comply-with-privacy-laws">Need #1</a>. It also helps to retain trust (well, mitigate loss) by informing users quickly and clearly of privacy incidents (<a href="#need-3-build-trust-with-users">Need #3</a>).</p><h2>Conclusion</h2><p>The field of privacy engineering is rapidly evolving, and it&#8217;s a fun time to be a privacy engineer. Privacy engineers often wear multiple hats and work across the roles I outlined: I&#8217;ve particularly enjoyed doing a combination of engineering, policy and review. Plus, it just feels good when your work is aligned with users&#8217; interests. Other privacy engineers I know feel similarly.</p><p>Do you work on something else as a privacy engineer? Let me know!</p><p>&#8230;</p><p><em>Big thanks to <a href="https://www.linkedin.com/in/nandita-narla">Nandita Rao Narla</a> and <a href="https://www.linkedin.com/in/jay-averitt">Jay Averitt</a> for proofreading and suggestions.</em></p><div><hr></div><p><em>Originally published at <a href="https://shivankaul.com/blog/privacy-engineering-archetypes">https://shivankaul.com/blog/privacy-engineering-archetypes</a>.</em></p>]]></content:encoded></item></channel></rss>