Quickstart
Spin up a single bot, then run a Lua script against it. Five minutes end-to-end on a fresh install.
1. Install + launch
Download the latest release and run seraph.exe. The first launch
prompts for a license key — paste yours, the dashboard opens.
The first time you authenticate against the licensing server, your session token is saved locally so subsequent launches skip the prompt until the lease expires.
2. Spawn a bot
In the dashboard:
- Click Add bot.
- Pick an auth method:
- Email + password — matches the in-game login.
- Android device ID — fresh guest. Seraph generates a random AID; PlayFab provisions a new account on first connect.
- Steam ticket — paste a base64 ticket the Steam SDK gave you.
- Click Save. The bot lands in the list with status
connecting. Wait until it reachesMenuReady(auth done) orInWorld(after awarp).
If your IP got flagged by PlayFab anti-fraud (AccountBanned errorCode=1002),
Seraph automatically routes the auth HTTPS calls through an encrypted
edge relay — you don't have to configure anything. The TCP game socket
still connects direct.
3. Open the script editor
Click the bot's row → Scripts tab → + New script. Paste:
print("hello from", bot:currentWorld() or "main menu")
print("level:", bot:level())
print("gems:", bot:gems())
print("bytes:", bot:byteCoins())
Hit Run. The console pane streams every print line in real time.
4. Try something with movement
-- Warp into a world, walk to a tile, mine it once, walk home.
bot:warp("MINEWORLD")
task.wait(2) -- give the world load a moment
bot:walkTo(40, 18)
bot:punchTile(40, 18)
task.wait(0.4) -- let the server reply with the inventory delta
print("inventory size after one swing:", #bot:inventory())
A few notes on what you just used:
bot:warp(world)joins the named world. Same as theMWli + TTjW + Gwburst the real client emits. Server redirects (OoIP) are handled for you; if the lobby sends you to a different shard, Seraph follows the redirect transparently.bot:walkTo(x, y)plans a path through the world's tile graph, emits themp + mPmovement burst the real client uses, and waits for the server's position-update echo before returning.task.wait(seconds)yields the current Lua coroutine without blocking the bot's packet loop. Idiomatic overos.time()polling.
5. Stop / continue
The Stop button cancels the running script — every Lua coroutine gets a cancellation signal and the runtime drops the VM. Scripts that left the bot in-world stay connected; only the script ends.
Where next
- Threading — coroutines,
task.wait, parallel per-bot dispatch. - Inventory — read backpack, drop, trash, equip.
- Examples — annotated end-to-end scripts you can copy.
- API reference — every Lua-exposed binding, auto-extracted from the source so it never drifts.
- HTTP REST API — drive the same surface from outside the app (Python, Node, curl…).