v3.5.3 Fail-closed client-IP topology + intent-based rule drafting

Self-hostable WAF,
in one binary.

Tiyi is a production-grade WAF, reverse proxy, and management plane in a single Go executable. Caddy + Coraza + OWASP CRS 4 + SQLite, with the admin UI embedded. No Docker. No external database. No Redis. Five minutes from download to blocking real attacks.

Get Tiyi See it in action →
$ curl -fsSL https://www.tiyisec.com/install.sh | bash && sudo tiyi install --now
Public repos: GitHub zzmzm/tiyi · Gitee tiyisec/tiyi
One binary · zero runtime deps Apache-2.0 upstreams · proprietary distribution linux/amd64 · arm64
Guided product run 01:16 · no audio

From install command to blocked SQL injection.

Watch the complete workflow in the real Tiyi admin, or jump straight to any step.

tiyi-demo / operator walkthrough
Responsive 1080p stage Download 1440p MP4 Open GIF preview
Built on the open-source stack you already trust
Caddy 2 · Coraza 3 · OWASP CRS 4.25 · ConnectRPC · SQLite · OpenTelemetry
1
Binary, zero runtime deps
5 min
From download to blocking attacks
100k EPS
Telemetry pipeline tier — sustained
~50 ms
Config push to every agent
What's inside

One executable. Every layer of a real WAF stack.

Tiyi replaces a four-service compose file with a single Go process — and adds the things ops teams actually want: live config delivery, audit chain, telemetry, and a typed API that drives both the UI and the CLI.

Task-oriented admin plane

Eight stable work areas organize Overview, application delivery, protection, fleet, events and logs, detection and response, monitoring, and administration. Responsive navigation, keyboard semantics, permission-aware groups, and consistent empty/diff/apply states keep complex workflows learnable.

OWASP CRS 4 out of the box

Coraza compiles structured policies into SecLang while CIDR and geo:CC IP lists match in a compressed native handler ahead of the WAF. Per-site overrides, paranoia levels, scoring thresholds, and exclusion packages — without forking the ruleset.

Caddy reverse proxy + automatic TLS

HTTP-01, DNS-01 with multi-provider support (Cloudflare live; Route53/Aliyun stubs), wildcard certs, and uploaded enterprise certs. Renewal coordinated across all agents.

Path-based routing

One host, one cert, many upstream pools by path prefix — API-gateway-style fan-out. Each route gets its own post-apply health probe; unmatched paths fall through to the site default or a strict 404. Every access-log row carries the route_id and upstream_id that served it, and path scope is canonicalized identically across the WAF, IP lists, and the rate limiter.

One ConnectRPC API

Same proto schema serves the Vben Admin UI, the tiyi CLI, and the agent stream. Every mutation has one path; the CLI and API stay in lockstep by definition.

Local-first node topology

One writable Controller includes a built-in local data plane. Nodes → Install guides binary download, token issuance, systemd setup, or foreground startup for each remote Agent, which keeps proxying with the last accepted bundle while the Controller is unavailable.

Built-in observability

Exact request and bandwidth counters, normalized URL/UA Top, per-site API Inventory, immutable SecurityFacts, local/remote node trends, and a Prometheus exporter on the local admin socket. No external time-series database required.

Hash-chain audit trail

Every mutation — including IP-list bindings, rate-limit endpoints, and trust-profile changes — appends a signed audit row. The ledger shows operator and resource names with readable summaries; daily anchors and an in-UI Verify chain button keep tamper-evidence operational. Display timezone follows browser override → app.timezone → browser IANA while storage stays UTC.

Request evidence + direct SIEM

Fresh installs retain bounded request headers/body evidence for security events; operators can turn it off or attach it to retained Attack and Access logs. Independent producer-side SIEM queues send native Caddy/Coraza or formatted events over UDP, TCP, or TLS without entering the request path.

CDN-aware client IP

An executable node/edge/rule topology ends XFF parsing fragmentation. Each Header chooses automatic verified-proxy skipping or fixed extraction; CDN/proxy ranges compile into one physical pool with fail-closed topology checks. Sites-owned global defaults, per-site analysis, and multi-CDN headers stay first-class.

Air-gap friendly

