dev changelog 20180213

published 15 Feb 2018

Hello and happy chocolate day. Back at you with updates since the last post, albeit two days delayed from changelog generation. Hopefully my brief commentary is worth the wait!

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

Improvements to EF context handling and BeatmapManager #2054 (peppy)

This was a big refactor of how the beatmap import and databasing process was structured. It was one of the largest thorns in lazer’s otherwise pristine code base, and I finally took the initiative to fix it up before moving on to skin import support.

While there’s nothing to show from this, it fixed a lot of scenarios where imports could result in lost files or incorrect state of beatmaps, while also improving readability of database usage game-wide. It resolved all the problems mentioned in this issue, which has been around since October 2017. Phew.

Fix ApproachRate not inheriting OverallDifficulty when it is undefined #2049 (sunghwan2789)

It turns out that very old beatmaps (before we separated out AR as a difficulty setting) would fallback to their OD setting. This wasn’t correctly being respected, resulting in older maps behaving weirdly. All fixed!

Unify hit windows between all rulesets #2035 (smoogipoo)

Until now, each ruleset had its own definition of hitwindows (which in some cases was completely broken!). We now use a unified implementation, which gives much more predictable results. They are currently based on mania windows, which makes things every so slightly more lenient than on stable. We’ll tweak this as necessary.

Improve the visual appearance of repeat points #1960 (ColdVolcano)

They are now arrows (and snake a lot better). Goodbye eercast logo, you served us well. Note that this is not the final design.

Other Changes

  • Fix drag handling in line with framework changes #2064 (peppy)
  • Add confirmation dialog to Delete in beatmap context menu #2060 (swoolcock)
  • Fade slider ticks with hidden mod #2057 (Aergwyn)
  • Fix pressing escape quickly unexpectedly exiting gameplay #2044 (UselessToucan)
  • Fix a few code styling issues #2042 (smoogipoo)
  • Update user object to match new standardised api #2039 (peppy)
  • Fix non-visual tests not cleaning up previous executions #2038 (peppy)
  • Fix visual settings checkboxes playing sounds in bindable binding #2037 (peppy)
  • Make slider tails not play hitsounds #2036 (smoogipoo)
  • Always put attributes on a separate line to their target #2031 (peppy)
  • Make sure the import tests exit their hosts #2030 (smoogipoo)
  • Use bindable precision for OsuSliderBar’s tooltip value #2029 (smoogipoo)
  • Add support for country rank #2027 (tgi74)
  • Fix revert-to-default hiding visual settings at beatmap load #2026 (swoolcock)
  • Fix skip button not receiving screen-wide input #2023 (peppy)
  • Make NUnit tests run locally again #2021 (smoogipoo)
  • Raw input improvements #2020 (peppy)
  • Stopping non-url text from being hyperlinks #2017 (Imnooby)
  • Update in-line with framework changes #2012 (smoogipoo)

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

Combine drag and click lenience into a single variable #1389 (peppy)

Until now, it was possible to trigger a drag and a click event in the same mouse down/up combination. Now, the leniences for dragging and clicking are combined. This also resolves slider bars being hard to drag in settings (where you’d accidentally trigger a vertical scroll instead).

Debounce config saves #1388 (peppy)

We pushed out a build that completely destroyed performance when dragging slider bars in settings. This fixed it.

Raw input improvements #1371 (peppy)

Tablet support is here! It mostly behaves as it did on stable for the moment, but I do have big plans on improving the way tablets can be configured to make the experience much less painful (and make the wacom control panel area settings obsolete).

Other Changes

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

As I mentioned on twitter, we’re approaching the point where we are going to push the new web live. We’ve received some great feedback since then and are working to apply all the changes necessary to make this as painless of an experience as possible! More updates to follow on that.

Better spoiler arrows #2340 (nanaya)

Spoiler boxes on the forums weirdly pointed up and down.

They now point right then down, as expected.

Add support for wiki page tags #2331 (nanaya)

Wiki articles can now have tags added, which can be used to search for articles by words not necessarily contained by the article (like OWC2017 for “osu! world cup 2017” etc.)

Improve display of time fields in modding discussions #2307 (nanaya)

All time fields on the modding system are now using proper time classes, so you will see them in your local timezone.

Other Changes


dev changelog 20180206

published 06 Feb 2018

Trying to keep these coming once a week is pretty tough, but here we are (only a couple of days late!). Huge appreciation as always to those who contributed this time around.

