published 17 Jun 2015

I think going forward, the hardest part of doing these daily posts is going to be coming up with a unique word for the title. Maybe I’ll stop, or just skip today because I got nothin’!

Another long day of dev. I really look forward to days I can code, so for me this is the best kind of day.

What’s new?

  • I spent half the day tidying up some of our admin interfaces and internal systems, adding new features people that help out have been requesting for a while. While I can’t go into the specifics, let’s say that it makes their jobs easier when dealing with the heavy workload of keeping the peace in osu!.
  • Letterbox mode got some further work put into it. Still ironing out some issues with specific hardware and configurations, so it won’t be on cutting edge just yet, but we’re close.
  • Paid username changes are now live on the store! For now, free changes (first change) are not properly supported, as the store still sends you to paypal to make a payment, but the old name change page still works for this (or you could buy some merch on the side to make it work!). Taking of inactive names is also not available yet, but will be tomorrow.

countries countries countries

Another shortish post today, but let me share a small bonus with you! Here is a look into the kind of detailed stats we track to make sure we know how osu! is being used, and how to best service the community. This page shows a realtime feed of of which countries users are connecting from. The left-hand side is showing cumulative averages for the last 24 hours, while the large graph shows the full running details for the same period. I’ll leave this up for at least a few days; keep it open and it will update automatically as the day goes on :).

Not really going to read into these statistics today, but it’s safe to say that osu! is a very global game!


20150616 /boxed/

published 16 Jun 2015

letterboxed osu!

Another quick update:

  • Finished implementation of the username change system. It’s live on the osu!store but I’m not allow actual changes until some further testing tomorrow morning. Currently doesn’t allow stealing inactive usernames, but that will come with time!
  • Got most of the technical implementation of the coming “Letterbox” setting completed (with some help from trusty Tom94 and smoogipooo). This will allow you to have osu! running full-screen (borderless or exclusive) but only taking up a smaller portion of your screen, centered in the middle. Getting this working actually required quite a bit of work behind the scenes in the departments of RenderTargets, input handling, editor and general resolution change handling.
  • In the process of implementing letterboxing, cleaned up some pretty ugly code.
  • Tracked down some further fixes and improvements for the QAT group user. It will now have a proper post count, as a bonus!
  • Added an interface for admins to store /mp/ link results permanently (for things like world cups).
  • Finished preparations for the next tablet shipment to arrive safely. This is a huge relief.

I’m sure some of you will be asking “why letterbox? i can just run in a window!”. Well, as of Windows 8 it is very hard to disable the Desktop Window Manager. While the DWM helps make your desktop esxperience as smooth as it can be, it hinders windowed games by adding an amount of latency to them (usually around 16ms). By running in exclusive full-screen mode, games can bypass the DWM and run to their full potential.

While full-screen has worked fine until now, there are an increasing number of users upgrading to larger displays, and having issues playing osu! when it runs at such a huge physical size. Letterboxing will allow you to combine the best of both worlds, choosing a smaller game display size but also bypassing the DWM.

We are still figuring out a few kinks, but it should be live tomorrow on cutting-edge for your enjoyment.

Hard to keep up with full-on interesting blog posts at the end of a long day of coding, so please don’t mind the occasional shorter post like this :).


20150615 /catchup/

published 15 Jun 2015

Hey guys! Coming back at you with a quick catch-up post. Things have been quite hectic so I don’t have time for a long post today. Here’s a look into what’s on the plate:

