Setup

Connect your Squad server.

Install the sqreader agent on your game server with one command, and finished matches publish to squadreader.com automatically. Read-only — it never writes to the game.

Before you start

  • Linux host — the reader uses /proc/<pid>/mem. No Windows or macOS.
  • Nothing to pre-install — the agent is a single self-contained binary. No Python, no toolchain.
  • Permission to read the game process's memory — run as root, or grant CAP_SYS_PTRACE + CAP_DAC_READ_SEARCH.
  • A running Squad dedicated server on the same host (offsets target Squad v10.4 / SDK v10.4.1).
1

Add your server

Sign in with Discord and register your server. You get your install command straight away — nobody has to approve anything first.

Running several Squad servers on one machine? Register each one separately — every server gets its own name, its own command and its own place in the archive.

2

Run the installer

One command, as root, on the machine running your Squad server. Step 1 gives you this line with your own token already in it.

curl -fsSL https://squadreader.com/install.sh | sudo bash -s -- <YOUR_TOKEN>

That downloads the agent, checks it runs on your box, installs it to /opt/sqreader, enrolls with your token, and starts it as a service. It also enables a daily cleanup timer so recordings can never fill your disk.

Prefer to read it first? The script is plain text at /install.sh — open it in your browser before you pipe it to a shell. On a standard single-instance box no configuration is needed; the Squad server is found automatically. Running several Squad servers on this machine? Set them up here instead.
3

Check it worked

Two commands. The first should say active (running), the second should show your agent id.

systemctl status sqreader-prod
sqreader enroll --status

If something looks wrong, the agent's own log is the place to look:

journalctl -u sqreader-prod -n 50
Installed before starting Squad? That's fine — the service keeps retrying and attaches by itself once the game server is up.
4

You're live

From now on, every finished match publishes automatically — all-time stats plus the latest 15 replays per server. Your server appears on Servers and its players on Stats.

Already have match history? Backfill your all-time stats from existing recordings once:
sqreader stats-backfill --recordings-dir /opt/sqreader/recordings --stats-db /opt/sqreader/stats/player_stats.db --push
Updating later? Re-run the same installer with no token — an enrolled server authenticates the download with its own credentials:
curl -fsSL https://squadreader.com/install.sh | sudo bash

Several Squad servers on one machine?

Install one agent per server. Register each one in step 1 to get its own command — the same two clicks as the first.

You don't have to work out the ports yourself. Run the installer with no arguments and it refuses to guess: it lists what is running and prints the exact command for each server.

curl -fsSL https://squadreader.com/install.sh -o install.sh && sudo bash install.sh
  Squad servers running on this machine:

    pid 4781     -Port=7787
    pid 4546     -Port=7797
    pid 5001     -Port=7807

  Install one agent per server, each with its own name, HTTP port
  and game port — and its own enrolment token:

    SQREADER_INSTANCE=srv1 SQREADER_PORT=8081 \
      SQREADER_SQUAD_PORT=7787 bash install.sh <TOKEN-1>

    SQREADER_INSTANCE=srv2 SQREADER_PORT=8082 \
      SQREADER_SQUAD_PORT=7797 bash install.sh <TOKEN-2>

Run those in turn. Each instance gets its own install directory, service, cleanup timer and stats database, so they never touch each other — and the checks in step 3 become systemctl status sqreader-srv1, journalctl -u sqreader-srv1 -n 50, and so on for each name.

Why the game port matters. Without it an agent finds the Squad server by process name, which on a machine with several answers arbitrarily — and can answer differently after any restart. Two agents would publish one server twice while another went unread, and none of that looks broken from the outside. SQREADER_SQUAD_PORT is what pins each agent to one game.
Privacy. Only finished matches leave your machine — final stats and the .sqrx replay. Nothing live, nothing while a round is in progress. Everything is sealed end-to-end and the key stays on your server; we cannot read it in transit. The agent only ever reads the game's memory, and you can stop it at any time with systemctl stop sqreader-prod.
After a Squad update, memory offsets can shift. Run sudo sqreader doctor to re-verify them against the live binary.

That's it.

A few minutes to set up, then zero maintenance.