Skip to main content

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

AreaWhat Pulse does
Event connectionsCalls RunService.Heartbeat:Connect, UserInputService.InputBegan:Connect, etc. and stores the connections
Connection cleanupDisconnects all bound connections when _PulseDestroy() is called
Signal infrastructureCreates reactive signal objects, manages subscribers
UI bindingConnects Linoria widget changes to signals, and signal changes back to widgets
Default valuesFires deferred default= values 1 second after load
Character refsKeeps humanoid, hrp, character, alive current after each respawn
Loop error isolationCatches errors in Pulse.Loop callbacks and throttle-logs them — your loop keeps running
Dev overlayLog viewer, feature toggle panel, config snapshot — in --dev builds
Build + compilationCompiles TypeScript via TSTL, concatenates files, optionally obfuscates with IronBrew2
Component registryComponents.Aimbot, Components.ESP, etc.

You write

AreaWhat you provide
Feature logicThe actual thing your script does — targeting math, detection logic, effect application
Game-specific pathsFolder names, remote paths: "workspace.Enemies", "Remotes/Combat/Attack"
Team/enemy classificationWho counts as an enemy? Pulse provides Pulse.Team.resolver as the tool, you define the rules
Remote event pathsEvery game has different remotes; you supply the exact ReplicatedStorage path
Shared helper logicFunctions in globals.lua that multiple components need
UI page layoutWhich components mount in which groupbox on which tab
Condition logic in handlersif h.Health < threshold — that's your logic, not Pulse's
Cleanup beyond connectionsRestoring 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.