web store out of action

  • Logistics for putting the web store into hibernation for the next month. The team member responsible for shipping all your goodies out is on holiday and there’s no one else around to take over. Scheduling delivery of tablets to storage facilities (the next batch is coming in over the next couple of weeks, so we still have plenty of stock).
  • Placed an order for replacement pens for osu!tablets. This seems to be a point of failure, regularly due to users dropping their pens on hard surfaces. The price of replacement pens on amazon etc. is a bit high, so I am doing a bulk order to offer replacements at a reasonable price.
  • Finished implementing username availability conditions into the new osu!web. Just need to work out the pricing system and do some extensive testing and we should be ready to go live – this week for sure!
  • Reviewed and merged the code behind forum posting on the new osu!web. This is now live for testing, so go check it out if that kind of thing interests you! Feel free to tweet at me if you come across any bugs. Keep in mind we are still working heavily on the user experience of posting, but feedback is still welcome.
  • Added a central QAT identity so individuals are no longer targeted when maps are disqualified. Giving this some testing to see how it affects people’s attitudes towards disqualification (hopefully in a positive way). We should all have a common goal here, after all!
  • Looked into a few different approaches to allow users to run osu1 in exclusive full-screen mode while adjusting the actual display size of osu!. I hope to get something in to cutting edge this week for user testing. This should be the ultimate solution for users wishing for the lowest latency but have massive monitors they are sitting far too close to, forcing them to resort to windowed mode to make their osu! gamefield a usable size.
  • Continued to fix newly discovered issues via the recently added (old) web sentry hook. Adjusting database data types to fix truncation in some text fields, fixing out-of-bounds issues with unsigned numericals etc.
  • Finished migrating high score replay availability to its new home in the database. Added server and client-side support, now live on cutting-edge. You can now watch replays in selected-mod, friend and country scoreboards as long as the replay is in the top 250 global scores for the map. This number will likely increase in the future, too; the important part is that this system is infinitely scalable. Also a surprise new benefit of being supporters can soon be realised with this change. More details will follow :).

I leave you with a photo I took on the weekend at an ajisai (hydrangea) festival I visited. Absolutely amazing colours.


20150612 /answers/

published 12 Jun 2015

I’ve decided to make every friday a Q&A day. I receive quite a few questions via email, and many of them get repeated over and over again. Seems better to get them out there in the public so I can just link people to a post rather than writing up answers for them each time. This week’s questions are from Avishay.

Hey Peppy!

First of all, I want to thank you for writing those blog posts, I (and most likely more people) really enjoy reading them daily. So, before I continue on with the questions, I’ll quickly introduce myself. My name is Avishay, 17 years old, I play / edit maps on osu almost daily, nothing too special. You seem like an interesting & successful person and I want to ask you some stuff, I hope you don’t mind:

How knowledgeable were you when you started working on osu? Knowledgeable of programming, software and such?

When I started work on osu!, I had been working as a software engineer for a couple of years (Java / classic asp / ms sql server). I studied computer science at university, but I can’t say that really taught me too much. Most of my knowledge came from personal projects over the years. From writing text-based games and programs in BASIC back on a Commodore 64 when I was 4-7, to using Klik & Play and The Games Factory during primary school to make slightly more graphical games. Also made a good number of Nintendo game fan sites back in primary school; some of the first you could find on the small internet that existed back them.

I spent a good portion of my high school life working with databases, hacking around with stuff, building PCs both for myself and as a private business, running events involving large network setups, designing dynamic webpages for local businesses using Frontpage/Dreamweaver (they were pretty rare back then!). Ran arguably the biggest Windows XP resources site and forums out there during the year leading up to its release (design is a bit broken in the link).

During the later years of high school and the beginning of university, I ran several Ragnarok Online sites/systems (anonymously) that were integral to the whole game community. One still exists to this day (I passed it over to a good friend). I also played far too much of that game, but learnt the Japanese language while doing so - arguably not a complete waste of time!

Did you have any previous projects that helped you to develop osu? Or did you learn most of what was needed while developing / starting to develop it?

I’d argue that everything I’d done before osu! helped in some way. Running a game like osu! single-handedly requires a vastly broad range of knowledge. Software, hardware, networking, databases, front-end design… you name it. I strive to be able to potentially do everything myself. If I can’t do something, I will sure as hell learn how to. The positive outcome of this is that if I am disappointed with someone else’s working (or they are slacking off) I am able to fill in myself.

Any tips you’d give to younger self when you just started with the project?

Nope. I don’t really think back like that. Forward is the only way :).

Any tips you can give to me? I really love programming and a lot of computer-related stuff and I try to study by my own to increase my knowledge, most likely I won’t be able to develop a successful game like yours by myself in the next few years, so I really want to see how your perspective changed, from back then, when you just started developing osu, compared to now.

Do. Do anything. Make a start. Don’t stop. Don’t sleep. Find a source of infinite motivation.

Thank you for your time, Avishay.

Most welcome, Avishay.

