Public
Watch
1
Fork
You've already forked sbrex
0
0

Latest commit

maotovisk
feat!: rename to sbrex
All checks were successful
release / appimage (push) Successful in 1m24s
560f4b2 2026-10-17 22:08:16 -03:00 932 commits
2026-10-17 22:08:16 -03:00
2026-10-17 22:08:16 -03:00
2026-10-17 22:08:16 -03:00
2026-10-17 22:08:16 -03:00
2026-10-17 22:08:16 -03:00
2026-10-17 22:08:16 -03:00
2026-10-17 22:08:16 -03:00
2025-05-21 20:34:55 +02:00
2026-10-17 22:08:16 -03:00
2026-10-09 16:41:18 -03:00
2026-10-17 22:08:16 -03:00
2026-10-17 22:08:16 -03:00

sbrex is an osu! storyboard editor for people that don't want to form an intimate relationship with the Ctrl-L shortcut: it lets you see changes to code or sprite textures as soon as you save them.

It is a Linux port of storybrew by Damnae, running natively on .NET 10 with SDL3, OpenTK 4 (OpenGL) and SkiaSharp.

Releases · Wiki · Issues

Install

curl -fsSL https://git.maot.dev/maot/sbrex/raw/branch/main/install.sh | bash

This installs the latest AppImage to ~/.local/bin/sbrex and adds it to your applications menu; run it again to update, or pass --uninstall (... | bash -s -- --uninstall) to remove it. Projects and settings live in ~/.local/share/sbrex.

The AppImage is self-contained: it doesn't need .NET to be installed. It needs FUSE (fuse3), OpenGL and an audio server. File pickers are your desktop's own, through xdg-desktop-portal (zenity is used without a portal).

Windows

Download sbrex-<version>-win-x64.zip from the releases, extract it in a folder of its own and run sbrex.exe; it updates itself from the start screen. Projects and settings live in %LOCALAPPDATA%\sbrex.

AI agents (MCP)

The editor can expose the open project to AI agents through an MCP server: enable MCP Server (AI agents) in the project's settings, then connect your agent to http://127.0.0.1:37233/mcp. With Claude Code:

claude mcp add --transport http storybrew http://127.0.0.1:37233/mcp

Agents can read the project and beatmaps (timing, kiai, hit objects), create scripts and see their compilation errors and logs, change effect configuration (per difficulty too), switch difficulties and layer settings, render previews of the storyboard (with the hit objects if needed) to look at the result, find what makes it heavy (analyze_storyboard, profile_frames), export every difficulty and clean up unused files. The server only listens on localhost and is off by default; the port can be changed with McpPort in settings.cfg.

Difficulties

  • Main beatmap: effects are generated with it, and diff specific layers show its version. The beatmap button (next to the timeline) lists every difficulty; switching only reruns the effects that read something that differs between them (their name, hit objects... but not timing shared by both), and reuses what was already generated for a difficulty until a script, its configuration or a file it reads changes. The effect list tells which effects change per difficulty.
  • Shared beatmap: right click the beatmap button to pick the difficulty shared layers (.osb) are generated with. Right click the export button to export every difficulty at once: each .osu gets its diff specific layers, the .osb is written with the shared beatmap.
  • Per difficulty settings: the icon next to each configuration field gives it a value per difficulty. It then shows and edits the main beatmap's value.

Tools

  • Gameplay preview: the target icon next to the timeline draws the main beatmap's hit objects over the storyboard, under the Overlay layer.
  • Clean up mapset folder (Settings): moves the files of the storyboard folders (sb/...) that nothing uses to the project's .cache/cleanup folder. Files count as used when an effect generated them, the exported .osb/.osu files reference them or a script reads them, so export every difficulty first.

Building

Requirements:

  • .NET 10 SDK (scripts are compiled against its reference assemblies)
  • OpenGL 2.0 or later, X11 or Wayland
  • xdg-desktop-portal or zenity (file pickers)
  • An audio server supported by BASS (PipeWire, PulseAudio or ALSA)
dotnet build sbrex.sln
cd editor/bin/Debug/net10.0
./sbrex

packaging/build-appimage.sh 1.98.0 builds dist/sbrex-1.98.0-x86_64.AppImage, packaging/build-windows.sh 1.98.0 builds dist/sbrex-1.98.0-win-x64.zip (on Linux, it needs zip). Pushing a v* tag builds both with Forgejo Actions (.forgejo/workflows/release.yml) and publishes them as a release.

Scripts from storybrew

Most existing scripts compile unchanged: using OpenTK; and using OpenTK.Graphics; are mapped to OpenTK 4's OpenTK.Mathematics, and the OpenTK 3 members scripts relied on (Box2.Left/Top/Right/Bottom/Width/Height, Vector4.Transform(Vector4, Matrix4), ...) are still available.

What changed:

  • GetMapsetBitmap / GetProjectBitmap return a SkiaSharp SKBitmap. Width and Height work as before, GetPixel returns an SKColor (Red, Green, Blue, Alpha).
  • Custom font effects implement FontEffect.Draw(SKBitmap bitmap, SKCanvas textCanvas, StyledText text, float x, float y) and draw text with text.Draw(canvas, paint, x, y).
  • FontStyle and WrapMode are now SbrexCommon.Subtitles enums with the same values.

License

MIT, see LICENSE. storybrew and brewlib are Copyright (c) 2020 Damnae, the Linux port is Copyright (c) 2026 maot.

Audio uses BASS, which has its own license and is free for non-commercial use only.

The interface fonts are Inter and JetBrains Mono (for times), licensed under the SIL Open Font License 1.1 (Inter, JetBrains Mono). The icons are Lucide, licensed under the ISC License.

The hitsounds (editor/Resources/hitsounds) are osu!'s classic (stable) skin ones, from ppy/osu-resources, licensed CC BY-NC 4.0.