and so 2017 comes to an end!

published 31 Dec 2017

The text below is basically a transcript of the video. Choose your format!

Hey guys, peppy here.

I thought I’d take the last day of this year to take a moment to reflect on the state of osu! development, with focus on the lazer project.

Many of you will know of lazer as a project that started to manifest in mid-2015, teased with this video. At this point in development, lazer was in the early design stages and implementation had not started, but it was intended to be a revamp of the user interface to give it a new lease on life.

Development on this continued headed mostly by myself until late 2015. While plenty of progress was made, I also became increasingly aware of the amount of technical debt that had built up over the preceding 8 years. By the end of the year, I reached a breaking point and gathered the few developers who contributed substantial time into the development of osu! up until that point for an emergency meeting.

The outlook was grim on ever making the existing code base work how I wanted it to. I was also aiming to open-source the project as soon as possible, but there was just so much bad code that this did not seem like a viable prospect. I proposed a complete rewrite and sent out a plea for other developers to help with this effort.

Everyone involved seemed to agree with the direction, but unfortunately there were not many with the free time to help out in a big way. smoogipoo and Tom94, who some of you may be familiar with were the most active in the early days of the project and have been indispensable over the last couple of years.

We began laying out the framework for the rewrite in early 2016. This was done with quite a bit of pre-planning, to make sure we were all in agreement on the direction we wanted to take. We made a list of all the things we wanted osu! to be and set out to start work. This took form as a completely new project, available on github from day one, under the all-permissive MIT licence. This meant that anyone who wanted to watch on, help out, or use pieces of the code for their own projects could freely do so from day one.

And here we are, two years later. Jokes aside, we have come a long way. Progress has been slower than I hoped, so I’d like to touch on the various aspects which have contributed to this. Firstly, while there are other contributors, I am still the main developer of this project. As much as I’d love to spend my productive hours every day working on completing lazer, I have many other distractions including but not limited to:

  • Maintenance releases of osu!stable, including seasonal updates and bug fixes
  • Maintaining the infrastructure that runs osu!
  • Replying to every email I receive (I value direct communication with users)
  • Keeping track of other osu! development efforts, such as the new website (this is a topic for another day!)
  • Keeping the store running
  • Handling financials and accounting (as much as I dread this)
  • Keeping forward momentum on projects like Featured Artists and the wiki

Then we move on to the actual implementation of osu!lazer, where we are sparing no expense in areas of automated testing and scrutiny on code quality to ensure we don’t hit a dead-end down the track in a similar way to the existing stable release. This does not come without efficiency drawbacks, but we feel it is imperative to get things right this time around and create a code base which will serve us for many, many years forward.

We also made the decision to split the development effort into two distinct projects, separating out the game implementation from the framework which it runs on. In the process, not only have we been able to better document the low-level code, but have also created a 2D game engine which is amazingly flexible and capable of quickly iterating interfaces and animations in a way I have not seen done elsewhere. Everyone involved is very proud of what we have created so far.

Finally, we have developed lazer with cross-platform support in mind. While a downloadable installer is only available for windows, we are happy to have core developers — including myself — actively developing and testing on linux and macOS. We are also very close to having a working iOS branch with android not far behind. We are truly aiming for native cross-platform support, which doesn’t come without its overhead, but is something we value (because honestly, who wants to run osu! under wine?).

So where do we currently stand?

Lazer is in a very playable state, but missing some of the features which many users rely on. Therefore I am still hesitant to get more eyes on it just yet. We are so close, but here are some of the areas that may be an issue to those that are trying lazer:

  • Tablet support (especially with raw input enabled) is still not heavily tested.
  • Skin support is not yet present (but it is safe to say your existing skins will work early next year)
  • We have not iterated on the default skins in gameplay for high playability yet. They will improve over time.
  • Optimisations for lower end PCs have not yet been addressed.
  • There is no means of submitting scores (we are finishing everything else before considering compatibility with the existing ranking system)
  • Tens of other features that people rely on every day are not yet implemented

I can say that the team is insanely productive in recent weeks (as those that have been following along can likely attest to) and a lot of the missing pieces to the puzzle will quickly be filled in. If following the progress of lazer does interest you, I’d highly suggest following my blog, where I am now posting regular updates.

I did promise the release of lazer in 2017, even going as far as saying I’d quit if this didn’t happen. While lazer is by no means ready to take over and replace stable, it is available for download and will happily coexist with your existing osu! installation, automatically update multiple times a week and give you an insight into how fast we are making improvements. I would highly recommend downloading and giving it a try, then leaving it installed to check back on once in a while!