Embedded OWASP CRS 4.25 ruleset, offline archive upload for CRS and exclusion packages, KEK-envelope encryption for secrets at rest, and a persistent ed25519 bundle-signing key the agent pins on first contact.

Alert lifecycle, not fire-once

Rules debounce over a for duration, then drive a pending → firing → resolved lifecycle with a durable notification outbox, re-notify, grouping, inhibition, and silences. Webhook, Slack, PagerDuty, Feishu, WeCom — channel secrets KEK-encrypted at rest.

SecurityFacts + reviewed response

Every blocked or suspicious request writes an immutable, partitioned SecurityFact. From Attack Logs, operators draft by intent: block the exact method/path, tune a CRS false positive, or confirm a high-risk CRS-only skip that keeps Tiyi custom and IP controls active. Global IP actions stay separate. Nothing applies without review.

AI Copilot — advisory, never autonomous

An optional, default-off LLM layer beside the deterministic WAF — never in the request path. Explain any incident or log event, translate plain-English questions into log queries, and get policy-tuning or custom-rule drafts you approve by hand. Provider-agnostic (OpenAI-compatible, Azure, Ollama, vLLM); every prompt redacted, dual-RBAC gated, and rate-limited.

RBAC + OIDC

JWT with refresh, Argon2id local accounts, OIDC SSO on the same login surface, and fine-grained permissions wired through every API and CLI command.

Declarative apply

tiyi apply -f site.yaml previews the change set, shows a per-resource diff, and produces the same audit row a UI save would. Same validator, same mutator — by construction.

Product tour

The admin plane your ops team will actually use.

Every screenshot below was captured against a running Tiyi instance. Same data plane, same UI, same RPC.

Application delivery

Trace every request from host to upstream.

A site's operational overview joins its public hostname, TLS, WAF policy, path routing, upstream health, and exact 24-hour counters into one request path.

  • Host → TLS → WAF → route → upstream, with no hidden hand-off
  • Jump directly to scoped access logs, security events, or rendered config
  • The built-in local data plane and remote agents use the same control surface
/sites/all
Site overview tracing hostname, TLS, WAF, routing, and upstream status
SecurityFact analysis

Pivot from attacker to technique to target.

Immutable, partitioned security facts turn the attack stream into three investigation perspectives without inventing sessions or putting analytics in the request path.

  • Exact totals and block rate remain independent of bounded Top-N rankings
  • Drill through source IP, attack class, site, target, and matched rule
  • Open the precisely scoped request log only when per-request evidence is needed
/security/events
SecurityFact analysis grouped by attack class with related sources, sites, targets, and rules
Request evidence

See why it was blocked — and act.

The event drawer keeps the request identity, Geo/ASN context, CRS matches, actual detection values, and response controls together without obscuring the underlying log stream.

  • Jump to the matching access event using the same request identity
  • Preview bounded retained headers/body separately from the hot-path finding
  • Block or allow an IP, or draft an exact/tree/context rule or narrow CRS exclusion from the evidence
/logs/security
Blocked RCE request detail with CRS rule matches, evidence, and scoped response actions
WAF policies

Tune CRS without forking it.

The focused tuning workspace makes each protection layer explicit, then compiles the structured policy into deterministic SecLang on save.

  • 12 focused tabs: Overview · CRS Protection · HTTP Protection · Request Limits · Rule Exceptions · IP Access · Custom Rules · Plugins · Rate Limits · Exclusions · Preview & Test · Versions
  • Focused custom-rule drafts and inline endpoint-limit rows protect unsaved work with explicit discard
  • Unique per-scope paths and explicit create/update semantics compile site limits before inherited policy limits and CRS
/waf/policies/:id
WAF policy tuning workspace with twelve focused protection and validation modules
Telemetry + API inventory

Know the traffic — and the API surface behind it.

Real-time QPS and exact dimension rankings share a page with a per-site API tree that separates durable confirmed assets from traffic-derived candidates.

  • Exact request and status-code counts beside the live QPS crosshair
  • Searchable method, host, and normalized path inventory scoped by site
  • Bounded open buckets and daily SQLite partitions — no external TSDB required
/telemetry/explorer
Real-time request telemetry with exact rankings and a per-site API inventory tree
Alert response

Carry a detection through review and resolution.

