osu!mania 4K overlay
Connects to tosu, reads your current map, and estimates its Dan tier live across five scoring modes: Reform, Celestial, Signicial, Shoegazer, and an automatic LN Course mode for maps with more than 45% long notes.
Ten Reform tiers · α through κ · logos by icyilc
No bells, no whistles. Just the data you actually want while playing.
Reads map SR, runs it through per-skillset calibration for each tier, and shows you where it lands. Updates automatically when you switch maps.
Powered by MinaCalc. Classifies your map as Jack, Stream, Tech or Stamina and surfaces sub-patterns like CJ · JS or STAM · HS.
Press PNG to generate a standalone, full-resolution density graph — per-skillset MSD bars, complete timeline, no cropping.
Three things running at the same time. That's it.
Either osu! stable or osu! lazer — both work. Open it and have a 4K mania map selected.
A lightweight background process that reads live game data.
Open the .exe. The overlay connects automatically and starts estimating Dan tiers for whatever map you're on.
tosu is required for the overlay to read live game data. It's free, lightweight, and takes seconds to set up.
Genuine overlay outputs — not mockups. Click to enlarge.





Hit PNG in the overlay to export a standalone density graph — per-skillset MSD bars, full timeline.
Straight answer: it works well most of the time, and then occasionally it'll confidently call your Zeta-tier speedjack map "Delta High" and act completely normal about it.
Anything with unusual density, hybrid patterns, or charts between two skillsets — the classifier can misfire. Sometimes badly. Vertex BETA used to land at Delta. That's fixed now. Others will too.
If it reads your Eta stamina marathon as "Alpha LOW" — that's not a glitch, it's just the algorithm having a terrible moment. No crash, no warning.
Every bad call gets investigated. The goal is always a structural fix — not a special case for one map, but a change that handles that class of chart correctly.
It's like asking a friend who plays a ton of osu!mania to size up any map on the spot. Knows the Reform pack well, has strong opinions, solid gut reads — and occasionally says something completely unhinged. You still ask anyway.
Maps with dense speedjack patterns were misclassified as tech charts by up to two Dan tiers. Fixed.
Speedjacks produce a feature fingerprint nearly identical to chaos tech patterns. The classifier was routing maps through the wrong difficulty ruler.
The fix: when classifier confidence drops below 50% and MinaCalc's jack MSD dominates, the overlay defers to MinaCalc. Not a one-map hack — a structural change.
Vertex BETA (Silvia, by kasam53) was two Dans off consistently. It's now landing correctly.
It works now. Probably. We're like 90% sure.
The actual math behind the number it shows. Just the parts that matter.
A Zeta jack chart and a Zeta tech chart share a tier name but not a difficulty shape. Using a single SR mean per tier works on average — but it systematically misfires on anything that skews toward a specific skillset. DanOverlay uses four independent rulers, one per skillset, each calibrated separately against the official Reform pack.
DAN_MEANS = {
"Alpha": 6.562,
"Beta": 6.957,
"Gamma": 7.459,
"Delta": 7.939,
"Epsilon": 9.095,
"Zeta": 9.473,
}
# same ruler for every chart type
_SKILLSET_SR_MEANS = {
# 20 dans each · optimizer-calibrated
"jack": {"Alpha": 6.56, "Beta": 6.84, "Gamma": 7.05, ...},
"speed": {"Alpha": 6.56, "Beta": 6.82, "Gamma": 7.56, ...},
"stamina": {"Alpha": 6.81, "Beta": 6.92, "Gamma": 7.35, ...},
"tech": {"Alpha": 6.93, "Beta": 6.94, "Gamma": 7.33, ...},
}
Speedjack charts produce a feature fingerprint nearly identical to chaos tech patterns. The classifier routes them into the tech ruler — and the tech ruler systematically underestimates same-column jack pressure by one or two tiers.
When a tech-labelled map shows very high Jbar peak pressure and Jbar dominates the component budget, the engine re-routes it through the jack ruler instead. Not a one-map patch — a structural rule.
Still figuring out exactly where to draw the threshold. Works well on the clearest cases. Edge maps are unpredictable.
if family == "tech":
jbar_max = sr_result.get("jbar_max", 0.0)
jbar_share = sr_result.get("jbar_share", 0.0)
# Epsilon jack tops out ~Jbar 56.
# Only Zeta+ speedjacks reach this zone
# via the "tech" classification path.
if jbar_max >= 70.0 and jbar_share >= 0.48:
sj_dp = sr_to_dp(sr + bonus, skillset="jack")
if sj_dp > dp:
dp = sj_dp
# re-routed: tech ruler → jack ruler
SR doesn’t map to a discrete tier — it lands somewhere inside a tier’s range. The ruler places a calibrated SR mean at each dan, computes midpoint boundaries between adjacent means, then linearly interpolates the fractional position within that window.
The result is a continuous DP value that directly produces the sub-tier label. No fixed percentage bands. No separate sublevel table to maintain.
def sr_to_dp(sr, skillset=None):
ruler = _get_ruler(skillset)
bounds = _precompute_boundaries(ruler)
# midpoint between adjacent calibrated SR means
for lower, upper, dp_int in bounds:
if lower <= sr < upper:
t = (sr - lower) / (upper - lower)
return float(dp_int) + t
# SR 7.64 → dp 13.73 → Delta Mid-High
# SR 9.61 → dp 16.10 → Zeta Low
v1.7.5 · Standalone .exe · No install needed
Download for Windows ~107 MB⚠️ Still in development — do not expect precise results. Scoring modes are experimental.
Calibration & Fixes
New Features
Bug Fixes
Modern skin — the new design
Settings Persistence
%APPDATA%\DanOverlay\settings.json — no need to reconfigure after updates.Visual Customization
Startup & Onboarding
Bug Fixes
Scoring Modes
LN Course — Automatic Detection
Beyond Ceiling
Resize & Controls
Intro & UI
Compatibility