June 2018 Development Update

published 04 Jun 2018

Hello everyone!

We’ve been making steady progress in all areas over the last month. Yes, I guess these posts have become a monthly thing, but I am going to take this opportunity to embrace the monthly schedule and align it to development schedule.

Since earlier this year, we have been assigning tasks to a monthly “milestone” and then trying out best to complete them all by the time the month ends. After a bit of trial and error, we are gradually accustoming ourselves to this process and meeting higher rates of completion month on month.

We also have the new changelog system that is approaching completion, which will replace much of the content (ie. per-change explanations) I usually cover in my blog once complete, so I will be shifting my focus here to focusing on a more macro scale of “how we did last month” and “what we have planned for this month”.

I’d just like to mention that much of the process we’re following is heavily borrowing from the vscode project, so huge props to them for their amazing open development efforts and solid development process. They obviously have a much larger team and dedicated project management so we are taking some shortcuts, but I’m pushing for more process as it feels feasible and productive.

June 2018 Goals

In an interest of establishing a schedule we can adhere to, I’m going to keep the goals slim this month. Not mentioned in this list is the huge backlog of issues that require fixing, which can be found assigned to the respective monthly milestones.

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

I hope we can fix remaining netcore issues (mouse hiding and other native functionality) in order to make .NET core our primary target framework by the end of this month. The 2.1 release fixes the remaining issues we had with debugging the solution on macOS and brings performance on a level that surpasses both mono and .NET desktop (471).

Add automatic error reporting on hard crash

Many people are reporting hard crash issues on github without knowledge of how to report correctly or fix. I hope to make this reporting automated (via Sentry) and remove this manual overhead.

Add automatic nuget package builds of osu and osu-framework

As the number of projects dependent on these increases, referencing them via submodule is getting quite cumbersome. By deploying nuget packages we can more easily keep individual projects segregated and maintainable.

Begin work on multiplayer lobby system

With more of the UI designs nearing completion, it feels about time that we get the infrastructure in place for osu!lazer multiplayer. This is a stretch goal and will likely not reach the point of gameplay being possible, but the lobby and room system should at least have some client-server structure in place.

Basic structural implementation of osu!mania editor

As we move the editor forward, we want to allow for arbitrary rulesets to be easily added with first-class editing facilities. In order to make sure everything is structured correctly, we will be focusing on getting the osu!mania setup in a usable yet modular way.

Complete the new changelog page

As mentioned in my previous post, this will be the new hub for keeping track of the ongoing development efforts invested in osu!. Having the new design completely deployed will reduce the strain on me to manually produce changelogs in a blog format and hopefully make tracking development more accessible for the wider audience.

Move osu-web score lookups to elasticsearch

I have been performing ongoing migration of MySQL servers to new hardware and software (5.6/5.7 to 8.0). In order to complete the last stages, I would first like to reduce load (and reliance) on the servers. Moving score lookups to elasticsearch will do this, but also allow for arbitrary lookups which have not been possible until now due to lack of indices.

New private messaging system

We’ve been working on the framework required to get a private messaging system deployed to replace the ageing (and disconnected) forum-based system that is only accessible on the old site. While a bit of a stretch goal, we hope to have this deployed by the end of the month.

New Projects

As we push forward with open sourcing each component of the osu! ecosystem, a few new git repositories have popped up which you may wish to follow:


This will contain any command line tools (.NET core) which consume lazer. Currently you will find a difficulty calculator tool which will be the go-to method of testing new Star Rating changes.


This will contain server-side components that don’t fit in the current laravel system. This repository is still undergoing some structural consideration as we decide how many git repos we want, but for now will house the .NET core version of osu-performance (Performance Point calculations) and a new Elasticsearch score indexer – part of an ongoing effort to alleviate MySQL of the heavy load of score/leaderboard lookups.

May 2018 Review

Milestone completion




Pretty good progress and relatively high completion rates, no? Let’s delve into detail in each respective project. This might be the last time I do this if the new changelog page goes as planned (I won’t miss it!).

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

Fix catch sizing #2632 (peppy)

After many months of Yuzu being completely oversized (big-boned; not fat), osu!catch gameplay scale has been refactored to mostly match stable.

Fix beatmap importing entering a bad state #2665 (peppy)

  • Also: fix conflicting Hash and Online IDs on beatmap import #2673 (peppy)

A lot of users were reporting that beatmap imports were getting stuck. It turns out that a single failed import would hold up the import process indefinitely and cause all subsequent imports to fail. There were quite a few reasons for this happening, but most should now be resolved.

Do note that we are still tracking one remaining case where imports can fail.

Add hold-to-quit button for gameplay/replays #2430 (UselessToucan)

No-keyboard players rejoice! You can now pause or exit gameplay without a keyboard handy. This is a definite requirement for mobile support.

Implement joystick input #2346 (smoogipoo)

You can now bind joystick buttons, hats and axes to anything that was bindable in-game! This allows for a huge amount of new control customisation which was never before available - even on stable!

Multiplayer lounge #2603 (DrabWeb)

While not yet functional, the designs for multiplayer are now more complete than ever. Don’t you just want to see this list populated with real games?