A durable evidence snapshot explains why the rule fired while the alert continues through pending, firing, acknowledged, and resolved states.

  • Top sources, attack classes, targets, and rules link back to scoped evidence
  • Acknowledge, resolve, silence, group, inhibit, and retain the handling timeline
  • Remediation stays a human-reviewed IP-list or custom-rule draft
/alerts/active
Active alert detail with evidence snapshot, response controls, and investigation links
Fleet topology

One Controller. Local plane + remote Agents.

The same binary runs as Controller or Agent. The built-in local data plane and every remote node share live metrics, config revision, and install guidance from one Nodes surface.

  • Local + remote placement, online status, and per-node CPU / memory / QPS
  • Agents keep proxying on the last accepted bundle if the Controller is unavailable
  • Install guides cover binary download, token issuance, systemd, or foreground startup
/agents/all
Multi-node fleet with local built-in plane and remote Agent online metrics
Hash-chain audit

Every mutation leaves a tamper-evident trail.

Site, policy, trust-profile, IP-list, and auth changes append signed audit rows. Operators verify the chain in-product instead of trusting an export.

  • Action, resource, actor, and View diff for every committed change
  • In-UI Verify chain plus daily anchor commitments
  • Same audit row whether the mutation came from the UI, CLI, or tiyi apply
/logs/audit
Hash-chain audit log with Verify chain and per-row View diff
Pricing

One binary. The license changes scale.

Tiyi is proprietary software with Apache-2.0 upstreams. The same binary runs Community, Pro, and Enterprise; a signed license raises the remote-node budget. The control plane runs on your hardware.

Community

For homelabs, side projects, and getting to know Tiyi.

$0 / forever

One built-in local node. Full product feature set.

  • 1 local node — unlimited sites & policies
  • Full WAF: OWASP CRS 4, custom rules, IP lists, rate limits
  • ACME (HTTP-01 + DNS-01 with Cloudflare driver)
  • Telemetry explorer + Prometheus exporter
  • No license file required; import one later to add remote nodes
Use Community

Enterprise

For regulated environments, air-gapped sites, and global edges.

Contact

Custom pricing tied to your fleet and SLA.

  • Custom remote-Agent budget and multi-region commercial terms
  • Air-gapped builds + offline CRS / exclusion archives
  • Deployment architecture and compliance-evidence assistance
  • Audit-chain attestation and operational review
  • 24/7 support · 4-hour P1 response · dedicated engineer
  • Custom rule packs + roadmap influence
Talk to sales

Need something specific? [email protected]  ·  All plans use the same binary and include the full WAF feature set; the differences are licensed scale, support, and supply-chain services.

Changelog

Shipped this month.

Every entry maps back to a commit and a verification command. The full release history lives at /changelog.

