Configuration reference¶
Nebula adds one top-level Nebula tab to Stores › Configuration, and a small number of fields to tabs Magento already has. This page lists every setting the packaged modules declare, the config path behind it, its shipped default, and what reads it.
Where the settings live:
| Admin location | Section | Owned by |
|---|---|---|
| Stores › Configuration › Nebula › Nebula Admin Theme | nebula |
Nebula_Core, plus groups added by Nebula_Merchandiser and Nebula_Theme |
| Stores › Configuration › Nebula › Nebula Pro | nebula_pro_marketing |
Nebula_ProMarketing |
| Stores › Configuration › Security › Nebula Passkey | nebula_passkey |
Nebula_Passkey |
| Stores › Configuration › Nebula › Nebula Theme Switcher | nebula_theme_switcher |
Nebula_ThemeSwitcher |
| Stores › Configuration › Advanced › System › Mail Sending Settings | system/smtp |
field hardened by Nebula_System |
| Stores › Configuration › Security › 2FA | twofactorauth/general |
default shipped by Nebula_Passkey |
| Stores › Configuration › General › Content Management | cms/wysiwyg, cms/pagebuilder |
written once by Nebula_Quill's install patch |
| Stores › Configuration › Design › Transactional Emails | design/email/header_template, design/email/footer_template |
written by Nebula_EmailTemplateEditor's header and footer editor |
Nebula also reads a handful of Magento's own settings without shipping a default for them. Those are listed under Core settings Nebula reads.
Scope¶
Most of Nebula's settings are default scope only. Three groups show a
website and store-view switcher: the theme settings (nebula/theme), the
customer password template (nebula/customer_password) and the passkey
storefront group (nebula_passkey/frontend). Only the last two are read at the
scope they offer.
nebula/theme shows a scope switcher that nothing reads
The group declares showInWebsite and showInStore, which is why the
switcher appears, but every reader resolves the value at default scope. The
skin is read as getValue('nebula/theme/skin') with no scope argument at
all, and so is the menu position. Nebula\Core\Model\Config\Theme accepts
a scope, and every caller passes none, so it resolves against the current
store. In the admin area the current store is the admin store, which inherits
default. Set the skin, the menu position, the configuration menu position,
the category view type and the tab toggles at Default Config. A website
or store-view override is stored in core_config_data and never rendered.
The Login Screen and Admin Branding groups are deliberately default-only: there
is one admin, so a website or store-view override could never be reached.
Category Merchandiser is default-only because product position lives in
catalog_category_product, which has no store_id.
Setting values from the command line¶
Every path below can be written without opening the admin:
bin/magento config:set nebula/theme/skin dracula
bin/magento config:set nebula/theme/menu_position top
bin/magento config:set nebula/theme/config_nav_position toolbar
bin/magento config:set nebula/merchandiser/page_size 48
bin/magento config:set nebula_passkey/general/passkey_satisfies_2fa 0
To write a value for one store view, add the scope arguments. Pick a path whose
reader is actually scope-aware, which on this page means
nebula/customer_password/* and nebula_passkey/frontend/*:
bin/magento config:set --scope=stores --scope-code=default \
nebula/customer_password/set_by_admin_template nebula_customer_password_set_by_admin_template
bin/magento config:set --scope=stores --scope-code=default nebula_passkey/frontend/rp_id example.com
Writing nebula/theme/* at store-view scope stores a row that nothing reads.
See Scope above.
Note
config:set writes to core_config_data. Use config:show <path> to read a
value back, and bin/magento app:config:dump if you keep configuration in
app/etc/config.php.
Nebula › Settings¶
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Admin Theme | nebula/theme/admin_theme |
Select: Nebula (packaged), plus every registered adminhtml theme that declares <parent>Nebula/backend</parent> |
Nebula/backend |
Which theme adminhtml renders. Nebula forces a theme onto every admin request; this chooses which one. Only a descendant of Nebula/backend is offered and honoured — a child inherits Nebula's layout and templates through the normal fallback chain, so theme-level files (root.phtml, the menu, the login shell, css/dist/app.css) can be overridden without editing vendor/. An unrelated theme, or a stored path that is not registered, falls back to the packaged theme and logs a warning rather than leaving the admin unthemed. The theme switcher recognises the same set as "Nebula", so a child keeps every Nebula plugin. See A theme of your own. |
| Menu Position | nebula/theme/menu_position |
Select: sidebar (Sidebar (left)), top (Top (horizontal)), magento (Magento rail (icon + label)) |
sidebar |
Controls where the main navigation menu appears. magento is the native-Magento icon-above-label rail with flyout submenus. Saving a new value clears the config, layout and block caches automatically. |
| Configuration Menu Position | nebula/theme/config_nav_position |
Select: sidebar (Sidebar (fixed left column)), rail (Rail (collapsible left column)), toolbar (Toolbar (dropdown beside the scope picker)) |
sidebar |
Where the section menu sits on the Configuration page itself. Rail is the same column with a control that collapses it to a strip, giving the form the width back. Toolbar drops the column and puts the menu behind a button beside the scope picker — the one to choose if you work at narrow widths with the main menu collapsed. An unrecognised stored value falls back to sidebar. |
| Color Scheme | nebula/theme/skin |
Select, from the skin JSON files found in every module's view/adminhtml/nebula/skin/ (19 ship with Nebula — see below) |
indigo |
Selects the admin colour scheme. Third-party modules add their own by dropping a JSON file in that directory. An unknown id renders no skin CSS and the stylesheet defaults stand. The field offers website and store-view scope, but SkinLoader::getActiveSkinId() reads the path at default scope, so a scoped value never renders. Set the skin at Default Config. |
| Enable Product Edit Tabs | nebula/theme/enable_product_edit_tabs |
Select: Yes / No | 0 (No) |
Enables the experimental tabbed Nebula layout for the Magento product edit page. |
| Enable CMS Page Edit Tabs | nebula/theme/enable_cms_page_edit_tabs |
Select: Yes / No | 0 (No) |
Enables the experimental tabbed Nebula layout for the Magento CMS page edit view. |
| Enable CMS Block Edit Tabs | nebula/theme/enable_cms_block_edit_tabs |
Select: Yes / No | 0 (No) |
Enables the tabbed Nebula layout for the Magento CMS block edit view. Read by Nebula\Core\Plugin\UseTabbedCmsBlockEditForm. |
| Enable Landing Page Edit Tabs | nebula/theme/enable_landing_page_edit_tabs |
Select: Yes / No | 0 (No) |
Splits the landing page edit view into steps — General, Content, Products, Hub, Search Engines, Campaign Window — rather than one long form. Has no effect unless Nebula_LandingPage is installed. |
| Category View Type | nebula/theme/category_view_type |
Select: standard (Standard (Sidebar + Form)), refreshed (Refreshed (Drawer Tree + Full Tabs)), unified (Unified (Drawer Tree + Top Sections + Tabs)), tabbed_sidebar (Tabbed Sidebar (Sidebar on Desktop, Drawer on Mobile)) |
standard |
Layout style for the Magento category edit page. An empty value falls back to standard. |
| Show Payment Recommendations | nebula/theme/show_payment_recommendations |
Select: Yes / No | 0 (No) |
Shows the marketing blocks on Stores › Configuration › Sales › Payment Methods (the Mollie "Hyvä's Top Pick" panel and the "Go to Payment Services" link). Hidden by default. Your actual payment method settings are never affected by this flag; it only hides the promotional sub-blocks, via Nebula\Core\Plugin\Config\HidePaymentMarketing. |
The 19 colour schemes that ship with Nebula
The value stored in nebula/theme/skin is the id on the left.
| Id | Label |
|---|---|
accessible-deuteranopia |
Accessible (Green-Blind / Deuteranopia) |
accessible-protanopia |
Accessible (Red-Blind / Protanopia) |
amber |
Amber |
amber-large |
Amber Large |
dracula |
Dracula |
emerald |
Emerald |
flat |
Flat (No Radius) |
high-contrast |
⚡ HIGH CONTRAST ⚡ |
indigo |
Indigo (Default) |
indigo-compact |
Indigo Compact |
magento-classic |
Magento Classic (2.4 Admin) |
matrix |
Matrix |
nord |
Nord (Arctic) |
nostalgia |
Nostalgia (Magento 1) |
qoliber-fire |
Qoliber Fire 🔥 |
rose |
Rose |
siteation |
Siteation |
slate |
Slate |
tokio-night |
Tokyo Night |
Skins are discovered at runtime, so this list grows with any module that ships its own. A skin file larger than 256 KiB, or one that fails to parse, is skipped rather than breaking the list.
Do not leave these selects unset
Every select in this group has a default in config.xml for a reason. A
select with no stored default renders its first option, and saving the
section posts every field — so opening the page and pressing Save would adopt
that first option. For skin the first option is
accessible-deuteranopia, not indigo. If you add a field to this group in
your own module, add its default to config.xml too.
Getting a shipped default back takes the command line
Once a row exists in core_config_data at Default Config, no nebula/*
field offers a "Use system value" checkbox to undo it. Only the six Nebula
Passkey fields declare canRestore="1". The checkbox a website or store view
shows is Magento's own "Use Default" inherit control, which points back at
the parent scope rather than at the packaged default, and for nebula/theme
the parent scope is the only one read anyway. The way back is
bin/magento config:set nebula/theme/skin indigo with the value from the
Default column of these tables, or deleting the row.
Source: code/Nebula/Core/etc/adminhtml/system.xml,
code/Nebula/Core/etc/config.xml,
code/Nebula/Core/Model/Config/Source/MenuPosition.php,
code/Nebula/Core/Model/Config/Source/ConfigNavPosition.php,
code/Nebula/Core/Model/Config/Source/CategoryViewType.php,
code/Nebula/Core/Model/Config/Backend/MenuPosition.php,
code/Nebula/Core/Model/Config/Theme.php,
code/Nebula/Skin/Model/Source/SkinList.php,
code/Nebula/Skin/Model/SkinLoader.php.
Nebula › Login Screen¶
This is the branding panel beside the sign-in form. Leave a field empty to keep Nebula's own wording, which is translated with the rest of the admin; anything you type is shown verbatim, in the language you type it. Default scope only.
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Logo | nebula/login/logo |
Image upload (Nebula\Core\Model\Config\Backend\BrandingImage: jpg, jpeg, gif, png, webp, svg) |
empty | Shown at 64×64 inside a rounded tile. A square image is what fits; anything else is letterboxed rather than cropped. Empty falls back to nebula-logo-full.jpg shipped in the theme, resolved by the template rather than by config, so anyone inheriting the theme can drop in their own file. See Replacing the shipped marks. |
| Title | nebula/login/title |
Text | empty → Nebula |
The large line under the logo. |
| Subtitle | nebula/login/subtitle |
Text | empty → Administration Panel |
The line below the title. |
| Tagline | nebula/login/tagline |
Textarea | empty → Modern eCommerce management — built for speed, clarity and control. |
The small paragraph at the bottom. Keep it short; the column is narrow and long text pushes the panel out of balance. |
Where an uploaded logo goes
pub/media/nebula/login/<scope>/, where <scope> is default, websites/<id> or
stores/<id> — the directory Nebula\Core\ViewModel\LoginBranding reads, so an
upload shows on the next request. (Until 2026-09-13 the field used core's Image\Logo
backend model, which ignored the field's upload_dir and wrote under pub/media/logo/,
where the login page never looked; a copy step was needed. It is not any more.)
Source: code/Nebula/Core/etc/adminhtml/system.xml,
code/Nebula/Core/ViewModel/LoginBranding.php.
Nebula › Admin Branding¶
The mark and wording inside the admin itself. Same contract as the login panel: empty keeps Nebula's own, anything set is used verbatim and is not translated. Default scope only.
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Sidebar Logo | nebula/admin/logo |
Image upload (Nebula\Core\Model\Config\Backend\BrandingImage: jpg, jpeg, gif, png, webp, svg) |
empty | Shown at 32×32 beside the wordmark, and it collapses with the sidebar. A square image fits; anything else is contained rather than cropped. Empty leaves the theme's nebula-logo.png in place. |
| Wordmark | nebula/admin/wordmark |
Text | empty → Nebula |
The word beside the mark. Long words are truncated by the sidebar rather than wrapping it. |
| Favicon | nebula/admin/favicon |
Image upload (Nebula\Core\Model\Config\Backend\BrandingFavicon: ico, png, gif, jpg, jpeg, apng, webp, svg) |
empty | The browser tab icon for admin pages. PNG, square, 96×96 or larger. Empty falls back to the same nebula-logo.png the sidebar uses. |
Where these uploads go
pub/media/nebula/admin/<scope>/ for both, which is where
Nebula\Core\ViewModel\AdminBranding reads them, so an upload shows on the next
request. (Until 2026-09-13 the fields used core's Image\Logo and Image\Favicon
backend models, which wrote under pub/media/logo/ and pub/media/favicon/ instead;
the copy step that needed is gone. Files uploaded before then stay where they were —
upload once more, or copy them into the directories above.)
Replacing the shipped marks¶
The fallbacks behind both branding groups are view files in the theme, not
config values. A child theme can replace them without a single row in
core_config_data, which is the route that does not depend on the upload fields.
| View file | What renders it |
|---|---|
design/adminhtml/Nebula/backend/web/images/nebula-logo-full.jpg |
The login panel mark, from Magento_Backend/templates/admin/login_branding.phtml. |
design/adminhtml/Nebula/backend/web/images/nebula-logo.png |
Both the sidebar mark (Magento_Backend/templates/page/sidebar_logo.phtml) and the admin favicon (Magento_Theme/templates/root.phtml). One file serves two surfaces, so replacing it changes both. |
In a theme that declares <parent>Nebula/backend</parent>, put your own files at
app/design/adminhtml/<Vendor>/<theme>/web/images/nebula-logo.png and
app/design/adminhtml/<Vendor>/<theme>/web/images/nebula-logo-full.jpg. See
A theme of your own.
Note
Both are resolved with getViewFileUrl(), so production mode needs a static
content deploy before the replacements are served. Developer mode picks them
up on the next request.
Source: code/Nebula/Core/etc/adminhtml/system.xml,
code/Nebula/Core/ViewModel/AdminBranding.php.
Nebula › Category Merchandiser¶
Ordering the products inside a category. Default scope only. The defaults match Hyvä's Category Merchandiser 0.1.0 key for key, so a merchant moving between the two finds the same behaviour.
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Enable Category Merchandiser | nebula/merchandiser/enabled |
Select: Yes / No | 1 (Yes) |
Replaces the read-only products list on the category page with a link to the merchandiser. |
| Include Assigned Products in Search | nebula/merchandiser/search_include_assigned |
Select: Yes / No | 1 (Yes) |
Shows products already in this category among the search results. |
| Include Disabled Products in Search | nebula/merchandiser/search_include_disabled |
Select: Yes / No | 0 (No) |
Includes disabled products in the merchandiser's product search. |
| Include Non-Visible Products in Search | nebula/merchandiser/search_include_invisible |
Select: Yes / No | 0 (No) |
Includes products set to "Not Visible Individually" or "Search" only. |
| Minimum Search Query Length | nebula/merchandiser/search_min_query_length |
Text, digits only | 3 |
How many characters before the merchandiser searches. Between 1 and 10; values outside that range are clamped when read, not rejected on save. |
| Add New Products to Top of Grid | nebula/merchandiser/add_to_top |
Select: Yes / No | 1 (Yes) |
Newly added products land at position 1 rather than at the end. |
| Product Grid Columns | nebula/merchandiser/grid_columns |
Text, digits only | 4 |
Columns in the merchandiser grid. Between 1 and 8, clamped on read. Each administrator can override this for themselves. |
| Products per Page | nebula/merchandiser/page_size |
Text, digits only | 24 |
Page size for the merchandiser grid. Between 12 and 100, clamped on read. Each administrator can override this for themselves. |
| Warn When the Category Does Not Sort by Position | nebula/merchandiser/warn_on_sort_order |
Select: Yes / No | 1 (Yes) |
Shows a warning when the category's default sort is not Position. Manual order is invisible to a shopper unless the listing sorts by Position. |
Note
The three numeric fields are clamped every time they are read, so a value
hand-edited into core_config_data — a page size of 100000, say — produces a
wide page rather than an outage.
Source: code/Nebula/Merchandiser/etc/adminhtml/system.xml,
code/Nebula/Merchandiser/etc/config.xml,
code/Nebula/Merchandiser/Model/Config.php.
Nebula › Customer Passwords¶
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Password Set By An Administrator | nebula/customer_password/set_by_admin_template |
Select, from Magento\Config\Model\Config\Source\Email\Template (every registered transactional email template) |
nebula_customer_password_set_by_admin_template ("Password Set By An Administrator") |
The email sent to the customer after a member of staff sets a new password on their account. Deliberately not core's "your password has been changed" template, whose copy tells the recipient to raise the alarm about something the store did on purpose. Shows in default, website and store-view scope. |
The on switch is an ACL resource, not a config field
Who may set a customer's password is decided by the
Nebula_Theme::customer_set_password permission, per role, under
System › Permissions › User Roles. This field only points the feature at
different copy, so a merchant who wants different wording does not have to
fork the module.
Source: code/Nebula/Theme/etc/adminhtml/system.xml,
code/Nebula/Theme/etc/config.xml,
code/Nebula/Theme/etc/email_templates.xml,
code/Nebula/Theme/Model/Customer/PasswordChangedNotifier.php.
Nebula Pro › Pro Upsell¶
Controls the "this is a Nebula Pro feature" prompts shown in the admin when a paid feature is not installed. Resellers can rebrand the call to action or turn the prompts off. Default scope only.
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Show Pro Upsell Prompts | nebula_pro_marketing/upsell/enabled |
Select: Yes / No | 1 (Yes) |
Master switch for every Pro upsell affordance in the admin. Set to No and the three fields below are hidden. |
| Call To Action Label | nebula_pro_marketing/upsell/cta_label |
Text (shown only when enabled) | Upgrade to Nebula Pro |
Text on the upgrade button in the upsell dialog. |
| Call To Action URL | nebula_pro_marketing/upsell/cta_url |
Text, validated as a URL (shown only when enabled) | https://qoliber.com/nebula-pro |
Where the upgrade button links to. Point this at your own sales page to white-label the prompts. |
| Override Message | nebula_pro_marketing/upsell/message |
Textarea (shown only when enabled) | empty | Optional. Replaces the default per-feature description in the upsell dialog with your own copy. |
Source: code/Nebula/ProMarketing/etc/adminhtml/system.xml,
code/Nebula/ProMarketing/etc/config.xml.
Security › Nebula Passkey › General¶
These govern the passkeys administrators register. Default scope only. Every field can be reset with the "Use system value" checkbox.
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Relying Party ID | nebula_passkey/general/rp_id |
Text | empty → the host of the admin base URL | The WebAuthn relying party id administrators' credentials are bound to. Leave empty for almost every install. Set it only when the admin is served on a subdomain and the passkey should also work on the parent domain — example.com for an admin on admin.example.com. It must be the admin host or a parent of it; anything else is rejected, because no browser would accept it. |
| Relying Party Name | nebula_passkey/general/rp_name |
Text | empty → Nebula Admin |
The name the authenticator shows the administrator while registering a passkey. |
| A passkey satisfies two-factor authentication | nebula_passkey/general/passkey_satisfies_2fa |
Select: Yes / No | 1 (Yes) |
Whether a passkey sign-in also clears Magento's two-factor requirement. Only applies when Magento_TwoFactorAuth is enabled, and only to sign-ins where the authenticator actually performed user verification — a biometric, a PIN or a screen unlock — rather than merely confirming somebody was present. Such a sign-in is possession plus inherence, which is two factors. Set to No if a compliance regime names the specific second factors you must use. |
Note
User verification is read off the signed authenticator data, not inferred from what the sign-in asked for. An assertion that only proved presence never reaches this flag, so setting it to Yes cannot waive a factor that was not actually provided.
This section is opened by Nebula_Passkey::passkey_manage
Each configuration section names the resource that opens it. nebula and
nebula_pro_marketing name Nebula_Core::config,
nebula_theme_switcher names
Nebula_ThemeSwitcher::config, and nebula_passkey names
Nebula_Passkey::passkey_manage. That last one is the resource
every administrator has to hold in order to register a passkey of their own,
so any role that also reaches Stores › Configuration can change the relying
party id and the two-factor waiver here. That is wider than the other
sections, and it is worth deciding on rather than inheriting. To narrow it,
give the section its own resource in system.xml. See
ACL resources.
Source: code/Nebula/Passkey/etc/adminhtml/system.xml,
code/Nebula/Passkey/etc/config.xml,
code/Nebula/Passkey/Model/Config/AdminRelyingParty.php,
code/Nebula/Passkey/Model/TwoFactor/AdminTwoFactorBridge.php.
Security › Nebula Passkey › Storefront¶
Customers sign in with passkeys against the storefront's own relying party, which is deliberately separate from the admin's. A customer's authenticator must not satisfy an admin sign-in, and that holds whatever these fields say. Shows in default, website and store-view scope, and the value is read at the scope it is set. Every field here can be reset with the "Use system value" checkbox.
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Relying Party ID | nebula_passkey/frontend/rp_id |
Text | empty → the host of this store view's base URL | Leave empty unless several store views share one account and their passkeys should work across all of them — example.com for stores on uk.example.com and de.example.com. It must be the store's host or a parent of it. |
| Relying Party Name | nebula_passkey/frontend/rp_name |
Text | empty → the store name (or Store Account if the store has no name) |
What the authenticator shows a customer while they register. The store name is what a customer will recognise. |
| A passkey satisfies two-step verification | nebula_passkey/frontend/passkey_satisfies_2fa |
Select: Yes / No | 1 (Yes) |
Whether a user-verified passkey sign-in clears the storefront's two-step prompt. Separate from the admin setting above, so administrators can be held to a stricter rule than shoppers. |
Source: code/Nebula/Passkey/etc/adminhtml/system.xml,
code/Nebula/Passkey/etc/config.xml,
code/Nebula/Passkey/Model/Config/StorefrontRelyingParty.php,
code/Nebula/Passkey/Model/Totp/PasskeySatisfiesTotp.php.
Security › 2FA › force_providers¶
Nebula ships a default for a core setting, and it is the one default here that belongs to another module.
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Providers to use (Magento's own field) | twofactorauth/general/force_providers |
Multiselect of provider codes | google,nebula_passkey |
The providers every administrator must configure. The list is cumulative, not a menu: an administrator who already has Google Authenticator set up is still required to enrol a passkey before the dashboard opens. Magento ships this empty, and an empty list sends the first administrator to a screen asking them to pick providers for the whole install before they have seen the admin at all. Naming two here answers that with the two this package can actually deliver. The field carries "Use system value", so a merchant who disagrees clears it in one click. |
What this means for the first sign-in
An administrator with no second factor yet is normally redirected by Magento
to tfa/tfa/requestconfig, which emails them a configuration link. On an
install whose mail goes nowhere that is a dead end, and it is the whole of
the first-run experience. Nebula sends them to the provider selection screen
first instead: the passkey can be enrolled inline, and choosing any other
provider links back to the core controller with the choice recorded, at
which point the email is sent exactly as before. Nothing is bypassed.
The selection screen only appears while more than one provider is still
outstanding. An administrator who already has one of the two configured has
nothing to choose between, so Magento's own tfa/tfa/requestconfig handles
them and emails the configuration link for the remaining provider.
Source: code/Nebula/Passkey/etc/config.xml,
code/Nebula/Passkey/Plugin/OfferProviderChoiceOnFirstEnrolment.php.
Nebula › Nebula Theme Switcher¶
Default scope only.
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Enable Module | nebula_theme_switcher/general/enabled |
Select: Yes / No | 1 (Yes) |
Shows the theme switcher in the admin menu. Set to No and the switcher disappears, the theme recorded below stops applying, and every Nebula plugin that asks the switcher answers "Nebula" whatever value the field still holds — so Nebula renders whole again. (Until 2026-09-13 six plugins read the stale value and stripped Nebula's own layout from a Nebula page.) Disabling the module is not a way to stay on another admin theme. |
| Active Admin Theme | nebula_theme_switcher/general/active_theme |
Text (a theme path, e.g. Nebula/backend) |
Nebula/backend |
Which admin theme is rendered. Managed by the widget rather than typed by hand. Nebula keeps its own path rather than reading admin/system_admin_design/active_theme, so it does not inherit another switcher module's default; an admin who edits that core field is mirrored back onto this one so the two do not drift. An empty value counts as Nebula being active, and so does a registered child of Nebula/backend: the child renders and every Nebula plugin stays on. Only a theme outside that family — Magento/backend, MageOS/m137-admin-theme — puts the admin into legacy mode. |
The sidebar widget¶
The switcher renders as a block inside the admin menu from
Nebula_ThemeSwitcher::sidebar/theme-switcher.phtml. It sits at
the foot of the sidebar under Nebula and is appended to the menu bar under a
legacy admin theme. It lists
every registered adminhtml theme, marks the current one, and posts the choice
to its own controller, which writes active_theme above. Themes it recognises
get a short, readable label; anything else keeps the title from its own
theme.xml. When a non-Nebula theme is selected, Nebula's layout updates and
scripts are filtered out so the legacy admin renders cleanly.
Source: code/Nebula/ThemeSwitcher/etc/adminhtml/system.xml,
code/Nebula/ThemeSwitcher/etc/config.xml,
code/Nebula/ThemeSwitcher/Helper/Config.php,
code/Nebula/ThemeSwitcher/Block/Adminhtml/Header/ThemeSwitcher.php.
Advanced › System › Mail Sending Settings¶
Nebula adds no field here. It adds one validation rule to a field Magento already has.
| Setting (label) | Path | Type / options | Default | What it does |
|---|---|---|---|---|
| Return-Path Email (core field) | system/smtp/return_path_email |
Text; Nebula changes the client-side rule from validate-email to validate-email required-entry |
unchanged (core's) | Makes the browser say what the save already enforces. The field only appears when Set Return-Path is "Specified", and in that state Magento's own backend model refuses to save an empty value — but core declares only validate-email, which passes on empty. So an empty value used to reach the server and fail the whole section save with The "" email address is incorrect., a message naming neither the field nor its group. The field is disabled whenever it is hidden, so the new rule can only fire when an admin has actually asked for a specified return path. |
Source: code/Nebula/System/etc/adminhtml/system.xml.
General › Content Management — what the install patch writes¶
Nebula_Quill ships a data patch that writes three core config
values once, at setup:upgrade. These are ordinary config rows afterwards: you
can change any of them in the admin or with config:set, and the patch will not
run again to undo you.
| Path | Written value | What it does |
|---|---|---|
cms/wysiwyg/enabled |
enabled |
Turns the WYSIWYG editor on, so content fields get a rich editor rather than a raw textarea. |
cms/wysiwyg/editor |
Nebula_Quill/js/wysiwyg/quill-adapter |
Selects Nebula's Quill adapter as the editor. This value is also what the module's own config model checks to decide whether Quill is the active editor. |
cms/pagebuilder/enabled |
0 |
Turns Page Builder off. Page Builder is a Knockout/RequireJS application and does not render inside the Nebula admin. |
Source: code/Nebula/Quill/Setup/Patch/Data/ConfigureDefaultEditor.php,
code/Nebula/Quill/Model/Config/QuillConfig.php.
Marketing › Email Header and Footer¶
The header and footer editor is a screen, not a configuration section, but its Save button writes core config rows. The screen itself is described in Content.
| Path | Written on Save | Removed by |
|---|---|---|
design/email/header_template |
The numeric id of a transactional email template the editor creates, named design_email_header_template_store_<storeId> |
Clearing the setting for that scope. No button in the editor removes it. |
design/email/footer_template |
The same, named design_email_footer_template_store_<storeId> |
The same. |
The row is written at Default Config when no store view is selected, and at
stores scope for that store view otherwise.
The reset path is not usable in this release
The screen's Reset to default button posts to a route that ships no controller, so it fails and changes nothing. Delete is not offered in header and footer mode, and the delete controller refuses these rows outright. To put the shipped header or footer back for a scope, clear the Email Header Template or Email Footer Template setting named below for that scope. See Content.
This is the same setting Stores › Configuration › Design › Transactional Emails shows as Email Header Template and Email Footer Template. The editor and that field are two screens onto one value, and the last one saved wins.
Source: code/Nebula/EmailTemplateEditor/Model/Partial/PartialManager.php.
Core settings Nebula reads¶
Magento's own settings that decide what a Nebula screen draws. Nebula ships no default for any of them, so a fresh install behaves the way Magento ships. The first two govern the Login as Customer panel described in Customers and security.
| Path | Admin location | What it decides |
|---|---|---|
login_as_customer/general/enabled |
Stores › Configuration › Customers › Login as Customer › Enable Login as Customer | Magento ships this off. While it is off, neither Login as Customer control is drawn on the customer form: not the Start session… row and not the "Allow remote shopping assistance" toggle, whatever the role's permissions say. The row needs the module, this flag and Magento_LoginAsCustomer::login together. |
login_as_customer/general/store_view_manual_choice_enabled |
The same group, Manual Choice Enable | Whether the dialog offers a store-view choice. It is offered only when this is Yes and the customer's account reaches more than one store view. Otherwise core picks the store itself, and Nebula does not override that. |
system/media_storage_configuration/allowed_resources/media_gallery_image_folders |
No field anywhere. An array node contributed by config.xml |
The only folders the media browser lists. It is an allow list, not a deny list: a folder that is not on it stays hidden even though the indexer has walked it. Magento_Cms contributes wysiwyg and Magento_Catalog contributes catalog/category, and on a stock install those two are all of it. A pub/media/brands folder filled over FTP is indexed and never listed until something adds it. |
The media allow list cannot be written with config:set
It is an array node, so the only way to add a root is a module config.xml
contributing a child to it:
<default>
<system>
<media_storage_configuration>
<allowed_resources>
<media_gallery_image_folders>
<brands>brands</brands>
</media_gallery_image_folders>
</allowed_resources>
</media_storage_configuration>
</system>
</default>
Nebula reads the node at default scope only. It also refuses downloadable,
customer, customer_address, import, export, tmp, captcha,
analytics, sitemap, theme_customization and .thumbs whatever the node
says, so no configuration can hand the browser customer invoices or purchased
downloadables. bin/magento nebula:media:index reports the same rule when the
index ends up holding nothing browsable. See
nebula:media:index.
Source: code/Nebula/Theme/Model/Customer/LoginAsCustomerState.php,
code/Nebula/Media/Model/AllowedMediaFolders.php.
Hidden defaults¶
Values Nebula's config.xml files set that have no field in Stores ›
Configuration. Change them with bin/magento config:set, or by editing
app/etc/config.php if you keep configuration in the filesystem.
| Path | Default | Purpose |
|---|---|---|
nebula/theme/enable_category_refresh |
0 |
Legacy flag from before Category View Type existed. Nothing in this version reads it; the deprecated Theme::isCategoryRefreshEnabled() now answers from nebula/theme/category_view_type instead. Kept so an install that stored a value does not see it vanish. Use nebula/theme/category_view_type. |
dev/js/minify_exclude/nebula_node_modules |
/node_modules/ |
Excludes the theme's build tooling from JavaScript minification. The Nebula theme keeps its build tooling under web/node_modules, and setup:static-content:deploy walks the whole web/ tree; without this, production-mode deploy hands those multi-megabyte Node bundles to JShrink, which fails with "Unclosed string" on non-browser code. Matching /node_modules/ anywhere in the path skips those files, which the browser never requests anyway. |
dev/css/minify_exclude/nebula_node_modules |
/node_modules/ |
The same exclusion for CSS. |
nebula_passkey/general/passkey_satisfies_2fa |
1 |
Has a field (documented above); listed here because the default lives in config.xml rather than in system.xml, so a fresh install has it on before anyone visits the section. |
nebula_passkey/frontend/passkey_satisfies_2fa |
1 |
As above, for the storefront. |
twofactorauth/general/force_providers |
google,nebula_passkey |
A default written into another module's path. Documented in full under Security › 2FA. |
Note
nebula/login/* has no defaults in config.xml on purpose. Those fields are
text, not selects, so there is no first-option hazard — and empty is the
value that means something: the view model falls back to the packaged mark
and to translated strings, which a stored default would replace with
untranslatable English.
Source: code/Nebula/Core/etc/config.xml,
code/Nebula/Core/Model/Config/Theme.php,
code/Nebula/Passkey/etc/config.xml.