As a side note: full tablet support is only days away from being deployed live to lazer, so for those of you that have been holding off due to not being able to play with your tablet, make sure to check back soon!

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

Implement Catmull-Rom curve approximator #2003 (smoogipoo)

Everyone’s (least) favourite slider curve type is now supported by lazer. Play through more of the old classic beatmaps that you love so much, without the sliders taking on smooth curved shapes.

Update design of “revert to default” button #2011 (peppy)



Store and show SSPlus and SPlus statistics on user page #2004 (tgi74)

Just like the new site, you can now see hidden/flashlight SS/S counts separate from normal ones

Fix osu!catch never reaching the result screen #1999 (peppy)

You can now complete catch beatmaps. Oops.

Add the ability to duck volume when the game is inactive #1997 (peppy)

While the transitions are not yet as smooth as you’d expect, you now have complete control over how much sound osu! is going to generate when it’s not the active window.

Update taiko hitsounds (courtesey of cYsmix) #1994 (peppy)

cYsmix has done it again, providing a new default sound set that does wonders to give osu!taiko a fresh feel.

Ability to mute the game using F4 (or button on volume control) #1921 (aQaTL)

Simple yet effective. Design is obviously not final (get a preview of that here).

Add URL handling to chat #1667 (FreezyLemon)

This has been in and out of the release builds as I had it manually cherry-picked for releases (felt it was pretty important), but is now here to stay! You can now freely open up web links in chat. In the cases there’s an in-game view for what you are looking at, it’ll prefer that over opening the site. The number of in-game overlays will expand as time goes by.

Implement a gameplay visual settings overlay #1879 (UselessToucan)

You can now adjust settings before entering gameplay (at the “loading” screen). For now a preview is not available, but this will be added in the future.

Other Changes

  • Fix PlayerSettingsOverlay not able to reappear after being hidden #2005 (tgi74)
  • Fix osu!catch autoplay missing bananas when running above 1x playback speed #2001 (peppy)
  • Fix clock not incrementing beyond last frame of replay #2000 (peppy)
  • Fix IsMaskedAway not being up-to-date when fastfowarding replays #1998 (smoogipoo)
  • Make slider tails count towards the slider’s judgement #1993 (smoogipoo)
  • Rename “InputManager” to “Container” where keybindings are involved #1992 (smoogipoo)
  • Update framework #1991 (peppy)
  • Fix incorrect case on migration file #1986 (peppy)
  • Add JetBrains.Annotations NuGet package #1984 (FreezyLemon)
  • Remember mod selection when re-entering song select #1983 (peppy)
  • Fix osu star rating calculation #1981 (thomastanck)
  • Fix taiko and mania missing when fast-forwarding replays #1980 (smoogipoo)
  • Fix slider ticks appearing too late #1977 (Aergwyn)
  • Fixed holding retry hotkey at end of map causing hard crash #1944 (ThePyrotechnic)

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

Code quality, performance and bug fixes. Nothing exceptional to see here!

  • Fix up recent IsMaskedAway regressions #1364 (smoogipoo)
  • Use a concurrent dictionary for custom transforms to avoid incorrect thread access #1361 (peppy)
  • Fix FrameworkActionContainer input ordering #1360 (smoogipoo)
  • Use AlmostEquals for CircularContainer test cases #1358 (peppy)
  • Make better use of generics in DependencyContainer #1356 (jorolf)
  • Add a fill property to CircularProgress #1355 (jorolf)
  • Add JetBrains.Annotations NuGet package #1354 (FreezyLemon)
  • Make sure that IsMaskedAway is always up-to-date #1353 (smoogipoo)
  • Stop ConfigManager from setting a default when calling GetOriginalBindable #1352 (peppy)
  • Make AutoSize transform non-rewindable #1345 (smoogipoo)
  • Store only drawables up to the one that handled mouse down in mouseDownInputQueue #1337 (UselessToucan)

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

Elasticsearch 6 support #2262 (notbakaneko)

With some backend redesign, we were finally able to migrate off an ancient Elasticsearch 1.x instance to the latest version. We still have some improvements to make to the way we are interacting with elasticsearch, but the old site needs to die before this can happen. Needless to say, this is a step in the right direction for improving search quality game-wide.

Add playtime to user profiles #2290 (LiquidPL)

Due to popular request, play time is back on profiles. This time precise to the second!

Beatmap scoreboard revamp #2292 (nekodex)

