Documentation

Nivoli Edge docs

Everything the plugin does and how to drive it, from a five-minute managed setup to self-hosted zones, rules, purging, and the CLI. Plugin version 1.57.0.

How it works

Nivoli Edge has two halves that share one plugin and, on managed plans, one license key:

The HTML your theme outputs is never restructured; only URLs change, at the filter boundary. Add the no-cf CSS class to any element to opt it out.

Quickstart: managed (recommended)

No Cloudflare account, plan, or DNS work.

  1. Install and activate the plugin.
  2. Open Nivoli Edge → Managed Edge → License and paste your key (it arrives by email the moment checkout completes; every plan starts with a 14-day free trial). Activation provisions a CDN tenant and fills the rewrite settings in automatically.
  3. For page caching, paste your dashboard URL from the welcome email under Settings → Page cache.
  4. The Dashboard's pipeline check should read ✓ working. Done.

Quickstart: self-hosted (free)

Images need a Cloudflare zone with Image Resizing enabled on the host that serves them (bundled with Cloudflare Pro plans, or pay-per-1000):

  1. Proxy the image host through Cloudflare (orange cloud) and enable Speed → Optimization → Image Resizing.
  2. Verify with any image: https://yoursite.com/cdn-cgi/image/width=200/wp-content/uploads/….jpg must serve a resized image. A 404 or error 9421 means Image Resizing isn't on.
  3. In Nivoli Edge → Settings, confirm the auto-detected image host + path prefix and toggle Enabled.
  4. Open Image rules → Size mapping and click once to create rules for your theme's registered sizes. The catch-all covers everything else.

Pages need a tag-aware edge you already run: pick Fastly, Cloudflare Enterprise, or a custom webhook under Settings → Page cache and supply the token. The plugin verifies the token actually has purge permission at setup time.

Image rules & presets

Every rewrite goes through a preset, a named recipe of width, height, fit, format, quality, and srcset behavior. Presets attach to images via bindings:

BindingMatches
Size-nameA registered WordPress size (thumbnail, medium, custom). Checked first.
Filename-globA pattern like *__square.*. Checked when no size-name matches.
Dimension fallbackFilenames with a -WxH suffix transform at exactly those dimensions.
Catch-allEverything else gets format=auto + a 1920px cap. Recommended on.

Size mapping creates presets + bindings from your theme's registered sizes in one click. Inline content, CSS backgrounds, and lazy-load data attributes are covered by the content scan toggles under Settings → Behavior.

Page caching & purging

# Every page response carries the tags it was built from
Surrogate-Key: post-42 category-7 author-3 home

# One post save → one surgical purge
POST /purge  { "keys": ["post-42", "category-7", "home"] }

Purges dispatch non-blocking on save, delete, and comment events, so editing never waits on a CDN round-trip. The purge activity log lives under Diagnostics → Page cache; prewarm-after-purge re-fetches affected URLs ~45s later so the next visitor hits a warm cache. Theme and plugin developers can add tags via the nivoli_edge_pc_keys_for_request / nivoli_edge_pc_keys_for_post filters.

Audits & repair tools

Automation & alerts

Debugging

ToolWhat it shows
?cfdebug=1Front-end overlay (admins only): badges every image hit/miss/skip with the matched preset, plus grouped miss patterns.
?ect_trace=1Page-cache trace: the tags a page carries and why it is or isn't cacheable.
Live probeDiagnostics tab: fetches a real Media Library image through the full pipeline and reports each stage.
Feature mapDiagnostics tab: every feature, its on/off state, and where to configure it.

WP-CLI

# status of both halves
wp nivoli-edge status

# activate a license / enable optimization
wp nivoli-edge activate <key>
wp nivoli-edge enable

# run the coverage audit / probe the pipeline / purge tags
wp nivoli-edge audit
wp nivoli-edge probe
wp nivoli-edge purge post-42 home

Built for agency provisioning: every setup step scriptable, exit codes are meaningful.

The managed service

A license key connects the plugin to the Nivoli edge, which runs both halves for you and adds what a plugin alone can't. Everything below lives in WP admin under Managed Edge; metrics are cached for an hour and served instantly, with a Refresh data link in the rail when you want live numbers.

Quota model: plans meter transforms: unique image variants in a rolling 30-day window. Cached re-serves are free and unlimited; full-page caching is included under fair use. Over the cap, optimization pauses gracefully: images keep serving from your origin, nothing breaks.

Origin Shield