All Changes

  • Change Room.Participants to an IEnumerable #2703 (DrabWeb)
  • Match beatmap overlay author styling with web #2700 (Joehuu)
  • Add storyboard icon and fix preview button overlap on direct panels #2695 (Joehuu)
  • Fix importing long filenames from stable #2678 (peppy)
  • Multiplayer shared logic encapsulation #2669 (DrabWeb)
  • Centralise beatmap set cover update logic #2667 (DrabWeb)
  • Fix logo animation discrepancies #2682 (peppy)
  • Offload database query to task #2680 (peppy)
  • Fix player life management #2679 (peppy)
  • Fix Debug mode instead of Release mode for mono debug target #2677 (Tom94)
  • Add Type property to MultiplayerScreen #2672 (DrabWeb)
  • Add build tasks for visual tests and fix broken launch tasks #2671 (Tom94)
  • Fix results screen parallax being cut off #2663 (smoogipoo)
  • Fix mania hold notes displaying judgements #2660 (smoogipoo)
  • Ensure autoplay tests actually increase score above zero #2644 (peppy)
  • Split score multiplier and unranked label colours #2314 (Joehuu)
  • Rename CursorOverrideContainer to MenuCursorContainer #2637 (HoutarouOreki)
  • Bring pp calculations more in-line with osu!stable #2636 (smoogipoo)
  • Fix quit button test occasionally failing #2633 (peppy)
  • Fix incorrect default values keeping overlays in wrong state #2624 (Aergwyn)
  • Fix selecting song in playlist not starting the audio #2622 (smoogipoo)
  • Fix possible MusicController nullref #2618 (smoogipoo)
  • Fix disclaimer allowing notifications #2613 (Aergwyn)
  • Add icon next to beatmap title/username to open in browser #2612 (jorolf)
  • Fixed banana generation on catch specific maps #2611 (frankhjwx)
  • Fix double-HR application in OsuDifficultyCalculator #2587 (smoogipoo)
  • Add input toggles to the PlayerLoader screen #2504 (UselessToucan)
  • Prevent user from scrolling outside the timeline in the editor #2499 (AlFasGD)
  • Fix overlays from not hiding when returning to initial main menu state #2601 (Aergwyn)
  • Fix escape not working to go backwards in menus before finally exiting the game #2600 (peppy)
  • Allow drag clicking footer and filter on song select #2594 (Joehuu)
  • RoomInspector improvements #2588 (DrabWeb)
  • Prevent overlays from showing in intro/outro sequences #2577 (Aergwyn)
  • Add global key bindings for changing current ruleset #2532 (ocboogie)
  • DrawableRoom improvements #2522 (DrabWeb)
  • Fix HR mod affecting original beatmap difficulty #2582 (smoogipoo)
  • Implement taiko performance calculation #2572 (smoogipoo)
  • Fix taiko slider multiplier being applied twice #2568 (smoogipoo)
  • Fix converted beatmap hitwindows not working correctly #2567 (smoogipoo)
  • Multiplayer base screen #2560 (DrabWeb)
  • Implement osu!mania performance calculator #2557 (smoogipoo)
  • Add ability to bind “back” action; add default mouse binding #2472 (UselessToucan)
  • Fix incorrect namespace of OsuPerformanceCalculator #2570 (smoogipoo)
  • Speed up beatmap parsing and conversion #2566 (smoogipoo)
  • Fix hold notes never expiring #2564 (smoogipoo)
  • Use a stable sort for hitobjects #2563 (smoogipoo)
  • Fix conversion tests for ruleset-specific beatmaps not working #2562 (smoogipoo)
  • Make OsuPerformanceCalculator use the new hitresult namings #2561 (smoogipoo)
  • Bring osu! difficulty calculation on par with osu!stable #2556 (smoogipoo)
  • Re-namespace performance/difficulty calculators #2555 (smoogipoo)
  • Port osu-performance HD AR fix #2552 (smoogipoo)
  • Allow subclasses of LegacyScoreParser to specify beatmap/ruleset retrieval #2551 (smoogipoo)
  • Fix deleted beatmaps still being accessible in MusicController #2543 (smoogipoo)
  • Re-enable slider curve lengthening #2540 (smoogipoo)
  • Fix drumroll completions always giving GREAT judgements #2539 (smoogipoo)
  • Use osu!stable hitwindows for converted hitobjects #2524 (smoogipoo)
  • Add breadcrumb control that follows focus in a screen stack #2521 (DrabWeb)
  • Add keybind to disable mouse buttons #2483 (smoogipoo)
  • Fix possibility of test rulesets being discovered from assemblies #2544 (smoogipoo)
  • Stop focused overlays from handling DragStart #2542 (peppy)
  • Reduce elements hidden by letterboxing break overlays #2541 (smoogipoo)
  • Fix performance calculation not considering time-adjustment mods #2538 (smoogipoo)
  • Fix nullref when changing ruleset at main menu #2533 (peppy)
  • Apply HD as speed adjustment #2531 (smoogipoo)
  • Fix crash on startup when adjusting volume before volume control loaded #2527 (peppy)
  • Fix song progress time counters wrapping after an hour #2526 (peppy)
  • Fix osu! difficulty/performance calculation failing or giving wrong values #2525 (smoogipoo)
  • Implement a hold-to-confirm screen when exiting game using escape key #2514 (peppy)
  • Change mapping delete key to shift+delete to allow binding delete key #2375 (aQaTL)
  • Update framework with upstream fixes #2530 (peppy)
  • Multiplayer folder restructure #2519 (DrabWeb)
  • BreadcrumbControl design adjustments #2518 (DrabWeb)
  • Update framework #2516 (peppy)
  • Remove explicit clock in TestCaseBreakOverlay #2501 (smoogipoo)
  • Update CodeFileSanity #2498 (peppy)
  • Fix beatmap/ruleset being changeable while in the editor #2495 (smoogipoo)
  • Add mode-specific beatmap statistics #2492 (smoogipoo)
  • Rework beatmap conversion process to use IBeatmap #2491 (smoogipoo)
  • Migrate the game to use an IBeatmap interface #2490 (smoogipoo)
  • Selecting a mod triggers on release #2485 (santerinogelainen)
  • Use bindable transforms #2482 (smoogipoo)
  • Add squirrel dependency on net471 #2479 (peppy)
  • Decouple FilterControl.Ruleset from the game-wide ruleset bindable #2471 (UselessToucan)
  • Revert breaking UserProfileOverlay change #2481 (smoogipoo)
  • Apply offset to end times on legacy converter #2473 (NeoAdonis)
  • Stop audio playing from UserProfileOverlay when hiding (REVERTED) #2470 (UselessToucan)
  • Use more inheritance for UserStatus #2458 (4ppleCracker)
  • Fix replays being played in the selected ruleset #2450 (tgi74)
  • Add toggles for beatmap skins and hitsounds #2432 (UselessToucan)

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

Fix broken TransformSequence.Loop #1580 (Tom94)

Loading spinners will finally spin again!

Fix mouse input state inconsistencies and add unit tests #1565 (peppy)

Heavy testing added for input states. We’re still not done refactoring the input framework, but this is a step in the right direction towards not regressing when we do so.

Implement joystick input #1494 (smoogipoo)

See above.

