XF Bot Guard 1.2.1
Release type: Minor update
This minor update gives XF Bot Guard’s admin pages a much-needed quality-of-life pass. The old ACP layouts worked, but let’s be honest: some of those tables were doing their best impression of a car crash.
This update makes the admin-side pages cleaner, easier to scan, and much less painful when dealing with long bot data, hashes, paths, metadata, and Cloudflare edge records.
- Improves the layout and styling of XF Bot Guard ACP pages.
- Adds cleaner spacing, padding, button alignment, and table handling across the admin interface.
- Improves wide data tables so long values, dates, paths, JSON, hashes, and error messages are better contained.
- Improves filter panels so fields are easier to read and take up less unnecessary vertical space.
- Improves event detail and Edge candidate detail pages with cleaner code block and metadata presentation.
- Improves health check/status display readability.
- Adds a small optional support/development contribution prompt in the relevant XF Bot Guard admin pages.
- Does not change public-facing challenge behaviour or bot detection logic.
XF Bot Guard 1.2.0
Release type: Major update
This release adds Cloudflare Edge Enforcement, an optional new protection layer that allows XF Bot Guard to feed high-confidence application-level abuse intelligence back into Cloudflare.
For heavily botted forums using Cloudflare, this is a significant step forward. XF Bot Guard can now detect repeat abusive behaviour inside XenForo, promote the worst offending public IPs into a managed Cloudflare IP list, and have Cloudflare issue a Managed Challenge before those requests continue reaching XenForo.
In plain terms: XF Bot Guard still performs the intelligent application-level detection, but Cloudflare can now help enforce against repeat offenders at the edge.
Changes
- Added optional Cloudflare Edge Enforcement, allowing XF Bot Guard to escalate repeat high-confidence abusive IPs to Cloudflare.
- Added automatic Cloudflare IP list and WAF rule management, so repeat offenders can receive a Cloudflare Managed Challenge before reaching XenForo.
- Added local edge-candidate tracking so XF Bot Guard can identify, score, expire, and sync abusive IPs safely.
- Added dry-run mode, enabled by default, so site owners can review what would be synced before XF Bot Guard writes anything to Cloudflare.
- Added safety protections to avoid promoting staff, logged-in users, verified crawlers, excluded IPs, private/internal IPs, and manually protected IPs.
- Added Cloudflare setup, connection testing, health checks, manual sync, sync logs, candidate review, repair, and disable tools in the Admin Control Panel.
- Added encrypted storage for the Cloudflare API token.
- Added a manual never-export list for IPs that should not be synced to Cloudflare.
- Updated FingerprintJS from 5.1.0 to 5.2.0.
Why this matters
Before this release, XF Bot Guard could detect, score, challenge, deny, and log suspicious traffic once that traffic had already reached XenForo.
That is still useful, but repeat abusive traffic can still consume origin resources. The request still reaches Cloudflare, then your server, then PHP, then XenForo, then XF Bot Guard.
With Cloudflare Edge Enforcement enabled, XF Bot Guard can escalate the worst repeat offenders back to Cloudflare.
Before Cloudflare Edge Enforcement:
Code:Bot or abusive client -> Cloudflare -> XenForo / PHP / database -> XF Bot Guard detects, challenges, denies, or logs
After promotion and Cloudflare sync:
Code:Bot or abusive client -> Cloudflare Managed Challenge -> usually never reaches XenForo
This is the important part of 1.2.0.
XF Bot Guard is no longer only protecting at the application layer after the request reaches XenForo. For suitable forums using Cloudflare, it can now contribute application-level intelligence back into the edge protection layer.
For heavily botted sites, this can be extremely valuable. Repeat abusive traffic can be challenged before it continues hitting PHP, XenForo routing, sessions, challenge pages, counters, logs, and database-backed behaviour checks.
This is not intended to replace XF Bot Guard's normal protection. It is an escalation layer. XF Bot Guard identifies the behaviour inside XenForo, then Cloudflare helps absorb repeat abuse earlier in the request path.
How IP promotion works
XF Bot Guard does not send every challenged visitor to Cloudflare.
Promotion is deliberately conservative.
An IP generally needs to be an anonymous public IP showing repeated or high-confidence abusive behaviour. XF Bot Guard looks for signals such as excessive request velocity, repeated failed validation, repeated CAPTCHA failure or rate limiting, suspicious automation behaviour, invalid collector/proof activity, abnormal fingerprint behaviour, and other strong bot-like patterns.
Some severe events may be promoted faster than weaker signals, but XF Bot Guard still applies safety checks first.
XF Bot Guard is designed to avoid promoting:
- staff members;
- logged-in users;
- verified crawlers;
- private, reserved, or internal IP ranges;
- IPs excluded from XF Bot Guard handling;
- IPs added to the never-export list.
This matters because Cloudflare Edge Enforcement is intended for repeat anonymous abuse, not normal members, staff, or legitimate crawlers.
What happens when a promoted IP returns
When a promoted IP has been synced to Cloudflare, Cloudflare applies a Managed Challenge before the request reaches XenForo.
This does not mean the IP is permanently banned.
A Cloudflare Managed Challenge is intentionally softer than a hard block. Many real human visitors can pass it. Many bots, scripts, scrapers, headless clients, and low-quality automated requests cannot.
That is the balance XF Bot Guard is aiming for: move repeat abuse away from the origin, without turning the feature into a blunt permanent firewall ban.
Cloudflare rule used
XF Bot Guard manages a Cloudflare WAF rule using its managed IP list.
The rule is based on this logic:
Code:(ip.src in $xf_bot_guard_edge_ips and not cf.client.bot)
The action is:
Code:managed_challenge
This means requests from IPs in the XF Bot Guard managed list receive a Cloudflare Managed Challenge, while Cloudflare-recognised verified bots are excluded.
A quick note on the Admin Control Panel pages
Before the setup instructions, a fair warning: the Cloudflare Edge Enforcement ACP pages are functional, but they are still very much first-pass admin pages.
They do what they need to do: setup, health checks, candidate review, sync logs, repair actions, and disable tools are all there. But, like some of XF Bot Guard's existing reports and tables, they are not yet as tidy or polished as I want them to be.
The protection layer is the important part of this release, and that is where the focus has been. The next minor releases will be concentrating heavily on admin quality-of-life improvements, tidier tables, clearer reports, better page flow, and generally making the ACP feel less like it was assembled during a bot attack.
Which, to be fair, parts of it probably were.
Setup
Cloudflare Edge Enforcement is optional and disabled by default.
Dry-run mode is enabled by default. In dry-run mode, XF Bot Guard can evaluate and queue local candidates, but it will not write changes to Cloudflare.
To set it up:
- Upgrade XF Bot Guard to 1.2.0.
- Review your privacy policy before enabling raw IP storage.
- In the Admin Control Panel, go to Add-ons.
- Open XF Bot Guard -> Cloudflare Edge Enforcement.
- Open Setup using the top-right button.
- Enable raw IP storage.
- Enable Cloudflare Edge Enforcement.
- Leave Dry-run mode enabled for now.
- In a new browser tab, log in to Cloudflare.
- Copy your Cloudflare Account ID and Cloudflare Zone ID into the XF Bot Guard setup page. Cloudflare documentation: Find account and zone IDs
- Back in the XF Bot Guard setup page, click Create Cloudflare API token.
- Create the Cloudflare API token using the pre-filled permissions.
- Copy the Cloudflare API token into the XF Bot Guard setup page.
- Press Save.
- After saving, scroll down and click Set up Cloudflare automatically.
- Return to the Cloudflare Edge Enforcement overview.
- Click Sync now.
- Review the health checks.
- Periodically open Candidates to review what XF Bot Guard would sync while dry-run mode is still enabled.
- Once you are happy with what Cloudflare Edge Enforcement would have enforced, go back to Setup and disable dry-run mode.
- Run Sync now again, or allow the cron to perform the next sync automatically.
After that, the integration is active. The cron will keep the Cloudflare list in sync automatically.
At the time of this release, XF Bot Guard expects Cloudflare permissions for account rule lists, zone read access, and zone WAF editing. The setup page provides guidance and the API token link is pre-filled with the required permissions.
Important notes
This is a major update.
The Cloudflare Edge Enforcement layer is optional. If you do not use Cloudflare, or do not want XF Bot Guard to manage a Cloudflare IP list and WAF rule, you can leave this feature disabled.
This feature is most valuable for forums that are already behind Cloudflare and receive heavy bot, scraper, spam, automation, or abusive guest traffic.
Raw IP storage is required for Cloudflare Edge Enforcement. XF Bot Guard cannot sync an IP to Cloudflare if it is only storing hashed IP data. Before enabling raw IP storage, review your own privacy policy and local requirements.
Dry-run is enabled by default for a reason. Use it first. It allows you to see what XF Bot Guard would do before it starts writing to Cloudflare.
You should be reasonably comfortable with Cloudflare before enabling this feature. You do not need to be a Cloudflare expert, and XF Bot Guard provides setup, test, sync, health check, repair, and disable tools. However, this feature does interact with Cloudflare account-level lists and zone WAF rules, so it should be enabled carefully rather than blindly switched on.
As noted above, the next minor releases will focus heavily on admin quality-of-life improvements across XF Bot Guard.
Cloudflare Edge Enforcement should be treated as an escalation layer, not a replacement for XF Bot Guard's normal protection. XF Bot Guard still performs the application-level detection. Cloudflare simply helps enforce against the worst repeat offenders earlier, before they continue consuming XenForo resources.
XF Bot Guard 1.1.9
Release type: Major update
This release significantly strengthens XF Bot Guard's cache-bypass protection, adds reverse-DNS verification for additional legitimate crawlers, improves feed/RSS handling, adds browser-validation page customisation, and expands the Health Check system so site owners can more easily detect configurations that may prevent XF Bot Guard from validating visitors correctly.
Changes
- Added a new protected-response cache shield for XF Bot Guard routes, challenge pages, browser-validation pages, collection endpoints, redirects, and protected public HTML responses.
- Expanded cache-header hardening beyond the previous DigitalPoint Cloudflare-specific compatibility handling.
- XF Bot Guard now sends stronger no-store/no-cache headers for protected responses, including headers intended for browsers, proxies, CDNs, LiteSpeed, NGINX, Cloudflare, surrogate caches, and other shared cache layers.
- Added a new Health Check probe that can test whether protected pages or XF Bot Guard routes appear to be served from a shared or full-page cache.
- Added Health Check reporting for common cache indicators such as Cloudflare, LiteSpeed, Varnish, proxy cache, FastCGI cache, NGINX cache, CDN cache, and other shared-cache headers.
- Added a Health Check action to refresh the shared full-page cache probe.
- Added clearer Health Check warnings when a server, CDN, proxy, or optimisation layer may be caching protected HTML in a way that can bypass XF Bot Guard.
- Added reverse-DNS and forward-DNS verification for additional legitimate crawlers that are not always covered by official published IP range data.
- Added verified crawler support for Yandex, Qwant, Seznam, and Applebot-style reverse-DNS verification.
- Added a new trusted crawler reverse-DNS domains option, allowing site owners to trust additional crawler domains when reverse DNS and forward DNS both confirm the request IP.
- Improved verified crawler logging so XF Bot Guard records whether a crawler was trusted by official IP range data or by confirmed reverse-DNS verification.
- Improved robot/activity classification so reverse-DNS verified crawlers can be represented more accurately in XenForo's online activity systems.
- Added dynamic robot definitions for custom trusted reverse-DNS crawler domains.
- Improved RSS, Atom, and feed request handling so feed clients are not redirected to interactive browser validation or CAPTCHA pages.
- Feed requests can now be allowed, scored, or quietly denied depending on trust status and risk, rather than being handled like normal browser page views.
- Added empty 403 responses for denied non-interactive feed requests.
- Added browser-validation page customisation options for the page title, heading, and message.
- Added safe text handling for browser-validation page customisation, including escaping, length limits, and line-break support for the message.
- Added an option to retain browser-validation allow logs without needing to enable all low-value event logging.
- Added self-server IP detection so XF Bot Guard can recognise its own server-side health-check and XenForo unfurl requests and avoid treating them like normal visitors.
- Added storage and cleanup for self-server IP detection data.
- Added storage and cleanup for reverse-DNS crawler verification results.
- Improved protection policy handling by centralising route, scope, static asset, AJAX, excluded IP, protected-area, and cache-shield decisions.
- Improved handling of failed browser-validation interstitial generation by falling back to the normal challenge flow instead of leaving the request in an unclear state.
- Improved online visitor handling by suppressing anonymous HEAD request activity updates when XF Bot Guard's online-count adjustment is enabled.
- Added an admin navigation entry for XF Bot Guard logs under the XenForo logs area.
- Added install and upgrade repair logic to ensure the XF Bot Guard admin navigation entry is present.
- Improved option parsing for textbox-style lists by allowing blank lines and comments.
- Updated Health Check wording and option explanations to better describe cache protection and verified crawler handling.
Notes
This is a major update.
The most important change is the new cache-bypass protection work. XF Bot Guard now applies stronger no-store cache headers more broadly across protected responses, not just in the previous DigitalPoint Cloudflare-specific scenario.
This does not mean every possible cache configuration is automatically safe. If a CDN, reverse proxy, server cache, optimisation add-on, or page-cache rule force-caches protected HTML before XenForo and XF Bot Guard can run, it can still bypass visitor validation. XF Bot Guard now detects and warns about more of these cases, but protected XenForo pages should still not be served from a shared full-page HTML cache.
Static assets such as images, CSS, JavaScript, fonts, and attachments can still be cached normally. The concern is cached public HTML pages that should have passed through XenForo and XF Bot Guard first.
The new reverse-DNS crawler verification layer is intended to reduce false positives for legitimate crawlers that identify themselves correctly but are not always covered by official published IP ranges. XF Bot Guard does not trust the User-Agent alone. Reverse DNS must match an expected crawler domain and forward DNS must confirm the same IP.
Be careful with the new custom trusted crawler reverse-DNS domains option. Only add domains for crawlers you genuinely trust. XF Bot Guard will still verify the DNS relationship, but trusting the wrong domain is still a site-owner configuration risk.
Feed handling has also changed. RSS and Atom feed clients should no longer be pushed into normal interactive browser validation. Trusted feed requests can be allowed, while suspicious feed requests can be denied without serving a CAPTCHA or browser-validation page.
If you use aggressive CDN, proxy, server-level, LiteSpeed, NGINX, Varnish, Cloudflare, or optimisation add-on caching, review the XF Bot Guard Health Check after upgrading.
XF Bot Guard 1.1.8
Release type: Major update
This release adds a new reverse-DNS hosting/datacentre detection layer, improves compatibility with online bot/statistics handling, and adds protection against incompatible guest-page caching configurations that can prevent XF Bot Guard from validating visitors correctly.
Changes
- Added reverse-DNS hosting and datacentre detection for public IP addresses.
- Added a new hosting/datacentre reverse-DNS score option, enabled by default.
- Added a new reverse-DNS cache table so confirmed hosting/datacentre results can be reused without repeated DNS lookups.
- Added support for detecting many common hosting, cloud, VPS, proxy, and datacentre networks by confirmed reverse-DNS patterns.
- Improved handling of visitors coming from confirmed hosting/datacentre networks so they can be scored more accurately before the final allow/challenge decision is made.
- Added new Health Check entries for reverse-DNS hosting detection, including cache status, confirmed matches, resolver errors, and stale pending lookups.
- Improved compatibility with the Known Bots add-on when XF Bot Guard is managing online visitor and challenge statistics.
- When XF Bot Guard’s online-count adjustment is enabled, XF Bot Guard now suppresses overlapping public robot statistics from Known Bots so visitor counts are not double-handled or misrepresented.
- Added ongoing compatibility enforcement for Known Bots during install, upgrade, online-count calculation, and scheduled cleanup.
- Added compatibility detection for DigitalPoint Cloudflare guest page caching.
- Added a new option to disable incompatible DigitalPoint Cloudflare guest page caching when XF Bot Guard is active.
- Added a Health Check warning when DigitalPoint Cloudflare guest page caching is enabled in a way that may bypass XF Bot Guard validation.
- Added a Health Check action button to disable the incompatible DigitalPoint Cloudflare guest page cache configuration directly from the XF Bot Guard health page.
- Added public HTML cache-header hardening when DigitalPoint Cloudflare compatibility protection is enabled.
- Improved Members Online template modification compatibility.
Notes
This update may challenge more traffic from confirmed hosting, VPS, cloud, proxy, and datacentre networks. That is intentional.
Most normal residential visitors should not be affected by the new reverse-DNS scoring layer.
If you use DigitalPoint Cloudflare and have guest page caching enabled, XF Bot Guard may warn that this configuration is incompatible. Guest page caching can serve cached HTML before XenForo and XF Bot Guard have a chance to validate the visitor, so it should be disabled when using XF Bot Guard.
If you use the Known Bots add-on, XF Bot Guard does not disable Known Bots itself. It only suppresses the overlapping public robot statistics option when XF Bot Guard is configured to manage online visitor/challenge counts.
XF Bot Guard 1.1.7
Release type: Minor update
This minor update improves how XF Bot Guard’s browser-validation JavaScript is loaded, helping avoid stale cached files after upgrades.
- Loads Bot Guard’s main JavaScript directly instead of through XenForo’s normal JS include/combiner path.
- Adds version-based cache busting to Bot Guard’s JavaScript and bundled fingerprinting script.
- Helps Cloudflare, CDN, browser, and JavaScript-combiner caches pick up the latest Bot Guard files more reliably after an update.
- Keeps the script base path unversioned internally so dynamically loaded assets continue resolving correctly.
XF Bot Guard 1.1.6
Release type: Minor update
This update improves the reliability of the “Validating browser…” interstitial flow, particularly for fresh visitors who may not yet have a fully established XenForo cookie/session state.
Changes
- Improved handling of the interstitial browser-validation collect request so it is processed earlier in the XenForo request lifecycle.
- Added a small client-side breathing-space delay before the interstitial collect request is sent.
- Added automatic back-off and retry handling if the interstitial collect request temporarily fails.
- Added a fallback path: if the interstitial collect still cannot complete after retries, the visitor is redirected to the full XF Bot Guard challenge page instead of being left stuck on the validating screen.
- Ensured XF Bot Guard’s own challenge route is never served through the lightweight interstitial flow.
- Added clearer AJAX/JSON request handling for the collector request.
The normal non-interstitial fingerprint/collect flow is not changed. This update is specifically aimed at making the lightweight interstitial flow recover properly in edge cases.
Important for Cloudflare / CDN / cache users
This update changes the JavaScript file:
Code:/js/zee/botguard/botguard.js
If you cache static assets through Cloudflare, another CDN, a reverse proxy, or a server-side cache layer, purge the cached copy of that file after upgrading.
If you are testing the fix immediately after upgrading, you should also visit that JavaScript URL directly in your browser and hard refresh it. This helps ensure your own browser is no longer using the old cached JavaScript.
After that, test the validating-browser flow again in a fresh private/incognito window.
Minor update to the Members Online feature.
- Visitors currently being challenged or validated by XF Bot Guard are now kept out of XenForo’s robot classification, keeping the online list and Bot Guard counts better aligned.
- Trusted or explicitly allowed bot traffic are now marked as robots in XenForo’s online activity where appropriate.
This update was added because XenForo’s robot detection is primarily based on User-Agent values, which can be easily spoofed. XF Bot Guard has stronger signals available, so this update helps align XenForo’s online activity classification with XF Bot Guard’s trust and challenge decisions.
This minor update improves Bot Guard’s Members online / Current visitors reporting for visitors held in verification states, while reducing unnecessary writes to XenForo’s session activity table.
- Visitors moved from browser validation into the normal verification challenge are now shown with the correct Bot Guard activity status instead of remaining listed as “Validating browser”.
- Bot Guard now coalesces repeated verification-state activity updates, reducing unnecessary
xf_session_activitywrites while still keeping Members online accurate.- Verification challenge and solve states are now written consistently to XenForo’s session activity table, while background collector submissions remain hidden from the visible activity state.
New Browser Validation Bootstrap
This update adds a new lightweight browser validation step for fresh visitors before protected forum content is rendered.
Instead of giving an unverified visitor immediate access to the requested page, XF Bot Guard can now serve a small validation page that runs the browser collector first. Real browsers complete the collector and are returned to the requested page automatically. Clients that do not run the collector do not receive the protected content.
Protects content before browser proof exists
The new bootstrap flow is designed to stop hit-and-run scraping where a client requests a page, receives the content, and leaves before any browser evidence is collected.
Code:Fresh visitor + No Bot Guard browser proof = Validating browser page first
The validation page is intentionally small and does not include the protected thread, forum, member, search, or resource content.
If the browser collector succeeds, the visitor is returned to the original page and normal browsing continues.
Cloudflare-style clearance flow
This behaves similarly to a challenge clearance flow, but uses XF Bot Guard’s own browser collector instead of an external challenge service.
Code:Request protected page → Validate browser → Collector succeeds → Return to original page → Render protected content
This helps separate normal browsers from simple HTTP clients, no-JavaScript crawlers, and low-effort scrapers.
No extra setup required
This uses the existing bootstrap option:
Code:Run browser validation bootstrap before challenging fresh visitors
There is no new public interstitial option to configure.
The existing bootstrap setting now means fresh visitors can run browser validation before being sent through heavier challenge handling.
Native XenForo implementation
The validation page is generated inside XenForo using Bot Guard’s normal request context, routing, collector proof, and return URL handling.
It does not run the requested page controller and does not render the full XenForo page container.
That keeps the response lightweight while still keeping the feature inside the normal XenForo add-on architecture.
Short-lived collector proof
Bootstrap validation uses a short-lived signed collector token.
The token is bound to the validation context and expires quickly. A successful collector submission records the normal Bot Guard browser proof and sets the existing Bot Guard continuity cookies.
Normal page-based collector submissions continue to use the existing collector path.
Members online visibility
Visitors currently on the validation page now appear in Members online as:
Code:Validating browser
They are also included in the existing Bot Guard challenged/bot count rather than being shown as normally viewing the protected content.
This makes the online list more accurate: the visitor is not actually viewing the requested page yet; Bot Guard is waiting for browser proof.
Better behaviour against no-JavaScript crawlers
Many crawlers and scrapers do not run the browser collector at all.
Those clients now remain on the validation page and do not receive the requested protected content.
Code:No collector POST = No protected page content
This is especially useful for crawlers that present browser-like headers but do not behave like a real browser.
Verified crawlers still bypass normally
Official verified crawler/fetcher IP matches continue to be allowed before risk scoring and before browser validation.
This means supported search engine crawlers can still receive normal content when their request IP matches the imported official provider ranges.
Strict no-proof mode deprecated
The previous strict no-proof behaviour is no longer needed in the normal decision path.
Browser validation now withholds protected content before browser proof exists, so missing proof no longer requires a separate strict-mode shortcut to avoid exposing content.
Normal challenge handling still applies when bootstrap validation is unavailable, disabled, failed, or the request otherwise reaches the configured risk threshold.
Cleaner admin wording
The bootstrap option and related wording have been updated to describe the new behaviour more accurately.
The feature is now described as browser validation bootstrap, not as allowing a real page through before fingerprint collection.
Event log visibility
When the validation bootstrap is served, XF Bot Guard logs the existing bootstrap event with metadata showing that protected content was not rendered.
Relevant metadata may include:
Code:bootstrap_delivery: collector_interstitial protected_content_served: false online_state: validating_browser challenge_type: collector_interstitial
This keeps the existing bootstrap counters meaningful while making the new behaviour clear in the event log.
Production-focused performance
The validation path is designed to avoid expensive page rendering for fresh unverified visitors.
It does not render the requested thread/forum page, does not run the target controller action, and avoids full risk scoring on the fast validation path where possible.
This makes it much cheaper to handle large volumes of simple bots that never complete browser collection.
Summary
This update changes bootstrap handling from a content grace path into a browser validation path.
Normal browsers should pass through automatically. Verified search crawlers remain allowed through the official crawler IP system. Simple crawlers and scrapers that do not complete browser collection are held at the validation page and do not receive protected content.
This is an important maintenance release that corrects the “Bots” calculation in XenForo’s “Members online” area, and improves how XF Bot Guard records routine visitor activity under heavier traffic conditions.
- Fixed an issue where the “Bots” count would underreport visitors that XF Bot Guard had identified as bots. This was a display/counting issue only and did not affect bot detection, challenge decisions, or protection behaviour.
- Reduced unnecessary per-request database updates during normal request tracking to help lower database lock contention on busy forums or during bot traffic surges.
- Improved routine identity tracking so Bot Guard now uses lighter heartbeat-style updates for ordinary activity, while still recording important state changes when they occur.
- Security-critical handling such as challenge decisions, browser verification, CAPTCHA attempts, CAPTCHA passes, CAPTCHA failures, and trust handling remains active and is not weakened by this change.
- No intended challenge outcome or visitor verification behaviour has changed in this release.
We use essential cookies to make this site work, and optional cookies to enhance your experience.