Repository navigation
Releases: ptrchain/osu-echo
Release list
osu!echo 1.0.6
osu-echo v1.0.6
Highlights & Improvements
-
Redesigned Setup Experience (Quick vs. Advanced):
- First-time launch and the
--setupwizard now feature an intuitive mode selector:- [1] Quick Setup (Recommended): Auto-detects your osu! installation, guides you through essential API keys, installs & trusts the local HTTPS certificate, and applies recommended defaults with instant Enter acceptance.
- [2] Advanced Setup: Gives power users complete control over custom folder paths (Songs, Replays, Screenshots), server bind IP and port, essential API keys, leaderboard scoring mode (Score vs. PP), profile country flags, and Bancho account sync.
- Added
-s/--setupand--reconfigurecommand-line flags to easily re-run the wizard at any time.
- First-time launch and the
-
Discord Webhook Score Integration:
- Automatically posts submitted scores and personal bests directly to your Discord server via webhooks.
- Features Discord Rich Embeds with grade-themed embed colors (Platinum/Gold SS & S, Green A, Blue B, Orange C, Red D), player profile details, beatmap information, star difficulty, score, combo, accuracy, and PP.
- Configurable via
DISCORD_WEBHOOK_URLin.env, with an optionalDISCORD_WEBHOOK_MIN_PPthreshold to filter announcements by minimum PP.
-
In-Game Score Management (
!clearscores/!clearmap):- Added the
!clearscorescommand (aliases:!clearmap,!removescores,!deletescores,!clearscore,!removemap,!clear) via BanchoBot. - Allows players to wipe their stored scores on the currently selected map or active
/npbeatmap. - Automatically recalculates profile PP, weighted overall accuracy, and total stats, immediately broadcasting a live HUD update packet (
ChoUserStats) to the client.
- Added the
-
Client Submission Hang Fix on Failed Plays:
- Fixed an issue where the osu! client remained stuck indefinitely on "Submitting score..." after failing a song.
- The server now constructs and returns valid beatmap and overall ranking charts, smoothly concluding the client's submission sequence.
- Unpassed plays correctly increment profile play count and update user stats without polluting ranked leaderboards or triggering popup notifications.
-
Minimal Default Logging & Shift-Startup Debug Mode:
- Cleaned up default console output for a sleek, minimal, high-performance terminal experience without log spam.
- Added the
-d/--debugCLI flag to enable verbose packet and route debugging on demand. - Implemented automatic Shift-key detection on Windows: simply hold Shift when launching
osu-echo.exeto boot straight into debug mode.
-
Hardened Beatmap Ranking & Diff Selection Safeguards:
- Resolved an issue where status commands (
!rank,!love,!unrank) or/npdifficulty switching could accidentally mutate canonical beatmap sets or cause custom/practice diffs to inherit parent IDs. - Strict MD5 verification now ensures cloned or edited difficulties remain completely isolated.
- Resolved an issue where status commands (
-
Magenta ASCII Logo & Smart Screen Clearing:
- The setup wizard now features a branded magenta ASCII logo on every step with smart console clearing (
cls/ ANSI purge) for a clutter-free terminal experience. - Added natural pauses after local certificate generation and hosts configuration so results can be inspected before continuing.
- The setup wizard now features a branded magenta ASCII logo on every step with smart console clearing (
-
Essential API Keys & Critical Consequence Warning:
- Reclassified osu! Legacy v1 API and osudaily API keys as essential for authentic Bancho functionality (online beatmap leaderboards, global score comparisons, and real-time PP rank calculation).
- Added clear step-by-step guidance on how to obtain keys directly within the wizard, accompanied by a prominent warning banner explaining gameplay consequences if omitted.
-
Privacy & Local Storage Transparency:
- Added explicit privacy notices throughout the wizard,
.env.example, and documentation confirming that all API keys, usernames, and passwords (stored as one-way MD5 hashes) remain strictly local on your machine and are never transmitted to third-party servers.
- Added explicit privacy notices throughout the wizard,
osu!echo 1.0.5
osu-echo v1.0.5
Highlights & Improvements
-
Official Weighted Overall Accuracy:
- Implemented the official osu! exponential decay weighting formula (
$\sum \text{acc}_i \cdot 0.95^i / \sum 0.95^i$ ) across all top scores on a player's profile. - Overall accuracy is now computed in tandem with total weighted PP in a single sorted pass, replacing the unweighted arithmetic mean and properly rewarding high-accuracy top plays.
- Updated the in-game
!recalculate(and!recalc) BanchoBot summary report to explicitly format and display weighted accuracy alongside total PP (PP: Xpp | Acc: Y.YY%).
- Implemented the official osu! exponential decay weighting formula (
-
Hardened Beatmap Isolation & Stolen ID Defense:
- Added strict canonical hash validation for score submissions: if a submitted beatmap references an official
beatmap_id, its file hash is verified against the canonical ranked database entry. - Mismatched diffs (e.g. locally modified or rate-changed
.osufiles that retain the original map'sBeatmapIDheader) are instantly stripped of online IDs (beatmap_id: 0) and unranked, preventing custom or practice plays from scoring on official leaderboards or distorting profile stats. - Expanded heuristic detection during local
.osuparsing to detect rate edits (e.g.1.1x,1.2x,0.85x), practice diffs (prac), cuts, buffs, and nerfs, unconditionally preventing cloned diffs from inheriting parent IDs upon import.
- Added strict canonical hash validation for score submissions: if a submitted beatmap references an official
-
Score Submission Deadlock Resolution:
- Resolved an asynchronous self-deadlock in native score submission (
process_native_submission) occurring when a submitted replay's player name does not match the logged-in player (e.g. watching external replays or multi-profile setups). - Explicitly drops active state read locks before acquiring write locks for client notification queueing, ensuring the server stays completely responsive.
- Resolved an asynchronous self-deadlock in native score submission (
-
Seamless Database Migration & Self-Healing (No Reset Required):
- Users do not need to wipe or start with a fresh database.
- Startup migration automatically sanitizes legacy SQLite databases: any corrupt custom, rate, or practice diffs that previously borrowed or collided with official IDs are demoted (
beatmap_id: 0,approved: 0). - Running
!recalculatein-game immediately re-indexes profile stats using the new weighted accuracy engine without losing play history, local scores, or configurations.
-
Simulated Bancho Restriction (
!restrictself/!unrestrict):- Added a playful
!restrictself [reason]command (alias!restrict) that accurately mimics an official osu! server ban / account restriction. - Pops the official in-game yellow toast notification banner: "Your account is currently in restricted mode! Please visit the osu! website for more information."
- Automatically sends the authentic BanchoBot direct message (with optional custom reason), revokes Bancho privileges, wipes in-game rank (
#0) and PP in the client panel, disables public channel chatting, and returnserror: banon score submissions. - Accurately mirrors official Bancho behavior by preserving the player's personal best banner in song select, allowing restricted players to still view their own best records locally.
- Running
!restrictselfagain (or!unrestrict/!unrestrictself/!restrictself off) seamlessly lifts the restriction, restores privileges, recalculates profile stats, and pushes an unban welcome notification.
- Added a playful
-
Non-Blocking Leaderboard & Replay Network Concurrency:
- Eliminated global
AppStatelock contention during official Bancho score lookups and.osrreplay streaming. - HTTP requests to official servers are now executed asynchronously without holding global read or write locks, ensuring packet routing, chat, and concurrent client requests remain silky smooth even under slow network conditions.
- Eliminated global
-
Instant Pre-Login Song Select Responsiveness:
- Optimized the pre-login leaderboard wait loop, reducing polling intervals from 100ms down to 15ms with a tighter bounded timeout.
- Completely eliminates client UI lag and audio micro-stutters when entering song select immediately upon launching osu! before the login handshake finishes.
-
Personal Best Banner PP Isolation:
- Fixed a score formatting bug where
show_pp_for_personal_best = truewould inadvertently format PP into all leaderboard list entries even whenpp_leaderboard = false. - PP values are now strictly isolated to the personal best banner, keeping the main leaderboard list in pure raw score mode as configured.
- Fixed a score formatting bug where
osu!echo 1.0.4
osu-echo v1.0.4
Highlights & Improvements
-
In-Game Profile PP Recalculation (
!recalculate/!recalc):- Added the
!recalculate(alias!recalc) BanchoBot chat command, executable in public channels (e.g.#osu) or direct messages. - Recalculates PP and accuracy across all recorded scores using the latest
rosu-ppcalculation engine. - Automatically updates player profile total PP and weighted overall accuracy, syncs global rank via osu!daily if configured, and immediately broadcasts updated stats packets to the client with a detailed summary report.
- Added the
-
Multi-Difficulty Beatmapset Disambiguation & PP Fix (#B0001):
- Fixed a collision bug in local song folder scans where mapsets with multiple difficulties could match the wrong
.osudifficulty file based on title similarity, resulting in incorrect difficulty attributes and distorted PP values. - Implemented strict difficulty bracket matching (
[Version]), MD5 hash verification, and beatmap ID validation. - Adjusted blank beatmap defaults to strictly unranked (
approved: 0), preventing unknown or custom maps from inheriting qualified/ranked status by default. - Cleaned up stale
/npstate caching so browsing unindexed maps no longer carries forward metadata from previous maps. - Special thanks to kaan for reporting!
- Fixed a collision bug in local song folder scans where mapsets with multiple difficulties could match the wrong
-
Fail-Safe Score Submission & Unindexed Map Statusing (#B0003):
- Implemented a multi-tier fallback pipeline for incoming score submissions: if a submitted map hash isn't yet indexed in the database, it resolves the map via API -> local Songs folder scan -> active player state ->
/npstate, preventing lost score submissions. - Resolved an issue where running
!setstatusor!rankedon unindexed local beatmaps failed silently; BanchoBot now parses the local.osufile, stores it in SQLite, and updates its ranked status seamlessly.
- Implemented a multi-tier fallback pipeline for incoming score submissions: if a submitted map hash isn't yet indexed in the database, it resolves the map via API -> local Songs folder scan -> active player state ->
-
Profile Switching Identity Safety & F9 Region Resolution:
- Fixed a profile switching bug where logging into a different account could inherit a stale
pending_login_namecached from previous leaderboard requests. Authoritative login payload bytes now always take precedence. - Properly handled
OsuLogoutpackets to cleanly purge user sessions and active player state upon logout. - Fixed the F9 user panel displaying an unknown/white flag: user country codes are now persisted in SQLite, loaded immediately during the login handshake, and updated via presence broadcasts upon resolution.
- Fixed a profile switching bug where logging into a different account could inherit a stale
osu!echo 1.0.3
osu-echo v1.0.3
Highlights & Performance Improvements
-
Instant Login & Non-Blocking Startup:
- Offloaded external osu! API stat lookups, osu!daily global rank updates, and friend profile syncing into non-blocking background tasks (
tokio::spawn). - The login handshake now immediately serves cached friend presences and profile stats from SQLite, completely eliminating startup freezes, connection buffering, and client timeouts.
- Relocated default avatar downloading (
a.ppy.sh) off the main startup sequence into a non-blocking background task with a 2-second timeout, preventing startup hangs when offline.
- Offloaded external osu! API stat lookups, osu!daily global rank updates, and friend profile syncing into non-blocking background tasks (
-
Instant Leaderboard Loading & In-Memory Caching:
- Added an in-memory TTL cache (
bancho_score_cache) for fetched Bancho leaderboards with automatic expiry cleanup, making map switching in song select load leaderboards instantly without repeated network roundtrips. - Accelerated friend leaderboard requests (
/web/osu-osz2-getscores.php) by fetching official Bancho scores concurrently usingtokio::task::JoinSetinstead of sequentially waiting on each network request. - Resolved pre-login leaderboard stalls by capturing username hints from
us/uparameters (pending_login_name) and serving beatmap metadata immediately even if song select is opened before the login handshake completes.
- Added an in-memory TTL cache (
-
Dynamic Results Screen Map Ranking & Accurate Combo Records:
- Implemented
calculate_map_ranksto accurately computerankBeforeandrankAfteron post-play score submission charts. - Accurately ranks plays against both local database records and online Bancho leaderboards (handling personal best improvements, top 50 positions, and leaving the rank blank when placing outside the top 50 instead of defaulting to
#1). - Fixed an issue where the score chart always displayed a flashing "NEW" combo badge: submission charts now properly track the highest combo achieved across all submitted scores on the beatmap and profile, preventing false "NEW" flags when a higher combo was already achieved in a different play.
- Implemented
-
osu!direct Status Filtering & Pagination:
- Corrected search status query mapping against the Catboy mirror for Ranked/Approved (
r=0,r=7→status=1,2), Pending/WIP (r=2→status=0,-1), Graveyard (r=5→status=-2), and Loved (r=8→status=4). - Direct search responses now report accurate beatmap status codes so in-game status badges (Ranked, Approved, Qualified, Loved, Pending) display correctly in the Direct browser.
- Added pagination support via the
pquery parameter, enabling smooth browsing across multiple pages of search results.
- Corrected search status query mapping against the Catboy mirror for Ranked/Approved (
-
Engine Upgrades, Avatar Caching & Disk Optimization:
- Upgraded performance calculation engine to
rosu-pp4.0.1 (rosu-map0.2.1,rosu-mods0.4.1) and updated Tillerino difficulty attribute lookups to use.od(). - Added local disk caching for downloaded player and friend avatars in
.data/avatars/to eliminate redundant HTTP downloads. - Eliminated redundant full-directory disk scans in song resolution and
/nplookups, preventing micro-stutters when browsing beatmaps.
- Upgraded performance calculation engine to
osu!echo 1.0.2
osu-echo v1.0.2
Highlights & Bug Fixes
-
Friend Sync & Identity Overwrite Fix:
- Resolved an issue where Friend 2's identity and stats could be overwritten by the local player's ID or cause presence loops.
- Automatically purges corrupted friend ID 2 / friend 2 profiles from the database on startup.
- Properly filters out Peppy (ID 2) and the local player ID from friend presence/sync packets.
- Special thanks to appl for reporting!
-
osu!direct Downloads & Preview Media:
- Fixed route precedence bug where in-game map download requests were swallowed by generic web prefixes, resulting in failed 0-byte responses.
- Downloads now stream/proxy
.oszarchives directly from the Catboy mirror (with automatic Nerinyan fallback) with proper archive headers. - Added proxy handlers for beatmap thumbnails (
b.ppy.sh/thumb/), audio previews (b.ppy.sh/preview/), and beatmap card covers (assets.ppy.sh/beatmaps/).
-
Tillerino Diff Matching & Mirror Access:
- Fixed Tillerino defaulting to DISCO★PRINCE by setting client
User-Agent: osu!to bypass Cloudflare 403 blocks on API mirrors. - Fixed Tillerino selecting the top diff (e.g. Master) instead of the diff you are currently viewing (e.g. Hard) via difficulty hint matching.
- Synchronized active beatmap selection in memory when browsing song select leaderboards.
- Fixed local beatmap scanner from falsely matching unindexed
.osufiles.
- Fixed Tillerino defaulting to DISCO★PRINCE by setting client
-
Networking, TLS & Devserver Subdomains:
- Added
b.localhostto self-signed TLS certificates and automatic Windowshostsfile configuration. - Added an automatic loopback port 80 listener for direct client HTTP requests to localhost subdomains.
- Removed
panic=abortin release profile to enable stack unwinding and clean diagnostic traces.
- Added
osu!echo 1.0.1
osu-echo v1.0.1
Patch release fixing connection issues with -devserver localhost on Windows and adding a browser status page.
Changes
- Automatic Windows Hosts Configuration: Automatically adds required localhost subdomains (
osu.localhost,c.localhost,a.localhost,assets.localhost) to the Windows hosts file. If administrator privileges are needed, a standard Windows prompt appears automatically to complete the change. - DNS Cache Refresh: Automatically flushes the Windows DNS cache after updating the hosts file so changes apply immediately without restarting your PC.
- Setup & Trust Cert Integration: The hosts file check is now included when running
osu-echo.exe --trust-certand during initial setup. - Server Status Page: Navigating to
http://127.0.0.1:5000orhttps://localhostin a web browser now shows a status page confirming the server is online instead of returning a 404 error.
How to Update
- Download and extract
osu-echo-v1.0.1-windows-x86_64.zip. - Run
osu-echo.exe --trust-certonce. - Start
osu-echo.exeand launch osu! using your shortcut with-devserver localhost.
osu!echo 1.0.0
osu-echo v1.0.0
Initial release of osu-echo, a local osu! server written in Rust for score saving, performance points (PP) calculation, local leaderboards, and beatmap downloads.
Highlights
- Standalone & Portable: Compiled with full link-time optimization (LTO) and bundled SQLite. No external runtimes or databases required.
- Real-Time PP Calculation: Live PP computation powered by
rosu-ppacross all game modes (Standard, Taiko, Catch, Mania). - Score & Replay Saving: Automatically saves scores, statistics, and
.osrreplays to a local database. - Custom & Unranked Maps: Full support for unranked maps, practice diffs, speed changes, and osu!trainer modifications.
- Built-in osu!direct: In-game search and 1-click downloads powered by the Catboy (Mino) mirror with no Supporter tag needed.
- In-Game Bot Companions:
- BanchoBot: Manages leaderboard statuses, personal bests, score announcements (
#recent), and profile settings. - Tillerino: Send
/npin chat or PM for instant star rating and 95%–100% PP breakdowns (!with,!acc).
- BanchoBot: Manages leaderboard statuses, personal bests, score announcements (
- First-Launch Setup Wizard: Automatically detects your osu! installation and guides initial setup.
Quickstart
- Download and extract
osu-echo-v1.0.0-windows-x86_64.zip(or runosu-echo.exedirectly). - Start
osu-echo.exeand follow the quick setup prompts. - Edit your
osu!.exeshortcut target to include-devserver localhost:"C:\Games\osu!\osu!.exe" -devserver localhost - Launch osu! and log in with any username and password to create your profile.
Community & Support
- Discord: https://discord.gg/Jpdq6sS3Kn
Acknowledgements
Special thanks to local-osu-server by Jeevan Johnson and its contributors for the original inspiration and foundational work.