Skip to main content

Roadmap

The following features appear in the requirements or configuration surface but are not yet implemented. No delivery dates are promised; this page tracks the honest current state.

FeatureCurrent state
Python scripting runtime (pyo3)Not implemented. examples/plugins/README.md documents the target execute(ctx) API, but no .py files ship and runtime: python is rejected at policy-compile time.
TLS terminationImplemented — set tls in system.yaml to serve HTTPS on the data-plane listener (and, via admin.tls, the Admin API). rustls/ring, PEM cert+key, min_version 1.2/1.3, certificate hot-reload (served on new connections without a restart), mTLS (client-cert verification via client_ca_path, required/optional, with the client fingerprint, subject CN, and SAN DNS names exposed to the pipeline for identity-based authz), and SNI multi-certificate termination (sni_certs presents a per-hostname cert on one listener; see TLS guide). Follow-ups: CRL/OCSP revocation.
HTTP/2Implemented — enabled by default (http2.enabled); the listener negotiates HTTP/2 alongside HTTP/1.1 (ALPN over TLS, h2c prior-knowledge over plaintext), and the outbound client advertises h2 to TLS upstreams (see TLS & HTTP/2).
WebSocket proxyingImplemented — a client WebSocket upgrade runs the normal policy graph (access-phase plugins apply), the upstream node resolves the target, and the listener relays the upgraded connection to a ws:// or wss:// upstream (via the upstream node's tls flag). Both the HTTP/1.1 upgrade and HTTP/2 extended CONNECT (RFC 8441) are accepted from clients (see TLS, HTTP/2 & WebSocket). Follow-up: RFC 8441 to the upstream (upstream leg is HTTP/1.1).
TCP/UDP proxyingImplemented — L4 stream listeners under stream: in system.yaml proxy raw TCP (accept → relay) and UDP (per-client datagram sessions) to a load-balanced upstream pool, independent of the HTTP engine, including SNI-based TLS passthrough routing on TCP (see L4 stream proxying). Follow-ups: dynamic/hot-reloadable stream routes.
proxy-cache pluginImplemented — an in-memory cache expressed as a lookup/store node pair sharing one namespace by id (see proxy-cache). Follow-up: a shared/distributed cache backend (Redis) for multi-instance deployments.
unpack nodeSpecified in the requirements; not implemented.
Debug mode & plugin sandboxImplemented — opt-in per-request policy-execution traces (context snapshot + derived diff per node, redaction at capture time, bounded ring buffer) and a sandbox that runs plugins or whole policies against a synthetic request through the real engine. Off by default, restart-gated (debug.enabled in system.yaml), served from /api/debug/* and the web UI's Debug panel (see Debugging & sandbox). Follow-up: Lua-script step-through remains out of scope.
Outbound (upstream) mTLSImplemented (0.2.0) — the upstream node presents a client certificate (client_cert_path/client_key_path) and/or trusts a private CA (ca_cert_path, replacing system roots for that upstream), validated at policy compile, applied to HTTPS proxying and wss relays. Follow-ups: cert-file hot-reload (rotation currently needs a gateway.yaml touch or restart), client certs for callout plugins (forward-auth, OPA, loggers).
Headless build / Docker image variantsImplemented (0.3.0) — the web editor is gated by the default-on ui cargo feature; -headless image tags on Docker Hub ship without it, and full builds can disable it at runtime via admin.ui_enabled.
etcd clustering (stateful mode)Implementedconfig.source: etcd delivers config over etcd's v3 HTTP/JSON gateway with cluster-wide convergence and seed-if-empty bootstrap (see Deployment → HA clustering with etcd). Follow-ups: TLS-to-etcd, streaming watch, multi-endpoint failover.
Graceful shutdownImplemented — on SIGTERM/Ctrl+C the gateway stops accepting on every listener and drains in-flight HTTP + Admin requests (bounded by timeouts.shutdown_timeout_seconds, default 30s) before exiting (see Deployment → Graceful shutdown). Long-lived WebSocket/L4 tunnels get the drain window then close at exit.
Script execution timeoutsThe script node parses timeout_ms (default 5000) and stores it, but the Lua VM does not enforce it — runaway scripts block the request.
Terminal nodes / CORS preflightKnown bug. A plugin cannot stop graph execution. cors writes a 204 preflight response onto the context, but the engine then follows the success edge into upstream, which proxies the OPTIONS and overwrites it — so preflight requests never get their 204. Fixing it needs a conditional/second output port on the node, or an engine-level terminal signal. Covered by E2E-DP-09 (expected-failure) in the e2e suite.