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.