`pzp://invite` URIs are followed by any number of "commands", where each command has a name plus a fixed-length list of arguments.
## Inviting a new user to the network
**Invite URL:**
```
pzp://invite/join/HOSTFORMAT/HOST/TRANSPORT/PORT/TRANSFORM/CREDENTIALS/follow/ALICE_ID/promise.follow/account.ALICE_ID/ALICE_TOKEN
```
made of 3 "commands":
- `join/HOSTFORMAT/HOST/TRANSPORT/PORT/TRANSFORM/CREDENTIALS`
- Meaning "join" this hub at this address, claiming this token to become a member
- `HOSTFORMAT` is `ip4` or `ip6` or `dns`
- `HOST` is the host address
- `TRANSPORT` is `tcp` (or others to be supported in the future)
- `PORT` is the port number
- `TRANSFORM` is `shse` (or others to be supported in the future)
- `CREDENTIALS` is `PUBKEY.TOKEN` where PUBKEY is the hub's public key and TOKEN is the hub membership token to claim
- `follow/ALICE_ID`
- Meaning that you should follow Alice
- `promise.follow/account.ALICE_ID/ALICE_TOKEN`
- Meaning that Alice (ALICE_ID the `account`, not any single `pubkey`) promised to follow you back if you claim ALICE_TOKEN
```mermaid
sequenceDiagram
participant A as Alice
participant H as Hub
participant B as Bob
note over A: creates aliceToken
for follow promise
A->>A: publishes self-encrypted
msg about aliceToken
A->>H: ask for hub token
activate H
H->>H: create hubToken
H-->>A: hubToken
deactivate H
A->>B: Externally: send invite URL
B->>H: HTTP: open URL
activate H
H-->>B: HTML with PZP invite URI
deactivate H
B->>B: open PZP app
note over B: parse URI and detect 3 commands
note over B: execute command "join"
B->>H: connect with hubToken in SHSe
activate H
H->>H: add Bob as member
H-->>B: OK
deactivate H
note over B: execute command "follow"
B->>B: follow aliceID
B->>H: muxrpc: connect to anyone online
and try to replicate aliceID
H-->>B: OK
note over B: execute command "promise.follow"
alt If some pubkey of aliceID is online
B->>A: connect with SHS
activate A
B->>A: muxrpc: promise.follow(aliceToken, bobID)
A->>A: detect aliceToken,
apply followback on bobID,
delete aliceToken
A-->>B: OK
deactivate A
end
```
## Inviting a new device to my account
**Invite URL:**
```
pzp://invite/join/HOSTFORMAT/HOST/TRANSPORT/PORT/TRANSFORM/CREDENTIALS/tunnel-connect/HUB_PUBKEY/OLD_PUBKEY/promise.account-add/peer.PUBKEY/OLD_TOKEN/promise.account-internal-encryption-key/peer.PUBKEY/OLD_TOKEN
```
made of 3 "commands":
- `join/HOSTFORMAT/HOST/TRANSPORT/PORT/TRANSFORM/CREDENTIALS`
- Meaning "join" this hub at this address, claiming this token to become a member
- `HOSTFORMAT` is `ip4` or `ip6` or `dns`
- `HOST` is the host address
- `TRANSPORT` is `tcp` (or others to be supported in the future)
- `PORT` is the port number
- `TRANSFORM` is `shse` (or others to be supported in the future)
- `CREDENTIALS` is `PUBKEY.TOKEN` where PUBKEY is the hub's public key and TOKEN is the hub membership token to claim
- `tunnel-connect/HUB_PUBKEY/OLD_PUBKEY`
- Meaning that you should connect to the old device via a tunnel in the hub
- `promise.account-add/peer.PUBKEY/OLD_TOKEN` TODO implement with peer.PUBKEY
- Meaning that the old device promised to add your pubkey if you claim OLD_TOKEN
- `promise.account-internal-encryption-key/peer.PUBKEY/OLD_TOKEN` TODO implement
- Meaning that the old device promised to send you the internal encryption key
```mermaid
sequenceDiagram
participant O as Old device
participant H as Hub
participant N as New device
note over N: instruct user to create
an invite on the old
note over O: creates oToken
with account-add perm
O->>H: ask for hub token
activate H
H->>H: create hubToken
H-->>O: hubToken
deactivate H
O->>N: Externally: send invite URL or URI
N->>N: input URL or URI
note over N: parse URI and detect 3 commands
note over N: execute command "join"
N->>H: connect with hubToken in SHSe
activate H
H->>H: add New as member
H-->>N: OK
deactivate H
note over N: execute command "tunnel-connect"
alt If old pubkey is online
N->>O: connect with SHS
activate O
note over N: execute command "promise.account-add"
N->>N: consent = sign(":account-add:ACCOUNT_ID", new privkey)
N->>O: muxrpc: promise.accountAdd(oToken, new pubkey, consent)
O->>O: detect oToken,
apply account-add on New,
delete oToken
O-->>N: OK
deactivate O
else If Old is offline
N->>O: connect with SHS
O-->>N: Failure
end
```