All Changes

  • Fix LastMousePosition not always being present when expected #1581 (peppy)
  • Fix wheel values not being aggregated in raw mouse handler #1579 (peppy)
  • Add support for long paths on windows #1574 (peppy)
  • Fix WindowsClipboard.SetText being broken #1573 (ekrctb)
  • Fix infinite queuing of expensive operations in GLWrapper #1570 (smoogipoo)
  • Always yield the new state when creating distinct states #1568 (peppy)
  • Improvement to project files using Directory.Build.props #1566 (huoyaoyuan)
  • Explicitly dispose previous TestCase when switching to a new one #1564 (smoogipoo)
  • Make IBindable and IBindable<T> share some common interfaces #1563 (smoogipoo)
  • Add a way to override the ScrollContainer’s scroll bar #1561 (smoogipoo)
  • Add ability to ButtonDown and ButtonUp in ManualInputManager #1560 (peppy)
  • Added padding to the checkbox for running all steps. #1558 (DudeMartin)
  • Update OpenTK version #1557 (peppy)
  • Expose scroll wheel and key methods from ManualInputManager #1556 (smoogipoo)
  • Move custom AppearDelay into its own interface #1555 (peppy)
  • Fix autosize invalidations occurring with BypassAutoSizeAxes #1554 (smoogipoo)
  • Allow custom AppearDelay per tooltip #1553 (default0)
  • Fix textbox not always blocking all handled key presses #1550 (peppy)
  • Clear all trace listeners to avoid MessageBox popups on windows #1551 (peppy)
  • Fix wrong signature on FillTo #1549 (smoogipoo)
  • Fix SpriteText size not being computer when set to empty #1548 (smoogipoo)
  • Commit missed change from #1545 #1547 (peppy)
  • Clean up BufferedContainer and fix alignment issues #1546 (smoogipoo)
  • Change order of lines to properly raise events #1545 (AlFasGD)
  • Throw an (unhandled) exception on assert failure #1544 (peppy)
  • Make children life update in BDL-load #1542 (smoogipoo)
  • Update CodeFileSanity #1541 (peppy)
  • Add a way to transform bindables #1539 (smoogipoo)
  • Add CircularProgress.FillTo method #1538 (UselessToucan)
  • Add an option to exact-match keybindings #1493 (smoogipoo)
  • Use pattern matching #1537 (UselessToucan)
  • Replace PrimitiveType.Quads with PrimitiveType.TriangleStrip in CircularProgressDrawNode #1532 (jorolf)

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

Add webhook for GitHub pull request merges #3286 (nanaya)

Spinner updates #3264 (nanaya)

One of my pet peeves, finally fixed. Loading spinners are now perfectly centred.

Add social buttons menu bar #3235 (nanaya)

Welcome back twitter, facebook. Follow us if you care.

Add loved beatmaps to user profile #3226 (notbakaneko)

Self explanatory. Not sure how they got missed until now!

Add toggle to block private messages from non-friends #3225 (nekodex)

Added as a prerequisite for the upcoming private messaging system. Change the setting from your settings page.

Show past tournaments on the tournament listing #3209 (nekodex)

You can now view all previous official tournaments from the tournaments page. Easy way to get information about tournaments even after they have ended!

Delete scores on qualification #3207 (nanaya)

This was missing since implementation of the modding discussion system. While not a breaking issue, it was indeed a bit weird seeing scores remain on the leaderboards until the point of ranking.

New Crowdin translations #3192 (peppy)

We have moved our translations to the hosted Crowdin service, making it a lot easier for the community to jump in and localise the site (and everntually the game, too) to their local tongue. Go check it out and chuck in some help if you can, but either reviewing and voting for existing translations or filling in the gaps!

All Changes

Holy crap, did you actually make it this far? Thanks for reading. A lot of effort goes into these posts so I hope it was of some use.


dev changelog 20180426

published 02 May 2018

Here comes another big one. We’ve been busy across the board and are making phenomenal progress, especially with the new web site (which is now enjoying being the primary experience that most users will see going forward). We’ve been closely monitoring your feedback and making changes where necessary to ensure it’s as comfortable as possible.

It’s looking more likely that these posts will be monthly going forward, in line with our monthly project milestone goals. We’re also improving the changelog display on the web so it can include lazer and new web changelog entries in a more visual way, bridging the gap with these posts (and possibly making them redundant?).

Here’s a preview of the direction we’re going:

We’ve also been making some headway over at osu-performance, modernising the code base ready for further contributions (thanks heavily to Tom94!).

We have also begun releasing production data which can be used in conjunction with this project to perform local statistical analysis and testing. We hope to continue pushing development on analytic tools to make it easier for the community to jump in and test algorithm changes for star difficulty and performance points.

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

Add toggles for beatmap skins and hitsounds #2432 (UselessToucan)

You can now choose whether you want to see and hear beatmap-specific skins/hitsounds or not. Currently this is a global setting, but based on feedback we will likely re-implement it to be saved on a per-beatmap basis.

Update to .NET 4.7.1 #2426 (peppy)

In order to user some new APIs (and benefit from GC improvements) we have been keeping up with new .NET releases. Unfortunately in this upgrade to 4.7.1 we seem to have broken compatibility for some users – we may have pulled the trigger too early. This is something we are currently working on fixing. If you’re no longer able to run lazer, please reinstall using the latest release from the releases page.

Add beatmap ID lookup to BeatmapSetOverlay #2350 (naoey)

With this change, links in chat which point directly to beatmap difficulties (as opposed to beatmap sets) are now clicking, bringing you to the in-game beatmap display rather than loading the website.

Add automated appveyor deployment #2421 (peppy)

This makes it easier to deploy updates to github, reducing a manual step of running the deploy app on my own PC. Reduces overhead and also increases security. Should mean you see a lot more frequent updates pushed out over the coming months!

Add badges to ProfileHeader #2407 (jorolf)

To match the new web implementation, profile badges are now displayed on the in-game profile overlay as well.

Add support for replay mods #2400 (tgi74)

Until now, we didn’t have a way to convert “legacy” mods (as found in replay headers) to the per-ruleset lazer implementation. This adds the ability to do so, exposing a method for legacy rulesets to implement and support replay mod conversion. As a reminder, you can watch replays in lazer by drag-and-dropping .osr files into the window.

Add right click absolute scrolling in song select #2398 (tgi74)

While personally I don’t think this is a great thing to have as it goes against tried UX for scroll views, it has been in osu! since forever. Disabled by default, you can now choose to let right mouse drags scroll at song select as they do on osu-stable.

Fix OAuth token not saving often enough #2387 (smoogipoo)

There was an issue where oauth tokens would be lost at random, causing unexpected logging out from lazer. This should now be resolved, meaning you can keep your session for longer without issue!

Implement Judgement Colours #2336 (Frontear)

I’m not sure how these got merged before I could object, but they are in for now. The colours are not final and it is very obvious that this needs further iteration, as they blend in with almost all beatmap backgrounds making it even more impossible to see judgements.

Add setting to toggle performance logging #2298 (peppy)

Touched on in the last changelog, this adds the ability to turn on performance profiling, now being disabled by default to reduce the performance overhead it incurs.

Other Changes

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

Switch to .NET Standard 2.0 #1483 (smoogipoo)

