Run the demo
The fastest path from git clone to "decisions tailing in my terminal":
git clone https://github.com/teslashibe/permafrost.git
cd permafrost
make demo
That's the whole quickstart. Idempotent -- re-running attaches to the
existing demo agent rather than duplicating it. SIGINT to stop the tail;
the daemon keeps running until make demo-clean.
Bittensor flavour: make demo-bittensorβ
Want to see real on-chain trades against a local Bittensor chain instead of a paper-mode noop agent? Run:
make demo-bittensor

This spins up everything make demo does PLUS a subtensor-localnet container, bootstraps a fresh tradeable subnet, and recruits three live-mode trading agents:
- π§ Tao β
alpha_dca(DCA into the bootstrapped subnet) - π§ Mo β
alpha_momentum(rotation across subnets by momentum) - π§ Yumi β
alpha_yield(volatility-stability rebalance)
Within a couple of minutes, the agents have submitted real add_stake_limit extrinsics and the on-chain TotalHotkeyAlpha storage shows alpha credited to the trader's hotkey. Tear down with make demo-bittensor-clean. Full walkthrough: Bittensor alpha tokens.
What make demo doesβ
The script (scripts/demo.sh) is short and readable. In order:
- Preflight. Confirm
docker+goare present. (If the daemon is already running on port 8080, the composeupstep will fail loudly -- runmake downor stop the existing process first.) - Build binaries.
bin/permafrost+bin/permafrostdif missing or stale. Cheap mtime-newer-than-binary check. - Compose stack.
docker compose up -dfor Postgres + permafrostd. Waits up to 30s for the daemon health endpoint. - Init wizard (
permafrost init --non-interactive) writes config- a fresh 64-hex-char keystore passphrase to
.permafrost-demo/(gitignored, isolated from your real~/.permafrost/).
- a fresh 64-hex-char keystore passphrase to
- Source the env file to load the passphrase into the shell.
- Doctor preflight -- bails out with a clear message if any check fails hard. Warnings (no inference key, etc.) don't fail the run.
- Recruit Pip -- paper-mode
noopagent,--alloc 1000,--tick-secs 5. Reused on re-run via name lookup so you don't get duplicate agents. - Mark Pip runnable and tail decisions every 2s until SIGINT.
Output is themed for the project -- see the cast.
Sample outputβ
β Permafrost demo -- launching expeditionβ¦
β preflight: docker + go present
β binaries built (./bin/{permafrost,permafrostd})
β stack up (Postgres + permafrostd)
β config: .permafrost-demo/config.yaml
β keystore unlocked (passphrase from .permafrost-demo/env)
Permafrost preflight βββββββββββββββββββββββββββββββββββββββββββ
β go version go1.25.5
β docker 28.0.0
β config loaded env=dev
β database reachable postgres://REDACTED@localhost:5432/...
β keystore passphrase env PERMAFROST_KEYSTORE_PASSPHRASE set
β inference providers none configured
β solana RPC not configured
β strategies registered dca_buy, market_maker_basic, noop
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Pip is on the ice
β π§ The Floe -- funding rates
[tick 1] confidence=0.00 swaps=0 orders=0 notes="noop"
[tick 2] confidence=0.00 swaps=0 orders=0 notes="noop"
β¦
Teardownβ
make demo-clean
Stops the docker stack and removes .permafrost-demo/. Your real
~/.permafrost/ (if you've gone past the demo) is untouched.
Troubleshootingβ
- Port 5432 already in use. Another Postgres container is bound.
docker ps | grep 5432to find it; stop it or move it before re-running. - Port 8080 already in use. Another service is bound. Same fix.
- Daemon health-wait times out. The 30-second wait is rarely
enough on a very slow Docker host. Re-run
make demo; the script picks up where it left off without rebuilding.
Next stepsβ
- The init wizard + doctor -- for
driving the same setup steps interactively without
make demo. - Running noop -- manual end-to-end walkthrough.
- Configuration reference.