A small Zig edge server for static file serving, reverse proxying, TLS termination, and operator-friendly reloads.
Releases | Support Matrix | Observability | Security | Contributing
Tardigrade is a lightweight HTTP/1.1 server and reverse proxy for deployments that want a small native binary, config-driven routing, observable runtime behavior, and predictable reloads.
It is early-stage software with a deliberately narrow stable core. The official compatibility promise is documented in the Core v1 support matrix.
- Features
- Install
- Build from source
- Quick start
- Overview
- Full documentation
- Performance
- Development
- Getting help
- About
- Static file serving with normalized path handling, range support, cache validation, and symlink escape protection.
- Reverse proxying with config-driven
locationrouting, upstream health checks, retries for safe connection-drop cases, and optional bounded streaming for larger HTTP transfers. - TLS termination for the stable HTTP/1.1 edge path.
- Hot reloads and graceful drain behavior for operator-managed deployments.
- JSON access logs, request IDs, W3C
traceparentforwarding, and Prometheus metrics at/status/metricsby default. - Request limits, rate limiting, security headers, and release-gated security regression tests.
- A native packaging path with release archives, published DEB/RPM packages, service files, checksums, SBOMs, and provenance attestation.
HTTP/2, HTTP/3/QUIC, WebSocket/SSE, ACME, FastCGI, uWSGI, SCGI, memcached, and BearClaw-specific flows exist in-tree, but they are not all part of the stable Core v1 contract. Check the support matrix before depending on a specific surface.
The fastest way to install the latest release is the official install script:
curl -fsSL https://github.com/Bare-Systems/Tardigrade/releases/latest/download/install.sh | shThe installer downloads the matching Linux release archive (x86_64 or
aarch64), verifies it against tardigrade-checksums.txt, and installs the
tardi binary (with a tardigrade compatibility alias) into
$HOME/.local/bin by default. Published archives currently cover Linux
only; macOS is not yet built or published by the release workflow (see
packaging/README.md for exact status).
Published release binaries use the default "general" TLS profile, which links OpenSSL at runtime β installing via this script or the raw archive requires OpenSSL 1.1/3.x already present on the target host, the same runtime dependency the DEB/RPM packages declare explicitly.
Other install paths:
- Download release archives directly from GitHub Releases.
- Native DEB/RPM packages (published on every release), systemd/launchd service files, and a Homebrew formula β see packaging/README.md for current status and install/build instructions.
- Build from source (see below).
Requirements:
- Zig 0.16.0
- OpenSSL development libraries on Linux, for example
libssl-devon Debian or Ubuntu - HTTP/3 is served by the built-in native Zig QUIC/H3 stack and requires no additional system libraries.
For development:
git clone https://github.com/Bare-Systems/Tardigrade.git
cd Tardigrade
zig build runFor a release-mode binary:
zig build -Doptimize=ReleaseFast
./zig-out/bin/tardi --helpWith explicit version metadata:
zig build -Doptimize=ReleaseFast -Dversion="$(git describe --tags --always)"Useful build options are documented in CONTRIBUTING.md.
Create a small static root:
mkdir -p public
printf '%s\n' '<h1>Hello from Tardigrade</h1>' > public/index.htmlCreate tardigrade.conf:
listen 8069;
server_name localhost;
root ./public;
try_files $uri /index.html;
location = /health {
return 200 ok;
}
location /api/ {
proxy_pass http://127.0.0.1:8080;
}Build and run:
zig build
./zig-out/bin/tardi run -c ./tardigrade.confThen open:
http://localhost:8069/http://localhost:8069/health
Common CLI commands:
./zig-out/bin/tardi check ./tardigrade.conf
./zig-out/bin/tardi config validate ./tardigrade.conf
./zig-out/bin/tardi validate -c ./tardigrade.conf
./zig-out/bin/tardi print-config -c ./tardigrade.conf
./zig-out/bin/tardi status -c ./tardigrade.conf
./zig-out/bin/tardi reload -c ./tardigrade.conf
./zig-out/bin/tardi stop -c ./tardigrade.conf
./zig-out/bin/tardi config initcheck performs a dry parse and semantic validation without starting listeners
or connecting to upstreams. When no path is supplied, it validates
./tardigrade.toml; pass the path explicitly when using the nginx-style
tardigrade.conf examples.
Tardigrade's stable Core v1 identity is intentionally focused: a host-native Zig HTTP/1.1 edge server and reverse proxy with predictable operator behavior. The main thread handles the non-blocking accept/event loop, while accepted connections move through a bounded worker pool for blocking TLS, parsing, proxying, and response writes.
Idle HTTP/1.1 keep-alive connections are parked off the worker pool between requests, so idle clients do not consume worker capacity. HTTP/2 multiplexes internally, and HTTP/3 is served over a built-in native Zig QUIC/H3 stack that needs no external QUIC libraries. Both HTTP/2 and HTTP/3 are tracked as experimental surfaces rather than part of the default stable release contract.
Configuration is nginx-inspired and can be checked before startup with
tardi check <config>. Runtime inspection commands such as status and
print-config are designed to make package and service deployments easier to
operate without guessing which config file or pid file is active.
| Topic | Location |
|---|---|
| Core v1 support matrix | docs/SUPPORT_MATRIX.md |
| HTTP/3 rollout and lifecycle | docs/HTTP3_ROLLOUT.md |
| Concurrency & hot-path audit | docs/CONCURRENCY.md |
| Observability | docs/OBSERVABILITY.md |
| Proxy security | docs/PROXY_SECURITY.md |
| Security test plan | docs/SECURITY_TEST_PLAN.md |
| Pentest playbook | docs/PENTEST_PLAYBOOK.md |
| Code review checklist | docs/CODE_REVIEW_CHECKLIST.md |
| Release checklist | docs/RELEASE_CHECKLIST.md |
| Packaging | packaging/README.md |
| Benchmarks | benchmarks/README.md |
| BearClaw example | examples/bearclaw/README.md |
| Security policy | SECURITY.md |
| Contributing | CONTRIBUTING.md |
| Release history | CHANGELOG.md |
Canonical benchmark runs are captured from a dedicated benchmark target, not a local laptop fallback run. Saved benchmark JSON records latency percentiles, throughput, errors, and optional target CPU/RSS samples.
| Scenario | req/s | p50 (ms) | p95 (ms) | p99 (ms) | p999 (ms) | CPU % | Peak RSS (MiB) | MB/s | Errors |
|---|---|---|---|---|---|---|---|---|---|
keepalive |
4700 | 0.4 | - | 41.8 | - | - | - | - | 0 |
proxy-http1 |
1724 | 1.3 | - | 114.9 | - | - | - | - | 0 |
static-http1 |
4586 | 0.4 | - | 46.1 | - | - | - | - | 0 |
v0.32.0-18-gb44f8c1 Β· 2026-05-02 Β· tool:
wrkΒ· 4 connections Β· 30s per scenario Β· host:127.0.0.1driver:loopback (dedicated benchmark target)Β· env:release-baselineΒ· workers:2Β· config:release-baseline configCPU/RSS columns are sampled from the target Tardigrade process only when the run used--pidor--pid-file; otherwise they remain-.Run
./benchmarks/run.sh --save benchmarks/baselines/$(git describe --tags).jsonthen./benchmarks/report.sh <file> --update-readme README.mdto refresh this table.
Use Zig 0.16.0 for local validation.
# Format check
zig fmt --check build.zig src/ tests/
# Unit tests
zig build test --summary all --error-style verbose
# Stable Web PKI differential corpus (requires OpenSSL and Go)
zig build test-pki-differential --summary all --error-style verbose
# Security corpus replay
zig build test-security-corpus
# Integration tests
zig build test-integration
# Failure-mode / chaos suite (broken origins, aborting clients, reloads)
zig build test-failure
# Pure-Zig QUIC/HTTP-3 package tests (no system libraries)
zig build test-quic
# Allocation budget report
zig build bench-allocationsSee CONTRIBUTING.md and docs/CODE_REVIEW_CHECKLIST.md before making larger changes.
- Use GitHub Issues for actionable bug reports and feature requests.
- Use SECURITY.md for vulnerability reporting instructions.
- Include the config, command, logs, platform, and whether the affected surface is listed as stable or experimental in the support matrix.
Tardigrade is developed by Bare Systems as a host-native edge component for small services, internal platforms, and controlled deployments. It is licensed under the Apache License 2.0.