Paving the way forward for even better cross-platform support, we have finally made the jump to .NET standard 2.0. This means we can now fully support .NET core in addition to .NET Framework / Mono. It also makes deploying to iOS/android a much more pain-free progress. This chewed up a considerable amount of development time this month, but it had to happen sooner or later. Feels really good to get this completed!

We will begin to look at switching to .NET core for our deployment builds over the coming months, removing all .NET framework dependencies and providing native macOS and linux builds in our pre-compiled releases.

Fix runaway threads when running tests #1533 (peppy)

We have been running into issues with our automated testing process randomly and inexplicably failing, adding a huge amount of frustration to the development process. Enough was enough, so I set aside a couple of days to go through every possible failure path (and I ended up finding more than one!)

Needless to say, testing and deployment should be 100% smoother now.

Make Screen.Push asynchronous when necessary #1490 (peppy)

Until now, screen switches could potentially cause a blocking load operation if their parent wasn’t asynchronously loading the next screen. This change resolves that by adding async load logic at a Screen level. Now screens are always loaded asynchronously regardless of how they are pushed.

Significantly reduce number of IsMaskedAway calculations #1504 (smoogipoo)

A decent performance improvement in certain display scenarios by reducing redundant uncached calculations.

Other Changes

  • Update to .NET 4.7.1 #1529 (peppy)
  • Replace PrimitiveType.Quads with PrimitiveType.TriangleStrip in CircularProgressDrawNode #1532 (jorolf)
  • Add the ability to switch between tabs using keyboard controls #1363 (swoolcock)
  • Fix new detections in rider 2018.1 #1536 (peppy)
  • Fix dynamic compilation not working for some users #1535 (peppy)
  • Ensure host is in a running state before running tests further #1534 (peppy)
  • Fix test steps being added in LoadComplete never running in nUnit #1530 (peppy)
  • Log exceptions when asset loading fails #1526 (smoogipoo)
  • Fix ProxyDrawables not respecting whether the originals would be drawn #1507 (smoogipoo)
  • Fix testcase SetUp methods not being properly run #1525 (smoogipoo)
  • Make sure each TestCase runs all tests under one GameHost #1524 (peppy)
  • Fix potential nullref if GlyphStore is used too quickly #1522 (peppy)
  • Simplify SetProportional in BindableNumber #1458 (jorolf)
  • Consume all pending text from input in OnKeyUp #1519 (FreezyLemon)
  • Fix regression in input handler configuration #1518 (peppy)
  • Implement IBindable interfaces for get-only support #1517 (smoogipoo)
  • Update NUnit to version 3.10.1 #1516 (FreezyLemon)
  • Fix new input handlers not being enabled by default #1513 (UselessToucan)
  • Normalize line endings to LF #1509 (peppy)
  • Fix regression in dynamic compilation #1506 (peppy)
  • Fix test StepContainer light colours not always applying correctly #1502 (peppy)
  • Fix dynamic compilation namespace suffix being appended multiple times #1501 (peppy)
  • Make FrameworkTestCase abstract #1500 (peppy)
  • Explicitly define the dynamic compilation namespace to avoid crosstalk #1499 (peppy)
  • Delete unnecessary libraries #1496 (FreezyLemon)
  • Remove TestTestCase #1498 (peppy)
  • Fix some file paths causing framework to crash on startup #1495 (peppy)
  • Use Linq.Append and Prepend. #1492 (huoyaoyuan)
  • Add rider run/debug configurations #1489 (peppy)
  • Fix dynamic compilation not detecting changes on .NET Core #1488 (smoogipoo)
  • Remove assembly loading code from TestBrowser #1487 (peppy)
  • Fix dynamic compilation #1486 (nbvdkamp)
  • Fix framework tests not building against netcore2.0 #1484 (peppy)
  • Expose the ability to disable background performance profiling #1482 (peppy)

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

Add button on user profile linking to change username store page #3082 (nekodex)

Has been moved from the profile to the settings page, which feels more out-of-the-way but still easy to discover for users looking to change their username.

Update beatmapset ranking queue system #3053 (nanaya)

Based on feedback from BN/QAT members and mappers, it was decided that the penalty when a map is disqualified can sometimes be a bit too much, especially when only a small change was made to the map. To mitigate this, we’ve allowed maps to re-queue at roughly the position they were at when disqualified.

As an example, if you had a beatmap which was qualified for two days before being disqualified, and then requalified 5 days later, you would still only need to wait around 5 days for ranking (7 days queue length - 2 days previously qualified). Note that this caps out at a minimum of 24 hours, to make sure beatmaps aren’t instantly ranked before others can jump in and give their opinion on a re-qualification.

Add played filter to beatmap listing #3051 (notbakaneko)

As a support, you can now (once again) filter the beatmap listing by played/unplayed maps.

Add Discord field to user profiles #3033 (nekodex)

Skype is out of fashion, so we welcome a discord field on profiles. Due to limitations, this can’t be linked to open discord for the moment, but will instead copy a user’s discord handle to your clipboard for pasting in discord.

Show total first place rank count on profile; display pp instead of score #3022 (nanaya)

It was pretty weird that we were displaying scores on profiles in some cases instead of pp. Scores on their own basically carry no meaning, so this change made a lot of sense.

Also you can now see how many first place scores a user has at a glimpse!

Updated design for displaying previous usernames #3007 (nanaya)

For the first time, you can see all previous usernames a user has had. Now displayed with a smooth animation to boot.

Virtualize beatmap listing #3001 (notbakaneko)

This optimisation allows for infinite scrolling at the beatmap listing to automatically unload off-screen tiles, improving performance by insane amounts.

Send order confirmation mail after store payment received #2956 (notbakaneko)

For some reason, we didn’t have an email confirmation being sent out after an order for a physical product is placed until actual shipment occurred. As we sometimes have delays of up to 5 days before we ship goods, this should very much help ease anxiety during this period and stop the number of support enquiries we get asking whether we actually received an order.

Post to disqualify #2954 (nanaya)

In an effort to further simplify the disqualification process further, there is no longer a dedicated disqualify button. Instead, it is already triggered when an issue is pointed out (problem level only) by a QAT member.

Touch device mod display #2911 (nanaya)

Exclusively on the new site design, you can now see plays marked with the TD mod. Note that this mod is only applied to plays where a touch device is deemed to have helped the player reach jumps, and as such won’t be automatically applied to all touch plays.

Implement the new header design #2906 (nanaya)

