Appearance
Configuration
Introduction
kitloom follows the usual Laravel conventions: every package merges its own defaults, so a site has config files only for what it changes. A package's config is config/kitloom-<name>.php; publish it when you need to override it, for example:
bash
php artisan vendor:publish --tag=kitloom-site-configOr create the file with only the keys you change — the rest keeps the package's defaults.
Site settings that administrators change from the panel — the site title, permalinks, the active theme, the switched-off modules — are not config. They live in the options table, exactly where WordPress keeps them. See Where settings are stored.
Environment
Site and core
| Variable | Default | Purpose |
|---|---|---|
APP_THEME | '' | The theme used while none is chosen on Appearance → Themes, and the one npm run build and npm run dev build. Empty: no theme, pages as JSON, nothing for Vite. kitloom:install writes the theme it activates here. |
SITE_CACHE_TTL | 0 | Seconds the site keeps whole pages for guests (CachePage). 0 — no page cache. The default of Settings → Cache in the admins, where it is switched on, timed and cleared; a value saved there wins. |
SITE_CACHE_STORE | default store | The cache store for those pages. |
SITE_CACHE_STATIC | false | Also keep those pages as files and send them from public/index.php before Laravel starts — a file read instead of a boot. One server, or several sharing the folder SITE_CACHE_STATIC_PATH (default storage/framework/cache/kitloom-pages). The skeletons' public/index.php names that folder itself, so a different path is changed there too: the two must match. See Benchmarks. |
DB_PREFIX | '' | The table prefix — wp_ for a typical WordPress database. Read by the skeletons' config/database.php for MySQL and MariaDB. |
HASH_DRIVER | wordpress | Passwords are checked and written as WordPress hashes them. The default of the skeletons' config/hashing.php; Laravel's own config says bcrypt. |
AUTH_MODEL | App\Models\User | The user model of the wordpress user provider. |
KITLOOM_MODULES_CACHES | auto | What a module switch does to config and route caches: auto, deploy or manual. See Enabling & Disabling. |
KITLOOM_MODULES_MENU_HELP | true | false leaves How it works out of every module's menu section, in both admins. The pages stay, linked from the Modules screen. See Enabling & Disabling. |
KITLOOM_UNDECIDED_ABILITIES | deny | The Gate's answer for an admin section or a WordPress capability nobody decided on. allow only for a site that runs without roles on purpose. |
SEED_ADMIN_EMAIL | [email protected] | Skeletons only: the first administrator the seeder creates. |
SEED_ADMIN_PASSWORD | password | Skeletons only: that administrator's password. |
Modules
| Variable | Package | Purpose |
|---|---|---|
KITLOOM_AI_USER | kitloom/ai | Login or email of the user the local MCP server (php artisan mcp:start kitloom) acts as. |
KITLOOM_BACKUP_NAME | kitloom/backup | The name archives are kept under; two sites sharing a bucket keep apart by it. |
KITLOOM_BACKUP_LOCAL_ROOT, KITLOOM_BACKUP_TEMPORARY_DIRECTORY | kitloom/backup | Where local archives and the work files go. |
KITLOOM_FORMS_MAILER | kitloom/forms | The mailer form mail goes through; the default one when empty. |
KITLOOM_FORMS_HONEYPOT | kitloom/forms | The hidden field that catches bots (on by default). |
KITLOOM_FORMS_TURNSTILE_SITE_KEY, KITLOOM_FORMS_TURNSTILE_SECRET | kitloom/forms | Cloudflare Turnstile keys. |
HEALTH_EXPECTED_ENVIRONMENT | kitloom/health | The environment Site Health expects (production). |
IMPORT_EXPORT_DISK | kitloom/import-export | Where an uploaded WXR file waits for the import (local). |
MEDIA_DISK | kitloom/media | The uploads disk (public). |
MEDIA_UPLOADS_URL | kitloom/media | The public address of the uploads, for a CDN or a bucket. |
MEDIA_BIG_IMAGE_THRESHOLD | kitloom/media | Bigger photos are shown scaled into it, as WordPress's big_image_size_threshold (2560; 0 — never). |
MEDIA_MAX_IMAGE_PIXELS, MEDIA_MAX_SIZE | kitloom/media | Limits for an uploaded image's pixels and any file's bytes. |
MEDIA_OPTIMIZE, MEDIA_OPTIMIZE_PATH | kitloom/media-optimizer | Image compression on or off, and where its tools are. |
PAYMENTS_DEFAULT_METHOD | kitloom/payments | The payment method used when none is named. |
REDIRECTS_CACHE_TTL, REDIRECTS_CACHE_STORE | kitloom/redirects | How long and where the rule set is cached (86400). |
KITLOOM_SEARCH_ENGINE, KITLOOM_SEARCH_INDEX | kitloom/search | database (the module's own engine), or a Scout engine such as meilisearch; the index name. |
KITLOOM_SENTRY_LOCAL_COPY | kitloom/sentry | Where each server keeps its copy of the Sentry settings. |
SEO_SITEMAP, SEO_ROBOTS_TXT | kitloom/seo | Serve the sitemaps and robots.txt (on by default). |
SEO_SITEMAP_CACHE_TTL, SEO_SITEMAP_CACHE_STORE | kitloom/seo | How long and where sitemaps are cached (3600). |
SEO_INSTANT_INDEXING, SEO_GOOGLE_INDEXING_QUOTA, SEO_INSTANT_INDEXING_CACHE_STORE | kitloom/seo | Instant indexing on or off, Google's daily quota (200), the store that counts it. |
VISUAL_EDITOR | kitloom/visual-editor-* | Post text in the visual editor (on) or the plain HTML editor (off). |
KITLOOM_SANDBOX, KITLOOM_SANDBOX_* | kitloom/sandbox | Demo sites only: a SQLite copy of the site per visitor, chosen by the host. Off by default. |
Each module's README — its How it works page in the admin — lists the rest of its configuration.
Where settings are stored
All packages read and write site options through kitloom/settings. It reads the autoloaded options — what WordPress loads with every page — in one query, once per request and only if something asks, and caches the snapshot; any other option (a transient, an inactive theme's mods) is read by name when asked. A declared setting that was never saved answers with its default without a query:
php
use Kitloom\Settings\Facades\Settings;
Settings::get('blogname');
Settings::get('posts_per_page', 10);
Settings::array('sticky_posts'); // JSON, or WordPress's serialized formatWrites go through Kitloom\Settings\SettingWriter, which checks a declared setting's rules and, given a user, their permission — the admins' settings pages save through it. Arrays are written as JSON; WordPress's serialized values are still read, and become JSON on their next save. Every write announces Kitloom\Settings\Events\SettingSaved or SettingDeleted. Modules declare their settings; php artisan settings:list shows them all, by group.
| Key | Default | Meaning |
|---|---|---|
kitloom-settings.table | options | The options table (wp_options with the wp_ prefix). |
kitloom-site.theme.option | kitloom_theme | The option that names the active theme. While it is not set, APP_THEME names it; the option's value '' means no theme, and the site answers with JSON. |
kitloom-modules.option | kitloom_inactive_modules | The option that holds the switched-off modules (JSON). It is intentionally not WordPress's active_plugins. |
kitloom-modules.changed_option | kitloom_modules_changed_at | The time of the last module switch. |
The site
config/kitloom-site.php (kitloom/site):
| Key | Default | Meaning |
|---|---|---|
bases.author, bases.search, bases.pagination | author, search, page | The fixed words in archive addresses. The category and tag bases are WordPress's options, category_base and tag_base. |
theme.option | kitloom_theme | The option that names the active theme. |
theme.default | env('APP_THEME', '') | The theme used while the option is not set or names no installed theme. |
theme.path | null | Where themes that are folders of the application live; null — themes/. |
types.post_types, types.taxonomies | [] | Address settings over whatever a module or theme declares: 'book' => ['rewriteSlug' => 'books']. |
content_filters | [] | The order content filters run in, by name, as the priorities of the_content. |
page_widgets | [] | Widget slots of page types: 'book' => ['similar_books']. |
uploads_url | null | Where the WordPress uploads are seen from outside; null — /wp-content/uploads. |
breadcrumbs.home | Home | The first crumb. |
cache.ttl, cache.store | SITE_CACHE_TTL, SITE_CACHE_STORE | The page cache for guests; the TTL is the default of the kitloom_page_cache and kitloom_page_cache_ttl options Settings → Cache writes. |
cache.flush_tables | the content tables | A record of these tables saved or deleted — every cached page is drawn anew. |
cache.ignore_query | utm_*, fbclid, gclid… | Query parameters that do not make another page: a campaign's tags and click ids share the entry of the plain address. * ends a prefix. |
search.per_page | null | Results per page; null — the posts_per_page option. |
search.stopwords | null | Words left out of a search; null — WordPress's English list. |
auth.routes | true | POST /login and POST /logout for the theme's sign-in form. |
rest.register | true | The REST root /wp-json/ and every module's namespace under it. |
rest.prefix | wp-json | The REST root's prefix. |
rest.cors | true | Add the prefix to Laravel's cors.paths, so a front end on another origin may call it. |
The permalink structure, the front page, the posts page, posts per page and the other reading options are WordPress's own options, set on the admin's settings pages.
Admin switches
Every admin package adds its section as soon as it is installed. When a site wants to place items itself, or hide a section, it turns the package off with a config switch instead of uninstalling it. Add the key to the module's config file (create it if the site has none):
php
// config/kitloom-redirects.php
return [
'filament' => [
'register' => false,
],
];Switches default to true.
Filament
| Switch | Turns off |
|---|---|
kitloom-wp-schema.filament.register | The core sections: Posts, Pages, Categories, Tags, Comments, the settings pages and the dashboard widgets |
kitloom-wp-schema.filament.settings.register | The settings pages General, Writing, Permalinks and Widgets |
kitloom-wp-schema.filament.comments.register | Comments |
kitloom-wp-schema.filament.dashboard.register | kitloom's widgets on the dashboard |
kitloom-site.filament.register | Appearance → Themes; Settings → Reading, Privacy and Cache |
kitloom-modules.filament.register | Modules |
kitloom-permissions.filament.register | Users → Roles |
kitloom-permissions.filament.user_role | The Role field on the user form |
kitloom-media.filament.register | Media |
kitloom-media.filament.picker | Picking attachments (the featured image, the editor) in the media library |
kitloom-navigation.filament.register | Appearance → Menus |
kitloom-widgets.filament.register | The forms of kitloom/widgets' widget types |
kitloom-custom-fields.filament.register | Custom Fields → Field Groups |
kitloom-custom-fields.filament.form_section | The Custom Fields block on forms |
kitloom-post-types.filament.register | Custom Fields → Post Types, Taxonomies |
kitloom-seo.filament.register | SEO |
kitloom-seo.filament.head_meta | The SEO block on post and term forms |
kitloom-redirects.filament.register | Redirects |
kitloom-internal-links.filament.register | Internal Links |
kitloom-forms.filament.register | Contact |
kitloom-shop.filament.register | Products, Shop |
kitloom-payments.filament.register | Payments |
kitloom-slider.filament.register | Sliders |
kitloom-shortcodes.filament.register | Settings → Shortcodes |
kitloom-search.filament.register | Search |
kitloom-search-replace.filament.register | Search & Replace |
kitloom-import-export.filament.register | Tools → Import, Export |
kitloom-admin-menu.filament.register | Admin Menu |
kitloom-api.filament.register | REST API |
kitloom-ai.filament.register | AI agents |
kitloom-two-factor.filament.register | Two-Factor Authentication |
kitloom-social-accounts.filament.register | Social Login |
kitloom-activity-log.filament.register | Activity Log |
kitloom-backup.filament.register | Backups |
kitloom-health.filament.register | Site Health |
kitloom-horizon.filament.register | Horizon |
kitloom-pulse.filament.register | Pulse |
kitloom-sentry.filament.register | Sentry |
kitloom-media-optimizer.filament.register | Image compression |
kitloom-cookie-consent.filament.register | Cookie Consent |
kitloom-analytics.filament.register | Analytics |
kitloom-tag-manager.filament.register | Tag Manager |
kitloom-ad-pixels.filament.register | Ad Pixels |
kitloom-header-footer.filament.register | Header & Footer |
kitloom-ai-writer.filament.register | AI Writer |
kitloom-admin-bar.filament.register | Admin Bar, and where the admin bar's New and Edit lead in Filament |
kitloom-bookings.filament.register | Bookings |
kitloom-comments.filament.register | Settings → Discussion, How it works next to Comments, and the links the moderation emails point at |
kitloom-courses.filament.register | Courses |
kitloom-languages.filament.register | Languages, the Translations block on post and term forms, and the Translations column, filter and "Translate with AI into…" in their lists |
kitloom-link-checks.filament.register | Link Checker |
kitloom-listings.filament.register | Listings |
kitloom-maintenance.filament.register | Maintenance |
kitloom-privacy.filament.register | Privacy |
kitloom-webhooks.filament.register | Webhooks |
Nova
| Switch | Turns off |
|---|---|
kitloom-wp-schema.nova.content.register | Posts, Pages, Categories, Tags |
kitloom-wp-schema.nova.settings.register | The Settings section |
kitloom-wp-schema.nova.options.register | The Options resource (raw options rows) |
kitloom-wp-schema.nova.comments.register | Comments |
kitloom-site.nova.register | Appearance → Themes; Settings → Reading, Privacy and Cache |
kitloom-modules.nova.register | Modules |
kitloom-permissions.nova.register | Users → Roles |
kitloom-media.nova.register | Media, and its settings page |
kitloom-media.nova.picker | Picking attachments in the media library |
kitloom-navigation.nova.register | Menus |
kitloom-widgets.nova.register | The forms of kitloom/widgets' widget types |
kitloom-custom-fields.nova.register | Custom Fields → Field Groups |
kitloom-custom-fields.nova.form_section | The Custom Fields tab on forms |
kitloom-post-types.nova.register | Post Types, Taxonomies |
kitloom-seo.nova.register | The SEO section |
kitloom-seo.nova.settings | SEO settings pages |
kitloom-seo.nova.form_section | The SEO tab on forms |
kitloom-shortcodes.nova.register | Settings → Shortcodes |
kitloom-redirects.nova.register | Redirects |
kitloom-redirects.nova.menu | Only the Redirects sidebar section (resources stay) |
kitloom-internal-links.nova.register | Internal Links (the link counts stay in the post lists) |
kitloom-internal-links.nova.menu | Only the Internal Links sidebar section (resources stay) |
kitloom-forms.nova.register | Contact forms |
kitloom-shop.nova.register | Products, Shop |
kitloom-payments.nova.register | Payments |
kitloom-slider.nova.register | Sliders |
kitloom-search.nova.register | Search |
kitloom-search-replace.nova.register | Search & Replace |
kitloom-search-replace.nova.menu | Only its sidebar entry |
kitloom-import-export.nova.register | Import & Export |
kitloom-import-export.nova.menu | Only its sidebar entry |
kitloom-admin-menu.nova.register | Admin Menu |
kitloom-api.nova.register | REST API |
kitloom-ai.nova.register | AI agents |
kitloom-two-factor.nova.register | Two-Factor Authentication |
kitloom-social-accounts.nova.register | Social Login |
kitloom-activity-log.nova.register | Activity Log |
kitloom-backup.nova.register | Backups |
kitloom-health.nova.register | Site Health |
kitloom-horizon.nova.register | Horizon |
kitloom-pulse.nova.register | Pulse |
kitloom-sentry.nova.register | Sentry |
kitloom-media-optimizer.nova.register | Image compression |
kitloom-cookie-consent.nova.register | Cookie Consent |
kitloom-analytics.nova.register | Analytics |
kitloom-tag-manager.nova.register | Tag Manager |
kitloom-ad-pixels.nova.register | Ad Pixels |
kitloom-header-footer.nova.register | Header & Footer |
kitloom-ai-writer.nova.register | AI Writer |
kitloom-admin-bar.nova.register | Admin Bar, and where the admin bar's New and Edit lead in Nova |
kitloom-bookings.nova.register | Bookings |
kitloom-comments.nova.register | Settings → Discussion, How it works next to Comments, and the links the moderation emails point at |
kitloom-courses.nova.register | Courses |
kitloom-languages.nova.register | Languages, the Translations tab on post and term forms, and the Translations column, filter and "Translate with AI into…" in their lists |
kitloom-link-checks.nova.register | Link Checker |
kitloom-listings.nova.register | Listings |
kitloom-maintenance.nova.register | Maintenance |
kitloom-privacy.nova.register | Privacy |
kitloom-webhooks.nova.register | Webhooks |
Switch or deactivate?
A switch hides the admin of a module for good, in code. Deactivating a module on the Modules screen unloads the whole module — domain and admin — and is undone with one click.
Other switches
The same pattern turns off what a module adds outside the admin:
| Family | Packages | Turns off |
|---|---|---|
kitloom-<name>.shortcodes.register | cookie-consent, forms, languages, media, seo, shop, slider, social-accounts, widgets | The module's shortcodes |
kitloom-<name>.ai.register | activity-log, backup, bookings, comments, courses, custom-fields, forms, health, import-export, languages, link-checks, listings, maintenance, media-optimizer, navigation, post-types, redirects, search, seo, shop, slider, webhooks, widgets | The module's tools for AI agents |
kitloom-<name>.routes.register | api, bookings, comments, courses, forms, listings, payments, privacy, shop | The module's routes — for api, bookings, comments, courses, forms, listings and shop, its REST namespace |
kitloom-ai.mcp.register | ai | The MCP server at /mcp |
kitloom-site.rest.register | site | The REST root and every namespace under it |
kitloom-site.auth.routes | site | POST /login and POST /logout |
kitloom-two-factor.site.register | two-factor | The code step of the site's own sign-in |
kitloom-social-accounts.routes | social-accounts | The routes of sign-in with Google or GitHub |
kitloom-shortcodes.pipeline.register | shortcodes | Shortcodes on the site's content and the shortcodes page part |
kitloom-shortcodes.widgets.register | shortcodes | [sidebar] and [widget] |