Skip to main content
This page lists every field recognised in 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. When trust_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 exceed max_requests within request_window are challenged.

Rules

Rules run in order, and the first matching rule decides the action. Rules are set in the rules 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 .onion Host header that arrive from a loopback or private address.
  • Exit: requests from an address on the Tor Project’s exit list.
Tor traffic never gets the passive pass. Tor traffic is also never checked against, or reported to, AbuseIPDB. Exit addresses are shared by many people, so they are never banned. Each request without a cookie gets a challenge, and failed attempts are not counted against the address. 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. Set trust_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