After reading through all the feedback you guys threw at us regarding leaderboard design, flyte got to work trying to make sure he could please everyone. The design is now implemented and live at the new site and has so far received some very positive feedback. Glad you guys like it!

Other Changes


dev changelog 20180128

published 28 Jan 2018

Another week of solid progress! Hoped to get this post up on Friday but alas, things got busy. As a side-note the new t-shirt designs will be available on the store today, so look out for if you are interested in new wearable swag!

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

Implement ruleset-specific config managers and attach them to the global OnScreenDisplay #1929 (smoogipoo)

Individual rulesets can now have configuration settings (which are stored permanently to the database). The first use-case for this is osu!mania’s scroll speed setting, which is now remembered per key variant!

Add new default hitsounds (thanks to cYsmix) #1975 (peppy)

cYsmix has been hard at work on creating a fresh set of hitsounds to become the lazer defaults. Aiming for a more punchy set which are both nice to the ears but also give instant feedback - something a lot of higher level players require from hitsounds.

Here’s two examples, but I highly recommend you go check your favourite hitsounded beatmaps to see how they sound (and provide feedback if possible!):

Add more human-like catch autoplay support #1952 (peppy)

Overall difficulty #1938 (Shawdooow)

Following variable approach rate, overall difficulty has now been implemented. For the time being, it affects judgement windows.

Other Changes

  • Make MusicController draggable again #1973 (UselessToucan)
  • Make mania play the next note’s sounds if no note is hit #1972 (smoogipoo)
  • Fix settings button #1965 (Aergwyn)
  • Fix storyboard using incorrect path separator #1959 (james58899)
  • Clean up off-by-one offsets from repeat-related properties #1957 (smoogipoo)
  • Allow user choice of the quick retry hotkey #1956 (peppy)
  • Update license year #1955 (fangerm)
  • Fix RepeatPoint animations #1953 (Aergwyn)
  • Use obtained value for displayed name. #1950 (ThePyrotechnic)
  • Disable TestCaseWaveform #1949 (smoogipoo)
  • Don’t show error messages when a download is user-cancelled #1948 (peppy)
  • Keep downloads active until their associated import operation finishes #1947 (peppy)
  • Continue showing progress bar on direct panels when importing #1946 (peppy)
  • Update usage of DI in-line with framework changes #1945 (smoogipoo)
  • Allow re-downloading of beatmaps pending deletion in osu!direct #1939 (Aergwyn)
  • Ensure previews stop playing when they are removed from the draw hierarchy #1937 (peppy)
  • Split the playfield columns and change the key number by mod #1908 (andy840119)
  • Do not assign hudOverlay’s and breakOverlay’s members in Player class #1898 (UselessToucan)

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

Improvements to audio subsytem disposal logic #1340 (peppy)

Allows for better handling of nested audio components, making stopping osu!direct panel tracks (and muting global sound at the same time) much cleaner than previously possible.

Add a way to generate tracked settings from ConfigManager #1339 (smoogipoo)

Allows for the osu! game to more easily extract on-screen display parameters from configuration stores directly.

Other Changes

  • Stop ConfigManager from setting a default when calling GetOriginalBindable #1352 (peppy)
  • Bindable parsing fixes #1351 (smoogipoo)
  • Make ini based config manager its own class #1349 (peppy)
  • Stop bindings from interrupting each other when in unique mode #1344 (ThePyrotechnic)
  • Allow dependency injection caching by specific type #1343 (smoogipoo)
  • Make Tooltip a VisibilityContainer instead of OverlayContainer #1335 (peppy)
  • Fix DllResourceStore not being able to handle hyphens in file path #1327 (FreezyLemon)
  • Allow setting the filtering mode of textures loaded by TextureStore #1292 (jorolf)

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

Nomination tweaks #2276 (nekodex)

Based on bug reports and feedback, we resolved some issues involving the nomination limit. Speaking of which, the daily limit has also been raised from 2 to 10 after it was determined that two is now too low (as “first” nominations are counted where previously only “second” or “qualifying” nominations were counted).

Other Changes


dev changelog 20180120

published 21 Jan 2018

I promised more regular updated, but then the change of the year happened (and the rush to getting a new release of lazer out), but more importantly I ran into some issues with the tooling I made to create these posts.

After a long ordeal today, the tools are back in order and should be good going forward, so I’ll try and keep this coming at least once a week!

Excuse the length this time around; we’ve been busy.

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

A lot of fixes to replay playback #1923 (smoogipoo)

