RSS Amplifier

Blog

sandipb.net

Recent content on sandipb.net

blog.sandipb.netRSS feed ↗50 posts

Latest posts

Shocking Details from the OpenAI–Hugging Face Incident

If you are in the tech industry and have even a mild interest in the state of the industry, I think this is serious enough for you to drop everything and watch this video. It is fairly understandable even without being deeply conversant with InfoSec terminology. Simon Willison has a brief timeline of the incident on his blog if you would rather read it. This is a huge milestone for the tech world,…

Codex Gets Its AskUserQuestion

For a long time, while using Codex, I missed the AskUserQuestion tool from Claude Code . Codex 0.88.0 , released on January 21, 2026, added its rough equivalent, request_user_input . Initially, it worked in Plan and Pair Programming modes, but not in the regular coding modes. After Codex simplified its public modes to Default and Plan, the tool became Plan-only. Codex 0.106.0 , released on…

Homebrew Can Manage npm Packages for You

If, like me, you manage your Homebrew installations with a dotfile-style Brewfile, you might not know that it can manage globally installed npm utilities too. This is all you need to add: npm '@agentclientprotocol/claude-agent-acp' npm '@agentclientprotocol/codex-acp'

Codex's Built-In Web Search Can Return Stale Results

I ran a side-by-side comparison of Codex using its built-in web search and using Exa through MCP. The difference wasn’t huge, but it was there: Codex’s built-in search returned a result that was about four days stale, while Exa found the latest release details. I invoked Exa with @Exa for this search. It found the July 29 release. Codex’s built-in search returned the July 25…

Codex Does Not Support disable-model-invocation in Skill Frontmatter

I first ran into this a day earlier, when Codex greeted me on startup with Warning: Exceeded skills context budget . That sent me down a rabbit hole: why were my skills being loaded into context when most already had disable-model-invocation: true in their frontmatter? Really annoyed to just find out that Codex doesn’t support the disable-model-invocation field in skills. Instead, it wants a…

My Preferred Way to Use AI Inside Obsidian

The best thing about Obsidian’s “ File over App ” philosophy is that you don’t need any special support from the app to manage your content. You can open the vault folder, or even a single file, in an AI agent or an agentic IDE and start editing right away. In fact, half the time, that is the way I work with my notes in Obsidian while using an AI agent. However, sometimes, while…

AI Models Need LTS Releases

GitHub quietly announced something interesting in its Copilot change log: GPT-5.3-Codex is now its first long-term support model . GPT-5.3-Codex is also our first long-term support (LTS) model, in partnership with OpenAI. LTS models are guaranteed to be available for a full 12 months from the model’s launch date, giving enterprises the stability they need for internal security and safety reviews.…

How Grafana's Yesterday Preset Works

When I set the time picker in Grafana to Yesterday , I noticed something curious: both the From and To fields were set to the same value — now-1d/d . How could the same expression define both the start and end of a time range? Curious, I dug into the documentation and source code to understand how this works.

Social media crashed a bank in a day, agents will do it before we wake up

In 2023, the Silicon Valley Bank (SVB) had a historic bank run, with investors withdrawing $42 billion in a single day . The Federal Reserve’s postmortem report essentially blamed two modern technologies — social media and online banking for the incident. the combination of social media, a highly networked and concentrated depositor base, and technology may have fundamentally changed the…

TIL Hugo can figure out image dimensions at build time

I’d been hardcoding width and height attributes in my Hugo templates to prevent layout shift. It worked fine, but it was tedious — every time I changed an image, I had to look up the new dimensions and update the template by hand. Today, I had to add a new image to the sidebar, and I felt lazy enough to ask copilot to find the dimensions for me and insert them into the template. It instead…

Terraform MCP server makes a huge difference to TF code accuracy

I have wasted too many tokens getting AI editors to work well with Terraform code. The authoritative JavaScript-heavy provider documentation website makes it impossible to provide as a suitable reference to AI editors. Even adding those links to Cursor doc index doesn’t work. So you get hallucinations and completely wrong code from even the best of the models.

Setting Up a Private Helm Chart Repository with Chartmuseum

