Getting Started
This page is for someone who has never built a panel extension before.
What is an extension here?
In this project, an extension is a package that can add:
- Frontend Routes
- Frontend Content
- Backend Routes
- Artisan Commands
- Scheduler Jobs
- Boot-time PHP Hooks
Each extension is identified by a unique ID and described by extension.json.
Creating an Extension
Run php artisan d:extensions:init inside your panel directory (/var/www/reviactyl by default) to create the basic files for your new extension. This will create the extension.json.
Alternatively, you can extend Reviactyl's Example Extension at reviactyl-community/example-extension.
Basic Extension Structure
A practical extension root looks like this:
my-extension/
├── extension.json
├── backend/
│ ├── routes/
│ │ ├── client.php
│ │ ├── admin.php
│ │ ├── api.php
│ │ └── web.php
│ └── hooks/
│ └── boot.php
├── frontend/
│ ├── src/
│ │ ├── index.tsx
│ │ └── pages/
│ │ └── DashboardPage.tsx
│ └── dist/
│ └── (compiled)
├── public/
│ └── images/
├── private/
├── data/
└── cache/extension.json
| Field | Required | Description |
|---|---|---|
id | Yes | Identifier for the extension. Must follow slug format (letters, numbers, _, -). |
name | Yes | Human-readable name of the extension. |
version | Yes | Current version of the extension (eg, 0.1.0). |
description | No | Short description of what the extension does. |
author | No | Name of the extension author. |
website | No | URL to the extension’s website or documentation. |
update_url | No | URL used to check for updates (can be null). |
api_version | Yes | API version the extension is built for. Must be a supported value. |
target_version | No | Target panel version the extension is compatible with. |
Build Frontend files
If you keep source in frontend/src, compile to frontend/dist:
php artisan d:extensions:watch my-extension --onceOr watch continuously while developing:
php artisan d:extensions:watch my-extensionCompiling Extensions
Package your extension:
php artisan d:extensions:compileLocal Development (symlink flow)
For local development without repeated packaging:
php artisan d:extensions:dev my-extension --enableThis command links:
extensions/<id>-> your source directorypublic/extensions/<id>/frontend-> your sourcefrontenddirectory (if present)
Use unlink when done:
php artisan d:extensions:dev my-extension --unlinkVerify extension state
Useful commands:
php artisan extensions:list
php artisan extensions:info my-extension
php artisan extensions:disable my-extension
php artisan extensions:enable my-extensionNewbie checklist before blaming the system
extension.jsonexists at package root.api_versionincludesRCYL_v26.- frontend modules referenced in manifest actually exist.
- module paths in manifest point to JS files (
frontend/dist/*.js) for runtime loading. - extension is enabled.
- no path traversal (
../) in package content.

