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!



published 21 Jul 2017

This post was supposed to go up on friday but completely slipped my mind! Plowing forward with lazer progress, amongst other things.

10th anniversary packs available!

During Anime Expo, we were gleefully handing out over 2,000 sticker/postcard/pin sets as part of our presence. We saved a small number for those who couldn’t make it but want to get a share of the amazing designs that were featured. You can now pick one up for around $6 including shipping (we’re basically selling at no profit) from the store, while stocks last!


I spent a lot of this week fixing bugs and tidying up important paths in the codebase. The main focus was handling of the currently loaded beatmap, covering state changes as selections are made at song select, in the music controller (via the playlist) and what happens when there are no available beatmaps due to a filter or the user deleting all their maps.

You will now notice that:

  • Importing beatmaps will now switch to the correct game mode
  • Deleting all beatmaps will now show a “no maps loaded” placeholder
  • Attempting to start play mode in this state will no longer crash
  • Selecting a beatmap in the playlist will switch to the correct game mode
  • Switching game modes will load a map from that game mode if not already
  • Selecting a difficulty in a different game mode will change your global game mode to match.

While this took quite a bit of time, I think it’s safe to say it was worth it. Not only has performance been improved, but a lot of janky transitions and behaviours have been resolved.

A few more visual changes:

special chat users are highlighted

A new build is up as of Friday, so go check out the full release notes to see what’s new!



published 17 Jul 2017

Hello! We’ve now exceeded one month since my last post. I’ve had this post in a draft status for quite some time, unable to post it because not everything had come together yet. Also been working across the board to catch up on a heap of stuff. Rather than just focus on lazer, let’s take a moment to cover everything that’s happened in this time.

Anime Expo 2017

This experience was absolutely amazing. Being able to meet people face-to-face – especially many which I have been dealing with on a regular basis – was the best thing I took away from the event. There’s so much to cover from this event alone, but here’s a few things summarised:

  • Going forward I’m going to continue my efforts to do some kind of “official” meet-up once a year in different places around the world.
  • We have a heap of awesome video footage, which will be edited down into a digestible format once I find the spare time.
  • Some serious discussions were had, resulting in some changes to how I run things going forward (in the best interest of the community). Look forward to a few new projects surfacing before the end of the year that should really help bring the community even closer together than before.


multiplayer commands for all

We’ve released the ability for any user to use the previously exclusive multiplayer room commands. This allows very fine control over rooms in ways that were previously not possible. It is especially useful to people running tournaments, but can also be used by room owners in a host-rotation scenario where the owner can now retain control even after giving away host. Check out the full documentation reference to learn more.

online state tracking

Web profiles will now (finally!) show up-to-date “last online” times as long as the user is connected to bancho. Previously, it would only be updated when a user visited the website. Note that right now even AFK users are considered “online”, but we may look at making this smarter going forward.


The new website has received some new features and improvements!

A new global contextual search that searches everything at once!

You can also drill down into details, refining your search to a specific area and more. Forum specific advanced search options are also still present, of course!

A huge applause goes out to nanaya for realising this feature. By no means finished, but in a very usable state (personally I think it works better than the options we have on the live site!).

friends listing

The friends listing page has now been realised on the new site. With the addition of online state tracking above, you can now see all your friends which are online in-game accurately from the web! Also, it’s quite pretty to look at!

Thanks to nekodex for the sound implementation of this system.

support purchase page

Supporting the game will in the near future be moved to the osu!store, rather than being a stand-alone page. While the preferred method of supporting is still using the old site (it has more payment methods available for the time being), you can preview this feature already here and even try using it if paypal is your preferred payment method :).

Thanks to notbakaneko for the implementation of this!

user cards

Hover a username anywhere on the new site and you’ll now see a user card popup. This allows you to get an overview of the user’s details, see their only status, add them at a friend or access their profile for more in-depth information.

Thanks to nekodex for implementing these cards as part of the friend system!


So, it’s been two builds since the last time I made a post. Forgive me if I skip over anything, but there’s a lot to touch on so let’s get started! If you’re more of the hands-on type, you can go and check out v2017.717.0 right now, with an insane number of additions, improvements and bug fixes.

New UI sound effects

This is still much of a WIP, so you’ll still see some changes and additions going forward. Consider this a glimpse at what we are going to aim for in terms of sound effects

In-game profiles

As part of a push to move everything to being accessible in-game, you can now access user profiles without being dumped out to a browser. Full stats are still a work-in-progress, but it should give you an idea of what you can expect in the near future!

Settings improvements

Redesigned the UX of the settings sidebar to feel better and avoid hiding the UI behind it. Now the whole settings menu expands, and the sidebar automatically contracts after selecting a section you wish to visit.

Lots, lots more

If you want to check out all the intricacies of lazer which have changed, please check the full changelogs! There’s plenty more small changes, optimisations and fixes that deserve attention there. I just can’t cover them all in this already-too-long post.

Thanks for reading until the end. Obviously posts this long won’t be a regular thing and I’ll do my best to return to normal programming from hereon out.