<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Nikhil&#39;s blog</title>
    <link>https://nikhilism.com/</link>
    <description>Recent content on Nikhil&#39;s blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 29 Jan 2026 06:41:05 -0800</lastBuildDate>
    <atom:link href="https://nikhilism.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Nudge: A skill to offer in-line feedback to coding agents</title>
      <link>https://nikhilism.com/post/2026/nudge-skill/</link>
      <pubDate>Thu, 29 Jan 2026 06:41:05 -0800</pubDate>
      <guid>https://nikhilism.com/post/2026/nudge-skill/</guid>
      <description>I have been using Coding agents a bunch, particularly since Opus 4.5 and GPT 5.2 came out.&#xA;I have a long post about my general LLM coding experiences coming out soon. This is a quick tip I have been recently using.&#xA;One of the UX affordances I miss the most about the agent iteration cycle is not being able to quickly offer in-line suggestions to the code changes proposed by the LLM, while staying in the context of the current conversation.</description>
    </item>
    <item>
      <title>A practical introduction to kill-safe, concurrent programming in Racket</title>
      <link>https://nikhilism.com/post/2023/racket-concurrency/</link>
      <pubDate>Fri, 24 Nov 2023 21:35:08 -0800</pubDate>
      <guid>https://nikhilism.com/post/2023/racket-concurrency/</guid>
      <description>I&amp;rsquo;ve written a long tutorial exploring the user of Racket&amp;rsquo;s Concurrent ML (CML) inspired concurrency paradigm to write an API wrapping git-cat-file. It is meant to serve as an introduction to kill-safety and CML concurrency, while assuming some existing knowledge of Racket or other Schemes. I found that there weren&amp;rsquo;t a lot of resources beyond the reference documentation that explained how to put these APIs together, and I hope this can fill that hole.</description>
    </item>
    <item>
      <title>About</title>
      <link>https://nikhilism.com/about/</link>
      <pubDate>Sat, 30 Sep 2023 15:04:41 -0700</pubDate>
      <guid>https://nikhilism.com/about/</guid>
      <description>I currently work at Skydio.&#xA;I write about my travels at Life in High Places.&#xA;My CV.&#xA;All opinions and thoughts on this website are my own and do not represent the views of my employer or anyone else.&#xA;Colophon This blog is powered by Hugo and the Archie theme.</description>
    </item>
    <item>
      <title>Racket Beyond Languages</title>
      <link>https://nikhilism.com/post/2023/racket-beyond-languages/</link>
      <pubDate>Fri, 29 Sep 2023 08:45:43 -0700</pubDate>
      <guid>https://nikhilism.com/post/2023/racket-beyond-languages/</guid>
      <description>Chris Krycho, a person I really respect, is learning Racket to build programming languages. Racket is generally slotted as a language to build languages. The popular books focus on Racket innovations related to constructing Domain Specific Languages. This include hygienic macros, the Racket loading and evaluation phases and the module system. While it is uniquely suited for creating languages 1, Racket is also a research vehicle for a large body of programming language research.</description>
    </item>
    <item>
      <title>Working through Gossip Glomers in Racket</title>
      <link>https://nikhilism.com/post/2023/gossip-glomers-racket/</link>
      <pubDate>Sat, 26 Aug 2023 14:26:28 -0700</pubDate>
      <guid>https://nikhilism.com/post/2023/gossip-glomers-racket/</guid>
      <description>Gossip Glomers is a series of distributed systems programming challenges from Fly.io. It uses Maelstrom, a platform for describing test workloads that can run your programs as distributed systems nodes. Maelstrom workloads can provide inputs to these nodes (as if they are arriving over a network), inject delays and partitions and then check that your system still satisfies the invariants of each challenge.&#xA;So far I have made it through 3 of the 6 challenges1.</description>
    </item>
    <item>
      <title>Python Gotcha: Idiomatic file iteration has bad performance</title>
      <link>https://nikhilism.com/post/2023/python-idiomatic-file-iteration-bad-performance/</link>
      <pubDate>Thu, 11 May 2023 19:23:23 -0700</pubDate>
      <guid>https://nikhilism.com/post/2023/python-idiomatic-file-iteration-bad-performance/</guid>
      <description>Here is a performance footgun I encountered at work in a more complicated form.&#xA;Python allows iterating over a file object. However, this iteration is defined as yielding lines, regardless of if the file is a text or binary file. In fact IOBase specifically says:&#xA;IOBase (and its subclasses) supports the iterator protocol, meaning that an IOBase object can be iterated over yielding the lines in a stream. Lines are defined slightly differently depending on whether the stream is a binary stream (yielding bytes), or a text stream (yielding character strings).</description>
    </item>
    <item>
      <title>Remote Dbus Notifications over SSH</title>
      <link>https://nikhilism.com/post/2023/remote-dbus-notifications/</link>
      <pubDate>Wed, 29 Mar 2023 21:39:34 -0700</pubDate>
      <guid>https://nikhilism.com/post/2023/remote-dbus-notifications/</guid>
      <description>I often tack on notify-send at the end of a long running command to get a desktop notification when the command is done.&#xA;./long-running-build-command; notify-send &amp;#34;Build done&amp;#34; notify-send uses the Desktop Notification spec that relies on DBus to propagate a request to show a notification. This is a widely supported standard in the Linux ecosystem powering all notifications, regardless of which desktop environment you use.&#xA;However my simple approach doesn&amp;rsquo;t work as soon as I&amp;rsquo;m logged into a remote machine.</description>
    </item>
    <item>
      <title>Nuphy Air75 Wireless Receiver does not work on Linux</title>
      <link>https://nikhilism.com/post/2023/nuphy-air75-wireless-linux/</link>
      <pubDate>Tue, 03 Jan 2023 21:16:35 -0800</pubDate>
      <guid>https://nikhilism.com/post/2023/nuphy-air75-wireless-linux/</guid>
      <description>I recently bought a Nuphy Air75 and ran into a weird issue on Linux.&#xA;The Air75 can be connected to the computer in 3 different ways:&#xA;Wired Bluetooth USB Wireless Receiver (comes with the keyboard) When I connected via wired or Bluetooth, the Fn key would correctly work. That is, F12 would map to F12 and Fn + F12 would increase the volume. 1 However, when I used the wireless receiver, the Fn key was never registered, and the keyboard would only send F12.</description>
    </item>
    <item>
      <title>A Racket program to decrypt files encrypted with Synology Cloudsync</title>
      <link>https://nikhilism.com/post/2022/synology-decrypt/</link>
      <pubDate>Sat, 31 Dec 2022 12:45:05 -0800</pubDate>
      <guid>https://nikhilism.com/post/2022/synology-decrypt/</guid>
      <description>I&amp;rsquo;ve been playing with Racket for the past few weeks.&#xA;While I haven&amp;rsquo;t explored all the language-oriented-programming aspects yet, I&amp;rsquo;ve created a simple program to decrypt files encrypted with Synology Cloudsync. It is available as synology-decrypt (The Racket version).&#xA;As I&amp;rsquo;ve written before, I use Backblaze to backup files to the cloud. My Synology NAS encrypts these files before uploading them using Cloudsync. The decryption software is not open source, and is a Windows and macOS-only GUI app.</description>
    </item>
    <item>
      <title>RAII Footguns in Rust and C&#43;&#43;</title>
      <link>https://nikhilism.com/post/2021/raii-footguns-rust-cpp/</link>
      <pubDate>Sat, 23 Oct 2021 10:06:14 -0700</pubDate>
      <guid>https://nikhilism.com/post/2021/raii-footguns-rust-cpp/</guid>
      <description>I&amp;rsquo;ve been getting back into C++ at Skydio, and I&amp;rsquo;ve twice lost several hours to debugging weird code behavior because of an RAII footgun in the language. A similar footgun is present in Rust, and I&amp;rsquo;ve been bitten by that too, so I figured I&amp;rsquo;d write down both.&#xA;RAII classes are often used to keep resources alive or hold locks for a given scope. There observable side-effects usually occur only in the constructor and destructor.</description>
    </item>
    <item>
      <title>Using a Digital Ocean Droplet to backup Google Takeout to Backblaze B2</title>
      <link>https://nikhilism.com/post/2021/google-takeout-backblaze-remote/</link>
      <pubDate>Wed, 07 Jul 2021 12:41:20 -0700</pubDate>
      <guid>https://nikhilism.com/post/2021/google-takeout-backblaze-remote/</guid>
      <description>Notes on using a Digital Ocean Droplet to copy Google Takeout data to Backblaze B2, for my own reference and in case they are useful to others. This uses rclone to perform the sync.&#xA;Google Takeout allows exporting all your Google data, but requires a modern browser, with GUI and JS. The total data can be huge (~36GB for my last export), so downloading it to my local machine and uploading it can be slow (even on a Gigabit connection).</description>
    </item>
    <item>
      <title>Tracking the Books I&#39;ve Read Using Svelte, XState and Quagga</title>
      <link>https://nikhilism.com/post/2021/tracking-books-i-read-using-svelte-xstate-quagga/</link>
      <pubDate>Wed, 12 May 2021 15:43:28 -0700</pubDate>
      <guid>https://nikhilism.com/post/2021/tracking-books-i-read-using-svelte-xstate-quagga/</guid>
      <description>I read a fair amount of books, but I&amp;rsquo;ve never kept track of them except in my brain because the friction to track books is just too high. Recently, I wondered how easy it would be if I could just use my phone to scan the barcode on the back of the book, and that would automagically insert the book into a list.&#xA;The theory Each book is identified by a ISBN, a 13-digit number that is usually printed on the back of the book using a barcode.</description>
    </item>
    <item>
      <title>Useful Hammerspoon Tips</title>
      <link>https://nikhilism.com/post/2021/useful-hammerspoon-tips/</link>
      <pubDate>Wed, 05 May 2021 14:19:41 -0700</pubDate>
      <guid>https://nikhilism.com/post/2021/useful-hammerspoon-tips/</guid>
      <description>Hammerspoon is a macOS automation framework that allows you to hook into all sort of OS interfaces using Lua scripts. People use it for all sorts of automations, with key remappings and quick window switchers being the most common applications. There are some crazier applications like using voice to control scroll bars! I&amp;rsquo;m going to describe some ways I use it that are uncommon.&#xA;Reducing procrastination I often run build steps or unit tests that are slow enough that I can&amp;rsquo;t just twiddle my thumbs at the terminal, but fast enough that I can&amp;rsquo;t get into another cognitive task.</description>
    </item>
    <item>
      <title>Improving the Credit Freeze user experience</title>
      <link>https://nikhilism.com/post/2021/improving-the-credit-freeze-user-experience/</link>
      <pubDate>Mon, 03 May 2021 10:27:17 -0700</pubDate>
      <guid>https://nikhilism.com/post/2021/improving-the-credit-freeze-user-experience/</guid>
      <description>I have credit freezes put on my credit records with all 3 US credit reporting companies. These are supposed to help a little with identity theft, but the UI surrounding them makes for a very bad experience.&#xA;The way it works, one places a freeze at each company, but then one is expected to know in advance when a credit check is going to happen and temporarily lift the freeze! This almost always causes friction.</description>
    </item>
    <item>
      <title>Experiencing Smalltalk</title>
      <link>https://nikhilism.com/post/2021/experiencing-smalltalk/</link>
      <pubDate>Sun, 14 Feb 2021 20:30:46 -0800</pubDate>
      <guid>https://nikhilism.com/post/2021/experiencing-smalltalk/</guid>
      <description>In late August 2020 I read The Dream Machine and it is my favorite book of 2020. It is an incredible overview of a sliver of computer pioneers in the 1960s-1980s and how one man was instrumental in tying all their narratives together. One of the strands the book follows is the group at PARC (and other places) that firmly believed in the notion of interactive computing. Over the last year, I&amp;rsquo;ve repeatedly been introduced to this strand of thinking.</description>
    </item>
    <item>
      <title>Return on Data: When governments fail to make surveillance useful</title>
      <link>https://nikhilism.com/post/2020/return-on-data/</link>
      <pubDate>Sun, 11 Oct 2020 18:34:02 -0800</pubDate>
      <guid>https://nikhilism.com/post/2020/return-on-data/</guid>
      <description>There is this common refrain about how companies have data about you and could do bad things. Yet governments often pass surveillance laws that are much worse, and by definition, you can&amp;rsquo;t &amp;ldquo;vote with your wallet&amp;rdquo; for them. So in a world where I&amp;rsquo;m already giving data to third parties, it is useful to ask what I get in return.&#xA;If we are talking about corporations, we get ads! Yes, but we also get:</description>
    </item>
    <item>
      <title>Mystery Knowledge and Useful Tools</title>
      <link>https://nikhilism.com/post/2020/mystery-knowledge-useful-tools/</link>
      <pubDate>Mon, 05 Oct 2020 17:22:11 -0700</pubDate>
      <guid>https://nikhilism.com/post/2020/mystery-knowledge-useful-tools/</guid>
      <description>Hillel Wayne has a great newsletter, and one recent post had this observation:&#xA;The abstract concept here is knowledge or skills that&#xA;You are unlikely to discover on your own, neither through practice and reflection nor by observing others apply it. Once somebody tells you about it, you can easily learn and apply it. Once you can use it, it immediately gives you significant benefits, possibly to the point of raising your expertise level.</description>
    </item>
    <item>
      <title>Rust 2021</title>
      <link>https://nikhilism.com/post/2020/rust-2021/</link>
      <pubDate>Sat, 03 Oct 2020 12:16:57 -0700</pubDate>
      <guid>https://nikhilism.com/post/2020/rust-2021/</guid>
      <description>This is a contribution to the Rust 2021 Roadmap Blogs request.&#xA;As a developer using Rust in a proprietary, polyglot code base, I want Rust to improve non-Cargo builds My story comes from spending the better part of a year migrating a roughly 700,000 line code base (and several hundred upstream dependencies) to build using Bazel circa 2019. As Rust becomes more popular, a large chunk of developers will want to use it as a complement to existing code in other languages.</description>
    </item>
    <item>
      <title>A Bazel Persistent Worker for Rust</title>
      <link>https://nikhilism.com/post/2020/bazel-persistent-worker-rust/</link>
      <pubDate>Sun, 20 Sep 2020 12:09:41 -0700</pubDate>
      <guid>https://nikhilism.com/post/2020/bazel-persistent-worker-rust/</guid>
      <description>Bazel persistent workers are a cool feature that allow Bazel to start up &amp;ldquo;compiler&amp;rdquo; instances that can accept multiple build requests. This brings benefits like saving startup time, saving the time to parse a standard library or share some cache across compiler invocations. This allows slight speedups in rebuilds, which can be valuable in speeding up the developer iteration cycle.&#xA;This is best exemplified in the existing persistent workers:&#xA;The Java and Scala rules benefit from paying the cost of process startup only once (warming up the JVM and so on.</description>
    </item>
    <item>
      <title>A Future is a Suspending Scheduler</title>
      <link>https://nikhilism.com/post/2020/futures-suspending-scheduler/</link>
      <pubDate>Sat, 20 Jun 2020 08:57:42 -0700</pubDate>
      <guid>https://nikhilism.com/post/2020/futures-suspending-scheduler/</guid>
      <description>Introduction This is another blog post related to the Build Systems à la Carte paper. See Using type-classes to model the expressivity of build systems for the first one.&#xA;The paper proposes splitting build systems into two components:&#xA;Rebuilders decide when to rebuild a particular key (file). Schedulers decide how to rebuild multiple keys - handling dependencies while maintaining correctness and efficiency. Schedulers come in 3 flavors (see Section 4):</description>
    </item>
  </channel>
</rss>
