osu!StreamDeck

this started as a Twitch beatmap request bot because the one we were using was down for a few days. then people kept asking for stuff, so now it also does overlays, !np, !skin, a key visualizer, Ranked Play info and a bunch of other osu! stream stuff.

Requests

the part this app originally existed for.

Queue / review

Open or close requests, review maps before accepting them, set queue limits and keep track of what has already been played.

Filters

You can filter by PP, stars, length, BPM, AR, CS, OD, status and mode. Leave them blank if you do not care.

Mods

Requested mods stay with the map and show up when the request is sent to osu!. NoMod stays clean instead of getting an unnecessary NM label.

Replies still work

If Twitch sticks a reply mention in front of a beatmap link, OSD still picks up the map and keeps the actual sender as the requester.

!myq

Viewers can check their own requests and see how much space they have left under the current queue limits.

History

Opened requests stay in History so you can go back to older maps without messing with the active queue.

!np

shows the map you actually have selected, not just whatever came from the request queue.

Current map

Chat can ask for the current or most recently selected map, including difficulty, stars, mods and the map link when available.

Song Select

Manual map changes in stable can update !np before gameplay starts instead of waiting until you play the map.

Startup restore

If osu! was already open before OSD, it can recover the newest recent selection instead of starting completely blank.

!skin

stable and lazer are handled separately because they store this stuff differently.

stable + lazer

Report whichever client is active, or both if you want. OSD does not pretend it knows a custom skin name when it cannot prove one.

Names and links

You can keep automatic detection or override the chat-facing name and download link for either client.

!setskin

The broadcaster can change the display name or link from Twitch chat, switch back to auto or clear an override.

Lazer fallback

If a local lazer skin name cannot be resolved safely, you can name that skin manually instead of getting a made-up result.

OBS overlays

use the pieces you want and ignore the rest.

Current Map

Current selected/requested map as its own Browser Source.

Compact Queue

A smaller queue view that does not need half the screen.

Requests Open

Just the current request status, separate from the rest of the queue UI.

Key Visualizer

keys, trails, TOTAL, BPM and MAX BPM in one Browser Source.

60 FPS

The overlay targets 60 FPS so presses and trails do not look choppy on stream.

Inputs

Set Key 1, Key 2 and optional mouse inputs separately, including their colors and trail colors.

BPM

Live BPM is based on the actual timing between presses. There is no fake 300 BPM cap or anything like that.

MAX BPM

The session max only updates from tapping that is consistent enough to count, so one cursed input spike does not become your record.

Two-key tapping

Both configured inputs are measured properly instead of alternating taps showing up at half speed.

Layout

Horizontal or vertical, with different trail directions depending on how you want it to sit in OBS.

TOTAL

Total presses stay cumulative until you reset them yourself.

Colors

There is an in-app color picker with HEX, RGB/HSV controls and recent colors.

Background input

The visualizer keeps updating while the OSD window is minimized.

Ranked Play

profile info and match/session changes without needing another app open.

Profile info

Rank, rating, games, wins, win rate, lifetime Ranked wins and season score when the official data has them.

Live mode

When the OBS source or preview is visible, refreshes happen much faster so the overlay does not feel several minutes behind.

Transparent mode

Remove the card background/border and keep only the text, graph and stats over your stream.

Appearance

Colors and opacity are editable if you want it to match the rest of your overlay.

Session graph

Session delta and W/L update when the published Ranked Play stats actually change.

Live data / tosu

OSD uses an official tosu runtime for some live map and gameplay data.

tosu is its own open-source project. i do not claim any of that code as mine. OSD currently pins tosu v4.25.1, verifies the runtime before packaging it and keeps the license/source notices with the release.

Upstream project

tosu is developed separately by the tosu project.

Version

The packaged build currently uses tosu v4.25.1.

License

tosu is LGPL-3.0. The exact upstream source is linked in the third-party notices included with OSD.

Updates

OSD checks in the background and tells you when there is a newer build.

Update check

The app checks the ValoCookie update manifest and GitHub release info so one stale source does not leave you stuck on an old version.

UPDATE NOW

Starts the updater instead of making you manually hunt down the newest exe.

Verification

The replacement is checked before OSD relaunches.

FAQ

Does the Key Visualizer work while OSD is minimized?

Yep. Supported keyboard and mouse bindings keep being captured in the background.

Is tap speed capped?

No artificial BPM cap. The value comes from the input timing.

Can !skin include a download link?

Yep. Stable and lazer can each have their own display name and link.

Does Ranked Play work outside an active match?

Profile info can still refresh outside a match. The faster live refresh is mainly for when the overlay or preview is open.

Why is tosu mentioned here?

Because OSD uses it for some live osu! telemetry and i would rather be very obvious about what is mine and what is not.

StreamFlight

i also made a separate app for opening the rest of my stream setup and keeping pre-stream checks in one place. more info →