I have been using Helm charts, like everyone else, for the Kubernetes cluster in my homelab. Until a few months back, I never gave a thought to the reliability of the Helm chart repositories I was using. And then the Bitnami news dropped where they announced that they were going to stop supporting their Helm chart repositories. Everyone has been scrambling to handle this situation, and most are…

Ubuntu Wi-Fi 5GHz Issue on Raspberry Pi 5

I normally install Ubuntu on my Raspberry Pi machines because I am comfortable with its ecosystem. Most of the time though, I have been using these boxes connected to my network via Ethernet. Recently, I got a new Raspberry Pi 5, and as usual, I installed Ubuntu on it. This time I used the official HAT to install the OS on an NVMe drive. The Raspberry Pi imager tool does a great job of setting up…

Integrating Homebrew bash completion on Linux with system completions

I like to use Homebrew on my Linux development machine as well, instead of random apt packages which may or may not be up to date for common tools. One annoyance I found a solution for, is getting the bash completion for Homebrew commands to work on Linux. The problem is that Ubuntu (and other Linux distributions) have their own bash completion scripts for system commands. But the way most bash…

System Design - Tap Compare

From the ByteByteGo post on Reddit Comments migration: Reddit used a testing technique called “tap compare” for read migrations. The concept is straightforward: A small percentage of traffic gets routed to the new Go microservice. The new service generates its response internally. Before returning anything, it calls the old Python endpoint to get that response too. The system compares both…

Using UV to install Python

Interesting that I can now use uv to install Python. They have a guide . You can now install the latest Python 3.14 alpha with uv pic.twitter.com/yw24LKW7nq — Charlie Marsh (@charliermarsh) January 7, 2025

Taskfile bash completion in homebrew

A tip for anyone using Taskfile and Homebrew on macOS. Actually this is more of a note to self, because I didn’t pay attention to this earlier. Homebrew has two versions of bash-completion: bash-completion and bash-completion@2 . The former is meant for bash 3.x and the latter is for bash 4+. Normally it hasn’t mattered to me till now, because most formulas set up compatible completion…

Using an SSH jump host for Ansible

I was working from outside home today, trying to push out changes to a bunch of my homelab servers. As usual I was using Ansible, but I was connected over tailscale to the home network. Now normally I would just create a socks/http proxy to one of my home machines and set the proxy environment variable like HTTP_PROXY and most apps would just work. But Ansible doesn’t seem to respect that…

AI running out of original human generated content

The AI gold rush is hitting a ‘bottleneck’ that could spell disaster for Google and Meta A new study released Thursday by research group Epoch AI projects that tech companies will exhaust the supply of publicly available training data for AI language models by roughly the turn of the decade—sometime between 2026 and 2032. … In the longer term, there won’t be enough new blogs, news articles…

Using the code cli in VS Code Remote extension

One of the major reasons I switched to VS Code completely some years back is its excellent extension system, in particular the seamless remote SSH editing extension. Remote SSH extension is really cool! Using a local editor on a remote filesystem without fiddling with sshfs or the like, managing to use extensions like Python, Go and Copilot, all setup and configured locally but running on content…

Using Giscus for commenting on this blog

I had removed disqus comments from my blog a few years back when I noticed the horrible privacy issues with Disqus. But I always felt that I was missing out on some feedback I had received from visitors in the past, especially when I would benefit from correcting my mistakes.

Age encryption cookbook

One of the niftiest tools that I have been using a lot nowadays is the deceptively simple encryption/decryption command line tool called age by Filippo Valsorda . Encrypting secrets using keypairs instead of a single passphrase is obviously a more secure option, as it separates the concerns for encryption and decryption. Therefore you can share around the public key without fear for others to…

Converting audio to text from command line using commercial and opensource tools

For a while now, I have been wanting to see the options I have today to convert speech to text at the command line. Lots of commercial options exist today for doing that, but I also wanted to check out open source options. In this experiment, I decided to compare: An opensource option: spchcat A commercial option - Google Cloud’s ML Speech API

Decrypting and concatenating PDFs with qpdf

I wanted to quickly jot down some of the PDF tasks that the wonderful qpdf has been helping me do. This ranges from merging multiple PDF files to storing decrypted versions of annoying PDFs sent by some banks. I used to use pdftk till some time back, but it had a lot of dependencies which were a pain to install. I exclusively use qpdf now instead.

