How routes work
- A route selects a room or managed agent backend.
- Each room route path targets either a published service port with
targetPortor room storage withtargetContent. - When a request arrives, MeshAgent chooses the longest matching path and applies that target’s security and response options.
- Service targets are proxied to the published port. Content targets are read directly from room storage.
Create a route
Use a MeshAgent-managed domain such as*.meshagent.app:
- Deploy a service that exposes an HTTP endpoint and marks its port as published.
- Create a route:
- The route is ready as soon as it is created.
Serve room content directly
UsetargetContent when a site already exists in room storage and does not need an application server. subpath is relative to the room storage root; the matched public route path is removed before the remaining request path is appended.
For a single content path, create the route directly from the CLI:
--path /docs to mount the content below a public URL path, --iap to require identity-aware access, and meshagent route update with the same options to change an existing route. --room-path is an alias for --content-path.
websites/docs/logo.svg as /logo.svg. With index: true, requests for the route root and directories serve index.html, such as websites/docs/index.html and websites/docs/guide/index.html.
Content routes support GET, HEAD, and CORS preflight OPTIONS requests. CORS rules use the familiar object-storage controls for allowed origins, methods, and headers, exposed response headers, preflight cache age, and credentials. Credentialed CORS rules must list explicit origins rather than *.
Web serving requires MeshAgent’s built-in GCS or local-filesystem room storage provider. Other room storage implementations are rejected with unsupported room storage type: X for web serving rather than being accessed through a running room.
compression accepts brotli, gzip, or none and defaults to brotli. Compression is negotiated with the request’s Accept-Encoding header; clients that do not advertise the selected encoding receive the original content.
Set iap: true to protect the content with MeshAgent’s identity-aware proxy. The router authenticates the IAP session and checks room site access before reading the file. CORS preflight responses do not expose file content and do not require an IAP cookie.
A route can mix service and content targets on different paths. Each individual path must set exactly one of targetPort or targetContent.
Mark the port as published
In your service config, the HTTP port must be marked as published:Public and private published ports
published: true makes a port routable from a route.
public controls whether that routed URL is open to the internet or protected by MeshAgent:
public: true: MeshAgent forwards requests without requiring room authentication.public: false: MeshAgent requires the caller to authenticate before the request can reach the app.- If you omit
public, the port is treated as private.
Integrated security for browser apps
For browser-based apps, use cookie validation so MeshAgent behaves like an identity-aware proxy in front of your route. This is the easiest way to publish a private app without making the app itself handle MeshAgent tokens directly.meshagent.request.validation.method: cookie on the port or on a specific endpoint. Endpoint annotations override port annotations.
With that configuration, the request flow looks like this:
- A user visits the routed URL.
- If they do not already have a valid MeshAgent IAP session for that route, MeshAgent redirects the browser to sign in.
- After sign-in, MeshAgent stores a secure, HTTP-only session cookie and retries the request through the route.
- On each request, MeshAgent validates that the session still maps to a participant token for the target room.
- If the user is not allowed in the room, the request is rejected before it reaches your app.
GET requests are redirected into the login flow automatically. Non-GET requests without a valid session are rejected until the browser has signed in.
Headers your app receives
When a request passes through cookie-based IAP, MeshAgent removes the internal__meshagent_iap cookie before forwarding the request to your app and adds trusted identity headers:
These headers are intended for the destination app to consume.
MeshAgent also strips any client-supplied
X-MESHAGENT-USER or X-MESHAGENT-API-SCOPE headers before forwarding the request, so callers cannot spoof them without actually going through MeshAgent IAP.
Queue-backed routes
Routes are not limited to proxying traffic into an HTTP app. They can also turn incoming HTTP requests into queue messages for agents or workers inside the room. This is useful when you want:- a stable public URL
- no always-on HTTP app inside the room
- an internal queue that workers can process asynchronously
meshagent.request.queue is configured on the matched port or endpoint, MeshAgent enqueues the request body instead of proxying the request to a destination app.
- A request arrives at the route.
- MeshAgent validates the caller using the configured route auth method.
- If validation succeeds, MeshAgent publishes the request body to the queue.
- MeshAgent returns
202 Accepted.
Required annotations
You can place these annotations on the port or on a specific endpoint. Endpoint annotations override port annotations.
Secret-backed validation
The validation secret is not copied into the route itself. Instead, MeshAgent reads it from room secrets at request time and uses it to verify the incoming webhook or signed request before anything is placed on the queue. This keeps the shared secret inside the room security boundary while still letting you publish an external URL. Supported validation methods currently include:githubsalesforcesentryslackshopifystripetelegramtwiliowhatsappzendesk
What to store in the room secret
Store the provider’s original shared secret value in the room secret. Do not store:- the incoming signature header value
- a computed HMAC or digest
- a JSON wrapper object unless the provider explicitly gives you a plain secret inside it
Queue-backed validated routes must remain non-public. They are intended for authenticated or signature-validated ingress handled by MeshAgent, not open anonymous forwarding.
Liveness and startup behavior
liveness is the HTTP path MeshAgent uses to decide when a published port is actually ready to serve traffic.
liveness URL and waits for it to return 2xx. Once the service is live, MeshAgent retries the original request.
This matters during startup, cold starts, and restarts:
- With a liveness URL, MeshAgent can wait for the app to finish booting instead of immediately failing the first request.
- Without a liveness URL, an early request is more likely to fail with a bad gateway while the process is still starting.
- Cheap to evaluate.
- Available without external user auth.
- Wired to real readiness, not just process start.
/healthz or /ready returning 200 only after the app is ready to serve the same traffic the route will send.
Manage routes
route list table includes each public path, service port or room content path, index, iap, compression, and CORS rules. Use meshagent route list --output json or meshagent route get DOMAIN for the complete RouteSpec, including routes with multiple path targets.
To create or update a route, you need permission to administer the target room.