How operation services work¶
Planned for Waveshift 0.5
This page describes how per-operation chat and map services are designed to work. See What's coming for the overview.
An operation runs on its own Egress Server (also known as a PoP, point of presence): a private network that someone creates for that operation. Each Egress Server can have its own private messaging (Matrix) and situational awareness (TAK) servers. Only the people added to that Egress Server can reach them, and they are deleted together with it when the operation ends.
1. The big picture¶
Each Egress Server is a self-contained bubble: its own VPN, its own TAK server, its own Matrix server. The console creates and removes them.
flowchart TB
console["Waveshift Console"]
subgraph popA["Egress Server: Kestrel"]
direction TB
vpnA["VPN entry point"]
takA["TAK server"]
mxA["Matrix server"]
vpnA --> takA
vpnA --> mxA
end
subgraph popB["Egress Server: Osprey"]
direction TB
vpnB["VPN entry point"]
takB["TAK server"]
mxB["Matrix server"]
vpnB --> takB
vpnB --> mxB
end
console -- "creates and deletes" --> popA
console -- "creates and deletes" --> popB
alice["Alice's devices"] -- "Kestrel VPN" --> vpnA
bob["Bob's devices"] -- "Osprey VPN" --> vpnB
2. Creating an Egress Server¶
The person creating an Egress Server chooses who is in it and which services it has. Everything else is automatic.
sequenceDiagram
actor owner as Egress Server owner
participant console as Waveshift Console
participant pop as New Egress Server
actor user as Team member
owner->>console: Create Egress Server "Kestrel"
owner->>console: Pick team members from the user list
owner->>console: Choose services (TAK, Matrix)
console->>pop: Build the VPN, TAK server and Matrix server
console->>pop: Create a VPN config, TAK login and Matrix account for each member
console-->>owner: Egress Server ready
user->>console: Log in
console-->>user: Kestrel bundle (VPN config, TAK data package, Matrix login)
3. What each person receives¶
For every Egress Server they are in, a person gets one bundle. Everything in it belongs together and is labelled with the Egress Server's name.
flowchart LR
bundle["Kestrel bundle"]
bundle --> wg["VPN config<br/>(WireGuard app)"]
bundle --> tak["TAK data package<br/>(ATAK / iTAK / WinTAK)"]
bundle --> mx["Matrix server and login<br/>(Element or another Matrix app)"]
bundle --> ca["Waveshift certificate<br/>(so the device trusts the servers)"]
4. Being in more than one Egress Server¶
A person in two Egress Servers keeps both bundles on their device. They choose which Egress Server they are on by turning on that Egress Server's VPN tunnel; that Egress Server's TAK and Matrix then connect, and the other Egress Server's show as offline until they switch. Phones only run one VPN tunnel at a time, so this is how they already behave.
flowchart LR
subgraph phone["Alice's phone"]
direction TB
wgA["VPN: Kestrel<br/>(ON)"]
wgB["VPN: Osprey<br/>(off)"]
takAppA["ATAK: Kestrel connection"]
takAppB["ATAK: Osprey connection"]
mxAppA["Matrix: Kestrel account"]
mxAppB["Matrix: Osprey account"]
end
subgraph popA["Egress Server: Kestrel"]
takA["TAK server"]
mxA["Matrix server"]
end
subgraph popB["Egress Server: Osprey"]
takB["TAK server"]
mxB["Matrix server"]
end
wgA ==> popA
takAppA ==> takA
mxAppA ==> mxA
wgB -.-> popB
takAppB -.-> takB
mxAppB -.-> mxB
Solid lines are connected; dotted lines are waiting for the user to switch tunnel.
5. Who can see whom¶
People only see others in the same Egress Server. Someone in two Egress Servers has a separate identity in each, so they never become a bridge between them: what Alice posts in Kestrel stays in Kestrel.
flowchart TB
subgraph popA["Egress Server: Kestrel"]
aliceA["Alice (Kestrel identity)"]
carol["Carol"]
aliceA <--> carol
end
subgraph popB["Egress Server: Osprey"]
aliceB["Alice (Osprey identity)"]
bob["Bob"]
aliceB <--> bob
end
carol x--x bob
Carol and Bob cannot see or message each other. Alice can work in both, but as two separate identities.
6. Changing the team¶
Adding or removing a person updates every service in the Egress Server together. Removing someone takes away all of their access to that Egress Server at once, and nothing else they have.
sequenceDiagram
actor owner as Egress Server owner
participant console as Waveshift Console
participant vpn as Kestrel VPN
participant tak as Kestrel TAK
participant mx as Kestrel Matrix
owner->>console: Add Dave to Kestrel
console->>vpn: Create Dave's VPN config
console->>tak: Create Dave's TAK login and certificate
console->>mx: Create Dave's Matrix account
console-->>owner: Dave added, his bundle is in the console
owner->>console: Remove Dave from Kestrel
console->>vpn: Revoke Dave's VPN config
console->>tak: Revoke Dave's TAK certificate
console->>mx: Deactivate Dave's account and sign out his devices
console-->>owner: Dave removed from Kestrel only
7. The life of an Egress Server¶
Egress Servers are disposable. When one is deleted, its servers and everything stored on them are deleted with it.
stateDiagram-v2
[*] --> Building: Owner creates Egress Server
Building --> Active: Servers and accounts ready
Active --> Active: Team members added or removed
Active --> ShuttingDown: Owner schedules shutdown
ShuttingDown --> Deleted: Users warned, Egress Server deleted
Deleted --> [*]
note right of ShuttingDown
Users switch to their other Egress Servers.
Any records to keep are exported now.
end note
note right of Deleted
Servers, messages, TAK data
and VPN access are gone.
Other Egress Servers are not affected.
end note
8. Options¶
Where the servers live¶
Each Egress Server gets its own servers (the chosen approach) rather than sharing one central server split into groups. With a central server, someone in two groups can carry information from one to the other, and deleting an Egress Server does not delete its data.
flowchart LR
subgraph chosen["Chosen: servers per Egress Server"]
direction TB
p1["Egress Server Kestrel"] --> s1["Its own TAK and Matrix"]
p2["Egress Server Osprey"] --> s2["Its own TAK and Matrix"]
end
subgraph alt["Alternative: one central server"]
direction TB
q1["Egress Server Kestrel"] --> c["Shared TAK and Matrix<br/>(split into groups)"]
q2["Egress Server Osprey"] --> c
end
| Servers per Egress Server | One central server | |
|---|---|---|
| Egress Servers fully separated | Yes | Only by group settings |
| Deleting an Egress Server deletes its data | Yes | Needs a separate clean-up |
| Cost | One small server per service per Egress Server | One server |
| Same behaviour for TAK and Matrix | Yes | Differs per service |
Connecting to several Egress Servers¶
Today: one VPN config per Egress Server, switching between them. Later, possibly: one combined config that connects to all of a person's Egress Servers at once. That needs every Egress Server to use different network addresses, which the console would have to plan.
flowchart LR
subgraph now["Now: one tunnel per Egress Server"]
direction TB
d1["Device"] -- "Kestrel tunnel (on)" --> n1["Kestrel"]
d1 -. "Osprey tunnel (off)" .-> n2["Osprey"]
end
subgraph later["Later: one combined tunnel"]
direction TB
d2["Device"] -- "single tunnel" --> m1["Kestrel"]
d2 -- "single tunnel" --> m2["Osprey"]
end
| One tunnel per Egress Server (now) | Combined tunnel (later) | |
|---|---|---|
| On several Egress Servers at the same time | No, switch between them | Yes |
| Works with today's Egress Server networks | Yes | Needs non-overlapping addresses |
| Joining or leaving an Egress Server | Add or remove one config | Re-import the combined config |
| Status | Ready to build | Needs design work |