Colophon
This website, with all its oddities and possible flaws, was "hand-made". There's many ways to make your website (and I'd argue all of them are hand-made to an extent), but this is mine. I like having a say over every little aspect of this space and that seems to be the only way of making sure I don't cede that control.
In a gist, this space is built on the Sveltekit framework, styled using TailwindCSS (and good ol' vanilla CSS when necessary), uses Sveltia for managing my content and is hosted on Netlify.
Credits
Thank you to the talented Rhea Pradeep for making the illustration of me you see on the homepage. I gave her a hopelessly vague prompt that she turned into something so beautiful.
Relatedly, a lot of the smaller illustrations on this website are sourced from Flickr Commons and Rawpixel Public Domain Archives. The images used to make the stamps, and other miscellaneous illustration on certain pages come from Patricia M's albums. They have been slightly modified in Photoshop, no AI has been used here.
The stack
Svelte, and Sveltekit by extension, is my go-to for all my projects. Svelte supercharges vanilla HTML, CSS and JS and it has never felt foreign to me in the way that React or other frameworks like Gatsby.js did. Where I can't be bothered to write vanilla CSS, Tailwind comes to the rescue. Every few weeks you'll see someone on Twitter bashing the framework but it works well! I write all my files in small, manageable components, so I don't have either hellishly long style blocks or ridiculously long classes. All the content, from the blog posts to Tidytuesday logs, are written in Markdown. I've built various schemas that help me manage similar 'templates' of content and Sveltia makes it stupidly easy to have an interface to manage them within. For longer blogposts, I use Obsidian to write. Once I'm done, Sveltekit transforms my website into a self-contained bundle of static HTML files which I can take anywhere. I take them to Netlify because it is quite simple and I don't have to pay anything to have it exist online.
Not that it is some feat of engineering in any respect, but if you're interested in looking at the code, all of it is available here.
Images
Hopefully this website runs fast for you. I've taken a lot of care to make sure I don't waste your data, and I'm always trying to make it better. One of the biggest data-hogs are images. I make visuals so, unfortunately, I cannot avoid having a lot of images on the website but what I can do is have some restraint on what I serve you. Most of the images on this website are under ~30kb each (which might still be a lot). Each image, except those in the blog in some cases, is pre-processed to reduce the number of colors down to 5-6 and converted to webp or avif format. This cuts down their weight by around 70-80%, and results in a much faster experience. I use Squoosh app and the Svelte's image plugin to make this happen.
Live stats and tracking
For the live stats such as battery percentage, online status, and my Bangalore map, I have set up a handful of scripts on a server that return this information via APIs. The battery status (homepage top-right) comes from Owntracks on my phone (which is sent to a private server hosted on Racknerd). I also use Owntracks to generate tracks and then map-match them using a self-hosted Valhalla instance, compile it into a static image with Python and export that image every week. The online status in the footer is a simple 'heartbeat' script which runs periodically on my laptop pinging my server to notify that the laptop is active; if it doesn't receive a ping for a certain amount of time, it is assumed I am not working.
Micropublishing and notes
Indiekit runs on the server and is used for micropublishing to the /notes page. This allows me to post quick notes, bookmarks, and photos directly to my website through a simple interface. It is installable as a progressive web-app (PWA) on my phone, which is awesome because I don't have to install another app to post while on the go.
GPS tracking and maps
SyncThing watches OSMTracker on my phone to send GPX traces to the server, which processes and commits to the repo. A cron job runs every day, or can be manually triggered. This helps me keep track of my movements and create maps of places I've been.
Podcasts
I use AntennaPod for podcasts, and it is connected to gpodder.net for tracking podcasts.
Word games tracking
Rhea and I log in our NYT word games into a private dashboard made with Shiny and R that is stored in a Google Sheet. An R script also calculates the "winner" for that day, that is, the person who finished the game in the least number of moves (or for the Mini, least amount of time). Everday at midnight, a Github Action pulls that data, restructures it for use by the visualization and spits out a JSON. The code for the chart is available here. The R script for calculating winners is also available here, in a very messy way.
Analytics
I don't track anything (on the contrary, you could probably track me more than I track you, with all the live stats here). The hell do I care how long you spend on this website? No cookies, period. One less dashboard for me to waste my time over as well.
AI Usage
I use Claude for assisting me in writing code. No AI is used in writing text, generating images or otherwise giving you an impression that I have done something which I have not. For places where Claude-generated code exceeds Aman-written code or material, there will be disclaimers informing you.
