Small programs, real payoffs: why personal coding projects are worth it

Sometimes the best programming projects aren’t about learning a new framework or building something impressive — they’re about scratching a personal itch. A friend once mentioned that people learning to code might benefit from a list of small, fun projects they could finish in an evening or weekend. Reflecting on my own experience, that instinct is right.

My typical workflow looks like this: notice a minor problem in daily life, get the idea that code might solve it, then spend a few happy hours building something. It’s not always the most efficient path — many of these problems could have been solved faster by hand — but when the goal is enjoyment and the program doesn’t harm anyone, it’s a great approach. Here are some examples of tiny personal projects that paid off in unexpected ways.

When scraping beats browsing

A recurring theme in my projects is pulling data from websites that don’t offer a convenient interface. The local Fringe Festival, for instance, had many shows but no single-page calendar. I wrote a Python script to scrape their site and generate one (code, output).

Similarly, when house-hunting a few years ago, I was frustrated by the lack of historical price data on local real estate sites. An iPython notebook queried a real estate website’s API to calculate statistics like price per square foot over time. It didn’t ultimately influence our buying decision, but the process was enjoyable. There’s something particularly satisfying about working with undocumented APIs where you have to copy cookies out of your browser to get access.

From pixels to paper

Some projects are about bringing digital content into the physical world. After seeing a video of someone making miniature physical versions of ebooks they’d read, I wanted to try it. Rather than manually resizing book covers, I wrote a bit of HTML and CSS (tinybooks.html), converted it to a PDF, and printed the covers.

Another print-related project involved mailing zines. I wanted custom labels on each envelope — a mail merge situation. A Python script processed all the addresses and generated HTML/CSS, which I then converted to a PDF and printed directly onto envelopes. It worked flawlessly.

Going further back, in 2013 I wrote software to generate crossword puzzles from a text file, with the idea of making crossword-themed business cards. I’m fairly sure I never printed the cards, but writing the generator was its own reward.

Making tools work the way you want

Sometimes the problem is existing software that doesn’t quite fit. When I needed to scan a pile of documents for a family member, the available software felt clunky. I wrote a tiny shell script wrapper for scanimage (gist) to streamline the process. It’s a project I still use today.

Another example: when COVID vaccine slots were all full, I discovered the booking site’s backend had an API. I wrote a script to poll it every 60 seconds, watching for cancellations and notifying me when one appeared. The appointments ended up opening up for everyone before I needed it, but the project was fun — and I’m always careful with unintentional API use to avoid overloading the server.

Experiments for the sake of curiosity

Some projects exist purely to answer a question. A friend showed me a dice-rolling game where you roll many dice and sum the values. I claimed that with enough dice, results become less random — then I wanted proof. A tiny Python program rolled 2,500 dice and summed them thousands of times to visualize the pattern. The math could have been done by hand, but code was easier:

import random

def roll():
    return sum(random.randint(1, 6) for i in range(2500))

while True:
    print(roll())

Other projects are about transitions. When switching drawing apps from Squid to Notability, I reverse-engineered the Notability file format to migrate my old drawings. It turned out to be unnecessary — I ended up with a different app that had proper SVG import — but the reverse engineering was its own adventure.

A slightly larger project (took more than a day) was building a small website to turn off retweets on Twitter when the platform didn’t offer that option.

Why tiny projects matter

Projects like these are a fantastic way to learn and practice programming. They work because they’re low-stakes: they’re just for you, so it doesn’t matter if something goes wrong. They can be finished in an evening, so they never loom as unfinished burdens. And when they work, there’s tangible output — envelopes, mini book covers, a calendar, a better Twitter experience. Those small wins keep you coming back to code.