v3.5.3 2026-08-10 Shipped
Native IP-list enforcement + incremental alert remediation
Country and CIDR IP lists compile into a compressed native tiyi_iplist artifact ahead of Coraza, so large geo:CC blocks cannot truncate CRS. Auto-remediation keeps appending bounded attacker batches while an alert stays firing, with rule-owned deny lists and fail-closed rate-limit state budgets.
v3.5.2 2026-08-09 Shipped
Display timezone + clearer protection authoring
The Web UI resolves one display timezone (browser override → system app.timezone → browser IANA) for tables, charts, and range inputs while storage stays UTC. IP Lists teach Define → Apply → Verify; the custom-rule regex operator opens an RE2 workbench; Audit Trail surfaces readable summaries with cursor paging; CRS paranoia uses shared PL1–PL4 posture controls.
v3.5.1 2026-08-06 Shipped
Fail-closed client-IP topology + intent-based rule drafting
Client-IP Headers each choose automatic verified-proxy skipping or fixed extraction; CDN/proxy ranges compile into one physical pool with fail-closed topology checks. Attack Logs reorganize Create rule from this event by operator intent—block, tune CRS false positives, or confirm a CRS-only skip that keeps Tiyi custom and IP controls active—with explicit path/method scope and root-path guards.
v3.5.0 2026-08-03 Shipped
Executable client-IP topology + safer protection authoring
Client IP moves to an executable node/edge/rule topology with Sites as the sole global entry, live sampling analysis, verified drafts, and path-conditioned multi-CDN headers. Dashboard rankings support one-click global IP or geo:CC response. Endpoint rate limits now use one canonical inventory with unique per-scope paths and deterministic site precedence; Attack Logs draft exact/tree/context rules or narrow CRS exclusions, and focused editors protect modified drafts.
v3.4.0 2026-07-30 Shipped
One Controller, convergent configuration, operator trust
tiyi run is the sole writable Controller and owns a factual built-in local node; legacy HA, role, promotion, and replication surfaces are gone. Durable desired/active revisions, immutable artifacts, local rollback, exact Agent delivery, and generation-bound upstream health make the served configuration inspectable and recoverable. Generated fail-closed authorization, rotating HttpOnly sessions, automatic Geo data, exact bandwidth views, site request-path overviews, and adaptive row actions complete the operator hardening. This clean-break release requires fresh state for databases below schema 47.
v3.3.1 2026-07-24 Shipped
Request evidence + producer-direct SIEM
Default-off Request Evidence can retain parsed headers and bounded body bytes beside Attack and Access logs, with global/site policy, quotas, retention, and resumable Agent upload. Producer-direct SIEM adds independent destinations for native Caddy access JSON, Coraza audit JSON, and Tiyi-formatted events. Normalized URL/UA Top, prior-day WAL reclamation, and automatic Go memory limits improve day-two operations; every new lane remains bounded and panic-isolated from WAF traffic.
v3.3.0 2026-07-22 Shipped
SecurityFacts consolidation + alert auto-remediation
The sessionized incident, attack-campaign, and MITRE-mapping layer is removed; immutable, partitioned SecurityFacts are now the sole security-event truth, with a fresh-install schema-43 cutover. Alert auto-remediation turns a firing alert into a reviewed IP-list or custom-rule draft; a durable fact journal and bounded Live Tail (≤200 rows, one event per 500 ms window) keep investigation fast. Operator docs, merge log, and website synchronized in EN + zh.
v3.2.1 2026-07-17 Shipped
v3.2.0 QA hardening + reliability
Closes the v3.2.0 QA pass: unmatched Host headers return 421 instead of bypassing the WAF, CRS rule 980099 outbound correlation runs cleanly, and drawer, auto-close, and i18n defects are fixed. Reliability additions include SQLite BUSY retry, an orphan-evidence lookup index with a durable join worker, and bounded per-response network GeoIP enrichment.
v3.2.0 2026-07-16 Shipped
Observation v2 + persistent attack campaigns
Exact hot-path counters, compact Findings, retained evidence, and SIEM delivery are now independent. Persistent Attack Campaigns correlate incidents into revisioned evidence graphs and timelines with deterministic source/target, Geo/ASN, and MITRE projections. Telemetry Explorer adds API Inventory, alerts become localized and evidence-linked, and all operator docs/screenshots now cover the new workflows. Pre-v3.2 development/test state requires an explicit clean reset and agent re-enrollment.
v3.1.0 2026-07-12 Shipped
Task-oriented navigation + accessible admin workspaces
The management plane now follows seven operator jobs instead of code-shaped resource silos, with stable routes and permissions. A focused responsive shell, keyboard-operable menus, clearer current-page state, permission-aware groups, shared empty/diff/live/apply patterns, and reorganized policy/site-security workspaces make the console faster to scan and safer to edit on desktop and mobile.
v3.0.9 2026-07-10 Shipped
Visual-rule bypass action + responsive admin UI
The custom-rule builder gains an explicit Bypass WAF action for tightly scoped false-positive exceptions: it compiles to pass,nolog,ctl:ruleEngine=Off so matching traffic skips the rest of WAF inspection, while plain Pass is now silent (pass,nolog) and only passes that one rule. The security-event drawer adds an Allow this path / false positive handoff that drafts a bypass rule from the event. Across the admin UI, drawers and modals clamp to the viewport via a shared responsive-width helper, markdown code blocks get a native copy button, and the recipe-template catalog moves behind a compact Browse recipes launcher; a field-mask path fix lets visual-spec custom rules save correctly.
v3.0.8 2026-07-09 Shipped
Policy enforcement hardening + doctor state-ownership repair
A focused hardening pass on v3.0.7: policy-wide rate limits now apply to sites running the inherited policy (not just sites with an overlay); IP-list update_mask no longer resets kind; CRS enable_default_collections becomes a tri-state that survives protojson round-trips; and tiyi doctor gains --fix-state-ownership to repair service-owned state trees. The security-event "create rule" handoff is fixed, the site policy-override modal becomes an inline panel, and list views share one datetime formatter.
v3.0.7 2026-07-08 Shipped
Scoped IP control + site security overlays
IP lists are now reusable data objects whose effective action is chosen at global, policy, or site binding scope. The new IP Control flow adds global lists, reference counts, scoped lookup, and apply-now targets; site rows get a Security protection drawer for inherited policy rows plus editable deltas; security events can quick allow/block source IPs; and install now fixes root-owned state trees before systemd starts Tiyi.
v3.0.6 2026-07-06 Shipped
Alert-rule authoring redesign + dashboard/telemetry rework
The alert-rule builder is now template-first with a grouped kind dropdown and an incident→alert bridge; the dashboard overview is reworked around a site filter + time range; the telemetry explorer gains a QPS/blocked chart with crosshair; site TLS, agent groups, and alert silences gain new controls; and dead alert-condition fields are fixed.
v3.0.5 2026-07-04 Shipped
Agent metrics trend + apply/update hardening
The agent detail drawer keeps 7 days of metrics with a trend view; the dashboard top-attacker drill-down honors the selected time range; IP-literal site hosts apply cleanly via a single-certificate loopback health check; run/agent run a startup preflight; and tiyi update shows progress and pre-checks privileges.
v3.0.4 2026-07-02 Shipped
Install diagnostics + tiyi doctor
install.sh keeps the default sudo tiyi install --now path, then highlights sudo PATH and 80/443/8080 listener conflicts with exact next steps. tiyi doctor reruns the same non-mutating diagnostics for run, agent, and dashboard installations.
v3.0.3 2026-07-02 Shipped
China mirror install + signed update fallback
install.sh and tiyi update now use GitHub as the primary release source with a Gitee fallback for operators on slow or blocked GitHub links. Force the China mirror with TIYI_MIRROR=gitee for install or tiyi update --mirror gitee for updates. Public docs now expose only config-derived runtime env vars, use tiyi update consistently, and keep GitHub/Gitee distribution docs in lockstep.
v3.0.2 2026-06-28 Shipped
Frictionless install + deterministic first-run admin
sudo tiyi install --now is the default single-host path: it pre-creates the first administrator before starting the service and prints the login (URL + username + password) right there, so the one-time secret never lands in the journal. Re-running install.sh on a host that already has tiyi updates the binary in place and restarts the service instead of re-downloading. The API and dashboard now bind 0.0.0.0:8080 by default.
v3.0.1 2026-06-27 Shipped
Multi-node Agent install + operations
Run one Controller as a hardened systemd service with tiyi install --now, then use Nodes → Install to download the binary, issue a one-use token, and choose systemd or foreground startup for each remote data plane. WAF-enabled sites deploy and block (SQLi / XSS / LFI → 403) on remote Agents, the embedded CRS is materialized Agent-side, and per-Agent metrics stream continuously.
v3.0.0 2026-06-26 Shipped
First public release
Tiyi v3.0.0 is published on GitHub Releases with signed Linux amd64/arm64 artifacts, SHA256SUMS, SHA256SUMS.sig, and release-manifest.json. Install from www.tiyisec.com/install.sh or the GitHub raw mirror, verify downloads against release-key.pub, and update with tiyi update --yes.
2026-06-24 Shipped
One-binary scale licensing + first-run admin
Tiyi ships as one always-enforced binary that gates scale, not features. Without a valid license, Community includes the built-in local node and zero remote Agents; importing a vendor-signed license activates the Pro or Enterprise remote-node budget. The embedded vendor public key is the sole trust anchor, legacy license.mode writes are rejected, expired or invalid licenses safely degrade to Community, and known Agents always reconnect. The authenticated About page shows edition, licensee, expiry, and live node count. A first tiyi run start with no users auto-creates an admin with a one-time random password instead of a dead-end login.
2026-06-18 Shipped
Path-based routing
A site can now fan out by path prefix to multiple upstream pools behind one host and one certificate — API-gateway style. Each route carries its own post-apply health probe; unmatched paths fall through to the site default or a strict 404 allowlist. Path scope is canonicalized identically across the WAF, IP lists, and the rate limiter, and every access-log row records the route_id and upstream_id that served it. Drive it from the tiyi site routing CLI or the new web routes editor.
2026-06-18 Shipped
Policy rate-limit editor
The policy Rate Limits tab is now a real operator editor. Endpoint rows are path-pattern limits keyed by the resolved client IP, with a log-only canary mode; client-scope rows set global ceilings by IP, session cookie, or a named header. Inline validation blocks any row the agent could not actually enforce, and the API canonicalizes legacy scopes/actions on save. Enforced before Coraza, with no persistent collections.
2026-06-09 Shipped
AI advisory layer + interactive Copilot
An optional, default-off LLM layer beside the deterministic WAF — in the control plane, never in the request path. A global AI Copilot slide-over explains any incident or log event and analyzes filtered results; a conversational StreamChat agent answers questions like "top attackers in the last hour" by tool-calling over read-only, tenant-scoped log queries. Incident enrichment, policy-tuning, NL→query translation and draft rules stay advisory — applied only on explicit, audited operator approval. Provider-agnostic (OpenAI-compatible / Azure / Ollama / vLLM); every prompt redacted, dual-RBAC gated, and rate-limited.
2026-06-09 Shipped
Air-gap icons, telemetry explorer, static binary
The admin console now bundles its icons offline, so air-gapped consoles never reach the public Iconify API. A new telemetry explorer surfaces Top-N and time-series breakdowns over the built-in pipeline. Release binaries are statically linked (CGO_ENABLED=0), so the same artifact runs on older distributions (CentOS 7+). Plus stable per-event access-log IDs and a reachable post-login landing page for permission-restricted operators.
2026-05-31 Shipped
Security incident aggregation (Phase 1–4)
A security_incident layer above per-request events. Same (site, client IP, attack class) over a sliding idle window collapses into one operator-actionable incident — severity rolled up, lifecycle tracked, with reopen / merge / live-tail and per-site overrides. Every incident is tagged at creation with its MITRE ATT&CK technique + kill-chain stage and a country/ASN geo rollup. Optional, default-off automated response (deny IP list / rate-limit / webhook) with 60-second TTL auto-reversion.
2026-05-31 Shipped
Alerting redesign + security hardening
The alert evaluator gains the evaluation/notification split the industry converged on: for-duration debounce, a pending → firing → resolved lifecycle, a durable notification outbox, re-notify, retry-with-backoff, grouping, inhibition, and silences. Channel secrets moved to KEK-encrypted storage. Also closed a fail-open RBAC gap on system/cert admin RPCs and fixed built-in dashboards reading zero traffic (telemetry now ingested from StoreAccess).
v3.0.0-rc.1 2026-05-27 Shipped
Direct page-jump pagination for log views
Closes the post-rc.1 operator bug where reaching page 320 of a 7-day security log fired 319 sequential RPCs. CursorRequest now carries an offset field with a 100k cap; offset accounting runs over post-filter rows so CIDR/rule filters skip the right number of matched rows.
2026-05-26 Shipped
Six post-deploy QA fixes
IP-list geo:CC entries accepted at the API; bookmarkable parametric routes (/agents/:id, /waf/policies/:id) re-registered after backend menu generation; ResolveAgentGroup implemented with id and ad-hoc spec; remote Agent command delivery hardened; trust-profile mutations chained into the audit log; access-log default flipped to on.
2026-05-24 Shipped
Security hardening + frontend cleanup
KEK persistence fix (no more ephemeral KEK overwriting kek.bin), persistent ed25519 bundle signing key, agent revision replay protection, migration drift detection via schema_migration checksums, and SIEM dispatcher cached-conn reconnect-on-error. Frontend dropped 16 Vben demo pages and rewired the layout shell.
2026-05-16 Shipped
Client-IP trust pipeline
One trust pipeline ends per-component XFF parsing fragmentation. CDN-aware CIDR snapshots for Cloudflare, Fastly, Akamai, CloudFront, Front Door, and GCLB. Per-site overrides; an explain tool that traces every header to the resolved client IP.
Read the full changelog →
Roadmap