While continuously listening to and taking feedback on board, I have always strived to sail osu! in a direction that I can agree with. I’m glad to say that this is still the case. I truly hope you guys can take a moment to appreciate just how big of an ecosystem osu! is compared to other games and just how many facets need to be concurrently managed and maintained to keep everyone happy. For a team as small as we are, this is not an easy task, so please be kind to us when we fail to meet your expectations (and definitely don’t hesitate to bug me or other members of the team when this happens).

I’d like to end this by thanking everyone for making 2017 another very enjoyable year for osu!.

Thanks to everyone involved in the lazer project, including all the people that have contributed to it in some way. Thanks to everyone on the various osu! teams for keeping things running smoothly. Thanks to all the users out there — current and past — for mapping and playing the crap out of this game.

Here’s to many more years of osu!.


dev changelog 20171226

published 26 Dec 2017

I’ve said it elsewhere, but Merry Christmas everyone! We’re working hard to end this year on a good note and that does involve getting a relatively presentable build of lazer out to the wider public. A few days left so we are hard at work polishing what we have! You can already start following our progress starting with today’s release (although do note that repeat sliders are a bit bugged; will be fixed tomorrow).

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

Quieter notification overlay #1751 (peppy)

The notification overlay used to pop out every time a new notification arrived. Now it has a badge showing pending (unread) notifications instead, meaning the end user is no longer rudely interrupted.

Add a dialog offering to import beatmaps from stable #1749 (peppy)

A lot of people couldn’t seem to find the button in settings to import their beatmaps, so I went one step further to make importing your existing library more accessible. This dialog will appear at song select if you have no beatmaps loaded (and an osu-stable installation is found on your PC).

Let NotificationOverlay move the background #1735 (Aergwyn)

Until now, only the settings overlay has been able to push the background game content behind it. This always felt awkward, but will no more! Both overlays are now equal in their pushing abilities.

Other Changes

  • Yet another rework of sound handling in taiko #1733 (smoogipoo)
  • Fix notification read lamp and notification count #1759 (peppy)
  • Trigger null-selection in SongSelect when the last beatmap is hidden #1753 (FreezyLemon)
  • Fix null reference in release builds #1752 (peppy)
  • Fix many instances of non-osu-prefixed text classes being used #1750 (peppy)
  • Add word wrapping support for popup dialog text #1748 (peppy)
  • Fix supporter icon appearing incorrectly in user profile header #1747 (Aergwyn)
  • Add special logic to song select to avoid obvious clipping when notifications are displayed #1742 (peppy)
  • Hide unnecessary lines on empty BeatmapInfoWedge #1720 (Aergwyn)

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

Nothing really note-worthy in framework this time, but some good solid changes as follow:

Add keyboard controls to TestBrowser #1287 (peppy)

You can now use Ctrl-F to search for a specific visual test, Ctrl-H to hide the test listing and Ctrl+R to re-run tests. The little things matter!

Other Changes

  • Log exception content as Important rather than error #1288 (peppy)
  • Immediately unbind all bindings to OnLoadComplete after load is complete #1285 (peppy)
  • Add NUnit Itemgroup to csproj #1282 (Aergwyn)
  • Fix dynamic compilation not working when protected internals are overridden #1281 (smoogipoo)
  • Avoid deadlocks caused by audio thread blocking on queued items #1280 (peppy)

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

Use cached score ranks for display #2069 (notbakaneko)

We recently discovered a long-standing bug in the profile rank counts (SS/S/A) so rewrote the maintenance script on the new web system. There are a few reports of incorrect counts still, so consider this an ongoing effort.

This also improves performance on the new web profile pages, which were previously dynamically calculating these counts every page load(!).

Download page #2042 (LiquidPL)

A new less cringe download page is now availble on the new web. One step closer to pushing it live!

Ongoing work on the modding discussions system

We are listening to your feedback on the dev discord!

This week we will be addressing these two issues as top priority, as they seem to affect the most people. Make your voice heard on the discord. We are especially interested in hearing from mappers (but also modders, of course).

Other Changes


dev changelog 20171222

published 22 Dec 2017

Hi guys. Back at you with updates since the last post, split into respective projects:

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

Fix retry count not displaying on pause overlay #1709 (DevSDK)

