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.
1. Install and set up, with your rules
Section titled “1. Install and set up, with your rules”Pick where Guard runs. 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.
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
Markets are set on the playground. Your rules are saved in this browser and used everywhere on this site.
Where Guard runs
Next to your bot. If your bot runs on a server, Guard runs on the same server.
Other ways to run it: Docker · One-click · Packages.
Ubuntu 24.04 or Debian 12 is best: the key is stored encrypted with systemd-creds. No port is opened; Guard listens on 127.0.0.1:8547.
Any machine with Docker: linux/amd64 or linux/arm64. The state, including the key, lives on a named volume. Details: Docker.
On your own account at the platform; we never see the server. Its operators could in principle read Guard's state: use an account holding only what you are willing to lose. Details: One-click templates.
Secrets: typed on the server, 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.
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
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
$ brew install zunderlabs/tap/zunder-guard✓ zunder-guard 1.0.0 installed (checksum from the signed release) 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 · 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 from your computer
One command with your rules. It connects to your server, installs Guard after checking its signature, and asks you the rest there.
brew install zunderlabs/tap/zunder-guardzunder-guard init --interactive --rules zr1_eyJ2IjoxLCJt…siKiJdfQbrew services start zunder-guard Hover or focus a part of the command to see what it does.
Prefer to read first? curl -fsSLO https://zunderlabs.com/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# 200 and "ok": Guard is upzunder-guard status# mode, rules, risk state, the last decisions 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.
2. Point your bot at Guard
Section titled “2. Point your bot at Guard”One setting changes: the API URL. The private key becomes the client key the setup printed.
from eth_account import Accountfrom hyperliquid.exchange import Exchange
client_key = Account.from_key("0x...") # the client key Guard printedexchange = Exchange(client_key, base_url="http://127.0.0.1:8547", account_address="0xYourAccountAddress")filled in from your settings ·
Guides for ccxt, Freqtrade, the TypeScript SDK, MCP and TradingView are under Integrations.
3. Send an order and read the answer
Section titled “3. Send an order and read the answer”Send one order your bot would normally send. Then:
zunder-guard statusYou see the decision (allow, resize or veto), the rule that decided, and the journal entry. Nothing reached Hyperliquid, because this is paper mode.
Next: testnet, then mainnet
Section titled “Next: testnet, then mainnet”- 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