Start a project

Project 09 of 09 · Plugin for Kirby CMS

Kirby Essentials Pro

One plugin for SEO, speed, forms and trust on Kirby sites, instead of a stack of five more ZIP files. You switch on only the modules a site needs, and writers keep a clean Panel. It's in development and not released yet.

The Kirby Essentials Pro landing page: Agencies don't need another SEO plugin. You need one layer that stops the Panel fights.

01

What it does

24 switchable modules for SEO, speed, forms, consent and redirects, under one licence per site. Pre-launch.

  • One plugin, one licence
  • Switch modules on or off
  • A clean Panel for writers
  • Snippets you paste once
All features

02

How it's built

A standard Kirby plugin in PHP, set up in config.php and managed from Panel tabs, with each module switched on or off.

The full build

03

Stack

  • Kirby 4 and 5
  • PHP 8.1+
  • Kirby Panel
  • Plugin
Runs on
Your own Kirby site (it's a plugin)
For
Agencies and developers who build Kirby sites, and the editors who use them

What it is

Kirby Essentials Pro is a commercial plugin I'm building for Kirby, the flat-file PHP CMS. It puts the things almost every client site needs (findability, page speed, forms, consent and redirects) into one plugin with one licence, instead of five or six separate plugins that each bring their own fields, settings and quirks.

It's modular. Every part is a module you can switch on or off, so a small brochure site can run three or four of them and a bigger site can run more. Anything you don't switch on stays out of the way, in the Panel and on the site. It's built for Kirby 5 and also works with Kirby 4.

Who it's for

Three groups of people, each with a different job:

  • Agencies and developers who build Kirby sites and want one dependable layer for SEO, forms and consent that they can explain to a client and set up the same way every time.
  • Editors and writers who work in the Panel every day and want clear fields for titles, descriptions and share images, without settings they'll never use.
  • Site owners, who get one licence per site rather than a separate bill and update cycle for each plugin.

The problem it solves

A typical Kirby build ends up with a separate plugin for SEO, another for forms, another for the cookie banner, and something else for redirects. Each one is fine on its own. Together they add more Panel tabs and fields for writers to wade through, more snippets to keep track of, and more chances for two plugins to fight over the same job, such as both trying to write the page's meta tags.

The product site sums it up: "Agencies don't need another SEO plugin. You need one layer that stops the Panel fights." Essentials Pro is that layer. The modules are designed to work together, and the Utilities module warns you when a rival SEO, form or consent plugin is installed alongside it, so clashes are spotted rather than discovered by a client.

What it does

  • One plugin, one licenceSEO, speed, forms, consent and redirects in one place, instead of a stack of separate plugins.
  • Switch modules on or offEvery module is a true or false in config.php. Modules that are off stay out of the way.
  • A clean Panel for writersWriters only see tabs for the modules a site actually uses.
  • Snippets you paste onceSEO head tags, analytics, forms, the consent banner, embeds and search.
  • Consent built inStatistics wait for consent, and video and map embeds wait for marketing consent.
  • Spots plugin clashesUtilities warns you if a rival SEO, form or consent plugin is installed.

How modular switching works

Modules are switched on and off in your site's config.php. Each one is a simple true or false in a modules list, next to your licence key. A module that's switched off stays out of the way, so writers keep a clean Panel.

'ljdigital-control.kirby-essentials-pro' => [
    'license' => 'EP1.…',
    'modules' => [
        'seo'       => true,
        'analytics' => true,
        'forms'     => true,
        'consent'   => true,
    ],
],

Installation follows four steps from the product documentation:

  1. Copy the plugin into site/plugins/kirby-essentials-pro.
  2. Paste in the licence key issued for the site's domain.
  3. Switch on only the modules this site needs.
  4. Add the matching tabs to site.yml if they aren't there already.

On the template side, you paste a few snippets in once, where you want the output: the SEO head tags, the analytics code, a form, the consent banner, consent-aware embeds and search.

<?php snippet('essentials/seo/head') ?>
<?php snippet('essentials/analytics', ['part' => 'head']) ?>
<?php snippet('essentials/consent-banner') ?>
How Kirby Essentials Pro fits into a Kirby site Your Kirby 4 or 5 site gets one plugin with one licence key. A modules list in config.php switches each module on or off. Modules that are on add their tabs to the Panel and their snippets to your templates, and visitors get the result. Your Kirby 4 or 5 site templates, content and the Panel Kirby Essentials Pro one plugin folder, one licence key 'modules' => [ … ] in config.php: true is on, false is off Panel tabs only for the modules that are on Templates snippets you paste in once Visitors head tags, sitemaps, forms, consent
How it fits into Kirby: one plugin, a list of modules in config.php, and only the modules you switch on show up in the Panel and on the site.

The modules

Here are all 24 modules, in the same order as the product site and written up from the product's own module guides. Open any one for what it does, its key features, how to switch it on (where the guide says) and the modules it works with.

The plugin hasn't been released yet, so treat this as the planned line-up for launch rather than a promise that every detail is final. The speed modules (Media Engine, Assets, Page Cache, Link Health and Social Cards) have shorter entries because the product's documentation says less about them so far.

  • SEOOnTitles, descriptions, sitemaps, schema, local, llms.txt and IndexNow.

    SEO is the findability layer for every public page. It writes the title and description a person sees in Google, the picture and line a person sees in Slack or LinkedIn, the robots rules, the XML sitemap, JSON-LD for machines, local business data, a file for AI crawlers, and a health view so you can see what is still empty.

    Writers work in the page SEO tab. Developers print one snippet. You should not need a second SEO plugin beside it.

    Key features

    • Title and description for search results.
    • Share picture and line for links posted in Slack, LinkedIn and the like.
    • Robots rules and canonical.
    • XML sitemap and robots.txt. Listed public pages go in. Gated or noindex pages stay out.
    • JSON-LD schema. Leave it on Automatic unless the page really is a product, job, event or article.
    • Local business data: name, address, geo and hours, with more than one place for multi-location sites.
    • llms.txt, the file AI assistants look for.
    • IndexNow, the ping that tells supporting engines a URL changed.
    • A health view that shows what is still empty.

    Turn it on and set it up

    1. Set 'seo' => true in the plugin modules list.
    2. Keep the SEO tabs on the page blueprint.
    3. Print the head once in the theme header.
    <?php snippet('essentials/seo/head') ?>

    Related: Utilities Social Cards Assets Authors Redirects

  • Media EngineOnsrcset, lazy load, LCP priority, optional CDN prefix.

    Media Engine is one of the five speed modules. It looks after the images on a page: srcset, lazy loading, LCP priority for the hero image, and an optional CDN prefix.

    Media Engine, Assets and Page Cache cover LCP, FCP and TTFB.

    Key features

    • srcset.
    • Lazy load.
    • LCP priority for the hero image.
    • Optional CDN prefix.

    Turn it on and set it up

    1. Set 'media' => true in the plugin modules list.
    2. Use epPicture with priority on the hero image.
    $file->epPicture(['priority' => true])

    Related: Assets Page Cache Social Cards SEO

  • AssetsOffFont-display swap and script defer.

    Assets is one of the five speed modules. It sets font-display swap and defers scripts.

    The hints print with the SEO head snippet, so there is no extra snippet to paste.

    Media Engine, Assets and Page Cache cover LCP, FCP and TTFB.

    Key features

    • Font-display swap.
    • Script defer.
    • Hints print with the SEO head snippet.

    Turn it on and set it up

    1. Set 'assets' => true in the plugin modules list.
    2. Make sure the SEO head snippet is printed in the theme header. The Assets hints print with it.
    <?php snippet('essentials/seo/head') ?>

    Related: SEO Media Engine Page Cache

  • Page CacheOffGuest HTML cache. Panel users and forms are skipped.

    Page Cache is one of the five speed modules. It stores the HTML that guests see for an hour, and purges it when you save.

    Panel users and forms are skipped, so editors do not see stale pages. Saving a page clears the stored HTML.

    Media Engine, Assets and Page Cache cover LCP, FCP and TTFB.

    Key features

    • Guest HTML cache, kept for an hour.
    • Purged when you save a page.
    • Panel users bypass the cache.
    • Forms are skipped.

    Turn it on and set it up

    1. Set 'cache' => true in the plugin modules list.

    Related: Media Engine Assets Forms

  • Social CardsOffGenerated 1200×630 share image when a page has none.

    Social Cards is one of the five speed and crawl modules. When a page has no photograph, it generates a 1200×630 share image so the link still shows a picture when it is shared.

    The image is served at /essentials-card/{page}.svg.

    SEO, Link Health and Social Cards cover crawl and click-through.

    Key features

    • Generated 1200×630 share image.
    • Only used when a page has no photograph.
    • Served at /essentials-card/{page}.svg.

    Turn it on and set it up

    1. Set 'cards' => true in the plugin modules list.

    Related: SEO Media Engine

  • AnalyticsOffGA4, GTM, Plausible, Fathom, Matomo, Clarity.

    Analytics puts one tracker in the head from the Panel. You pick the provider the client already uses. You do not paste three snippets into the theme and hope they still match next year.

    Key features

    • GA4: measurement ID.
    • Google Tag Manager: container ID, if the client already lives in GTM.
    • Plausible and Fathom: lighter measurement.
    • Matomo: when the data must stay on their host.
    • Microsoft Clarity: session insight, used with care.
    • Statistics scripts wait for consent when Consent is on.
    • Do Not Track honoured when that toggle is on.
    • Panel users and listed IPs skipped, so editors do not inflate the numbers.

    Turn it on and set it up

    1. Set 'analytics' => true in the plugin modules list.
    2. Site → Analytics. Choose the provider. Paste the ID.
    3. Print the snippet in the header. Optionally print a body part if the provider needs it.
    <?php snippet('essentials/analytics', ['part' => 'head']) ?>

    Related: Consent SEO

  • FormsOnPanel builder, stored submissions, PHP or Kirby mail.

    Forms is the Panel builder for contact and quote forms. You add fields, optional steps, a honeypot and a notify address. Submissions are stored on the Kirby site as JSON. Email is sent by your server, not by an Essentials Pro cloud.

    It covers contact and quote forms. A full automation graph is still DreamForm.

    Key features

    • Form builder in the Panel.
    • Fields, optional steps and required fields.
    • Submissions stored on the site as JSON.
    • Notify by PHP mail or Kirby email.
    • CSRF protection plus a honeypot field.
    • A snippet, or post your own theme form to the form route.

    Turn it on and set it up

    1. Set 'forms' => true in the plugin modules list.
    2. Site → Forms. Create a form with a stable id such as contact.
    3. Add name, email, message, consent. Mark required fields.
    4. Set a notify address that exists as a mailbox on the host.
    5. Print the snippet, or post a theme form to /essentials-form/contact.
    <?php snippet('essentials/form', ['id' => 'contact']) ?>

    Related: Mail Consent Page Cache

  • GatingOffPassword lock for templates or a page field.

    Gating puts a password in front of pages. Use it for client previews, price lists and “listed but not public” URLs. Logged-in Panel users skip the lock so editors can work.

    Key features

    • Password lock.
    • Lock a list of templates, or a single page with a page field.
    • Logged-in Panel users skip the lock.

    Turn it on and set it up

    1. Turn gating on in the plugin modules list.
    2. Site → Gating. Set the password. Toggle the lock on.
    3. Either list templates (post, product) or set essentialsGate: true on the page.
    essentialsGate: true

    Related: Billing Maintenance

  • UtilitiesOffWarns if a rival SEO, form or consent plugin is installed.

    Utilities is the conflict scan. It looks at installed plugins and names the ones that will double-output a sitemap, robots file, form or banner.

    What it flags

    • MetaKnight.
    • Kirby SEO.
    • Bnomei SEO.
    • Standalone robots.txt plugins.
    • DreamForm.
    • Other cookie-consent plugins.

    Turn it on and set it up

    1. Open Site → Utilities after a migration.
    2. Remove the leftover. Two sitemaps is how pages disappear from Google.

    Related: SEO Forms Consent Redirects

  • RedirectsOffFrom/to rules plus 404 hints.

    Redirects is the migration tab. From → to, 301 or 302, plus a 404 log. After a rebuild the old URLs still exist in Google. This is the work for week one, not month three.

    Key features

    • From → to rules.
    • 301 or 302.
    • 404 log with hints for URLs that still miss.

    Turn it on and set it up

    1. Set 'redirects' => true in the plugin modules list.
    2. Site → Redirects. Add the old path and the new path. Use 301 when the move is permanent.
    3. Read the 404 list after launch and add rules for the URLs that still miss.
    /old-blog-post    →    /journal/old-blog-post    301

    Related: Link Health Utilities SEO

  • MailOnFrom address and send method used by forms.

    Mail is the human-readable place for the From address and send method. Forms read it.

    Your server sends the mail. Essentials Pro does not rent a mail SaaS.

    Key features

    • From address used by forms.
    • Send method: PHP mail, or Kirby email.

    Turn it on and set it up

    1. Site → Mail. Set the From address and the send method.
    2. Never commit mail passwords to version control.

    Related: Forms

  • MaintenanceOffHolding page. Panel users and listed IPs skip it.

    Maintenance shows a holding page (HTTP 503) while you rebuild. Panel users still get in. Listed IPs still get in. Visitors see the message you wrote.

    Pair it with a staging host that stays noindex if the rebuild will last more than an afternoon.

    Key features

    • Holding page served as HTTP 503.
    • Your own message.
    • Panel users get in.
    • Listed IPs get in.

    Turn it on and set it up

    1. Site → Maintenance. Write the sentence.
    2. Add the office IP.
    3. Toggle the page on.
    4. Toggle it off before you call the site live.

    Related: Gating Redirects

  • EmbedsOffYouTube, Vimeo and maps wait for consent.

    Embeds stops YouTube, Vimeo and similar frames from loading until marketing consent is given. The visitor sees a short note and the cookie control instead of a third-party player.

    That is Consent doing real work, not only drawing a banner.

    Key features

    • YouTube, Vimeo and maps.
    • Placeholder until marketing consent.
    • A short note and the cookie control in place of the player.

    Turn it on and set it up

    1. Turn Consent on as well. Embeds read the marketing flag.
    2. Print the embed snippet where the video or map should appear.
    <?php snippet('essentials/embed', ['url' => $url, 'title' => 'Product film']) ?>

    Related: Consent

  • SecurityOffReferrer, nosniff, frame options, optional HSTS.

    Security sends a small header pack: Referrer-Policy, X-Content-Type-Options, X-Frame-Options, Permissions-Policy. Optional HSTS when the whole site is HTTPS.

    It is not a firewall and it will not stop a bad plugin. It clears the usual missing-header report so the launch checklist is shorter.

    Key features

    • Referrer-Policy.
    • X-Content-Type-Options (nosniff).
    • X-Frame-Options (same-origin frames).
    • Permissions-Policy.
    • Optional HSTS.

    Turn it on and set it up

    1. Turn the module on in the plugin modules list.
    2. Turn HSTS on only when every host for this site already redirects to HTTPS.

    Related: SEO Maintenance

  • FeedsOffRSS at /feed.xml.

    Feeds writes RSS at /feed.xml. Pick the templates (usually post or journal pages) and a limit. Some readers and some tools still subscribe this way.

    Key features

    • RSS at /feed.xml.
    • Choose the templates that go in.
    • Set an item limit.

    Turn it on and set it up

    1. Site → Feeds. Set templates and item count.
    2. Confirm the URL in the browser after launch.

    Related: Search Related

  • AuthorsOffPeople directory and a byline helper.

    Authors is a people list on the site: slug, name, role. A page points at a slug. The byline method prints it.

    It is ready to hook into Person schema later through SEO.

    Key features

    • People directory: slug, name, role.
    • Byline method for articles.

    Turn it on and set it up

    1. Site → Authors. Add each person.
    2. On a page, set author to that person’s slug.
    3. Print the byline in the template.
    <?= $page->authorByline() ?>

    Related: SEO Related

  • AccessibilityOffPlain-language pass helper for a page.

    Accessibility is a quick sweep, not a formal audit. It looks for a missing title, images without alt, and descriptions too thin to make sense out of context.

    It will not pass WCAG on its own. It catches the mistakes that happen every week.

    Key features

    • Plain-language pass helper for a page.
    • Flags a missing title.
    • Flags images without alt text.
    • Flags thin descriptions.

    Turn it on and set it up

    1. Turn the module on in the plugin modules list.
    2. Put the output in a Panel info field or a template an editor checks before publish.
    <?= $page->a11yText() ?>

    Related: SEO

  • ActivityOffWho edited which page.

    Activity writes who changed which page. The file is site/logs/essentials-activity.log. Site → Activity shows the recent lines.

    Turn it on when more than one person edits. It will not replace a full audit log for a regulated client, but it answers “who changed the title”.

    Key features

    • Records who changed which page.
    • Log file: site/logs/essentials-activity.log.
    • Recent lines shown in Site → Activity.

    Turn it on and set it up

    1. Turn the module on in the plugin modules list.
    2. Open Site → Activity to see the recent lines.

    Related: Authors

  • BillingLaterStripe keys stored. Gating is the lock that ships today.

    Billing stores Stripe keys for paid access you may switch on later. It does not take payments on its own and it does not replace a shop.

    Need a lock today? Use Gating. Billing is kept for the day paid access is added.

    Key features

    • Stores Stripe keys for paid access you add later.
    • Does not take payments on its own.
    • Not a shop.

    Related: Gating Licence

  • LicenceLicenceOne signed key per domain. No kill switch.

    One signed key per live domain. www counts as the same site. A staging host can be added as an alias when the key is issued. The key includes twelve months of updates from the issue date: new modules, fixes, Kirby 4/5 compatibility work shipped in that year.

    Two websites cannot share a key. The key is signed for one domain.

    Key features

    • One signed key per live domain. www counts as the same site.
    • A staging host can be added as an alias.
    • Twelve months of updates from the issue date.
    • No kill switch.

    Turn it on and set it up

    1. Paste the key in config, or in Site → Licence, or as the single line in site/config/essentials-pro.license.
    2. Open Site → Licence and confirm the key matches this live domain.
    'ljdigital-control.kirby-essentials-pro' => [
        'license' => 'EP1.…',
    ],

    Related: Billing Gating

On and Off show an example, not a rule: a small brochure site might switch on SEO, Media Engine, Forms, Mail and Consent and leave the rest off. Billing is marked Later because it only stores Stripe keys for paid access added later; it doesn't take payments. The Licence module is always on, because every site has one key.

Screenshots

These are from the product's landing page, captured on 4 September 2026. The design has moved on in places since then.

The Essentials Pro landing page in dark mode, headed: Agencies don't need another SEO plugin. You need one layer that stops the Panel fights.
The landing page's opening line: one layer instead of another SEO plugin.
The Kirby Panel with the Essentials Pro menu open, listing Licence, Analytics, Forms, Consent, Gating, Utilities and Redirects, and an Analytics status note.
In the Panel, each module has its own entry: here Licence, Analytics, Forms, Consent, Gating, Utilities and Redirects.
The full Essentials Pro landing page: the headline, the Panel with the module menu open showing every module, Google Analytics 4 and Tag Manager fields, and a How a build starts section with the config and snippets.
The whole landing page, top to bottom (scroll inside the frame): the module menu, the analytics settings and how a build starts.

Requirements

  • Kirby4.0 or later, or 5.x. Kirby 5 is the main target.
  • PHP8.1 or newer.
  • Your siteAny standard Kirby site with your own templates. It's a plugin, not a theme.
  • Licence keyOne per live domain.

Licensing

Essentials Pro is proprietary software, licensed per site. The terms are short and, I hope, fair to the people who build and pay for sites:

  • One signed key per live domain. The www version counts as the same site, and a staging alias can be added.
  • 12 months of updates come with the licence.
  • No kill switch. When the year ends, the last version you have keeps running, and your site isn't forced to noindex.
  • Renewal is optional, and only needed if you want new builds.
  • It's yours to use, not to pass on: no sharing, reselling or getting around the domain check.

The key can be pasted into the Panel (Site, then Licence) or added in config. Pricing hasn't been set yet.

The licence year, step by step A key is issued for your domain. You get 12 months of updates. When the year ends nothing switches off: the last version keeps running and the site isn't forced to noindex. Renewing is optional and only needed for new builds. 1 A key for your domain www counts as the same site, and a staging alias can be added 2 12 months of updates new builds during the licence year 3 Year ends: nothing switches off no kill switch: the last version keeps running, no forced noindex 4 Renew only if you want to renewal is only needed for new builds
The licence model: one key per live domain, a year of updates, and no kill switch when the year is up.

How it's built

It's a standard Kirby plugin written in PHP, configured in config.php and managed from Panel tabs, so it follows the way Kirby developers already work.

Each module stays out of the way until it's switched on. Output goes where you put the snippets, and consent is built in rather than bolted on: statistics wait for consent, and YouTube, Vimeo and map embeds wait for marketing consent.

Where it is now

In development, pre-launch. Essentials Pro hasn't been released. There's no public download or package, no checkout, and no price yet. The product site isn't ready for the public yet, so I haven't linked it here.

Before launch, the work still to do includes rebuilding the documentation, polishing the Panel tabs, setting up the product site properly, and building a checkout. Until then, Billing only stores keys for that future checkout. If you build Kirby sites and want to see where it's up to, I'm happy to show you.

FAQ

Is Kirby Essentials Pro available to buy yet?

Not yet. It's in development and hasn't been released, there's no public download, and pricing hasn't been set. If you'd like a demo or want to talk about a licence for a site you're building, get in touch.

Which versions of Kirby and PHP does it need?

Kirby 4.0 or later, or Kirby 5.x, on PHP 8.1 or newer. Kirby 5 is the main target, and Kirby 4 is supported.

Is it a theme?

No. It's a plugin, so it works with your own templates on a standard Kirby site. You add a few snippets where you want its output, and nothing else about your front end has to change.

Do I have to use every module?

No. There are 24 modules, and apart from the Licence each one can be switched on or off in config.php, and you only add Panel tabs for the modules a site uses. You can change your mind later.

Can I install it with Composer?

Not at the moment: there's no public package. Installation is a plugin folder copied into site/plugins.

What happens when the licence year ends?

Nothing switches off. There's no kill switch: the last version you have keeps running and your site isn't forced to noindex. Renewing only matters if you want new builds.

Does it take payments?

No. The Billing module only stores Stripe keys for a checkout that comes later. It doesn't charge anything today. Gating, the password lock, is the part of access control that works now.

Work with me

Building a Kirby site?

Tell me about the site and which modules you'd want switched on. I'll show you where Essentials Pro is up to and talk you through a licence, honestly, including what isn't finished yet.

All projects · Back to leej.uk