Make completion notification text for ProgressNotifications customisable #1707 (FreezyLemon)

Messages when tasks complete are now more easily customisable. You can see things like “Import successful!” instead of “Task has completed!”.

Added Deselect All button to ModSelectOverlay #1702 (Aergwyn)

Added confirmation dialog for “Delete ALL beatmaps” #1676 (Aergwyn)

Added Button to restore recently deleted beatmaps #1671 (FreezyLemon)

Just in case you accidentally made an oops. Right now this only works until osu! is closed, but in the future you will be able to undelete beatmaps for a day or two after you nuke them.

Make leaderboard tabs and active ruleset filter scores #1599 (naoey)

This brings country and friend leaderboards to life! It also adds nice placeholder messages when a network error occurs or you aren’t supportive enough to view a certain leaderboard.

Other Changes

  • Ignore bugged inspectcode inspection #1718 (peppy)
  • Remove manual audio thread synchronisation logic #1717 (peppy)
  • Correctly make fullscreen overlays block keyboard input from drawables behind them #1715 (peppy)
  • Fix keyboard and mouse input not properly getting blocked by GameplayMenuOverlay #1711 (peppy)
  • Make all TestCases public in line with framework TestBrowser changes #1710 (peppy)

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

Switch to using Tasks in audio components to allow for sync/async handling #1275 (peppy)

As you may know, osu!lazer and its framework run separate threads for audio, input, draw and update. The audio thread has been especially hard to work with, as you could for instance ask a track to Play but on immediately checking the IsPlaying state it may still return false if the audio thread has not yet processed the operation.

All state-critical operations (currently only TrackBassPlay(), Stop() and Seek()) are now blocking. If non-blocking behaviour is required async versions are still available but blocking should be preferred unless/until a performance issue is determined.

Improve key blocking behaviour of OverlayContainer #1277 (peppy)

OverlayContainer is used by prominent fullscreen game elements (such as osu!direct, social overlap and chat), but was until now not blocking keyboard input correctly. While in most cases this wasn’t noticeable due to a search textbox having focus, it meant you could not use global hotkeys (such as Ctrl+O to bring up the options) while at certain screens.

Now, OverlayContainer uses a modified input queue to block input for everything except drawables marked with IHandleGlobalInput.

Other Changes

  • Return the original message from RecursiveLoadExceptions #1279 (smoogipoo)
  • Make SortedList serialize correctly with JSON.Net #1278 (smoogipoo)
  • Clean up the TestBrowser assembly dropdown #1274 (peppy)
  • Don’t access Children when changing TextSize #1273 (peppy)
  • returning Push function when screen hasExited. #1241 (DevSDK)

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

Ensure that all suggestions/problems are resolved before allowing nomination #2062 (nekodex)

In our continued efforts to reduce the manual overheads involved in beatmap modding, nominations will now only be possible after all problems and suggestion posts are resolved.

Limit loaded forum posts to 250 #2056 (nanaya)

A few users reported very high memory usage on the forums after browsing a thread through many pages. Old posts are now unloaded as you scroll, so your browser doesn’t get completely overloaded!

Apply better sorting defaults to beatmap sections in profile #2044 (peppy)

Beatmap sections on profile page are now orders by “newest first” rather than “oldest first”.

This also increases the number of scores/baetmaps shown each time “show more” is clicked to 20, up from 5.

Other Changes


dev changelog 20171219

published 19 Dec 2017

Long time no see. I’m here to address a few points:

  • I haven’t posted here in like 4 months, so obviously that isn’t working
  • A lot of work has actually been going on
  • Visibility on that work — especially on the web side — is very low

I’ve spent a bit of time coming up with an changelog culmination script which amalgamates changes across all of the osu! projects into single tidy blog-ready posts. It automatically adjusts to my posting schedule, but ensures that no small details are lost. Going forward I will be posting semi-regularly here with updates on all three main projects currently under heavy development: osu, osu-framework and osu-web.

Don’t fret, this place won’t turn into a dull automated changelog flow. When I have the time, I will be expanding on individual changes with important notes, commentary or video. When I don’t, you will still be able to keep track of what I (and others on the team) are spending our time on.

Due to there being hundreds of new changes since my last post, I’m only covering the last week or so this time around.

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

Rewrite BeatmapCarousel with ModelView implementation #1697 (peppy)

After working through some bug fixes with people contributing to the lazer project, it became very obvious that the implementation of the SongSelect carousel could do with a lot of improvement. The flow of information and the readability of the code was below par, so I decided to take a few days to fix things up.

