The monorepo
The workspace globsapps/*, services/*, packages/*, and contracts. Every member is private, ESM, and named @utter/<dir>. viem is pinned repo-wide to a single version so every chain-touching package speaks the same client.
There is no mainnet. Utter targets Arc Testnet (chain id
5042002) only. USDC 0x3600…0000 is both the 6-decimal ERC-20 and the 18-decimal native gas token, so every package reads decimals() at runtime rather than hardcoding it.Apps
Services
Packages
Contracts
contracts is a Foundry/Solidity project: ResourceRegistry, PaymentEscrow, StakingVault, PaymentSplitter, and reference ERC-8004 registries. These are already deployed on Arc Testnet; see Self-hosting the stack for the redeploy caveat.
The network topology
The sandbox is not onlyrunsc. The docker-compose stack splits the running services across several networks, most of them internal: true, so that no container can reach anything it has no business reaching. The untrusted handler and the trusted sidecar are two separate containers per resource: the handler holds no secrets and no facilitator token, and it can only talk outward through the data proxy.
edge
edge
The only externally reachable network. Traefik lives here with external egress and the wildcard TLS certificate for
*.resources.<domain>.ingress (internal)
ingress (internal)
Traefik to the per-resource sidecar. No gateway, so nothing on this network reaches the internet.
controlplane (internal)
controlplane (internal)
The sidecar to the facilitator. This is where the money path is spoken; the untrusted handler is not on it.
proxynet (internal)
proxynet (internal)
The handler to the data proxy. The handler’s only egress path, and it is deny-by-default.
upstreamnet (internal)
upstreamnet (internal)
The data proxy to its allowed upstreams, and the facilitator to the Arc RPC endpoint.
redisnet (internal)
redisnet (internal)
Redis and the data proxy.
backendnet (internal)
backendnet (internal)
Postgres, the facilitator, and the marketplace.
The handler and sidecar being two containers is the point. A compromised handler holds nothing worth stealing and has no route to the facilitator, the chain, Postgres, or Redis. The trust boundary is enforced by the network split, not by convention. See egress and the static gate.
Where to go next
The deploy pipeline
The ordered steps a bundle runs through, from auth to a running paid endpoint.
Provisioning a host
The gVisor host, wildcard TLS, durability, and the systemd deployer.
The sandbox
How untrusted generated code is isolated at runtime.
Self-hosting the stack
The practical run shape: install, env, test, compose up.