octobercms/october · error · ApplicationException

Cannot delete the active theme, try making another theme act

Error message

Cannot delete the active theme, try making another theme active first.

What it means

ThemeManager::deleteTheme() refuses to delete the theme that is currently the active front-end theme, protecting the live site from losing its theme. The guard is $theme->isActiveTheme(); deleteTheme also silently returns false when the theme fails isValid(), so this exception is specifically about deleting the active one.

Source

Thrown at modules/cms/classes/ThemeManager.php:431

     */
    public function purgeDatabaseTemplates(string $dirName)
    {
        Db::table('cms_theme_templates')->where('source', $dirName)->delete();
    }

    /**
     * deleteTheme completely delete a theme from the system
     */
    public function deleteTheme(string $theme)
    {
        $theme = CmsTheme::load($theme);

        if (!$theme->isValid()) {
            return false;
        }

        if ($theme->isActiveTheme()) {
            throw new ApplicationException(__('Cannot delete the active theme, try making another theme active first.'));
        }

        $theme->removeCustomData();

        // Delete from file system
        $themePath = $theme->getPath();
        if (is_dir($themePath)) {
            File::deleteDirectory($themePath);
        }
    }

    /**
     * findMissingDependencies scans the system plugins to locate any dependencies that
     * are not currently installed. Returns an array of plugin codes that are needed.
     *
     *     ThemeManager::instance()->findMissingDependencies();
     *
     * @return array

View on GitHub (pinned to b608633a7e)

Solutions

  1. Activate another theme first: Theme::setActiveTheme('mysite') or switch it in the backend theme picker, then retry the delete
  2. Guard your code: only call deleteTheme when !$theme->isActiveTheme()
  3. If the active theme is itself broken, set 'activeTheme' in config/cms.php to a valid theme and retry

Example fix

// before
Cms\Classes\ThemeManager::instance()->deleteTheme('demo'); // 'demo' is active -> throws

// after
Cms\Classes\Theme::setActiveTheme('mysite');
Cms\Classes\ThemeManager::instance()->deleteTheme('demo');
Defensive patterns

Strategy: validation

Validate before calling

$theme = \Cms\Classes\Theme::load($code);
if ($theme && $theme->isValid() && !$theme->isActiveTheme()) {
    \Cms\Classes\ThemeManager::instance()->deleteTheme($code);
}

Try / catch

try { \Cms\Classes\ThemeManager::instance()->deleteTheme($code); } catch (\October\Rain\Exception\ApplicationException $e) { // active theme: switch first, then retry }

Prevention

When it happens

Trigger: Calling ThemeManager::instance()->deleteTheme('demo') while 'demo' is the active theme, or deleting the active theme from the backend theme-management UI.

Common situations: Removing the starter/demo theme after building a custom theme without switching the active theme first; cleanup scripts that iterate and delete every theme; duplicated environments where the active theme code points at the theme being removed.

Related errors


AI-assisted analysis of octobercms/october@b608633a7e (2026-08-21). Data as JSON: /api/errors/685bc0e62521acc1. Report an issue: GitHub.