Skip to content

Guides

Expose services

Mesh devices can always reach each other at device.mesh:port — no setup needed. Use jalth serve when you need public internet access with HTTPS, edge protection, and optional identity gates.

Direct meshjalth serve
AccessMesh members onlyAnyone (or restricted via --allow)
HTTPSNo (raw TCP)Yes (Universal SSL)
CDN/WAF/DDoSNoYes, included free
Identity gateNoOptional --allow policies
SetupNoneOne command
Terminal window
jalth serve nginx --port 8080

Creates:

  • Public URL: https://nginx.myteam.com
  • Cloudflare Tunnel route to localhost:8080
  • Proxied DNS CNAME + Universal SSL certificate
Terminal window
jalth serve grafana --port 3000 --allow group:devs
jalth serve api --port 3000 --allow email:alice@team.com --allow group:engineers

Only matching identities can access the URL. Powered by Cloudflare Access.

Terminal window
# TCP protocol (e.g. database)
jalth serve postgres --port 5432 --proto tcp
# List all services across the mesh
jalth serve ls
# Stop a service
jalth stop nginx
# Ephemeral public URL (no domain, no Access)
jalth serve demo --port 3000 --quick

Publishing on {name}.{domain} requires a mesh domain. Set during init or later:

Terminal window
jalth domain set myteam.com

Without a domain:

  • SSO admin (interactive) — Inline zone picker lists your Cloudflare zones.
  • Headless / non-admin — Offers a quick tunnel as a fallback.
  • Non-interactive — Fails with a structured error; pass --quick or set domain first.
  1. Ensures a cloudflared tunnel exists on this device (created lazily on first serve)
  2. Worker creates tunnel ingress rule, DNS CNAME, and Access app (if --allow set)
  3. cloudflared starts routing traffic from the edge to your local port
Terminal window
jalth stop nginx

Removes tunnel ingress, DNS record, and Access app. The underlying tunnel persists for other services on the same device.