├── settings.yaml ├── go.mod ├── web ├── assets │ └── caret.svg ├── scripts │ └── main.js ├── css │ ├── main.css.map │ ├── main.scss │ └── main.css └── html │ └── index.html ├── go.sum ├── README.md └── server.go /settings.yaml: -------------------------------------------------------------------------------- 1 | testing: "true" 2 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module achi.osutools 2 | 3 | go 1.16 4 | 5 | require gopkg.in/yaml.v2 v2.4.0 6 | -------------------------------------------------------------------------------- /web/assets/caret.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 2 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 3 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 4 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 5 | -------------------------------------------------------------------------------- /web/scripts/main.js: -------------------------------------------------------------------------------- 1 | var acc = document.getElementsByClassName("accordion"); 2 | var i; 3 | 4 | for (i = 0; i < acc.length; i++) { 5 | acc[i].addEventListener("click", function() { 6 | this.classList.toggle("active"); 7 | var panel = this.nextElementSibling; 8 | if (panel.style.maxHeight) { 9 | panel.style.maxHeight = null; 10 | } else { 11 | panel.style.maxHeight = panel.scrollHeight + "px"; 12 | } 13 | }); 14 | } 15 | 16 | function req(username) { 17 | const xhr = new XMLHttpRequest(); 18 | const url = `https://api.github.com/users/${username}/repos`; 19 | 20 | xhr.open('GET', url, true); 21 | 22 | xhr.onload = function() { 23 | const data = JSON.parse(this.response); 24 | 25 | for (i = 0; i < data.length; i++) { 26 | if (data[i].name == "osutools") { 27 | document.getElementById("lastModified").innerHTML = "Last modified: " + data[i].updated_at.slice(0, 10) + " at " + data[i].updated_at.slice(11, 19) + " UTC"; 28 | } 29 | } 30 | } 31 | xhr.send(); 32 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # https://www.osutools.com 2 | 3 | ## A static site attempting to maintain a list of all 3rd party resources commonly used alongside osu! 4 | 5 |
6 | 7 | # How to add items 8 | 9 | Please make a pull request for any additional resources that should be added to the site. I want things to stay pretty basic for this, so just make changes to the html page for now. 10 | 11 | If you aren't git-savy, feel free to request an item in my discord server or directly to me ponpar#0001. 12 | 13 |
14 | 15 | # What am I looking for? 16 | 17 | Anything that isn't created by peppy, or is not available through the main osu site. Things like skins, beatmaps, or tournaments, are not intended for this list. 18 | 19 |
20 | 21 | # How do I test my addition? 22 | 23 | - Download and install golang 24 | - Clone the repository locally 25 | - Run the server using `go run server.go` 26 | - Navigate to `localhost:3000` in your browser 27 | - To set up SASS functionality, run `sass --watch .\web\sass\:.\web\css` (must have [sass](https://sass-lang.com/install) installed) 28 | -------------------------------------------------------------------------------- /server.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "io/ioutil" 5 | "log" 6 | "net/http" 7 | 8 | "gopkg.in/yaml.v2" 9 | ) 10 | 11 | type Settings struct { 12 | Testing string `yaml:"testing"` 13 | } 14 | 15 | func main() { 16 | var settings Settings 17 | settings.getSettings() 18 | 19 | // Handler points to available directories 20 | http.Handle("/web/html", http.StripPrefix("/web/html", http.FileServer(http.Dir("web/html")))) 21 | http.Handle("/web/scripts/", http.StripPrefix("/web/scripts/", http.FileServer(http.Dir("web/scripts")))) 22 | http.Handle("/web/css/", http.StripPrefix("/web/css/", http.FileServer(http.Dir("web/css")))) 23 | http.Handle("/web/assets/", http.StripPrefix("/web/assets/", http.FileServer(http.Dir("web/assets")))) 24 | http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 25 | if r.URL.Path[1:] == "" { 26 | http.ServeFile(w, r, "web/html/index.html") 27 | } 28 | }) 29 | 30 | //Serves local webpage for testing 31 | if settings.Testing == "true" { 32 | errhttp := http.ListenAndServe("localhost:3000", nil) 33 | if errhttp != nil { 34 | log.Fatal("Web server (HTTP): ", errhttp) 35 | } 36 | } else { 37 | //Serves the webpage to the internet 38 | errhttps := http.ListenAndServeTLS(":443", "certs/cert.pem", "certs/key.pem", nil) 39 | if errhttps != nil { 40 | log.Fatal("Web server (HTTPS): ", errhttps) 41 | } 42 | } 43 | 44 | } 45 | 46 | func (c *Settings) getSettings() *Settings { 47 | 48 | yamlFile, err := ioutil.ReadFile("settings.yaml") 49 | if err != nil { 50 | log.Printf("yamlFile.Get err #%v ", err) 51 | } 52 | err = yaml.Unmarshal(yamlFile, c) 53 | if err != nil { 54 | log.Fatalf("Unmarshal: %v", err) 55 | } 56 | 57 | return c 58 | } 59 | -------------------------------------------------------------------------------- /web/css/main.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "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", 4 | "sources": [ 5 | "main.scss" 6 | ], 7 | "names": [], 8 | "file": "main.css" 9 | } -------------------------------------------------------------------------------- /web/css/main.scss: -------------------------------------------------------------------------------- 1 | $primary: #907fa4; 2 | $secondary: #a58faa; 3 | $tertiary: #ededd0; 4 | $highlight: #a6d6d6; 5 | 6 | $macro-whitespace: 15%; 7 | 8 | @mixin container-inner-shadow($round: false) { 9 | background-color: $tertiary; 10 | color: $primary; 11 | box-shadow: inset 0px 0px 20px $secondary; 12 | 13 | @if $round { 14 | border-radius: 50px; 15 | } 16 | } 17 | p { 18 | font-size: 1.5rem; 19 | } 20 | 21 | a { 22 | color: $secondary; 23 | } 24 | 25 | .navbar-title { 26 | font-size: 3rem; 27 | 28 | padding-left: 2rem; 29 | text-align: center; 30 | } 31 | 32 | .navbar { 33 | position: sticky; 34 | z-index: 10; 35 | 36 | width: 100%; 37 | height: 5rem; 38 | top: 0; 39 | 40 | display: flex; 41 | align-items: center; 42 | 43 | background-color: $primary; 44 | color: $tertiary; 45 | } 46 | 47 | body { 48 | font-family: "Rubik", Arial, Helvetica, sans-serif; 49 | 50 | font-weight: 400; 51 | margin: 0; 52 | } 53 | 54 | .body { 55 | display: flex; 56 | flex-direction: column; 57 | 58 | height: 100%; 59 | background-color: $secondary; 60 | } 61 | 62 | .section { 63 | display: flex; 64 | flex-direction: column; 65 | 66 | margin-bottom: 2rem; 67 | padding: 0 $macro-whitespace; 68 | 69 | text-align: center; 70 | justify-content: center; 71 | 72 | @include container-inner-shadow(); 73 | } 74 | 75 | .list { 76 | display: flex; 77 | flex-direction: column; 78 | align-items: flex-start; 79 | 80 | padding: 0 $macro-whitespace; 81 | } 82 | 83 | .accordion { 84 | @include container-inner-shadow(true); 85 | display: flex; 86 | justify-content: space-between; 87 | align-items: center; 88 | position: relative; 89 | cursor: pointer; 90 | 91 | width: 100%; 92 | padding: 1rem 2rem; 93 | margin-bottom: 0.5rem; 94 | 95 | font: inherit; 96 | font-size: 3rem; 97 | border: none; 98 | 99 | transition: color 0.3s; 100 | 101 | .caret { 102 | transition: all 0.5s; 103 | width: 4rem; 104 | height: 4rem; 105 | 106 | mask: url(../assets/caret.svg) no-repeat 50% 50%; 107 | mask-size: cover; 108 | 109 | background-color: $primary; 110 | } 111 | } 112 | 113 | .active, 114 | .accordion:hover { 115 | font-weight: bold; 116 | color: $secondary; 117 | } 118 | 119 | .active .caret { 120 | transform: rotate(180deg); 121 | background-color: $highlight; 122 | } 123 | 124 | .panel { 125 | @include container-inner-shadow(true); 126 | width: 100%; 127 | padding: 0 2rem; 128 | margin-bottom: 0.5rem; 129 | box-sizing: border-box; 130 | 131 | max-height: 0; 132 | overflow: hidden; 133 | transition: max-height 0.2s ease-out; 134 | 135 | li { 136 | font-size: 1.75rem; 137 | 138 | p { 139 | margin-top: 0.3rem; 140 | } 141 | code { 142 | font-size: 1rem; 143 | } 144 | a { 145 | font-weight: bold; 146 | } 147 | } 148 | } 149 | 150 | footer { 151 | background-color: $primary; 152 | color: $tertiary; 153 | 154 | padding: 1rem; 155 | 156 | p { 157 | margin: 0; 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /web/css/main.css: -------------------------------------------------------------------------------- 1 | p { 2 | font-size: 1.5rem; 3 | } 4 | 5 | a { 6 | color: #a58faa; 7 | } 8 | 9 | .navbar-title { 10 | font-size: 3rem; 11 | padding-left: 2rem; 12 | text-align: center; 13 | } 14 | 15 | .navbar { 16 | position: -webkit-sticky; 17 | position: sticky; 18 | z-index: 10; 19 | width: 100%; 20 | height: 5rem; 21 | top: 0; 22 | display: -webkit-box; 23 | display: -ms-flexbox; 24 | display: flex; 25 | -webkit-box-align: center; 26 | -ms-flex-align: center; 27 | align-items: center; 28 | background-color: #907fa4; 29 | color: #ededd0; 30 | } 31 | 32 | body { 33 | font-family: "Rubik", Arial, Helvetica, sans-serif; 34 | font-weight: 400; 35 | margin: 0; 36 | } 37 | 38 | .body { 39 | display: -webkit-box; 40 | display: -ms-flexbox; 41 | display: flex; 42 | -webkit-box-orient: vertical; 43 | -webkit-box-direction: normal; 44 | -ms-flex-direction: column; 45 | flex-direction: column; 46 | height: 100%; 47 | background-color: #a58faa; 48 | } 49 | 50 | .section { 51 | display: -webkit-box; 52 | display: -ms-flexbox; 53 | display: flex; 54 | -webkit-box-orient: vertical; 55 | -webkit-box-direction: normal; 56 | -ms-flex-direction: column; 57 | flex-direction: column; 58 | margin-bottom: 2rem; 59 | padding: 0 15%; 60 | text-align: center; 61 | -webkit-box-pack: center; 62 | -ms-flex-pack: center; 63 | justify-content: center; 64 | background-color: #ededd0; 65 | color: #907fa4; 66 | -webkit-box-shadow: inset 0px 0px 20px #a58faa; 67 | box-shadow: inset 0px 0px 20px #a58faa; 68 | } 69 | 70 | .list { 71 | display: -webkit-box; 72 | display: -ms-flexbox; 73 | display: flex; 74 | -webkit-box-orient: vertical; 75 | -webkit-box-direction: normal; 76 | -ms-flex-direction: column; 77 | flex-direction: column; 78 | -webkit-box-align: start; 79 | -ms-flex-align: start; 80 | align-items: flex-start; 81 | padding: 0 15%; 82 | } 83 | 84 | .accordion { 85 | background-color: #ededd0; 86 | color: #907fa4; 87 | -webkit-box-shadow: inset 0px 0px 20px #a58faa; 88 | box-shadow: inset 0px 0px 20px #a58faa; 89 | border-radius: 50px; 90 | display: -webkit-box; 91 | display: -ms-flexbox; 92 | display: flex; 93 | -webkit-box-pack: justify; 94 | -ms-flex-pack: justify; 95 | justify-content: space-between; 96 | -webkit-box-align: center; 97 | -ms-flex-align: center; 98 | align-items: center; 99 | position: relative; 100 | cursor: pointer; 101 | width: 100%; 102 | padding: 1rem 2rem; 103 | margin-bottom: 0.5rem; 104 | font: inherit; 105 | font-size: 3rem; 106 | border: none; 107 | -webkit-transition: color 0.3s; 108 | transition: color 0.3s; 109 | } 110 | 111 | .accordion .caret { 112 | -webkit-transition: all 0.5s; 113 | transition: all 0.5s; 114 | width: 4rem; 115 | height: 4rem; 116 | -webkit-mask: url(../assets/caret.svg) no-repeat 50% 50%; 117 | mask: url(../assets/caret.svg) no-repeat 50% 50%; 118 | -webkit-mask-size: cover; 119 | mask-size: cover; 120 | background-color: #907fa4; 121 | } 122 | 123 | .active, 124 | .accordion:hover { 125 | font-weight: bold; 126 | color: #a58faa; 127 | } 128 | 129 | .active .caret { 130 | -webkit-transform: rotate(180deg); 131 | transform: rotate(180deg); 132 | background-color: #a6d6d6; 133 | } 134 | 135 | .panel { 136 | background-color: #ededd0; 137 | color: #907fa4; 138 | -webkit-box-shadow: inset 0px 0px 20px #a58faa; 139 | box-shadow: inset 0px 0px 20px #a58faa; 140 | border-radius: 50px; 141 | width: 100%; 142 | padding: 0 2rem; 143 | margin-bottom: 0.5rem; 144 | -webkit-box-sizing: border-box; 145 | box-sizing: border-box; 146 | max-height: 0; 147 | overflow: hidden; 148 | -webkit-transition: max-height 0.2s ease-out; 149 | transition: max-height 0.2s ease-out; 150 | } 151 | 152 | .panel li { 153 | font-size: 1.75rem; 154 | } 155 | 156 | .panel li p { 157 | margin-top: 0.3rem; 158 | } 159 | 160 | .panel li code { 161 | font-size: 1rem; 162 | } 163 | 164 | .panel li a { 165 | font-weight: bold; 166 | } 167 | 168 | footer { 169 | background-color: #907fa4; 170 | color: #ededd0; 171 | padding: 1rem; 172 | } 173 | 174 | footer p { 175 | margin: 0; 176 | } 177 | /*# sourceMappingURL=main.css.map */ -------------------------------------------------------------------------------- /web/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | osu!tools resource list 9 |
10 | 11 | 12 | osu!stats 13 | 14 | 15 | 16 | 17 |
18 |
19 |

20 | This is a list of 3rd party tools related to the rhythm game 21 | osu! 22 |

23 |

24 | If you would like your work added to the list, please make a pull request at 25 | the github repository. 26 |

27 |

28 | Not familiar with github? Join 29 | my development discord and make a 30 | feature request. 31 |

32 |
33 |
34 | 38 |
39 |

40 | Disclaimer: The new version of the API (V2) is still under development by 41 | peppy. Apps using V2 wrappers are subject to breaking if peppy makes a 42 | change. 43 |

44 |
    45 |
  • 46 | Python3 API 47 | https://github.com/circleguard/ossapi 48 |

    Support for both V1 and V2 of the API.

    49 | Python3 API 50 | https://github.com/Sheepposu/osu.py 51 |

    Designed specifically for V2 of the API.

    52 |
  • 53 |
  • 54 | C# API 55 | https://github.com/Kiritsu/OsuSharp 56 |

    Support for V1 only, V2 is WIP.

    57 |
  • 58 |
  • 59 | golang API 60 | https://github.com/thehowl/go-osuapi 61 |

    Support for V1 only.

    62 |
  • 63 |
  • 64 | node.js API 65 | https://github.com/nicholastay/nodesu 66 |

    Support for V1 only.

    67 |
  • 68 |
69 |
70 | 74 |
75 |
    76 |
  • 77 | OsuCollectionGenerator 79 | https://github.com/LuzianU/OsuCollectionGenerator 80 |

    Allows for easy creation of collections.

    81 |
  • 82 |
  • 83 | CollectionManager 84 | https://github.com/Piotrekol/CollectionManager 85 |

    Tool used for sharing collections in osu!.

    86 |
  • 87 |
  • 88 | Collection Exporter 89 | https://jaasonw.github.io/osu-collection-exporter/ 90 |

    Web app that exports collections to a list of copy pasteable links.

    91 |
  • 92 |
93 |
94 | 98 |
99 |
    100 |
  • 101 | USA State Leaderboard 102 | https://states.osutools.com 103 |

    A self-maintined leaderboard for all 50 states.

    104 |
  • 105 |
  • 106 | Custom Leaderboards 107 | https://osuchan.syrin.me/ 108 |

    Leaderboards for many different skillsets or groups of people.

    109 |
  • 110 |
  • 111 | Country 112 | Snipe Leaderboard 113 | https://snipe.huismetbenen.nl/rankings/ca/osu/weighted-pp 114 |

    Shows how many #1's players have on country leaderboards.

    115 |
  • 116 |
  • 117 | osu! Achievements / Medals Discussion 118 | https://osekai.net/medals/ 119 |

    120 | Provides information on achievements and how to earn them as well as 121 | sorting for unachieved medals using osu! login. 122 |

    123 |
  • 124 |
  • 125 | osu!track Daily 126 | Challenge Leaderboard + Stats 127 | https://ameobea.me/osutrack/daily-challenge/ 128 |

    Personal and global stats for the Lazer daily challenge

    129 |
  • 130 |
131 |
132 | 136 |
137 |
    138 |
  • 139 | Open Tablet 140 | Driver 141 | https://github.com/OpenTabletDriver/OpenTabletDriver 142 |

    143 | Cross platform tablet drivers with no admin access required, peppy 144 | has implemented a version of this into lazer. 145 |

    146 |

    MAINTAINED AND WORKING

    147 |
  • 148 |
  • 149 | Hawku 150 | https://github.com/hawku/TabletDriver 151 |

    152 | The "original" tablet driver. Unmaintained, but still very popular 153 | and stable. 154 |

    155 |

    CURRENTLY BROKEN

    156 |
  • 157 |
  • 158 | Devocub 159 | https://github.com/Devocub/TabletDriver 160 |

    Fork of the Hawku drivers with some added features.

    161 |

    CURRENTLY BROKEN

    162 |
  • 163 |
164 |
165 | 169 |
170 | 196 |
197 | 201 |
202 |
    203 |
  • 204 | Mapping-Tools by Olibomby and 205 | Potoofu 206 | https://mappingtools.github.io/ 207 |

    208 | Program used for advanced slider creation, hitsounding, timing, 209 | among other helpful tools. 210 |

    211 |
  • 212 |
  • 213 | MapsetVerifier 214 | https://github.com/Naxesss/MapsetVerifier 215 |

    216 | Tests for quantifiable issues in beatmapsets, such as unsnapped 217 | objects and unused files. 218 |

    219 |
  • 220 |
  • 221 | SliderStudio 222 | https://slider.little.moe/ 223 |

    Online tool used for advanced slider creation.

    224 |
  • 225 |
  • 226 | osuCollabTool 227 | https://github.com/Himada4/OsuCollabToolFinal 228 |

    229 | Program that can merge and compare .osu files, among other things. 230 |

    231 |
  • 232 |
  • 233 | storybrew 234 | https://github.com/Damnae/storybrew 235 |

    Storyboard editor with robust features.

    236 |
  • 237 |
238 |
239 | 243 |
244 |
    245 |
  • 246 | Matchmaking 247 | https://oma.hwc.hr/how-to-play 248 |

    1v1 and 2v2 matchmaking system.

    249 |
  • 250 |
  • 251 | osu-ahr 252 | https://github.com/Meowhal/osu-ahr 253 |

    Creates and hosts auto-rotate lobbies.

    254 |
  • 255 |
256 |
257 | 261 |
262 |
    263 |
  • 264 | osu!tracker 265 | https://osutracker.com/ 266 |

    267 | Tracks player data, has some unique statistical breakdowns including 268 | a global pp value. 269 |

    270 |
  • 271 |
  • 272 | osu!stats 273 | https://osustats.ppy.sh/ 274 |

    275 | A stats website that shows top plays for individual days. Hosted by 276 | peppy. 277 |

    278 |
  • 279 |
  • 280 | osu!skills 281 | http://osuskills.com 282 |

    283 | Shows which skills you are better or worse at compared to your 284 | peers. 285 |

    286 |
  • 287 |
  • 288 | osu!track 289 | https://ameobea.me/osutrack/ 290 |

    Well organized tracking / breakdown of user profiles.

    291 |
  • 292 |
  • 293 | osekai 294 | https://osekai.net/ 295 |

    296 | Resource used for custom leaderboards and information on achievements/medals. 297 |

    298 |
  • 299 |
  • 300 | osu!daily 301 | https://osudaily.net/ 302 |

    Profile stat tracker with robust user history.

    303 |
  • 304 |
  • 305 | osu!stats 306 | https://osustats.click/ 307 |

    In depth user profile with built in pp calculators.

    308 |
  • 309 |
  • 310 | lookatmysco.re 311 | https://lookatmysco.re/ 312 |

    Clean scorepost sharing without unnecessary details.

    313 |
  • 314 |
315 |
316 | 320 |
321 |
    322 |
  • 323 | gosumemory 324 | https://github.com/l3lackShark/gosumemory 325 |

    Memory reader written in golang, incredibly customizable.

    326 |
  • 327 |
  • 328 | Stream Companion 329 | https://github.com/Piotrekol/StreamCompanion 330 |

    331 | Program directed towards osu! streamers, with functions such as map 332 | information and key counter. 333 |

    334 |
  • 335 |
  • 336 | Real 337 | Time PP Display 338 | https://awesomeopensource.com/project/OsuSync/RealTimePPDisplayer 339 |

    Calculates osu! game data in realtime.

    340 |
  • 341 |
  • 342 | .osr to mp4 Converter 343 | https://github.com/uyitroa/osr2mp4-app/ 344 |

    Converts replay files to video.

    345 |

    Outdated and not maintained, danser has effectively replaced this program.

    346 |
  • 347 |
  • 348 | danser-go 349 | https://github.com/Wieku/danser-go 350 |

    High fps video creation tool for osu! replays.

    351 |
  • 352 |
  • 353 | o!rdr 354 | https://ordr.issou.best/ 355 |

    Online tool used to create renders of osu! replays.

    356 |
  • 357 |
358 |
359 | 363 |
364 |
    365 |
  • 366 | ezpp! 367 | https://github.com/oamaok/ezpp 368 |

    Calculate pp in your browser. Support for Chrome and Firefox.

    369 |
  • 370 |
  • 371 | osuplus 372 | https://osu.ppy.sh/community/forums/topics/408541 373 |

    374 | Additional stats for the osu website. Supports Chrome, Firefox and 375 | Opera. 376 |

    377 |
  • 378 |
  • 379 | pp calculator 380 | https://osu.ppy.sh/community/forums/topics/1504072 381 |

    Up to date pp calculator extension. Support for Firefox and Chromium-based browsers.

    382 |
  • 383 |
384 |
385 | 389 |
390 |
    391 |
  • 392 | osu! cleaner 393 | https://github.com/henntix/osu-cleaner 394 |

    Helps clean up your game if you have a lot of maps.

    395 |
  • 396 |
  • 397 | FunOrange osu! Trainer 398 | https://github.com/FunOrange/osu-trainer 399 |

    400 | A standalone program designed to create custom settings for existing 401 | maps in the osu client. 402 |

    403 |
  • 404 |
  • 405 | osu-pps 406 | https://osu-pps.com/ 407 |

    Resource used to find the most overweighted maps in osu!.

    408 |
  • 409 |
  • 410 | osu!helper 411 | https://github.com/Tyrrrz/OsuHelper 412 |

    Helps find new maps for you based on your top plays.

    413 |
  • 414 |
  • 415 | osuskinner 416 | https://osuskinner.com/ 417 |

    Online tool for skin mixing and creation.

    418 |
  • 419 |
  • 420 | Circleguard 421 | https://github.com/circleguard 422 |

    423 | A collection of tools to aid in the detection and review of 424 | cheaters. 425 |

    426 |
  • 427 |
  • 428 | REAL - REduce Audio Latency 429 | https://github.com/miniant-git/REAL 430 |

    A program to reduce audio latency in Windows 10.

    431 |

    432 | Unmaintained and may disable a CPU thread (can be fixed by 433 | restarting computer) 434 |

    435 |
  • 436 |
  • 437 | osr2mp4 438 | https://github.com/uyitroa/osr2mp4-app 439 |

    A program to convert a replay file into an mp4 file.

    440 |
  • 441 |
  • 442 | Rewind 443 | https://github.com/abstrakt8/rewind 444 |

    A beatmap/replay analyzer that is currently in development.

    445 |
  • 446 |
  • 447 | beatmap_reader 448 | https://github.com/sheepposu/beatmap_reader 449 |

    450 | A Python library for reading beatmap files. Aims to implement lots of beatmap utility. 451 | Some notable utility already implemented in built-in slider curve calculation. 452 |

    453 |
  • 454 |
  • 455 | osu! Beatmap Atlas 456 | https://osu-atlas.ameo.dev/ 457 |

    458 | An interactive visualization of osu! beatmaps that places similar beatmaps close to 459 | each other in space. 460 |

    461 |
  • 462 |
463 |
464 |
465 |
466 |
467 |
468 | 469 | 470 | 471 | 472 | 475 | 476 | 477 | --------------------------------------------------------------------------------