PHPackages                             notur/notur - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. notur/notur

ActiveLibrary[Framework](/categories/framework)

notur/notur
===========

Extension framework for Pterodactyl Panel v1

v1.5.1(1mo ago)045[1 issues](https://github.com/sak0a/notur/issues)[2 PRs](https://github.com/sak0a/notur/pulls)MITPHPPHP ^8.2CI passing

Since Feb 3Pushed 1mo agoCompare

[ Source](https://github.com/sak0a/notur)[ Packagist](https://packagist.org/packages/notur/notur)[ Docs](https://github.com/sak0a/notur)[ RSS](/packages/notur-notur/feed)WikiDiscussions master Synced 3w ago

READMEChangelog (10)Dependencies (22)Versions (42)Used By (0)

 [![Notur](notur-logo.png)](notur-logo.png)

Notur Extension Library
=======================

[](#notur-extension-library)

[![Version](https://camo.githubusercontent.com/f4635dcae61f51b68479cdf5684a12c7756e80d0a64813aebfd3ef486180a667/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f76657273696f6e2d312e342e372d626c7565)](https://camo.githubusercontent.com/f4635dcae61f51b68479cdf5684a12c7756e80d0a64813aebfd3ef486180a667/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f76657273696f6e2d312e342e372d626c7565)[![Status](https://camo.githubusercontent.com/f3adeea933a64c2014c89092040b8c02f4931f3f5a5d46a189133d4ac21d0ebf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7374617475732d737461626c652d627269676874677265656e)](https://camo.githubusercontent.com/f3adeea933a64c2014c89092040b8c02f4931f3f5a5d46a189133d4ac21d0ebf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7374617475732d737461626c652d627269676874677265656e)

A standalone extension framework for [Pterodactyl Panel](https://pterodactyl.io/) v1. Enables community-built extensions (plugins, themes, tools) that modify panel functionality without forking the source.

Key Features
------------

[](#key-features)

- **No per-extension rebuilds** — extensions ship pre-built JS bundles loaded at runtime
- **Clean architecture** — no sed-based injection or file patching per extension
- **One-time install** — patches React files + rebuilds once during Notur setup
- **Full lifecycle management** — install, enable, disable, update, remove via artisan
- **Interactive CLI** — beautiful terminal UI with search, wizards, and status dashboard
- **Frontend slot system** — React portal-based rendering into predefined panel locations
- **Manifest-only frontend extensions** — UI-only extensions do not need a PHP entrypoint
- **Developer SDK CLI** — scaffold, sync, validate, doctor, package, and push extensions locally
- **Remote packaged push** — push trusted local builds to a Notur-enabled panel using API keys
- **Scoped namespacing** — routes, permissions, migrations, and config are all extension-scoped
- **Registry support** — GitHub-backed extension registry with optional Ed25519 signatures

Requirements
------------

[](#requirements)

- Pterodactyl Panel v1.12+
- PHP 8.2+
- Node.js 22+ (matches panel requirement)
- Composer 2.x
- Package manager: npm, Yarn, pnpm, or Bun

Example Extensions
------------------

[](#example-extensions)

- `examples/hello-world` -- minimal starter.
- `examples/full-extension` -- full-stack reference (backend routes, admin view, migration, frontend slot/route, tests).

Roadmap (Next)
--------------

[](#roadmap-next)

Near-term focus areas:

- Frontend test coverage expansion (SlotRenderWhen, CssVariables, ThemeProvider)
- Command integration tests (AddCommand, BuildCommand)
- Extension dev hot-reload (file-watcher + auto-rebuild)
- Pelican Panel compatibility investigation

See `ROADMAP.md` for the full backlog.

Installation (into a Pterodactyl Panel)
---------------------------------------

[](#installation-into-a-pterodactyl-panel)

```
# Option 1: Automated installer
curl -sSL https://docs.notur.site/install.sh | bash -s -- /path/to/pterodactyl

# Option 2: Manual
cd /path/to/pterodactyl
composer require notur/notur
php artisan migrate
# Then apply patches and rebuild frontend (see https://docs.notur.site/getting-started/installing)
```

Development Setup (working on Notur itself)
-------------------------------------------

[](#development-setup-working-on-notur-itself)

```
# Install PHP dependencies
composer install

# Install frontend dependencies (using npm, yarn, pnpm, or bun)
npm install

# Build the bridge runtime
npm run build:bridge

# Build the SDK
npm run build:sdk

# Run PHP tests
./vendor/bin/phpunit

# Run frontend tests
npm run test:frontend
```

Docker E2E
----------

[](#docker-e2e)

The repo ships with a real browser-backed E2E environment built on the existing Docker panel setup. It boots a Pterodactyl panel, installs the current Notur checkout into that panel, seeds a deterministic root admin, and runs the shell and Playwright suites against the same environment.

```
# Build the reusable E2E base image once.
# This is the slow dependency layer with OS packages, Node, Composer, Pterodactyl, and browser libraries.
bash docker/e2e/build-base.sh

# Run the full shell + browser E2E suite
bash docker/e2e/run-e2e.sh

# Run only the browser suite
bash docker/e2e/run-e2e.sh --suite browser

# Run the destructive Notur install/uninstall lifecycle suite
# This checks the panel before install, installs Notur, uninstalls Notur, and checks the panel again.
bash docker/e2e/run-e2e.sh --suite install-uninstall

# Keep containers running for inspection after the suite finishes
bash docker/e2e/run-e2e.sh --keep

# Force a fully fresh rebuild when debugging Docker image state
bash docker/e2e/run-e2e.sh --no-cache --rebuild-base
```

The reusable local base image is named `notur/e2e-base:php8.2-node22-panel1.12.2`. It contains the slow-moving E2E dependencies: PHP extensions, system packages, Node.js, Bun, Composer, the Pterodactyl panel tarball, and browser runtime libraries. Normal runs reuse it and only rebuild the lightweight repo-specific layers. If the base image is missing, `run-e2e.sh` fails with instructions instead of silently downloading all packages again.

GitHub Actions uses the published GHCR base image `ghcr.io/sak0a/notur-e2e-base:php8.2-node22-panel1.12.2` instead of rebuilding that slow layer on every PR. Publish or refresh it manually from the `Publish E2E Base Image` workflow after changing `docker/e2e/Dockerfile.base` or the PHP/Node/panel version tuple. The normal E2E workflow fails fast if the published base image is missing.

The default `all` suite runs the shell and browser E2E suites against a bootstrapped Notur panel. The `install-uninstall` suite is intentionally explicit because it destructively removes Notur from the panel while verifying that the underlying Pterodactyl installation remains usable.

Seeded admin credentials inside the E2E environment:

```
Email: admin@example.com
Password: notur-admin-password

```

The browser specs live in `tests/E2E/browser/` and can also be invoked directly against an already running E2E panel with:

```
npm run test:e2e:browser
```

Architecture
------------

[](#architecture)

```
Panel Request
    └─> Laravel boots NoturServiceProvider
        └─> ExtensionManager discovers enabled extensions
            └─> Loads in dependency order (topological sort)
            └─> Registers routes, middleware, events, views, commands
            └─> Collects frontend slot data

Panel Response (HTML)
    └─> wrapper.blade.php includes notur::scripts
        └─> Outputs window.__NOTUR__ config JSON
        └─> Loads bridge.js (PluginRegistry + SlotRenderer)
        └─> Loads each extension's JS bundle
            └─> Extensions register components into slots
            └─> Bridge renders via React portals into

```

Remote development push
-----------------------

[](#remote-development-push)

Panel admins manage remote-push API keys at **Admin → Notur → Developer Push**. Developers use those keys with `npm run push` to install extensions on a running panel without going through the registry. See [`docs/remote-push.md`](docs/remote-push.md) for the full workflow.

Extension Lifecycle
-------------------

[](#extension-lifecycle)

```
php artisan notur:add acme/server-analytics   # Install from registry
php artisan notur:enable acme/server-analytics     # Enable
php artisan notur:disable acme/server-analytics    # Disable
php artisan notur:remove acme/server-analytics     # Uninstall + rollback migrations
php artisan notur:list                             # Show all installed
php artisan notur:update                           # Check for updates
php artisan notur:status                           # System status dashboard
```

Project Structure
-----------------

[](#project-structure)

DirectoryContents`src/`PHP runtime — Laravel service provider, extension manager, models, commands`bridge/`Frontend bridge runtime — PluginRegistry, SlotRenderer, hooks, theme`sdk/`Extension developer SDK — createExtension factory, types, scaffolding`installer/`Installer script + React patches for Pterodactyl`registry/`JSON schemas + registry build tools`database/migrations/`4 tables: `notur_extensions`, `notur_migrations`, `notur_settings`, `notur_activity_logs``tests/`Unit, integration, and frontend testsCreating an Extension
---------------------

[](#creating-an-extension)

See the [Extension Development Guide](https://docs.notur.site/extensions/guide) for the full guide.

Frontend-only quick start:

```
npx notur-create acme/red-button --preset frontend --slot server.header
cd red-button
npm install
npm run build
npx notur-validate
npx notur-pack
```

Panel-side scaffold is also available:

```
php artisan notur:new acme/server-analytics
```

### Preset Definitions

[](#preset-definitions)

- `standard`: frontend + API routes (default)
- `backend`: API routes only
- `full`: frontend + API routes + admin UI + migrations + tests
- `minimal`: backend-only scaffolding with no routes or frontend

Frontend-only extensions are manifest-only by default. Add a PHP entrypoint only when the extension needs backend routes, migrations, commands, events, admin views, or custom boot logic.

Useful local SDK commands:

```
npx notur-sync      # Sync package/build metadata from extension.yaml
npx notur-validate  # Validate manifest, package drift, bundle paths, and slots
npx notur-doctor    # Diagnose local and remote push setup
npx notur-push      # Package and upload to a remote Notur panel
```

License
-------

[](#license)

MIT

###  Health Score

45

—

FairBetter than 91% of packages

Maintenance90

Actively maintained with recent releases

Popularity10

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 81.7% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~3 days

Total

27

Last Release

49d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/6eb8813190badfdce116ca21069b102b9ef3ab3ce1092edf028c0260230df152?d=identicon)[sak0a](/maintainers/sak0a)

---

Top Contributors

[![sak0a](https://avatars.githubusercontent.com/u/24781653?v=4)](https://github.com/sak0a "sak0a (215 commits)")[![claude](https://avatars.githubusercontent.com/u/81847?v=4)](https://github.com/claude "claude (27 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (14 commits)")[![Copilot](https://avatars.githubusercontent.com/in/1143301?v=4)](https://github.com/Copilot "Copilot (7 commits)")

---

Tags

laravelextensionspluginspanelpterodactyl

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/notur-notur/health.svg)

```
[![Health](https://phpackages.com/badges/notur-notur/health.svg)](https://phpackages.com/packages/notur-notur)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.1M337](/packages/psalm-plugin-laravel)[laravel/pulse

Laravel Pulse is a real-time application performance monitoring tool and dashboard for your Laravel application.

1.7k14.1M122](/packages/laravel-pulse)[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9742.3M121](/packages/roots-acorn)[laravel/cashier

Laravel Cashier provides an expressive, fluent interface to Stripe's subscription billing services.

2.5k28.4M137](/packages/laravel-cashier)[spatie/laravel-health

Monitor the health of a Laravel application

87411.3M153](/packages/spatie-laravel-health)[laravel/cashier-paddle

Cashier Paddle provides an expressive, fluent interface to Paddle's subscription billing services.

267880.7k3](/packages/laravel-cashier-paddle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
