'sanitize_text_field', )); // Frontend/Backend service URLs are fixed (see affirm_get_*_url()) and are // intentionally not registered as settings — users only configure the API key. register_setting('affirm_settings', 'affirm_render_mode', array( 'sanitize_callback' => 'sanitize_text_field', 'default' => 'sdk', )); register_setting('affirm_settings', 'affirm_signed_url_ttl', array( 'sanitize_callback' => 'absint', 'default' => 2592000, )); } public function enqueue_admin_assets($hook) { if ($hook !== 'toplevel_page_affirmfirst') return; wp_enqueue_style('affirm-admin', AFFIRM_PLUGIN_URL . 'assets/css/admin.css', array(), AFFIRM_VERSION); wp_enqueue_script('affirm-admin', AFFIRM_PLUGIN_URL . 'assets/js/admin.js', array('jquery'), AFFIRM_VERSION, true); wp_localize_script('affirm-admin', 'affirmAdmin', array( 'ajaxUrl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('affirm_admin_nonce'), 'backendUrl' => affirm_get_backend_url(), 'frontendUrl' => affirm_get_frontend_url(), )); } public function render_admin_page() { // Read-only tab switcher for admin navigation; no state change, nonce not required. // phpcs:ignore WordPress.Security.NonceVerification.Recommended $active_tab = isset($_GET['tab']) ? sanitize_text_field(wp_unslash($_GET['tab'])) : 'dashboard'; ?>

aFFirmFirst Cloud Library

Secure image protection for WordPress

render_upload_page(); } elseif ($active_tab === 'medialibrary') { $this->render_media_library_page(); } elseif ($active_tab === 'scanner') { $this->render_scanner_page(); } elseif ($active_tab === 'settings') { $this->render_settings_page(); } else { $this->render_dashboard_page(); } ?>

Use protected images anywhere

Every image in your vault is added to the WordPress media library automatically. From then on you pick it exactly like any other image — and visitors get the encrypted canvas instead of the file.

Add your API key on the Settings tab first.

—
Ready to use
—
Still publishing
—
Vault images

Open Media Library →

How to use them

  1. Anywhere WordPress asks for an image. Featured image, an Image block, a widget, a customizer logo, an ACF field, a WooCommerce gallery — click Select image and choose your image by its filename.
  2. In Elementor, Divi, WPBakery, Beaver, Bricks or Oxygen. Use the builder's own image control, including section and hero backgrounds. Protected images are swapped in automatically.
  3. Nothing else to do. No shortcode, no block, no image ID. The slot keeps its size and crop, and the original file is never delivered to the browser.

Only a low-resolution preview is stored in WordPress so the picker has a thumbnail to show. The full-resolution original stays encrypted in your vault, and the preview is hidden on the frontend before it can be seen.

API Configuration

Get your API key from your aFFirmFirst Dashboard

Rendering Mode

Frontend Rendering


The SDK script (<script src=".../sdk/affirm.js">) is automatically added to every page on your site. It discovers data-affirmfirst elements and renders them as encrypted canvas.
Signed image URLs are used automatically for og:image, Twitter cards, RSS feeds, and SEO structured data — social crawlers need a real URL to fetch.

How long signed image URLs remain valid

Connection Status

Loading dashboard...

Upload Images to Vault

Upload images directly to your aFFirmFirst vault. They will be encrypted, watermarked, and available for protected embedding.

Drag & drop images here

or click to browse files

Supports: JPG, PNG, WebP, HEIC, AVIF • Max 50MB per file

Vault Images

Loading...

-
Total Found
-
Unprotected
-
Protected
-
Failed
Preview Image Source Post Size Status Actions
Click "Scan Site Images" to find unprotected images across your site.

aFFirmFirst: Please enter your API key in Settings to start protecting your images.