Devin Connect is currently in early access. Features and configuration may change. Reach out to your Cognition account team if you are interested in early access.
What Devin Connect does
Devin Connect has two parts, and they are configured independently. A policy proxy inside your network. The Gateway is an HTTP CONNECT proxy with a default-deny allowlist. It accepts a connection request forhost:port, checks it against your routes, resolves the name with your own DNS, dials the destination, and relays opaque bytes. Neither the Gateway nor Devin infrastructure terminates or inspects the TLS between the Devin VM and your service, and every connection is audit logged.
A private path from Devin to that proxy. Devin has to reach the proxy without either side exposing anything to the public internet. There are two ways to do that, and the proxy behaves identically under both:
- Reverse tunnel: the Gateway dials outbound to a Devin-side endpoint over TLS and Devin sends connection requests back down that tunnel. Nothing is opened inbound to your network, and no cloud-provider integration is needed.
- AWS PrivateLink: you front the Gateway with a Network Load Balancer and a VPC Endpoint Service, and Cognition consumes it with an Interface VPC Endpoint in your dedicated tenant VPC. Traffic stays on the AWS backbone and Devin dials the Gateway directly over private IPs.
- Dedicated single-tenant VPC. Your Devin deployment runs in its own VPC (see the Customer Dedicated Deployment model). Devin VMs send traffic for your routed destinations toward the Gateway via Cognition-configured egress control.
- Default-deny, enforced twice. Routes are enforced on the Gateway and on the Devin side, so a config-only change on one side cannot widen access. Routing a destination never widens a session’s permissions: the session’s security profile still has to allow it.
- Your application TLS is end-to-end. The Gateway forwards opaque byte streams.
- DNS stays inside your network. Route targets are resolved by your resolvers (the Gateway host’s system resolver by default, or nameservers you configure).
- One deployment covers every routed destination. You add hostnames and IPv4 ranges in Devin settings rather than building per-service plumbing.
Choosing a connectivity mode
Configure Devin Connect
Configuration happens in the Devin web app in both modes, on the “Devin Connect” page in enterprise settings, available to users with the appropriate admin role. An account can have several gateways, each routing its own group of destinations: at most one reverse-tunnel gateway, plus any number of PrivateLink gateways.- Choose “Add gateway”, give it a name, and pick a connection: “Tunnel” for the reverse tunnel, or “Direct” for AWS PrivateLink. For “Direct”, also enter the interface endpoint’s DNS name and port (see the AWS PrivateLink tab).
- On the gateway’s card, choose “Add destination” for each destination Devin should reach through it: an exact hostname, or an IPv4 address or CIDR such as
10.20.0.0/16. Wildcards are not supported. A destination can belong to only one gateway. - For a tunnel gateway, choose “Generate token” to enroll it. The enrollment token is shown once, is never stored by Devin, and can be rotated or revoked at any time with “Regenerate token”. Direct gateways have no tunnel to authenticate, so this step does not apply.
- For a tunnel gateway, copy the deployment snippet for your platform (Docker, Kubernetes, AWS ECS, Terraform on ECS or EC2, or a Linux host). The snippet contains a ready-to-run
config.yamlbuilt from the gateway’s destinations, so re-copy it after changing them.
Hostname and IPv4 destinations
- Hostnames are matched on the name the session connects to, read from the TLS SNI or the HTTP
Hostheader. They therefore route TLS and plain HTTP traffic only. The Gateway resolves the name with your DNS. - IPv4 addresses and CIDRs are matched on the destination IP of the connection, so they route any TCP protocol, including SSH and database connections. Devin does not resolve your internal names for these routes: sessions connect by IP address, or you provide name resolution in the environment, for example
/etc/hostsentries set up in your blueprint.
config.yaml, allow IPv4 destinations with ipv4 rules; the generated snippet includes them.
Connectivity modes
- Reverse tunnel
- AWS PrivateLink
Outbound-only connectivity from the gateway in your network to your dedicated Devin VPC
<customer>.gateway.devinenterprise.com:443. You never open an inbound port. A registered tunnel only carries streams that the Devin side opens toward your Gateway; it is not an inbound path into Devin.Enrollment works like this:- Devin issues you an enrollment token for the tunnel gateway from the “Devin Connect” settings page.
- You install the token on the Gateway host at the path
tunnel.auth_token_filepoints to. - The Gateway dials
<customer>.gateway.devinenterprise.com:443, verifies the Devin edge’s server certificate, and presents the token. - The edge validates the token (constant-time comparison against a stored digest; the raw token is never stored on the Devin side) and registers the tunnel. Devin-side dials for the gateway’s destinations then flow through it.
tunnel stanza and no listen address, so the Gateway host exposes no proxy port at all:Additional checklist items for this mode:
- Allow egress from the Gateway to
<customer>.gateway.devinenterprise.com:443and to your allowlisted internal services. No inbound rules are needed. - Store the enrollment token in your secret manager and mount it as a file. Never bake it into images, config under version control, or logs; the Gateway never logs it.
- Optionally provide Cognition your egress CIDR ranges to restrict the public endpoint at the IP level (defense in depth; the enrollment token remains the authentication gate).
Configuration reference
The Gateway is configured with a single YAML file, strictly validated and fail-closed: a config that fails validation is rejected as a whole and the previous config stays active. The file is polled every 5 seconds and hot-reloaded.Routes (allowlist)
Anything not matched by a route is denied; an empty route list denies everything. Routes are evaluated in order and the first match wins.
Hostnames are matched as requested, before DNS resolution, so policy applies to the name rather than whatever IP it happens to resolve to.
Listeners
DNS
Hostname routes are refused if your DNS resolves them to loopback, link-local, or unspecified addresses, so an allowlisted name cannot be steered at the Gateway host itself or a metadata endpoint.
Running the Gateway
The Gateway ships as a container image containing a single static binary (the image is builtFROM scratch and runs as a non-root user). Mount the config at /etc/devin-gateway/config.yaml, and in tunnel mode the token file wherever tunnel.auth_token_file points.
admin_listen:
/healthzfor process liveness./readyzfor readiness./metricsfor Prometheus metrics.
- Run the Gateway in a private subnet.
- Wire
/healthzand/readyzinto your orchestrator’s health checks. - Keep each gateway’s destinations in Devin settings and the routes in its Gateway config in sync; a destination allowed on only one side is not reachable.
Logging and SIEM integration
The Gateway logs to stdout. When stdout is not a terminal (the normal case in a container) logs are emitted as JSON lines, ready for machine consumption. To get them into your SIEM, use your platform’s standard log pipeline: the container log driver or agent (CloudWatch Logs, Fluent Bit, Vector, Datadog agent, and so on) collects stdout and forwards it like any other workload’s logs. The Gateway needs no SIEM-specific configuration. Connection audit events include:conn_openandconn_close, with destination host and port, matched route name, client address, bytes transferred in each direction, and duration.deny, with the destination and reason (for example, no matching allowlist route).

