cycling across japan

published 07 Dec 2023

Cycling is one of my life-long hobbies, and also my main means of staying in shape. I’m writing this post mostly for my own records but sharing it in a hope that it may be helpful or at very least interesting to someone.

ハチミツとクローバ (Honey and Clover) is one of my favourite anime series to this day. While watching it (over two decades ago!) I was quite emotionally attached to the characters and story progression. One specific arc in the story sees the main character – who has lost his direction in life – decide impulsively to cycle as far as he can without looking back.

He ends up cycling a good portion of Japan (up to the north-most point of Hokkaido), and learning much about himself.

I’ve ever since had a lifelong goal of cycling the whole of Japan. Of course, Japan is a big country – cycling the full length would be over 2,000 km!!. I’m no professionally trained cyclist – sure I’ve done a few 60-80 km rides in the past, but doing more than that distance in a day would definitely be pushing it, so that results in quite a large time sink to cover the full distance.

With my busy life of maintaining a game played by millions of players while also trying to rewrite that same game on the side, such a goal seems unattainable. Of course you could argue that I could just drop everything for a few months and make it happen.. but I suffer from very high self-expectations and drive to keep osu! going strong, so that’s just not going to happen.

So when I overheard a friend talking about their upcoming trip to Japan and they mentioned planning a cycling journey across a smaller portion of the country, I jumped on the opportunity and asked whether I could tag along – and thankfully they accepted!

The cogs started turning to plan cycling trip which ended up spanning just shy of 1,000km on paper, but had ample time allowance for both my friend’s plans to meet his “Splatoon” gaming acquaintances across the country, and my own osu! time requirements on a daily basis. It would be an effort, but one that could coexist with ongoing responsibilities.

The company

I should probably start by introducing Dunnymeister (shortened here-forth Dunny), my good friend (and later on, coworker for some time before osu! took off). He’s a Taiko no Tatsujin connoisseur, great chef and even brews his own beer.

The bikes

In recent years, I’ve been using an e-bike to get around. But I wasn’t about to take an e-bike on such a trip – not only would charging be a hassle (if it made it through a day in the first place), but it would just be rude to be riding an e-bike alongside Dunny on a non-powered bicycle. And honestly it would just make the whole trip less of a challenge.

Dunny originally planned to bring his bike across from Australia with him, but the logistics of this (and registration requirements in Japan) made him look in the direction of purchasing a bike here instead.

It ended up that we both started looking into Trek bicycles and eventually settled on some mid-range models. Aluminium body with hydraulic brakes and drop handles were the criteria we had in mind.

I went with a gravel model for thicker tyres and a more relaxed riding position. While I do plan to mostly stick to the tarmac, I am more used to riding on tyres that look like they aren’t going to completely lose traction at the sight of some non-road terrain.

Dunny went for the road model, which left us with an 8mm difference in tyres (32mm vs 40mm). Probably making life slightly harder for me due to lower efficiency, but a bit of quick research says there should only be around a 10% difference.

For reference, the models were Trek Checkpoint ALR5 and Trek Domane AL4. They served us well (and will continue to do so into the distant future, no doubt).

The assembly

Dunny had already chosen various cycling routes he wanted to challenge. But these were spread across half the country, and cycling between each of the courses would take way too much time. And, well, this was supposed to be a casual sightseeing trip, not a gruelling endurance ride.

The decision was made to use Japan’s amazing train network to get between some of the more distant areas we wanted to cycle. The caveat being that bicycles are generally not allowed on Japanese trains (with one recent exception!), which means we would have to get used to what is known as Rinko (輪行) – the process of disassembling your bike and putting it in a bag, making sure no bike parts are visibly protruding.

The gear

Apart from figuring out the general routes, the majority of planning was figuring out what we needed to bring along. Or rather, what we didn’t need to bring. We were very aware that cutting down on weight would be in our best interest, so taking the bare minimum was our goal.

Of course, it’s a delicate balancing act. What if we don’t have enough clothes to get to the next hotel with washing facilities? What if we run into mechanical issues, punctures or otherwise? And the hardest question of all: what is the minimum amount of tech we can get away with to both be productive and live comfortably?

We settled on dual pannier setups, along with some small frame bags with maintenance tools and for quick access food and drinks. Our pannier bags ended up weighing in at ~10 kg per person, so about the same weight as our bikes. This was basically our upper limit in terms of goal weight.

For me, this is what I decided on:

  • 2 x Tailfin Ultra Durable Pannier Bag
  • Restrap Top Tube Bag
  • Restrap Tool Roll
  • Rinko bag (DAVOS G-110)
  • Helmet (OGK Kabuto “IZANAGI”)
  • Spare tube and tyre levers (Trek tube / Panaracer levers)
  • Bike alarm (KNOG Scout)
  • Clothes for 3-4 days (including some non-cycling clothes for when we went out with friends along the way). Included some wet weather gear.
  • Toiletries
  • Mobile battery (80 Wh)
  • Action camera (DJI Pocket 2)
  • Mirrorless Camera (Olympus OM-D E-M1 MarkII, M.ZUIKO ED 12-40mmF2.8PRO, 3 batteries)
  • Bluetooth speaker (JBL CLIP 4 Bluetooth)
  • Laptop (MacBook Air M2)

The journey

Shimanami Kaido (しまなみ海道)

Possibly the most famous cycling route in Japan, spanning the islands of Shikoku (四国), this was the starting point of our journey. We spent the first day getting as close to one end of the route by Shinkansen as we could.

It was a bit of a rough start after discovering our train booking didn’t have the “oversize baggage” area correctly reserved. This surprised me as I was very careful to select the option when booking in the app. It was only later in the trip where I discovered an iOS level UX issue which can cause a change in dropdown settings to not register correctly if you confirm the action too fast:

Regardless, the train crew handled the situation so courteously and without any signs of distress, allowing us to place our bikes in between train cars. I continue to have unwavering faith in JR as a company. But we did really want to get off the trains and onto the bikes!

We made the decision to cycle from the Shinkansen station rather than catching a second local train – after our first train ride we were already tired of carrying our bikes on our shoulders and jumped at the opportunity to skip one train transfer. Getting off at Fukuyama (福山) station, we were full of energy with the route’s starting point of Onomichi (尾道) in our sights.

This was the first time we discovered just how much there is to see, even when not using a great deal of thought in the route. Even as we were racing an incoming storm, we couldn’t help but stop to take in the sakura (cherry blossom) in full-blossom; an amazing temple; a small corner shop selling the local range of citrus fruits and as we approached our destination, the scenery along the short of the nearby river.

Onomichi was a very cyclist friendly place to be, with the hotel we chose having dedicated road bike parking and facilities. This of course makes sense, as it is the starting (or ending) point of the route.

We ended the day with some local ramen. A highlight was a Japanese salaryman walking past and exclaiming “Ooh, he got a mega sized beer!” (おお、メガジョッキだ!) at Dunny’s mega sized beer!

🛌 Onomichi Kokusai Hotel
🍝 Onomichi Ramen Aji Men

And so we set off on the Shimanami route.

The first day started with getting our bearings - figuring out how to get on to the route (up a windy road, over a bridge we weren’t sure we were even allowed to ride) and subsequently how to remain on the route. The general idea is “follow the blue line on the road”, but we soon learned that this line can arbitrarily stop in places you wish it didn’t.

As a note, the normal way of getting on the route from Onomichi is to take a short ferry trip, which I’d probably recommend as the more scenic and straightforward route.

We were taking the route on a bit of an off-season, so we mostly had the roads to ourselves. There were quite a few roadside stops along the way, including locals selling their produce (and giving out free samples of course!).