This is a kind of in-between step briding us to the ongoing design overhaul of the new site (as in an even newer new design!). It improves usability of the top menu by reducing motion and exposing the top-level links at all times, rather than having them hidden until hover.

Add fancy hover effect on logo #2912 (nanaya)

Also the osu! logo animates on hover!

Add supporter status to the supporter page #2896 (nekodex)

Now with even more detail than before, you can examine the status of your supporter tag and also view historical stats on how much you’ve contributed to the game. Love ‘ya all.

Search implementation overhaul #2857 (notbakaneko)

Mostly an under-the-hood change, the search infrastructure is now a lot more extensible, allowing for adding more complexities and details to the search system going forward.

User badges #2826 (nanaya)

User badges finally make a return on the new site, with a fresh carousel display, rotating through all the badges a user has achieved. Hover to view all badges at once.

Other Changes


dev changelog 20180324

published 26 Mar 2018

Back again, sorry it took so long! This post’s a long one (aka we’ve been busy!). I hope these posts are worth it, because the amount of time it takes to keep this up is pretty insane!

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

Add the ability to skin the gameplay cursor #2257 (peppy)

While custom trails are not supported, the basic pieces of the cursor are now free to be customised. This was one of the highest priority skinning requests.

Add the ability to take in-game screenshots #2199 (UselessToucan)

With a quick press of F12 you can permanently save your memories to disk.

As with stable, you can also choose the format if you prefer lossless output.

Restore old auto-popout notification overlay behaviour #2280 (peppy)

In recent builds, notifications don’t automatically pop-out. While this was less annoying, it also meant that notifications were basically invisible to the user (even when they were important).

For now we’ve restored the behaviour of having the notification overlay pop out every time. You can dismiss it by clicking anywhere on the screen now, so it’s not near as annoying. Eventually we will have toast notifications which will appear without the need for the full notification overlay, so consider this a stop-gap solution.

Make Beatmaps decodable as Skins #2253 (peppy)

Beatmaps with custom skinned components will now get similar treatment to user skins. Going forward they will benefit from improvements to legacy skin support. I’d love to make a video showing this off but.. it happened to regress in the latest release, so that will have to wait ^^;.

Note that for the time being, there is no toggle to disable this, so they will have priority over user skins. A toggle will be added soon.

Implement the editor’s beat snap divisor #2247 (smoogipoo)

One component at a time, the editor is approaching a state where it could be considered usable.

Implement an interface for moving hitobjects in the editor #2195 (smoogipoo)

In theory, this would mean that hitobjects are now draggable in the editor. In practice, this regressed and isn’t working in the latest release, so let’s jsut pretend that it works for the time being.

Add skin support for hit judgements #2181 (peppy)

While the animation is still missing, you can now customise your judgement explosions visually.

Implement mania star difficulty calculation #2124 (Poyo-SSB)

We now have accurate star difficulty calculations for three of four default game modes! All that remains is osu!catch (please someone help make it happen).

Match HP drain harshness closer to stable #2183 (peppy)

After many of you reached out about the HP drain being insanely high, we’ve decided to reduce its effect to 50% until we decide on a final algorithm.

Implement updated volume control overlay design #2165 (jorolf)

Mmm, glowy! Still plenty of usability tweaks that need to be applied to the volume overlay, but at least it matches the surroundings now.

Add recent section to user profile #2120 (naoey)

Gradually the user profile section is getting more complete. This time we add the “Recent Activity” display.

Allow previewing background adjustments at player loading screen #2045 (UselessToucan)

As you are already accustomed to, changes made on the visual settings panel are now conveyed in real-time.

Other Changes

  • Increase deploy delta keep #2301 (peppy)
  • Move binding to LoadComplete #2300 (peppy)
  • Fix beatmap background fade not being updated on retry #2296 (smoogipoo)
  • Fix volume glow being cut off #2294 (smoogipoo)
  • Fix API never stopping its thread #2293 (peppy)
  • Fix player not getting disposed in some scenarios #2292 (peppy)
  • Add perfect mod icon #2290 (Joehuu)
  • Fix BeatmapCarousel’s flush not correctly applying selection changes #2289 (peppy)
  • Fix mod button sounds playing when mod overlay is not visible #2255 (peppy)
  • Only allow settings or notifications to be visible at once #2279 (peppy)
  • Fix FocusedTextBox in line with framework changes #2278 (peppy)
  • Use cached VertexBuffer add delegate #2277 (smoogipoo)
  • Don’t hard-crash when an unknown section is encountered in a legacy file #2276 (peppy)
  • Fix osu! logo making hover beat sounds when not visible #2272 (peppy)
  • Fix retry not allowing continuing beyond PlayerLoader #2270 (peppy)
  • Fix DummyRuleset getting selected after non-matching filter #2262 (peppy)
  • Update nuspec to include humanizer localisations #2258 (peppy)
  • Add scale adjusts to bring legacy skins in-line with lazer sizing #2256 (peppy)
  • Add skin/beatmap lookup hierarchy #2254 (peppy)
  • Remove ComboColour from HitObjects #2252 (peppy)
  • Hard bail on attempting to import an invalid archive format #2246 (peppy)
  • Make import notifications fail when any imports fail #2245 (peppy)
  • Add skin.ini parsing #2244 (peppy)
  • Fix crash when attempting to select objects that don’t have masks #2243 (smoogipoo)
  • Fix juice stream droplets spawning in incorrect locations #2231 (peppy)
  • Rewrite the way clocks are handled in the Editor #2226 (smoogipoo)
  • Implement mousewheel time scrolling in the editor #2225 (smoogipoo)
  • Make DrawableHitObject a CompositeDrawable #2223 (peppy)
  • Improve mods description and adjust multipliers to match stable #2219 (Joehuu)
  • Consolidate API into its own component #2218 (peppy)
  • Fix beatmap combo colours not being applied #2215 (peppy)
  • Fixed exit from game saves username instead of email #2214 (VPeruS)
  • Update framework #2209 (peppy)
  • Fix autoplay button wrongly being active after a Ctrl-Enter play #2207 (FreezyLemon)
  • Create a base TestCaseEditor for rulesets to derive #2206 (smoogipoo)
  • Move test beatmap from TestCasePlayer into an instantiable class #2205 (smoogipoo)
  • Fix slider circle overlays moving with the endpoints #2204 (smoogipoo)
  • Fix check against LegacyID for non-default rulesets #2200 (HoLLy-HaCKeR)
  • Fix login failure for users with no country rank #2198 (peppy)
  • Update ISSUE_TEMPLATE #2197 (peppy)
  • Split out the slider head into a separate drawable hitobject #2194 (smoogipoo)
  • Fix major regression (framework revert) #2193 (peppy)
  • Rework decoders to be more flexible #2191 (peppy)
  • Update framework #2190 (peppy)
  • Interpolate ParallaxContainer’s scale #2189 (peppy)
  • Add Mirror Mod for Mania #2188 (tgi74)
  • Add drawable to display (and update) relative dates #2185 (peppy)
  • Remove judgements when deciding a new judgement for a HitObject #2182 (peppy)
  • Make gameplay cursor vs skip button feel nice again #2170 (peppy)
  • Make osu!mania conversions more in-line with osu!stable #2169 (smoogipoo)
  • Rewrite BreakOverlay to work with rewinding #2160 (peppy)
  • Make song select ensure current beatmap is always playable in the active ruleset #2159 (naoey)
  • Improve mouse-based load inhibition at player loading screen #2078 (UselessToucan)
  • Fix difficulty calculator regression when applying mods #2186 (peppy)
  • Removing “mouse wheel disabled” checkbox from visual settings in gameplay #2184 (pdrapoport)
  • SliderTick transform improvements #2178 (peppy)
  • Fix arbitrary API request errors getting identified as timeouts #2177 (peppy)
  • Make LegacyID nullable #2176 (peppy)
  • Update framework with FlowContainer changes #2175 (smoogipoo)
  • Fix left and right arrows keys in chat overlay not working #2174 (peppy)
  • Fix taiko drumrolls potentially getting incorrect judgements #2171 (smoogipoo)
  • Fix incorrect slider-to-drumroll conversions in taiko #2167 (smoogipoo)

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

