Skip to content

Seven systems, explained mechanism by mechanism.

Everything below ships in the extension today. Nothing here is a roadmap item, and nothing carries a number it can't earn — just what each part does and how it does it.

7 systems 49 mechanisms All of it in one license

Page Cache

Served before OpenCart boots.

A hit is answered from catalog/index.php, ahead of the framework. Everything below governs what gets served, for how long, and what happens while it's being rebuilt.

Pre-framework serving
Cached pages are served from catalog/index.php before OpenCart boots — zero database queries on a hit.
Precompressed copies
Every cached page keeps a precompressed .gz copy on disk, so gzip compression happens once instead of on every request.
ETag and Last-Modified
Cached pages carry an ETag and a Last-Modified header, so an unchanged repeat request gets a 304 instead of the page again.
Per-route TTL
Individual routes can override the default cache lifetime, and every TTL carries expiry jitter so pages don't all expire at the same instant.
Soft-bust epoch
A soft-bust epoch marks the whole cache stale at once, without deleting a single file from disk.
stale-while-revalidate
An expired page keeps being served while a fresh copy is rebuilt in the background — a visitor never waits on the rebuild.
stale-if-error
If a background rebuild fails, the last good cached copy keeps being served instead of an error.
Caching for logged-in customers
Optional. Signed-in visitors read the same shared guest cache; their cart and account details are filled in server-side, before the response is sent, by Dynamic Fragments — and a logged-in render is never itself stored. Not recommended for stores with per-group pricing — the admin warns about this.
Dynamic Fragments
Per-visitor regions — the cart, above all — are filled with that visitor's own markup entirely server-side, before the bytes are sent: no JavaScript, no mask and no post-paint swap needed. Three steps do it, all fail-open: stash keeps a visitor's live render of a fragment route from after their last cart action; mark locates that fragment's configured id-selector element in a shared cached page and wraps it in markers; apply replaces the wrapped element with the visitor's stashed copy at serve time. It matches id selectors only, not classes, and any step that can't find its match just leaves the cached guest markup in place.
Entity purge and re-warm
Editing a product, category, information page or manufacturer purges just the pages it affects and queues them for the next warm run.
The cron watcher
Catches edits made outside OpenCart entirely — an ERP or feed script writing straight to the database — by watching each row's date_modified.
Canonical Domain Redirect
Optional. 301-redirects the un-configured www or apex twin of a store domain to the configured one, so there's one cache tree and no duplicate URLs for search engines. The host map is generated from the store table, never hand-edited.

Query & Data Cache

One write invalidates one table, not everything.

The database work behind a page is cached too, with invalidation narrow enough that a single write doesn't have to empty the whole cache.

Query cache
Storefront SELECT results are cached with per-table invalidation markers, so a write to one table drops only that table's cached reads.
Journal3 result cache
Journal3's own result cache is included alongside the rest of the query cache.
Fast File Cache
Optional. Replaces the internals of OpenCart's stock Cache\File driver: exact-name reads and a 30-minute folder sweep, instead of a whole-folder glob on every request.
Slow-query log
Every slow query is logged with an EXPLAIN summary attached.
Oversized-result log
Database queries that return an oversized result set are logged separately.

Assets

Smaller payloads, without paying for it twice.

CSS and JS are processed once and reused, and the processing itself is spent only where the result is kept.

Minification
HTML, inline and file CSS, and JS are all minified.
Bundling
CSS and JS files are bundled to cut the number of requests a page needs.
Async and critical CSS
Critical CSS is inlined so above-the-fold content can render immediately, while the rest of the stylesheet loads asynchronously.
Deferred JS
Scripts are deferred so they don't block the page from rendering.
Delayed third-party scripts
Third-party scripts load later, after the page itself.
Resource hints
Hints are added to the page so the browser can start work on resources it will need before it asks for them outright.
Speculation Rules
Likely next pages are prefetched and prerendered through the Speculation Rules API, with an intent-based fallback for browsers that don't support it yet.
Minification is skipped on uncached renders
Byte-shaving minification only runs on responses that get stored and re-served — a dynamic, uncached page never pays a minification cost it can't get back.

Images

Every image pulls its weight, not more.

Image handling runs through OpenCart's own resizer rather than a parallel pipeline, so it stays in step with everything else on the page.

Lazy loading
Images load only as they approach the viewport.
Explicit dimensions
Images carry explicit width and height, so the browser reserves their space and the page doesn't jump as they load.
LCP preload
The page's largest expected image is preloaded, so it isn't the reason Largest Contentful Paint runs late.
WebP generation
WebP versions are generated through hooks into OpenCart's own image resizer, rather than a separate pipeline.
Fast-resize prepass
Unusually large source images go through a fast-resize prepass before OpenCart's normal resize step runs.

