Traefik is a great reverse proxy.
asdis a smaller surface that bundles the reverse proxy with a tunnel layer, declarative manifests, and developer tools. For single-host stacks,asdis less to operate. For k8s, Traefik wins.
This is an honest comparison. Both tools route traffic. Pick the one
whose ergonomics match what you actually have to maintain.
| Traefik | asd |
|
|---|---|---|
| Reverse proxy | ✅ (Traefik) | ✅ (Caddy, embedded) |
| TLS automation | ✅ (Let's Encrypt) | ✅ (Caddy ACME + internal CA) |
| Declarative config | ✅ (file, k8s, Consul, docker labels) | ✅ (YAML manifests) |
| Hot reload of config | ✅ | ✅ |
| Kubernetes-native ingress | ✅ (first-class) | ❌ (not its problem) |
| Single-host friendly | ✅ (works) | ✅ (designed for it) |
| Tunnels bundled | ❌ (you bring ngrok/cloudflared) |
✅ (sish-compatible, in the binary) |
| Dev tools bundled | ❌ | ✅ (code-server, DbGate, ttyd, mitmproxy) |
| Number of binaries to run | Traefik + cert-manager + tunnel + dev tools | One (asd) |
| Dashboard | ✅ (built-in web UI) | Different shape (asd services, asd urls) |
| Middleware ecosystem | Huge (rate-limit, auth, retry, …) | Caddy's (smaller but growing) |
| YAML / labels syntax | Verbose (especially docker labels) | Compact (~30% the line count) |
Kubernetes-native. Traefik IngressRoute CRDs, automatic
service discovery from k8s Services, Helm charts that take an
afternoon to learn — asd does none of this and isn't trying
to.
Provider ecosystem. Traefik reads from docker labels, k8s
CRDs, Consul, etcd, ZooKeeper, plain files — pick one (or
several). asd reads net.manifest.yaml files. If you have a
provider you'd lose, that matters.
Built-in dashboard. Traefik ships a web UI that shows routers,
services, middlewares, certificates, real-time metrics. asd's
equivalent is the CLI (asd services, asd urls, asd net) —
different ergonomics, no real-time graphs.
Larger community + commercial backing. Traefik Labs sells
enterprise support. asd doesn't have an equivalent yet.
Mature middleware library. Rate limiting, retry, circuit
breakers, request transformations — all first-class. Caddy can do
most of these, but the vocabulary and the recipes are different,
and you'll sometimes need to drop to caddy.rawRoutes.
asd winsOne binary, not four. Traefik gives you the reverse proxy. To
match what asd does out of the box, you also install: a tunnel
layer (cloudflared / ngrok / your own sish setup), a
cert-manager if you're not on Let's Encrypt direct, and your
dev tools (code-server, DbGate, mitmproxy) separately. asd is
one install, one config, one process tree.
Tunnels are first-class. tunnel.public: true in your
manifest is the whole story. With Traefik you bolt tunnels on
separately, with separate auth, separate config, separate
failure modes.
The YAML is shorter. Traefik's docker-label-based config is
verbose (one label per setting, lots of escaping):
- "traefik.http.routers.my-app.rule=Host(`my-app.example.com`)"
- "traefik.http.routers.my-app.tls=true"
- "traefik.http.routers.my-app.tls.certresolver=le"
- "traefik.http.services.my-app.loadbalancer.server.port=3000"
asd's equivalent:
id: my-app
endpoint: { url: "http://127.0.0.1:3000" }
caddy:
hostRoute: { host: "my-app.example.com" }
tunnel: { public: true }
See cookbook/migrate-from-traefik
for the full translation table.
Designed for one host. asd doesn't pretend to be a
multi-cluster ingress. Routing is local; the config file lives
next to the code. No coordination layer, no etcd, no
reconciliation loop. If your stack fits on one machine (and most
do), this is a feature.
Dev tools as routes. asd database start and the DbGate UI
is a subdomain on your tunnel. Same for code-server, ttyd,
mitmproxy. With Traefik you'd configure each separately.
asdPick Traefik if you're on Kubernetes, you need its provider
variety (Consul / k8s CRDs / etcd), you want the dashboard, or
you need a specific Traefik middleware Caddy doesn't have an
equivalent for.
Pick asd if you're on a single host (or a handful), you
want tunnels + reverse proxy + dev tools out of one binary, you
want config that fits in one repo, or you're tired of writing
20 docker labels for one route.
You'd be fine with either is the truth for a lot of small
stacks. The decision usually comes down to "do I want one
binary or several" and "am I going to k8s eventually".
cookbook/migrate-from-traefik — Traefik labels → asd manifests, side by side.compared/vs-cloudflare-tunnel, compared/vs-tailscale-funnel.learn/01-hello-world.