Always on, nothing to configure. When your server errors or stops responding, the edge serves the last good cached copy of every page for up to 7 days. You get an email when the shield engages and another when your origin recovers (switchable under Email & reports). The Origin shield pane keeps an incident history with honest durations; scattered single-request errors are counted separately as blips, not stitched into fake outages. "Not covered" requests are pages nobody had visited recently: a higher cache hit rate widens the shield.

The edge security suite

All enforced at Cloudflare's edge, before a request reaches PHP; they complement Wordfence/Sucuri rather than replace them. The Edge shields pane opens with an attack-surface strip: XML-RPC blocked vs reached, logins stopped, AI crawlers and wp-admin hits blocked, over the last 14 days.

Underneath all of them: every managed site is a custom hostname on a Cloudflare zone with the managed WAF rulesets enabled, including the WordPress rule set that virtual-patches known plugin vulnerabilities, and Cloudflare's network absorbs volumetric attacks before they reach the edge worker or your server. The shields above are what Cloudflare does not know to do for WordPress on its own.

Hardening: what runs where, and what survives a takeover

The question that matters for a security control is not what it stops but where it lives. A control inside WordPress stops working the moment WordPress is owned. Everything in the first group below runs at the edge and is configured at the edge, behind an email confirmation to the license address, so a compromised site can neither reach it nor switch it off.

ControlRunsConfiguredSurvives a WordPress takeover
Ten shields (floods, XML-RPC, country lock, admin IP lock, AI crawlers, stray PHP, surface lock, headers)edge, before PHPedge, change lockyes: the intruder cannot switch them off from inside
Change lockedgeedge, confirmation by emailyes: turning it off is itself a confirmed change
Install lockedge, before PHPedge, change lockyes: no plugin, theme or file change without the license holder, for traffic that reaches the edge
Origin lockinside PHP, first thingedge (secret), change lockpartly: closes the direct-to-origin side door; code execution on the box can still remove the plugin
Cloudflare managed WAF and DDoS absorptionCloudflare networkby us, per zoneyes
Wordfence, Sucuri and other security pluginsinside PHPinside WordPressno: an administrator can deactivate them, and code execution can edit them
DISALLOW_FILE_MODS in wp-config.phpinside PHPon the serverpartly: stops an administrator, not code execution

The origin side door. Every edge control applies to traffic that reaches the edge. Anyone who knows the origin's IP address, its hosting-panel hostname, an unregistered www or apex twin, or a staging vhost on the same docroot can talk to WordPress directly and none of the shields or locks apply. Three things close it, in order of strength: the origin lock (plugin 1.56.0): the edge stamps a per-site secret on every forwarded request and the plugin refuses code-change requests without it, and its weekly self-test reports whether the server really enforces it; an origin firewall that accepts port 443 only from Cloudflare's address ranges; and Authenticated Origin Pulls, where the origin requires Cloudflare's client certificate. Do the first today; do the second if you control the server's firewall.

What no edge control can do: undo a compromise that already has code execution on the server. The locks stop it from extending through WordPress tooling and from silencing the shields, and every attempt reaches the license address as the confirmation email, which is how you find out. Restore from a clean backup remains the answer to an owned box.

Audience analytics

On Stats & overview: human pageviews vs bots (14 days), visitors per day, top referrers, visitor countries, devices and regions, plus served-from-cache timing vs your origin's render time. Measured entirely at the edge from traffic you already serve: no tracking script, no cookies, no consent banner needed, and no visitor-level data is ever stored. A monthly audience digest rides along with the stats email.

URL rules and the 404 cleanup inbox

URL rules block dead routes with a cached 410 or redirect moved pages with a 301/302, straight from the edge, with per-rule hit counts and a what-was-blocked log. The Redirects pane carries a suggestions inbox: the edge watches which URLs 404 against your origin and proposes block/redirect rules (with guessed targets) that you apply in one click. URL rules live under Security in the rail, because blocking is how the pane is used. The Redirects pane keeps the one-to-one mappings: it shows which redirects actually fire, folds unused ones away, and when a migration leaves a family of one-offs that differ by a number, proposes the single pattern that covers them all and merges them in one click.

Edge controls

The rail groups the panes that decide what the edge keeps, separately from the panes you read daily:

The same pane reports what your origin's own Cache-Control is doing. no-store is always obeyed, with no setting, because it is plain HTTP correctness and it is what makes the translated-slug case work. no-cache and private are softer (no-cache means "revalidate", not "never store", and themes emit both carelessly), so the edge counts them from day one and stops caching them only when you switch to Enforce. Switching also purges what is already stored, since a page cached before the switch would otherwise keep being served. An enforced directive reports as BYPASS rather than MISS, so an uncacheable page cannot show up as a fake 0% hit rate. Counts for a merely measured directive are a floor: the response is still cached, so only the requests that reach your origin carry a marker.

