Contensio logo
All features

Plugins & themes

Install from Composer or upload a ZIP. Auto-migrations on enable. Plugins inject UI via a clean Hook API.

Replaces A cleaner plugin & theme API

Both WordPress and Contensio have plugins and themes — that's table stakes. What matters is how clean the API is, how safely plugins install, and whether they can extend the admin without forking the core. Contensio's plugin system is Laravel-native, with a modern extension API that doesn't require plugins to monkey-patch anything.

Two install paths, one destination

Composer

For developers — install from Packagist, commit to your composer.json, CI-friendly, version-locked.

composer require contensio/plugin-social-connect

ZIP upload

For non-technical users — download a release ZIP, upload it in the admin, enable. Same plugin, same result.

Auto-migrations on enable

Plugins that ship database tables declare migrations. When an admin clicks Enable, Contensio runs those migrations automatically — no CLI step required. If a migration fails, the plugin stays enabled with a warning, and you can fix and retry. Disable + re-enable is safe and idempotent.

The Hook system

Plugins extend the admin UI by registering Hooks — named extension points in core views. A plugin can inject a sign-in button onto the login page, a section on the user profile, a card on the settings hub — without editing a single core file.

// Inside a plugin's service provider
Hook::add('login.after_form', function () {
    return view('social-connect::partials.login-buttons', [
        'providers' => Providers::enabled(),
    ])->render();
});

Core views render hooks with {!! Hook::render('login.after_form') !!}. Multiple plugins can register for the same hook — their output is concatenated in priority order. If a plugin throws, it's caught and logged — other plugins keep working.

Sidebar navigation placement

Plugins declare where their admin links appear in plugin.json. Three placements:

A plugin can register multiple entries — a Shop plugin might ship a root-level "Shop" link plus a tools-level "Order export" link, both declared in the same menu block.

Themes

Themes ship Blade layouts, CSS, JS, and optional customization schemas. Three discovery sources: bundled, local (themes/ directory), and Composer-installed. The active theme's views land under the theme:: namespace, so switching themes swaps the presentation layer cleanly.

Compared to WordPress

WordPress

  • Filters + actions everywhere; debugging is a scavenger hunt
  • Plugins often need manual migration commands
  • Conflicts between plugins are frequent and silent

Contensio

  • Named Hook points in the core — documented, typed
  • Migrations run on enable
  • A failing plugin is isolated, logged, doesn't crash the admin