Changelog
All notable changes to the Notur Extension Library are documented here.
[Unreleased] - Phase 5 (In Progress)
Added
- E2E test suite -- Docker-based end-to-end testing with Pterodactyl Panel, MySQL, and the hello-world extension. Covers install, enable, routes, disable, and remove lifecycle. (
docker/e2e/,tests/E2E/,.github/workflows/e2e.yml) - Compatibility matrix testing -- CI now tests PHP 8.2/8.3 with both MySQL 8.0 and MariaDB 10.6, and frontend builds on Node 18, 20, and 22. Unit tests run separately from integration tests to enable proper DB-dependent testing.
- Documentation site -- Comprehensive documentation for administrators (
docs/ADMIN-GUIDE.md), PHP API reference (docs/API-REFERENCE.md), frontend SDK reference (docs/FRONTEND-SDK.md), registry documentation (docs/REGISTRY.md), and this changelog.
Not Yet Implemented
- Signature verification (Ed25519 on
.noturarchives) - Admin Blade UI (extension management page)
- Theme extensions (full theme override support)
Phase 4: Registry + Distribution
Added
RegistryClient-- Fetch extension metadata from the GitHub-backed registry. Supports search by ID, name, description, and tags. Includes local caching with configurable TTL.notur:registry:synccommand -- Sync the remote registry index to a local cache. Supports--searchfor inline queries and--forceto bypass cache TTL..noturarchive format -- Extensions are packaged as gzipped tar archives with SHA-256 checksums and optional Ed25519 signatures.notur:exportcommand -- Package an extension directory into a.noturarchive with checksum generation. Supports--signfor signature creation and--outputfor custom output paths.- Registry index builder --
registry/tools/build-index.phpgeneratesregistry.jsonfrom local directories or GitHub repositories. - JSON schema validation -- Shipped schemas for
extension.yamlmanifests (registry/schema/extension-manifest.schema.json) and the registry index (registry/schema/registry-index.schema.json).
Phase 3: Frontend Slots + SDK
Added
- All slot renderers -- Nine predefined slots wired up:
navbar,server.subnav,server.page,server.terminal.buttons,server.files.actions,dashboard.widgets,dashboard.page,account.page,account.subnav. - Additional React patches --
ServerRouter.tsxfor server subnav/page slots, terminal button and file manager toolbar slots. - Bridge hooks --
useSlot(slotId)for reactive slot subscriptions,useExtensionApi({ extensionId })for scoped HTTP client with CSRF handling,useExtensionState(extensionId, initialState)for shared cross-component state. - Theme system -- CSS custom property extraction from the live Pterodactyl DOM. Three-strategy approach: mapped
--ptero-*variables, computed style probes on known elements, and stylesheet scanning.ThemeProviderwiring with 23 default CSS custom properties. notur:newcommand -- Scaffold new extensions from templates. Generatesextension.yaml, PHP entrypoint, route file, frontend entry, and webpack config.- SDK webpack config -- Base webpack configuration for extension builds. Externalizes React/ReactDOM, configures TypeScript, outputs UMD bundles.
- SDK type exports -- Published
@notur/sdkTypeScript types:ExtensionConfig,SlotConfig,RouteConfig,ExtensionDefinition,NoturApi. - SDK hooks --
useServerContext(),useUserContext(),usePermission()for accessing Pterodactyl panel context from extension components.
Phase 2: CLI + Extension Lifecycle
Added
notur:uninstallcommand -- Complete framework removal: restores patched files, rolls back migrations, removes Blade injection, deletes directories, removes Composer package, triggers frontend rebuild.- Reverse patches -- Shipped reverse
.patchfiles for each React patch to enable clean uninstallation without relying on backup copies. notur:installcommand -- Install extensions from the registry (by ID) or from local.noturarchive files. Supports--forcefor reinstallation and--no-migrateto skip migrations.notur:removecommand -- Remove an installed extension: disables it, rolls back its migrations (unless--keep-data), deletes files, and updates the manifest.notur:enable/notur:disablecommands -- Toggle extensions on/off without removing files or data. DispatchesExtensionEnabled/ExtensionDisabledevents and clears the cache.notur:updatecommand -- Check for and install extension updates from the registry. Supports--checkfor dry-run mode and updating individual or all extensions.MigrationManagerintegration testing -- Per-extension migration tracking via thenotur_migrationstable. Verified migrate/rollback against real database.PermissionBrokerenforcement -- Middleware-level permission checks on extension routes based on the permissions declared inextension.yaml.
Phase 1: Core Architecture
Added
NoturServiceProvider-- Laravel service provider: loads config, registers migrations/views/routes, registers artisan commands, boots theExtensionManager.ExtensionManager-- Core extension lifecycle: readsextensions.json, loads manifests, resolves dependencies via topological sort (DependencyResolver), registers PSR-4 autoloading, boots extensions.- Extension contracts -- Eight PHP interfaces:
ExtensionInterface,HasRoutes,HasMigrations,HasCommands,HasMiddleware,HasEventListeners,HasBladeViews,HasFrontendSlots. - Database schema -- Three tables:
notur_extensions(installed extensions),notur_migrations(per-extension migration tracking),notur_settings(key-value settings). - Installer --
installer/install.shscript for automated Notur setup. Validates prerequisites, installs via Composer, applies 4 React patches, injects Blade include, runs migrations, builds bridge. - React patches -- Four patches for Pterodactyl v1.11:
routes.ts(dynamic route merging),ServerRouter.tsx(server slots),DashboardRouter.tsx(dashboard slots),NavigationBar.tsx(navbar slot). - Bridge runtime -- TypeScript bridge (
bridge/src/):PluginRegistry,SlotRenderer(React portal-based), event system, and globalwindow.__NOTUR__API. - Hello-world example -- Minimal reference extension (
examples/hello-world/) demonstrating PHP entrypoint, API routes, frontend bundle, and slot registration. - CI pipeline -- GitHub Actions workflow for PHP tests (8.2/8.3), frontend builds, and patch validation.
notur:listcommand -- List installed extensions with status table.notur:devcommand -- Symlink-based development mode for local extension testing.notur:buildcommand -- Build extension frontend assets.- Scoped namespacing -- Routes, permissions, migrations, config, and frontend bundles are all namespaced per-extension to prevent collisions.