config.json. Fields marked required have no default and must be set before verifyngo will start. All duration values use Go’s duration string format: "30s", "10m", "2h", "168h" (7 days).
Core
IP Trust
Paths
Default
bypass_paths list
When bypass_paths is not set in config.json, verifyngo uses the following patterns:
CAPTCHA
Provider selection
cap (self-hosted Cap)
slider (built-in slider puzzle)
A self-hosted slider puzzle that needs no third-party service. Visitors drag a piece into place. Set slider.enabled to true and then use "slider" as the provider.
turnstile (Cloudflare Turnstile)
hcaptcha
Walk-away & Ban
Walk-away tracking counts how many times a visitor abandons the challenge page without solving it. When the threshold is exceeded the visitor is banned. Whentrust_fingerprint_headers is enabled and a request carries a TLS fingerprint (X-TLSFP or X-JA4, set by a proxy such as the nginx Lua module in lua/ja4_fingerprint.lua), walk-aways are also counted per fingerprint. The count is kept separately for each fingerprint within the client’s /24 (IPv4) or /48 (IPv6) network. Once the threshold is reached, that fingerprint is blocked for ban.duration from that network, so other IPs using the same TLS client are not affected.
Progressive
Progressive mode observes traffic passively on specified paths before deciding to challenge. Visitors who exceedmax_requests within request_window are challenged.
Rules
Rules run in order, and the first matching rule decides the action. Rules are set in therules array, or in an external file with rules_file.
Tor
verifyngo recognises two kinds of Tor traffic:- Onion: requests from an onion circuit address, or requests with a
.onionHostheader that arrive from a loopback or private address. - Exit: requests from an address on the Tor Project’s exit list.
Policy conditions can read the traffic kind as
tor, which is "onion", "exit", or "":
Onion services with circuit IDs
Without circuit IDs, every onion visitor arrives from the same address and is treated like an exit. With circuit IDs, each circuit gets its own address, so walk-aways, failed attempts, and bans apply per circuit, as they do for any other visitor. Tor then opens each connection with a PROXY protocol header, so the onion needs its own nginx port. Settrust_real_ip to true and list that nginx in trusted_proxies. See the Tor section of the README for the full torrc and nginx setup.
Tarpit
Visitors sent to the tarpit get generated filler text instead of the real site, which wastes the time of automated clients that ignore rate limits.Store
The store holds ban state, walk-away counters, and progressive counters.store.file (file backend)
store.redis (Redis backend)
ASN
ASN lookups power policy-file rules that match on autonomous system numbers or organisation names.AbuseIPDB
When enabled, verifyngo reports banned IPs to AbuseIPDB after they have been banned a configurable number of times.Branding
All branding fields are optional. They customise the appearance of the challenge page shown to visitors.
Default
branding.details_text
Full example config.json
Full example config.json