Mesh v1 is a small, invite-only network of known operators running the same stack. Gateways provide the GraphQL API; workers do the fetching, extraction, and crawling; together you build a shared cache with clear controls and accountability.
Hosts the GraphQL API and shared cache. Usually decides the allowed domains and risk posture.
Runs the machines that actually fetch pages and extract fields. You can run multiple workers to share load.
Runs an optional verifier that checks work before it’s accepted by the gateway.
Sends GraphQL queries and benefits from the shared cache and safety controls.
Everyone uses the same --network-id. Different values can’t see each other’s gossip.
--network-id my-mesh
Gateways/workers/validators can ignore non-members with --allowed-peer.
This is the “both can veto” rule: the gateway can refuse to talk to non-members, and each operator can refuse offers from non-members.
--allowed-peer <endpoint_id_hex>
Require human review for browser/cross-origin/POST-ish @fresh work.
--require-offer-approval
--offer-approval-mode risky
--offer-approval-dir .local/approvals
Start with strict limits and allowlists until you’re confident operations are stable.
Start small:
- strict domain allowlist
- approval gate on
- low concurrency caps
--network-id value that everyone uses (e.g. acme).endpoint_id_hex; share it out of band.--allowed-peer ... on everyone’s node.
When approval is enabled, the gateway writes a pending intent file with “what will be touched + what permissions are requested”.
A human operator approves/denies that offer id. Until approved, GraphQL returns OFFER_PENDING_APPROVAL.
# list pending offers
cargo run -p wq-offerctl -- list-pending --approval-dir .local/approvals
# inspect the intent (what will be hit + what permissions it requests)
cargo run -p wq-offerctl -- show <offer_id> --approval-dir .local/approvals
# approve or deny
cargo run -p wq-offerctl -- approve <offer_id> --approval-dir .local/approvals
cargo run -p wq-offerctl -- deny <offer_id> --approval-dir .local/approvals
There are two layers:
Practically: even if a query requests a cross-origin allowlist, an operator’s egress policy can still block it. And in mesh mode, both the gateway and the operator can refuse to run the job.