Documentation menu
Guide

Joiner: redeem an invite and bring your machine to a swarm.

Someone on your team is the operator. They gave you two things: an invite token (looks like pp_inv_...) and a multiaddr (looks like /ip4/.../tcp/.../p2p/...). This is everything you need to plug into their swarm.

1

Install the CLI

install
$python3.11 -m venv ~/.venv/progresspals
$source ~/.venv/progresspals/bin/activate
$pip install progresspals

You don’t need a ProgressPals account as a joiner. Your invite token does the auth.

2

Initialize the local config

init
$pals init
✓ config written to ~/.config/progresspals/config.json
identity.key will be created on first server start

On your first server start (pals join), a libp2p identity key is generated that uniquely identifies your machine to the swarm. Don’t copy that key to other machines — each machine gets its own identity.

3

Redeem the invite

Pass the token via env var so it stays out of your shell history and out of /proc/<pid>/cmdline.

login
$export PROGRESSPALS_INVITE_TOKEN=pp_inv_...
$pals login
✓ peer credential stored
Once you see peer credential stored, the operator’s servers have your peer ID on their allow-list. There’s a ~30-second propagation delay before all servers refresh — wait a beat before joining.
4

Join the swarm

Use the multiaddr from the operator. Pass the same model id the operator is running.

join
$pals join meta-llama/Llama-3.1-8B \
--peer /ip4/HOST/tcp/PORT/p2p/PEER_ID
✓ joined swarm · holding layers 15–47

The first time you run this for a model, the CLI downloads only your assigned layer slice — typically a few GB rather than the full weights.

5

(Optional) watch what’s happening

dash
$pals dash

pals dash shows the peer list, invite state, and overall status. Useful for confirming the swarm is healthy.

If it doesn’t work

  • pals login says “invite token is invalid”: token might be expired or already fully used. Ask the operator for a fresh one.
  • pals join hangs on “connecting to peer”: the operator’s server may be loopback-only (not --public) or behind a NAT that doesn’t allow inbound. Confirm with the operator.
  • RPCs rejected after handshake: allow-list refresh hasn’t caught up. Wait ~30 seconds and retry.

Full list at Troubleshooting.

Next steps