Other cyclists were very friendly, and the bikes they were riding ranged from aero road bikes to fat-tyre.. contraptions. We stopped at a convenience store (aka Conbini) for refreshments and watched over as a group of 10 or so cyclists riding together were figuring how to repair a tubeless puncture – seems we weren’t the only ones with little experience with tubeless tyres!

Our first day was quite a long one, as we stormed through the first three of the route’s bridge crossings in order to reach one of the only accommodations we could find with vacancies on this day. I need to mention here that it was our smart idea to wing accommodation for this part of the journey (surely there would be plenty right?!).

The beds we managed to secure were at a very cosy cafe-hostel combination which served some great beer, pizza, fish and chips and sour drinks mixed with the local citrus fruits. We consumed it all. The hostel owner (and chef for the night) may have forgotten our orders more than once, but the amazing food, drinks and vibe more than made up for it!

🛌 Coliving & Cafe SANDO
🍝 Coliving & Cafe SANDO

Our next morning started with the goal of finding somewhere that was open for breakfast. We found nowhere, so settled on a conbini breakfast. On the way out of the town, we did a final ride around to check out the area and came across a small storefront for a local winery. Thinking they might also have some kind of beer or snacks we headed in. The lady there informed us that they didn’t really have much other than some bottles of wine for sale, but passed on the amazing news that there was a wine and beer event on only today, and only 6 km away. Even better, it was basically on our route out of the area. How could we resist such an amazing temptation?!

As it turns out the event was being run at a local cycling organisation’s camping grounds. We greeted the staff from the same winery that made us aware of the event, and then went on to definitely not drink every wine and beer on offering (a total of three different stalls)… because we are responsible cyclists and that would take us over the legal blood-alcohol limit of 0.00% in Japan.

We also consumed some very awesome jerk chicken. The guy making it had a great selection of hot sauces.

We then set off – in very high spirits – for our next destination of Imabari, a city famous for locally produce towels. The towels are actually world renowned for their high quality, to the point the city has an official certification process which companies can apply for in order to don the coveted Imabari branding.

After arriving, we managed to find a hotel that had rooms with built-in bike stands on the walls, very cool! All these special rooms were taken unfortunately, but as usual were met with exemplary customer service – something referred to over here as “Omote-nashi” (おもてなし) – pulled through and the front desk setup some bicycle stands in the lobby especially for us. Well, for our bikes.

We then went on a walk to find a small family-run eatery (Shigematsu Hanten) that is said to server a rice-bowl covered in eggs to die for. Not the fanciest of places to eat, but the food was as amazing as expected!

🍝 重松飯店

Imabari was one of the “cycling stations” on this route, so in the morning we made use of their pumping and washing facilities to give our bikes a bit of a clean-up after riding through semi-wet conditions the last couple of days.

This was the first time I was able to use a proper tyre pump and check my tyre pressure. I was a bit suspicious as I was struggling towards the end of the previous day.. but very surprised that it was around 22 psi!! For efficiency I really shouldn’t have been running below 30. I pumped them back up to 35 psi and the difference was night and day!

After a maccas breakfast we had been craving, and a brief detour through a “Hard Off” – a huge second-hand electronics store that could literally hold our attention for hours – we set off for another day on the road.

We stopped by at a large roadside rest area which seemed to have a weird cosplay culture going on (of the military variety)!

The day before when checking in at the hostel, the owner made small talk with us and it went something like “Ah, you’re cycling the Shimanami route! I guess you’re heading to Dougo next?” to which we responded with a puzzled look.

Upon a bit of quick research, Dougo Onsen is a very historic onsen area in Matsuyama which seems to be a must-stop. So of course, we planned a detour, lest we disrespect the Japanese cycling pilgrimage!

Dougo onsen was everything we imagined it to be – a small town-like area with ice cream, beer and many people looking to take a bath. The main onsen building had a waiting list of around 2 hours, but the staff informed us there was a second building that recently opened, with the same “quality” of water (as in it comes from the same fabled mountain source) but no wait time.

We didn’t really have two hours to spare as we wanted some time to make the remaining distance to our next lodging before night hit, so opted to locate the second, much more colourful but less ancient-looking onsen.

And oh boy was it worth it. There’s nothing quite like hitting a hot spring and taking a moment to relax and reflect on the journey thus-far before continuing on.

Our accommodation tonight was an Airbnb on the coastline, in the middle of nowhere. It was a huge looking house that most definitely was inherited or bought for the specific purpose of renting it out.

They mentioned in the description that it was possible to use a disposable BBQ set in the garden area, so we made a stop along the way at a supermarket to buy enough vegetables and meat to replenish our energy.

Oh, and beer.

The ride along the coast during golden hour and leading into sunset was absolutely magnificent. Then the sun dropped and the chilly evening air hit, bringing us to our senses. This was definitely not outdoor barbecue weather.

We arrived at the accommodation, with the last 5 minutes of the ride being up an insanely steep hill to get there. We were already worn out and this is the last thing we needed, but at least it warmed us up a bit! On arriving, the sight of this amazing traditional Japanese house with its own rock garden and sea views made the effort probably worth it.

The barbecue happened. We didn’t really bring much cold weather clothing as we were trying to travel light, so layered on as many layers as we could to make this evening work. It was pretty great but also pretty cold. Without beer and good company it likely wouldn’t have been anywhere near as bearable.

🛌 Entire home in Iyo
🍝 BBQです

Final day of Shimanami, and we were on the clock, with a ferry booked and still 34 km to travel. We set out as early as we could and powered through.

This final segment was quite memorable for the four tunnels that we had to traverse – up to 1 km each. You could tell when one was coming up as the elevation graph on our GPS went from being bumpy mountainous terrain to suddenly completely straight and flat.

In the tunnels we could pick up some great speed, but we were also riding alongside cars and trucks in a confined space. And tunnel acoustics mean you get hit with the car noise ten-fold as it arrives from every direction, echoing off all the walls.

We made the ferry with around 45 minutes to spare and prepared for boarding alongside some bikers. It was a pretty great experience seeing the ferry workers securing our bikes to dedicated road bike mounts, and then leaving them for the main cabin.

Once on board, we enjoyed a bento box for lunch, with more than one craft cider featuring citrus from the local area. Dunny was exhausted and went to our private room to catch some sleep. I went to the lounge area and caught up on what work I could manage in the short 2 hour trip to Beppu.

What we had waiting for us at beppu was (arguably) our most luxurious accommodation of the trip – an intentionally timed choice to give us our best chance at recovery before what was to come. Hint: mountains, many mountains.

The food here was a sublime Japanese traditional multi-course feast (会席料理). We had a very enthusiastic waiter serving us. I asked him something I’ve always wondered: why the rice always comes last (I like having rice at my side to eat with the rest of the food!). He gave us a 10 minute breakdown of the cultural and traditional meanings behind each course off the top of his head. It was enlightening!

Oh and the reason for the rice coming last? It is called the “shime” (〆) and signals the end of the food – and more importantly drinks.


Yamanami Highway (やまなみハイウェイ)

We knew ahead of time that this was to be the pinnacle of pain in this trip. So far we were averaging 100-300 metres of elevation change a day, but the first part of this route was to see us climbing 1,450 metres! Our destination was a tiny bed and breakfast hostel run by some of my (not-blood-related) Japanese family. This couple used to run a “rider’s house” – small no-frills accommodation for bikers – but have since moved and now run this cute little accommodation alongside a curry restaurant. I had to visit it, and it was almost precisely on a route!

The day started later than usual as we enjoyed the last of our relaxing stay. We stopped by at a GIANT store on the way out and I picked up some super light gloves. We then set out and were hit immediately with a never-ending slope. The kind of ruthless hills where no end is in sight and all you can do is pedal on.

