What Pulse Handles vs What You Write
One of the most useful things to understand early is the exact line between what Pulse does and what you're responsible for. This page spells it out clearly.
The short version
Pulse handles structure and plumbing. You write the logic and game-specific knowledge.
Full breakdown
Pulse handles
| Area | What Pulse does |
|---|---|
| Event connections | Calls RunService.Heartbeat:Connect, UserInputService.InputBegan:Connect, etc. and stores the connections |
| Connection cleanup | Disconnects all bound connections when _PulseDestroy() is called |
| Signal infrastructure | Creates reactive signal objects, manages subscribers |
| UI binding | Connects Linoria widget changes to signals, and signal changes back to widgets |
| Default values | Fires deferred default= values 1 second after load |
| Character refs | Keeps humanoid, hrp, character, alive current after each respawn |
| Loop error isolation | Catches errors in Pulse.Loop callbacks and throttle-logs them — your loop keeps running |
| Dev overlay | Log viewer, feature toggle panel, config snapshot — in --dev builds |
| Build + compilation | Compiles TypeScript via TSTL, concatenates files, optionally obfuscates with IronBrew2 |
| Component registry | Components.Aimbot, Components.ESP, etc. |
You write
| Area | What you provide |
|---|---|
| Feature logic | The actual thing your script does — targeting math, detection logic, effect application |
| Game-specific paths | Folder names, remote paths: "workspace.Enemies", "Remotes/Combat/Attack" |
| Team/enemy classification | Who counts as an enemy? Pulse provides Pulse.Team.resolver as the tool, you define the rules |
| Remote event paths | Every game has different remotes; you supply the exact ReplicatedStorage path |
| Shared helper logic | Functions in globals.lua that multiple components need |
| UI page layout | Which components mount in which groupbox on which tab |
| Condition logic in handlers | if h.Health < threshold — that's your logic, not Pulse's |
| Cleanup beyond connections | Restoring modified properties, removing instances you created |
The grey area — helpers give you the tool, you use it
Pulse provides helpers like Pulse.Aim.findNearest and Pulse.Hitbox. These are tools. They handle the mechanism — FOV math, hitbox resizing, size saving — but you still wire them to your game:
-- Pulse handles: FOV check, distance sorting, returning the nearest entity
-- You handle: what list of entities to search, which part to use as the aim root
local nearest = Pulse.Aim.findNearest(getTargets(), {
fovRadius = radius(),
getRoot = getAimRoot, -- YOU define which part counts as the aim point
})
Think of it this way: Pulse gives you a hammer. You still have to swing it.
What Pulse explicitly does NOT do
These are things people sometimes expect Pulse to handle, but doesn't:
Does not auto-detect enemies. Pulse.Team.resolver gives you the machinery, but you write the isHostile function based on your game's team structure.
Does not know your game's folder structure. workspace.Titans.Alive, workspace.Shifters, ReplicatedStorage.Remotes.Combat — these are game-specific. Pulse has no idea they exist.
Does not handle Roblox replication for you. If you parent a Highlight to another player's character, Roblox's replication will silently destroy it. You need to parent it to CoreGui with an Adornee instead. Pulse doesn't automatically fix this.
Does not handle executor differences. setclipboard, writefile, syn.request — these vary by executor. Pulse provides pcall wrappers in some places but doesn't abstract all executor APIs.
Does not error if you write bad paths. remote Attack = "Wrong/Path" will silently hang waiting for a remote that never exists. Pulse doesn't validate your paths at build time.
Does not generate UI for you. Signals don't get UI widgets unless you explicitly declare them in ui {} and mount the component in a page.
A useful mental check
Before writing any piece of code, ask: "Is this about my game, or is it infrastructure?"
- My game → you write it
- Infrastructure → Pulse probably has it or you need to add it to
globals.lua
If you're writing the same pattern for the third time, it belongs in globals.lua as a shared helper function.