Virtual Aquarium: Next Steps

Development is currently paused, but here’s a list of future features I’d like to add next. Water Chemistry One of the important lessons for aquarists is to ensure they don’t overstock or overfeed, especially early as the nitrogen cycle is being established. If we encoded the nitrogen cycle here, we could track rough concentrations of ammonia, nitrite, and nitrate. For nitrifying bacteria, we’d just track a general level that increases over time to indicate tank maturity. The level of these would control the conversion from ammonia to nitrite to nitrate. ...

February 15, 2026

Virtual Aquarium: System Design

The following system design was AI generated from my code and manually checked over by me. Aquarium System Design Tank Dimensions: 700×430×400 (width × height × depth), positioned at (75, 200) Water level: 10% from top, gravel layer 20px at bottom Perspective: Back wall scaled to 0.7× via BACK_SCALE, position/size interpolated by z-depth Water rendering: 20 translucent layers from back to front, opacity fading from 30 → 0 Render order: Back wall → algae (non-front) → gravel → objects sorted by z-depth interleaved with water layers → front algae → front wall Manages: fish, microfauna, snails, food, algae, egg clumps Wall System Five walls: front, back, left, right, bottom. Each has a 2D coordinate system: ...

February 9, 2026

Sweaters: Ireland

Neha and I came to Ireland for our first anniversary. We loved the natural scenery, the historic ruins, the adventurous activities, the cozy pub culture, and the hearty food. But besides all of that, we loved shopping for sweaters in all the towns we visited! We started in Dublin, where we checked out a few small chain stores in the city. For 50-60 euros, we found tons of basic Aran sweaters in 100% wool and in beautiful colors. These were already quite nice, and they set the bar high for the rest of the trip! We planned to hold off on making any decisions until we visited more smaller towns, especially since we’d be passing back through Dublin on our way out at the end of the trip. ...

September 5, 2025

Sweaters: The Sou'west Chunky (the sequel)

If you have not read part 1, please start there. If you don’t, in summary, in early 2020 I had a fantastically whimsical experience purchasing the chunkiest sweater I’ve ever seen from a man in Cornwall. While I loved the experience of purchasing it, the actual sweater ended up being too chunky for frequent wear. I had occasionally considered trying to sell the sweater, but I wasn’t sure how easy it’d be to find someone who appreciated how special it was, and I was too sentimental to just sell it for cheap. Then I received the following email: ...

July 14, 2025

Snow sculpture: dude on couch

This sculpture was a group effort between me, Abhijit, and Brandon. We met up in a park and, seeing the benches lining the sidewalk, we decided to make a dude on a couch, roughly inline with the benches. The snow in the park had already been pretty stomped down, so we weren’t sure we’d have enough to make something big, but thankfully Brandon brought a shovel, and our snow pile grew soon enough. ...

January 20, 2025

Step 3: Launching jobs

Final code structure overview The code for this second part looks mostly similar to the second part with a new workflow, a new countdown subpackage, and a new batch.py util file. Sample code repo here. sample-streamlit-deploy .github/workflows/ custom-docker-push.yml docker-push.yml update-streamlit.yml .gitignore code_package/ countdown/ countdown.py streamlit/ pages/* util/ google_oauth.py Home.py requirements.txt start.sh util/ batch.py cloud.py Dockerfile Makefile docker-compose.yml environment.yml Overview One of the limitations of streamlit is that it doesn’t play well with longer running computations. Even if it did, it’s bad UI design to have a web page block on a long running process, so in these cases, we’d prefer to have some way to launch jobs and later check on the results. When we first set up our streamlit deployment, we chose to push a container which could be run with an arbitrary command. This ends up also being useful as a container we can use for running jobs on AWS Batch or other containerized workflow tools. ...

January 22, 2024

Step 2: Secure Deployment

Final code structure overview The code for this second part looks mostly similar to the first part with some added files in the streamlit directory. Sample code repo here. sample-streamlit-deploy .github/workflows/ docker-push.yml update-streamlit.yml .gitignore code_package/ streamlit/ pages/* util/ google_oauth.py Home.py requirements.txt start.sh util/ cloud.py Dockerfile Makefile docker-compose.yml environment.yml Overview In a company setting, we may want to build streamlit apps which deal with sensitive information. In that case, we have to think about the security of our app. There are a few layers we can consider: ...

January 15, 2024

Step 1: Automated Deployment

Final code structure overview In this case, I wanted the streamlit deployment to be part of a larger repo with multiple tools/packages that use a common environment. As a result, the repo is structured with a top level package code_package under which we’ll make our streamlit directory. In the same repo as the code_package directory, we have our .github directory for workflows and a variety of other files such as the Dockerfile or Makefile. Sample code repo here. ...

January 12, 2024

Running: Marathon Training Weeks 9-Race

Week 9 Planned runs: 6 + 8 + 7 + 18 = 39 Completed runs: 6.06 + 8.01 + 7.21 + 18.17 = 39.45 Last week’s 16 mile run may have felt amazing, but I was quite tired coming into this week. I went quite fast on my first short run of the week (8:23/mile), but slowed down considerably on the next two as I started to feel some minor knee pain. From what I read online, this sort of pain is fairly common when running a higher load than you’re accustomed to, which, you know, was a fairly accurate description of my situation. ...

November 12, 2023

Running: All My Races

Lake Minnetonka Half Marathon Date: 2015-05-03 Pace: 2:22:40 - 10:54/mile When I reached spring of senior year, I found myself with a lot of free time. I had already gotten into college, and in doing so, most of my interests had been strictly academic. I liked the idea of running, so I decided it’d be a fun challenge to try running a half marathon. I had read the book Born to Run and gotten excited about the idea of barefoot running, so my training began in Vibram Five Fingers shoes. After my first couple weeks of training during which my longest run was 6 miles, I started to feel some pain (likely from too fast ramp up + insufficient shoe cushioning) and decided to take a break. ...

October 16, 2023