Early in the climb, we also came across a Montbell store – this area turns out to have some very popular hiking routes as well. I was able to find some really nice arm covers (basically long sleeves without the shirt part for covering from the sun), continuing in our theme of trying to cover more and more of our bodies from the sun. UV during the middle of the day is pretty crazy to the point that even with sunscreen we weren’t feeling safe.

As usual, we exchanged some pleasant small talk with the staff in the store who were very interested to hear about our trip. But it was time to carry on the ascent.

..The hilly terrain just never stopped, and the mountains kept going up as if there was no end. We would turn the next corner and there would be a new mountain to climb right in front of our eyes. We passed a cable car taking people up a good portion of the altitude we were covering, and honestly if they allowed bikes on we may have been tempted to take it!

There was one section where we were speeding downhill around 250 metres after a 900 metre effort uphill. We exchanged some concerned looks and ended up pulling over just to make sure we weren’t going the wrong way and undoing all the work we did! Luckily, it was all part of the route.

As the sun began to set and we were still quite far from our destination, I made a courtesy phone call letting them know we would be a bit later than expected and were still gruelling away on the road. From the chuckling on the other end of the line, I could tell that I must have conveyed the exhaustion level we were experiencing quite well.

This was one of the first opportunities to use the bluetooth speaker I brought along to jam to some tunes (I was hesitant to use it around civilisation due to noise pollution concerns). It definitely helped keep us energised and motivated to keep on keeping on.

Within kilometres of our destination, we happened upon a small stable with goats and other animals. There was one middle-aged man who ran up to us and we chatted about our trip and about the local area. Friendly locals are always a blast – Japanese country people always seem to be more willing to engage in conversation than in the larger cities. Though I guess that’s likely not a trait specific to Japan but more to do with living out in the country.

Down the final slope, there was a group of school kids on their way home from club activities at the end of the road. They gave us the most welcoming wave and greeting! Another sign that you’re really in the countryside.

The guest house we stayed at would usually house up to 10 people at a time, but since COVID it was only available to a single group at once, rather than being shared accommodation. I don’t think that policy is still in place, but we did have the whole place to ourselves, giving us plenty of space to relax and take in the complete silence, apart from the pitter-patter of rain (which we narrowly missed) and sounds of nature.

Before settling down and getting some well-needed rest, our stomachs needed filling. Our curry was waiting. Call it a biased perception – coming off the tail of likely the most strenuous exercise I’ve done in my life – but this was the best tasting curry I’ve had to date. We ate not just one, but two full servings of curry each (classic Katsu curry and Butter Chicken curry)!

Amazing hospitality and some great conversation. Luckily, the Japanese couple running this place did remember me. (I showed up unannounced after not seeing them for a good 8-10 years, so that was quite a happy and relieving moment).

🛌 はんだ高原 ゲストハウス
🍝 Cafe tanetone

This wasn’t the end of our uphill segment, though. Nowhere near as bad as the previous day, but still a challenge. Our goal was the second ryokan of this trip, and awaiting us was a buffet feast. Plenty of motivation to move on.

Starting with the second half of our hill climb from our local peak altitude, we continue forwards along Yamanami Highway, aka Route 11.

The very squiggly portion of road on the map was a rapid descent back down 300 metres of mountainside. Not only was this scary due to the crosswind – almost got blown over at least once – but we also weren’t sure if we were on the correct route. This time it was not really a road we could safely stop on so plowed through with crossed fingers. Luckily all was good, and it was just part of the contour of the area.

Along the way we made a few stops at various roadside attractions, including massive $20+ watermelons, cute cats and a mountain goat getting entangled in its leash. I tried my best to teach the goat how to free itself but goats are apparently not smart.

Approaching our accommodation after another long day, our very direct route told us to ride straight through about 2 km of rice fields. This wouldn’t have been too bad, except that due to the recently rain it got very very muddy. But after a day of hill climbing this was quite a welcome change so we embraced it until it got so deep we couldn’t move forward!

When we arrived at the next accommodation, we asked where we could park our bikes and in a very welcome pattern, after the reception notices we are on road bikes they offered to let us take them to our rooms. Which would have been fine if we didn’t just coat the tyres with fresh layer of mud! We parked outside at a public parking lot next door to save them the clean-up. And enjoyed many beers and buffet Yakiniku.

🛌 湯巡追荘
🍝 湯巡追荘

The next day, as we were already very close by, we set out to visit the peak of an area known as Kusasenri. Kusasenri (草千里) has an amazing panoramic view of the grassy flats around volcanic mountain Aso (阿蘇山).

While we were recovering and taking in the sights, we spotted a pro biking team arriving, who had cycled the whole route that took us one-and-a-half-days to cover in just one morning. It was amusing to see them on super-light bikes with no luggage next to us, with four panniers probably weighing more than all of their bikes put together!

Felt like we were doing something wrong.

Next up was a new single-day distance record, and finally a mostly downhill segment. Our next goal was Kumamoto, to visit a castle and eat some local ramen.

The most memorable part of this day was getting stuck behind some slow traffic during a long mountain descent, next to a small group of bikers (on motorbikes). Since we were all limited to the speed of traffic (still 30km/h or so), we shared the enjoyment of the weaving descent together and had some short exchanges of words while riding. Kind of wish I got some footage from this, but still not at the point I felt confident operating a camera while on this kind of route!

We bid our farewells at the end of the descent as traffic got lighter and we couldn’t keep up with their speed on the flats.

In a continuing pattern, even though the accommodation said they had no bike parking, they accommodated to us and let us store the bikes safely indoors. We were as grateful as ever. They also made us some mean sandwiches for breakfast the next morning.

🍝 龍の家

This stretch was a race against an incoming storm (which spoiler alert: we lost) and also trying to find a route which didn’t take us directly through another mountain range. By this point we were a bit tired and hurting from all the previous days, so even though it was only 40km, it was quite a high effort ride through gloomy weather.

One thing which helped keep our morale high was finding a karaage (fried chicken) shop early in the ride for a very nutritional breakfast, and seeking shelter along the way in some tunnels.

Not too much to say here. Our destination of Kurume was chosen specifically to eat Mohikan Ramen, at Dunny’s recommendation. Too much ramen lately? Nah!

🛌 The Celecton Kurume
🍝 モヒカンらーめん 味壱家 本店

Our final length of the Kyushu journey was to get to our final destination of Fukuoka, where we would take a break for a few days as we visited friends and family. The first time off a bike since the start of the trip.

This day saw us following a major highway, but not one where bicycle were allowed. So we spent a lot of time riding alongside the road, quite often through farmlands, which was a nice change of scenery and pace.

As we approached the city, the weather made a turn for the worst, and we were back on the main road. quite an unpleasant experience as the trucks, passing us at high-speed created their own local weather systems with water, hitting us from every direction!

We were planning to use the opportunity we had during our break at Fukuoka to drop our bikes at the local Trek store for a check-up. This turned out to be quite perfect timing for me, as I got a flat tyre just 3 km before arriving!! I had to pump the tire two or three times to make it there, but we did it.

And then we split ways for a couple of days to take a break and catch up with our friends.

Biwaichi (琵琶湖一周)

After a few days parting our ways and catching up with friends and family in Hakata, we reconvened at Hakata station and bagged our bikes, back on a Shinkanen destined for Hikone (a castle town near Biwa lake).

This was to be our starting point for circling around the lake itself.

As we left the train, we started to assemble our bikes and noticed that we were right next to a bicycle rental store, right in the station. This was road bike rental, too, which make us feel like we were at the right place. Got a few looks (of curiosity?) from the staff as we assembled our bikes right next to the store.

After a short ride from our shinkansen station through light rain, we spent a night at a ryokan overlooking the castle.

