Radeline
Pair of brute-force tools to help with Celeste TASing
Install / Use
/learn @Kataiser/RadelineREADME
Radeline
Chaos monkey that optimizes a Celeste TAS by randomly (or sequentially) changing inputs. Progress for the main game is here (but I've stopped working on it).
Now includes a fully working movement simulator, for brute forcing precise position and/or speed values! Not at all related to the main program cause that's not confusing!
Download (includes both)
Radeline.zip (13 MB)
Optimizer instructions
- Make sure the inputs in your TAS have a breakpoint on the very last line, a console load (or chapter restart) at the beginning, and end on the chapter complete screen (or a S&Q). The goal is to make the game save to debug.celeste
- Take a look at
settings.yaml(it's just a text file) and make sure it's configured like you want. The main thing is putting in the path to your TAS file - Be careful with Celeste Studio because it doesn't read Radeline's changes to your TAS and so you could easily accidentally overwrite it. Also make sure "Launch Studio at boot" is enabled in CelesteTAS, in case the game crashes
- Run
run.bat
Simulator instructions
- After running the last frame of unsimulated input, use Ctrl-Shift-C in Studio to copy your position and speed and edit
config.yamlaccordingly - Make all the other changes to the config you need in order to match your game state, including finding the number of frames to simulate
- "Permutations" refers to the number of inputs to simulate. This increases run time, especially with more frames, but raises your chances of getting better inputs. 500k to 1m is often good. Ignored when using sequential method
- Run
run.bat, your results will also be saved inresults.txt - An auto-formatter will be started afterwards which lets you copy some resulting inputs to have them be automatically reformatted in your clipboard to be pastable into Studio, which can also be launched with
run formatter.bat - (Optional) Add this to your custom info to automate more of init state:
JumpTimer: {Player.varJumpTimer.toFrame()}
AutoJump: {Player.AutoJump}
MaxFall: {Player.maxFall}
Holding: {Player.Holding}
Deaths: {Session.Deaths}
If you need any assistance or additional functionality, DM me on Discord at Kataiser#4640
Why the name?
Because it's a little dumb and almost insulting to real TASers, but dangit if it isn't really cool sometimes (also, Random Madeline). I kind of regret the name and just call it "my optimization script" half the time though. Maybe this repo will be expanded at some point.
Related Skills
node-connect
342.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
claude-opus-4-5-migration
85.3kMigrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5
frontend-design
85.3kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
model-usage
342.5kUse CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.

