Skip to main content

Why Pulse?

Pulse exists because building large, multi-feature Roblox scripts has a deployment and maintenance problem that most people run into around the 500-line mark.

How large scripts normally work

As a script grows, the standard approach is to split it into modules and use require() to connect them:

local ESP = require(repo.ESP)
local Aimbot = require(repo.Aimbot)
local Helpers = require(repo.Helpers)
local Remotes = require(repo.Remotes)

Each module is a separate file in a GitHub repo. The main script loads them at runtime via HttpGet + loadstring. This pattern is common and it works — until you try to maintain or ship it properly.

The multi-module problems

Obfuscating many files is painful. Each module needs to be obfuscated separately. Running Prometheus (or any obfuscator) on 10+ files, keeping cross-module references intact, and re-obfuscating everything on every change is slow and error-prone. Most people skip it and ship readable source.

Unobfuscated Lua on GitHub gets accounts banned. GitHub's scanners flag Roblox exploit script content. Repos get taken down. Accounts get restricted. If your source is readable and clearly an exploit script, it's a matter of time before something gets flagged.

Managing multiple GitHub files is friction. New feature? New file, new require(), new entry in your module list. Rename something? Update every reference across every file. Delete something? Hope nothing still requires it. Every change touches multiple places.

Testing is painful. With multi-module loadstring, to test a single change you need to: obfuscate the changed module, push it to GitHub, wait for CDN propagation, then re-execute the script via loadstring. That's a 30-60 second feedback loop per change. Most executors don't support loading multiple local files either — you can't just run your development copy without GitHub in the loop. With rb, the loop is: save file → rb watch rebuilds in under a second → re-inject.

Runtime failures. If GitHub goes down, ratelimits you, or removes your repo mid-session, every HttpGet call fails and the script breaks for all users at once.

What rb does

rb build compiles all your source files into one single .lua file at build time. Not at runtime — at build time. No require() anywhere in the output. No GitHub modules loaded at runtime.

The output is one obfuscated file. You push that one file to GitHub and users load it with a single loadstring:

loadstring(game:HttpGet("https://raw.githubusercontent.com/.../script.obf.lua"))()

GitHub only sees an opaque blob of obfuscated bytecode — not recognizable as an exploit script. You're still using GitHub and loadstring the same way, just with one file instead of ten. One push. One URL. If you need to update, replace one file.

Then the framework was added

rb started as just the compiler. But every script had the same boilerplate repeated across every feature: connection tracking, toggle logic, respawn handling, UI binding. Writing it manually for each module meant copying the same patterns over and over.

So the Pulse framework layer was added — the .rblua component syntax, signals, reactive on handlers, the ui block. The compiler handles the syntax. The framework eliminates the boilerplate. You write the feature logic; the rest is handled.

The result: clean, modular source code during development — one obfuscated file for deployment.

Honest state of the project

Pulse is in active development, maintained by one person who has a day job. Updates land when they land.

  • Some features have rough edges or undocumented behavior
  • The transpiler has edge cases it handles badly
  • Some design decisions were made early and may change

If something doesn't work the way the docs say, the source is installed at ~/.rb/bin/ — read it. The codebase is small and readable. Join the Discord to report issues.

What Pulse is not

  • Not a replacement for GitHub/loadstring — it still uses them, just smarter
  • Not a UI library — it integrates with Linoria, which handles the actual UI rendering
  • Not a runtime dependency — it compiles into your output, there's nothing to load
  • Not finished — use it, break it, report it