Powboy
A bot that books backcountry ski huts the moment their dates open, then keeps watching for cancellations. It runs a real browser on a machine at home, I run it from my phone, and it's built to stop and ask me rather than guess.
The huts open their dates on a rolling window, two to three months out, at midnight. The good weekends go fast, and I don't want to sit up refreshing.
It checks it's ready a few minutes early, books the moment my exact dates appear, and after that watches for cancellations.
I add a trip from my phone and get one notification: booked, or a button to tap when it needs me.
that drive a real browser through a fake booking site, so it never practises on a real one. About 4,400 lines of Python, written with Claude Code.
Tap any piece of the stack to see what it does here.
Try it
- 01Watch a release night. Wendy Thompson's dates open about 35 seconds after the page loads. Pushes arrive the way they do on my phone: preflight, armed, open, then a hold to pay for. Replay it from the button at the bottom.
- 02Check now on the trip that's full. The first check finds nothing; on the second, someone has cancelled and it goes for it. It's a test run, so it stops before paying.
- 03Plan a trip with + Trip. It works out when your dates open and counts down to that moment, or goes straight away if they're already open.
- 04Open Crew to see the people it books for.
The real dashboard, running on sample data in your browser. Nothing here talks to a booking site.
Why I built it
The huts I want to ski from release their dates at midnight, on a rolling window, and each one does it a little differently. Booking the trip I want meant being awake and quick at the right minute, a couple of months ahead.
A bot can do the being-awake part. The harder question was whether I'd trust one to spend my money unattended, and what it would take to get there. That's what I really wanted to learn.
How it works
On release night it starts a few minutes early. About twelve minutes before, it checks that it's logged in, that the site's pages look the way it expects, and that its clock is right, so there's time to fix anything. Then it refreshes every few seconds and books as soon as my exact nights open.
After that it checks for cancellations every 10 to 15 minutes. When spots open, my phone gets a push with a button to book it, or it books on its own if I've said so.
From my phone I add a trip (hut, dates, who's going and a price cap) and see a countdown to when it opens. Teaching it a new site means clicking through one booking by hand while it records each page, and that recording becomes the steps it follows.
Built to stop
Most of the work went into the ways it refuses to book.
- Exact match only. Before the last click, the review page has to show my exact dates and party size, and one total at or under my price cap. Otherwise it stops.
- It books once. A ledger marks a trip as in progress before the final click, so a crash or a second run can never book it twice.
- Anything unexpected stops it: a page it doesn't recognise, an error banner, a missing button. It takes a screenshot, tells me, and doesn't retry mid-booking.
- When a site pushes back, it backs off. It never hammers a site, and a refusal from the site ends the run.
- It doesn't solve CAPTCHAs or pretend to be a person. When a site wants a human, it pauses and sends me a live view of the page to clear from my phone, or gives up.
- Every trip is a dry run unless I say otherwise: it fills everything in, checks the review page and stops before paying.
- The card stays in the computer's keychain, and card fields and passwords are blacked out of every screenshot.
Where it stands
The engine, the safety checks, the phone dashboard and the alerts are built and tested. Now I'm teaching it the real booking sites, one recorded walkthrough at a time. Until a site's steps are confirmed end to end, it only checks availability and does dry runs.