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.

Shell
# 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 activate

After activation, navigate to Settings → CacheWarmer to configure your warming targets and API keys.

WordPress 6.0+ and PHP 8.0+ required. Works with Yoast SEO, Rank Math, and WordPress core sitemaps.

Drupal Module

Install the CacheWarmer module via Composer.

Shell
# Install with Composer
composer require drupal/cachewarmer

# Enable the module
drush en cachewarmer -y

# Clear cache
drush cr

After enabling, navigate to Configuration → System → CacheWarmer to configure your settings.

Drupal 10.2+ or Drupal 11 with PHP 8.1+ required. Compatible with Simple XML Sitemap and XML Sitemap modules.

Self-Hosted (Node.js)

Deploy via Docker or install from source.

Docker (Recommended)

Shell
# 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:latest

From Source

Shell
# Download the latest release from the CacheWarmer website
cd cachewarmer
npm install
cp .env.example .env
# Edit .env with your configuration
npm start
Node.js 20+ required. Redis needed for BullMQ job queue. Docker image bundles all dependencies including Chromium.

Configuration

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:

PHP
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:

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.

indexnow.org

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.

Facebook Sharing Debugger

LinkedIn Post Inspector Premium

Automates the LinkedIn Post Inspector to refresh cached link previews. Uses session-based authentication.

LinkedIn Post Inspector

Twitter/X Card Cache Premium

Pre-warms Twitter Card cache by triggering the card validator endpoint. No API key required.

X Card Validator

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.

Google Search Console

Bing Webmaster Tools Premium

Direct URL submission via the Bing Webmaster API, complementing IndexNow for comprehensive Bing coverage.

Bing Webmaster Tools

Pinterest Rich Pins Premium

Refreshes Rich Pin Open Graph metadata so Pinterest always shows your latest content and images.

Pinterest URL Debugger

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.

POST/api/warm

Submit a sitemap or URLs for warming.

Request Body
JSON
{
  "sitemapUrl": "https://example.com/sitemap.xml",
  "targets": ["cdn", "facebook", "indexnow"],
  "priority": "normal"
}
Response
JSON
{
  "jobId": "warm-abc123",
  "status": "queued",
  "urlCount": 42,
  "targets": ["cdn", "facebook", "indexnow"],
  "createdAt": "2026-02-28T12:00:00Z"
}
GET/api/jobs

List all warming jobs with status and progress.

GET/api/jobs/:id

Get detailed status of a specific warming job.

Response
JSON
{
  "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"
}
DELETE/api/jobs/:id

Cancel a running or queued warming job.

GET/api/status

Health check and system status.

Response
JSON
{
  "status": "ok",
  "version": "1.0.0",
  "uptime": 86400,
  "database": "connected",
  "redis": "connected"
}

Deployment

Docker Compose (Production)

docker-compose.yml
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

Nginx
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 cron to 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=debug for detailed output.

Need Help Setting Up API Keys?

Step-by-step guides for every integration.