For future Friday posts, I will likely accept questions on twitter the day before. Please don’t spam my email; I will announce it on twitter when it happens :).

Oh, I got the complete username change system working today. While it may look quite simple, this change allows us to have:

  • Custom store product pages.
  • Products with infinite stock.
  • Products which don’t rqeuire shipping.
  • Products with custom user data (in this case the requested username).

The start of much more to come. Make sure to check out flyte’s latest post over on osu!next if you haven’t yet; it has some big reveals!


20150611 /deploy/

published 11 Jun 2015

switch release streams from the options menu

As most of you may be aware of, the osu! build system got a lot more advanced earlier this year with the introduction of Release Streams. The basic idea behind these is that we can have multiple streams of osu! clients, allowing users to choose how close to the edge of their seat they wish to sit. While from time-to-time we have added and removed temporary testing streams (for things like testing a new experimental framework), there are generally three release streams available at all times:


The default release stream. Stable builds are generally, as their name implies, stable. There shouldn’t be any new bugs that find their way into these releases (in theory!). Stable builds are released as often as possible, but generally this ends up being between 1-8 weeks between releases. My personal aim is one release a month, but depending on the state of code and how deep in shit we are, this sometimes is not possible.


Beta releases are a mid-ground, offering inquisitive users early access to new features and fixes that are in the pipeline, without the possibility of the world falling apart on them. The beta release stream is safe for anyone willing to report bugs they may find, rather than raging about it.

If you don’t mind helping, please stay on the Beta stream. The more people we have testing this, the less chance bugs will find their way into stable releases, affecting the masses.

Beta releases happen every Friday automatically, or sooner if we decide there’s a need to get a hot-fix out to users rapidly.


This is where things get interesting. You’ll be exposed to changes made to the osu! code-base in real-time. If we fuck up, it could fuck your osu! up badly. But you’re already here so you know these risks, right?! In exchange for the extra risks, we will give you our ears 24/7 and work with you to fix any issues you come across. You will also get access to some preview features that aren’t quite ready for prime-time, such as the Target Practice mod, the ability to fast-forward replays at varying speeds and more to come.

Cutting edge releases happen as we make changes, multiple times a day. We won’t force you to come join us on the edge, but we do appreciate those who do!

But How?

So… how do these streams work internally? We use git for source control, with two main branches of code: one for development (master) and one for stable releases (release). When any osu!dev makes changes, they first create a new branch of their own to isolate their changes. Once they are happy with what they’ve done, and want to share it with the team, they will submit a pull request. This is basically a way of saying “Hey, I’m ready for you guys to come check my code out!”.

Once at least one other osu!dev has reviewed a pull request, it is merged into the master branch. For those unfamiliar with the term “merge”, this basically means the code is moved from the developer’s private branch into the development branch, and considered to be finalised. The pull request and the master branch become one, and the pull request is destroyed.

Every time a pull request is successfully merged into master, a cutting-edge release is triggered by the build server (we use teamcity for .NET, buildkite for everything else). And that’s all there is to cutting edge releases!

Beta and stable releases are a slightly different story. As we don’t want to push either of these out until changes have had a while to simmer with cutting-edge testers and devs alike, it is up to me to decide when to merge master into release. Even then, performing the merge alone doesn’t do anything; it just prepares the changes for future distribution.

Both the Beta and Stable release streams are based on the release branch; the only difference is their triggers. Beta, as mentioned before, will trigger automatically every Friday. This is to space the builds out evenly and ensure users are not bombarded with constant updates. Stable releases are completely manual, and only triggered when I am completely happy with the state of the release branch.

If all this seems very complex, just thing of the three streams as a way of filtering out bugs from the majority of users. Cutting-Edge users get hit by most of them, and they are fixed before they hit Beta. Beta users (a larger user base) then get to confirm that we have actually covered all bases. Assuming beta users don’t find any issues, everyone is happy and we go ahead with a stable. Should any issues be found, it’s back to cutting-edge for a round of bug fixes!

I attempted to sum all this up into a pretty diagram. Click for full size!

release streams in a can

There’s a lot more complexity not covered in this article that I will share in the future!

Automating deployment makes us very productive. The ability to push fixes out with just two clicks and having it completely integrated into our existing git/github workflows is really efficient and just doesn’t get old :).