Expose the ability to disable background performance profiling #1482 (peppy)

We have automatic logging of stutter frames to log files for further analysis. Unfortunately, the overhead from this being done on four threads can result in more stutters in a cascading effect. For now, this performance analysis is disabled by default and can be optionally enabled by the user when required.

For what it’s worth, this same behaviour exists but only in CuttingEdge builds, to reduce the latency overhead for normal users.

Overhaul transform logic to fix many failing rewind/seek cases #1437 (peppy)

I undertook this complex task of ensuring frame-accurate rewind logic as the bugs surrounding transform rewindability were piling up. Things are in a very good state now, with the only remaining known issue being mostly unrelated to transforms themselves (approach circles get stuck on screen due to proxy drawables).

Refactor GameWindow to not extend OpenTK.GameWindow #1420 (swoolcock)

This is a step towards getting the iOS build projects into the main development stream. Allows for more abstract window types to be the backing for game display.

Fix memory leaks post game exit #1472 (peppy)

We’re still tackling a scenario where our unit tests get stuck in an endless loop state. This was another attempt to fix that. In the process, we managed to find a few memory leaks, although none of these will affect the end-user in any meaningful way as they only occur if you run multiple Game/GameHosts in a single execution.

Add method to retrieve a Bitmap of the current GL screen state #1454 (UselessToucan)

This is the framework prerequisite to get screenshot capture working at osu!’s end.

Other Changes

  • Add check for IsCancellationRequested in TcpIpcProvider #1480 (peppy)
  • Add a cached delegate for VertexBatch.Add() #1477 (smoogipoo)
  • Fix Incorrect Behaviour of ContainerExtensions.Wrap in Certain Cases #1476 (Tom94)
  • Fix performance of TakeScrenshotAsync #1475 (peppy)
  • TextBox should only handle keyboard input when focused #1471 (peppy)
  • Add wrap method to remove duplicate code in effects #1470 (default0)
  • Fix macOS platform modifiers not being properly loaded #1468 (smoogipoo)
  • Fix seekOffset being considered when seeking #1466 (smoogipoo)
  • Fix being able to seek TrackVirtual to negative time values #1464 (smoogipoo)
  • Avoid background saves after actual saves occur #1462 (peppy)
  • Add a base component class #1461 (peppy)
  • Make ChildID internal #1460 (peppy)
  • Fix TextSize changes not being correctly applied to unchanged characters #1459 (peppy)
  • Rename frameBufferX -> drawNodeX #1457 (smoogipoo)
  • Add logging of failed response processing to network log #1453 (peppy)
  • Reintroduce & fix gamewindow refactor #1452 (FreezyLemon)
  • Revert GameWindow changes #1451 (peppy)
  • Add method to add arbitrary drawables to TextFlowContainers #1450 (peppy)
  • Remove highly unnecessary log output #1449 (peppy)
  • Make TabControl’s tab flow overridable #1447 (smoogipoo)
  • Remove depth comparisons from FlowContainer ordering #1446 (smoogipoo)
  • Allow SampleManagers to cache failed lookups #1440 (peppy)
  • Recreate changes for explicit flow order from #1261 #1304 (default0)
  • Update licence year #1445 (jacksonisiah)
  • Move CursorContainer’s Add to BDL #1442 (peppy)

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

Add site switcher orb to aid in navigation between old and new site. #2778 (nekodex)

As we move closer to deprecating the old site, I wanted to make it easier for users to get a taste of the new site (but also get back to the old site if they find any lingering issues).


As of today, the site will also remember your preference and ensure you remain on that version wherever possible.

Update ranking eta calculation to match new per-ruleset queues #2746 (nanaya)

To allow for fairer qualification queues, we now allow up to 8 beatmaps to enter ranked from qualified each day per game-mode rather than being in a single global queue. Estimates shown on the new modding system have been updated respectively.

Add link to to user post history #2711 (notbakaneko)

Due to popular demand, we prioritised getting post counts and user-specific post listings implemented sooner rather than later.

Mail notification toggle for forum topics #2693 (nanaya)

You can now choose whether you want to receive email notifications for your forum subscriptions.

You can change this setting from a forum thread as you’re viewing it, too. Check the button on the bottom-left toolbar.

Add beatmap status to beatmap panels and beatmap page #2688 (nekodex)

The ranking status of beatmaps are now displayed everywhere their panels are visible. Really neat UX improvement, in my opinion.

Include poster in forum search results #2656 (notbakaneko)

Previously it was not easy to know who was responsible for a post in the forum search results. Now a ba

Account standing section #2573 (LiquidPL)

You can now once again see what you did wrong if you’ve been a bad little Jimmy.

A final note

We are listening to your concerns on decreased usability in certain areas of the new design (regularly people saying stuff is “too big” or “too spaced out”). You’re welcome to continue to voice your concerns, but just know that we do have some huge design changes in the pipeline which dial things back and make the whole site a lot more usable.