The highlight of this ryokan was another guest who we met at the bar area on arriving. He was talking loudly and we were very bemused by his conversation. He was a self-proclaimed regular, and was with a woman who seemed to be a.. relatively new acquaintance. Talking up his connections with the owners, pouring expensive wine from the bottle (it was a very casual BYO bar area).

We went to the conbini and bought some local chuuhai and came back to join them. The guy was actually very friendly, and even poured us some of their wine. We offered them some chuuhai but they were good.

We ate teppanyaki and were lucky enough to be the only people in the restaurant, having the full attention of the chef. He was a very cool guy and very skilled chef. he asked if we wanted to upgrade our rice to garlic rice and there was no way we were saying no!

Still not content with the consumption of alcohol, we decided to make a trek to a conbini. We were already in yukata and wearing wooden sandals. It turned out to be about a 1 km walk. Also, heavy rain started halfway.

I don’t know if it was the sheer absurdity of the situation, the exhaustion from days of riding or the booze, but we were both hysterically laughing the whole way back. We arrived completely drenched, trying to avoid eye contact with the entrance staff while we got back to our rooms and hung absolutely everything up to dry.

🛌 ホテル 彦根キャッスルリゾート&スパ
🍝 ホテル 彦根キャッスルリゾート&スパ

The next day, we set off early in the morning to make it as far around the lake as we could.

After an initial hiccup where we rode 6 km before realising we were going the wrong way around the lake (spot it on the map), it was smooth progress. Very little elevation change, but a lot of distance.. and bugs to the face.

90 km in one day was a new record for us. My legs definitely felt it. There’s also something to be said about the scenery around the lake changing very slowly, and the fact you can basically see your destination on the other side of the lake (through some very heavy mist!) that made it less of an amazing scenic experience than our previous routes.

Nevertheless it had its great moments. We stopped at a rest house for lunch (and so I could participate in the bi-weekly osu! dev meeting). We also found a little house / shop that was selling craft coffees and ginger biscuits. We bought biscuits intending to take them back as souvenirs for friends but ended up eating a good portion as they were so good!

We stayed at a very non-remarkable Japanese inn. What we didn’t realise was that the town we chose to stay at had zero dinner options. It didn’t help that it was a Wednesday which was the day of the week when most restaurants take a break. Literally the most isolated I’ve felt when travelling in Japan to date (there was only one conbini for the whole town!).

We ended up walking 30 minutes to a nearby station and taking a train two stops and finding a Coco Ichibanya curry house to satisfy our spicy curry urges.

🛌 恵美寿荘
🍝 CoCo壱番屋

The next day was the final portion of the Biwa lap for us. Quite possible the most memorable day: we came across many other road cyclists along the way, but one middle-aged Japanese man in full pink cycling outside was with us for a good 10 minutes. We ended up having a long exchange with him while riding.

Turns out he is a local and rides around the lake almost every day, clocking up over 1,000 km a month. It was really fun to share our experiences with him, and hear how he regularly runs bike tours around the lake showing people around. He even offered to take us to our final destination, somewhat in the opposite direction to where he was travelling, but we politely declined as we wanted to make a stop at a local department store along the way.

He left us with some energy pouches that I don’t think either of us have opened to this day, keeping them as memorabilia of the trip. I wish I thought quick enough to give him one of the koalas that was hitchhiking on my bike in return! We actually tried to find this guy on twitter or similar so we could stay in touch, but unfortunately haven’t had much luck. I guess we’ll need to head back to the lake at some point to find him again. Hopefully he’ll still be wearing pink as to make identifying him easy.

We stayed at a very interesting little guesthouse constructed to make the most of the limited space they had. Each room was crafted to use every last centimetre of available ground and wall space to the fullest. They also had a little cafe and bar on the bottom floor, with hand-crafted miniatures and many a collectibles across such a wide range of hobbies that I was astounded it could be all the doing of the couple running this place.

Our dinner was a very average conveyor belt sushi (回転寿司) experience at Sushiro. Wouldn’t do again, noisy and automated to the point of frustration. Am I the only one that enjoys a bit of human interaction when going out to eat?

🛌 苔生宿/Koke-Musu:inn
🍝 スシロー

To Osaka (京都→大阪)

You may have noticed we didn’t actually do a full rotation of the lake. That’s because we wanted to set ourselves up best we could for the next day, position wise.

One of the auxiliary goals of this trip was to visit Universal Studios Japan for the Super Nintendo World experience. Our original plan was to pack our bikes and use trains for the remaining portion of the trip, but coming this far, we agreed that it was very much preferable to just ride the distance.

This turned out to be a fairly nice ride, following Yodogawa river most of the way between these two cities. Most rivers in Japan have shared pedestrian/cycling paths which meant that finding our way around was quite simple once arriving at the river.

The only thing blocking progress on this day (quite literally) was blockades every few hundred metres on these paths, intended to stop motorcycles and bipeds from using them. Usually, you’d be able to cycle a bike straight through (with a bit of precision), but due to the breadth of our pannier bags this meant lifting our bikes each and every time. I think we counted about 20-30 of these.

Arriving in Osaka was quite unremarkable. But it was the first time where a hotel was not willing to work with us for bike parking. I had to search around the area for something that would work for us, which happened to be a department store about 10 minutes walk away. Not too bad.

We spent two days and nights in Osaka, checking out the touristy things like Doutonbori (道頓堀, a smoke filled night life district – no thanks!) and eating some amazing street vendor Takoyaki and ice-cream!

We found a craft beer bar with really welcoming staff and spent both nights drinking all they had to offer, both local and international selections.


Let’s not forget our main goal being to visit Super Nintendo World at Universal Studios, alongside a friend who travelled from Tokyo to meet up with us. We had to buy tickets months ahead of time, but even having tickets, we had to arrive within a 15 minute window and join a massive line to get in to the colourful Mario sub-area.

We witnessed a Japanese family handover two of the tickets to a foreign family that was crying at the entrance, not able to get in as they didn’t realise the area needed a second separate ticket.

I won’t to go into too much detail about super Nintendo world, but it surpassed my expectations in many ways. The soundtrack was definitely the highlight for me, with original compositions and arrangements of existing Mario music renditioned to suit the theme park. As you walked around, a single track would seamlessly transition into different versions, it was just so well thought out!

We ended up, glitching out the star system and getting into the final Boss battle room while skipping one or two mini games. Which was great because each mini-game had a 20-40 minutes waiting time in line.

The only real drag was the amount of lining up to get anywhere.

To Himeji (大阪→姫路)

This was a bit of a bonus round. The original plan was to catch a train but after the previous efforts, we were much more confident at this stage we could make a final 110km push and avoid the hassle of bicycle disassembly.

Getting out of Osaka was a bit of a pain, but once we reached the coast this became an amazing route. We followed a main road for a good portion and stopped for lunch (and beer) in Kobe.

Continuing on, we took an amazing shared pedestrian/cycling path for a good 10 km, with coastal views the whole way and not a single car in sight. A very welcome change!

The last segment saw us following the Shinkansen tracks while taking on some very strong head winds.

Pushing through on our longest ride yet, we made it to Himeji just after dark, quite worn out. It was an unexpected surprise to see a welcoming party, waiting outside for our arrival! Very heart-warming!

And that’s a wrap!

All in all, we ended up covering a good portion of western and southern Japan. Would have loved to fill in the gaps, but we were already pushing both our fitness limits and time constraints! I actually needed a couple of months to recover from knee pain that was building up (apparently quite a common thing amongst cyclists when you go beyond your limits).

If you’re interested in diving deep into the routes we took, along with our speed and (my) heart rate, you can find the raw data here!

