v3.0.0 rc.1 First public release candidate

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 && tiyi standalone
One binary · zero runtime deps Apache-2.0 upstreams · proprietary distribution linux/amd64 · arm64
tiyi.example.com/dashboard
Tiyi dashboard showing 13,883 requests with 4,871 blocked (35.1%) and live attack distribution.
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.

OWASP CRS 4 out of the box

Coraza compiles policies from a structured domain model into SecLang. Per-site overrides, paranoia levels, scoring thresholds, 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.

Multi-agent topology

Primary + warm secondary + N pure agents over a long-lived gRPC bidi stream. Live config push lands on every node in ~50 ms; agents keep proxying on last-known config indefinitely if the CP is unreachable.

Built-in observability

Open-bucket telemetry pipeline with Top-K via Misra-Gries, sample rings, and a per-site URL prefix tree. 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. Daily anchor commitments and an in-UI Verify chain button make tamper-evidence operational.

SIEM egress, ready

Best-effort TCP/UDP/unixgram forwarding for security, access, error, and audit events in RFC 5424, CEF, or LEEF. Bring your own Splunk, Elastic, Sentinel, or Wazuh.

CDN-aware client IP

One trust pipeline ends XFF parsing fragmentation. Auto-fetched CIDR snapshots for Cloudflare, Fastly, Akamai, CloudFront, Front Door, and GCLB; per-site overrides and an explain tool that traces every header.

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.

Security incidents, not a firehose

A security_incident layer folds same (site, client IP, attack class) events over a sliding window into one actionable incident — severity rolled up, lifecycle tracked, MITRE ATT&CK + kill-chain + geo tagged at creation, with optional default-off automated response.

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 52 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 is a real screen from v3.0.0-rc.1, captured against a running instance. Same data plane, same UI, same RPC.

Overview

One screen, your whole edge.

QPS, total requests and blocks, attack distribution by tag, top attackers, and a live alert pane — all driven by the same telemetry pipeline that powers your Prometheus exporter.

  • 5-minute QPS with auto-refresh, paused on document hidden
  • Real-time attack tags from the Coraza audit stream
  • Site-scoped or fleet-wide views from the same toggle
/dashboard
Tiyi dashboard with KPIs and traffic chart
Security events

Every blocked request, with the rule that fired.

Per-request rows enriched with the Coraza rule id, severity, message, and attack tags — extracted from the bracketed ModSecurity payload through a tolerant parser, not Coraza's typed accessor.

  • SQL injection, XSS, RCE, RFI, path traversal — labeled and drillable
  • Cross-stream jump from a security event to the matching access log
  • Direct page-jump pagination — page 320 of a 7-day window in one round trip
/logs/security
Security event list with SQL injection, XSS, and RCE blocks
WAF policies

Tune CRS without forking it.

Built-in Strict / Standard / Permissive templates, each compiled to deterministic SecLang on save. Per-site overrides for thresholds, paranoia, and sampling layer over the shared bundle.

  • 11 tabs: CRS Core · HTTP Policy · Limits · Rule Tuning · IP Lists · Custom Rules · Plugins · Rate Limits · Exclusions · Preview · Test Lab
  • Compare any two policy revisions side-by-side
  • Audit-chain row for every mutation, including IP-list bindings
/waf/policies
WAF policies list with built-in templates
Telemetry explorer

100k EPS, no external TSDB.

Sharded ingress ring, 10-second open-bucket aggregator, daily SQLite partitions, Misra-Gries Top-K with an __other__ bucket so SUM(*) equals true traffic. Read it via a typed REST API, scrape it via Prometheus, or browse it here.

  • Top-K by client IP, path, UA, ASN, attack tag — one click each
  • Per-site URL prefix tree with bounded node and depth guards
  • Per-IP sample rings and a circular-file WAL for replay-on-boot
/telemetry/explorer
Telemetry explorer showing real-time QPS and Top-K by client IP
Agents

Push + reconcile. Always converging.

Every change writes SQLite, bumps a monotonic revision, and pushes a signed bundle down every open agent stream. Agents reconcile every 15 s as a safety net. Updates are idempotent by revision — replay and reorder are free.

  • One-use enrollment tokens with 24-hour TTL
  • Pinned ed25519 bundle signing key, TOFU on first contact
  • Live CPU/memory/connection metrics, per-agent commands
/agents/all
Agents list with one online standalone agent
Audit chain

Tamper-evident by construction.

Every mutation appends a hash-chained row attributed to the JWT subject. Daily anchor commitments and an in-UI Verify chain button make compliance practical, not theatrical.

  • Site, policy, IP list, rate limit, trust profile — all chained
  • Server-side SIEM egress with optional audit include
  • Diff drawer on row click — see exactly what changed
/logs/audit
Audit log with hash-chained mutation rows
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

Local standalone node. Full product feature set.

  • 1 local standalone 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, multi-cluster, 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.

2026-06-24 Shipped
One-binary scale licensing + first-run admin
Tiyi now ships as one always-enforced binary that gates scale, not features. Without a valid license it runs Community on the local standalone node with 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 standalone first boot 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 standalone dashboards reading zero traffic (telemetry now ingested from StoreAccess).
v3.0.0-rc.1 2026-05-27 Release Candidate
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; standalone agent commands now drained; 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.0.0 GA Q3 2026 · target Now
First general-availability release
Soak the release candidate across pilot deployments — now including the incident-aggregation layer, the redesigned alerting stack, the optional AI advisory/Copilot layer, and the scale-gate licensing flow — sign Linux amd64 + arm64 builds, publish the install script at www.tiyisec.com/install.sh, ship the first signed binary distribution channel.
v3.1 Q4 2026 · target Planned
Incident correlation DSL + response library
The shipped incident layer groups on a fixed (site, client IP, attack class) key. v3.1 opens that up: an operator-defined Sigma-style correlation DSL (explicitly deferred from the v1 aggregation work), a broader automated-response action library, and notification-channel routing trees on top of the new alerting lifecycle.
v3.2 Q1 2027 · 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.3 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.