Replays can be dragged into the osu!lazer window again! Also fixes for replays playing unexpectedly at a large offset from their actual time values.

Improve game-wide cursor visualisation handling #1887 (smoogipoo)

The game cursor is now only used when actually targeting the playfield. This means when something like a skip button appears on top of the playfield, the menu cursor becomes visible again. Visually this still needs some tweaks (the playfield cursor trail stops a bit abruptly right now) but it’s a step in the right direciton.

Basic functionality completed for osu!catch

Basic autoplay (not yet humanlike) and completed gameplay have now been implemented! This marks all four game modes as complete. While there’s still much to be done, it’s a matter of tweaking from this point forward rather than reimplementing the rulesets themselves.

Sorry for the bad playing :P

  • Drop fruit when last in combo is not caught #1853 (peppy)
  • Fix catcher width and playfield scaling #1852 (peppy)
  • Improvements to osu!catch visuals #1848 (peppy)
  • Fixes to catching fruit #1889 (peppy)
  • Fix juice streams not propagating accent colours to nested objects #1886 (peppy)
  • Add osu!catch banana showers #1885 (peppy)
  • Add very basic osu!catch replay/autoplay handling #1884 (peppy)

Add setting to adjust background blur level during gameplay #1754 (ColdVolcano)

Pretty self-explanatory! Can be used in combination with background dim.

Add support for approach rate #1824 (Shawdooow)

Finally bringing map-specific difficulty to realisation. Next is overall difficulty, coming soon.

Add “Friends” tab to social browser #1740 (Aergwyn)

Implement osu! hidden mod #1782 (Aergwyn)

Make taiko use taiko-specific hitsounds #1760 (smoogipoo)

Currently using the same taiko-specific sample set as osu-stable. On a slightly related note, keep a look out for a brand new sample set for the default skin hitting later this week (osu! mode, not taiko).

Other Changes

v2018.113.0 (2018-01-12)

  • Remove volume reduction on song preview #1893 (Aergwyn)
  • Fix incorrect online conditional check in social browser logic #1883 (peppy)
  • Fix some mod interface discrepancies #1882 (peppy)
  • Fix background dim not being applied correctly #1881 (james58899)
  • Allow mouse wheel to change volume in overlays #1877 (smoogipoo)
  • Add support for loading storybaords from .osu files #1875 (james58899)
  • Rewrite the way in which HitObjects are scrolled in ScrollingPlayfields #1874 (smoogipoo)
  • Allow rulesets to create their own instantiation info #1873 (peppy)
  • Move mod implementations to individual files #1870 (peppy)
  • Add skip cutscene as “in game” keybinding #1869 (Aergwyn)
  • Minor standard hidden improvements #1865 (Aergwyn)
  • FIx incorrect licence header template #1864 (peppy)
  • Fix TestCaseManiaHitObjects exception on load #1862 (FreezyLemon)
  • Fix Leaderboard loading scores multiple times #1858 (Aergwyn)
  • Update licence headers #1857 (peppy)
  • Fix up replay playback speed slider having a different tooltip than the displayed number #1856 (smoogipoo)
  • Cleanup some possible CI errors #1855 (smoogipoo)
  • Fix storyboard variable parsing #1854 (james58899)
  • Implement osu!mania key mods #1847 (smoogipoo)
  • Cleanup osu!mania’s RulesetContainer and Beatmap conversion process #1845 (smoogipoo)
  • Fix storyboard file paths on Linux/macOS using incorrect path separators #1844 (james58899)
  • Fix slider follow circle instantly disappearing on slider ends #1840 (Aergwyn)
  • Fix TestCasePerformancePoints binding to global beatmap #1837 (peppy)
  • Don’t allow auto to fail #1836 (fangerm)
  • Change icon for audio settings #1832 (peppy)
  • Fix errors on import #1831 (peppy)
  • Check for supporter before displaying leaderboard loading animation #1829 (fangerm)
  • Extend TestCases for HitObjects #1828 (Aergwyn)
  • Fix song select dummy beatmap once and for all #1820 (peppy)
  • Don’t allow randomizer to select invisible maps #1819 (LittleEndu)
  • Create a LargeTextureStore for cached (but not atlased) global textures #1817 (peppy)
  • Permit BeatmapInfoWedge to display Unicode artist and title #1813 (ColdVolcano)
  • Remove search button on toolbar #1812 (peppy)
  • Clearly mark unimplemented mods and make them non-selectable #1811 (peppy)
  • QoL improvements to focused overlays #1807 (peppy)