Oh, and this wasn’t actually the end of our cycling team. When we got back to Tokyo, we still felt like a final ride before parting ways, and did a 105 km trip up (and back down) Tama river (多摩川) to feast on some burgers. This set a record for a single day on this trip, and was a really nice way to end things!

As an aside, I was really happy to have as much footage and GPS data of this trip, and enjoyed the process of creating this article (along with figuring out the best way to visualise things). While I ended up using Relive – and app that does most of the heavy lifting – I tried out five other methods of visualisation, all which had their individual benefits and drawbacks. Here’s just one example I was toying with, which feels really nice and correctly shows the break stops we made along the way, but ultimately didn’t convey the scale that 3D visualisation can.

Society, technology and everything around us is changing faster than ever. A lot of the social discourse and news that is propagated these days is negative, uncomfortable and sometimes just outright scary. You may call it coping, but I make the personal choice not to follow world events and stay as uninformed as possible. It keeps me sane.

Call it luck or call it genes, I’ve never felt anything like burnout, stress or depression. With that said, during covid due to lack of social interactions I optimised my life to allow me to be the most efficient developer I could be. My productivity sky-rocketed, but in that time my fitness dropped significantly, and while I was still very happy, life became a touch mundane.

This cycling journey allowed me to observe and interact with people in smaller towns and of differing cultures and lifestyles, living with completely different perspectives and outlooks on life to your own. It felt refreshing and to an extent, opened my eyes to facets of life that I may be missing out on with laser-focused productivity goals.

Interacting with people and experiencing what nature has to offer is invigorating. Pushing yourself beyond the limits you thought your body had is painful but rewarding. If you’re not in the best place mentally – or even if you are but just need a change in pace – maybe it’s time to do something crazy like cycling in one direction as far as you can. It might help set you straight just a bit.

Oh, were you expecting an update on osu! development? I’m sorry to disappoint. The ongoing development on lazer is going great, although we’ve had setbacks with both available developers and dealing with the insanely complex requirements of each and every user.

In hindsight, trying to address almost every problem users had brought up in the last decade all at once wasn’t a good goalpost to set. And maybe the yearn to keep all game and scoring history intact and roughly balanced with a newer system is a stupid waste of time. But I will continue plodding along in a forward direction that I hope will end in something that old and new players can respect.

If you want to know more about the development process, we’ve basically shifted to a video changelog style, with around two update videos a month. It’s really fun and probably easier to digest than text anyway!

Until next time!


osu!stream 2020 release

published 26 Feb 2020

osu!stream was a project devised by me in 2012 to experiment with the idea of an osu! game on mobile platforms. The focus was on trying new things, so not only did I want to experiment with mobile game development, but also add elements using multi-touch. In addition, unlike the desktop release I wanted to have a go at curating all game content, including both licensing music and putting together a team of awesome mappers to create the beatmaps.

Before I delve into some history and tidbits on the project, if you’re just interested in giving it a shot, click here to visit the app store and grab yourself a copy!


osu!stream began development on May 8 2010 and was released on August 1 2011. During this time, I was concurrently working on the PC version of osu!, so osu!stream was somewhat a “side” project. Updates were released in the form of new features (such as the ability to preview maps before downloading) and song packs over the next 2 years or so.

It gained some attention over the internet, and was featured by Xamarin as a game made completely on the Xamarin.iOS framework (link now defunct, unfortunately).

The game did quite well from a sales perspective, but was hindered by the complexity of the beatmap creation process and limited song choice for mappers. Many of the mappers either lost interest or didn’t have enough spare time to keep a constant.. stream of beatmaps coming in.

At the same time, osu! on PC was constantly growing in size. It’s very hard to keep track of multiple projects, so I eventually made the decision to move my focus back completely to PC and let osu!stream sit without real updates for years. I don’t regret this decision; the game was left in a good state and has enough beatmaps to be a very fun and unique “osu!” experience. I still see it as the most polished osu! release to date – although this is soon to be surpassed.

Interestingly, a lot of the concepts we are using in osu!framework have some history of being present in osu!stream. The concept of hierarchical drawables/sprites began to appear, and while quite raw, was used to apply game-wide scale and rotation effects which would otherwise not have worked on limited mobile hardware.

Some statistics

There were a total of 3,839,438 scores submitted over osu!stream’s lifetime. This doesn’t include fails, unlike osu!, and only considers those that logged in via twitter (241,540 total). For a better idea of total audience, there were a total of over 1.5 million installations as of 2016. It’s safe to say a lot of people enjoyed the game!

2.6 million free beatmap packs were downloaded over this period. As for sales, there were a total of 24,943 beatmap pack sales (averaging US$1.99 a piece) by 13,635 users. After taking out apple’s cut and artist’s cut, this worked out to around $24,000 in revenue over the lifetime of the product. This was distributed between myself, the mappers, other devs who contributed time and the graphics design work.

The mapping team consisted of around 15 people, hand-picked based on their mapping style (I wanted to emulate the amazing feel of iNiS maps – the stuff that was in the Osu! Tatakae! Ouendan! / Elite Beat Agents series). We released a total of 37 beatmaps for it by the end. Beyond this though, there were over 100 beatmaps in some stage of creation.

A final release

Today marks the first update since September 2015. I was actually planning on making this update over a year ago, but ran into some serious issues with newer Xamarin versions where the game would freeze at random due to a native memory issue. I came back to this muiltiple times over the last year and while I have still not tracked down the underlying cause for it (likely a mono bug), I found a hacky workaround which allowed this release to happen.

A few things have changed in this release:

  • The game soundtrack has received a complete refresh thanks to superstar osu! composer nekodex! Experience a new take on the original osu!stream soundtrack in the game (pay attention to the main menu visualiser which is synced up to the new track). If you want to listen outside the game, you can also buy or stream the album (including the old version of each track) from your favourite store/streaming service .
  • Support has been added for new device aspect ratios and notch things (iPhone 10 / 11). The implementation of this was a bit hacky, but oh well.
  • All beatmap packs are now free. They are still available via the “store” screen as I wanted to retain the original game experience.
  • A few extra unreleased packs are also available as a bonus. These never made it out due to licensing or quality control issues, but I feel like there’s not much reason to hold back now.
  • Online ranking and login has been disabled. This used to be provided via a twitter login, but the API has changed and I don’t really feel like updating that or maintaining the scoreboard. Existing scores are still visible, as I want people to be able to experience as much of the game experience as it was when fully activated.

I will not be working on this project further due to time constraints. While this may disappoint many, please be rest assured that the osu!lazer project has mobile in its sights, including bringing back elements of osu!stream (like multitouch)! For those unaware, you can already join the testflight beta program and jump straight in to give that a try.

Of course, there’s one little thing I failed to mention: I am also releasing the source code to osu!stream, including all the beatmap creation tools and local multiplayer server (see the network branch).

While this is by no means a pristine codebase (try osu!lazer / osu!framework for that!), my hope is that some curious developers can see what goes in to making a game from scratch with a focus on releasing it rather than making the code perfect. You have to cut corners sometimes (and oh so many were cut) to get things released.

As for the future of this repository, I may provide code review and potential app updates if there are user contributions, although the criteria for these is quite specific so please make sure to read the README before diving in too deep.

While released under the all-permissive MIT license, please note that the osu! name is still covered by trademark law and you shouldn’t go distributing binaries of this app unless you first rebrand it. And I’d still rather you ask before doing so in such cases, out of courtesy.

Fun facts