We now have a very heavily tested carousel which is also more optimised than previously. I’ve been testing with up to 50,000 beatmap sets loaded (150k difficulties) and it’s still quite usable, so I think we have a winner.

Other changes

  • Fix profile header not correctly being masked #1708 (peppy)
  • Implement keyboard controls in gameplay overlays (pause/fail) #1706 (smoogipoo)
  • Expand content of BeatmapInfoWedge #1698 (Aergwyn)
  • Fix BeatmapInfoWedge not counting Circles/Sliders correctly #1693 (Aergwyn)
  • No longer select Beatmapsets on import/download #1692 (Aergwyn)
  • Implement Editor hitobject selections #1690 (smoogipoo)
  • Filter invalid difficulties at song select #1689 (peppy)
  • Update tasks.json to remove warnings #1688 (smoogipoo)
  • Fix MusicController ignoring Looping property of Track #1685 (Aergwyn)

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

Other changes

  • Improve ctor performance of Drawables #1269 (peppy)
  • Switch Trace.Assert to Debug.Assert to avoid user-facing errors #1268 (peppy)
  • Avoid unnecessarily aborting WebRequests if they are already completed or aborted #1267 (peppy)
  • Fix Logger still outputting to screen even when OutputToListeners is disabled #1266 (peppy)
  • Local all WeakList access in LocalisationEngine #1265 (peppy)
  • Fix IsCurrentScreen becoming true too early #1263 (peppy)

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

New website poll

I asked on twitter how people are finding the new site. ARound 50% of people are quite eager to see it released, which is a satisfying result. That said, based on the feedback we got from this tweet we have identified a few key features which are missing that we will strive to implement before powering down the old site.


Add misses and max combo to scoreboards 🌈 #2000 (nekodex)

This is just the start of a larger design improvement we have planned for the beatmap leaderboards, so don’t mind the clumsy 300/100/50 counts and what not for now. They will be fixed soon!

Other changes

and that’s that!

Please give me your feedback of the readability of this format. It is highly appreciated.



published 24 Aug 2017

Coming at ‘ya with some well-cooked (you could even say thoroughly burnt) updates!

coffee hour

Introducing a new podcast, hosted by HappyStick and featuring me on the first episode. This is the result of some discussions we had at Anime Expo where we mutually agreed that there needs to be a better way to get information out from the team to the wider public audience (a lot of people don’t read my blog, the forums, etc.)

Check it out for the latest on lazer and other critical topics.


Import from osu-stable!

Finally, you can bring over your existing beatmap collection to lazer in one simple click… with a few caveats

  • We haven’t done extensive testing on compatibility of older beatmaps, so some may not be loaded correctly.
  • Importing will be a bit slow, mainly due to the concurrent disk operation required to copy all the data across.
  • Even after import, song select will struggle to load initially with a large number of maps. This will of course be optimised in the future.

If you have a lot of maps, I’d highly recommend letting it import some number of maps and then cancelling the task (via the notifications overlay).

osu!catch basics!

Parsing of basic fruits and some wonky display logic. This isn’t in a truly playable state yet, but a lot of the underlying framework has been complete. Working closely with smoogipoo, we have made it possible for taiko, mania and catch to share a great portion of their code (they all display objects in a scrolling fashion, after all)!

Key Bindings

After a huge overhaul, the key binding framework is now in place, with global and per-ruleset support. This comes with a new settings area to assigning bindings, including removing defaults altogether. An interesting thing to note is that this system supports all mouse buttons and wheel actions, so you could now, for instance, toggle chat using an extra mouse button!

osu!direct downloads

Finally, not only can you browse osu!direct but also download new beatmaps! Note that for the time being, this is completely limited to supporters (as it was with stable), but going forward we will be making it partially available to all users to provide better accessibility to all.

local chat echo

No longer do you have to wait for server confirmation before carrying on with typing your next message. One step closer to bringing the full chat experience home!

much more

There have been many new builds released since the last blog post, including plenty I haven’t covered above, so make sure to try things out for yourself! You can check the full changelog history (and download the latest build) here.

daily releases

For the imminent future, we are aiming at doing daily builds (at least on weekdays) to keep the pace high. You can follow our progress via the milestones we create at the start of each day, each correlating to a release at the end of that day. Not sure how long we’ll keep it up, but it seems to be working quite well so far!