Except to see these changes hit before the old site is completely removed from existence.

And don’t worry, we haven’t forgotten about profile badges (for tournament winners), the PM button or anything else that might feel missing at the moment. Bear with us for just a bit longer!

Here’s a preview of the direction we’re going. I’m going to get in trouble for sharing this. Sorry flyte!

Other Changes


dev changelog 20180306

published 07 Mar 2018

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!

A whole lot of work has been done, focusing on beatmap conversion, compatibility, performance and bug fixes. A lot more maps should now play correctly and performance should be 2-10x higher than what it was. Also, basic skin support is in!

Rewrite replay frame construction/handling and accommodate for conversion #2137 (smoogipoo)

Until now, we were relying on a global replay frame across all rulesets, to allow for importing replays from existing .osr files. While this had its place, we definitely want a more generic replay frame structure going forward. This change separated out the legacy frames from a newer frame format which can be designated by the ruleset itself.

Implement hitobject selection overlays in the editor #2095 (smoogipoo)

You can now see outlines surrounding the selected objects. Another step forward for the editor!

Reduce parallax effect during gameplay #2134 (peppy)

We heard your feedback and have reduced the parallax effect on gameplay screens. This should mean you can still enjoy distraction-free gameplay without completely disabling parallax.

Implement skin support for (most) hitsounds and (osu!) hitcircles #2105 (peppy)

After getting a lot of framework in place, we can finally import skins! Drag-and-drop an .osk into the window and you should now see your skin under the new dropdown. Note that this is not the final method of selecting skins.

For now only a few skinned elements are implemented as a trial of the implementation. Going forward we will gradually be adding further elements. Parsing of skin.ini is the next priority.

Other Changes

  • Fix taiko drumrolls potentially getting incorrect judgements #2171 (smoogipoo)
  • Add legacy timing offsets #2166 (peppy)
  • Fix skin file path lookup performance #2164 (peppy)
  • Fix hard crash due to spinner spin requirement being zero #2163 (peppy)
  • Add rewind support for storyboards #2162 (peppy)
  • Fix parallax container during rewinds #2161 (peppy)
  • Fix linear perfect curves not using the linear curve approximator #2155 (smoogipoo)
  • Only use osu.Desktop to determine test assemblies #2154 (smoogipoo)
  • Implement an interface for beatmap conversion tests #2153 (smoogipoo)
  • Fix HR not properly applying to sliders #2146 (smoogipoo)
  • Fix FastRandom using uint instead of int for NextDouble() #2144 (smoogipoo)
  • Don’t use BufferedContainer for OsuLogo #2143 (peppy)
  • Fix legacy catch replay input not being scaled to the playfield’s width #2142 (smoogipoo)
  • Fix importing some (broken) beatmaps looping infinitely #2136 (peppy)
  • Improve clock handling logic for gameplay #2126 (peppy)
  • Fix slider heads fading out too late #2138 (peppy)
  • Fix depth of already-visible panels not being updated after a sorting change #2135 (peppy)
  • Ensure selection is finalised before exiting song select #2132 (peppy)
  • Fix incorrect exit block conditional #2131 (peppy)
  • Fix bindings not being unbound on ModSelect #2129 (peppy)
  • Fix song select iteration when all panels are filtered #2127 (peppy)
  • Improve vector conditional #2123 (peppy)
  • Remove null channels from SkinnableSound playable channels #2118 (peppy)
  • Rely less on every-frame transform helpers #2117 (peppy)
  • Fix sliders never getting a correct lifetime set #2116 (peppy)
  • Give DrawableSlider an accurate position and size #2107 (smoogipoo)
  • Reset mouse confine mode on input setting reset hotkey #2099 (peppy)
  • Fix legacy Taiko replays having reversed inputs #2098 (tgi74)
  • Use Multicore JIT #1966 (UselessToucan)
  • Fix migration file case #2112 (VPeruS)
  • Implement skin import, database and storage #2103 (peppy)
  • Update framework #2101 (peppy)

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

Set display colour depth to correct value when switching to fullscreen #1428 (LastExceed)

Quite a few users were reporting full screen mode switching their display colours to 256 colour (definitely less than how many we need!). Should now be resolved.

Improve performance of SetGlobalProperty #1414 (peppy)

Tackling performance at the lowest level, I made some changes to the way shader properties were assigned to reduce overhead. 5-10% improvement in the best cases.

Fix transforms on RemoveCompletedTransforms drawables applying forever #1413 (peppy)

There was a regression when rewind support was added causing old (already-completed) transforms to continue updating indefinitely. This saw performance degrade over the length of a beatmap. Now resolved.

Avoid updates / generating draw nodes for valid BufferedContainers #1416 (peppy)

Buffered containers are our method of drawing to textures. We use them regularly to cache complex drawable structures and reduce overhead. Until this change, the caching was only improving performance in very minimal ways (mostly fill rate). Now, the cached state stops all child updates and expensive draw thread updates.

Other Changes

  • Move CursorContainer’s Add to BDL #1442 (peppy)
  • Load log entries asynchoronously #1436 (peppy)
  • Allow graceful failure when dynamic compile fails in TestCase constructor #1435 (peppy)
  • Avoid including directories with many files in dynamic compile watch list #1434 (peppy)
  • Fix null ref regression #1430 (peppy)
  • Inline out variables #1425 (UselessToucan)
  • Cleanups to clock handling #1423 (peppy)
  • Fix transforms of same type/time not being removed correctly #1427 (peppy)
  • Don’t unnecessarily update depth if depth is already set correctly #1426 (peppy)
  • Ensure bindings unbind in both directions when explicit UnbindBindings is called #1424 (peppy)
  • Catch exceptions thrown during dynamic compilation runtime #1422 (peppy)
  • Use same argument order in all transformable conditionals #1421 (peppy)
  • Add logging when threads fail to join in time #1419 (peppy)
  • Fix VisualTests crashing on first startup due to incorrect configuration #1415 (peppy)
  • Don’t track all used objects #1412 (peppy)
  • Reduce dependence on zero-duration transforms #1411 (peppy)
  • Always confine cursor when left mouse button is pressed #1408 (UselessToucan)
  • Add a LoadAsyncComplete method #1410 (peppy)
  • Allow resource managers to accept and return null #1405 (peppy)

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

User monthly plays and replays watched charts #2608 (nanaya)

Adding back missing profile pieces. Graph design is going to be updated to feel a bit better, consider this temporary!

Add dedicated search box for mobile layout #2597 (nekodex)

It was noted that finding the search option on small screens was near impossible. We’ve adding an always-visible search box to solve this one.

