From 677d2f742c5704c0d954eeff10b13d91ad8486de Mon Sep 17 00:00:00 2001 From: "Michael (Parker) Parker" Date: Wed, 18 Feb 2026 14:40:46 -0500 Subject: [PATCH 1/9] docker env fixes (#2234) Co-authored-by: Charles Co-authored-by: Boy132 --- Dockerfile | 3 +- Dockerfile.dev | 3 +- docker/Caddyfile | 6 ++-- docker/entrypoint.sh | 73 +++++++++++++++++++++++++++++--------------- 4 files changed, 53 insertions(+), 32 deletions(-) diff --git a/Dockerfile b/Dockerfile index eb509a45d..f0af8aa5a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -69,8 +69,7 @@ RUN apk add --no-cache \ zip unzip 7zip bzip2-dev yarn git # Copy composer binary for runtime plugin dependency management -COPY --from=composer /usr/local/bin/composer /usr/local/bin/composer - +COPY --from=composer /usr/local/bin/composer /usr/local/bin/composer COPY --chown=root:www-data --chmod=770 --from=composerbuild /build . COPY --chown=root:www-data --chmod=770 --from=yarnbuild /build/public ./public diff --git a/Dockerfile.dev b/Dockerfile.dev index 99a5aea9c..ca8a1b5a6 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -74,8 +74,7 @@ RUN apk add --no-cache \ zip unzip 7zip bzip2-dev yarn git # Copy composer binary for runtime plugin dependency management -COPY --from=composer /usr/local/bin/composer /usr/local/bin/composer - +COPY --from=composer /usr/local/bin/composer /usr/local/bin/composer COPY --chown=root:www-data --chmod=770 --from=composerbuild /build . COPY --chown=root:www-data --chmod=770 --from=yarnbuild /build/public ./public diff --git a/docker/Caddyfile b/docker/Caddyfile index 399fe84f1..48c6d8e88 100644 --- a/docker/Caddyfile +++ b/docker/Caddyfile @@ -5,11 +5,11 @@ {$CADDY_STRICT_PROXIES} } admin off - {$PARSED_AUTO_HTTPS} - {$PARSED_LE_EMAIL} + {$CADDY_AUTO_HTTPS} + {$CADDY_LE_EMAIL} } -{$PARSED_APP_URL} { +{$CADDY_APP_URL} { root * /var/www/html/public encode gzip diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 5945f2700..f69d737a6 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -1,34 +1,48 @@ #!/bin/ash -e +# shellcheck shell=dash + # check for .env file or symlink and generate app keys if missing -if [ -f /var/www/html/.env ]; then - echo "external vars exist." +if [ -f /pelican-data/.env ]; then + echo ".env vars exist." # load specific env vars from .env used in the entrypoint and they are not already set - for VAR in "APP_KEY" "APP_INSTALLED" "DB_CONNECTION" "DB_HOST" "DB_PORT"; do if ! (printenv | grep -q ${VAR}); then export $(grep ${VAR} .env | grep -ve "^#"); fi; done + for VAR in "APP_KEY" "APP_INSTALLED" "DB_CONNECTION" "DB_HOST" "DB_PORT"; do + echo "checking for ${VAR}" + ## skip if it looks like it might try to execute code + if (grep "${VAR}" .env | grep -qE "\$\(|=\`|\$#"); then echo "var in .env may be executable or a comment, skipping"; continue; fi + # if the variable is in .env then set it + if (grep -q "${VAR}" .env); then + echo "loading ${VAR} from .env" + export "$(grep "${VAR}" .env | sed 's/"//g')" + continue + fi + ## variable wasn't loaded or in the env to set + echo "didn't find variable to set" + done else - echo "external vars don't exist." + echo ".env vars don't exist." # webroot .env is symlinked to this path touch /pelican-data/.env # manually generate a key because key generate --force fails - if [ -z ${APP_KEY} ]; then - echo -e "Generating key." + if [ -z "${APP_KEY}" ]; then + echo "No key set, Generating key." APP_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1) - echo -e "Generated app key: $APP_KEY" - echo -e "APP_KEY=$APP_KEY" > /pelican-data/.env + echo "APP_KEY=$APP_KEY" > /pelican-data/.env + echo "Generated app key written to .env file" else - echo -e "APP_KEY exists in environment, using that." - echo -e "APP_KEY=$APP_KEY" > /pelican-data/.env + echo "APP_KEY exists in environment, using that." + echo "APP_KEY=$APP_KEY" > /pelican-data/.env fi # enable installer - echo -e "APP_INSTALLED=false" >> /pelican-data/.env + echo "APP_INSTALLED=false" >> /pelican-data/.env fi # create directories for volumes mkdir -p /pelican-data/database /pelican-data/storage/avatars /pelican-data/storage/fonts /pelican-data/storage/icons /pelican-data/plugins /var/www/html/storage/logs/supervisord 2>/dev/null # if the app is installed then we need to run migrations on start. New installs will run migrations when you run the installer. -if [ "${APP_INSTALLED}" == "true" ]; then +if [ "${APP_INSTALLED}" = "true" ]; then #if the db is anything but sqlite wait until it's accepting connections if [ "${DB_CONNECTION}" != "sqlite" ]; then # check for DB up before starting the panel @@ -39,36 +53,44 @@ if [ "${APP_INSTALLED}" == "true" ]; then # wait for 1 seconds before check again sleep 1 done + else + echo "using sqlite database" fi + # run migration php artisan migrate --force fi -echo -e "Optimizing Filament" +echo "Optimizing Filament" php artisan filament:optimize # default to caddy not starting export SUPERVISORD_CADDY=false -export PARSED_APP_URL=${APP_URL} +export CADDY_APP_URL="${APP_URL}" -# checking if app url is using https -if echo "${APP_URL}" | grep -qE '^https://'; then +# checking if app url is https +if (echo "${APP_URL}" | grep -qE '^https://'); then + # check lets encrypt email was set without a proxy + if [ -z "${LE_EMAIL}" ] && [ "${BEHIND_PROXY}" != "true" ]; then + echo "when app url is https a lets encrypt email must be set when not behind a proxy" + exit 1 + fi echo "https domain found setting email var" - export PARSED_LE_EMAIL="email ${LE_EMAIL}" + export CADDY_LE_EMAIL="email ${LE_EMAIL}" fi # when running behind a proxy -if [ "${BEHIND_PROXY}" == "true" ]; then +if [ "${BEHIND_PROXY}" = "true" ]; then echo "running behind proxy" echo "listening on port 80 internally" - export PARSED_LE_EMAIL="" - export PARSED_APP_URL=":80" - export PARSED_AUTO_HTTPS="auto_https off" - export ASSET_URL=${APP_URL} + export CADDY_LE_EMAIL="" + export CADDY_APP_URL=":80" + export CADDY_AUTO_HTTPS="auto_https off" + export ASSET_URL="${APP_URL}" fi # disable caddy if SKIP_CADDY is set -if [ "${SKIP_CADDY:-}" == "true" ]; then +if [ "${SKIP_CADDY:-}" = "true" ]; then echo "Starting PHP-FPM only" else echo "Starting PHP-FPM and Caddy" @@ -76,8 +98,9 @@ else export SUPERVISORD_CADDY=true # handle trusted proxies for caddy when variable has data - if [ ! -z ${TRUSTED_PROXIES} ]; then - export CADDY_TRUSTED_PROXIES=$(echo "trusted_proxies static ${TRUSTED_PROXIES}" | sed 's/,/ /g') + if [ -n "${TRUSTED_PROXIES:-}" ]; then + FORMATTED_PROXIES=$(echo "trusted_proxies static ${TRUSTED_PROXIES}" | sed 's/,/ /g') + export CADDY_TRUSTED_PROXIES="${FORMATTED_PROXIES}" export CADDY_STRICT_PROXIES="trusted_proxies_strict" fi fi From 1bbbcd0e25d65890ead73e25b219bf6353d57450 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 18 Feb 2026 16:30:24 -0500 Subject: [PATCH 2/9] Update server/egg icon url supported file types (#2249) --- .../Admin/Resources/Eggs/Pages/EditEgg.php | 14 ++++++++------ .../Resources/Servers/Pages/EditServer.php | 17 ++++++++++------- app/Filament/Server/Pages/Settings.php | 16 +++++++++------- lang/en/admin/egg.php | 1 + 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/app/Filament/Admin/Resources/Eggs/Pages/EditEgg.php b/app/Filament/Admin/Resources/Eggs/Pages/EditEgg.php index 61cdddf0e..5fec9f225 100644 --- a/app/Filament/Admin/Resources/Eggs/Pages/EditEgg.php +++ b/app/Filament/Admin/Resources/Eggs/Pages/EditEgg.php @@ -485,18 +485,20 @@ class EditEgg extends EditRecord ], ]); + $normalizedExtension = match ($extension) { + 'svg+xml', 'svg' => 'svg', + 'jpeg', 'jpg' => 'jpg', + 'png' => 'png', + 'webp' => 'webp', + default => throw new Exception(trans('admin/egg.import.unknown_extension')), + }; + $data = @file_get_contents($imageUrl, false, $context, 0, 1048576); // 1024KB if (empty($data)) { throw new Exception(trans('admin/egg.import.invalid_url')); } - $normalizedExtension = match ($extension) { - 'svg+xml' => 'svg', - 'jpeg' => 'jpg', - default => $extension, - }; - Storage::disk('public')->put(Egg::ICON_STORAGE_PATH . "/$egg->uuid.$normalizedExtension", $data); } diff --git a/app/Filament/Admin/Resources/Servers/Pages/EditServer.php b/app/Filament/Admin/Resources/Servers/Pages/EditServer.php index 9b8eac165..4ff388380 100644 --- a/app/Filament/Admin/Resources/Servers/Pages/EditServer.php +++ b/app/Filament/Admin/Resources/Servers/Pages/EditServer.php @@ -121,6 +121,7 @@ class EditServer extends EditRecord ->columnSpan(2) ->alignJustify(), Action::make('uploadIcon') + ->hiddenLabel() ->icon(TablerIcon::PhotoUp) ->tooltip(trans('admin/server.import_image')) ->modal() @@ -1218,18 +1219,20 @@ class EditServer extends EditRecord ], ]); + $normalizedExtension = match ($extension) { + 'svg+xml', 'svg' => 'svg', + 'jpeg', 'jpg' => 'jpg', + 'png' => 'png', + 'webp' => 'webp', + default => throw new Exception(trans('admin/egg.import.unknown_extension')), + }; + $data = @file_get_contents($imageUrl, false, $context, 0, 262144); //256KB if (empty($data)) { - throw new \Exception(trans('admin/egg.import.invalid_url')); + throw new Exception(trans('admin/egg.import.invalid_url')); } - $normalizedExtension = match ($extension) { - 'svg+xml' => 'svg', - 'jpeg' => 'jpg', - default => $extension, - }; - Storage::disk('public')->put(Server::ICON_STORAGE_PATH . "/$server->uuid.$normalizedExtension", $data); } } diff --git a/app/Filament/Server/Pages/Settings.php b/app/Filament/Server/Pages/Settings.php index 86d845f05..9e59f2e8e 100644 --- a/app/Filament/Server/Pages/Settings.php +++ b/app/Filament/Server/Pages/Settings.php @@ -462,18 +462,20 @@ class Settings extends ServerFormPage ], ]); + $normalizedExtension = match ($extension) { + 'svg+xml', 'svg' => 'svg', + 'jpeg', 'jpg' => 'jpg', + 'png' => 'png', + 'webp' => 'webp', + default => throw new Exception(trans('admin/egg.import.unknown_extension')), + }; + $data = @file_get_contents($imageUrl, false, $context, 0, 262144); //256KB if (empty($data)) { - throw new \Exception(trans('admin/egg.import.invalid_url')); + throw new Exception(trans('admin/egg.import.invalid_url')); } - $normalizedExtension = match ($extension) { - 'svg+xml' => 'svg', - 'jpeg' => 'jpg', - default => $extension, - }; - Storage::disk('public')->put(Server::ICON_STORAGE_PATH . "/$server->uuid.$normalizedExtension", $data); } diff --git a/lang/en/admin/egg.php b/lang/en/admin/egg.php index 2632d3836..db5d69d51 100644 --- a/lang/en/admin/egg.php +++ b/lang/en/admin/egg.php @@ -31,6 +31,7 @@ return [ 'no_local_ip' => 'Local IP Addresses are not allowed', 'unsupported_format' => 'Unsupported Format. Supported Formats: :formats', 'invalid_url' => 'The provided URL is invalid', + 'unknown_extension' => 'Unknown image extension', 'image_deleted' => 'Image Deleted', 'no_image' => 'No Image Provided', 'image_updated' => 'Image Updated', From dead664e4d0dc325de7e3512a18e545561c41d99 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Thu, 19 Feb 2026 14:57:19 +0100 Subject: [PATCH 3/9] Make plugin id in artisan commands also case insensitive (#2252) --- .../Commands/Plugin/DisablePluginCommand.php | 2 +- .../Commands/Plugin/InstallPluginCommand.php | 2 +- .../Commands/Plugin/UninstallPluginCommand.php | 2 +- .../Commands/Plugin/UpdatePluginCommand.php | 2 +- app/Services/Helpers/PluginService.php | 17 +++++++++-------- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/Console/Commands/Plugin/DisablePluginCommand.php b/app/Console/Commands/Plugin/DisablePluginCommand.php index 3aef3aecc..5d6684ad2 100644 --- a/app/Console/Commands/Plugin/DisablePluginCommand.php +++ b/app/Console/Commands/Plugin/DisablePluginCommand.php @@ -16,7 +16,7 @@ class DisablePluginCommand extends Command { $id = $this->argument('id') ?? $this->choice('Plugin', Plugin::pluck('name', 'id')->toArray()); - $plugin = Plugin::find($id); + $plugin = Plugin::find(str($id)->lower()->toString()); if (!$plugin) { $this->error('Plugin does not exist!'); diff --git a/app/Console/Commands/Plugin/InstallPluginCommand.php b/app/Console/Commands/Plugin/InstallPluginCommand.php index 1e6a8efdd..67b3ccacb 100644 --- a/app/Console/Commands/Plugin/InstallPluginCommand.php +++ b/app/Console/Commands/Plugin/InstallPluginCommand.php @@ -18,7 +18,7 @@ class InstallPluginCommand extends Command { $id = $this->argument('id') ?? $this->choice('Plugin', Plugin::pluck('name', 'id')->toArray()); - $plugin = Plugin::find($id); + $plugin = Plugin::find(str($id)->lower()->toString()); if (!$plugin) { $this->error('Plugin does not exist!'); diff --git a/app/Console/Commands/Plugin/UninstallPluginCommand.php b/app/Console/Commands/Plugin/UninstallPluginCommand.php index 0463ec57b..66c1a3427 100644 --- a/app/Console/Commands/Plugin/UninstallPluginCommand.php +++ b/app/Console/Commands/Plugin/UninstallPluginCommand.php @@ -18,7 +18,7 @@ class UninstallPluginCommand extends Command { $id = $this->argument('id') ?? $this->choice('Plugin', Plugin::pluck('name', 'id')->toArray()); - $plugin = Plugin::find($id); + $plugin = Plugin::find(str($id)->lower()->toString()); if (!$plugin) { $this->error('Plugin does not exist!'); diff --git a/app/Console/Commands/Plugin/UpdatePluginCommand.php b/app/Console/Commands/Plugin/UpdatePluginCommand.php index b12244c84..75dc8208f 100644 --- a/app/Console/Commands/Plugin/UpdatePluginCommand.php +++ b/app/Console/Commands/Plugin/UpdatePluginCommand.php @@ -17,7 +17,7 @@ class UpdatePluginCommand extends Command { $id = $this->argument('id') ?? $this->choice('Plugin', Plugin::pluck('name', 'id')->toArray()); - $plugin = Plugin::find($id); + $plugin = Plugin::find(str($id)->lower()->toString()); if (!$plugin) { $this->error('Plugin does not exist!'); diff --git a/app/Services/Helpers/PluginService.php b/app/Services/Helpers/PluginService.php index de364e49d..26ead4f6c 100644 --- a/app/Services/Helpers/PluginService.php +++ b/app/Services/Helpers/PluginService.php @@ -39,7 +39,7 @@ class PluginService /** @var ClassLoader $classLoader */ $classLoader = File::getRequire(base_path('vendor/autoload.php')); - $plugins = Plugin::query()->orderBy('load_order')->get(); + $plugins = Plugin::orderBy('load_order')->get(); foreach ($plugins as $plugin) { try { // Filter out plugins that are not compatible with the current panel version @@ -138,7 +138,7 @@ class PluginService return; } - $plugins = Plugin::query()->orderBy('load_order')->get(); + $plugins = Plugin::orderBy('load_order')->get(); foreach ($plugins as $plugin) { try { if (!$plugin->shouldLoad($panel->getId())) { @@ -172,7 +172,7 @@ class PluginService { $newPackages ??= []; - $plugins = Plugin::query()->orderBy('load_order')->get(); + $plugins = Plugin::orderBy('load_order')->get(); foreach ($plugins as $plugin) { if (!$plugin->composer_packages) { continue; @@ -434,7 +434,7 @@ class PluginService /** @param array $data */ private function setMetaData(string|Plugin $plugin, array $data): void { - $path = plugin_path($plugin instanceof Plugin ? $plugin->id : $plugin, 'plugin.json'); + $path = plugin_path($plugin->id, 'plugin.json'); if (File::exists($path)) { $pluginData = File::json($path, JSON_THROW_ON_ERROR); @@ -443,7 +443,6 @@ class PluginService File::put($path, json_encode($pluginData, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); - $plugin = $plugin instanceof Plugin ? $plugin : Plugin::findOrFail($plugin); $plugin->update($metaData); } } @@ -464,6 +463,8 @@ class PluginService public function updateLoadOrder(array $order): void { foreach ($order as $i => $plugin) { + $plugin = Plugin::firstOrFail(str($plugin)->lower()->toString()); + $this->setMetaData($plugin, [ 'load_order' => $i, ]); @@ -472,7 +473,7 @@ class PluginService public function hasThemePluginEnabled(): bool { - $plugins = Plugin::query()->orderBy('load_order')->get(); + $plugins = Plugin::orderBy('load_order')->get(); foreach ($plugins as $plugin) { if ($plugin->isTheme() && $plugin->status === PluginStatus::Enabled) { return true; @@ -487,7 +488,7 @@ class PluginService { $languages = []; - $plugins = Plugin::query()->orderBy('load_order')->get(); + $plugins = Plugin::orderBy('load_order')->get(); foreach ($plugins as $plugin) { if ($plugin->status !== PluginStatus::Enabled || !$plugin->isLanguage()) { continue; @@ -504,7 +505,7 @@ class PluginService return config('panel.plugin.dev_mode', false); } - private function handlePluginException(string|Plugin $plugin, Exception $exception): void + private function handlePluginException(Plugin $plugin, Exception $exception): void { if ($this->isDevModeActive()) { throw ($exception); From 01cfa31ee154100fd1c6e7732d18608d430693bd Mon Sep 17 00:00:00 2001 From: Boy132 Date: Thu, 19 Feb 2026 14:57:48 +0100 Subject: [PATCH 4/9] Limit activity logs on profile page (#2253) --- app/Filament/Pages/Auth/EditProfile.php | 6 +++--- lang/en/profile.php | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Filament/Pages/Auth/EditProfile.php b/app/Filament/Pages/Auth/EditProfile.php index 3a09dce19..1a261e045 100644 --- a/app/Filament/Pages/Auth/EditProfile.php +++ b/app/Filament/Pages/Auth/EditProfile.php @@ -426,13 +426,13 @@ class EditProfile extends BaseEditProfile ->label(trans('profile.tabs.activity')) ->icon(TablerIcon::History) ->schema([ - Repeater::make('activity') - ->hiddenLabel() + Repeater::make('activity') // TODO: move to a table + ->label(trans('profile.activity_info')) ->inlineLabel(false) ->deletable(false) ->addable(false) ->relationship(null, function (Builder $query) { - $query->orderBy('timestamp', 'desc'); + $query->orderBy('timestamp', 'desc')->limit(50); }) ->schema([ TextEntry::make('log') diff --git a/lang/en/profile.php b/lang/en/profile.php index db8df82d6..b6fd1d182 100644 --- a/lang/en/profile.php +++ b/lang/en/profile.php @@ -69,4 +69,5 @@ return [ 'no_oauth' => 'No Accounts Linked', 'no_api_keys' => 'No API Keys', 'no_ssh_keys' => 'No SSH Keys', + 'activity_info' => 'Showing last 50 activity logs', ]; From f76e864a3066581da4e046d5200a2f1ae8a33de1 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Sun, 22 Feb 2026 11:11:18 -0500 Subject: [PATCH 5/9] Laravel 12.52.0 Shift (#2247) Co-authored-by: Shift --- composer.json | 8 +-- composer.lock | 161 +++++++++++++++++++++++++------------------------- 2 files changed, 84 insertions(+), 85 deletions(-) diff --git a/composer.json b/composer.json index baee1f13c..ea4b7876e 100644 --- a/composer.json +++ b/composer.json @@ -13,11 +13,11 @@ "calebporzio/sushi": "^2.5", "dedoc/scramble": "^0.13", "filament/filament": "^4.5", - "gboquizosanchez/filament-log-viewer": "^2.1", + "gboquizosanchez/filament-log-viewer": "^2.2", "guzzlehttp/guzzle": "^7.10", - "laravel/framework": "^12.51", + "laravel/framework": "^12.52", "laravel/helpers": "^1.8", - "laravel/sanctum": "^4.2", + "laravel/sanctum": "^4.3", "laravel/socialite": "^5.24", "laravel/tinker": "^2.10.1", "laravel/ui": "^4.6", @@ -34,7 +34,7 @@ "socialiteproviders/steam": "^4.3", "spatie/laravel-data": "^4.19", "spatie/laravel-fractal": "^6.3", - "spatie/laravel-health": "^1.34", + "spatie/laravel-health": "^1.37", "spatie/laravel-permission": "^6.24", "spatie/laravel-query-builder": "^6.4", "spatie/temporary-directory": "^2.3", diff --git a/composer.lock b/composer.lock index 2e126e0a3..260045c05 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "00fbb895a8c1cb1953a9dcefe7918ed3", + "content-hash": "f6d587063490fa0aeb46b8f05dd30a22", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -128,16 +128,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.369.31", + "version": "3.369.36", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "c7bf53dfb09bea3ebfd19b89213625aa134dcc71" + "reference": "2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c7bf53dfb09bea3ebfd19b89213625aa134dcc71", - "reference": "c7bf53dfb09bea3ebfd19b89213625aa134dcc71", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0", + "reference": "2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0", "shasum": "" }, "require": { @@ -219,9 +219,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.369.31" + "source": "https://github.com/aws/aws-sdk-php/tree/3.369.36" }, - "time": "2026-02-10T19:13:30+00:00" + "time": "2026-02-17T19:45:01+00:00" }, { "name": "blade-ui-kit/blade-heroicons", @@ -822,16 +822,16 @@ }, { "name": "dedoc/scramble", - "version": "v0.13.12", + "version": "v0.13.14", "source": { "type": "git", "url": "https://github.com/dedoc/scramble.git", - "reference": "1788ab68ae51ae2fce34e16add1387ee1ac5d88b" + "reference": "8f0c1bba364e4916f3f2ff23b7f4ca002e586b75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dedoc/scramble/zipball/1788ab68ae51ae2fce34e16add1387ee1ac5d88b", - "reference": "1788ab68ae51ae2fce34e16add1387ee1ac5d88b", + "url": "https://api.github.com/repos/dedoc/scramble/zipball/8f0c1bba364e4916f3f2ff23b7f4ca002e586b75", + "reference": "8f0c1bba364e4916f3f2ff23b7f4ca002e586b75", "shasum": "" }, "require": { @@ -890,7 +890,7 @@ ], "support": { "issues": "https://github.com/dedoc/scramble/issues", - "source": "https://github.com/dedoc/scramble/tree/v0.13.12" + "source": "https://github.com/dedoc/scramble/tree/v0.13.14" }, "funding": [ { @@ -898,7 +898,7 @@ "type": "github" } ], - "time": "2026-02-05T07:47:09+00:00" + "time": "2026-02-15T13:14:31+00:00" }, { "name": "dflydev/dot-access-data", @@ -2544,16 +2544,16 @@ }, { "name": "laravel/framework", - "version": "v12.51.0", + "version": "v12.52.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16" + "reference": "d5511fa74f4608dbb99864198b1954042aa8d5a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/ce4de3feb211e47c4f959d309ccf8a2733b1bc16", - "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16", + "url": "https://api.github.com/repos/laravel/framework/zipball/d5511fa74f4608dbb99864198b1954042aa8d5a7", + "reference": "d5511fa74f4608dbb99864198b1954042aa8d5a7", "shasum": "" }, "require": { @@ -2762,7 +2762,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-02-10T18:20:19+00:00" + "time": "2026-02-17T17:07:04+00:00" }, { "name": "laravel/helpers", @@ -4877,16 +4877,16 @@ }, { "name": "nette/utils", - "version": "v4.1.2", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5" + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/f76b5dc3d6c6d3043c8d937df2698515b99cbaf5", - "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "shasum": "" }, "require": { @@ -4898,8 +4898,10 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", "nette/tester": "^2.5", - "phpstan/phpstan": "^2.0@stable", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -4960,9 +4962,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.2" + "source": "https://github.com/nette/utils/tree/v4.1.3" }, - "time": "2026-02-03T17:21:09+00:00" + "time": "2026-02-13T03:05:33+00:00" }, { "name": "nikic/php-parser", @@ -5024,31 +5026,31 @@ }, { "name": "nunomaduro/termwind", - "version": "v2.3.3", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017" + "reference": "712a31b768f5daea284c2169a7d227031001b9a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017", - "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8", "shasum": "" }, "require": { "ext-mbstring": "*", "php": "^8.2", - "symfony/console": "^7.3.6" + "symfony/console": "^7.4.4 || ^8.0.4" }, "require-dev": { - "illuminate/console": "^11.46.1", - "laravel/pint": "^1.25.1", + "illuminate/console": "^11.47.0", + "laravel/pint": "^1.27.1", "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2", "phpstan/phpstan": "^1.12.32", "phpstan/phpstan-strict-rules": "^1.6.2", - "symfony/var-dumper": "^7.3.5", + "symfony/var-dumper": "^7.3.5 || ^8.0.4", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -5080,7 +5082,7 @@ "email": "enunomaduro@gmail.com" } ], - "description": "Its like Tailwind CSS, but for the console.", + "description": "It's like Tailwind CSS, but for the console.", "keywords": [ "cli", "console", @@ -5091,7 +5093,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.3" + "source": "https://github.com/nunomaduro/termwind/tree/v2.4.0" }, "funding": [ { @@ -5107,7 +5109,7 @@ "type": "github" } ], - "time": "2025-11-20T02:34:59+00:00" + "time": "2026-02-16T23:10:27+00:00" }, { "name": "openspout/openspout", @@ -6526,16 +6528,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.19", + "version": "v0.12.20", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "a4f766e5c5b6773d8399711019bb7d90875a50ee" + "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/a4f766e5c5b6773d8399711019bb7d90875a50ee", - "reference": "a4f766e5c5b6773d8399711019bb7d90875a50ee", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/19678eb6b952a03b8a1d96ecee9edba518bb0373", + "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373", "shasum": "" }, "require": { @@ -6599,9 +6601,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.19" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.20" }, - "time": "2026-01-30T17:33:13+00:00" + "time": "2026-02-11T15:05:28+00:00" }, { "name": "ralouphie/getallheaders", @@ -7657,16 +7659,16 @@ }, { "name": "spatie/laravel-health", - "version": "1.36.0", + "version": "1.37.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-health.git", - "reference": "e2a84e886cb38ab0a53f136e4554c64e0480e634" + "reference": "2d3a68ae2f855d3997a85deb819898a4b7720d49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-health/zipball/e2a84e886cb38ab0a53f136e4554c64e0480e634", - "reference": "e2a84e886cb38ab0a53f136e4554c64e0480e634", + "url": "https://api.github.com/repos/spatie/laravel-health/zipball/2d3a68ae2f855d3997a85deb819898a4b7720d49", + "reference": "2d3a68ae2f855d3997a85deb819898a4b7720d49", "shasum": "" }, "require": { @@ -7738,7 +7740,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-health/tree/1.36.0" + "source": "https://github.com/spatie/laravel-health/tree/1.37.0" }, "funding": [ { @@ -7746,7 +7748,7 @@ "type": "github" } ], - "time": "2026-02-09T15:38:27+00:00" + "time": "2026-02-12T16:31:50+00:00" }, { "name": "spatie/laravel-package-tools", @@ -12744,39 +12746,36 @@ }, { "name": "nunomaduro/collision", - "version": "v8.8.3", + "version": "v8.9.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4" + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1dc9e88d105699d0fee8bb18890f41b274f6b4c4", - "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", "shasum": "" }, "require": { - "filp/whoops": "^2.18.1", - "nunomaduro/termwind": "^2.3.1", + "filp/whoops": "^2.18.4", + "nunomaduro/termwind": "^2.4.0", "php": "^8.2.0", - "symfony/console": "^7.3.0" + "symfony/console": "^7.4.4 || ^8.0.4" }, "conflict": { - "laravel/framework": "<11.44.2 || >=13.0.0", - "phpunit/phpunit": "<11.5.15 || >=13.0.0" + "laravel/framework": "<11.48.0 || >=14.0.0", + "phpunit/phpunit": "<11.5.50 || >=14.0.0" }, "require-dev": { - "brianium/paratest": "^7.8.3", - "larastan/larastan": "^3.4.2", - "laravel/framework": "^11.44.2 || ^12.18", - "laravel/pint": "^1.22.1", - "laravel/sail": "^1.43.1", - "laravel/sanctum": "^4.1.1", - "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0 || ^10.4", - "pestphp/pest": "^3.8.2 || ^4.0.0", - "sebastian/environment": "^7.2.1 || ^8.0" + "brianium/paratest": "^7.8.5", + "larastan/larastan": "^3.9.2", + "laravel/framework": "^11.48.0 || ^12.52.0", + "laravel/pint": "^1.27.1", + "orchestra/testbench-core": "^9.12.0 || ^10.9.0", + "pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0" }, "type": "library", "extra": { @@ -12839,7 +12838,7 @@ "type": "patreon" } ], - "time": "2025-11-20T02:55:25+00:00" + "time": "2026-02-17T17:33:08+00:00" }, { "name": "pestphp/pest", @@ -13416,11 +13415,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.38", + "version": "2.1.39", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dfaf1f530e1663aa167bc3e52197adb221582629", - "reference": "dfaf1f530e1663aa167bc3e52197adb221582629", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c6f73a2af4cbcd99c931d0fb8f08548cc0fa8224", + "reference": "c6f73a2af4cbcd99c931d0fb8f08548cc0fa8224", "shasum": "" }, "require": { @@ -13465,7 +13464,7 @@ "type": "github" } ], - "time": "2026-01-30T17:12:46+00:00" + "time": "2026-02-11T14:48:56+00:00" }, { "name": "phpunit/php-code-coverage", @@ -14963,23 +14962,23 @@ }, { "name": "ta-tikoma/phpunit-architecture-test", - "version": "0.8.6", + "version": "0.8.7", "source": { "type": "git", "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", - "reference": "ad48430b92901fd7d003fdaf2d7b139f96c0906e" + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/ad48430b92901fd7d003fdaf2d7b139f96c0906e", - "reference": "ad48430b92901fd7d003fdaf2d7b139f96c0906e", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/1248f3f506ca9641d4f68cebcd538fa489754db8", + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8", "shasum": "" }, "require": { "nikic/php-parser": "^4.18.0 || ^5.0.0", "php": "^8.1.0", "phpdocumentor/reflection-docblock": "^5.3.0 || ^6.0.0", - "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0 || ^13.0.0", "symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "require-dev": { @@ -15016,9 +15015,9 @@ ], "support": { "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", - "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.6" + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.7" }, - "time": "2026-01-30T07:16:00+00:00" + "time": "2026-02-17T17:25:14+00:00" }, { "name": "theseer/tokenizer", @@ -15088,5 +15087,5 @@ "platform-overrides": { "php": "8.2" }, - "plugin-api-version": "2.9.0" + "plugin-api-version": "2.6.0" } From 9bf5b2cf0a1baff176b808883c1676bd6325f72a Mon Sep 17 00:00:00 2001 From: Boy132 Date: Sun, 22 Feb 2026 17:23:09 +0100 Subject: [PATCH 6/9] Do not throw error when checking for egg updates (#2256) --- .../Commands/Egg/CheckEggUpdatesCommand.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/Console/Commands/Egg/CheckEggUpdatesCommand.php b/app/Console/Commands/Egg/CheckEggUpdatesCommand.php index 40ac43ab2..c50dceeb7 100644 --- a/app/Console/Commands/Egg/CheckEggUpdatesCommand.php +++ b/app/Console/Commands/Egg/CheckEggUpdatesCommand.php @@ -8,7 +8,6 @@ use App\Services\Eggs\Sharing\EggExporterService; use Exception; use Illuminate\Console\Command; use Illuminate\Support\Facades\Http; -use JsonException; use Symfony\Component\Yaml\Yaml; class CheckEggUpdatesCommand extends Command @@ -22,14 +21,12 @@ class CheckEggUpdatesCommand extends Command try { $this->check($egg, $exporterService); } catch (Exception $exception) { - $this->error("{$egg->name}: Error ({$exception->getMessage()})"); + $this->error("$egg->name: Error ({$exception->getMessage()})"); } } } - /** - * @throws JsonException - */ + /** @throws Exception */ private function check(Egg $egg, EggExporterService $exporterService): void { if (is_null($egg->update_url)) { @@ -45,7 +42,13 @@ class CheckEggUpdatesCommand extends Command ? Yaml::parse($exporterService->handle($egg->id, EggFormat::YAML)) : json_decode($exporterService->handle($egg->id, EggFormat::JSON), true); - $remote = Http::timeout(5)->connectTimeout(1)->get($egg->update_url)->throw()->body(); + $remote = Http::timeout(5)->connectTimeout(1)->get($egg->update_url); + + if ($remote->failed()) { + throw new Exception("HTTP request returned status code {$remote->status()}"); + } + + $remote = $remote->body(); $remote = $isYaml ? Yaml::parse($remote) : json_decode($remote, true); unset($local['exported_at'], $remote['exported_at']); From 593f209142b306a65f5edd6a94ca90b43819b4fd Mon Sep 17 00:00:00 2001 From: Boy132 Date: Sun, 22 Feb 2026 17:23:51 +0100 Subject: [PATCH 7/9] Fix stock egg UUID migration (#2259) --- ...6_01_14_221937_convert_stock_egg_uuids.php | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/database/migrations/2026_01_14_221937_convert_stock_egg_uuids.php b/database/migrations/2026_01_14_221937_convert_stock_egg_uuids.php index fb51a8b31..b1c426d1f 100644 --- a/database/migrations/2026_01_14_221937_convert_stock_egg_uuids.php +++ b/database/migrations/2026_01_14_221937_convert_stock_egg_uuids.php @@ -8,29 +8,35 @@ return new class extends Migration { $mappings = [ // Forge Minecraft - 'ed072427-f209-4603-875c-f540c6dd5a65' => [ - 'new_uuid' => 'd6018085-eecc-42bf-bf8c-51ea45a69ace', + 'd6018085-eecc-42bf-bf8c-51ea45a69ace' => [ + 'new_uuid' => 'ed072427-f209-4603-875c-f540c6dd5a65', 'new_update_url' => 'https://raw.githubusercontent.com/pelican-eggs/minecraft/refs/heads/main/java/forge/egg-forge-minecraft.yaml', ], // Paper - '5da37ef6-58da-4169-90a6-e683e1721247' => [ - 'new_uuid' => '150956be-4164-4086-9057-631ae95505e9', + '150956be-4164-4086-9057-631ae95505e9' => [ + 'new_uuid' => '5da37ef6-58da-4169-90a6-e683e1721247', 'new_update_url' => 'https://raw.githubusercontent.com/pelican-eggs/minecraft/refs/heads/main/java/paper/egg-paper.yaml', ], // Garrys Mod - '60ef81d4-30a2-4d98-ab64-f59c69e2f915' => [ - 'new_uuid' => 'c0b2f96a-f753-4d82-a73e-6e5be2bbadd5', + 'c0b2f96a-f753-4d82-a73e-6e5be2bbadd5' => [ + 'new_uuid' => '60ef81d4-30a2-4d98-ab64-f59c69e2f915', 'new_update_url' => 'https://raw.githubusercontent.com/pelican-eggs/games-steamcmd/refs/heads/main/gmod/egg-garrys-mod.yaml', ], ]; foreach ($mappings as $oldUuid => $newData) { - DB::table('eggs')->where('uuid', $oldUuid)->update([ - 'uuid' => $newData['new_uuid'], - 'update_url' => $newData['new_update_url'], - ]); + if (DB::table('eggs')->where('uuid', $newData['new_uuid'])->exists()) { + DB::table('eggs')->where('uuid', $newData['new_uuid'])->update([ + 'update_url' => $newData['new_update_url'], + ]); + } else { + DB::table('eggs')->where('uuid', $oldUuid)->update([ + 'uuid' => $newData['new_uuid'], + 'update_url' => $newData['new_update_url'], + ]); + } } } From 42c127c004346f90c6434848b33607a4f745b4b9 Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 23 Feb 2026 13:41:15 -0500 Subject: [PATCH 8/9] Fix invisible force delete button (#2262) --- app/Filament/Admin/Resources/Servers/Pages/EditServer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Filament/Admin/Resources/Servers/Pages/EditServer.php b/app/Filament/Admin/Resources/Servers/Pages/EditServer.php index 4ff388380..3a5b6bad9 100644 --- a/app/Filament/Admin/Resources/Servers/Pages/EditServer.php +++ b/app/Filament/Admin/Resources/Servers/Pages/EditServer.php @@ -1127,7 +1127,7 @@ class EditServer extends EditRecord ->hidden(fn () => $canForceDelete) ->authorize(fn (Server $server) => user()?->can('delete server', $server)) ->icon(TablerIcon::Trash), - Action::make('ForceDelete') + Action::make('exclude_force_delete') ->color('danger') ->label(trans('filament-actions::force-delete.single.label')) ->modalHeading(trans('filament-actions::force-delete.single.modal.heading', ['label' => $this->getRecordTitle()])) From e35ce1e79d9651357a945c0d8bf39be9f2bf4f2d Mon Sep 17 00:00:00 2001 From: Boy132 Date: Mon, 23 Feb 2026 20:25:19 +0100 Subject: [PATCH 9/9] Use folder name as id when having id mismatch to allow deletion (#2263) --- app/Models/Plugin.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/Models/Plugin.php b/app/Models/Plugin.php index 50808d84c..09a45706e 100644 --- a/app/Models/Plugin.php +++ b/app/Models/Plugin.php @@ -109,13 +109,11 @@ class Plugin extends Model implements HasPluginSettings continue; } - $plugin = Str::lower($plugin); - try { $data = File::json($path, JSON_THROW_ON_ERROR); $data['id'] = Str::lower($data['id']); - if ($data['id'] !== $plugin) { + if ($data['id'] !== Str::lower($plugin)) { throw new PluginIdMismatchException("Plugin id mismatch for folder name ($plugin) and id in plugin.json ({$data['id']})!"); } @@ -161,7 +159,7 @@ class Plugin extends Model implements HasPluginSettings if (!$exception instanceof JsonException) { $plugins[] = [ - 'id' => $data['id'] ?? Str::uuid(), + 'id' => $exception instanceof PluginIdMismatchException ? $plugin : ($data['id'] ?? Str::uuid()), 'name' => $data['name'] ?? Str::headline($plugin), 'author' => $data['author'] ?? 'Unknown', 'version' => $data['version'] ?? '0.0.0',