Skip navigation
Scope

Enter at least two characters.
Searching…
No matching documentation found.
Search is temporarily unavailable.

Options

All configuration options

All options are set under tobimori.seo in your config.php. Dots in the option names represent nested arrays. For example, robots.enabled becomes:

<?php
// site/config/config.php

return [
  'tobimori.seo' => [
    'robots' => [
      'enabled' => true,
    ],
  ],
];

You can also use Kirby's flat dot syntax:

return [
  'tobimori.seo.robots.enabled' => true,
];

Both are equivalent, but you cannot use dot syntax inside a nested array. 'robots.enabled' => true only works at the top level as 'tobimori.seo.robots.enabled'. Inside the 'tobimori.seo' array, you must use nested arrays.

General

Option Default Description
locale 'en_US' Default locale for single-language sites
dateFormat null Custom date format for dates in meta tags
kql false Allow all Kirby queries in title templates. When false, only {{ title }} and {{ site.title }} work. Do not enable if you have untrusted Panel users
generateSchema true Generate a default WebSite schema for every page. Requires spatie/schema-org
previews ['google', 'facebook', 'slack'] Which preview types to show in the Panel
cascade ['fields', 'programmatic', 'parent', 'fallbackFields', 'site', 'options'] The meta cascade order
canonical.base null Base URL for canonical links. Uses the site URL if not set
canonical.trailingSlash false Add trailing slashes to canonical URLs
files.parent null Default parent page for file uploads in SEO fields
files.template null Default file template for SEO file uploads
socialMedia See below Social media account fields shown in the site blueprint

The socialMedia option defines which fields appear in the site blueprint. Default fields: twitter, facebook, instagram, youtube, linkedin, bluesky, mastodon. Each key maps to a placeholder URL. Override the array to add or remove fields.

Cache

Option Default Description
cache.searchConsole true Enable the Google Search Console cache namespace
cache.indexnow true Enable the IndexNow cache namespace
cache.overview true Enable the SEO overview and link audit cache
Option Default Description
overview.lengths.title [30, 60] Recommended minimum and maximum title length, including the title template
overview.lengths.description [70, 160] Recommended minimum and maximum description length
links.queue true Use Kirby Queues for link checks when tobimori/kirby-queues is installed
links.schedule '0 3 * * *' Cron expression for scheduled full link checks with Kirby Queues. Set to false to disable
links.http null Use HTTP crawling automatically in CLI mode with an absolute site URL
links.ttl 168 Hours before an external URL is checked again
links.timeout 10 Timeout in seconds for external requests
links.concurrency 5 Maximum parallel HTTP page requests. External URL checks use twice this limit
links.hosts [] Additional site hosts that the link audit treats as internal

Meta defaults

These are the fallback values for the last level of the meta cascade. They apply when no other level provides a value. Each option can be a static value or a callable that receives the Page object.

Option Default Description
default.metaTitle Page title Meta title
default.metaTemplate '{{ title }} - {{ site.title }}' Title template applied to all pages
default.ogTemplate '{{ title }}' Open Graph title template
default.ogSiteName Site title Open Graph site name
default.ogType 'website' Open Graph type
default.ogDescription Meta description Open Graph description, falls back to the meta description
default.cropOgImage true Crop OG images to 1200x630
default.locale Language locale or 'en_US' Locale for meta tags
default.robotsIndex true if listed, not the error page and not debug Whether pages are indexable
default.robotsFollow Same as robotsIndex Whether links are followed
default.robotsArchive Same as robotsIndex Whether archiving is allowed
default.robotsImageindex Same as robotsIndex Whether image indexing is allowed
default.robotsSnippet Same as robotsIndex Whether snippets are allowed

LLM-friendly content

Option Default Description
agentic.enabled true Enable all LLM-friendly content features
agentic.markdown.enabled true Enable Markdown URLs and Accept: text/markdown negotiation
agentic.markdown.auto false Convert selected HTML when no explicit .md.php template exists. Requires league/html-to-markdown or a custom converter
agentic.markdown.selectors [data-agentic-content], main, and article Content selectors, in priority order
agentic.markdown.converter null Custom conversion callable, object, or class. Requires agentic.markdown.auto set to true
agentic.llmsTxt.enabled true Enable the language-aware /llms.txt route
agentic.llmsTxt.pages null Callable that selects the initial page collection