A lot of cool things came from this project. Here’s some things you may now know about it:

  • The codename for this project was “osum”, as in “osumobile”. You might still see this term used around in the source code.
  • osu!stream was written almost completely from scratch, including rewrites of file parsing, hitobject display etc.
  • osu!stream was written with performance in mind. it could achieve a consistent 60fps on the iPhone 3G and original iPad, where most games were struggling to hit 30fps.
  • An Android release was planned. Test builds were sent out to many users and while it ran perfectly on a few devices, the number of issues and number of different devices to support, coupled with the fact that Android touch screens at that point in time has shocking response times meant I never released it.
  • All mappers were compensated for their time (between $100-200 per beatmap).
  • All music for osu!stream was licensed ahead of time of the game’s release. As I didn’t have huge up-front money to spend, artist were offered a percentage of game sales (30-50%).
  • I approached record labels to try and obtain correct licensing for larger artists, but was met with confusion over how to handle video game licensing. This situation has definitely improved over the last 8 years, as seen with featured artists.
  • Over halfway through development, and after finishing some amazing doujin music based beatmaps, licensing terms were changed beneath us and we were unable to release a whole heap of maps. They’ve finally been released with this release (I hope this doesn’t step on any toes, but it’s completely free so hopefully it’s fine).
  • Mapping for osu!stream is quite a challenge due to the stream-switches requiring alignment checks, consideration for hands hiding hitobjects and general multitouch playability concerns.
  • While some of the more arty UI components were provided by a community member (Koko Ban), the in-game skin is by me! and one of my favourite to-date.
  • We had some quite serious legal issues which caused the app to actually get removed from the app store after some douche made fraudulent claims that he owned copyright over the spinner texture.
  • osu!stream was used in the osu!arcade cabinets. This was a limited run prototype arcade setup constructed by my dad and I. osu!stream would run on a mini ITX board with lighting controlled over serial to an arduino. A LAN multiplayer server could allow two instances of osu!stream to compete in real-time head-to-head gameplay. One cool thing about this was you could see the other player’s touches on your screen due to the magic of no latency networking!
  • To increase the beatmaps available to osu!arcade, the beatmap tools were modified to do a best-attempt conversion of PC beatmaps. It doesn’t always work well and due to the tools being a completely different codebase, can be thrown off by all the zany things osu! maps do which are not supported. You can see a good assortment of beatmaps played here.
  • The game got pirated (of course) on jailbreak stores. They bought the packs using a specific UDID then hardcoded that into the app to continue to download the beatmaps from my server. Unfortunately for the poor souls that used this version, I quickly changed the server-side code to return 1gb of random data to these users, instead of the beatmaps they requested. This would waste their download quota and eventually crash their device.

A definitive osu!lazer FAQ

published 21 Oct 2019

With the osu!lazer project creeping closer and closer to being a feasible alternative to osu-stable, the number of questions I receive on a daily basis is growing. Let’s take a step back and answer some of the most frequency asked questions, sourced from you guys.

Development and Release Schedule

What is lazer / Is osu!lazer a new game or an update?

“lazer” is just a codename for the development project. When we’re done, lazer will become “osu!” and be released as an update for the existing client. It will migrate all existing user content and work on (basically) any system which osu-stable could run on.

Why isn’t lazer out yet?

Technically, it is already out (and has been since February 2017!). You can find the latest release available for Windows, macOS, iOS and android here. Linux users can self-compile (a binary will be available soon).

For now, it is released as a preview which will run alongside your existing osu! install.

Do note that as everything is stored in a new format, it will take up more disk space if you import your existing beatmap collection.

But I can’t submit scores! Until I can earn pp it’s not “out”

Fair call. We’re holding off adding this final step until everything else is ready, because we want to ensure the game experience is where we expect it to be first.

There is also a lot of final checking of compatibility which will need to happen before we can add score submission, to ensure the vast library of beatmaps, skins and otherwise are compatible and on fair grounds with historic scores.

Until then, you can enjoy the new multiplayer system which is exclusive to lazer, allowing local leaderboards to be created by anyone.

The release date was supposed to be 2015! I saw it in a teaser video!

The 2015 had a “?” and was meant to be a very optimistic outlook on development. The video description mentioned 2016 as being the goal.

Along the way, we ran into some serious blocking issues which resulted in the decision to rewrite osu!lazer as a new project from scratch, rather than building on top of the existing osu! codebase. This happened in the early months of 2016.

Since then we have been working extra-hard to build both a game framework and rebuild all the intricacies of osu!, while also fixing all the issues that existed in the old codebase to allow for implementing new features and extending on the game more than ever before.

We hope you can understand how excited we are to have this opportunity. The decision could only be made because we already have such a stable game client which (in general) satisfies the community’s needs quite well.

Why is it taking so long?

We are aiming for perfection.

That has meant, on several occasions, writing and rewriting systems until we are content that they will last well into the future. What we are working on is not a temporary solution, rather something to carry the osu! community through the rest of its (hopefully long) life.

We are also taking the time to involve the community via open source, allowing anyone to contribute code.

There are a few benefits of taking this time and diligence:

  • More people getting involved means there are less points of failure
  • High quality code and documentation makes it easier for new developers to jump in and help out.
  • We will hopefully not ever reach a similar fate as the old codebase, requiring a rewrite.

Why open source?

I have always wanted osu! to be open source. It is part of my belief that game development and operation should be very transparent to the end user. It may take a bit longer to do development in the open, but we are already seeing appreciation from other devs (and users) for making this move.

It also ensures that osu! can live on beyond me. If something were to happen, it is very feasible that members of the team and community can take over development into the foreseeable future.

Will there be a transition period where I can use stable?

In a similar way to stable and the stable-fallback release stream, the existing client will be available until it no longer has a function. For those of you with the mentality of “I want to use the current client forever, I don’t like lazer!” please bear with us. Our end goal is to make lazer better than the old client in every way, to the point there will be no reason not to use it.

New Features

What’s new in lazer?

While our primary goal is feature parity with stable, there are already some features that are exclusively available in lazer

Many new mods

We have already had several user-contribute mods, and welcome contributions of new and interesting takes on gameplay (we are sure many more will come!). Combine from the vast array of new mods to create unique custom challenges.

A new “timeshift” multiplayer mode (read more about this here).

This will pave the way for localised leaderboards that can be created and customised by the community. Of course, traditional real-time multiplayer will also be added in the future.

The ability to change settings anywhere and have them immediately take effect

Every single setting game-wide is made to take immediate effect. Hit ctrl-o anywhere to bring up the options (or ctrl-t to bring up the toolbar) and change a setting to get a real-time preview!

A more streamlined UI and a fresh design

The end goal is to have a user-first experience that feels like its own custom operating system. And will be nicely scalable across all screen sizes and resolutions.

Access to most of the web-only content from within the game (news, changelogs, user profiles, rankings, beatmap info)

The end goal is to make the game stand-alone from the web site.

A song density graph in gameplay

This is one of the first new gameplay UI additions. More will be coming, giving better insights into your gameplay and performance.

The ability to seek in replays

A long-standing feature request. The framework is also in place to allow rewind/replay support from point-in-time, paving the way for a “practice section” mode or similar.

The ability to hide difficulties

We’ve rewritten the beatmap database to allow for more flexibility and extensibility into the future.

Soft delete everywhere

If you make a mistake, you will be able to undo delete operations.

The ability to change the size and scale of the game with super-fine control.

This will allow players to remain in exclusive fullscreen (for lowest latency) while having full customisation of their UI and gameplay areas. You can choose whether to scale everything, just the menus, or just the gameplay for extremely fine control over your personal layout!

Will xxx feature be implemented in lazer?

We are primarily working on feature parity, but if the feature you’ve asked for has been something people have been asking for for quite a while, you can be 90% sure that it is one of the reasons we are working so hard to rewrite osu! in the first place!

Why is xxx feature being implemented in lazer but not stable?

As much as we’d like to bring new features to the stable client, it doesn’t make sense in many instances.

