Documentation
Everything you need to install, configure, and run CacheWarmer.
Getting Started
CacheWarmer automatically warms CDN caches, updates social media previews, and notifies search engines about your content. It is available as a WordPress plugin, Drupal module, or standalone Node.js service.
Choose Your Platform
Installation
WordPress Plugin
Install the CacheWarmer plugin from the WordPress dashboard or via WP-CLI.
# Option 1: WP-CLI
wp plugin install cachewarmer --activate
# Option 2: Upload via Dashboard
# Go to Plugins → Add New → Upload Plugin
# Upload the cachewarmer.zip file and activateAfter activation, navigate to Settings → CacheWarmer to configure your warming targets and API keys.
Drupal Module
Install the CacheWarmer module via Composer.
# Install with Composer
composer require drupal/cachewarmer
# Enable the module
drush en cachewarmer -y
# Clear cache
drush crAfter enabling, navigate to Configuration → System → CacheWarmer to configure your settings.
Self-Hosted (Node.js)
Deploy via Docker or install from source.
Docker (Recommended)
# Pull and run with Docker Compose
docker compose up -d
# Or run directly
docker run -d \
--name cachewarmer \
-p 3000:3000 \
-v $(pwd)/data:/app/data \
-v $(pwd)/config.yaml:/app/config.yaml:ro \
drossmedia/cachewarmer:latestFrom Source
# Download the latest release from the CacheWarmer website
cd cachewarmer
npm install
cp .env.example .env
# Edit .env with your configuration
npm startConfiguration
All platforms share the same warming targets. Configuration methods differ per platform.
WordPress Configuration
All settings are managed via the admin UI at Settings → CacheWarmer. You can also use wp-config.php constants:
define('CACHEWARMER_LICENSE_KEY', 'CW-PRO-XXXXXXXXXXXX');
define('CACHEWARMER_FACEBOOK_APP_ID', 'your_app_id');
define('CACHEWARMER_FACEBOOK_APP_SECRET', 'your_app_secret');
define('CACHEWARMER_INDEXNOW_KEY', 'your_key');
define('CACHEWARMER_GOOGLE_SA_JSON', '/path/to/service-account.json');
define('CACHEWARMER_BING_API_KEY', 'your_key');
// Enterprise: CDN Cache Purge
define('CACHEWARMER_CLOUDFLARE_API_TOKEN', 'your_token');
define('CACHEWARMER_CLOUDFLARE_ZONE_ID', 'your_zone_id');
define('CACHEWARMER_IMPERVA_API_ID', 'your_api_id');
define('CACHEWARMER_IMPERVA_API_KEY', 'your_api_key');
define('CACHEWARMER_IMPERVA_SITE_ID', 'your_site_id');
define('CACHEWARMER_AKAMAI_HOST', 'your_host');
define('CACHEWARMER_AKAMAI_CLIENT_TOKEN', 'your_client_token');
define('CACHEWARMER_AKAMAI_CLIENT_SECRET', 'your_client_secret');
define('CACHEWARMER_AKAMAI_ACCESS_TOKEN', 'your_access_token');Drupal Configuration
Configured via the admin form or settings.php:
$config['cachewarmer.settings']['license_key'] = 'CW-PRO-XXXXXXXXXXXX';
$config['cachewarmer.settings']['facebook_app_id'] = 'your_app_id';
$config['cachewarmer.settings']['facebook_app_secret'] = 'your_app_secret';
$config['cachewarmer.settings']['indexnow_key'] = 'your_key';
// Enterprise: CDN Cache Purge
$config['cachewarmer.settings']['cloudflare_api_token'] = 'your_token';
$config['cachewarmer.settings']['cloudflare_zone_id'] = 'your_zone_id';
$config['cachewarmer.settings']['imperva_api_id'] = 'your_api_id';
$config['cachewarmer.settings']['imperva_api_key'] = 'your_api_key';
$config['cachewarmer.settings']['imperva_site_id'] = 'your_site_id';
$config['cachewarmer.settings']['akamai_host'] = 'your_host';
$config['cachewarmer.settings']['akamai_client_token'] = 'your_client_token';
$config['cachewarmer.settings']['akamai_client_secret'] = 'your_client_secret';
$config['cachewarmer.settings']['akamai_access_token'] = 'your_access_token';Self-Hosted Configuration
Configured via environment variables or config.yaml:
| Variable | Default | Description |
|---|---|---|
PORT |
3000 | HTTP server port |
API_KEY |
— | Secret key for API authentication |
LICENSE_KEY |
— | CacheWarmer license key (Premium/Enterprise) |
FACEBOOK_APP_ID |
— | Facebook App ID |
FACEBOOK_APP_SECRET |
— | Facebook App Secret |
LINKEDIN_SESSION_COOKIE |
— | LinkedIn li_at session cookie |
INDEXNOW_KEY |
— | IndexNow verification key |
GOOGLE_SERVICE_ACCOUNT_JSON |
— | Path to Google service account JSON |
BING_API_KEY |
— | Bing Webmaster Tools API key |
DATABASE_PATH |
./data/cachewarmer.db | SQLite database file path |
LOG_LEVEL |
info | Logging level (debug, info, warn, error) |
CLOUDFLARE_API_TOKEN |
— | Cloudflare API token (Zone:Cache Purge) Enterprise |
CLOUDFLARE_ZONE_ID |
— | Cloudflare Zone ID |
IMPERVA_API_ID |
— | Imperva API ID Enterprise |
IMPERVA_API_KEY |
— | Imperva API Key |
IMPERVA_SITE_ID |
— | Imperva Site ID |
AKAMAI_HOST |
— | Akamai API hostname Enterprise |
AKAMAI_CLIENT_TOKEN |
— | Akamai EdgeGrid client token |
AKAMAI_CLIENT_SECRET |
— | Akamai EdgeGrid client secret |
AKAMAI_ACCESS_TOKEN |
— | Akamai EdgeGrid access token |
Warming Targets
CacheWarmer supports 11 warming targets. Each can be enabled or disabled independently.
CDN Cache Warming
Visits every URL from your sitemap, triggering CDN edge nodes and reverse proxies to cache the response. Uses HTTP requests by default, with optional headless browser rendering for JavaScript-heavy sites.
IndexNow
Submits URLs to participating search engines (Bing, Yandex, Seznam, Naver) via the IndexNow protocol. Supports batch submission of up to 10,000 URLs per request.
Facebook Sharing Debugger Premium
Calls the Facebook Graph API scrape endpoint for each URL, forcing Facebook to re-fetch Open Graph metadata. Requires a Facebook App ID and App Secret.
LinkedIn Post Inspector Premium
Automates the LinkedIn Post Inspector to refresh cached link previews. Uses session-based authentication.
Twitter/X Card Cache Premium
Pre-warms Twitter Card cache by triggering the card validator endpoint. No API key required.
Google Search Console Premium
Submits URLs via the Google Indexing API. Requires a Google Cloud service account with Search Console access. Daily quota: 200 URLs per property.
Bing Webmaster Tools Premium
Direct URL submission via the Bing Webmaster API, complementing IndexNow for comprehensive Bing coverage.
Pinterest Rich Pins Premium
Refreshes Rich Pin Open Graph metadata so Pinterest always shows your latest content and images.
Cloudflare Cache Purge + Warm Enterprise
Purge and re-warm Cloudflare edge caches via the Zone API. Auto-detects Cloudflare zones for easy setup.
Imperva Cache Purge + Warm Enterprise
Purge and re-warm Imperva (Incapsula) CDN caches via their API. Supports site-level and resource-level cache purging.
Akamai Cache Purge + Warm Enterprise
Purge and re-warm Akamai CDN caches via the Fast Purge API (CCU v3). Supports URL-level and CP code-based purging.
API Reference
The self-hosted Node.js version exposes a REST API. WordPress and Drupal provide their own admin interfaces and CLI commands.
/api/warmSubmit a sitemap or URLs for warming.
{
"sitemapUrl": "https://example.com/sitemap.xml",
"targets": ["cdn", "facebook", "indexnow"],
"priority": "normal"
}{
"jobId": "warm-abc123",
"status": "queued",
"urlCount": 42,
"targets": ["cdn", "facebook", "indexnow"],
"createdAt": "2026-02-28T12:00:00Z"
}/api/jobsList all warming jobs with status and progress.
/api/jobs/:idGet detailed status of a specific warming job.
{
"id": "warm-abc123",
"status": "completed",
"urlCount": 42,
"processed": 42,
"failed": 1,
"targets": ["cdn", "facebook", "indexnow"],
"startedAt": "2026-02-28T12:00:00Z",
"completedAt": "2026-02-28T12:02:15Z"
}/api/jobs/:idCancel a running or queued warming job.
/api/statusHealth check and system status.
{
"status": "ok",
"version": "1.0.0",
"uptime": 86400,
"database": "connected",
"redis": "connected"
}Deployment
Docker Compose (Production)
version: "3.8"
services:
cachewarmer:
image: drossmedia/cachewarmer:latest
ports:
- "127.0.0.1:3000:3000"
volumes:
- ./data:/app/data
- ./credentials:/app/credentials:ro
- ./config.yaml:/app/config.yaml:ro
depends_on:
- redis
restart: unless-stopped
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
restart: unless-stopped
volumes:
redis-data:Nginx Reverse Proxy
server {
listen 443 ssl http2;
server_name cachewarmer.example.com;
ssl_certificate /etc/letsencrypt/live/cachewarmer.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cachewarmer.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Troubleshooting
WordPress
- Warming doesn't run on schedule: Ensure WP-Cron is working. For high-traffic sites, consider a system cron job:
*/15 * * * * wget -q -O - https://yoursite.com/wp-cron.php - Plugin conflicts: Deactivate other cache or SEO plugins temporarily to isolate the issue.
Drupal
- Cron not running: Verify Drupal cron is configured. Use
drush cronto trigger manually. - Permission denied: Ensure the web server user has write access to the module's data directory.
Self-Hosted
- Chromium errors: Install system dependencies:
apt-get install -y libnss3 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libgbm1 - Redis connection failed: Verify Redis is running:
redis-cli ping - Rate limit errors (429): Increase delay settings in your configuration. Each target has independent rate limiting.
- Debug logging: Set
LOG_LEVEL=debugfor detailed output.
Need Help Setting Up API Keys?
Step-by-step guides for every integration.