Skip to content

Plugins

Plugins

As with WordPress, you add features with plugins. The difference: a single plugin can include both an admin side (Laravel) and a site side (Next.js). Enable it in the admin, and it reaches the site from the next build.

What plugins can do

Laravel

Admin side

  • adminRoutes()

    Admin pages

    Add screens under /admin

  • menu()

    Sidebar menu

    Add items to the admin menu

  • dashboardWidget()

    Dashboard

    Add widgets to the dashboard

  • migrations()

    Tables

    Create tables dedicated to the plugin

  • apiRoutes()

    Public API

    Add APIs read by the static build

  • mcpRoutes() / mcpScopes()

    MCP tools

    Add tools and permissions for AI agents

  • artisan() / schedule()

    Commands and schedules

    Scheduled jobs such as data imports

  • publicSettings() / frontendEnv()

    Passing settings

    Settings and environment variables passed to the site

Next.js

Site side

  • routes/

    Site pages

    Add new sets of pages to the public site

  • nav / footerLinks

    Navigation

    Add links to the header and footer

  • slots

    Slots

    Insert components below articles, at the end of the home page, and more

  • sections

    Home page components

    Add section types for static pages

  • sitemap

    Sitemap

    List added pages in sitemap.xml

  • tracking

    Click tracking

    Add classification rules for CTA clicks

Hooks 17

Hook your own logic into moments such as installation, builds, plugin activation and analytics events (the same idea as WordPress actions / filters).

  • cms.core.installed
  • cms.core.upgraded
  • cms.core.booted
  • cms.setup.completed
  • cms.plugin.installed
  • cms.plugin.enabled
  • cms.plugin.disabled
  • cms.plugin.updated
  • cms.build.before
  • cms.build.after
  • cms.frontend.env
  • cms.public_settings
  • cms.page.section_types
  • cms.mcp.tools
  • cms.mcp.scopes
  • cms.tracking.event_recorded
  • cms.tracking.conversion_recorded

Example plugins

  • Bundled

    Campaign LPs

    Manage and track campaign pages imported from external landing-page tools.

  • Bundled

    Hello World

    A plugin template. Shows the minimal setup for the admin, the API, and the site side.

  • Running on our own media

    Regional directory

    Listing pages by prefecture, municipality, and station, detail pages, and data imports — all in one plugin.

Build, install, distribute

  • php artisan plugin:make my-feature --frontend

    Scaffold a plugin (admin side + site side)

  • php artisan plugin:list

    Discovered plugins and their status

  • php artisan plugin:enable my-feature

    Enable (also creates tables)

  • php artisan plugin:install plugin-my-feature.zip --enable

    Install a distribution zip and enable it

  • ./scripts/package.sh --plugin my-feature

    Build a distribution zip

Plugin structure
laravel/plugins/my-feature/
├── plugin.json          # id, name, version, required core
├── src/Plugin.php       # registers admin, API, MCP and jobs
├── routes/              # admin.php / api.php / mcp.php
└── database/migrations/

frontend/src/plugins/my-feature/
├── plugin.ts            # nav, footer, analytics rules
├── plugin.server.ts     # slots, sections, sitemap
└── routes/default/      # pages added to the site

Data is kept when you disable a plugin (just like WordPress). Pages from disabled plugins are left out of the build.