What ships next.

Dates are targets, not promises. Items move with verification, not optimism.

v3.5.3 2026-08-10 Shipped
Native IP-list enforcement + incremental alert remediation
Compressed native prefix matching for IP/country lists, SecLang completeness guards, bundle v3, incremental firing-window auto-remediation, and bounded fail-closed rate-limit runtime state.
v3.5.2 2026-08-09 Shipped
Display timezone + clearer protection authoring
One display-timezone chain for tables/charts/ranges; IP Lists teach Define → Apply → Verify; regex custom rules open an RE2 workbench; Audit Trail is ledger-readable with cursor paging; CRS paranoia uses shared PL posture controls.
v3.5.1 2026-08-06 Shipped
Fail-closed client-IP topology + intent-based rule drafting
Header-owned extraction, recursive pool compilation, and fail-closed topology verification harden client-IP resolution. Attack Logs draft by intent with CRS-only skip outcomes that preserve custom and IP controls; root path scopes are rejected for path-level drafts.
v3.5.0 2026-08-03 Shipped
Executable client-IP topology + safer protection authoring
Sites owns the global client-IP surface with an executable topology, sampling analysis, verified drafts, and path-conditioned multi-CDN headers. Dashboard rankings support immediate IP/geo:CC response. Canonical endpoint rows enforce unique per-scope paths and deterministic site precedence; Attack Logs seed narrow custom rules or CRS exclusions, and focused editors protect modified drafts.
v3.4.0 2026-07-30 Shipped
Single Controller + convergent configuration
One writable Controller now owns the built-in local data plane and publishes immutable, revisioned configuration to local and remote nodes. Exact active-versus-attempt state, rollback, retry, generation-bound health, generated authorization, secure browser sessions, automatic Geo data, bandwidth trends, site overviews, and adaptive actions replace legacy HA semantics and ambiguous operator state.
v3.3.0 2026-07-22 Shipped
SecurityFacts consolidation + alert auto-remediation
The sessionized incident, attack-campaign, and MITRE-mapping layer is replaced by immutable, partitioned SecurityFacts as the sole security-event truth, with a fresh-install schema-43 cutover. Alert auto-remediation drafts reviewed IP-list/custom-rule actions from a firing alert; a durable fact journal and bounded Live Tail keep investigation fast.
v3.2.1 2026-07-17 Shipped
v3.2.0 QA hardening + reliability
Closes the v3.2.0 QA pass: unmatched Host headers return 421 instead of bypassing the WAF, CRS rule 980099 outbound correlation runs cleanly, and drawer, auto-close, and i18n defects are fixed. Reliability additions include SQLite BUSY retry, an orphan-evidence lookup index with a durable join worker, and bounded per-response network GeoIP enrichment.
v3.2.0 2026-07-16 Shipped
Observation v2 + attack-campaign operations
Exact request truth is isolated from retained evidence and SIEM delivery; incidents now roll into persistent, revisioned Attack Campaigns; API Inventory and evidence-linked localized alerts complete the investigation workflow. Task-based EN/zh operations and troubleshooting docs ship with the feature.
v3.3.1 2026-07-24 Shipped
Request evidence + direct SIEM egress
Two independent planes beside Observation v2: default-off Request Evidence retains unredacted parsed headers and bounded body bytes for authorized in-console review; Direct SIEM forwards source-native Caddy access JSON, Coraza audit JSON, and Tiyi-formatted events from the node that produced them. Separate queues, byte budgets, and failure counters keep pressure in either plane from changing a WAF decision or response.
Post-v3.5 Future · target Planned
Workload-cert mTLS + multi-tenant
Per-agent X.509 identity over the public internet (the EnrollResponse.workload_cert_pem field is reserved today). Multi-tenant isolation hardening with per-tenant KEK and audit-chain partitioning.
v3.6 Q2 2027 · target Planned
Production drivers + advanced rate limiting
Route53 and Aliyun ACME drivers move from credential-validating stubs to full Publish/Retract loops with propagation gating. Token-bucket sharing across agents for fleet-wide rate limits.
v4.0 2027 · target Planned
Bot management + ML scoring
A scoring layer on top of the existing CRS engine — JA3/JA4 fingerprints, header-shape entropy, and a per-IP behavioral model. CAPTCHA challenge integration kept optional and self-hostable.

Stop assembling Nginx, ModSec, Postgres, and Redis.

Tiyi is one binary. One config. One mental model. Five-minute install on the box you already have.