Publishing helm charts on Artifacthub

As part of my journey in learning Kubernetes this year, I ventured today in pushing my first tiny helm chart to Artifacthub. I had been using custom made charts for a couple of months now, but mostly in the CI/CD environment of my company. Packaging a chart for public consumption needed me to learn a few more things.

Disabling comments and Google Analytics

So, after ~20 years of maintaining this blog, I decided to disable comments entirely on the posts here. And turning off Google Analytics. This was primarily driven by a recent privacy test I did on the blog, and to my utter shock, almost a dozen different websites seem to be contacted with every page load. I generally expected Google (for the analytics) and Disqus (for the comments) to be the…

Using Mac keychain to store and retrieve Ansible vault passwords

When using Ansible for my home lab, an initial problem was about how to keep sudo passwords for my various machines in an practical manner (I really don’t like the idea of password-less sudo even in my homelab). The remote users used for my ansible logins to each of my machines are different, and can be managed via the inventory file. But the sudo passwords for them are not the same, and it…

Installing a specific version of a Homebrew Formula

From time to time, I have felt the need to install a specific version of a Homebrew formula. Like the other day, I was investigating whether a particular problem I was facing with Podman was because of a version bump from 2.x to 3.x. At some point in the past, a way around it was to find the formula file at a particular commit of the Homebrew tap, and directly install it via brew install $URL .…

Using Podman as a Docker Desktop alternative using Vagrant

So the tech world went a little crazy today, as usual ignoring more consequential problems happening in the world. Docker posted a notice saying that its Mac and Windows desktop clients will no longer be free for anybody other than individuals and small companies. Here is The Register : Docker will restrict use of the free version of its Docker Desktop utility to individuals or small businesses,…

Notes on the httprouter Golang library

For most simple to moderately complex web servers in Golang, I have always preferred to use the standard net/http library, laboring through the parsing of RequestPaths and query parameters when necessary. But when the boilerplate code for request parsing starts obscuring the business logic, I tend to look out at other libraries. I however have always hesitated using too heavy a framework to keep…

Automating MySQL GTID Migration With Ansible

MySQL 5.6 onwards introduced GTID based replication drastically simplifying replication setup and increasing reliability. New MySQL cluster 5.6+ setups are already done with GTID enabled by default. But if you are one of those people who migrated from a pre-5.6 MySQL version, you probably avoided enabling GTID to make the upgrade easier. In such a situation, typically, you would upgrade the slaves…

Creating a Certificate Authority in 2020 for Your Soho

I have a couple of systems at home which provide web services, like my Intel NUC and my Synology NAS, and I have been wanting for a while to move all of them to a proper https only environment. But my biggest hurdle for doing that, has been the enormous pain in managing certificates in a way that makes everybody - the servers, the browsers, the local http clients happy. From my previous attempts,…

Open Every Link in a Web Page In a New Tab

Found this nifty trick in a github comment . If you add this bit of code in the <head> section of an HTML 5 page, clicking on every link will open in a new tab. < base target = '_blank' > This tag is mostly used to set a URL to resolve all relative links on a page. But it offers an additional attribute target to set a default target policy for links. You can, of course, override the target…

Ansible privilege escalation with expect when you don&#39;t have root shell privileges

The default Ansible privilege escalation mechanism requires broad sudo privileges. If your production environment gives you sudo access but bars you from getting a root shell, you are out of luck. As, the doc says - you cannot expect Ansible to work when sudo commands are restricted . Privilege escalation permissions have to be general. Ansible does not always use a specific command to do…

Integer maths in Go using constants with exponential notation

I seem to learn more about the nuances of the Go language every other day. Sometime back, I had looked at how Go untyped constants work during maths operations with typed variables . I just found another significant part of the spec that I had previously glossed over, this one is also about untyped constants - numeric constants in Go live in an unified space with arbitrary precision and a fungible…

Runit, Chpst and ulimit defaults

So I ran into this problem at work today with an runit based service breaching open files limit. My first thought was to increase the system ulimit for nofile in /etc/security/limits.conf . I changed this from 30k to about 60k. But strangely, the service still keep dying.

