Skip to main content
Every plugin below is a whole file. Save it into your plugins folder, enable it in /seraph config under Plugins, and it runs. Nothing here needs a build step or an install.

Lobby greeter

Watches the tab list and welcomes people as they arrive, with the greeting and a quiet mode exposed as settings.
config is live, so a change made in game takes effect on the next join without a reload.

Health overlay

Draws a small readout in the corner of the screen, toggled with a key.
renderOverlay runs every frame and only while no screen is open, so the readout hides itself whenever you open your inventory. Keep the body cheap: work out anything expensive in tick and draw the result here.

Webhook relay

Forwards matching chat lines to a Discord webhook, with the URL hidden in the menu.
Naming webhook in secrets draws it as dots with a reveal button, so it is not read off the screen during a share. See Manifest and permissions.
The network permission is limited to 30 requests a minute per plugin. A chat listener can fire far faster than that in a busy lobby, so match narrowly, or collect lines and send them on a timer rather than one request per message.

A custom anti-cheat check

Flags a player whose view snaps further in a tick than a person could turn. Seraph’s own flag message and report pipeline takes over from there.
The tick function runs once per tick for every observed player, so it is the hottest code a plugin can write. Keep it to arithmetic, and never call the network from inside it.

A stats command

Registers /whois, resolves a name through Seraph’s own API layer and tags the player in the world.
stats.getPlayer shares the mod’s caching and proxy handling, so repeated lookups of the same player in a lobby cost nothing extra. nametags only ever clears decorations your own plugin added.

A module with a schedule

Modules are compiled, stay loaded for the session and get enable and disable hooks, which is what anything with a cron schedule wants. Save this as standup.mod.js.
Editing a .mod.js file does not hot reload it. Seraph tells you in chat that a restart is needed instead, and ordinary scripts carry on reloading around it. See Scripts and modules.

Sharing code between plugins

Put the shared half in its own plugin, name it in dependsOn and require it:
Anything that is not the name of a loaded plugin is treated as a path relative to the requiring file, so require("./lib/helpers") keeps shared code in a subfolder even though only top level .js files are discovered.

Next

Events

Every event, what it hands you and when it runs.

Troubleshooting

Why a plugin is not loading, running or drawing.