Five days out from December and I'm doing the thing I do every year around this time: quietly rebuilding my Advent of Code rig instead of admitting I should just reuse last year's folder.
If you've never done it, Advent of Code is a little programming puzzle that drops every day from December 1st through the 25th, two parts each day, and the site tracks your times if you're into that sort of thing (I am, mildly, in the way that makes me irrationally annoyed when I get stuck on day 6). I've done it, in some partial and messy form, every year since 2018. I have never once finished all 25 days. I'm not going to pretend this year is different. But the setup ritual is half the fun, so here's what I'm doing this week before the calendar flips.
The language question, again
Every single year I tell myself I'll finally get fluent in Rust by grinding through AoC in it, and every single year I bail out around day 9 and go crawling back to Python. This year I'm not fighting it. Python it is, with a plain uv virtual environment instead of the conda mess I was hauling around in 2023. uv venv, uv pip install requests numpy networkx, done in about four seconds. I genuinely cannot believe how much faster this is than pip used to be — I timed it out of curiosity and a fresh env with those three packages took under six seconds on my machine, versus something like 40 with plain pip and a cold cache. Small thing, but when you're doing this at 6am before work it matters.
The folder skeleton
I keep a template repo now instead of copy-pasting last year's structure and forgetting to rename things (did that in 2022, spent twenty minutes debugging why day 4 was importing day 3's input). The layout is boring on purpose:
aoc2025/
day01/
input.txt
solve.py
day02/
...
utils.py
utils.py holds the handful of things I reuse constantly — a grid-parsing helper, a Dijkstra implementation I've rewritten so many times I finally just kept one, and a tiny read_input() that strips trailing newlines because that bug has cost me actual minutes of my life more than once.
Getting your session cookie sorted
The mildly annoying part of AoC is that puzzle inputs are per-account, so if you want to script fetching your input (rather than clicking through the site every morning like an animal) you need your session cookie. Log in, open dev tools, grab the session value from your cookies, stick it in a .env file, and never commit that file. I say this every year because I almost committed mine to a public repo in 2021 and only caught it because my pre-commit hook flagged a suspiciously long string. Use .gitignore from minute one. A tiny fetch_input.py with requests and that cookie in the header will save you the daily click-through.
What I'm skipping this year
No leaderboard grinding at midnight. I did that in 2019, stayed up till 12:40am for three straight days chasing a top-100 finish I never got close to, and was useless at work the next morning. Not doing that again. I'll do my puzzles with coffee, at a normal hour, and if the day 15 pathfinding one breaks my brain I'll just come back to it on the weekend. The whole point of this, for me anyway, is having a small daily excuse to write code that isn't a Jira ticket. Racing a clock at midnight kind of ruins that.
One actual recommendation
If you're starting from scratch this year, don't bother building elaborate infrastructure before day 1 even drops. I've watched people (and been the person) spend three hours building a beautiful CLI harness with argparse and rich console output and then burn out by day 4 because the puzzles themselves got shoved to the side. Get input-fetching working, get one file per day, and leave it there. The tooling should take fifteen minutes, not a weekend.
I'll probably post my day 1 and day 2 solutions here once they're up, mostly so future-me has somewhere to find them instead of digging through a repo I forgot the name of. Past record says I'll be posting regularly through about day 12 and then going quiet, which is fine. Twelve days of puzzles beats zero.