Skip to main content

Quick Start

featherbit needs two YAML files to start: system.yaml (listener, timeouts, logging, admin API) and gateway.yaml (routes and policies). The repository ships working examples in the config/ directory, wired to a small echo backend used for development.

Run from Docker Hub

The fastest path — multi-arch images (amd64/arm64) are published to Docker Hub:

docker run --rm -p 8080:8080 -p 9090:9090 featherbit/featherbit

The image ships the example config baked in at /etc/gateway/; mount your own system.yaml/gateway.yaml over it for real use. Tags: latest (newest release), edge (tip of develop), X.Y.Z (pinned releases) — each also available with a -headless suffix (no embedded web UI, admin REST API only). See Deployment for compose and production setups.

Run locally

cargo build
cargo run -- --system-config config/system.yaml --gateway-config config/gateway.yaml

Both flags default to config/system.yaml and config/gateway.yaml, so from the repository root cargo run alone works too.

Once started, the gateway listens on two ports:

PortPurpose
:8080Data plane — client traffic matched against your routes
:9090Admin API and embedded web UI (HTTP Basic Auth, default admin/admin)

The default gateway.yaml proxies /api/* to an echo backend on localhost:3000. Start it in another terminal so upstream calls succeed:

python dev/echo-backend/server.py

Run with Docker Compose

docker compose up

This starts the gateway (ports 8080 and 9090, with config/ mounted into the container) and the echo-backend — a minimal HTTP server that echoes the method, path, and headers it receives back as JSON. Environment variables in the compose file (ECHO_BACKEND_HOST, ADMIN_PASSWORD, ...) are interpolated into the YAML config via the ${VAR:-default} syntax.

Send a request

The default route matches path: /api/* and applies a policy that strips the /api prefix before forwarding to the echo backend:

curl http://localhost:8080/api/users

The echo backend answers with a JSON view of what it actually received — note the stripped path:

{
"method": "GET",
"path": "/users",
"headers": {
"host": "localhost:3000",
"accept": "*/*"
}
}

This makes it easy to verify exactly which path and headers your routing policy delivered to the upstream.

Open the web UI

open http://localhost:9090

Log in with the admin credentials (default admin/admin) to see the node-graph editor. Select the echo-api route in the sidebar to view the policy you just exercised as a visual graph.

Next steps

Continue with Your first route to add a route and policy of your own, or read Architecture to understand what happened between curl and the echo response.