Show post count on user profile page #2578 (notbakaneko)

Improved page title #2531 (nanaya)

Page content-related descriptive text is now prioritised at the start of page titles, so you can more easily find tabs.

Threaded forum search #2332 (notbakaneko)

Forum search have received some upgrades. Go test it out here.

Other Changes


dev changelog 20180222

published 23 Feb 2018

Having reached out on twitter for feedback and getting a huge response, a large focus was placed on fixing lingering issues in osu-web this week. Make sure to read to the end, as osu-web definitely MVP this week.

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

Surprisingly few things to comment on this week. I’ve been focused on the infrastructure required for skinning, which has involved cleaning up and preparing many other subsystems. smoogipoo has been working on the underlying pieces to bring the editor’s hitobject selection and mutation up to speed.

We’ve also been working on some lingering threading issues causing CI to occasionally fail. Solid under-the-hood progress.

Fix replay import #2087 (peppy)

While lazer did support drag-drop replay import, it was unknowingly broken for a good period of time. Now works, again.

Abstract away model-filemodel and add mutable stores #2070 (peppy)

This is the second of the large infrastructure changes required for skin imports (first was touched on last week). A simple way to explain this would be that we can now add new archive storage types to the game (like Beatmap or Skin) and have them use the central File store. This allows for de-duping and databasing at a global level. If a skin and beatmap were to reference the same file, it will only be stored on disk once, saving space.

Other Changes

  • Update framework #2101 (peppy)
  • Reword instances of “login” to “sign in” #2100 (Joehuu)
  • Fix stacking not working with sliders #2097 (smoogipoo)
  • Fix some common CI unit test failure causes #2096 (peppy)
  • Expose SliderBody’s snaking and border colour #2094 (smoogipoo)
  • Combine border radiuses of selection and capture boxes #2092 (smoogipoo)
  • Remove osu! playfield scale from the editor #2091 (smoogipoo)
  • Fix editor layers not respecting playfield aspect ratios + scales #2090 (smoogipoo)
  • Move manual OsuPlayfield aspect adjustment into the RulesetContainer method #2088 (smoogipoo)
  • Improve testability of API #2075 (peppy)
  • Collapse visual settings by default in player #2074 (peppy)
  • Give storyboards a BeatmapInfo to reduce weird method calls #2073 (peppy)
  • Update framework (and fix left/right arrow control of textboxes) #2071 (peppy)
  • Update framework with GameThread fixes #2066 (smoogipoo)
  • Fix drag handling in line with framework changes #2064 (peppy)
  • Rewrite editor hitobject selections #2058 (smoogipoo)
  • Restore nunit ruleset + waveform test cases #2034 (smoogipoo)

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

Focus was on fixing some CI issues, such as web requests timing out at the remote end in web tests. Nothing really extraordinary here.

Other Changes

  • Fix Bindable’s GetBoundCopy using MemberwiseClone #1407 (peppy)
  • Remove WebRequest workaround for mono bug which has since been resolved #1406 (peppy)
  • Allow resource managers to accept and return null #1405 (peppy)
  • Revert retry test case changes #1404 (peppy)
  • Avoid test cases failing on directory cleanup exception #1403 (peppy)
  • Add a timeout for thread exiting #1402 (peppy)
  • Allow web request tests to re-run on failure #1401 (peppy)
  • Fix dynamically compiled test cases disappearing from old assembly #1400 (FreezyLemon)
  • Fix elements being out of order in PropertyDisplay #1398 (smoogipoo)
  • Fix backspace not working in some textboxes #1396 (peppy)
  • Fix PropertyDisplay ignoring protected and internal properties #1395 (smoogipoo)
  • Various improvements to textbox input #1394 (smoogipoo)
  • Fix thread race in path segment construction #1392 (smoogipoo)
  • Fix GameThread exits not running on the encapsulated thread #1391 (smoogipoo)
  • Fix regression in frame statistics display thread names #1390 (peppy)
  • Make Path receive input only on the path bounds #1383 (smoogipoo)

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

You may have noticed that we have begun pushing people to try out the new site more recently. There’s now a new prominent banner on every page on the old site which has a newer counterpart, offering you quick access to switch across.

I also upgraded the server running the new site to a more production-ready server. There were previously some slowdowns during peak usage. This should no longer be the case!

Show genre and language and fix styles #2386 (nanaya)

Bigger stat icon and fixed spacings #2381 (nanaya)

These icons are now large enough to actually be recognisable and useful.

Add ‘show more’ for recent activity on user profiles #2379 (nekodex)

Not sure why this wasn’t a thing from the start, but you can now see more than the last six things a user did (up to a month, like the old site).

Less whitespace #2375 (nanaya)

We’ve listened to your feedback and adjusted paddings in multiple areas:

Best performance is more compressed

Beatmap panels on the listing are less tall than before (they will eventually get even shorter, but that’s in a future design iteration)

Don’t include results that didn’t match the username matchers #2373 (notbakaneko)

Searching for users no longer returns results that make you “wtf”. Although… brownpeppy? really?

Increase per-page topics listing #2362 (nanaya)

Forum now shows 30 topics per page, up from 15.

Scoreboard friend/self highlighting #2345 (nekodex)

Discussion navigation history #2270 (nanaya)

Finally you can link people to the exact view you are looking at in beatmap discussions. This includes the filters you have applied, such as difficulty, game mode and resolved status.

Different icon for unread topic #2449 (nanaya)

We added back icons to better differentiate read status of forum topics. The colours we were using were not so colour-blind friendly, it would seem!

Allow setting default playmode in profile page #2448 (nanaya)

You can now see which game mode a user has set as their default, denoted by a star next to it.

You can also change your own default. On the old site, this used to be an implicit action whenever you switched tabs while looking at your own profile, which was confusing to some. Now, you must click the new button to change your own default. Hopefully this should make a bit more sense and avoid confusion.

Recommended difficulty is back, with some huge performance improvements this time around. Converted toggle also available. Woo!

Country flags site-wide now link to country rankings. Eventually we hope to improve the country landing page with more than just rankings, but this’ll do for now.

Profile tooltips #2422 (nekodex)

Explaining what user details actually are.

Add a supporter promo to changelogs #2412 (LiquidPL)

We don’t really advertise supporter in many places, but I like to have a message on the changelogs when users update their osu! builds. If they like something that has been added, they may feel the urge to throw us some bucks.

This was already present on the old site.

Add experience bar to user profiles #2409 (LiquidPL)

Hover the level badge to see your experience bar!

Other Changes