From 4994ae6e61fb91e633c3efd1237535a23b9cd438 Mon Sep 17 00:00:00 2001 From: Alex Justesen Date: Fri, 31 Oct 2025 13:12:31 -0400 Subject: [PATCH 1/3] Upgrade Sail to PHP v8.4 (#2368) Co-authored-by: Alex Justesen <1144087+alexjustesen@users.noreply.github.com> --- docker-compose.yml => compose.yaml | 6 +++--- composer.json | 2 +- composer.lock | 16 ++++++++-------- docker/{8.3 => 8.4}/Dockerfile | 21 +++++++++++---------- docker/{8.3 => 8.4}/php.ini | 0 docker/{8.3 => 8.4}/start-container | 0 docker/{8.3 => 8.4}/supervisord.conf | 0 docker/mariadb/create-testing-database.sh | 6 ++++++ docker/mysql/create-testing-database.sh | 6 ++++++ docker/pgsql/create-testing-database.sql | 2 ++ package-lock.json | 7 +++++++ 11 files changed, 44 insertions(+), 22 deletions(-) rename docker-compose.yml => compose.yaml (88%) rename docker/{8.3 => 8.4}/Dockerfile (86%) rename docker/{8.3 => 8.4}/php.ini (100%) rename docker/{8.3 => 8.4}/start-container (100%) rename docker/{8.3 => 8.4}/supervisord.conf (100%) create mode 100644 docker/mariadb/create-testing-database.sh create mode 100644 docker/mysql/create-testing-database.sh create mode 100644 docker/pgsql/create-testing-database.sql diff --git a/docker-compose.yml b/compose.yaml similarity index 88% rename from docker-compose.yml rename to compose.yaml index 6e29e727a..347cd42ba 100644 --- a/docker-compose.yml +++ b/compose.yaml @@ -1,11 +1,11 @@ services: laravel.test: build: - context: ./docker/8.3 + context: ./docker/8.4 dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' - image: speedtest-tracker-8.3/app + image: speedtest-tracker-8.4/app extra_hosts: - 'host.docker.internal:host-gateway' ports: @@ -34,7 +34,7 @@ services: POSTGRES_PASSWORD: '${DB_PASSWORD:-secret}' volumes: - 'sail-pgsql:/var/lib/postgresql/data' - - './vendor/laravel/sail/database/pgsql/create-testing-database.sql:/docker-entrypoint-initdb.d/10-create-testing-database.sql' + - './docker/pgsql/create-testing-database.sql:/docker-entrypoint-initdb.d/10-create-testing-database.sql' networks: - sail healthcheck: diff --git a/composer.json b/composer.json index 6902196b8..104139989 100644 --- a/composer.json +++ b/composer.json @@ -100,7 +100,7 @@ "config": { "optimize-autoloader": true, "platform": { - "php": "8.3" + "php": "8.4" }, "preferred-install": "dist", "sort-packages": true, diff --git a/composer.lock b/composer.lock index f1cef7c71..6270873ed 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": "8b3c1fa2898b30e0d757f4cc5f50c33b", + "content-hash": "df786d0a8d0dbc40de2014d101e017c7", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -9914,16 +9914,16 @@ }, { "name": "laravel/sail", - "version": "v1.46.0", + "version": "v1.47.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "eb90c4f113c4a9637b8fdd16e24cfc64f2b0ae6e" + "reference": "9a11e822238167ad8b791e4ea51155d25cf4d8f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/eb90c4f113c4a9637b8fdd16e24cfc64f2b0ae6e", - "reference": "eb90c4f113c4a9637b8fdd16e24cfc64f2b0ae6e", + "url": "https://api.github.com/repos/laravel/sail/zipball/9a11e822238167ad8b791e4ea51155d25cf4d8f2", + "reference": "9a11e822238167ad8b791e4ea51155d25cf4d8f2", "shasum": "" }, "require": { @@ -9936,7 +9936,7 @@ }, "require-dev": { "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^2.0" }, "bin": [ "bin/sail" @@ -9973,7 +9973,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2025-09-23T13:44:39+00:00" + "time": "2025-10-28T13:55:29+00:00" }, { "name": "laravel/telescope", @@ -13063,7 +13063,7 @@ }, "platform-dev": {}, "platform-overrides": { - "php": "8.3" + "php": "8.4" }, "plugin-api-version": "2.6.0" } diff --git a/docker/8.3/Dockerfile b/docker/8.4/Dockerfile similarity index 86% rename from docker/8.3/Dockerfile rename to docker/8.4/Dockerfile index 1ae5aa39c..0ce8d812f 100644 --- a/docker/8.3/Dockerfile +++ b/docker/8.4/Dockerfile @@ -27,14 +27,14 @@ RUN apt-get update && apt-get upgrade -y \ && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xb8dc7e53946656efbce4c1dd71daeaab4ad4cab6' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \ && echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu noble main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \ && apt-get update \ - && apt-get install -y php8.3-cli php8.3-dev \ - php8.3-pgsql php8.3-sqlite3 php8.3-gd \ - php8.3-curl \ - php8.3-mysql php8.3-mbstring \ - php8.3-xml php8.3-zip php8.3-bcmath php8.3-soap \ - php8.3-intl php8.3-readline \ - php8.3-msgpack php8.3-igbinary php8.3-redis \ - php8.3-memcached php8.3-pcov php8.3-xdebug \ + && apt-get install -y php8.4-cli php8.4-dev \ + php8.4-pgsql php8.4-sqlite3 php8.4-gd \ + php8.4-curl \ + php8.4-mysql php8.4-mbstring \ + php8.4-xml php8.4-zip php8.4-bcmath php8.4-soap \ + php8.4-intl php8.4-readline \ + php8.4-msgpack php8.4-igbinary php8.4-redis \ + php8.4-pcov php8.4-xdebug \ && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ @@ -61,15 +61,16 @@ RUN apt-get update && apt-get upgrade -y \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* -RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.3 +RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.4 RUN userdel -r ubuntu RUN groupadd --force -g $WWWGROUP sail RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail +RUN git config --global --add safe.directory /var/www/html COPY start-container /usr/local/bin/start-container COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY php.ini /etc/php/8.3/cli/conf.d/99-sail.ini +COPY php.ini /etc/php/8.4/cli/conf.d/99-sail.ini RUN chmod +x /usr/local/bin/start-container EXPOSE 80/tcp diff --git a/docker/8.3/php.ini b/docker/8.4/php.ini similarity index 100% rename from docker/8.3/php.ini rename to docker/8.4/php.ini diff --git a/docker/8.3/start-container b/docker/8.4/start-container similarity index 100% rename from docker/8.3/start-container rename to docker/8.4/start-container diff --git a/docker/8.3/supervisord.conf b/docker/8.4/supervisord.conf similarity index 100% rename from docker/8.3/supervisord.conf rename to docker/8.4/supervisord.conf diff --git a/docker/mariadb/create-testing-database.sh b/docker/mariadb/create-testing-database.sh new file mode 100644 index 000000000..d3b19d90d --- /dev/null +++ b/docker/mariadb/create-testing-database.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +/usr/bin/mariadb --user=root --password="$MYSQL_ROOT_PASSWORD" <<-EOSQL + CREATE DATABASE IF NOT EXISTS testing; + GRANT ALL PRIVILEGES ON \`testing%\`.* TO '$MYSQL_USER'@'%'; +EOSQL diff --git a/docker/mysql/create-testing-database.sh b/docker/mysql/create-testing-database.sh new file mode 100644 index 000000000..aeb1826f1 --- /dev/null +++ b/docker/mysql/create-testing-database.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +mysql --user=root --password="$MYSQL_ROOT_PASSWORD" <<-EOSQL + CREATE DATABASE IF NOT EXISTS testing; + GRANT ALL PRIVILEGES ON \`testing%\`.* TO '$MYSQL_USER'@'%'; +EOSQL diff --git a/docker/pgsql/create-testing-database.sql b/docker/pgsql/create-testing-database.sql new file mode 100644 index 000000000..d84dc07b8 --- /dev/null +++ b/docker/pgsql/create-testing-database.sql @@ -0,0 +1,2 @@ +SELECT 'CREATE DATABASE testing' +WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'testing')\gexec diff --git a/package-lock.json b/package-lock.json index dcb234a72..5c580cc7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1081,6 +1081,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -1566,6 +1567,7 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -1856,6 +1858,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -2347,6 +2350,7 @@ "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -2457,6 +2461,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -2528,6 +2533,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -2632,6 +2638,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, From b5dbd0e914cf007d81db2db40144e7e0ddd773bf Mon Sep 17 00:00:00 2001 From: Alex Justesen Date: Fri, 31 Oct 2025 14:38:10 -0400 Subject: [PATCH 2/3] Add default chart range (#2369) Co-authored-by: Laurent P <1441170+vadius45@users.noreply.github.com> Co-authored-by: Laurent Parodi Co-authored-by: Alex Justesen <1144087+alexjustesen@users.noreply.github.com> --- app/Filament/Widgets/Concerns/HasChartFilters.php | 15 +++++++++++++++ .../Widgets/RecentDownloadChartWidget.php | 13 ++++++------- .../Widgets/RecentDownloadLatencyChartWidget.php | 13 ++++++------- app/Filament/Widgets/RecentJitterChartWidget.php | 13 ++++++------- app/Filament/Widgets/RecentPingChartWidget.php | 13 ++++++------- app/Filament/Widgets/RecentUploadChartWidget.php | 13 ++++++------- .../Widgets/RecentUploadLatencyChartWidget.php | 13 ++++++------- config/speedtest.php | 14 +++++--------- 8 files changed, 56 insertions(+), 51 deletions(-) create mode 100644 app/Filament/Widgets/Concerns/HasChartFilters.php diff --git a/app/Filament/Widgets/Concerns/HasChartFilters.php b/app/Filament/Widgets/Concerns/HasChartFilters.php new file mode 100644 index 000000000..ce12d9384 --- /dev/null +++ b/app/Filament/Widgets/Concerns/HasChartFilters.php @@ -0,0 +1,15 @@ + 'Last 24 hours', + 'week' => 'Last 7 days', + 'month' => 'Last 30 days', + ]; + } +} diff --git a/app/Filament/Widgets/RecentDownloadChartWidget.php b/app/Filament/Widgets/RecentDownloadChartWidget.php index 53feffba4..2c3030f60 100644 --- a/app/Filament/Widgets/RecentDownloadChartWidget.php +++ b/app/Filament/Widgets/RecentDownloadChartWidget.php @@ -3,6 +3,7 @@ namespace App\Filament\Widgets; use App\Enums\ResultStatus; +use App\Filament\Widgets\Concerns\HasChartFilters; use App\Helpers\Average; use App\Helpers\Number; use App\Models\Result; @@ -10,6 +11,8 @@ class RecentDownloadChartWidget extends ChartWidget { + use HasChartFilters; + protected static ?string $heading = 'Download (Mbps)'; protected int|string|array $columnSpan = 'full'; @@ -18,15 +21,11 @@ class RecentDownloadChartWidget extends ChartWidget protected static ?string $pollingInterval = '60s'; - public ?string $filter = '24h'; + public ?string $filter = null; - protected function getFilters(): ?array + public function mount(): void { - return [ - '24h' => 'Last 24h', - 'week' => 'Last week', - 'month' => 'Last month', - ]; + $this->filter = $this->filter ?? config('speedtest.default_chart_range', '24h'); } protected function getData(): array diff --git a/app/Filament/Widgets/RecentDownloadLatencyChartWidget.php b/app/Filament/Widgets/RecentDownloadLatencyChartWidget.php index 6b75ffc97..639f5c454 100644 --- a/app/Filament/Widgets/RecentDownloadLatencyChartWidget.php +++ b/app/Filament/Widgets/RecentDownloadLatencyChartWidget.php @@ -3,11 +3,14 @@ namespace App\Filament\Widgets; use App\Enums\ResultStatus; +use App\Filament\Widgets\Concerns\HasChartFilters; use App\Models\Result; use Filament\Widgets\ChartWidget; class RecentDownloadLatencyChartWidget extends ChartWidget { + use HasChartFilters; + protected static ?string $heading = 'Download Latency'; protected int|string|array $columnSpan = 'full'; @@ -16,15 +19,11 @@ class RecentDownloadLatencyChartWidget extends ChartWidget protected static ?string $pollingInterval = '60s'; - public ?string $filter = '24h'; + public ?string $filter = null; - protected function getFilters(): ?array + public function mount(): void { - return [ - '24h' => 'Last 24h', - 'week' => 'Last week', - 'month' => 'Last month', - ]; + $this->filter = $this->filter ?? config('speedtest.default_chart_range', '24h'); } protected function getData(): array diff --git a/app/Filament/Widgets/RecentJitterChartWidget.php b/app/Filament/Widgets/RecentJitterChartWidget.php index 0c88525d6..19a345a7c 100644 --- a/app/Filament/Widgets/RecentJitterChartWidget.php +++ b/app/Filament/Widgets/RecentJitterChartWidget.php @@ -3,11 +3,14 @@ namespace App\Filament\Widgets; use App\Enums\ResultStatus; +use App\Filament\Widgets\Concerns\HasChartFilters; use App\Models\Result; use Filament\Widgets\ChartWidget; class RecentJitterChartWidget extends ChartWidget { + use HasChartFilters; + protected static ?string $heading = 'Jitter'; protected int|string|array $columnSpan = 'full'; @@ -16,15 +19,11 @@ class RecentJitterChartWidget extends ChartWidget protected static ?string $pollingInterval = '60s'; - public ?string $filter = '24h'; + public ?string $filter = null; - protected function getFilters(): ?array + public function mount(): void { - return [ - '24h' => 'Last 24h', - 'week' => 'Last week', - 'month' => 'Last month', - ]; + $this->filter = $this->filter ?? config('speedtest.default_chart_range', '24h'); } protected function getData(): array diff --git a/app/Filament/Widgets/RecentPingChartWidget.php b/app/Filament/Widgets/RecentPingChartWidget.php index 5077cc6be..b95325791 100644 --- a/app/Filament/Widgets/RecentPingChartWidget.php +++ b/app/Filament/Widgets/RecentPingChartWidget.php @@ -3,12 +3,15 @@ namespace App\Filament\Widgets; use App\Enums\ResultStatus; +use App\Filament\Widgets\Concerns\HasChartFilters; use App\Helpers\Average; use App\Models\Result; use Filament\Widgets\ChartWidget; class RecentPingChartWidget extends ChartWidget { + use HasChartFilters; + protected static ?string $heading = 'Ping (ms)'; protected int|string|array $columnSpan = 'full'; @@ -17,15 +20,11 @@ class RecentPingChartWidget extends ChartWidget protected static ?string $pollingInterval = '60s'; - public ?string $filter = '24h'; + public ?string $filter = null; - protected function getFilters(): ?array + public function mount(): void { - return [ - '24h' => 'Last 24h', - 'week' => 'Last week', - 'month' => 'Last month', - ]; + $this->filter = $this->filter ?? config('speedtest.default_chart_range', '24h'); } protected function getData(): array diff --git a/app/Filament/Widgets/RecentUploadChartWidget.php b/app/Filament/Widgets/RecentUploadChartWidget.php index d58d5c38e..12fd7b892 100644 --- a/app/Filament/Widgets/RecentUploadChartWidget.php +++ b/app/Filament/Widgets/RecentUploadChartWidget.php @@ -3,6 +3,7 @@ namespace App\Filament\Widgets; use App\Enums\ResultStatus; +use App\Filament\Widgets\Concerns\HasChartFilters; use App\Helpers\Average; use App\Helpers\Number; use App\Models\Result; @@ -10,6 +11,8 @@ class RecentUploadChartWidget extends ChartWidget { + use HasChartFilters; + protected static ?string $heading = 'Upload (Mbps)'; protected int|string|array $columnSpan = 'full'; @@ -18,15 +21,11 @@ class RecentUploadChartWidget extends ChartWidget protected static ?string $pollingInterval = '60s'; - public ?string $filter = '24h'; + public ?string $filter = null; - protected function getFilters(): ?array + public function mount(): void { - return [ - '24h' => 'Last 24h', - 'week' => 'Last week', - 'month' => 'Last month', - ]; + $this->filter = $this->filter ?? config('speedtest.default_chart_range', '24h'); } protected function getData(): array diff --git a/app/Filament/Widgets/RecentUploadLatencyChartWidget.php b/app/Filament/Widgets/RecentUploadLatencyChartWidget.php index 08f2808b4..977098b4f 100644 --- a/app/Filament/Widgets/RecentUploadLatencyChartWidget.php +++ b/app/Filament/Widgets/RecentUploadLatencyChartWidget.php @@ -3,11 +3,14 @@ namespace App\Filament\Widgets; use App\Enums\ResultStatus; +use App\Filament\Widgets\Concerns\HasChartFilters; use App\Models\Result; use Filament\Widgets\ChartWidget; class RecentUploadLatencyChartWidget extends ChartWidget { + use HasChartFilters; + protected static ?string $heading = 'Upload Latency'; protected int|string|array $columnSpan = 'full'; @@ -16,15 +19,11 @@ class RecentUploadLatencyChartWidget extends ChartWidget protected static ?string $pollingInterval = '60s'; - public ?string $filter = '24h'; + public ?string $filter = null; - protected function getFilters(): ?array + public function mount(): void { - return [ - '24h' => 'Last 24h', - 'week' => 'Last week', - 'month' => 'Last month', - ]; + $this->filter = $this->filter ?? config('speedtest.default_chart_range', '24h'); } protected function getData(): array diff --git a/config/speedtest.php b/config/speedtest.php index 944a9dac9..8fe4c7792 100644 --- a/config/speedtest.php +++ b/config/speedtest.php @@ -6,7 +6,6 @@ /** * General settings. */ - 'build_date' => Carbon::parse('2025-10-24'), 'build_version' => 'v1.6.9', @@ -17,6 +16,7 @@ 'public_dashboard' => env('PUBLIC_DASHBOARD', false), + 'default_chart_range' => env('DEFAULT_CHART_RANGE', '24h'), /** * Speedtest settings. @@ -31,25 +31,21 @@ 'checkinternet_url' => env('SPEEDTEST_CHECKINTERNET_URL', 'https://icanhazip.com'), - /** * IP filtering settings. */ - 'allowed_ips' => env('ALLOWED_IPS'), 'skip_ips' => env('SPEEDTEST_SKIP_IPS', ''), - /** * Threshold settings. */ + 'threshold_enabled' => env('THRESHOLD_ENABLED', false), - 'threshold_enabled' => env('THRESHOLD_ENABLED', false), - - 'threshold_download' => env('THRESHOLD_DOWNLOAD', 0), + 'threshold_download' => env('THRESHOLD_DOWNLOAD', 0), - 'threshold_upload' => env('THRESHOLD_UPLOAD', 0), + 'threshold_upload' => env('THRESHOLD_UPLOAD', 0), - 'threshold_ping' => env('THRESHOLD_PING', 0) , + 'threshold_ping' => env('THRESHOLD_PING', 0), ]; From 3005acfed8be1b3de0bd03969b7c03679c4f3acb Mon Sep 17 00:00:00 2001 From: Alex Justesen Date: Fri, 31 Oct 2025 14:46:48 -0400 Subject: [PATCH 3/3] Release v1.6.10 (#2370) Co-authored-by: Alex Justesen <1144087+alexjustesen@users.noreply.github.com> --- .claude/guidelines.md | 17 +++++++++++++++++ config/speedtest.php | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 .claude/guidelines.md diff --git a/.claude/guidelines.md b/.claude/guidelines.md new file mode 100644 index 000000000..707c06cae --- /dev/null +++ b/.claude/guidelines.md @@ -0,0 +1,17 @@ +# AI Guidelines for Speedtest Tracker + +## Code Style + +### Laravel Pint + +Always run `./vendor/bin/pint --dirty` after making any code changes to ensure code style consistency. This command formats only the files that have been modified according to the project's PHP coding standards. + +**Usage:** +```bash +./vendor/bin/pint --dirty +``` + +This should be run before: +- Creating commits +- Opening pull requests +- Marking tasks as complete diff --git a/config/speedtest.php b/config/speedtest.php index 8fe4c7792..93e6f0512 100644 --- a/config/speedtest.php +++ b/config/speedtest.php @@ -6,9 +6,9 @@ /** * General settings. */ - 'build_date' => Carbon::parse('2025-10-24'), + 'build_date' => Carbon::parse('2025-10-31'), - 'build_version' => 'v1.6.9', + 'build_version' => 'v1.6.10', 'content_width' => env('CONTENT_WIDTH', '7xl'),