Reference
Everything here matches the current release. The README on GitHub has the longer explanations.
Commands
| Command | What it does |
|---|---|
rendercache serve |
Runs the public proxy and the separate admin listener, warms sitemap pages and serves saved copies to crawlers |
rendercache render --url /path |
Renders one page in Chrome now and saves it |
rendercache inspect --url /path |
Prints the saved record for a page without starting Chrome |
rendercache prune --older-than 720h |
Removes old records while the service is stopped |
rendercache health |
Checks the admin health endpoint, using RENDERCACHE_ADMIN_TOKEN |
rendercache version |
Prints the version, commit and platform |
Each command takes --config file.json. Common settings also have flags, such as --origin, --public-url, --listen, --admin-listen, --data-dir, --chrome-path, --ready-selector, --render-timeout, --warm, --sitemap, --snapshots and --snapshot-ttl. Flags override the file.
Settings
The config file is one JSON object. Unknown keys are rejected. RENDERCACHE_ADMIN_TOKEN and RENDERCACHE_EDGE_TOKEN override the token settings, so secrets can stay out of the file.
| Setting | Default | What it does |
|---|---|---|
origin |
required | Fixed upstream site root |
public_url |
origin | Public root used for URL validation and snapshot identity |
data_dir |
data/snapshots |
Local snapshot and delivery-log directory, one writer process |
snapshot_max_bytes |
1073741824 |
Serialized-record quota; 4096 bytes to 1 TiB |
snapshot_max_files |
10000 |
Record count quota; 1 to 100000 |
max_request_bytes |
16777216 |
Public request-body limit; 1 byte to 256 MiB |
http_concurrency |
32 |
Concurrent public requests (1..256); excess requests return 503 |
edge_token |
empty | Optional public-listener edge key; prefer environment |
delivery_log_max_bytes |
10485760 |
Maximum bytes per log file; 4096 to 1 GiB |
delivery_log_backups |
3 |
Rotated files retained in addition to current file; 1 to 10 |
chrome_path |
auto-detect | Local browser executable |
chrome_no_sandbox |
false |
Explicit browser sandbox opt-out |
render_timeout |
30s |
Hard deadline including capacity wait/startup |
render_settle |
500ms |
Wait after load when no selector is configured |
ready_selector |
empty | CSS selector proving application-specific readiness |
max_html_bytes |
8388608 | Serialized HTML limit, at most 64 MiB |
render_concurrency |
1 | Browser worker slots, range 1–16 |
render_allow_origins |
empty | Additional explicit HTTP(S) asset roots |
snapshot_enabled |
true |
Serve saved responses to eligible bots |
snapshot_ttl |
24h |
HTTP freshness age, minimum 1s |
request_page_limit |
256 | Request-driven page allowance with least-recently-requested eviction, range 1–10000 |
warm_enabled |
true |
Enable warming while serving |
sitemap_urls |
["/sitemap.xml"] |
Public root sitemap URLs/paths |
warm_interval |
24h |
Snapshot refresh age; minimum 1s |
sitemap_interval |
15m |
Rediscovery schedule; minimum 1s |
warm_retry_base |
5s |
Initial retry delay; minimum 100ms |
warm_retry_max |
5m |
Maximum retry delay, at least base |
warm_queue_size |
128 | Pending job capacity, range 1–10000 |
sitemap_max_bytes |
8388608 | Wire/XML bytes per document, at most 64 MiB |
sitemap_max_urls |
10000 | Maximum discovered pages, at most 100000 |
sitemap_max_documents |
128 | Maximum sitemap documents, at most 1000 |
sitemap_max_depth |
4 | Maximum index depth, root at 0, at most 16 |
sitemap_timeout |
15s |
Timeout for one HTTP fetch |
sitemap_scan_timeout |
2m |
Deadline for complete discovery |
listen |
:8080 |
Public proxy listener |
admin_listen |
127.0.0.1:9090 |
Administration listener |
admin_token |
empty | Optional bearer token on loopback, required elsewhere |
origin_timeout |
30s |
Upstream response-header timeout |
shutdown_timeout |
10s |
Graceful shutdown deadline |
bots |
search, AI and preview crawler patterns, including Google-InspectionTool for Search Console tests | Case-insensitive user-agent substring matches |
bypass_paths |
["/api"] |
Path prefixes that always go to the origin, for example /graphql or /wp-json |
ignore_query_params |
utm_*, gclid, fbclid, msclkid | Query parameters left out of the snapshot identity, case-insensitive |
trusted_proxies |
["127.0.0.0/8", "::1/128"] |
Peers whose X-Forwarded-For/Proto/Host are passed to the origin |
Admin endpoints
These live only on the admin listener (127.0.0.1:9090 by default), never on the public one. With a token set, send Authorization: Bearer <token> or sign in as rendercache with the token as password.
| Endpoint | What it does |
|---|---|
GET / |
The “What the bot sees” page: coverage, errors, receipts and the HTML comparison |
GET /healthz |
Process health |
GET /status |
Warming coverage, queue, cache counters and recent delivery receipts as JSON |
POST /purge?url=/path |
Queues a fresh render of one page and keeps the old copy until it succeeds. Always needs a token |
POST /diagnose |
Compares the raw origin HTML of {"url":"/path"} with the saved copy |
POST /simulate |
Sends a local crawler-style request through the public handler and records a receipt marked simulated |
Response header
Every public response carries X-RenderCache:
| Value | Meaning |
|---|---|
HIT |
A fresh saved copy was served to a crawler |
STALE |
An older saved copy was served while a refresh runs in the background |
MISS |
A crawler asked for a page with no saved copy yet; the origin answered and a render was queued |
BYPASS |
Not eligible for a saved copy: a person, a request with cookies or credentials, an asset, a bypassed path or a non-GET request |