Connic

Reach private services.
No inbound ports.

An outbound-only tunnel from your VPC to Connic. Agents call internal Postgres, S3, and HTTP APIs. No firewall holes, no public IPs, no compromise.

Read the bridge docs

Bridges

Production VPCconnected
last seen 2s ago
Bridge ID
bridge_8f3a2c91d4e6
Run on your network
docker run -d --name connic-bridge \
  -e BRIDGE_TOKEN=••••••••••••••••
  -e ALLOWED_HOSTS=postgres:5432,kafka:9092 \
  connicorg/bridge:latest
The architecture

Outbound only. Always.

The bridge agent runs inside your private network and opens an outbound WebSocket connection (WSS) to the Connic relay. No inbound ports. No firewall changes. No public IPs for your private services.

Connic Cloud
Where your agents run
outbound WSS
WSS · token auth
Bridge Agent
In your VPC
reaches your private services
postgres:5432
kafka:9092
internal HTTP
No inbound ports
No public IPs
No firewall holes
Three steps to a private bridge

From zero to first call

Create a bridge in Project Settings, run a Docker container in your network, and reach private services from any connector, custom LLM provider, tool, or middleware.

1In the dashboard, open Project Settings › Bridge, click Add Bridge, name it, and copy the token (shown once).
2Run the bridge agent inside your private network
terminal
docker run -d --name connic-bridge \
  -e BRIDGE_TOKEN=cbr_your_token_here \
  -e ALLOWED_HOSTS=kafka:9092,postgres:5432 \
  connicorg/bridge:latest
3Reach a private service from a custom tool by addressing it as <target>.cnc-bridge-<bridge_id>
tools/lookup_order.py
# tools/lookup_order.py
import psycopg

BRIDGE_ID = "abc123"  # copy from Project Settings > Bridge

def lookup_order(order_id: str):
    with psycopg.connect(
        host=f"postgres-primary.cnc-bridge-{BRIDGE_ID}",
        port=5432, dbname="orders", user="reader", password="...",
    ) as conn:
        return conn.execute(
            "SELECT data FROM orders WHERE id = %s", (order_id,)
        ).fetchone()
The security model

What your security team will ask about

Bridges are designed to pass a security review on the first pass. The properties below are the ones reviewers ask about first.

Outbound only

The bridge initiates the connection. Connic never connects in. No inbound ports need to be opened on your network.

Per-bridge tokens

Each bridge has its own token tied to a single Connic project. Rotate tokens any time from the dashboard, and run multiple bridges in different networks for the same project.

Allowed hosts

The bridge's ALLOWED_HOSTS env var enumerates exactly which host:port targets it may connect to. Anything else is rejected at the bridge.

TLS in transit

All traffic between the bridge and the Connic relay is encrypted via WSS (WebSocket over TLS).

Frequently Asked Questions

Run it as a Docker container (image connicorg/bridge:latest) inside your private network, or install via pip (connic-bridge). Set BRIDGE_TOKEN to the token shown when you create the bridge in Project Settings, and ALLOWED_HOSTS to a comma-separated list of host:port targets it is allowed to reach. A docker-compose example is in the docs.

Three places, each set up independently. (1) Connectors: pick a bridge in the Network Access section when creating or editing a connector. (2) Custom LLM providers: pick a bridge in Project Settings > LLM Provider so internal vLLM/Ollama/LiteLLM endpoints are reachable. (3) Custom tools, middlewares, hooks, and guardrails: address private services as <target>.cnc-bridge-<bridge_id> and any standard client library will be tunnelled through.

Apache Kafka (inbound and outbound), AWS SQS (inbound and outbound), PostgreSQL (inbound via LISTEN/NOTIFY), Email/IMAP/SMTP (inbound and outbound), AWS S3 (file downloads), and HTTP Webhook (outbound callbacks).

Yes. You can create as many bridges as you need, each with its own token, to reach different networks or environments. Connectors, custom LLM providers, and tools each pick which bridge to route through.

The bridge only makes outbound connections, so no inbound firewall rules are needed. All traffic between the bridge and the Connic relay is encrypted via WSS (WebSocket over TLS). Each bridge authenticates with its own token, and rejects any target host:port that isn't in its ALLOWED_HOSTS list.

The magic <target>.cnc-bridge-<bridge_id> hostname pattern is intercepted at hostname resolution. Libraries that bypass socket.getaddrinfo (for example those built on aiodns) aren't intercepted. For HTTPS or TLS databases, override SNI / server_hostname to the real target name so it matches the certificate.