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,…
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…
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'
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…
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…
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…
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.…
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.
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…
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…
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.
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…
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…
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…
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…
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
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…
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…
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…
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…
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.
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…
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
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.
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.
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…
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…
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 .…
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,…
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…
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…
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,…
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…
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…
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…
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.
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…
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 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…
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…
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’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…
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
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 ()…
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 !
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.
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’t cast shadows, giving the urban landscape an eerie appearance. Hawaii is the only state in the US where the sun’s rays are perpendicular to the surface of Earth. It’s called a subsolar point . Via…
How to have shared state between different instance of a class without a singleton pattern. The ‘Singleton’ 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’s NOT a good idea – it displays different sorts of problems in different object-models. What we should really WANT,…
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.
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…