Skip to content
Join the waitlistWaitlist

Quickstart in paper mode

Install Guard, load your rules, and point a bot at it in paper mode. Paper mode uses Hyperliquid's real prices and sends no orders.

Paper mode is where every Guard starts. It reads Hyperliquid’s real prices and your real account, judges every order with the same rules, and records what it would have done. It sends nothing to Hyperliquid’s /exchange endpoint.

Run Guard on the machine where your bot runs: the setup detects your system (macOS, Linux, Windows or Docker). A server you reach over SSH is the other way. The setup carries the rules you set on this site (Backtest, Watch or the homepage), stored in your browser as a rules code that starts with zr1_; otherwise the defaults. It starts in paper mode.

stored only in this browser · ·

Your settings from this site

The default rules. Set your own on the playground, or paste a rules code.

  • 5× max
  • 2.0% at stop
  • no stop: Guard sets one
  • liq. ≥ 10%
  • size ≤ 200%
  • open ≤ 6%
  • daily 6%
  • drawdown 25%
  • 5/5 markets
  • paper mode
Start Guard in
Paper: real prices, no orders, no key. Mainnet is never preset from a web page: you type it on the server, and the account again.

Where Guard runs

Next to your bot: run the command on the machine where your bot runs. If that is a server you reach over SSH, pick “On a server”.

Other ways to run it: On a server (SSH) · One-click · Packages · Docker.

Your system
Detected from this browser; pick another if your bot runs elsewhere.

Guard listens on 127.0.0.1:8547 only, on this machine. Every command here matches the release (zunder-guard v1.0.0).

Secrets: typed where Guard runs, never here

This page never asks for a key, and no command it makes contains one. Shell history, screen sharing and this browser would all keep it.

API wallet private key

For testnet and mainnet. Create an API wallet in the Hyperliquid app: it can trade, it cannot withdraw. Guard asks for its key with hidden input on the server and stores it encrypted for the service. API wallets

Alert webhook, optional

A webhook URL is a bearer secret too. Add it on the server, in Guard's config, after the setup. Configuration

Public values: safe to enter here, checked in this browser

this machine · what the setup asks
$ curl -fsSL https://zunder-design-preview.pages.dev/i | sh -s -- --rules zr1_eyJ2IjoxLCJtYXhMZXZlcmFnZSI6NSwibWF4…✓ installer verified: Sigstore signature of the v1.0.0 checksums (zunderlabs/zunder-guard)✓ zunder-guard 1.0.0 installed to /usr/local/bin · service user zunder-guard Your rules from zunderlabs.com  max leverage 5× · loss at stop 2% · no stop: Guard sets one 2% away  liquidation ≥ 10% · size ≤ 200% · open risk ≤ 6%  daily loss stop 6% · drawdown halt 25% · markets: allKeep these rules? [Y/edit] › YHyperliquid account address › 0x8c41…a90fMode [paper/testnet/mainnet] › paper✓ paper mode: real prices, no orders, no key needed ✓ Guard is running (systemd: zunder-guard) · 127.0.0.1:8547 · paperClient key for your bot (shown once): zc_7Hq2…Lm9xNext: point your bot at http://127.0.0.1:8547

Run this where your bot runs

One command with your rules, on this machine. It installs Guard after checking the release’s signature and asks you the rest here.

terminal
curl -fsSL https://zunder-design-preview.pages.dev/i | sh -s -- --rules zr1_eyJ2IjoxLCJt…siKiJdfQ

Hover or focus a part of the command to see what it does.

Every command on this page matches the release (zunder-guard v1.0.0). Prefer to read first? curl -fsSLO https://zunder-design-preview.pages.dev/i && less i, then sh i --rules …. Or verify by hand: Verify a release.

Check it, then point your bot at it

On the machine where Guard runs:

curl -fsS http://127.0.0.1:8547/healthz# {"status":"ok"}: Guard is upcurl -fsS http://127.0.0.1:8547/guard/status# version, mode, network, account and state, read-only

The default rules are: 5x leverage, 2% loss at the stop, no stop: Guard sets one 2% away, liquidation at least 10% away, a position at most 200% of equity, 6% open risk, 6% daily loss stop, 25% drawdown halt, all markets. The format is on Rules codes.

The setup prints a client key for your bot. The client key is not your API wallet key. Hyperliquid does not accept it. Only your Guard does. Guard listens on http://127.0.0.1:8547, on your machine only.

One setting changes: the API URL. The private key becomes the client key the setup printed.

from eth_account import Account
from hyperliquid.exchange import Exchange
client_key = Account.from_key("0x...") # the client key Guard printed
exchange = Exchange(client_key, base_url="http://127.0.0.1:8547",
account_address="0xYourAccountAddress")

Guides for ccxt, Freqtrade, the TypeScript SDK, MCP and TradingView are under Integrations.

Send one order your bot would normally send. In paper mode the answer your bot gets says what Guard would have done: Zunder Guard paper mode: would resize [resized]: … (nothing was sent). To see Guard’s state and its decisions:

Terminal window
curl -s http://127.0.0.1:8547/guard/status # mode, risk state, positions, alerts
curl -s 'http://127.0.0.1:8547/guard/events?since=0' # every decision, with its rule and code

You see the decision (allow, resize or veto), the rule that decided, and what would have been sent. Nothing reached Hyperliquid, because this is paper mode. The fields are listed in Events.

  • Testnet sends real orders to Hyperliquid testnet with test money. Use it to see stops rest on the venue and fire.
  • Mainnet needs you to type the network and confirm the account. Guard never moves there by itself.

Details: Paper, testnet and mainnet.

This page as plain Markdown, for people and LLMs: /docs/start/quickstart.md