Generally, the implementation overhead for adding something in lazer is magnitudes lower than stable. By implementing it on both clients, the time of implementation would be more than double, delaying the release of lazer further.

For the last couple of years we have had a feature freeze on stable for this reason.

Will xxx feature be available on mobile?

Yes. Mobile and desktop will have feature parity.

Will new skin features be added?

Yes. While the existing skin/beatmap formats have been locked, we will be adding new formats (and in-game editors) which allow for huge amounts of flexibility.

Again, we’ve been planning everything with extensibility in mind. If you can think of it, it will likely be possible at some point in the future. That said, we are looking to make lazer have feature parity with stable before adding new options.

Will lazer have adjustable beatmap difficulty settings?

Yes, we are actively working on per-mod settings which will open a pathway for this.

Performance and Compatibility

Will it run on my PC?

If you can run stable, you will be able to run lazer. Note that users who can’t run stable for some reason (and are using stable-fallback) may or may not be able to run lazer. We are aiming for better compatibility than stable if anything.

Likewise, we also predict the system requirements will be equal or lower than stable. We are already seeing better performance, less frame drops and lower latency than stable in many scenarios (but not all, yet).

I’ve tried lazer but it runs worse than stable!

While lazer (usually) runs better than stable on most systems, there are always edge cases! We’ve still got plenty of work to do on optimisations (and already know all the remaining optimisations which will provide the largest benefits).

Make sure to check back regularly.

Will vulkan be supported?

While we are currently targetting OpenGL 4.0 and GLES (for mobile), we have been developing with graphics API portability in mind. We will be supporting vulkan and metal in the future.

Will my skin work?

Yes. We will be 100% supporting skins in gameplay, along with some menu-level interface elements (like the back button). We’re currently at about 90-95% implementation of skins for osu! and osu!catch, while osu!mania and osu!taiko need further work.

Will the new interface be skinnable?

We will be adding more skin support after we’re happy with the existing gameplay and support for legacy skins, including the ability to customise more of the menu screens.

Will there be touch controls to allow playing fast streams etc. on mobile?

Yes, these are in development. For now, you can connect a hardware keyboard.

Will there be touch controls for taiko/catch/mania?

Yes, these are also in development!

Will circles be larger on mobile?

Gameplay will likely get larger, yes.

We still have a lot of work to provide a good experience on mobile. We are primarily developing for PC first, and will address mobile UX issues over time.

I don’t like the new gameplay UI layout

Don’t worry, we are adding support for customisation of the UI layout, to the point you’ll be able to make it look like it used to (or potentially completely different!).

For example, a setting for the density graph is currently in development, which will allow it to either be hidden or less tall. Likewise, moving elements around the screen will eventually be present.

Leaderboards and Scoring

Will leaderboards / multiplayer be shared between PC and mobile platforms?

We haven’t made final decisions about the future of the global leaderboards. Personally I strongly believe in cross-platform play and hope to make this feasible.

Will lazer only use “score v2”?

We have implemented a new scoring algorithm which takes elements from v2 but is not the same. It is made with backwards compatibility in mind.

There is already an option in lazer to switch the display mode of scoring between quadratic (classic) and 1mil cap (standardised), and eventually this will be supported game-wide to cater to user preference.

Will the global leaderboards potentially get reset?

We will never reset the leaderboards. No final decisions are made yet, but the closest to a reset would be to freeze them in some accessible way. We value the rich and long history of osu! as much as you do.

Will scoring changes (like slider judgements) be applied to existing beatmaps?

We haven’t made a decision about this one yet. It may be applied only in places it doesn’t affect the playability of the map (using predetermined rules) or may only be applied to new beatmaps.

Where do I get lazer?

You can find the latest release available for Windows, macOS, iOS and android here.

Thanks for reading until the end. I hope this covered a lot of your concerns. If you happen to have questions which haven’t been answered here, feel free to reach out on twitter or in the comments below!


Enjoying osu! with others

published 27 Dec 2018

As 2018 draws to a close, I want to touch on something which I’ve felt strongly about for a while now. While I’ve described my thoughts and intentions in private to people I’ve met up with, this will be the first time discussing this publicly.

The reasoning behind not covering this topic until now is that I don’t like to dream about a future and all the cool things it could be, making big promises without being able to deliver soon enough for people in the present to enjoy.

osu! is a heavily community focused online game. Some players lean towards the competitive side while others play more casually, but I think everyone finds motivation from being around others striving hard to perform their best.

On any given day there are up to 800 concurrent multiplayer games, creating localised competition and enjoyment for their participants. Even so, I think we can all agree that the ecosystem created around Performance Points (or PP) and the global rankings are the focus for most.

Through all the complaints and criticisms of the system and its method of calculation, people of all skill levels are still striving for the highest pp they can achieve (quite often focusing on beatmaps which specifically reward more pp for less effort, known as “farm” maps).

This is one area which is quite unique in osu! – we don’t have the concept of seasons where leaderboards are reset. Scores remain for years and history is retained forever. It really lets users feel like they have achieved something solid, in my opinion – set a record and it’s there in stone (unless you beat it yourself!). But it also does lead to unavoidable stagnation.

I’m not about to go into the topic of PP calculation. The performance point (v2) system was made with the aim of objectively calculating difficulty and it did a pretty good job of that. Over the last month we have seen a huge increase in activity over at the dev discord aiming to improve the calculations while maintaining this overall goal. Things are in good hands and you will likely see changes applied over the next month.

The leaderboards and pp will always have their place in this community, but I don’t think it is healthy to focus exclusively on them. Let me introduce my plans for expanding osu! horizons via multiplayer.

From today, a new multiplayer system is live in lazer. I have been working on the logistics of this for several months on paper, and the team has spent the month of December focusing on this internally in relative secrecy.

As lazer is a very open development project, we don’t want to develop the whole system behind a curtain. Therefore we have developed a MVP (minimum viable product) that you can enjoy from today, but will continue to build on it more openly going forward. Huge props to smoogipoo, nanaya, notbakaneko, nekodex who all came together to make this happen in a relatively short period!


Introducing “timeshift” multiplayer

“timeshift” brings multiplayer rooms that can run over a longer period of time and involve large numbers of players. The room owner will be able to set the specifications for the room, along with a duration. During this specified time range, players will be able to join the room and compete in a localised leaderboard instance.

Think of it as asynchronous multiplayer.

Each room gains an overall leaderboard and a chat room which persist even after the room has expired. History of rooms will be kept indefinitely, and chat will be available for discussion after the results are finalised. I’m sure many of you are already imagining the possibilities of how this can be used. Let me touch on the concepts (and my personal goals) behind this system and how things will be developed going forward.

total attempts

Creating more ways for people to enjoy osu!

This will allow for leaderboards to be made by users. We plan on adding the tools to limit the scope of who can participate (private, friends only, limiting by rank, by country etc.)

Making tournaments easier to run

This should allow for a new generation of tournaments (well, competitions) which don’t need to be run in real-time. It can also provide a way for seeding players into groups before the main portion of a tournament starts, for instance. We will continue to flesh the system out with tournaments being one of the focuses, so if it’s missing features you may need, expect them to come in the future.

Giving players new areas to focus on competitively

As a player participates in multiplayer rooms, they will be visible in their “Participated” listing and (soon) show on their profile. It should hopefully add an extra dimension in where players place focus on when playing online.

room ranking

Increasing the creativity of gameplay

Rooms can be created with a variety of conditions. Currently quite limited, you can choose:

  • The beatmap to play
  • Which mods to play with
  • The duration the room is active for

