A Tool That Actually Helps You Debug Roblox Scripts
Roblox Therapy is a debugging and analysis utility for Roblox Luau scripts. It's not a game, it's a local tool you run alongside your development environment to catch errors, inspect object states, and profile performance in ways the standard output window doesn't handle cleanly. The interface is straightforward, but there are enough gotchas that people either write it off or use it wrong. It hooks into the Roblox Studio debug session and pulls runtime data — variable states, call stacks, memory allocations, and execution timelines. You point it at an open project, choose which script you want to inspect, and hit start. It then displays a live dashboard while you test your place in play mode or in Studio's standalone environment. The core value is in seeing what's actually happening during execution instead of guessing from Print() statements. The most common distribution route is through GitHub repositories in the Roblox dev community. Search for "roblox therapy debug" and look for repos with recent commits and active issue threads. There isn't one official source from Roblox itself since it's a third-party utility. I download from the repo, extract the folder, and place it outside my main project directory so it doesn't get mixed into the .rbxl file structure. Some antivirus software flags it because it uses DLL injection to attach to the Studio process. I add an exclusion for the folder and move on.
Open your Roblox Studio project first. Launch Roblox Therapy after, not before. The timing matters because the tool scans for an active Studio debug session on startup. If you launch it too early it'll time out and you'll spend five minutes restarting it. Once it's open, select your project path, pick the script you want to monitor from the dropdown, and set your breakpoints directly in the Therapy window instead of inside Studio's editor. That sounds backwards but it's faster once you get used to it. The Therapy breakpoints sync to the Studio session automatically. Early on I was debugging a replication lag issue in a multiplayer system where player data wasn't syncing correctly after a server restart. The problem reproduced maybe one in ten tests, which made it nearly impossible to catch with normal breakpoints. Roblox Therapy's timeline viewer showed the exact frames where RemoteEvents fired versus when the server acknowledged them, but the tool was misreporting the timestamp resolution because my script was using tick() instead of os.clock(). It threw off every measurement by roughly 1.7 milliseconds. The workaround was switching the problematic functions to os.clock() and re-running the same test. The timeline became accurate and I found the actual bottleneck — a RenderStepped connection running on the server instead of the client, which was causing a queue backup on event processing. First, the tool has a feature called variable snapshotting that runs at breakpoint hits. It sounds useful but it also copies every referenced object in the frame, which means if you're inspecting a large data model with hundreds of parts or a big table of instances, the snapshot alone can take two to three seconds to complete. That makes your breakpoints feel sluggish. I learned to turn off snapshotting for anything larger than five megabytes and use selective watching instead. You pick which variables get captured at each hit rather than grabbing everything.
Second, people don't realize Roblox Therapy can monitor multiple scripts simultaneously, but only if they're in the same package. Scripts loaded dynamically at runtime through require() from a separate module path won't show up in the same session view. You have to add the dynamic module path manually in the tools' monitoring settings. This cost me an afternoon when I thought the tool was broken because my custom physics module simply refused to appear in the dashboard. Once I added the path it worked fine.
Get the Full Details

Performance profiling
The profile tab lets you run a timed session and see which functions consume the most CPU time per call. It's accurate enough for finding obvious hotspots but it has a known blind spot with coroutines. Yielded coroutines that resume later don't show clean attribution in the flame graph. The caller line points to wherever the coroutine was originally created, not where it resumed. If your game uses heavy coroutine-based AI or state machines, you'll get misleading data. The fix is wrapping your coroutine entry points with manual timing calls and logging those to Therapy's custom data stream instead of relying on the automatic profiler for that section.
Limitations
It doesn't work with the mobile or web versions of Roblox Studio. The hook only attaches to the desktop executable. If you're testing on a lower-end machine, running Therapy alongside Studio can consume an extra 200 to 400 MB of RAM depending on how many scripts you're monitoring. For small projects that overhead is negligible, but if you're already pushing memory on a single-threaded machine it adds up. Also, the tool has no built-in network visualizer for ReplicatedStorage events across clients. You can see the events in your script but you can't trace which client received them without adding your own logging. Some users combine it with a separate packet logger for that, though the integration isn't seamless.
When it just doesn't work
If your issue is a Roblox engine-level bug or a client-rendering problem caused by GPU throttling, Roblox Therapy won't help you. It inspects Luau execution only. I had a case where players on certain hardware reported stuttering every thirty seconds. I ran the profile for an hour and the script side looked perfectly fine. The culprit was a GPU driver conflict with Roblox's renderer, not anything in the code. Therapy showed zero anomalies. In cases like that, switching to Roblox's built-in profiler or using an external tool like RenderDoc is the actual move.

Final notes on workflow
I keep Roblox Therapy open in a separate window next to Studio and pin the script I'm working on to the top of the dashboard. The default layout puts the timeline at the bottom which forces a lot of scrolling during active debugging. Rearranging the panels to put variable watches on the right and the timeline below saves time. I also export my profile results as CSV after each session instead of trying to remember what the numbers looked like. The export function is buried in the profile menu but it works reliably and lets you compare sessions side by side later.