Using Zap - Working With Global Loggers

Sometimes instead of creating a logger and then passing it around, it is convenient to just use a global logger. The standard log library allows you to both create a custom logger using log.New() or directly use a standard logger instance by calling the package helper functions log.Printf() and the like. zap provides such a functionality as well using zap.L() and zap.S() , however using them…

Using Zap - Creating custom encoders

The various implementations of field encoders provided in zap can sometimes feel inadequate. For example, you might want the logging output to be similar to that in syslog or other common log formats. You might want the timestamps in the log to ignore seconds, or the log level to be wrapped within square brackets. To have your own custom formatters for the metadata fields you need to write custom…

Using Zap - Creating custom loggers

Using the logger presets in zap can be a huge time saver, but if you really need to tweak the logger, you need to explore ways to create custom loggers. zap provides an easy way to create custom loggers using a configuration struct. You can either create the logger configuration using a JSON object (possibly kept in a file next to your other app config files), or you can statically configure it…

Using Zap - Simple use cases

I was intrigued when Uber announced zap , a logging library for Go with claims of really high speed and memory efficiency . I had tried structured logging earlier using logrus , but while I did not experience it myself, I was worried by a lot of folks telling me about its performance issues at high log volumes. So when zap claimed performance exceeding the log package from standard library, I had…

Deploying Hugo With Netlify

I admit I had not paid much attention to Netlify earlier. It sort of seemed like yet another web performance related startup. But on reading Fatih&rsquo;s article on hosting Hugo on Netlify , it piqued my interest. A CDN/hosting service which puts your content in caches all around the world, and triggers Hugo (and bunch of other common scripts) on Github commits? And all this for free? Sounds too…

Settling on Vscode for Go

Soon after I reviewed GoLand , I discovered VS Code - a general purpose editor with superlative support for Go . And I have been impressed enough to stay. VSCode

Go Static Typing &#39;Magic&#39;

As I understand Go more, some of the concepts tend to make my head hurt. Sometimes, innocent examples in various tutorials hide such deep concepts, that it takes a while for me to decode it all. Here is an example. In various tutorials, pauses are made using time.Sleep() . The first time I saw an example like the following, it made me stop in my tracks. package main import ( 'time' ) func main ()…

Jetbrains Finalizes Name for their Go IDE

Seems like Jetbrains has finally ditched that weird name for their Go IDE and changed it to a more palatable, but not really very inventive version (come on, I think PyCharm is a pretty nice name for a Python editor). Gogland is now GoLand !

404: Not found

Sorry. I have nothing for you at this URL. Image credit: Max Pixel

Troubles With Hugo as Well

Hugo I have been using Hugo as a static website generator for a while. I love the speed, coming from its Go origins. I love a static website generator for the peace-of-mind it gives me (No did I forget to update my XXX blog software after that bug came out? ). But of course, it is not all peachy.

Lahaia noon at hawaii

When the sun is directly overhead in Hawaii, it looks like a bad video game render The sun is exactly overhead twice a year in Lahaina, Hawaii, once in May and once in July. Poles don&rsquo;t cast shadows, giving the urban landscape an eerie appearance. Hawaii is the only state in the US where the sun&rsquo;s rays are perpendicular to the surface of Earth. It&rsquo;s called a subsolar point . Via…

The Borg design pattern

How to have shared state between different instance of a class without a singleton pattern. The &lsquo;Singleton&rsquo; DP is all about ensuring that just one instance of a certain class is ever created. It has a catchy name and is thus enormously popular, but it&rsquo;s NOT a good idea &ndash; it displays different sorts of problems in different object-models. What we should really WANT,…

Documenting both class and constructor in Sphinx

I lost an hour of my life today trying to figure out why Sphinx would not document a class inside a module specified by :automodule: . I learnt two things today.

Using Python to update a required field while performing a transition in Jira

This might be a very esoteric topic for most people, but since I could not find information about this anywhere, I decided to document this in a post. Here is the problem. I use Jira at work, and today, I needed to close a bunch of tickets based on a search result. Now, searching or doing batch operations is simple enough from the browser, but a small detail made the exercise impossible via the…