Skip to main content
Utter is a single pnpm workspace of TypeScript packages and Solidity contracts. The whole platform is here: the creator studio, the discovery service, the money path, the sandbox runtime, and the on-chain contracts. This page maps every member and shows how the running services are wired into networks that are themselves part of the isolation model.

The monorepo

The workspace globs apps/*, 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 only runsc. 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.
The only externally reachable network. Traefik lives here with external egress and the wildcard TLS certificate for *.resources.<domain>.
Traefik to the per-resource sidecar. No gateway, so nothing on this network reaches the internet.
The sidecar to the facilitator. This is where the money path is spoken; the untrusted handler is not on it.
The handler to the data proxy. The handler’s only egress path, and it is deny-by-default.
The data proxy to its allowed upstreams, and the facilitator to the Arc RPC endpoint.
Redis and the data proxy.
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.