Going forward, here are a few of the coming options (the system has been designed with these in mind from ground-up):

  • A playlist of beatmaps to play
  • A progression mode (marathon, or beatmap-by-beatmap)
  • A selection of required mods, plus a selection of allowed (options) mods. Like FreeMod but more choice. Mods apply per beatmap in the playlist.
  • A maximum number of attempts per player
  • A maximum number of players participating
  • A choice of leaderboard metric (currently locked to total score, but will include accuracy, pp and max combo)
  • A start time, for scheduled matches in the future.

Current room creation limitations:

  • 1 concurrent room for non-supporters, 5 rooms for supporters.
  • Duration is limited to 24 hours while we stabilise things. Eventually this will be allowed to be much longer.

We have more ideas, but these are the base ones we will be working on in the coming weeks and months. Also, important to note that lazer already has four or five unique mods not found in stable, and this number is only set to increase! User contributed mods are being openly accepted and each new mod increases the number of creative possibilities when it comes to designing a fun multiplayer room!

And that’s as far as I’m willing to go when it comes to explaining the progression of this system. From here on it will depend on how the community uses the new rooms and the feedback we get as to how we mould this into a permanent and (hopefully) well enjoyed aspect of the osu! ecosystem.

Blinds mod, a new lazer-only hardcore mod selection

Let me preempt some questions

When is it available?

Now. Go get lazer if you haven’t already and install it alongside your stable install! It’s more stable than you may think, and available for windows and macOS (linux too if you compile it yourself).

Global leaderboard submission is of course not in lazer yet, so enjoy a different and possibly more chill experience than you’re used to.

What about pp ranking in lazer?

For the time being this is not a focus. We have everything in place to make that eventually happen, but for now I want to make a new unique experience in lazer that differs from what one can play on stable.

So I guess that means I can’t join “timeshift” rooms from stable?

No, this is and will always be lazer exclusive.

What about real-time multiplayer? This feels like the wrong direction!

I can understand this concern, but I have already planned a logical progression from this system into a fully real-time system. All the features that will be made for timeshift will be 100% available in real-time rooms once we get to that point. Thing of this implementation as a prerequisite to adding real-time play modes in the extensible way we want to do it.

Of course, realtime/non-realtime will be a user choice when creating a room in the future!

What about coop play?

Once we flesh out the timeshift system and get to the point we can add cooperative modes, it will happen. Mark my words.

Can we view this from the web site / our profiles?

We are working on adding participation history and overall visibility on the web. This will come a bit later!

Will room history be maintained from the outset?

We’ll do our best to maintain all history, but as this is a new system do understand if we need to delete data for one reason or another. Possibly multiple times.

I don’t play multiplayer / I don’t like this concept.

That’s perfectly fine! In fact, if you enjoy solo play for leaderboards you may actually like this concept more than the multiplayer available on stable.

If you don’t, nothing is forcing you to play it. Global leaderboards are not going anywhere.

It’s buggy

We have plenty of work ahead of us. Go easy on it in the mean time.

This is our final surprise for 2018

I hope we can all agree it’s been an amazing year and we’ve ended it with some amazing notes!

Between Featured Artist releases, this announcement, completely operational iOS lazer builds (alongside windows/macOS/linux), web design renewals and some long-awaited features being added to stable, we’ve made some phenomenal progress.

A huge pat on the back to the whole osu! team (devs, community managers, BNs, QATs, moderators and anyone I missed).

I was planning on doing a blog catching up on Q4 2018, but due to time constraints it will likely happen sometime in January. Hopefully this makes up for it :).

Wishing you all a great new year period. Much of the team will be away on a well-deserved break for next week or so, but we’ll be in touch soon!


August 2018 Development Update

published 14 Aug 2018

Welcome to the August development update. A bit late but you are probably used to that by now. Been focused on keeping things running as usual.

July 2018 Review

osu The osu!lazer project. The future of the osu! client. Download preview releases from here and follow along!

July was a bit of a slow month, and we didn’t really cover the scope we planned on.

You can view a full digest of the changes from July using our new changelog system.

Basic structural implementation of osu!mania editor COMPLETE

Work on the basic structure for the osu!mania editor has been completed. It is now at a point in development roughly equal to the osu! mode editor. While it’s not yet in a usable state, the goal was to get a framework in place for structuring the different editor overlays for each ruleset, which was definitely achieved by this work.

I’m not sure if we’ll continue adding the editors for the remaining two rulesets or expand functionality for osu!/mania to begin with, but you can expect further improvements coming to the editor over the coming months.

Add automatic error reporting on hard crash PENDING REVIEW

Sentry support has been implemented, along with allowing singular errors to result in a non-crash result (similar to how osu-stable avoids many unnecessary crashes). Not yet merged, as we found quite a few cases where exceptions were not being handled correctly along the way.

Should be in soon!

Full-blown custom sample support COMPLETE

All hitsounds should now correctly be played back during gameplay. This includes per-object samples (commonly used in mania) as well as unlimited custom sample sets associated with timing sections.

Selectable full-screen resolutions PENDING REVIEW

While framework support has been added for this, the UI is not yet merged. Should happen this month.

More skinnable elements COMPLETE

Skin support was added for slider ticks, reverse arrows, follow circles, slider balls and follow points (in addition to existing support for hit circles, approach circles and judgements). If you already have a skin loaded, you should see the new elements displaying. If you haven’t yet imported a skin, it’s as simple as dragging an .osk file into the lazer window.

Gameplay visual fixes COMPLETE

Slider repeats were being shown too late, causing visual uneasiness when trying to read sliders with one of more repeat points. This has been resolved and should now match stable.

The slider follow circle was visually (and logically) far too large, making sliders much easier than they should be. This has now been resolved and should match stable.

Sliders which use a linear curve style felt a bit ugly when snaking in due to the reserve arrow changing its rotation in a single frame. Interpolation has been added to make these corners smoother.

osu-framework The game framework behind osu!lazer. Written from scratch with osu! in mind, but very extensible.

Move both osu and osu-framework to target netcore2.1 COMPLETE

All framework and osu! deployments are now 100% netcore2.1! This is a huge step forward and allows us to focus on making the net core experience as good as possible. It also means that release builds are running on the same runtime as we are using to debug, which makes it easier to locate issues before they are deployed to a production environment.

To make this happen, I ended up forking and publishing out own packages to keep automatic update support working on windows builds.

The performance issue I mentioned in the last blog post (macOS debugging) has not yet been resolved, but I have filed an issue to track this. Hopefully it will get some attention soon.

Fix remaining autosize / update order issues PENDING REVIEW

A pull request is open which fixes the majority of these issues. It still needs to be reviewed and tested for any performance regressions, but should be arriving soon.

Ongoing input subsystem improvements

Huge improvements have been made to the input handling. There is still some further changes we are looking to make which will likely be completely over the next month.

osu-web The new web front-end. Already live but hasn’t yet replaced the old site, pending feature parity.

You can view a full digest of the changes from July using our new changelog system.

Almost half the milestone tasks were unachieved. Pretty slow progress. Not really much to say here…

Move osu-web score lookups to elasticsearch COMPLETE

This has now been deployed. You may notice that profile pages are now quite a lot faster to load (especially for players with a lot of scores). Eventually we will update other pieces of the infrastructure to benefit from this performance improvement, such as in-game song select lookups.

New private messaging system WIP

Work on this was slow this month, as attention was diverted to code review instead.

Add ability to report users from profile PENDING REVIEW

We’re finally on track for adding back one of the few missing features from the new profile pages. You will soon be able to report users again.

Test and deploy new registration process

Did not happen.

August 2018 Goals




Leaving our August goals blank for the time being. Already halfway through the month, we’re playing catch-up on missed goals and outstanding bug fixes. You can still click in to the headings above to see what is remaining to catch up on missed milestone tasks, though!

Thanks for following along.