RouteWarden CLI Changelog
All notable changes to the RouteWarden CLI (rwarden) are documented here. The format is based on Keep a Changelog, and the CLI adheres to Semantic Versioning.
[v4.4.1] - 2026-10-07 (Latest)
Changed
- Canonical Directive Standardization & Gateway Generator Alignment (
engine/engine.go):- Emitted strictly canonical
status_code,retry_after_seconds, andtarpit_max_duration_secondsdirectives in Caddyfile generation (rwarden generate --target caddy), aligning with Caddy Warden v1.4.1+. - Standardized CLI configuration samples and generator templates on canonical
blockPatterns/block_patternsandallowPatterns/allow_patterns.
- Emitted strictly canonical
- JSON Schema Parity & Alias Cleanup (
config.schema.json):- Removed deprecated legacy alias properties (
pathPatterns,action) from official embedded schema (rwarden schema) and published schema definitions in favor of canonicalblockPatterns,allowPatterns, andmode. - Added
trustedProxiesdefinitions across official schemas and evaluation engines.
- Removed deprecated legacy alias properties (
Added
- Comprehensive Pattern & Directive Verification Suites:
- Added unit test suites verifying canonical
blockPatternsandallowPatternsmatrix matching, query parameter validation, and offline rule simulation across Traefik, Caddy, and NGINX targets.
- Added unit test suites verifying canonical
[v4.4.0] - 2026-10-06
Security
- CRLF Injection Prevention in Gateway Config Generators (
engine/engine.go):- Sanitized carriage-return (
\r) and newline (\n) characters from user-supplied pattern strings before emitting gateway-specific configuration snippets (Traefik TOML, Traefik Docker labels, NGINX Lua). - A crafted pattern value containing a CRLF sequence could previously inject arbitrary lines into the generated configuration output, potentially introducing unauthorized directives or breaking config parsers that load the generated snippets automatically.
- Characters
\rand\nare now replaced with their literal\rand\nescape sequences in all generated outputs, preserving pattern intent while eliminating injection risk. - Affected generators: Traefik TOML (
generate --target traefik-toml), Traefik Docker Compose labels (generate --target traefik-labels), NGINX Lua (generate --target nginx). - Tests:
TestGenerateCRLFSanitizationinengine/engine_test.goverifies that CRLF sequences in pattern values are escaped in all three affected output formats.
- Sanitized carriage-return (
[v4.3.0] - 2026-10-05
Added
- Request Body Security Inspection (
checkBody&checkBodyPatterns):- Integrated request body payload inspection into the CLI evaluation engine (
engine/config.go&engine/engine.go), allowing offline simulation of body pattern matching across Traefik, Caddy, and NGINX. - Added
-b,--bodyand--check-bodyCLI flags torwarden testfor auditing HTTPPOST,PUT, andPATCHpayloads. - Supported configurable body truncation (
checkBodyMaxBytes, default: 65536 bytes) across simulation engines.
- Integrated request body payload inspection into the CLI evaluation engine (
- Default Pattern Configuration Toggles & Gateway Generator Alignment:
- Added support for
disableDefaultPatternsanddisableDefaultAllowPatternsconfiguration aliases alongsideenableDefaultPatternsandenableDefaultAllowPatterns. - Updated Caddy (
enable_default_patterns), NGINX (enable_default_patterns), and Traefik generator templates to seamlessly output native pattern toggles.
- Added support for
- Comprehensive CLI Automation Test Suite:
- Added automated test cases covering stdin config piping (
cat config.json | rwarden test -c - /path), schema validation (rwarden schema), query testing flags (-q), and client IP allowlist verification (--ip).
- Added automated test cases covering stdin config piping (
Fixed
- IPv6 Scope Zone Identifier Normalization (
engine/ip.go):- Stripped RFC 4007 interface zone identifiers (
%eth0) and normalized bracketed IPv6 remote addresses during IP allowlist evaluation, preventing valid link-local and scoped addresses from being rejected.
- Stripped RFC 4007 interface zone identifiers (
- Docker Compose Indexed Array Label Conversion:
- Added support for array index notation in Docker labels (e.g.
blockPatterns[0],blockPatterns[1],allowedIps[0]), ensuring ordered conversion into YAML list sequences for Traefik.
- Added support for array index notation in Docker labels (e.g.
- Flag Canonicalization & Alias Cleanup:
- Canonicalized CLI flag definitions across
test,validate,generate, andsandbox, removing redundant aliases in favor of POSIX standard flags.
- Canonicalized CLI flag definitions across
[v4.2.0] - 2026-10-04
Added
- Threat Geography & GeoIP Intelligence Suite:
- Global Attack Origins Map (
geomappanel) rendering real-time geospatial attack concentrations and clusters across the globe mapped to ISO 3166-1 alpha-2 country codes. - Top Attacking Countries (
bargaugepanel) ranking top nation-state sources of blocked probes and malicious traffic. - Country Threat Share (
piechartpanel) showing percentage distribution of hostile requests by origin nation. - Interactive
$country_codetemplate variable with multi-select support to filter events and metrics across the dashboard by origin country.
- Global Attack Origins Map (
- Malicious User-Agent & Scanner Profiling:
- Automated scanner detection (
bargaugepanel) identifying and profiling offensive security toolkits (Nuclei, Nikto, sqlmap, Gobuster, Nmap, Masscan, curl, python-requests, and Go-http-client). - Attacked HTTP Methods & Verbs distribution (
piechartpanel) revealing threat actor request methods (GET,POST,HEAD,CONNECT,OPTIONS).
- Automated scanner detection (
- Layer 4 & Layer 7 Multi-Protocol Convergence:
- L4 vs L7 Threat Convergence Over Time (
timeseriespanel) correlating HTTP reverse proxy blocks (Traefik, Caddy, NGINX) with Layer 4 TCP connection bans and UDP packet drops. - Protocol Breakdown (
piechartpanel) tracking traffic proportions across protected protocols (http,ssh,dns,dht,tcp,udp). - Transport Split (
bargaugepanel) comparing connection-oriented TCP vs datagram UDP flows. - Interactive
$protocoland$transporttemplate filter variables for fine-grained multi-protocol drilldowns.
- L4 vs L7 Threat Convergence Over Time (
- Optional Grafana Threat Alerting & Automated Incident Notification Channels:
- Pre-configured alerting rules provisioned in
grafana/provisioning/alerting/alerting.yaml, optional and disabled by default (enabled viarwarden dashboard up --enable-alertingorALERTING_PROVISIONING_DIR=./grafana/provisioning/alerting):rw-ddos-attack-spike: Hostile attack rate spike alert triggering when block rate exceeds 10 req/s over 5m.rw-sensitive-path-probe: Immediate critical alert on hostile access attempts to.env,.git, or cloud credential files.rw-l4-brute-force: Layer 4 brute-force surge alert when >15 connection drops or bans occur within 3m.rw-scanner-nuclei-sqlmap: High-urgency alert when active exploitation tool signatures are detected.
- Multi-channel notification receivers pre-configured for Slack (
${SLACK_WEBHOOK_URL}), Discord (${DISCORD_WEBHOOK_URL}), PagerDuty (${PAGERDUTY_KEY}), and Generic Webhooks (${ALERT_WEBHOOK_URL}).
- Pre-configured alerting rules provisioned in
- Public & Shared Dashboards with Iframe Embedding:
- Enabled Grafana
publicDashboardsfeature toggle (GF_FEATURE_TOGGLES_ENABLE=publicDashboards) for zero-login public links to live threat telemetry. - Enabled frame embedding (
GF_SECURITY_ALLOW_EMBEDDING=true) for embedding threat widgets directly into SecOps intranets or customer portals.
- Enabled Grafana
- Interactive SOC Incident Triage Table & Threat Intelligence Drilldowns:
- Dedicated SOC triage grid (
tablepanel) displaying real-time forensic event records. - Interactive one-click investigative drilldowns on attacker client IPs:
- AbuseIPDB: Instant IP reputation check, report counts, and abuse confidence score (
https://www.abuseipdb.com/check/${__data.fields.client_ip}). - VirusTotal: Cross-engine malware, scanner, and infrastructure scoring (
https://www.virustotal.com/gui/ip-address/${__data.fields.client_ip}). - Shodan: Open ports, running daemons, and banner reconnaissance (
https://www.shodan.io/host/${__data.fields.client_ip}). - Loki Forensic Threat Hunter: Instant pivot into Grafana Explore pre-filtered to the attacker's client IP.
- AbuseIPDB: Instant IP reputation check, report counts, and abuse confidence score (
- Direct top-bar navigation shortcuts for rapid threat hunting.
- Dedicated SOC triage grid (
Fixed
- Docker Label Conversion for Indexed Array Notation (
labels.go):- Added support for array index syntax in Traefik Docker labels (e.g.
blockPatterns[0],blockPatterns[1],allowedIps[0]), properly preserving order and converting indexed entries into formatted YAML list sequences.
- Added support for array index syntax in Traefik Docker labels (e.g.
- Dashboard Offender IP Data Links (Panel 8): Replaced
${__series.name}with${__field.labels.client_ip}in "Top Offender IP Addresses & GeoIP", preventing country code suffixes (e.g.[US]) from leaking into external threat intelligence URLs (AbuseIPDB, VirusTotal, Shodan, and Loki Explore). - Dashboard Template Variable Filter Wiring: Enabled multi-select and dynamic regex filtering (
allValue: ".*",multi: true,refresh: 1) on$gatewayand$verdict, and wired stream selector filters across dashboard panels so that toolbar dropdowns properly filter panels. - Block Ratio Division by Zero Protection (Panel 4): Added
"noValue": "0%"to the Block Ratio stat panel to gracefully display0%during fresh installations with zero logs instead ofNaN%. - Secret-Safe Alerting Configuration: Replaced placeholder Slack/Discord/PagerDuty dummy keys with clean environment variable references, fully preventing GitHub Push Protection and Secret Scanner false-positive blocks.
[v4.1.1] - 2026-10-02
Fixed
- Alloy Multi-Label Relabel Matching (
config.alloy):- Fixed an issue in
discovery.relabelwhere multi-source label evaluation with semicolon separators failed when evaluatingroutewarden.logs=truealongside legacyroutewarden=truelabels (regex = ".*(true|1|yes).*").
- Fixed an issue in
- Premature Security Log Drop in Pipeline (
config.alloy):- Eliminated a duplicate
stage.droprule running before the verdict template normalization. Gateways emittingtype="routewarden_block"(Traefik) andaction="blocked"(TCP Warden) now properly normalize toverdict="BLOCK"before unparseable noise is dropped.
- Eliminated a duplicate
- HTTP Gateway Log Normalization (
config.alloy):- Mapped
type="routewarden_block"toverdict="BLOCK"andtype="routewarden_allow"toverdict="ALLOW"across Traefik, Caddy, and NGINX logs.
- Mapped
- TCP Warden Metadata Extraction (
config.alloy):- Extracted full Layer 4 metadata (
service,protocol,transport,client_ip,country_code,flag_emoji,level, andreason) for unified dashboard correlation.
- Extracted full Layer 4 metadata (
- Runtime Grafana Environment Overrides (
rwarden dashboard up):- Added repeatable
--env/-eflags torwarden dashboard up(e.g.--env GF_SECURITY_ADMIN_PASSWORD=secret). - Added
${GF_*:-default}parameter fallbacks acrossdocker-compose.ymlso custom environment variables, SMTP credentials, and OAuth SSO settings are respected at runtime.
- Added repeatable
- TCP Warden Sample Configuration & Obsolete Flags:
- Fixed
samples/tcp-warden/docker-compose.yaml,README.md, andtcp-warden.yamlby removing non-existent flags (--tcp-warden,--host,--no-docker) and adding the properroutewarden.logs=truelabel for the RouteWarden Observability Stack.
- Fixed
- UDP Port Exposure in Docker Image:
- Added
1514/udpto theEXPOSEdirective inDockerfilefor network UDP syslog ingestion.
- Added
Changed
- Pure Opt-In Container Discovery & Self-Logging Protection (
config.alloy):- Replaced broad container name regex matching (
.*(routewarden|traefik|caddy|nginx|tcp-warden).*) with a strict, label-based Pure Opt-In model (routewarden.logs=trueorroutewarden=true). - Completely prevents the observability stack (
routewarden-loki,routewarden-alloy,routewarden-grafana) from capturing its own internal logs or scraping unrelated host containers (databases, web applications, or unmanaged proxies). - Added stream-level log noise filtering in
loki.process(stage.drop) to automatically discard plain-text container startup banners, health check probes, and ordinary proxy access lines lacking structured RouteWarden security fields (verdictoraction). - Simplified
docker-compose.ymlby eliminating negative exclusion labels across all observability services.
- Replaced broad container name regex matching (
[v4.1.0] - 2026-10-01
Added
- Grafana, Loki & Alloy Observability Stack (
rwarden dashboard):- Replaced the embedded monolithic web dashboard with a production-grade cloud-native telemetry stack powered by Grafana, Grafana Loki, and Grafana Alloy.
- Added
rwarden dashboard up(default) to orchestrate and launch the full stack via Docker Compose with pre-provisioned data sources and security dashboards on port 3000. - Added
rwarden dashboard downto cleanly stop and remove running stack containers. - Added
rwarden dashboard statusto inspect container health, active port bindings, and endpoint URLs. - Added
rwarden dashboard export [dir](and--dir <path>) to extractdocker-compose.yml,config.alloy,loki-config.yaml, and Grafana provisioning dashboards to disk for standalone customization and GitOps workflows.
- Trusted Proxies Support Across All Generators (
trustedProxies):- Full code generator support for
trustedProxiesacross all supported targets:- Traefik Dynamic File Provider YAML (
http.middlewares.routewarden.plugin.routewarden.ipFilter.trustedProxies) - Traefik Dynamic File Provider TOML (
[http.middlewares.routewarden.plugin.routewarden.ipFilter] trustedProxies = [...]) - Traefik Docker Compose Labels (
traefik.http.middlewares.<name>.plugin.routewarden.ipfilter.trustedproxies=...) - Caddyfile (
trusted_proxies <ips/cidrs...>) - NGINX OpenResty Lua (
trusted_proxies = { ... })
- Traefik Dynamic File Provider YAML (
- Full code generator support for
- Redirect Mode Security Hardening (
redirectUrl):- Strict URL scheme validation in
rwarden validateandengine.NewEngine, restrictingredirectUrltohttp://,https://, or root-relative paths (/...) to eliminate open-redirect andjavascript:attack vectors.
- Strict URL scheme validation in
- Centralized Documentation & Universal Installer Integration:
- Centralized CLI documentation and guide hosted at RouteWarden Documentation.
- Integrated with the unified ecosystem installation script served directly at
https://routewarden.github.io/install.sh.
- Multi-Architecture Docker Container Build Optimization:
- Upgraded Dockerfile with BuildKit cache mounting (
--mount=type=cache) for Go package modules and build caches, substantially speeding up container build times. - Added native cross-compilation support utilizing
BUILDPLATFORM,TARGETOS, andTARGETARCHwith automatic fallback tolinux.
- Upgraded Dockerfile with BuildKit cache mounting (
Fixed
- Dashboard Export
--dirFlag Parsing:- Fixed an issue where passing
rwarden dashboard export --dir <dir>treated the literal flag"--dir"as the destination folder. The export command now seamlessly accepts both flag and positional arguments.
- Fixed an issue where passing
- Dashboard Subcommand Routing:
- Disallowed implicit fallback on unknown dashboard subcommands; invalid subcommands now report a helpful error with valid choices rather than silently launching containers.
- TCP Warden YAML Detection in
validate:- Tightened heuristics in
rwarden validateto require a.yaml/.ymlextension or a top-levelversion:key, preventing false-positive skips for JSON configs containing nested version fields.
- Tightened heuristics in
[v4.0.1] - 2026-09-26
Added
- Multi-App Version Sync:
- Unified version synchronizer and multi-target documentation linking in RouteWarden ecosystem docs.
- Enhanced Error Diagnostics:
- Clearer syntax error messages when validating malformed
tcp-warden.yamlconfigurations.
- Clearer syntax error messages when validating malformed
[v4.0.0] - 2026-09-25
Added
- RouteWarden TCP Warden Integration (
rwarden generate tcp-warden&rwarden validate):- Declarative generation of
tcp-warden.yamlconfigurations directly from centralized RouteWarden JSON policies. - Strict syntax, schema, and CIDR validation for
tcp-warden.yamlvia CLI arguments or stdin pipelines.
- Declarative generation of
- Real-Time TCP Monitoring in RouteWarden Dashboard:
- Direct ingestion and real-time visualization of structured
tcp-warden.jsonlevent streams. - GeoIP mapping, protocol breakdowns, connection velocity metrics, and dynamic ban tracking.
- Direct ingestion and real-time visualization of structured
- RouteWarden TCP Warden Standalone Application (TCP Warden Docs):
- Dedicated, zero-allocation Layer 4 TCP security proxy daemon for SSH, SMTP, POP3, IMAP, and generic TCP tunnels.
- Bidirectional CrowdSec integration (LAPI bouncer decision ingestion and scenario log export).
- Built-in management REST and SSE API (
:9091) with hot-reload support (SIGHUP). - Official JSON Schema
tcp-warden.schema.jsonand Docker Compose recipes.
[v3.0.0] - 2026-09-25
Added
- Self-Hosted Security Dashboard (
rwarden dashboard):- Real-time, zero-dependency web UI embedded in the
rwardenbinary — no Node.js, no external database, no cloud services required. - Zero-Config Docker Discovery: Auto-detects and streams logs from running Traefik, Caddy, and NGINX containers via the local Docker socket.
- Log File Tailing: Tail local log files or wildcard glob patterns with automatic log rotation support.
- Real-Time Live Event Feed: WebSocket / SSE stream of blocked requests with full-text search, container filtering, pause/resume, and clear controls.
- Attack Analytics: Interactive timelines (24h, 6h, 1h), blocks-per-minute chart, top attacked endpoints, top offender IPs, and response mode distribution.
- Sources & Container Management: View all active log sources with live status badges and one-click filtering.
- Real-time, zero-dependency web UI embedded in the
- v1.2 — GeoIP & IP Intelligence:
- Country resolution with flag emojis via embedded GeoLite2 MMDB or
ip-api.comlive fallback. - Deep IP Intelligence (
/api/ip/:ip): Threat risk score, ISP / ASN resolution, geographic location, behavioral patterns, top targeted endpoints, and paginated event history. - Config Viewer (
/api/config/:id): Inspect and render the liveroutewarden.jsonfrom any discovered container.
- Country resolution with flag emojis via embedded GeoLite2 MMDB or
- Tailscale & NetBird Mesh VPN Auto-Detection:
- Native identification of Tailscale CGNAT peers (
100.64.0.0/10) and NetBird ULA overlay peers (fd00::/8) with dedicated metadata and flag emoji (🔒). - RFC 5737 documentation ranges correctly classified as
LAN / Reserved Test Network.
- Native identification of Tailscale CGNAT peers (
[v2.1.0] - 2026-09-24
Added
- Flexible Positional Arguments & Lenient Flag Parsing:
- Direct positional inputs for all commands:
rwarden test /.env,rwarden validate [config],rwarden generate <target> [config], andrwarden sandbox <target> [config]. - Flags can now be placed interchangeably before or after positional arguments.
- Automatic fallback to
routewarden.jsonin current working directory when--configis omitted invalidateandgenerate.
- Direct positional inputs for all commands:
- Shorthand Flag Aliases:
- Added
-cfor--config,-tfor--target,-qfor--query,-Xand-mfor--method,-H(repeatable) for--header,-nfor--dry-run,-dfor--detach,-pfor--print-config, and-vforversion.
- Added
- Target & Format Aliases:
- Target generator and sandbox accept standard aliases:
yaml,yml,toml,compose,labels,docker-compose,caddyfile,openresty.
- Target generator and sandbox accept standard aliases:
- Production Gateway Config Adaptation in Sandbox:
- Support for passing complete, production Traefik (
traefik.yaml,traefik.toml), Docker Compose (docker-compose.yaml), Caddy (Caddyfile), and NGINX (nginx.conf) files directly torwarden sandbox. - In-memory auto-adaptation: rewrites external upstream backend URLs, proxies, and certificates for isolated local testing without modifying original configuration files.
- Live probe testing (
--test) accommodates upstream reachability (HTTP 200, 502, 504) as allowlist pass-through.
- Support for passing complete, production Traefik (
- Dedicated Sandbox Teardown Command:
rwarden cleanup(andrwarden sandbox cleanup) to stop and prune dangling or detached sandbox containers in one command.
Fixed
- Fixed RE2 regex backreference in Traefik label parsing to ensure 100% Go regexp standard library compliance.
- Prevented multiline upstream regex greediness in NGINX config adaptation from corrupting
server {blocks. - Injected missing
middlewares:parent block in synthetic Traefik sandbox YAML generation. - Enhanced label normalization to recognize root-level response parameters (
status,statusCode,mode,action,customResponseText). - Removed legacy direct boolean
silentDropproperty fromConfigschema, structs, and Docker label converters.
[v2.0.0] - 2026-09-21
Added
- Ephemeral Gateway Sandbox (
rwarden sandbox):- Spin up live, ephemeral container environments for Traefik, Caddy, and NGINX (OpenResty) pre-configured with RouteWarden security rules.
- Automatically translates and mounts native dynamic configurations into isolated test containers.
- Interactive foreground mode with instant graceful teardown on
Ctrl+C. - Detached background mode (
--detach/-d) for local dev workflows and integration testing. - Automated probe testing (
--test) to execute live HTTP test suites asserting blocking and bypass behavior. - Dry-run mode (
--dry-run) to inspect generated gateway configurations and exact Docker run commands without launching containers.
- Custom RouteWarden Plugin Support:
--plugin-version: Specify custom plugin version/tag/branch for testing specific releases.--plugin-path: Mount local plugin repository directories for real-time plugin development.
- Pre-flight Environment Validation:
- Added early Docker installation and daemon accessibility checks to fail fast with actionable guidance.
- Enhanced Container Tooling:
- Included
docker-cliinside the RouteWarden container image (ghcr.io/routewarden/cli).
- Included
[v1.1.0] - 2026-09-21
Added
- Multi-Gateway Config Generator (
generate):- Convert
routewarden.jsoninto native configuration for Traefik Dynamic YAML, Traefik Docker Labels, Caddy Caddyfile, and NGINX / OpenResty Lua. - Added support for
--config -to stream configuration via standard input.
- Convert
- Client IP Whitelist Simulation (
test --ip):- Test client IP evaluation against CIDR blocks and single IP allowlists offline.
- HTTP Header Smuggling Inspection (
test --header):- Test custom headers in
Key:Valueformat to evaluate reverse proxy path normalization anti-evasion.
- Test custom headers in
- Config & Query Precedence in Offline Testing:
- Added
--config <path>flag torwarden test. - Added
--check-queryboolean flag.
- Added
- Comprehensive Configuration Validation (
validate):- Added HTTP status code range checks (100–599).
- Added response mode validation and required target URL validation.
- Added CAPTCHA provider validation.
[v1.0.0] - 2026-09-20
Initial Release
- Path Anti-Evasion Inspection Engine (
test):- Offline candidate path extraction simulating Traefik and Caddy middleware pipelines.
- Recursive multi-layer URL percent-decoding (
%252e%252e). - Semicolon matrix parameter stripping (
/;param/.env). - Windows/IIS backslash normalization (
\..\). - Null-byte injection scrubbing (
%00). - Dot-segment path traversal resolving (
/static/../.env). - Default block pattern matching across sensitive files.
- Default allow pattern overrides.
- Configuration Validator (
validate):- Offline schema validation of
routewarden.json. - Detection of invalid regular expressions and malformed CIDR blocks.
- Offline schema validation of
- Official JSON Schema Export (
schema):- CLI command emitting
config.schema.jsondirectly for IDE integration.
- CLI command emitting
- Distribution:
- Single-binary zero-dependency Go distribution for macOS, Linux, and Windows.
- Automated installation script (
curl -fsSL https://routewarden.github.io/install.sh | bash). - Official multi-architecture Docker container image on GitHub Container Registry (
ghcr.io/routewarden/cli:latest).