v2017.1231.0 (2017-12-31)

  • Present results date and time in a more readable order #1816 (Aergwyn)
  • Fix result page from leaderboards not sorting hitcounts correctly #1810 (Aergwyn)
  • Add tooltip to country flags #1808 (Aergwyn)
  • Update framework with breaking flow changes reverted #1806 (smoogipoo)
  • Add Getting Started section to Readme and MonoDevelop IDE for Linux #1804 (Techno-coder)
  • Fix DrawableHitCircle accepting a base OsuHitObject parameter #1801 (smoogipoo)
  • Add tooltip text to supporter icon #1797 (jai-sharma)
  • Fix repeat points not scaling properly #1795 (Aergwyn)
  • Use a non-broken opentk library #1793 (peppy)
  • Use a more suiting (?) icon for import dialog #1789 (peppy)
  • Fix crash from being able to perform selection after entering play mode #1788 (peppy)
  • Fix crash on rapid selection at song select #1787 (FreezyLemon)
  • Select pause buttons only on mouse move #1785 (FreezyLemon)
  • Create a compilation guide #1784 (kiroma)
  • As it turns out, native directory separators are not supported #1780 (peppy)
  • Display the correct mod tooltips in mod selection #1669 (ninjaprawn)

v2017.1228.1 (2017-12-27)

v2017.1228.0 (2017-12-27)

  • Fix notification overlay layout and scheduled tasks being delayed #1777 (peppy)
  • Update opentk #1776 (smoogipoo)
  • Fix progress notifications not creating their completion notification early enough #1775 (peppy)
  • Fix random selection happening more than once on quick imports #1774 (peppy)
  • Fix taiko autoplay hitting drumroll ticks with the rims instead of centres #1773 (smoogipoo)
  • Fix beatmap wedge appearing with incorrect info on entering song select #1771 (peppy)
  • Fix crash when starting play mode with no beatmap #1770 (peppy)
  • Make TestCasePlayer more usable #1756 (peppy)
  • Add a bindable Enabled flag to NotificationManager #1746 (peppy)
  • Rate limit logged errors displayed as notifications #1745 (peppy)
  • Fix slider repeats playing sample twice #1737 (Shawdooow)

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

Nothing notable this time around, just a whole lot of minor improvements and bug fixes. Not a bad thing!

Other Changes

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

Alongside the changes below, a lot of effort has been going into optimising the site experience from a performance perspective, reducing load times and improving search results.

Paginate beatmap pack list and use the same sort on all types. #2248 (notbakaneko)

A bit of maintenance on the pack listing as the number of available packs continues to increase, including better default sorting, pagination and tidying up old download links to deprecated sites. We’ll be using this page more going forward as we do Mapper’s Guild releases and other special packs!

Add hype and nomination count to beatmapset search results #2203 (nekodex)

You can now sort pending beatmaps by nominations and hype counts to get a deeper insight into the status of beatmaps in the modding stage.

Better linkify for beatmapset discussions #2196 (nekodex)

Linking between issues in modding discussions is now supported, and will display in a more compact form.

You can now click the permalink link to copy to clipboard automatically.

Increase beatmapset discussion post character limit #2192 (nanaya)

Due to popular demand, we’ve increased the character limit per discussion post to 750 (previously 500).

Reduce menu delay and auto resize menu #2122 (notbakaneko)

The global menu should now behave a bit nicer. We know it can still feel a bit hidden and awkward, but are going to be addressing this in a larger design change coming later on. For now it should be a touch more usable.

As the number of localisations contributed continues to expand, the global menu was getting very tall. It now automatically resized based on the current displayed selection.

Add fancier tooltips in beatmap listing #2120 (LiquidPL)

Get difficulty star ratings on hover.

Allow beatmap discussions sorting by post or updated time #2113 (notbakaneko)

Another requested feature for the modding system.

Show correct star difficulty for converted beatmaps #2063 (notbakaneko)

Pretty self-explanatory, but star difficulty now shows correctly on the beatmap info pages.

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

Just one extra automation to make life easier for beatmap nominators. Now, all pending issues are required to be resolved before further action can be taken, avoiding the need for manual checks and potential human error.

Limit loaded forum posts to 250 #2056 (nanaya)

To avoid huge memory consumption, posts are now unloaded when scrolling continuously in very long forum threads.

Other Changes


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!.