Anny Seat Booker.
Books a study seat at KIT library through anny.eu on my behalf — watches for slots opening and reserves one before the queue forms.
Try to beat the release yourself
This is the actual room — Lehrbuchsammlung, ground and first floor, KIT library. Start the clock, then try to click faster than everyone else after the same seat.
001st floor
Carpeted, so footsteps and a pushed-back chair land quieter than they do downstairs.
01Behind a shelf
Out of the sightline of anyone walking past, which makes it easier to stay concentrated.
02Corner
At the dead end of the row, so almost nobody has a reason to walk past you.
- Best — a corner, behind a shelf, and on the 1st floor, all at once
- Great — has two of those three
- Okay — has just one
- Basic — has none of them
Release
19:59:54
until slots open
0 seats left
Three hours of watching, one hour shown
Seats are released around 20:00. Around — the exact minute drifts, and missing it means no desk. So the bot starts watching at 17:00 and asks anny every 30 seconds whether the slots have opened. Five minutes either side of each half-hour mark, where the release actually lands, it drops to every 5 seconds.
- Requests this hour
- 321
- Inside the release windows
- 241
- Worst-case blind spot
- 5s
It is a trade, not a free win. Flat polling is genuinely cheaper — 121 requests against 321 over this hour — and it spends them evenly across fifty minutes where nothing happens. What it cannot do is close the gap: a thirty-second blind spot at the exact moment the seats appear, against five. At the end of a semester, thirty seconds is the whole queue.
Two seats, booked at once
00Constraint
A single booking cannot exceed five hours, and a working day is longer than five hours. So a full day is two separate reservations: 09:00–14:00 and 14:00–18:00.
01The naive version
Book the morning, then book the afternoon. It works every time you test it and fails when it matters: while the first reservation is going through, everyone else is taking the afternoon, and you finish the day holding half a desk.
02What it does
Both reservations go out together rather than one after the other, so the second is not waiting on the first to finish. Either you get the day or you find out immediately that you did not.
Seats are also chosen from a priority list rather than taken as they come — the first available desk that I would actually want to sit at, not the first available desk.
What the browser is still for
The first version was a scraper end to end: log in, navigate, find the tag, click it, wait, click again — a bot pretending to be a person. That is fine until the last weeks of a semester, when everyone wants a desk and the site is too overloaded to render reliably. A pretend person cannot click a page that never finishes loading.
So the browser was cut back to the one thing it is genuinely good at: getting through the door. Login is two stages — anny, and then the university's own account system behind it — and reproducing that handshake by hand means owning a pile of cookies and redirects I have no interest in maintaining. A real browser does it once an hour and hands over the session.
Everything after that is the API directly: ask whether a time is free, read the seats, pick from the priority list, reserve, submit. No layout to break, nothing to wait for, and it works while the site itself is barely standing.
When it breaks, which it does
It runs as a Docker container on a server, around the clock, and it tells me when something has gone fatally wrong: a Telegram bot fires the moment the program dies. That is not monitoring for its own sake — it is the difference between finding out at 20:01 and finding out the next morning with no desk booked. When the message arrives I book by hand and debug afterwards.
It still crashes sometimes. Most of what is left is not mine to fix: the service is overloaded, its responses are inconsistent, and the parts that fail are on the far side of an API I do not control. The bot is built to be predictable about things that are not.
Worth saying plainly: writing this cost a fair amount of time, and it did not work straight away — the early versions failed in exactly the ways described above. Lately, though, it works wonderfully: no bugs, no oversights, stable enough that I do not think about it at all anymore. And it saves more time than it looks like it should, because studying in the library actually is easier — better concentration, fewer distractions than at home, where the connection is worse and a big monitor is exactly as good for YouTube or gaming as it is for coding. No seat in the library, just because I was busy around 20:00, should be able to cost me the whole day.
The repository is private. Happy to walk through the code on request.