Protection

Bad traffic is turned away before it costs anything.

The same pre-framework path that hands back a finished page also turns away requests that have no business reaching OpenCart at all.

Request firewall
URL patterns and user agents are matched before the framework loads; a blocked request gets a 403 pre-framework, the same as a cache hit.
Bot throttling
Cache misses from listed scrapers get a 503 instead of running the full request.
Reverse-DNS verification
A visitor claiming to be a major crawler is checked against reverse DNS — a fake Googlebot gets throttled instead of trusted.
Instant 404
Optional. Requests for static files that don't exist get an instant 404, pre-framework.
Cookie-less session guard
Optional. Stops bots that don't carry cookies from bloating the session store.
Admin login lockout
Repeated failed admin login attempts lock the account out.

Warmer

The cache fills itself in, before a visitor has to.

A crawler run from cron keeps the cache populated as a guest, so a real visitor rarely finds a cold page.

CLI cron crawler
Runs from cron as a guest visitor, crawling the store to rebuild its cache.
Load-aware and resumable
The warm run backs off under load and can resume where it left off instead of starting over.
Seeded from real traffic and page links
What to crawl comes from real traffic plus the links found on each page already warmed.
Every device variant
When per-device caching is on, the warmer builds a cached copy for every device variant, not just one.

Dashboard

Everything the engine is doing, in one place.

The admin dashboard is where the cache, the warmer and the firewall are watched, tuned and cleared.

Health score
A health score with actionable recommendations, built from runtime checks: bypass share, un-configured domains, and warm-cron freshness.
Hit-ratio history
A history of the cache's hit ratio over time.
Live traffic monitor
A live view of traffic hitting the store.
Slow queries
The slow-query log, surfaced on the dashboard itself.
URL purge
Individual URLs can be purged from the cache on demand.
Database index and table tools
Tools for managing database indexes and tables directly from the dashboard.
Orphan and stale row maintenance
Orphaned and stale rows can be found and cleaned up from the dashboard.
Settings export and import
The settings blob can be exported and imported.
Live-bypass browsing
A ?nitro=<token> query string lets you browse the live, uncached page for testing, while every other visitor still gets the cache.

Design principles

Three rules the rest of this page assumes.

Fail open, everywhere
Any internal error falls through to stock OpenCart behavior — the request continues as though Nitro were not installed.
Never cache personalized output
Dynamic renders are structurally excluded from the shared cache — there is no path that would let one in.
Every ocmod hook is guarded
Every core patch no-ops when Nitro is disabled or absent, so turning it off leaves nothing behind.

Every setting

Every switch, and what it actually does.

Nitro ships with sensible defaults and a profile that sets them all at once. This is the whole surface, in case you want to go further.

Cache

What is served from disk, for how long, and who never gets a cached page.

Status
Master switch. Off means Nitro does nothing and OpenCart runs as it always did.
Profile
Sets every switch below in one go: Safe, Recommended or Aggressive. Lists and credentials are never touched.
Full-Page Cache
Serves cached HTML to guests before OpenCart boots. Logged-in visitors and carts always get a live page.
Cache Lifetime
How long a page is served before it is rebuilt. A catalogue edit clears it immediately anyway.
Background Refresh After
Past this age the page is still served instantly and refreshed behind the visitor, so nobody waits.
Per-route Cache Lifetime
A different lifetime for pages matching a pattern. First match wins.
Ignored URLs
Any page whose URL contains one of these is never cached and never served from cache.
Ignored URL Parameters
Stripped before the URL becomes a cache key, so utm and gclid links share one cached page.
No-cache Cookies
A visitor holding one of these cookies is served live — nothing of theirs is cached or stored.
Separate Cache per Cookie
A different cached page rather than no cache at all — for a chosen store or a B2B price group.
Per-Device Cache
Desktop, mobile and tablet cached apart. Only needed if your theme sends different HTML to each.
Cache for Logged-in Customers
Serves logged-in customers from cache with their own cart filled in on the server.
Skip Cache for Active Visitors
Anyone who already has a cart or a voucher gets a live page, so the cart area is right on every theme.
Serve Stale On Error
If a page errors while rendering and a cached copy exists, the last good copy is served instead.
Max Cache Size
Caps the cache on disk. The warmer deletes the oldest files when it goes over. 0 is unlimited.
Browser Cache Headers
Cache-Control, ETag and Last-Modified on cached pages, so browsers and CDNs revalidate cheaply.
Canonical Product URLs
Caches a product once instead of once per category path it can be reached through.
No-index Filtered URLs
Keeps filtered and sorted listings out of search results without stopping them being crawled.
Query Cache
Caches storefront SELECT results and invalidates them per table, so a write drops only that table.
Fast File Cache
Replaces OpenCart's own file cache, which slows every page down as it grows. Same data, same behaviour.
Query Optimization
Curated, safe rewrites of known OpenCart product queries — nothing speculative.
Product Price Index
Precomputes special and discount prices so listing pages do not work them out per product.
Template Optimization
Renders with a faster template engine, and falls back to the standard one if anything is unusual.
License Email
Your license covers this address and this domain together, so it must be the address you bought with.

