Most of my public repos are small Python scripts, and that's not an accident. The highest-leverage code I write isn't the clever stuff — it's the 50-line script that removes a chore forever. Here's my approach, with examples from my own projects.

The rule: automate on the third time

The first time you do something manually, it's a task. The second time, it's a coincidence. The third time, it's a script. This threshold keeps me from over-engineering one-offs while still catching every real repeated chore.

Example: SMS alerts for Discord DMs

I kept missing important Discord messages while away from my desk, so I wrote discord-sms-notifications — a small script that uses the Twilio API and the Discord Python library to text my phone on new DMs. The core of it is barely more than this:

@client.event
async def on_message(message):
    if message.guild is None and message.author != client.user:
        twilio.messages.create(
            to=MY_PHONE,
            from_=TWILIO_PHONE,
            body=f"DM from {message.author}: {message.content[:100]}",
        )

Total effort: one evening. Payoff: I haven't missed an important DM since.

Example: school chores

My school-helper-programs repo collects scripts I built at Waterloo — checking course availability, organizing files, scraping schedules. None of them are impressive alone. Together they bought back whole afternoons during exam season.

Keep them boring

Rules I follow for personal automation:

  • One file if possible. A script you can't read in one screen is on its way to becoming a project.
  • Secrets go in environment variables, never in the file — even for "personal" scripts. They end up on GitHub eventually.
  • Fail loudly. A silent broken cron job is worse than no automation.
  • Don't add features until the third time you need them (the rule applies recursively).

The point of automation isn't elegance — it's getting your time back. Write the boring script, ship it, and go play badminton.