# 📌 Project status ## 📌 Release The current release is **v0.2.0-rc.3**, a release candidate. Its [release notes](https://github.com/dorianverlaine/pingclair/releases/tag/v0.2.0-rc.3) list what changed and the defects known at tagging time. The `v0.1.x` line is unmaintained. It receives no fixes, no backports, and no security advisories; `v0.1.x` also parsed the Admin API `api_key` field without reading it, so the field protected nothing. ## ✅ Supported | Area | Status | | --- | --- | | Protocols | HTTP/1.1 and HTTP/2 on TCP, HTTP/3 over QUIC, from one configuration. | | TLS | Automatic public certificates over ACME, a persistent internal certificate authority, and manual certificate and key files. | | Static files | File serving with `zstd` and `gzip` compression, range requests, and conditional requests. | | Reverse proxy | Multiple upstreams, several load-balancing policies, active health checks, and backup upstreams. | | FastCGI | `php_fastcgi` on HTTP/1.1 and HTTP/2. | | Rate limiting | Exact local rate limiting per matcher. | | Observability | Access logging with rotation, and Prometheus metrics. | | Administration | Admin API for inspecting state and reloading configuration. | ## 🛡️ Refused by design The configuration format defines more names than the server implements. A name that the server cannot honor is refused at load time, by name, with a message saying the feature is missing. Examples that readers ask about most often: - `map`, `invoke`, and `tracing` directives; - the `storage` option, because certificates and state are stored on local disk only; - `on_demand_tls` and OCSP stapling options; - `handle_errors`, where the configuration type exists but performs no work; - `encode br`, because no streaming Brotli encoder exists. The complete lists are maintained in the server repository's README, which is checked by a test that fails when the parser refuses a name the list does not mention. ## ⚠️ Known limitations - **Certificate storage is local.** Several instances cannot share one certificate store, because the store is a directory on disk. - **DNS-01 has one provider.** `tls { dns cloudflare }` and the global `acme_dns` option are implemented for Cloudflare. Any other provider name is refused at startup rather than accepted and ignored. - **HTTP/3 trailers and tunnels.** Declared request trailers are not forwarded (`501` before the response commits, stream reset afterwards), upstream trailers produce `502`, and `CONNECT` returns `501`. - **FastCGI on HTTP/3 returns `501`** until that path has its own FastCGI client. - **WebSocket upgrades fail intermittently under load**, roughly 10-15% on a busy machine. The cause is a race in the upstream `pingora-proxy` crate ([cloudflare/pingora#946](https://github.com/cloudflare/pingora/issues/946)), not in Pingclair's own handling, and an idle machine will not reproduce it. ## 🐛 Reporting Defects and documentation errors are reported through the [issue tracker](https://github.com/dorianverlaine/pingclair/issues). A security policy naming a private reporting channel has not been published yet. ## 📚 Related documents - [CHANGELOG](https://github.com/dorianverlaine/pingclair/blob/main/CHANGELOG.md): what changed between releases. - [Benchmarks](/project/benchmarks/): measurement conditions and results. - [Architecture](/concepts/architecture/): components and request path.