Reporting is available on every managed plan, because it is diagnostic. Switching to Enforce is gated like the other advanced controls (Growth+); returning to measure never is.

Static assets and asset URL versioning

Stylesheets, scripts and fonts are answered by the edge node nearest each visitor, with the browser lifetime your server already sets left exactly as it is. The Static assets pane reports that population on its own, images excluded (images run through the image pipeline and are reported on the Dashboard): the edge hit rate, the share of requests on versioned addresses, distinct files, bandwidth the origin did not serve, a per-type table (stylesheets, scripts, fonts, other), your most-requested files that still travel on plain addresses, and the files your server marks no-cache, private or Set-Cookie so the edge must fetch them every time.

Asset URL versioning (every managed plan, off until you switch it on) gives every stylesheet, script and font an address that changes when you purge. A purge clears the edge's copy; a browser that already holds a file keeps it until its own timer runs out, and no purge can reach it. With versioning on, the next page load references new addresses, so browsers pick up changed files immediately. The rewrite happens at the edge on the way out: your files and the HTML on your server are untouched, and a file keeps its plain address only when its URL appears solely inside a stylesheet or script (the rewriter reads pages, not those files), when the page referencing it was cached before the last purge (resolves itself as pages re-render), or when that page was too large to rewrite. Purge cache now on the same pane moves every asset to a new address at once.

Client reports and the agency console

The printable client report (Tools) is white-label: your name and logo, no vendor branding. On Business+ the monthly delivery report can also email itself to up to 3 recipients under your brand (Email & reports → Branded client reports), and each site can additionally send its own numbers to its own client.

Fleet management lives in its own console at console.nivoli.com, outside WordPress, so you do not sign into a client's site to see how the fleet is doing. Sign-in is by magic link to your account email, with no password to share around a team. The Overview carries four things:

The Sites table lists page hit rate, bandwidth and 48-hour failures per site, with Manage into that site's dashboard, a per-site purge, and a direct WP admin link.

What unlocks where

Matching what the server actually enforces:

FAQ

Will this break my theme?

No. Only URLs change, at the filter boundary. The HTML structure is untouched, and no-cf opts any element out.

How is this different from Smush / ShortPixel / Optimole?

Those compress and re-host your images on their CDN. Nivoli Edge transforms on the fly from your origin: no duplication, no migration, no storage bill.

I run a membership site or an LMS. Is this for me?

Partly, and here is the honest split. Everything public is cached and shielded normally: your sales page, catalog, pricing and blog, which is usually where most of the traffic and all of the signups are. Security before PHP, image delivery, edge analytics and surgical purge apply to every visitor, signed in or not. But a logged-in member's page views are not cached, so they get no edge time to first byte and no outage coverage. We have not built per-user cache buckets or edge-side includes. If the pages that need to be faster are the ones behind the login, better hosting or an origin-side cache will move that number and we will not. The fuller version is here.

Does this replace WP Rocket, FlyingPress or NitroPack?

No, and it does not try to. Those own the render path: minification, critical CSS, unused-CSS removal, script deferral, lazy loading, font handling. Nivoli Edge ships none of that. We answer the request from the node nearest your reader, keep the site up when your server stops, block junk before PHP starts, and measure all of it at the edge. Keep your optimizer and run both; they touch different layers. If you are comparing PageSpeed scores alone, an optimizer is the tool that moves them. If your problem is time to first byte, outages, scanners or not knowing what your edge actually serves, that is this.

Does the page caching conflict with Wordfence / Sucuri?

No, these are different layers. Security plugins inspect requests inside PHP; the edge shields stop junk before it reaches your server. They complement each other.

Do I need to change my web-server config?

Only if your origin runs its own micro-cache (nginx fastcgi cache, Varnish) and you use the manual purge trigger; the Cache protection pane shows the exact snippet. A standard PHP-FPM origin needs nothing.

What happens if I cancel a managed plan?

The plugin reverts to serving originals from your own server. Your site stays up; the free feature set keeps working.

Privacy & external services

The free tier's core rewriting contacts no external service. Opt-in integrations: the Nivoli managed edge (license verification + usage stats; no visitor data), Cloudflare / Fastly APIs (only with your own tokens, for purges), and Tinify (only images you explicitly compress, with your own key). Full details in the plugin readme, Terms, and Privacy Policy.