Title: ctrlweb Site Portrait
Author: ctrlweb agency
Published: <strong>October 28, 2026</strong>
Last modified: October 28, 2026

---

Search plugins

![](https://ps.w.org/ctrlweb-site-portrait/assets/banner-772x250.png?rev=3771295)

![](https://ps.w.org/ctrlweb-site-portrait/assets/icon.svg?rev=3771295)

# ctrlweb Site Portrait

 By [ctrlweb agency](https://profiles.wordpress.org/ctrlwebinc/)

[Download](https://downloads.wordpress.org/plugin/ctrlweb-site-portrait.1.0.0.zip)

 * [Details](https://wordpress.org/plugins/ctrlweb-site-portrait/#description)
 * [Reviews](https://wordpress.org/plugins/ctrlweb-site-portrait/#reviews)
 * [Development](https://wordpress.org/plugins/ctrlweb-site-portrait/#developers)

 [Support](https://wordpress.org/support/plugin/ctrlweb-site-portrait/)

## Description

Choosing the right hosting means knowing your site: WordPress and PHP versions, 
plugins and themes, database size, number of posts and media files, server memory
and CPU, caches in place… ctrlweb Site Portrait lets **a service that you choose**(
typically a hosting provider or an agency) read that information securely, without
giving it an administrator account.

 * **Off by default.** Nothing happens and nothing is sent until you enter the address
   of a service and approve the connection.
 * **Any compatible service.** The plugin is not tied to any company, including 
   its author. It implements Site Portrait, an open protocol documented in `docs/
   PROTOCOL.md` (included in the plugin), so anyone can build a compatible service.
 * **You choose what is shared.** Seven categories (WordPress core, plugins, themes,
   server, database, content volumes, user counts) can be ticked or unticked at 
   any time.
 * **Read-only and minimised.** The service can never change your site. The plugin
   never shares passwords, keys, `wp-config.php` values, user names or email addresses,
   post content, file paths, the database prefix or server IP addresses.
 * **No password to leak.** Instead of a password, the site and the service exchange
   public keys. Every request is signed (HTTP Message Signatures, RFC 9421, with
   Ed25519) and can only be used once. Even a copy of your database does not let
   anyone impersonate the service.
 * **Transparent.** An access log shows every request (date, IP address, categories).
   Optional IP allow-list, rate limiting, one-click disconnection and key rotation.
 * **Multisite ready.** On a network, a super admin connects the whole network from
   the Network Admin.

#### How it works

 1. In **Settings  Site Portrait**, enter the address given by the service (for example`
    https://service.example`).
 2. The plugin reads the service description (`/.well-known/site-portrait`) and shows
    you its name, privacy policy and the data it asks for. Tick the categories you 
    agree to share.
 3. Click **Connect**: you are sent to the service to sign in and approve, then back
    to your dashboard.
 4. The service can now request the portrait. You can change the categories or disconnect
    at any time.

#### For developers

The full protocol (discovery, pairing, request signatures, endpoints, errors, JSON
schemas and test vectors) is in `docs/PROTOCOL.md` and `docs/schema/`. The filter`
site_portrait_scope_data` lets other plugins add data to a category.

#### Licenses

The plugin code is licensed under the GPL, version 2 or later (GPL-2.0-or-later).
The protocol specification and JSON schemas in `docs/` are licensed under Creative
Commons Attribution 4.0 (CC-BY-4.0), so that anyone can implement a compatible service.

### External services

This plugin connects your site to **one external service chosen and entered by the
site administrator**. No service is built in, and the plugin never contacts any 
server until an administrator enters a service address and asks to look it up.

What is sent, to whom and when:

 * **When the administrator clicks “Look up service”:** the site requests `https://
   <service>/.well-known/site-portrait` to display the service name, privacy policy
   and requested data. Only a standard HTTP request is sent (it includes your site
   address in the User-Agent).
 * **When the administrator clicks “Connect” and approves on the service:** the 
   administrator’s browser is sent to the service’s authorization page with your
   site address, site name, the categories ticked and a public key. The site then
   sends the service, server to server, the authorization code, its public key, 
   the addresses of its Site Portrait API endpoints, the plugin version and the 
   categories granted.
 * **While connected:** the service may request the portrait. The site only answers
   signed requests and only returns the categories you ticked (see the Description
   for what each contains). On a multisite network, the list of site addresses is
   also available to the service.
 * **When the administrator clicks “Disconnect” or deletes the plugin:** the site
   notifies the service that the connection ended (site address and connection identifier).

The service’s own terms of use and privacy policy apply to the data it receives.
Their addresses are shown before you connect and on the settings page.

## FAQ

### Can the service change my site?

No. The API is read-only. The only thing a service can do besides reading is end
the connection.

### What if someone steals my database?

The site only stores the service’s public key, which cannot be used to send requests.
The site’s own private key is also stored; it only allows signing answers as your
site and can be replaced from the settings page (Generate a new site key) or by 
disconnecting.

### Why not use an application password?

An application password gives a service every permission of the user who created
it, and it can be reused by anyone who obtains it. This plugin gives read access
to the chosen categories only, with signed, single-use requests.

### My site is on localhost or uses HTTP.

HTTPS is required. For local development only, define `SITE_PORTRAIT_DEV_MODE` as`
true` with a `local` or `development` environment type and a `.test`, `.localhost`
or loopback host.

### How do I build a compatible service?

Read `docs/PROTOCOL.md`. It lists what a service must implement, with examples and
test vectors.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“ctrlweb Site Portrait” is open source software. The following people have contributed
to this plugin.

Contributors

 *   [ ctrlweb agency ](https://profiles.wordpress.org/ctrlwebinc/)

[Translate “ctrlweb Site Portrait” into your language.](https://translate.wordpress.org/projects/wp-plugins/ctrlweb-site-portrait)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/ctrlweb-site-portrait/),
check out the [SVN repository](https://plugins.svn.wordpress.org/ctrlweb-site-portrait/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/ctrlweb-site-portrait/)
by [RSS](https://plugins.trac.wordpress.org/log/ctrlweb-site-portrait/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.0

 * First version: discovery, pairing with PKCE and Ed25519 keys, signed REST API,
   seven data categories, access log, IP allow-list, rate limiting, key rotation,
   multisite network mode.

## Meta

 *  Version **1.0.0**
 *  Last updated **3 days ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.4 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [Hosting](https://wordpress.org/plugins/tags/hosting/)[migration](https://wordpress.org/plugins/tags/migration/)
   [server](https://wordpress.org/plugins/tags/server/)[site health](https://wordpress.org/plugins/tags/site-health/)
   [system info](https://wordpress.org/plugins/tags/system-info/)
 *  [Advanced View](https://wordpress.org/plugins/ctrlweb-site-portrait/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/ctrlweb-site-portrait/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/ctrlweb-site-portrait/reviews/)

## Contributors

 *   [ ctrlweb agency ](https://profiles.wordpress.org/ctrlwebinc/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/ctrlweb-site-portrait/)