Staff Software Engineer with decade plus experience building and managing production software. Active Maintainer of multiple Python open-source libraries with millions of PyPI downloads
Last weekend I ran a brew upgrade on my laptop and noticed that running zola build on my personal site (what you're reading right now) didn't work anymore. Trying to get the whole thing to work again required looking up the Zola and Tera documentation and their migration guide. In this post, I'll give a quick walkthrough of the errors I ran into and how I was able to get past them. 1. Replacing…
82% of all statistics are made up. I've written multiple blog posts about Beancount over the past few years. It's one of those pieces of software that I can't stop talking about and that has made a huge positive impact on my private life. In this blog post, I'll describe one specific use case where I find a Beancount-driven finance tracking workflow particularly handy: preparing my tax returns in…
I've been meaning to put together a collection of a few different ways in which I've integrated LLMs into my workflow since they were introduced. Today I finally managed to carve out time to actually do this writeup. The usual disclaimers apply here: this is how I am using them so your mileage may vary, this is a subset of how I'm using them, and everything in this blog post is subject to change…
I operate a few different static websites, relatively low-traffic ones. So far these sites were hosted on managed hosting providers, including Netlify, Cloudflare Pages, and Bunny CDN. Last weekend I moved most of them over to an Ubuntu Linux VPS managed using pyinfra , where they're being served using Caddy . In this post I'll walk through why I made the switch, how the new setup works, what I…
A few months ago I started working on a CV builder for software developers. It has now seen some usage beyond just me, and I've learned a few things over the course. This post covers what I'm planning for txtcv in the near future. From CLI powered to CLI-first The first change I'd like to make is for the project to be more CLI-driven. At the moment there is a CLI, but it's more of a frontend…
It's been a few weeks since I started building txtcv , which is a simple career management platform (CV builder, cover letter generator, job application tracker) aimed mostly at software developers. Built using Django and some Htmx (where needed), it's deployed on a 2.50 €/month machine on a VPS hosting provider using Kamal. When starting out, I consciously made the decision to not use any cloud…
January 2026 will mark 10 years since I started storing my personal finances in plain text files using Beancount. Since January 2016, I've taken out about 30-45 minutes every single month to download my monthly bank statements and import them into my Beancount ledger. There's a lot to talk about here, but let's start with some fun numbers! The 10 year old Beancount ledger 10 years of financial…
I work on a few projects in my spare time, and in one of them, I recently had to implement a simple version of status polling. The main application is built using Django and I don't have a lot of tolerance for working with and maintaining JS build pipelines, so I looked into htmx to solve the problem. And I'm so thankful that I did that. Here's a quick writeup. Background The project in reference…
A few weeks ago, I started playing around with the idea of developing a CV builder, specifically for software developers. It came out of a personal frustration that I've had for a long time now, which is, the options available to me to write and maintain my CV are honestly not very good. For the longest time, I kept my CV in LaTeX, which is something I really don't want to touch anymore. First of…
I ran my first marathon in Munich yesterday! The experience was incredible and the crowd was overflowing with energy. It honestly felt like one giant party across the city. I thought I'll reflect a little bit on my first time running 42km, covering the three biggest learnings and my main takeaway, as long as everything is still fresh in my mind. A good training plan is critical. All in all, I…
It's been a while since I integrated AI agents into my programming workflow. At work I mainly use Claude Code. For private projects I'm a cheapskate, which means I use whatever is the cheapest (which at the time of this writing happens to be Gemini, given their very generous free plan). After about a year of using them almost on a daily basis, I've noticed my AI usage falls into two (generally)…
Earlier this week, my wife and I welcomed our tiny little daughter in this world. As parents, we're very happy and completely smitten by this new addition to our lives. I'm barely a week into fatherhood, so there's a lot to learn. I didn't fully grasp what people meant when they said that becoming a parent changes you at a fundamental level. Now I think I'm beginning to understand. Taking care of…
I'm currently drafting this blog post in Zed . After using Vim/Neovim for more than 15 years, I recently decided to try out something new. I don't know if this little experiment will work, or if I'll run back to my trusty Neovim, but hey, what I do know is that I'd like to find out. Why try something else? Why though? If you've used a specific tool for that long, why (try to) switch to something…
Building and maintaining Python libraries with extension modules can be somewhat tricky. I maintain one such library called streaming-form-data , that provides a streaming parser for multipart/form-data input and has all the performance-critical code written using Cython. In this post I'll share my experiences transitioning this library from Poetry to uv. If you also maintain such a library or are…
A few days ago, Beancount officially switched from 2.x to 3.x. If I'm being honest, I was a bit afraid of this release, mostly because it was supposed to be a major rewrite. I'm generally not a huge fan of rewrites, and I don't think I'm the only one on the Internet who thinks that way. Luckily, the update seems to have been less of an event as I anticipated. If you're planning to move from…
A few days ago, I finished the process of handing over the maintenance and further development of GeniePy to a new owner. I've worked on the project for around 3 years and after all this time, it was finally time to sell. In this blog post I'll briefly describe the process. Starlette beginnings I started building GeniePy sometime back in 2021. At that time I had a lot of SaaS business ideas but…
Tailwind CSS has gained a lot of popularity in the recent years, for many good reasons. There are a ton of interesting things that it brings to the table. One thing that I personally found interesting is that a lot of that popularity seems to come from backend developers, who almost by definition, don't write a lot of code on the frontend. As someone who also subscribes to that definition (at…
One of the most useful directories on my laptop is called finances . Almost every single time I touch it, I'm reminded of its usefulness. Every single year when we have to file our tax returns, I'm again reminded of how useful it is. What does it contain, one might ask? It contains a log of all my financial transactions across different bank accounts (both active and inactive), in a plain-text…
Like almost everyone else in the tech industry today, I've been looking into LLMs recently. I'm still fairly new to everything but I feel like I'm starting to get a general sense of how things work. What's inside an LLM is something I'm (at least at this point) still considering a black box. Regardless, it's fun to play around with these models and learn more about how they work and how software…
I've historically used Vimr as my Neovim GUI. It's a pretty nice macOS application written in Swift that lets me open up multiple projects in separate windows and allows me to switch between those windows using Cmd-`. My usual development workflow consists of always having two applications open: Kitty and Vimr. For each project, I have a terminal session open in a Kitty window and the source code…
At the beginning of May 2023, Shopify decided to lay off 20% of their workforce. That 20% unfortunately also included me, which meant it was time for me to look for another job. So over the past ~6 weeks, I've been interviewing for senior/staff backend engineering roles almost full time. Here are some raw stats: In total I interviewed with about 30 companies. I received a rejection from 13 of…
I recently discovered a neat little feature built into macOS that lets you convert multiple images from one format to another in one go. In Finder, select the image(s) you want to convert and right-click (also called the "two-finger" click) and select "Quick Actions" followed by "Convert Image" in the submenu that shows up. This should open up a new window that looks like this: Now, you can select…
Beancount is one of my favorite packages in the Python ecosystem. What is Beancount? I've written about it in much more detail in other places on the internet, but if you're new to it, Beancount is a PyPI package that provides a set of tools for you to keep track of your personal finances using Python. The entire workflow revolves around a .beancount file on your disk that contains all your…
One of my guilty pleasures is maintaining my dotfiles . This is one project I can yak-shave and play with as much as I want without caring about the actual impact or in general the usefulness of the whole endeavour. So this weekend I decided to indulge myself. Part of the process was cleaning up the older dotfiles and updating them to newer preferences. And the other part (which is the subject of…
After writing and launching a technical ebook, I've had a few people ask me about the tools I used in the process. Instead of answering individually to everyone, I thought I would document the entire process here and send a link out instead. The Big Picture It's easier to talk about the entire process by breaking it down into three different stages: the input, the pipeline, and the output. Input…
In this post, I'd like to describe how you can track your personal finances using a workflow that is highly focused on data privacy, is 100% self-hosted, and uses only the Python ecosystem. I'm also secretly hoping that some of you find this interesting enough to explore it in more detail . 🙂 We all know that money is important. Having money buys us freedom and lack of money is stressful. So how…
The very act of writing software implies that we (unintentionally) introduce bugs. It's possible to reduce the number of bugs you introduce. But it's definitely not possible to bring it down to zero. This means that most software we work with build or use will fail, at times in interesting ways. And then you the software developer would have to go in and figure out where things are going wrong.…
If you write software using Python and your code has third-party dependencies, you've probably heard of "wheels" before. Wheels are the current standard of distributing Python packages and are intended to replace eggs. Wheels are part of what makes the magic happen when you pip install something. Background Let's say you want to install Flask to build a web application. One of the steps fairly…
If you're even remotely into reading books on self-improvement or "modern" philosophy, The Almanack of Naval Ravikant is the one book you absolutely must consider reading. It's available online for free. Physical copies cost a little bit of money (obviously). But given the value that I feel is inside the book, the price is extremely reasonable. I first learned about Naval from his interview on the…
I spent some time last week enabling continous deployment for this site. As a quick bit of background, I use the Zola static site generator to generate the site and Netlify to host it. I can highly recommend both the tools, as Zola is a very simple and fast generator and Netlify is a pretty feature-complete static hosting platform with an extremely generous free tier. And as we'll later see, the…
Mixins are quite useful. In case you're not familiar with the idea, it's a step in the direction of "composition over inheritance". In Object Oriented Programming, consider that you're implementing a class and you want a bunch of functions to be available inside of that class. The idea behind mixins is to implement these functions in other independent classes and inherit your actual class from…
Every now and then I like to look for book recommendations on places like Hacker News and Lobsters where the audience is primarily technical. The one book that comes up consistently in these recommendations is The Phoenix Project . So last week I decided to order it and check for myself what the fuss was all about. Luckily it arrived at my doorstep right before the Easter weekend, so I had the…
One of the most impactful changes I've made to my lifestyle is not following news 24x7, either from TV channels or aggregator sites. Instead, I read one or two credible and objective news outlets on the Internet once (or maximum twice) a day to keep myself updated. But that's about it. This one practice has had a significantly positive impact on my mental well-being, and I recommend everyone to…
Zola is a nice static site generator. In fact, so nice that I moved this site over from Pelican a few weeks back . The one thing I was missing though was the ability to set target="_blank" on links within the content. There is a relevant Github issue from last year which proposes this feature for Zola. But the general consensus from that thread is that this functionality should ideally be…
I'm a reasonable human being. I say that with a lot of confidence because I don't think I've ever wanted to build an Uber for squirrels (and I hope that in the future, I may never want to). I say this in the context of "building things". You're a bright software developer. One day you notice that you have a personal itch that you want to scratch. And then you realize that scratching the said itch…
Last weekend I moved this site over from Pelican to Zola . The motivations were based partly in merit, but partly also just for fun. The migration itself was mostly painless. The part that took the most amount of time was just converting the posts from Pelican format to Zola format. Even though both expect Markdown, I found that there were some minor differences here and there (the front-matter…
As a developer focusing primarily on writing backend software, I feel slightly anxious when I have to work with CSS. In my head, the work involved in producing correct and cross-browser compatible code feels monumental. At the same time, I know how critical that skill is to product development. So, to work around this anxiety, I've picked up a couple of approaches that let me do frontend work…
Are you trying to find a gift for your loved one(s) but can't find anything and it's making you anxious instead? I'd like to offer an escape hatch. Open up your favorite search engine, look for an NGO that you identify with the most, donate some money in the name of your loved one(s), print out the donation certificate/receipt, and gift that instead. There are a couple of advantages of gifting…
Last week on Die Höhle der Löwen , a startup called Drive Dressy pitched their product - custom designed seat covers for cars. The idea is to let you put the metaphorical lipstick on those otherwise boring seat covers to give them a more personalised and unique look. Providing value (and making money) In my (slightly old school) mind, a business means providing some sort of value to someone in…
About 3 weeks ago I switched my personal machine over to Debian Buster (also stable at the moment). For the past few years, I've almost exclusively been an Arch Linux user. A few weeks back though, I felt that I would like to enable full disk encryption, which required an OS re-install. Ideally I would've installed Arch again, but this time around I simply wasn't in the mood to go through the…
It's common wisdom in the software engineering world that having more screens translates to higher productivity. Tech companies don't really shy away from throwing money at getting additional monitors for their developers, under the assumption that it'll bring in productivity gains. In this post, I'd like to question that assumption. My take on this is anecdotal, but I know that I'm not the only…
People often ask me whether I enjoy hiking. Living in Munich, it's no coincidence that the mountains are a huge part of life for the people who live nearby. So every now and then, the conversations I have tend to take a turn in that direction. It's a tricky question to answer. Do I enjoy hiking? Well, yes, and no. I have a complicated relationship with mountains. I was born in New Delhi, which,…
I'm probably not the first person to say this, but backups are important. A simple search on the web for "importance of backups" can explain this point much better than I can. Hard drives can be moody, so it just makes sense to prepare for the case when they're in a bad mood. As a responsible citizen, I've been making weekly backups of my data for a few years now. All this while I've kept things…
Disclaimer: this is not professional career advice and should not be treated as such. One question I've been thinking a lot about these days is “how do you decide what to learn next”? There are multiple aspects to this, and to be honest my head is all over the place on this one. This post will basically be a brain dump, and may or may not lead to a conclusive result. To start with, I feel we can…
Writing asynchronous code is popular these days. Look at this search trend from the last 5 years. I have the feeling that the number of tutorials on the internet explaining asynchronous code has increased quite a bit since Python started supporting the async / await keywords. Even though Python has always had support for running asynchronous code using the asyncore module (or using libraries like…
I submitted Developer to Manager to Hacker News on 25th March. The common/accepted knowledge is that there's a ton of variation on what makes a post hit the front page. Having absolutely no knowledge about those variations, I submitted the post regardless, not thinking much about it. What happened next was something I wasn't expecting at all. The post ended up trending on the front page for one…
One of the most common bugs when writing software is the classic "off by 1" error. In this post, I'll talk about a similar bug I found in some code I maintain, and how I fixed it. Backstory I maintain beancount-dkb , which is a Python package that provides helper classes for converting DKB CSV exports to the Beancount format. In Beancount's terminology, these "helper" classes are called…
TL;DR I've been working on Developer to Manager for the last few weeks. It's a collection of interviews with software developers who moved to management, and explores what they learned, the best advice they received on this topic, and so on. Check it out! In the software industry, the progression from being a "software developer" to being an "engineering manager" is considered fairly normal. Well…
I'm not completely convinced by the current landscape of static site generators. Most of these don't generate "sites". They generate "blogs", and the concept of "pages" and "posts" is so deeply ingrained in the implementation that it's difficult to break free of that structure. Eventually this starts showing up in your static "site". The point is, I'm missing flexibility. I started working on…
In the past few months I've been able to find the time and energy to open-source 5 Python projects on Github. I think being able to work remotely from home on my own schedule is the reason something like this could have happened, but that's for a different blog post. In this post, I would like to go over a few tools you can (and probably should!) set up on your own projects so that they stay in…