Frontend

What reaches the browser, in what order, and what is allowed to block the first paint.

Minify HTML
Strips whitespace and comments from the cached document.
Minify CSS & JS
Byte-shaving only. It does not change load order, so it is safe on essentially any theme.
Bundle CSS Files
Combines local stylesheets into one file, rebasing url() so fonts and images still resolve.
Bundle JS Files
Combines local scripts into one, skipping async, defer and module scripts to preserve execution.
Bundle Exclude
Filenames kept out of the bundles — theme libraries that ship their own loader.
Async CSS
Loads stylesheets without blocking the first paint, with a noscript fallback.
Critical CSS
Above-the-fold CSS inlined at the top of the head so the first paint waits for nothing.
Automatic Critical CSS
Works out those styles for you. A heuristic — check the result rather than assuming it.
Defer JavaScript
Adds defer to external scripts so they stop blocking rendering.
Defer Exclude
The one library that breaks when deferred, left blocking on purpose.
Delay Third-party JS
Matching third-party scripts wait for the first interaction instead of loading with the page.
Resource Hints
preconnect, dns-prefetch and preload lines for the hosts and files the page really needs.
Prefetch on Hover
Fetches the next page the moment a visitor shows intent, so navigation feels instant.
Prefetch Mode
Prefetch downloads the next page; prerender builds it too — faster, but heavier.
Content Visibility
Lets the browser skip layout and paint for sections until they scroll into view.
Below-fold Selectors
Which sections that applies to, one selector per line.
Journal3 CSS to Files
Moves Journal3's theme CSS out of every page and into cached files.
Dynamic Fragments
The regions filled with each visitor's own version — the cart, and anything like it.
Fill Personal Areas on the Server
Fills those regions before the page is sent, so one cached page works for everyone.

Images

Image work runs through OpenCart's own resizer, so it stays in step with the rest of the page.

Serve WebP
Serves WebP where a smaller copy can be made, linking it directly so old browsers still get the original.
Image Quality
Encode quality for resized JPEG and WebP. 80 is the balance point.
Fast Image Resize
Makes thumbnails of very large images without timing out — the usual cause of a broken thumbnail.
Image Dimensions
Adds width and height where they are missing, so the browser reserves the space and nothing jumps.
Lazy-load Images
Off-screen images load late; the first one stays eager so the largest paint is not delayed.
Learn LCP Image
Measures which image a real browser paints largest, then preloads exactly that one next time.

Protection

The same pre-framework path that hands back a finished page also turns away what should never reach OpenCart.

Request Firewall
Refuses known attack and probe requests before OpenCart loads, so they cost almost nothing.
Blocked Patterns
Common attacks are blocked already. This is for your own additions, like /phpmyadmin.
Blocked User-Agents
Bots refused outright. Never put Google or Bing here.
Throttle Scraper Bots
Scrapers still get cached pages; they just stop forcing fresh ones.
Throttled Bot Agents
Which bot names that applies to.
Block Bot Sessions
Stops bots filling the session table, which is what grows it to gigabytes.
Instant Static 404
Answers requests for missing images, CSS and fonts instantly instead of building an error page.
Client IP Source
Where the visitor's address is read from — direct, or from the proxy in front of you.
Trust Forwarded HTTPS
Only for a store behind Cloudflare, a CDN or a load balancer that terminates HTTPS.

Warming and diagnosis

Keeping the cache full without a visitor paying for it, and seeing what is slow.

Cron Command
Crawls the storefront as a guest from cron so a real visitor rarely finds a cold page.
Warm Load Ceiling
Warming pauses while the server load is above this, so it never competes with real traffic.
Track Slow Queries
Logs database queries past the threshold, grouped with literals masked, so you can see what to index.
Slow Threshold
How many milliseconds counts as slow. 50 is a sensible starting point.

See what it costs.

One license, one store domain, forever. No tiers.

See pricing