Skip to main content

Render Configuration

The [render] section controls how PRISM renders pages using a headless Chromium browser. It includes sub-sections for the browser tab pool, circuit breaker, HTML postprocessing, viewport emulation, and content validation.

TOML Example

[render]
wait_for = "load"
timeout_secs = 10
block_resources = ["font", "image", "media", "stylesheet"]
status_from_meta = false
fail_on_console_errors = false
min_html_size = 512
post_wait_js = "document.querySelector('.lazy')?.classList.remove('hidden')"

[render.pool]
tabs = 8
max_renders_per_tab = 50
queue_max = 100

[render.circuit_breaker]
failure_threshold = 5
recovery_timeout_secs = 30
half_open_max_requests = 1

[render.postprocess]
enabled = true
strip_scripts = true
strip_noscript = true
strip_comments = true
strip_event_handlers = true
strip_hydration_attrs = true
resolve_lazy_images = true

[render.viewport]
enabled = false
mobile_width = 412
mobile_height = 915
desktop_width = 1920
desktop_height = 1080

[render.content_validation]
enabled = true
min_text_length = 100
require_title = true
min_html_bytes = 1024

Top-Level Parameters

ParameterTypeDefaultDescription
wait_forString"load"Page readiness signal: load, domcontentloaded, networkidle, or selector:<CSS>
timeout_secsInteger10Maximum seconds to wait for a page render. Must be > 0
block_resourcesArray of Strings["font", "image", "media", "stylesheet"]Resource types to block during rendering
status_from_metaBooleanfalseExtract HTTP status from <meta name="render:status_code"> or <meta name="prism:status">
fail_on_console_errorsBooleanfalseFall back to origin if JS console errors detected and HTML is below min_html_size
min_html_sizeInteger512Minimum rendered HTML bytes; below this with console errors triggers fallback
post_wait_jsString or nullnullJavaScript to execute after wait_for completes but before HTML extraction

wait_for

Controls when PRISM considers the page "ready" to extract HTML:

  • load (default): Waits for the load event. Good for most SPAs.
  • domcontentloaded: Fires earlier, before images/stylesheets finish loading. Faster but may miss lazy content.
  • networkidle: Waits until there are no more than 2 network connections for 500ms. Most thorough but slowest.
  • selector:<CSS>: Waits until a specific CSS selector appears in the DOM. Example: selector:#app-loaded or selector:.content-ready.

status_from_meta

When enabled, PRISM scans rendered HTML for meta tags like:

<meta name="render:status_code" content="404">
<meta name="prism:status" content="404">

This lets SPAs that render 404 pages client-side communicate the correct HTTP status code to crawlers.

post_wait_js

Optional JavaScript executed after the wait_for condition is met but before HTML is extracted. Useful for DOM fixups on SPAs with lazy hydration, such as removing hidden classes that a framework has not yet removed.

Pool Configuration

The [render.pool] sub-section controls the Chromium browser tab pool.

ParameterTypeDefaultDescription
tabsInteger8Number of browser tabs to keep open. Must be > 0
max_renders_per_tabInteger50Renders before recycling a tab (prevents memory leaks)
queue_maxInteger100Maximum queued render requests before rejecting new ones

Increasing tabs improves concurrent throughput but uses more memory. Each tab consumes roughly 50-100 MB of RAM depending on page complexity.

Circuit Breaker Configuration

The [render.circuit_breaker] sub-section implements the circuit breaker pattern to protect against cascading failures when Chromium is unhealthy.

ParameterTypeDefaultDescription
failure_thresholdInteger5Consecutive failures before opening the circuit
recovery_timeout_secsInteger30Seconds to wait before attempting recovery (half-open state)
half_open_max_requestsInteger1Number of test requests allowed in half-open state

When the circuit is open, all render requests immediately fall back to the origin response instead of waiting for Chromium.

Postprocess Configuration

The [render.postprocess] sub-section controls HTML cleanup applied to rendered output before caching and serving.

ParameterTypeDefaultDescription
enabledBooleantrueEnable or disable all postprocessing
strip_scriptsBooleantrueRemove <script> tags from rendered HTML
strip_noscriptBooleantrueRemove <noscript> tags
strip_commentsBooleantrueRemove HTML comments
strip_event_handlersBooleantrueRemove inline event handlers (onclick, onload, etc.)
strip_hydration_attrsBooleantrueRemove framework hydration attributes (data-reactid, ng-*, etc.)
resolve_lazy_imagesBooleantrueMove data-src to src for lazy-loaded images

Postprocessing produces cleaner HTML for search engine crawlers and reduces response size.

Viewport Configuration

The [render.viewport] sub-section enables viewport emulation for mobile-aware rendering.

ParameterTypeDefaultDescription
enabledBooleanfalseEnable viewport-aware rendering
mobile_widthInteger412Width in pixels for mobile viewport
mobile_heightInteger915Height in pixels for mobile viewport
desktop_widthInteger1920Width in pixels for desktop viewport
desktop_heightInteger1080Height in pixels for desktop viewport

When enabled, PRISM detects the requesting device type and sets the browser viewport accordingly. This ensures responsive SPAs render the correct layout for mobile vs. desktop crawlers (e.g., Googlebot Mobile).

Content Validation Configuration

The [render.content_validation] sub-section validates rendered output quality before caching and serving.

ParameterTypeDefaultDescription
enabledBooleantrueEnable content validation
min_text_lengthInteger100Minimum visible text characters (after stripping HTML tags)
require_titleBooleantrueRequire a non-empty <title> tag in rendered output
min_html_bytesInteger1024Minimum total HTML size in bytes

Content validation catches broken renders (empty pages, error screens) and prevents them from being cached or served to crawlers.

Example Use Cases

React SPA with slow hydration

[render]
wait_for = "selector:#app-ready"
timeout_secs = 15
post_wait_js = "document.querySelectorAll('.skeleton').forEach(el => el.remove())"

[render.pool]
tabs = 12
queue_max = 200

High-traffic site with conservative settings

[render]
wait_for = "load"
timeout_secs = 8
fail_on_console_errors = true
min_html_size = 1024

[render.circuit_breaker]
failure_threshold = 3
recovery_timeout_secs = 60

[render.content_validation]
enabled = true
min_text_length = 200
min_html_bytes = 2048

Minimal postprocessing for debugging

[render.postprocess]
enabled = true
strip_scripts = false
strip_comments = false
strip_hydration_attrs = false