Robots

Option Default Description
robots.enabled true Whether the plugin handles robots meta tags and robots.txt
robots.index true (unless debug mode) Site-wide indexing default. Set to false to noindex the entire site
robots.followPageStatus true Unlisted pages are noindex by default
robots.pageSettings true Show robots settings on each page in the Panel
robots.types ['index', 'follow', 'archive', 'imageindex', 'snippet'] Available robot directive types. Add 'ai' and 'imageai' for AI training controls
robots.content [] Custom robots.txt rules per user agent
robots.sitemap null Custom sitemap URL for robots.txt. Auto-detected when the sitemap module is active

Sitemap

Option Default Description
sitemap.enabled true Whether to generate a sitemap
sitemap.redirect true Redirect /sitemap to /sitemap.xml
sitemap.locale 'en' Locale for the sitemap XSL stylesheet
sitemap.generator Built-in generator A callable that receives a SitemapIndex instance. See customizing the sitemap
sitemap.changefreq 'weekly' Default change frequency. Static value or callable
sitemap.priority Calculated from depth Homepage gets 1.0, each level deeper subtracts 0.2, minimum 0.2
sitemap.groupByTemplate false Split the sitemap into separate files per template
sitemap.excludeTemplates ['error'] Templates to exclude from the sitemap

AI Assist

Option Default Description
ai.enabled true Whether AI features are available
ai.provider 'openai' The active provider ID
ai.providers See below Provider configurations

Each provider has a driver class and a config array. The config options depend on the driver. All built-in drivers share apiKey (required), model, endpoint, and timeout. The OpenAI driver also accepts organization.

Provider Driver Default model Default endpoint
openai OpenAi gpt-6-luna https://api.openai.com/v1/responses
anthropic Anthropic claude-haiku-5-5 https://api.anthropic.com/v1/messages
gemini Gemini gemini-3.5-flash-lite https://generativelanguage.googleapis.com/v1beta
openrouter OpenAi openai/gpt-6-luna https://openrouter.ai/api/v1/responses

The Gemini driver uses the Interactions API (/interactions is appended to the endpoint) and authenticates via the x-goog-api-key header. Requests are sent with store: false, so Google doesn't retain the interaction. All providers default to a timeout of 120 seconds. See customizing AI Assist for adding your own provider.

IndexNow

Option Default Description
indexnow.enabled true Whether to ping search engines on page changes
indexnow.delay 30 Batch window in seconds when tobimori/kirby-queues is installed
indexnow.searchEngine 'https://api.indexnow.org' IndexNow API endpoint. One engine propagates to all others
indexnow.rules [] Invalidation rules for related pages

Rules map a match pattern to invalidation targets. Match patterns can be a URL glob ('/blog/*'), a template name ('article'), or a wildcard ('*').

Target Value Description
parent true or int Invalidate the direct parent (true) or N levels up
children true or int Invalidate all descendants (true) or up to N levels deep
siblings true Invalidate all siblings at the same level
urls string[] Specific URLs to invalidate
templates string[] Invalidate all pages with these templates
'indexnow' => [
  'rules' => [
    'article' => ['parent' => true, 'urls' => ['/blog', '/']],
    'product' => ['parent' => true, 'siblings' => true, 'templates' => ['category']],
  ],
],

Search Console

Option Default Description
searchConsole.enabled true Whether the Search Console integration is active
searchConsole.credentials null Google OAuth credentials array. See GSC setup
searchConsole.tokenPath site/config/.gsc-tokens.json Where OAuth tokens are stored

Components

Option Default Description
components.meta tobimori\Seo\Meta Meta tag generation class
components.ai tobimori\Seo\Ai AI Assist class
components.indexnow tobimori\Seo\IndexNow IndexNow class
components.schema tobimori\Seo\SchemaSingleton Schema.org store class
components.gsc tobimori\Seo\GoogleSearchConsole Search Console class
components.agentic tobimori\Seo\LlmContent LLM-friendly content class

See extending the plugin for details on replacing components.