One day in Ry
Eight weeks of real moments folded into a single day at the office in Ry: an idea said out loud over coffee, a phone call to a club that hadn't noticed its kiosk was down, a dashboard the founder can't walk past, players asking for our devices by name, and the evening I sent 94 kiosks into a restart loop and patched them back one by one.
It’s a little after nine in the evening, and I’m connected to a kiosk at a golf club, patching it by hand. When it’s done I’ll connect to the next one. There are quite a few of them left.
We’ll get back to that. I’ve been at GolfNext for eight weeks, and every time I tried to write about them I ended up with a list. So instead I’ve folded eight weeks of real moments into a single day at the office in Ry, from the first coffee to the last kiosk. Nothing below happened on one day. All of it happened.
07:40. What colour is it today?
Before I leave for work there’s one decision to make, and it’s mostly made for me. We have company t-shirts in different colours, and on three days a week we all wear the same one: blue Monday, green Wednesday, black Friday. This day is folded together from eight weeks, so I can’t tell you which shirt I’m wearing. Possibly all three. Either way, at GolfNext Black Friday comes every week.
07:50. Coffee, and an idea said out loud
The coffee machine is where most things start here. Somebody says “what if we just…” and by lunch there’s a branch. Sometimes an idea from the morning is live within 24 hours. Nobody has to approve you trying something. Code review and the release process still apply, but the distance between “what if” and “it’s running” is short, and everyone knows it. John wrote a whole post about this, the culture of enthusiasm, and he’s right.
My favourite example has a silly name, which I’m allowed to say because I made it up. All you can Ball. At a driving range you normally buy a bucket of balls. With All you can Ball you buy a time window instead, and one code dispenses again and again until your time runs out. Each portion is sized by the time you have left, so nobody empties the machine in minute one and then stands around for fifty-nine minutes looking pleased with themselves.
Then, over another coffee, the next thought. Why have bucket sizes at all? Long-press the card terminal and balls flow for as long as you hold it, like a fuel nozzle. I call it the beer-glass effect: people stop when it looks full. Peter, who founded the company in 2012, loved it. It’s still an idea. Ideas are cheap here, which is exactly why so many of them turn into something.
09:30. Someone walks over
This is the part I didn’t expect to matter as much as it does.
Hjalte walks over. A PDF of ball codes that clubs print out is spilling onto two pages. Not a crisis. The kind of thing that sits in a backlog for a month because it’s never quite the most important thing.
John fixed it within the hour.
Another evening, members at a club get charged guest prices. I sit down with one of our external developers, we find it together, and it’s fixed within the hour. Those external colleagues built the kiosks, the booking flows and the payment integrations, and kept them running for more than a decade before any of us showed up. Having them and us in the same conversation is the best of both.
11:00. The phone call
Late morning I notice a kiosk at one club has gone offline. I mention it. Hjalte doesn’t open a ticket. He picks up the phone and calls the club.
They hadn’t noticed yet. They were glad we called.
From then on, that’s the rule: when we see something wrong, we call. It’s a tiny thing, and it works because the person who sees the problem and the person who knows the club are in the same building.
12:00. Down the desk
Max joined at the end of August to look after the mobile app players use. On his first day I told him the app was his: do whatever you think is best, I won’t second-guess you. He started with the unglamorous part, taking the app’s TypeScript errors from 134 to zero and its lint errors from 264 to zero, and getting automated tests running on real phones. None of that is visible to a golfer. All of it makes the next feature safer to ship.
13:00. The wall boards
After lunch everyone ends up in front of the TVs.
They arrived a while ago, delivered alongside somebody else’s pallet of cat food, which went back. One evening, unasked, I built a dashboard for them with Claude. Latest releases. What’s live where, because support had asked. Open pull requests. A heartbeat from every device out in the field. Balls dispensed per club today versus the same day last week. And a random programming meme, because a dashboard without a joke on it is just a spreadsheet on a wall.
The next day Peter kept stopping in front of it. Mostly at the ball numbers, watching clubs overtake each other as the day went on. A day later the CEO sent over sales slides to add. It’s become the screen we stand around with coffee, which is more than I can say for any dashboard I’ve built before.
14:30. The twins
In the afternoon John and I both open a pull request for the same feature: choosing which version of the software a kiosk runs. Neither of us had told the other. Same idea, same day, two implementations.
We merged the two. It isn’t the first time we’ve done something like that. We call each other the twins now, because we keep arriving at the same place from different directions. If two people who didn’t talk to each other end up in the same spot, it’s probably a good spot.
That feature belongs to the biggest thing I’ve built here, the fleet service. It’s one system that knows every physical device we have out there, kiosk screens, card terminals, ball dispensers, and manages them from one place. A device joins once with a 12-digit code typed in on site, gets its own identity, and from then on takes its settings and its version from the service instead of from someone fiddling with it by hand. We switched it on overnight in September, with clubs closed. By morning every club kiosk had joined. The only holdout was our own demo unit in Sweden, which had been set up twice and complained that a device with its ID already existed. Of course it was the demo unit.
Hjalte has a better name for the enrolment part. He calls it the 1-Click installer. Nobody has to connect to a device and set up its environment by hand any more. A 12-digit code, and the device is ours. That’s how we’ll ship from now on. The next step, and we’re close, is a small web page where staff at a club set up a new device themselves, which I suspect will be the fun kind of setup. And replacing a broken device won’t take several phone calls. It’ll take a parcel and a link.
15:00. Someone else’s clock
Mid-afternoon, a message from a club in Portugal: their ball dispenser opens about an hour late, every single morning. Nobody had touched the schedule. It turned out the dispenser was mixing up its own time zone with Denmark’s, and so was every dispenser outside Denmark. Money had the same habit. Prices assumed Danish kroner with two decimals, which had to change before a club in the UK could take pounds, and before our kiosk in Iceland could go live at all, because the Icelandic króna has no decimals. Now time and currency come from the club, not from wherever our office happens to be.
16:00. The news
Late in the afternoon one of our longest-serving colleagues tells the team something they’ve been hearing. Players have started going to their clubs and asking whether they can get GolfNext’s devices. Because they’re so easy to use. Because they’re convenient.
For me that landed harder than any metric on the wall. So much of our work only gets noticed when something goes wrong. Meanwhile, somewhere, a golfer is standing at a counter asking for the thing we make.
18:00. The day that ran long
Which brings us back to the evening. This part is from my third week.
I’d been chasing a bug where kiosks sometimes froze. I wanted more detail, so I made the kiosk pause before it exited, just long enough to write a crash log. What I hadn’t accounted for is how kiosks update: the updater closes the app, swaps the files, and only waits so long. My pause made the app too slow to close. Updates kept getting cut off, and around 94 kiosks started restarting in a loop. Updates only run when a kiosk is idle on its home screen, so nobody was thrown out halfway through buying a round. It was still 94 kiosks going round in circles. And the crash log didn’t even help me find the freeze.
The awkward bit was that I couldn’t just ship a fix. The update logic that runs is the one already sitting on the kiosk, the same one that was broken.
It took about two hours to stop the bleeding by freezing the update the kiosks were pulling. Then came the rest of the evening, the scene at the top of this post: connecting to kiosks one at a time and patching them by hand so the next release would stick.
It did.
08:00, the next morning
I came in braced for jokes. There weren’t any. Our product manager wasn’t worried. People were glad someone had put the hours in.
There’s a German saying, wo gehobelt wird, fallen Späne. Where wood gets planed, shavings fall. We’ve done a lot of planing in eight weeks, roughly 650 merged pull requests between John, Max and me, and that night was one of the shavings. It also left something useful behind. Kiosks now give up after three failed update attempts and keep the version they have. And the night is the reason the fleet service rolls things out the way it does: a new version goes to a few kiosks first, and once it works, it goes to the rest. If something’s wrong, a kiosk goes back to its previous version from a setting. That’s the part of the evening I’m proudest of.
Why the building matters
On the last Friday of September, John and I walked out to the car park together and agreed it had been a big week. “It’s quite noticeable what we bring to the company.”
I’ve thought about why, and I keep coming back to the building, or really to how short the distances in it are. The PDF that gets fixed within the hour because someone walked over. The phone call that happens because the person who spotted the problem is sitting next to the person who knows the club. The feature built twice because two people think alike, and merged because they sit together. The good news that reaches the whole team at once, in the same room.
It’s also what Friday mornings are for. For half an hour we all sit round one table, in black shirts, with rundstykker, Danish breakfast rolls, and talk about our weeks. The distances don’t get any shorter than that.
Tomorrow there’ll be another coffee, and somebody will say “what if we just…” I can’t wait to hear what it is.
