Skip to main content
Tascarrel is alpha software and may break. We’re looking for your feedback — share it on GitHub.
Documentation

Control Network Access

Tascarrel routes pod traffic through a host-enforced policy layer. The default action is allow, but only destination ports 80 and 443 are enabled, and local or private addresses remain blocked unless allow-local is set.

Restrict Egress

[network]
default = "deny"
allow-local = false
allow-hosts = [
  "api.github.com",
  "*.npmjs.org",
]
allow-addresses = ["1.1.1.1"]
allow-ports = [80, 443]
deny-hosts = ["telemetry.example.com"]

Address and hostname deny rules take precedence. Hostname rules apply to inspected HTTP and HTTPS traffic. *.example.com matches subdomains, not the bare hostname.

The host daemon reloads network configuration after a short debounce period. Each new TCP flow uses the latest valid policy snapshot; active flows continue with the snapshot they received when they started. An invalid edit retains the last valid snapshot. If the configuration is already invalid when the workspace starts, new flows use deny-all until the configuration becomes valid.

Open Workspace → Network → DNS Requests, HTTP Requests, and TCP Flows to see the requesting pod, destination, mediated request method and path, secret-injection state, policy decision, and connection state. Query strings and secret values are not retained. These diagnostic records are not packet captures.

Current external network support is limited to TCP and captured DNS. Arbitrary UDP and external IPv6 are not implemented. HTTP inspection supports HTTP/1.1, including upgrades, but not HTTP/2, QUIC, or CONNECT. HTTPS requests appear in the HTTP request log when a matching external secret-injection rule requires hostd to terminate TLS or when a host-port mapping classifies the pod-visible port as HTTPS. Other HTTPS traffic remains encrypted.

Reach a Host Service

Expose selected host-loopback services to every pod:

[network]
host-ports = [3000, "5432:15432"]
http-ports = [80, 3000]

An integer maps the same port. The string form maps <host-port>:<pod-visible-port>. Pods connect through:

host.tascarrel.internal:3000
host.tascarrel.internal:15432

The http-ports and https-ports lists classify pod-visible ports. Classified host-port connections pass through the HTTP mediator, so secret-injection rules can match host.tascarrel.internal. The mediator then forwards Host and a same-origin Origin as localhost, which presents the request as local to the host service. In this example, port 3000 is mediated while port 15432 remains a raw PostgreSQL connection.

Other ports on that synthetic address remain denied. The Pod → Host tab can add a runtime mapping for one pod; it overrides a configured mapping with the same pod-visible port.

When the server itself runs inside another isolated environment, use tascarrel --host-port-host <HOST> or TASCARREL_HOST_PORT_HOST to change the outer destination for configured mappings:

tascarrel --host-port-host host.tascarrel.internal

This affects static workspace mappings only. Dynamic pod-scoped mappings still target the machine running that hostd process.

Expose a Pod Service

Use Host → Pod or publish from inside the pod:

podctl ports publish 3000 --title "Development server"
podctl ports list
podctl ports unpublish 3000

Tascarrel assigns a host-loopback port. Add --tab when the service should also receive a visible HTTP route.

Publish a Web Route

An HTTP route assigns a local hostname to one pod port:

podctl http publish 3000 --title "Web application"
podctl http list
podctl http unpublish 3000

The UI provides the same actions under HTTP Routes. An internal route, created with --internal, stays out of normal pod tabs.

Hostd presents the route’s service with a canonical loopback authority. The route’s final hostname becomes localhost; any labels to the left become <labels>.tascarrel.localhost. This mapping is independent of whether the browser uses the local route suffix or a configured public suffix.

One route can be marked as the trusted Tascarrel frontend. Its exact origin then receives full Tascarrel API access, replacing any previously trusted route. Grant this capability only to reviewed code; sibling and nested hostnames do not inherit it.