Skip to main content

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:

  1. Click Add bot.
  2. 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.
  3. Click Save. The bot lands in the list with status connecting. Wait until it reaches MenuReady (auth done) or InWorld (after a warp).

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 the MWli + TTjW + Gw burst 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 the mp + mP movement 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 over os.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…).