{{ $post->title }}
-{{ $post->excerpt }}
- Read more → -diff --git a/.env.example b/.env.example
index 084f8e4..100e89c 100644
--- a/.env.example
+++ b/.env.example
@@ -67,6 +67,8 @@ VITE_APP_NAME="${APP_NAME}"
# Demo Mode Configuration (set to true on demo server only)
DEMO_MODE=false
+# Optional host-only Packagist snapshots; requires Laravel's scheduler.
+LARACOREKIT_COLLECT_STATS=false
DEMO_RESET_INTERVAL=30
DEMO_ADMIN_EMAIL=admin@laracorekit.com
DEMO_ADMIN_PASSWORD=Admin@123
diff --git a/.github/IMPLEMENTATION_CHECKLIST.md b/.github/IMPLEMENTATION_CHECKLIST.md
index 8776db1..2ebf1df 100644
--- a/.github/IMPLEMENTATION_CHECKLIST.md
+++ b/.github/IMPLEMENTATION_CHECKLIST.md
@@ -1,5 +1,7 @@
# LaraCoreKit - Implementation Checklist
+Historical checklist from the earlier host audit. For the current package extraction, validation evidence and external release blockers, see [implementation report](../docs/implementation-report.md).
+
This document tracks the implementation of improvements based on the comprehensive audit report.
## Must-Fix Priority Items
diff --git a/.github/README_REPOSITORY.md b/.github/README_REPOSITORY.md
index d418efa..36ea16e 100644
--- a/.github/README_REPOSITORY.md
+++ b/.github/README_REPOSITORY.md
@@ -3,7 +3,7 @@
Use this for the GitHub repository About/Description section:
```
-Modular Laravel 13 starter kit with Filament 5, Livewire 4, Tailwind 4, multilingual content, RTL support, auth, roles/permissions, blog, settings, media, and publishable add-on modules.
+Modular Laravel foundation for public websites and Filament administration. Reusable Composer package, documentation, demo host and component examples.
```
## Topics/Tags
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..5f470bd
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,22 @@
+version: 2
+updates:
+ - package-ecosystem: composer
+ directory: /
+ schedule:
+ interval: weekly
+ open-pull-requests-limit: 5
+ - package-ecosystem: npm
+ directory: /
+ schedule:
+ interval: weekly
+ open-pull-requests-limit: 5
+ - package-ecosystem: composer
+ directory: /packages/core
+ schedule:
+ interval: weekly
+ open-pull-requests-limit: 5
+ - package-ecosystem: github-actions
+ directory: /
+ schedule:
+ interval: weekly
+ open-pull-requests-limit: 5
diff --git a/.github/package-workflows/dependabot.yml b/.github/package-workflows/dependabot.yml
new file mode 100644
index 0000000..77a41d2
--- /dev/null
+++ b/.github/package-workflows/dependabot.yml
@@ -0,0 +1,10 @@
+version: 2
+updates:
+ - package-ecosystem: composer
+ directory: /
+ schedule:
+ interval: weekly
+ - package-ecosystem: github-actions
+ directory: /
+ schedule:
+ interval: weekly
diff --git a/.github/package-workflows/prepare-release.yml b/.github/package-workflows/prepare-release.yml
new file mode 100644
index 0000000..a9d1826
--- /dev/null
+++ b/.github/package-workflows/prepare-release.yml
@@ -0,0 +1,62 @@
+name: Prepare Release PR
+on:
+ workflow_dispatch:
+ inputs:
+ version:
+ description: 'Reviewed stable version without v (example: 0.1.0)'
+ required: true
+permissions:
+ contents: read
+jobs:
+ propose:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ pull-requests: write
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ fetch-depth: 0
+ - name: Validate version and prepare release notes
+ env:
+ RELEASE_VERSION: ${{ inputs.version }}
+ run: |
+ python3 - <<'PY'
+ import os, re, subprocess
+ from pathlib import Path
+ from datetime import date
+ version = os.environ['RELEASE_VERSION']
+ if not re.fullmatch(r'(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)', version):
+ raise SystemExit('Use a stable semantic version, e.g. 0.1.0.')
+ if subprocess.run(['git', 'rev-parse', '--verify', 'refs/tags/v'+version], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).returncode == 0:
+ raise SystemExit('That release tag already exists.')
+ path = Path('CHANGELOG.md')
+ text = path.read_text()
+ if '## Unreleased' not in text:
+ raise SystemExit('Missing Unreleased notes.')
+ text = text.replace('## Unreleased', '## Unreleased\n\n## '+version+' - '+date.today().isoformat(), 1)
+ path.write_text(text)
+ PY
+ - uses: shivammathur/setup-php@v2
+ with:
+ php-version: '8.3'
+ extensions: dom, curl, mbstring, zip, pdo_sqlite, bcmath, intl, gd, exif
+ coverage: none
+ - run: composer validate --strict
+ - run: composer install --no-dev --prefer-dist --no-interaction
+ - run: composer audit
+ - name: Open draft release PR
+ env:
+ GH_TOKEN: ${{ github.token }}
+ GH_REPO: ${{ github.repository }}
+ RELEASE_VERSION: ${{ inputs.version }}
+ run: |
+ branch="codex/release-$RELEASE_VERSION"
+ git switch -c "$branch"
+ git config user.name 'github-actions[bot]'
+ git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
+ git add CHANGELOG.md
+ git commit -m "Prepare v$RELEASE_VERSION release notes"
+ git push --set-upstream origin "$branch"
+ printf 'Prepare version %s.\n\nBefore publishing: verify monorepo regression/consumer checks and package export, review compatibility and these release notes. After merge, tag the reviewed package commit and publish the GitHub release; Packagist indexes the tag. This workflow creates no release tag and does not publish.\n' "$RELEASE_VERSION" > "$RUNNER_TEMP/release-body.md"
+ gh pr create --base main --head "$branch" --draft --title "Prepare v$RELEASE_VERSION" --body-file "$RUNNER_TEMP/release-body.md"
diff --git a/.github/package-workflows/sync-source.yml b/.github/package-workflows/sync-source.yml
new file mode 100644
index 0000000..27b1a28
--- /dev/null
+++ b/.github/package-workflows/sync-source.yml
@@ -0,0 +1,91 @@
+name: Sync Package Source
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '17 8 * * *'
+permissions:
+ contents: read
+jobs:
+ propose:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ pull-requests: write
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ path: distribution
+ - uses: actions/checkout@v6
+ with:
+ repository: ProgrammerNomad/LaraCoreKit
+ ref: main
+ path: source
+ persist-credentials: false
+ - name: Check source availability and pending proposals
+ id: source
+ env:
+ GH_TOKEN: ${{ github.token }}
+ GH_REPO: ${{ github.repository }}
+ run: |
+ if [ ! -f source/packages/core/composer.json ]; then
+ echo 'Package extraction is not on the monorepo main branch yet.'
+ exit 0
+ fi
+ pending=$(gh pr list --state open --label package-sync --json number --jq length)
+ if [ "$pending" != '0' ]; then
+ echo 'A package source proposal is already waiting for review.'
+ exit 0
+ fi
+ echo 'ready=true' >> "$GITHUB_OUTPUT"
+ - if: steps.source.outputs.ready == 'true'
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: '8.3'
+ extensions: dom, curl, mbstring, zip, pdo_sqlite, bcmath, intl, gd, exif
+ coverage: none
+ - if: steps.source.outputs.ready == 'true'
+ uses: actions/setup-node@v6
+ with:
+ node-version: '24'
+ cache: npm
+ cache-dependency-path: source/package-lock.json
+ - name: Validate the monorepo source and prepare the package
+ if: steps.source.outputs.ready == 'true'
+ working-directory: source
+ run: |
+ composer install --prefer-dist --no-interaction
+ cp .env.example .env
+ php artisan key:generate
+ composer validate --strict
+ composer --working-dir=packages/core validate --strict
+ composer review
+ composer audit --locked
+ npm ci
+ npm audit
+ npm run build:core
+ python3 tools/consumer-smoke.py
+ python3 tools/package-release.py
+ - name: Propose a package-only source update
+ if: steps.source.outputs.ready == 'true'
+ working-directory: distribution
+ env:
+ GH_TOKEN: ${{ github.token }}
+ GH_REPO: ${{ github.repository }}
+ run: |
+ branch="codex/package-sync-$GITHUB_RUN_ID"
+ source_sha=$(git -C ../source rev-parse HEAD)
+ git switch -c "$branch"
+ # Preserve this repository's own maintenance workflow.
+ git rm -r --ignore-unmatch -- . ':!.github'
+ unzip -oq ../source/storage/app/releases/laracorekit-preview.zip
+ git add -A
+ if git diff --cached --quiet; then
+ echo 'Package source is already current.'
+ exit 0
+ fi
+ git config user.name 'github-actions[bot]'
+ git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
+ git commit -m "Sync package source from $source_sha"
+ git push --set-upstream origin "$branch"
+ printf 'Update package source from LaraCoreKit commit %s.\n\nMonorepo checks, dependency audits and clean-consumer installation passed. Review and merge before creating a release tag.\n' "$source_sha" > "$RUNNER_TEMP/package-sync-body.md"
+ gh pr create --base main --head "$branch" --draft --label package-sync --title 'Sync LaraCoreKit package source' --body-file "$RUNNER_TEMP/package-sync-body.md"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index dce8c51..43ae380 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,38 +1,28 @@
name: Build Assets
-
on:
push:
- branches: [ main, develop ]
+ branches: [main, develop]
pull_request:
- branches: [ main, develop ]
-
+ branches: [main, develop]
+permissions:
+ contents: read
jobs:
build:
runs-on: ubuntu-latest
- name: Build Frontend Assets
-
steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Setup Node.js
- uses: actions/setup-node@v4
+ - uses: actions/checkout@v6
+ - uses: shivammathur/setup-php@v2
with:
- node-version: '20'
- cache: 'npm'
-
- - name: Install dependencies
- run: npm ci
-
- - name: Build assets
- run: npm run build
-
- - name: Check for build errors
- run: |
- if [ -d "public/build" ]; then
- echo "Build directory created successfully"
- ls -la public/build
- else
- echo "Build directory not found!"
- exit 1
- fi
+ php-version: '8.3'
+ extensions: intl, gd, exif, zip
+ coverage: none
+ - run: composer install --prefer-dist --no-interaction
+ - uses: actions/setup-node@v6
+ with:
+ node-version: '24'
+ cache: npm
+ - run: npm ci
+ - run: npm audit
+ - run: npm run build:core
+ - run: npm run build
+ - run: git diff --exit-code -- packages/core/resources/dist
diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml
index 5d6990f..d1b63ae 100644
--- a/.github/workflows/code-quality.yml
+++ b/.github/workflows/code-quality.yml
@@ -1,50 +1,23 @@
name: Code Quality
-
on:
push:
- branches: [ main, develop ]
+ branches: [main, develop]
pull_request:
- branches: [ main, develop ]
-
+ branches: [main, develop]
+permissions:
+ contents: read
jobs:
- pint:
+ quality:
runs-on: ubuntu-latest
- name: Laravel Pint
-
steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Setup PHP
- uses: shivammathur/setup-php@v2
+ - uses: actions/checkout@v6
+ - uses: shivammathur/setup-php@v2
with:
- php-version: 8.3
- extensions: dom, curl, libxml, mbstring, zip
+ php-version: '8.3'
+ extensions: dom, curl, mbstring, zip, pdo_sqlite, bcmath, intl, gd, exif
coverage: none
-
- - name: Install dependencies
- run: composer install --prefer-dist --no-interaction
-
- - name: Run Pint
- run: vendor/bin/pint --test
-
- phpstan:
- runs-on: ubuntu-latest
- name: PHPStan
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Setup PHP
- uses: shivammathur/setup-php@v2
- with:
- php-version: 8.3
- extensions: dom, curl, libxml, mbstring, zip
- coverage: none
-
- - name: Install dependencies
- run: composer install --prefer-dist --no-interaction
-
- - name: Run PHPStan
- run: vendor/bin/phpstan analyse --memory-limit=2G
+ - run: composer install --prefer-dist --no-interaction
+ - run: cp .env.example .env
+ - run: php artisan key:generate
+ - run: composer pint-test
+ - run: composer phpstan
diff --git a/.github/workflows/consumer.yml b/.github/workflows/consumer.yml
new file mode 100644
index 0000000..d618b24
--- /dev/null
+++ b/.github/workflows/consumer.yml
@@ -0,0 +1,24 @@
+name: Clean Package Consumer
+on:
+ push:
+ branches: [main, develop]
+ pull_request:
+ branches: [main, develop]
+permissions:
+ contents: read
+jobs:
+ install:
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ source: [path, packagist]
+ name: Install from ${{ matrix.source }}
+ steps:
+ - uses: actions/checkout@v6
+ - uses: shivammathur/setup-php@v2
+ with:
+ php-version: '8.3'
+ extensions: dom, curl, mbstring, zip, pdo_sqlite, bcmath, intl, gd, exif
+ coverage: none
+ - run: python3 tools/consumer-smoke.py --source ${{ matrix.source }}
diff --git a/.github/workflows/package-preview.yml b/.github/workflows/package-preview.yml
new file mode 100644
index 0000000..b0106f3
--- /dev/null
+++ b/.github/workflows/package-preview.yml
@@ -0,0 +1,37 @@
+name: Package Release Preview
+on:
+ workflow_dispatch:
+permissions:
+ contents: read
+jobs:
+ package:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - uses: shivammathur/setup-php@v2
+ with:
+ php-version: '8.3'
+ extensions: dom, curl, mbstring, zip, pdo_sqlite, bcmath, intl, gd, exif
+ coverage: none
+ - uses: actions/setup-node@v6
+ with:
+ node-version: '24'
+ cache: npm
+ - run: composer install --prefer-dist --no-interaction
+ - run: cp .env.example .env
+ - run: php artisan key:generate
+ - run: composer validate --strict
+ - run: composer --working-dir=packages/core validate --strict
+ - run: composer audit --locked
+ - run: composer review
+ - run: npm ci
+ - run: npm audit
+ - run: npm run build:core
+ - run: python3 tools/consumer-smoke.py
+ - run: python3 tools/package-release.py
+ - uses: actions/upload-artifact@v7
+ with:
+ name: laracorekit-package-preview
+ path: storage/app/releases/
+ if-no-files-found: error
+ retention-days: 14
diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml
new file mode 100644
index 0000000..9409ffc
--- /dev/null
+++ b/.github/workflows/security.yml
@@ -0,0 +1,21 @@
+name: Dependency Security
+on:
+ schedule:
+ - cron: '23 7 * * 2'
+ workflow_dispatch:
+permissions:
+ contents: read
+jobs:
+ audit:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - uses: shivammathur/setup-php@v2
+ with:
+ php-version: '8.3'
+ coverage: none
+ - uses: actions/setup-node@v6
+ with:
+ node-version: '24'
+ - run: composer audit --locked
+ - run: npm audit --package-lock-only
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index d649e63..811bfbe 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -1,57 +1,63 @@
name: Tests
-
on:
push:
- branches: [ main, develop ]
+ branches: [main, develop]
pull_request:
- branches: [ main, develop ]
-
+ branches: [main, develop]
+permissions:
+ contents: read
jobs:
tests:
runs-on: ubuntu-latest
-
strategy:
fail-fast: false
matrix:
- php: [8.3]
- laravel: [13.*]
- stability: [prefer-stable]
-
- name: PHP ${{ matrix.php }} - Laravel ${{ matrix.laravel }} - ${{ matrix.stability }}
-
+ php: ['8.3', '8.5']
+ dependencies: [locked, compatible]
+ name: PHP ${{ matrix.php }} / ${{ matrix.dependencies }}
steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Setup PHP
- uses: shivammathur/setup-php@v2
+ - uses: actions/checkout@v6
+ - uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
- extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv
+ extensions: dom, curl, mbstring, zip, pdo_sqlite, bcmath, intl, gd, exif
+ coverage: none
+ - run: composer validate --strict
+ - run: composer --working-dir=packages/core validate --strict
+ - if: matrix.dependencies == 'locked'
+ run: composer install --prefer-dist --no-interaction
+ - if: matrix.dependencies == 'compatible'
+ run: composer update --with-all-dependencies --prefer-dist --no-interaction
+ - run: cp .env.example .env
+ - run: php artisan key:generate
+ - run: composer audit --locked
+ - run: composer test
+
+ mysql:
+ runs-on: ubuntu-latest
+ services:
+ mysql:
+ image: mysql:8.0
+ env:
+ MYSQL_ROOT_PASSWORD: testing
+ MYSQL_DATABASE: laracorekit_test
+ ports: ['3306:3306']
+ options: >-
+ --health-cmd="mysqladmin ping -ptesting"
+ --health-interval=10s
+ --health-timeout=5s
+ --health-retries=10
+ env:
+ DB_PORT: '3306'
+ DB_PASSWORD: testing
+ steps:
+ - uses: actions/checkout@v6
+ - uses: shivammathur/setup-php@v2
+ with:
+ php-version: '8.3'
+ extensions: dom, curl, mbstring, zip, pdo_mysql, bcmath, intl, gd, exif
coverage: none
-
- - name: Setup problem matchers
- run: |
- echo "::add-matcher::${{ runner.tool_cache }}/php.json"
- echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
-
- - name: Install dependencies
- run: |
- composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update
- composer update --${{ matrix.stability }} --prefer-dist --no-interaction
-
- - name: Create SQLite database
- run: |
- mkdir -p database
- touch database/database.sqlite
-
- - name: Setup environment
- run: |
- cp .env.example .env
- php artisan key:generate
-
- - name: Run migrations
- run: php artisan migrate --force
-
- - name: Execute tests
- run: vendor/bin/phpunit --testdox
+ - run: composer install --prefer-dist --no-interaction
+ - run: cp .env.example .env
+ - run: php artisan key:generate
+ - run: php vendor/bin/phpunit --configuration phpunit.mysql.xml
diff --git a/.gitignore b/.gitignore
index d99a643..ed579b1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,5 +48,12 @@ Thumbs.db
/storage/logs/*.log
.github/copilot-instructions.md
/package-files
-/storage/framework/sessions
-/storage/framework/views
+/storage/framework/sessions/*
+!/storage/framework/sessions/.gitignore
+/storage/framework/views/*
+!/storage/framework/views/.gitignore
+/packages/**/vendor
+/packages/**/node_modules
+/packages/**/composer.lock
+/storage/framework/cache/phpstan/
+/storage/app/releases/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e79deb0..94ff184 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+### Package extraction and website refresh
+- Extract `programmernomad/laracorekit` under `packages/core`, bundling both public frontend and admin modules with auto-discovery.
+- Move marketing pages and sample seeders into the host; retain Docs/UIShowcase/demo integrations outside the package.
+- Add an explicit installer, prebuilt public CSS, interactive administrator creation and clean-consumer smoke testing.
+- Update compatible PHP dependencies and the Vite toolchain; separate showcase JavaScript from ordinary pages.
+- Add authentication throttling, safe seed defaults, direct resource access checks, settings save authorization and public blog sanitization/publication checks.
+- Redesign the website, add mobile navigation and real screenshots, and correct installation/features/upgrade documentation.
+- Add machine-readable docs, page descriptions, full documentation sitemap coverage and accurate source-code metadata.
+- Add dependency proposals, scheduled security checks and separate locked/compatible PHP CI lanes.
+
+This package release is prepared locally; registry publication and deployment are separate steps. Earlier entries below describe historical host changes.
+
+
### Added
- Installed `bezhansalleh/filament-language-switch` plugin for a native Filament admin topbar language switcher
- Configured `LanguageSwitch` in `AppServiceProvider` with locales `en`, `hi`, `ar`, native labels, and circular avatars
diff --git a/CODEOWNERS b/CODEOWNERS
index 27d7f7f..601d57d 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -4,14 +4,14 @@
* @ProgrammerNomad @shivsingh
# Core modules
-/modules/Core/ @ProgrammerNomad
-/modules/Auth/ @ProgrammerNomad
-/modules/User/ @ProgrammerNomad
+/packages/core/modules/Core/ @ProgrammerNomad
+/packages/core/modules/Auth/ @ProgrammerNomad
+/packages/core/modules/User/ @ProgrammerNomad
# Feature modules
-/modules/Blog/ @ProgrammerNomad
-/modules/Media/ @ProgrammerNomad
-/modules/Settings/ @ProgrammerNomad
+/packages/core/modules/Blog/ @ProgrammerNomad
+/packages/core/modules/Media/ @ProgrammerNomad
+/packages/core/modules/Settings/ @ProgrammerNomad
# Documentation
/docs/ @ProgrammerNomad
@@ -30,3 +30,7 @@ package.json @ProgrammerNomad
# Database migrations and seeders
/database/migrations/ @ProgrammerNomad
/database/seeders/ @ProgrammerNomad
+
+# Package registration, installer and release contract
+/packages/core/ @ProgrammerNomad
+/tools/ @ProgrammerNomad
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 14cca4a..cf91107 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -60,13 +60,19 @@ Feature suggestions are welcome! Please:
7. **Push to your branch** (`git push origin feature/amazing-feature`)
8. **Open a Pull Request**
+## Package and host ownership
+
+The Composer package is `programmernomad/laracorekit`, with public and admin modules under `packages/core`. The repository root hosts the website, documentation viewer, component showcase and demo integrations. Keep the local path repository and package directory together when developing from GitHub. Read `docs/installation.md` and `docs/upgrade-guide.md` before changing registration or installation behavior.
+
+Run `python tools/consumer-smoke.py` for an independent package installation in a disposable Laravel application. Never use real data for smoke tests or screenshots. Registration/telemetry is not required for package users.
+
## Development Setup
### Prerequisites
- PHP 8.3+
- Composer
-- Node.js & NPM
+- Node.js 22.12+ and npm (CI uses Node 24)
- MySQL, PostgreSQL, or SQLite
### Local Installation
@@ -78,7 +84,7 @@ cd LaraCoreKit
# Install dependencies
composer install
-npm install
+npm ci
# Setup environment
cp .env.example .env
@@ -90,7 +96,7 @@ php artisan migrate --seed
php artisan storage:link
# Create admin user
-php artisan filament:user
+php artisan laracorekit:admin
# Start development servers
npm run dev
@@ -113,6 +119,7 @@ vendor/bin/phpstan analyse
composer review
# Build assets
+npm run build:core
npm run build
```
@@ -271,7 +278,7 @@ php artisan test --filter=test_user_can_create_blog_post
Each module should follow this structure:
```
-modules/YourModule/
+packages/your-addon/
├── src/
│ ├── YourModuleServiceProvider.php
│ ├── Http/
diff --git a/README.md b/README.md
index 3140252..1a0c47e 100644
--- a/README.md
+++ b/README.md
@@ -6,11 +6,11 @@ This is the main LaraCoreKit project repository: source development, documentati
Laravel 13 · Filament 5 · Livewire 4 · Tailwind CSS 4 · PHP 8.3+ · MIT
-[Packagist](https://packagist.org/packages/programmernomad/laracorekit) · [Demo website](https://www.laracorekit.com) · [Documentation](https://www.laracorekit.com/docs) · [Installation](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/docs/installation.md) · [Security policy](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/SECURITY.md)
+[Packagist](https://packagist.org/packages/programmernomad/laracorekit) · [Demo website](https://www.laracorekit.com) · [Documentation](https://www.laracorekit.com/docs) · [Installation](docs/installation.md) · [Security policy](SECURITY.md)
## See the public site and admin
-
+
Real views from the disposable demonstration application. The documentation viewer, component showcase, sample content and demo controls are host features outside the core package.
@@ -18,6 +18,8 @@ Real views from the disposable demonstration application. The documentation view
Install the published public frontend and Filament admin bundle in a fresh Laravel 13 application:
+The `create-project` command installs Laravel and initializes its `.env`, application key and default SQLite database. Run the remaining commands inside `my-app`. `composer require` and `laracorekit:install` alone assume Laravel already exists and do not create the complete demo website.
+
```bash
composer create-project laravel/laravel my-app "^13.0"
cd my-app
@@ -34,34 +36,34 @@ php artisan storage:link
php artisan serve
```
-Visit `/blog`, `/login` and `/admin`. Prebuilt assets ship with the package; the default package UI does not require npm. [Full installation and customization guide](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/docs/installation.md).
+Visit `/blog`, `/login` and `/admin`. Prebuilt assets ship with the package; the default package UI does not require npm. [Full installation and customization guide](docs/installation.md).
## Package and demo are separate
-The reusable package **`programmernomad/laracorekit`** is maintained in [`packages/core`](https://github.com/ProgrammerNomad/LaraCoreKit/tree/aeef46c567f7c54734b20581acee4cd0394cf3e7/packages/core) and exported to the supporting [Composer distribution repository, laracorekit-package](https://github.com/ProgrammerNomad/laracorekit-package). It includes public authentication/blog pages, Filament administration, users, permissions, settings and media.
+The reusable package **`programmernomad/laracorekit`** is maintained in [`packages/core`](packages/core) and exported to the supporting [Composer distribution repository, laracorekit-package](https://github.com/ProgrammerNomad/laracorekit-package). It includes public authentication/blog pages, Filament administration, users, permissions, settings and media.
The optional [demo module](https://packagist.org/packages/programmernomad/laracorekit-demo-module) stays separate. Clone this monorepo to explore the demo or contribute; use the Composer installation above for your own application.
-## Run the refreshed demo / development preview
-
-The refreshed modular demo and documentation source is being integrated through [PR #2](https://github.com/ProgrammerNomad/LaraCoreKit/pull/2). To run the version pictured here before that application change is merged, use its development branch:
+## Run the complete GitHub host
Requires Composer 2, PHP 8.3+ and Node 22.12+ (CI uses Node 24).
```bash
-git clone --branch codex/laracorekit-distribution https://github.com/ProgrammerNomad/LaraCoreKit.git my-app
+git clone https://github.com/ProgrammerNomad/LaraCoreKit.git my-app
cd my-app
+php -r "copy('.env.example', '.env');"
composer install
-npm ci
```
-Copy `.env.example` to `.env`, configure your database, then:
+Laravel is already included in this checkout; do not run `composer create-project` here. Set `APP_URL=http://127.0.0.1:8000` in `.env`. The following local setup uses the default SQLite connection; create its empty database file first. For MySQL, configure your database and credentials instead.
```bash
php artisan key:generate
+php -r "file_exists('database/database.sqlite') || touch('database/database.sqlite');"
php artisan migrate --seed
php artisan laracorekit:admin
php artisan storage:link
+npm ci
npm run build:core
npm run build
php artisan serve
@@ -79,17 +81,17 @@ Normal seeding creates roles, not public sample accounts. Only a disposable demo
| English, Hindi and Arabic language switching | Settings and media attachments |
| RTL-aware shared layout | Configurable modules and view overrides |
-API tokens, enforced email verification, billing, tenancy and a marketplace are not bundled. Check [architecture](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/docs/core/architecture.md) and [production setup](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/docs/deployment/production.md) before adopting.
+API tokens, enforced email verification, billing, tenancy and a marketplace are not bundled. Check [architecture](docs/core/architecture.md) and [production setup](docs/deployment/production.md) before adopting.
## Screenshots
| Public website | Filament administration |
| --- | --- |
-|  |  |
-|  |  |
-|  |  |
+|  |  |
+|  |  |
+|  |  |
-Screenshots show the local demonstration application, including host-only features. Open any image for the full view. See [capture instructions](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/docs/SCREENSHOT_GUIDE.md) to reproduce the screenshots and GIF.
+Screenshots show the local demonstration application, including host-only features. Open any image for the full view. See [capture instructions](docs/SCREENSHOT_GUIDE.md) to reproduce the screenshots and GIF.
## Development and validation
@@ -103,12 +105,12 @@ npm run build:core
npm run build
```
-See [contribution guidelines](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/CONTRIBUTING.md), [upgrade guide](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/docs/upgrade-guide.md), and [package release checklist](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/docs/package-release.md). Keep changes to package code in `packages/core`; site-specific changes belong in the host. Published assets must be rebuilt when their source changes.
+See [contribution guidelines](CONTRIBUTING.md), [upgrade guide](docs/upgrade-guide.md), and [package release checklist](docs/package-release.md). Keep changes to package code in `packages/core`; site-specific changes belong in the host. Published assets must be rebuilt when their source changes.
## Adoption and privacy
-No registration, activation or telemetry is required. Packagist downloads measure distribution activity, not unique developers or active projects. The host includes a validated daily snapshot command and optional scheduler configuration; see [release and metrics setup](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/docs/package-release.md). Contributions, issues and voluntary showcase submissions are welcome. Search engines and AI tools can read server-rendered docs and `/llms.txt`; no ranking or recommendation is promised.
+No registration, activation or telemetry is required. Packagist downloads measure distribution activity, not unique developers or active projects. The host includes a validated daily snapshot command and optional scheduler configuration; see [release and metrics setup](docs/package-release.md). Contributions, issues and voluntary showcase submissions are welcome. Search engines and AI tools can read server-rendered docs and `/llms.txt`; no ranking or recommendation is promised.
## License
-[MIT](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/LICENSE). Report sensitive vulnerabilities through the [security policy](https://github.com/ProgrammerNomad/LaraCoreKit/blob/aeef46c567f7c54734b20581acee4cd0394cf3e7/SECURITY.md).
+[MIT](LICENSE). Report sensitive vulnerabilities through the [security policy](SECURITY.md).
diff --git a/ROADMAP.md b/ROADMAP.md
index a8e1ec0..3e89a64 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -1,175 +1,26 @@
-# LaraCoreKit Roadmap
+# Roadmap
-This document outlines the development roadmap for LaraCoreKit. Items are organized by release version and priority.
+## First standalone package release
-## Version 0.1.0 (Next Release) - Q2 2026
+- [x] Extract reusable public and admin modules into `programmernomad/laracorekit`.
+- [x] Keep demo website, Docs, UIShowcase and sample accounts outside the package.
+- [x] Add configuration/asset installation and interactive administrator creation.
+- [x] Update website, installation docs and module guides around both installation paths.
+- [x] Add independent consumer smoke tests, security regressions and dependency update proposals.
+- [x] Refresh public/admin screenshots using disposable fixtures.
+- [ ] Create/configure the dedicated package repository and export reviewed package source.
+- [ ] Publish a reviewed semantic version tag and register it on Packagist.
+- [ ] Verify a registry-based installation and enable repository branch protections/security settings.
+- [x] Implement validated daily Packagist snapshot collection without install telemetry.
+- [ ] Enable the statistics collector on persistent production storage after publication.
-Focus: Trust, Documentation, and Distribution
+## Next priorities
-### High Priority
-- [ ] Add production screenshots to README and homepage
-- [ ] Create demo walkthrough GIFs
-- [ ] Publish comprehensive module development guide
-- [ ] Add per-page documentation metadata
-- [ ] Publish to Packagist
-- [ ] Submit for Laravel installer support
-- [ ] Create first official GitHub release with release notes
-- [ ] Add code coverage reporting
+- Broader database coverage and additional upload/authorization regression tests.
+- Document and test migration paths for custom existing user models.
+- More complete translations of website marketing copy and accessibility testing of individual showcase examples.
+- Release automation from the monorepo into the dedicated package repository.
-### Medium Priority
-- [ ] Create comparison documentation (vs Larament, vs official starter)
-- [ ] Add FAQ page
-- [ ] Implement structured data for SEO
-- [ ] Add "view source" links in UI showcase
-- [ ] Create video tutorials for installation and basic usage
-- [ ] Enhance demo site with auto-reset banner
+## Optional future work
-### Low Priority
-- [ ] Add more UI component examples
-- [ ] Create example applications repository
-- [ ] Write implementation blog posts
-
-## Version 0.2.0 - Q3 2026
-
-Focus: Enhanced Features and Developer Experience
-
-### Core Improvements
-- [ ] Enhanced test coverage (target: 80%+)
-- [ ] Performance optimization and benchmarking
-- [ ] Improved error handling and logging
-- [ ] Database query optimization
-- [ ] Cache strategy implementation
-
-### Module Enhancements
-- [ ] Blog: Add categories and tags
-- [ ] Blog: Add featured posts and pinning
-- [ ] Blog: Implement reading time estimation
-- [ ] Media: Add image editing capabilities
-- [ ] Media: Bulk upload and management
-- [ ] Settings: Add theme customization options
-- [ ] User: Add user activity tracking
-
-### Developer Tools
-- [ ] Laravel Telescope integration guide
-- [ ] Debugging best practices documentation
-- [ ] Module scaffolding CLI command
-- [ ] Automated module installer command
-
-## Version 0.3.0 - Q4 2026
-
-Focus: Search, Analytics, and Social Features
-
-### New Features
-- [ ] Search module (Meilisearch/Scout integration)
-- [ ] Analytics dashboard module
-- [ ] Notification center module
-- [ ] Social authentication (Google, GitHub, Facebook)
-- [ ] Activity/Audit log module
-- [ ] Email template management
-
-### Platform Improvements
-- [ ] API versioning strategy
-- [ ] Rate limiting configuration
-- [ ] Webhook system
-- [ ] Event sourcing support
-- [ ] Queue optimization
-
-## Version 1.0.0 - Q1 2027
-
-Focus: Production Stability and Module Ecosystem
-
-### Production Readiness
-- [ ] Security audit and penetration testing
-- [ ] Performance benchmarking
-- [ ] Load testing and optimization
-- [ ] Comprehensive upgrade guides
-- [ ] Production deployment guide
-- [ ] Backup and disaster recovery documentation
-
-### Module Marketplace
-- [ ] Module registry/marketplace UI
-- [ ] Module versioning and compatibility system
-- [ ] Module discovery and installation flow
-- [ ] Module review and rating system
-- [ ] Module documentation standards
-
-### Optional Addon Modules
-- [ ] E-commerce module
-- [ ] Payment gateway integrations (Stripe, Razorpay, PayPal)
-- [ ] Teams/multi-tenancy module
-- [ ] Subscription/billing module
-- [ ] Advanced permissions module
-
-## Version 2.0.0 - Future
-
-Focus: Advanced Features and Scalability
-
-### Advanced Features
-- [ ] GraphQL API support
-- [ ] Real-time features with WebSockets
-- [ ] Advanced caching strategies
-- [ ] Multi-database support
-- [ ] Horizontal scaling guide
-- [ ] Microservices architecture option
-
-### Enterprise Features
-- [ ] Advanced audit logging
-- [ ] Compliance tools (GDPR, CCPA)
-- [ ] Advanced backup solutions
-- [ ] High availability setup
-- [ ] Enterprise support options
-
-## Ongoing Priorities
-
-These items are continuously maintained across all versions:
-
-### Documentation
-- Keep all documentation up-to-date
-- Add more examples and use cases
-- Create video tutorials
-- Translate documentation to more languages
-- Improve search and discoverability
-
-### Quality Assurance
-- Maintain high test coverage
-- Regular security updates
-- Performance monitoring
-- Code quality improvements
-- Dependency updates
-
-### Community
-- Respond to issues and discussions
-- Review and merge pull requests
-- Engage with community feedback
-- Highlight community contributions
-- Foster module ecosystem
-
-### SEO & Marketing
-- Regular blog posts and tutorials
-- Social media presence
-- Community showcases
-- Conference presentations
-- Open-source advocacy
-
-## How to Contribute
-
-Want to help with any of these roadmap items?
-
-1. Check the [Issues](https://github.com/ProgrammerNomad/LaraCoreKit/issues) page for tasks
-2. Comment on an issue to express interest
-3. Read the [Contributing Guide](../CONTRIBUTING.md)
-4. Submit a pull request
-
-## Feature Requests
-
-Have an idea not on this roadmap?
-
-1. Check [Discussions](https://github.com/ProgrammerNomad/LaraCoreKit/discussions)
-2. Open a [Feature Request](https://github.com/ProgrammerNomad/LaraCoreKit/issues/new?template=feature_request.md)
-3. Participate in community voting
-
----
-
-**Last Updated:** April 22, 2026
-
-**Note:** This roadmap is subject to change based on community feedback, priorities, and resources. Dates are approximate targets, not commitments.
+Email-verification enforcement, API authentication, billing, tenancy and external search integrations require separate implementation and compatibility testing. These are not claims about current bundled features. No release dates are promised until scope and maintainers are assigned.
diff --git a/SECURITY.md b/SECURITY.md
index a7e5816..2b86909 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,105 +1,19 @@
-# Security Policy
+# Security policy
-## Supported Versions
+The standalone `programmernomad/laracorekit` package is published on Packagist; report issues against the reviewed tag you deploy. Older demo tags do not imply that their dependency lockfiles remain secure; audit and upgrade before deploying.
-We release patches for security vulnerabilities in the following versions:
+## Reporting a vulnerability
-| Version | Supported |
-| ------- | ------------------ |
-| 0.0.2 | :white_check_mark: |
-| 0.0.1 | :x: |
+Report sensitive issues through [GitHub private vulnerability reporting](https://github.com/ProgrammerNomad/LaraCoreKit/security/advisories/new). Include affected commit/version, impact and a minimal reproduction. Do not post secrets or exploitable details in public issues. Repository administrators must enable private reporting if the form is unavailable.
-## Reporting a Vulnerability
+Maintainers will assess reports and coordinate fixes and disclosure. Response and fix times depend on severity and maintainer availability; this project does not provide a guaranteed security-response SLA.
-We take security seriously at LaraCoreKit. If you discover a security vulnerability, please follow these steps:
+## Deployment expectations
-### Where to Report
+- Use reviewed lockfiles and run Composer/npm audits regularly.
+- Set `APP_DEBUG=false`, use HTTPS and keep environment files and logs private.
+- Keep demo mode disabled in customer applications. Never deploy sample credentials or the demo reset scheduler against real data.
+- Create administrators with unique passwords. Review permissions on public Livewire actions and direct admin record routes.
+- Test upload restrictions, mail recovery and data backups for your deployment.
-**DO NOT** create a public GitHub issue for security vulnerabilities.
-
-Instead, please use one of these methods:
-
-**Option 1: GitHub Security Advisories (Recommended)**
-- Go to https://github.com/ProgrammerNomad/LaraCoreKit/security/advisories/new
-- This creates a private security advisory
-
-**Option 2: Private Email**
-- **Email:** Contact the repository owner directly through GitHub
-- **Subject:** [SECURITY] Brief description of the issue
-
-### What to Include
-
-Please provide the following information:
-
-1. **Description** - Clear description of the vulnerability
-2. **Steps to Reproduce** - Detailed steps to reproduce the issue
-3. **Impact** - Potential impact and severity assessment
-4. **Affected Versions** - Which versions of LaraCoreKit are affected
-5. **Suggested Fix** - If you have a fix or mitigation suggestion
-6. **Disclosure Timeline** - Your preferred disclosure timeline
-
-### Response Timeline
-
-- **Initial Response:** Within 48 hours
-- **Status Update:** Within 7 days
-- **Fix Timeline:** Depends on severity
- - Critical: 1-7 days
- - High: 7-14 days
- - Medium: 14-30 days
- - Low: 30-60 days
-
-### Disclosure Policy
-
-We follow responsible disclosure practices:
-
-1. We will acknowledge your email within 48 hours
-2. We will provide a detailed response within 7 days
-3. We will work with you to understand and validate the issue
-4. We will develop and test a fix
-5. We will release a security patch
-6. We will credit you in the release notes (unless you prefer to remain anonymous)
-
-### Security Updates
-
-Security updates will be:
-- Released as patch versions
-- Documented in CHANGELOG.md
-- Announced on GitHub Releases
-- Tagged with `security` label
-
-### Security Best Practices
-
-When using LaraCoreKit:
-
-1. **Keep Updated** - Always use the latest supported version
-2. **Environment Files** - Never commit `.env` files to version control
-3. **Credentials** - Use strong passwords and rotate API keys regularly
-4. **Database** - Run migrations and seeders only in trusted environments
-5. **File Permissions** - Ensure proper file and directory permissions
-6. **Dependencies** - Keep all Composer and NPM dependencies updated
-7. **HTTPS** - Always use HTTPS in production
-8. **Demo Mode** - Never use demo credentials in production
-
-### Scope
-
-This security policy applies to:
-- LaraCoreKit core framework
-- Official modules (Auth, Blog, Core, Media, Settings, User)
-- Official documentation
-- Official demo site
-
-This policy does NOT apply to:
-- Third-party modules
-- Custom implementations
-- Modified versions
-- Development/staging environments
-
-## Hall of Fame
-
-We thank the following researchers for responsibly disclosing security issues:
-
-(No reports yet)
-
----
-
-**Last Updated:** April 22, 2026
+The package requires no activation, telemetry or user registration. The current automated tests are not an independent security audit. Read [production setup](docs/deployment/production.md) before deploying.
diff --git a/app/Console/Commands/CollectPackageStats.php b/app/Console/Commands/CollectPackageStats.php
new file mode 100644
index 0000000..8d7804b
--- /dev/null
+++ b/app/Console/Commands/CollectPackageStats.php
@@ -0,0 +1,60 @@
+toDateString();
+ $path = 'metrics/packagist/'.$day.'.json';
+ $disk = Storage::disk('local');
+ if ($disk->exists($path)) {
+ $this->info('A download snapshot already exists for '.$day.'.');
+
+ return self::SUCCESS;
+ }
+
+ try {
+ $response = Http::timeout(15)->withUserAgent('LaraCoreKit statistics (+https://www.laracorekit.com)')
+ ->get('https://packagist.org/packages/programmernomad/laracorekit/stats.json');
+ if ($response->status() === 404) {
+ $this->line('Package is not registered yet; no snapshot was recorded.');
+
+ return self::SUCCESS;
+ }
+ $response->throw();
+ $downloads = $response->json('downloads');
+ foreach (['total', 'monthly', 'daily'] as $field) {
+ if (! is_array($downloads) || ! isset($downloads[$field]) || ! is_int($downloads[$field]) || $downloads[$field] < 0) {
+ throw new \RuntimeException('Invalid Packagist statistics response.');
+ }
+ }
+ $saved = $disk->put($path, json_encode([
+ 'package' => 'programmernomad/laracorekit',
+ 'collected_at' => now('UTC')->toIso8601String(),
+ 'downloads' => $downloads,
+ 'metric' => 'downloads, not unique developers or installations',
+ ], JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR));
+ if (! $saved) {
+ throw new \RuntimeException('Could not persist download statistics.');
+ }
+ } catch (\Throwable $error) {
+ $this->error('Statistics collection failed; no zero-valued replacement was recorded. '.$error->getMessage());
+
+ return self::FAILURE;
+ }
+
+ $this->info('Download snapshot saved for '.$day.'.');
+
+ return self::SUCCESS;
+ }
+}
diff --git a/app/Console/Commands/GenerateSitemap.php b/app/Console/Commands/GenerateSitemap.php
index c965140..6ee45b1 100644
--- a/app/Console/Commands/GenerateSitemap.php
+++ b/app/Console/Commands/GenerateSitemap.php
@@ -2,130 +2,24 @@
namespace App\Console\Commands;
+use App\Http\Controllers\SitemapController;
use Illuminate\Console\Command;
-use Spatie\Sitemap\SitemapGenerator;
-use Spatie\Sitemap\Tags\Url;
+use Illuminate\Support\Facades\File;
class GenerateSitemap extends Command
{
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
protected $signature = 'sitemap:generate';
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = 'Generate the XML sitemap for search engines.';
+ protected $description = 'Export the dynamic website sitemap to private storage for inspection';
- /**
- * Execute the console command.
- */
- public function handle()
+ public function handle(): int
{
- // Use the configured app url or the local dev server
- $appUrl = config('app.url') === 'http://localhost' ? 'http://127.0.0.1:8000' : config('app.url');
+ $path = storage_path('app/exports/sitemap.xml');
+ File::ensureDirectoryExists(dirname($path));
+ File::put($path, app(SitemapController::class)->index()->getContent());
+ $this->info('Sitemap exported to '.$path);
+ $this->line('Search engines should use the live /sitemap.xml route.');
- $this->info("Crawling {$appUrl} to generate sitemap...");
-
- $sitemap = SitemapGenerator::create($appUrl)
- ->hasCrawled(function (Url $url) {
- // Ignore admin panel and livewire internal routes
- if ($url->segment(1) === 'admin' || $url->segment(1) === 'livewire') {
- return null;
- }
-
- // Set priority and change frequency based on URL patterns
- $path = $url->path();
-
- // Homepage - highest priority
- if ($path === '/') {
- $url->setPriority(1.0)
- ->setChangeFrequency(Url::CHANGE_FREQUENCY_DAILY)
- ->setLastModificationDate(now());
- }
- // Blog posts - high priority, updated frequently
- elseif (str_starts_with($path, '/blog/')) {
- $url->setPriority(0.8)
- ->setChangeFrequency(Url::CHANGE_FREQUENCY_WEEKLY)
- ->setLastModificationDate(now());
- }
- // Main sections (blog, docs, ui-showcase)
- elseif (in_array($path, ['/blog', '/docs', '/ui-showcase'])) {
- $url->setPriority(0.9)
- ->setChangeFrequency(Url::CHANGE_FREQUENCY_DAILY)
- ->setLastModificationDate(now());
- }
- // Documentation pages
- elseif (str_starts_with($path, '/docs/')) {
- $url->setPriority(0.7)
- ->setChangeFrequency(Url::CHANGE_FREQUENCY_WEEKLY)
- ->setLastModificationDate(now());
- }
- // UI Showcase component pages
- elseif (str_starts_with($path, '/ui-showcase/') && substr_count($path, '/') >= 2) {
- $url->setPriority(0.7)
- ->setChangeFrequency(Url::CHANGE_FREQUENCY_WEEKLY)
- ->setLastModificationDate(now());
- }
- // UI Showcase category pages
- elseif (str_starts_with($path, '/ui-showcase/')) {
- $url->setPriority(0.6)
- ->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY)
- ->setLastModificationDate(now());
- }
- // Auth pages (login, register) - lower priority
- elseif (in_array($path, ['/login', '/register', '/forgot-password'])) {
- $url->setPriority(0.3)
- ->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY)
- ->setLastModificationDate(now());
- }
- // Everything else - medium priority
- else {
- $url->setPriority(0.5)
- ->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY)
- ->setLastModificationDate(now());
- }
-
- return $url;
- })
- ->getSitemap();
-
- // Add component URLs from config that might not be crawled
- $categories = config('showcase.components.categories', []);
- foreach ($categories as $categorySlug => $category) {
- if (isset($category['components'])) {
- foreach ($category['components'] as $componentSlug => $component) {
- $componentUrl = "{$appUrl}/ui-showcase/{$categorySlug}/{$componentSlug}";
-
- // Check if URL already exists in sitemap
- $exists = false;
- foreach ($sitemap->getTags() as $tag) {
- if ($tag->url === $componentUrl) {
- $exists = true;
- break;
- }
- }
-
- // Add if it doesn't exist
- if (!$exists) {
- $sitemap->add(
- Url::create($componentUrl)
- ->setPriority(0.7)
- ->setChangeFrequency(Url::CHANGE_FREQUENCY_WEEKLY)
- ->setLastModificationDate(now())
- );
- }
- }
- }
- }
-
- $sitemap->writeToFile(public_path('sitemap.xml'));
-
- $this->info('Sitemap generated successfully in public/sitemap.xml!');
+ return self::SUCCESS;
}
}
diff --git a/app/Filament/Pages/Dashboard.php b/app/Filament/Pages/Dashboard.php
index 444f12d..1892b4b 100644
--- a/app/Filament/Pages/Dashboard.php
+++ b/app/Filament/Pages/Dashboard.php
@@ -4,5 +4,4 @@
use Filament\Pages\Dashboard as BaseDashboard;
-class Dashboard extends BaseDashboard
-{}
+class Dashboard extends BaseDashboard {}
diff --git a/app/Http/Controllers/SitemapController.php b/app/Http/Controllers/SitemapController.php
index 40e2fbb..d00029c 100644
--- a/app/Http/Controllers/SitemapController.php
+++ b/app/Http/Controllers/SitemapController.php
@@ -3,6 +3,8 @@
namespace App\Http\Controllers;
use Illuminate\Http\Response;
+use Modules\Blog\Models\Blog;
+use Modules\Docs\Http\Controllers\DocsController;
class SitemapController extends Controller
{
@@ -11,8 +13,8 @@ public function index(): Response
$blogs = collect();
try {
- $blogs = \Modules\Blog\Models\Blog::query()
- ->where('status', 'published')
+ $blogs = Blog::query()
+ ->published()
->whereNotNull('published_at')
->orderByDesc('published_at')
->get(['slug', 'updated_at', 'published_at']);
@@ -20,8 +22,10 @@ public function index(): Response
// Table may not exist yet during install
}
+ $docs = app(DocsController::class)->publishedPages();
+
return response()
- ->view('sitemap', compact('blogs'))
+ ->view('sitemap', compact('blogs', 'docs'))
->header('Content-Type', 'application/xml; charset=utf-8');
}
}
diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php
index 6ecdd92..bfbf7cf 100644
--- a/app/Http/Middleware/RedirectIfAuthenticated.php
+++ b/app/Http/Middleware/RedirectIfAuthenticated.php
@@ -12,7 +12,7 @@ class RedirectIfAuthenticated
/**
* Handle an incoming request.
*
- * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
+ * @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next, string ...$guards): Response
{
@@ -21,12 +21,12 @@ public function handle(Request $request, Closure $next, string ...$guards): Resp
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
$user = Auth::guard($guard)->user();
-
+
// Redirect based on user role
if ($user->hasRole(['Admin', 'Editor'])) {
return redirect('/admin');
}
-
+
// Regular users go to dashboard
return redirect('/dashboard');
}
diff --git a/modules/Core/src/Http/Livewire/Changelog.php b/app/Livewire/Changelog.php
similarity index 84%
rename from modules/Core/src/Http/Livewire/Changelog.php
rename to app/Livewire/Changelog.php
index 6b414ab..525d3b8 100644
--- a/modules/Core/src/Http/Livewire/Changelog.php
+++ b/app/Livewire/Changelog.php
@@ -1,10 +1,10 @@
changelog = File::get($changelogPath);
} else {
@@ -24,6 +24,6 @@ public function mount()
public function render()
{
- return view('core::livewire.changelog');
+ return view('site.changelog');
}
}
diff --git a/modules/Core/src/Http/Livewire/Home.php b/app/Livewire/Home.php
similarity index 64%
rename from modules/Core/src/Http/Livewire/Home.php
rename to app/Livewire/Home.php
index 64066ce..60bf33b 100644
--- a/modules/Core/src/Http/Livewire/Home.php
+++ b/app/Livewire/Home.php
@@ -1,9 +1,10 @@
latest('published_at')
->take(3)
->get();
@@ -19,8 +20,8 @@ public function render()
$latestPosts = collect();
}
- return view('core::livewire.home', [
- 'latestPosts' => $latestPosts
+ return view('site.home', [
+ 'latestPosts' => $latestPosts,
]);
}
}
diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php
index 4cc4b86..b4fe9ea 100644
--- a/app/Providers/Filament/AdminPanelProvider.php
+++ b/app/Providers/Filament/AdminPanelProvider.php
@@ -2,19 +2,27 @@
namespace App\Providers\Filament;
+use App\Filament\Pages\Dashboard;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\AuthenticateSession;
use Filament\Panel;
use Filament\PanelProvider;
use Filament\Support\Colors\Color;
use Filament\Widgets\AccountWidget;
-use Filament\Widgets\FilamentInfoWidget;
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
use Illuminate\Cookie\Middleware\EncryptCookies;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\View\Middleware\ShareErrorsFromSession;
+use LaraCoreKit\Core\Filament\LocalAvatarProvider;
+use LaraCoreKit\Core\Filament\OverviewStats;
+use LaraCoreKit\DemoModule\Filament\Widgets\DemoBannerWidget;
+use Modules\Blog\Filament\Resources\BlogResource;
+use Modules\Settings\Filament\Pages\Settings;
+use Modules\User\Filament\Resources\Permissions\PermissionResource;
+use Modules\User\Filament\Resources\Roles\RoleResource;
+use Modules\User\Filament\Resources\UserResource;
class AdminPanelProvider extends PanelProvider
{
@@ -28,29 +36,30 @@ public function panel(Panel $panel): Panel
->login()
->authGuard('web')
->brandName('LaraCoreKit')
+ ->defaultAvatarProvider(LocalAvatarProvider::class)
->brandLogo(asset('images/logo.svg'))
+ ->darkModeBrandLogo(asset('images/logo-dark.svg'))
->darkMode(true)
- ->renderHook('panels::body.end', fn() => view('filament.login-placeholders'))
->colors([
'primary' => Color::Red,
'danger' => Color::Red,
])
- ->font('Inter')
->resources([
- \Modules\Blog\Filament\Resources\BlogResource::class,
- \Modules\User\Filament\Resources\UserResource::class,
- \Modules\User\Filament\Resources\Roles\RoleResource::class,
- \Modules\User\Filament\Resources\Permissions\PermissionResource::class,
+ BlogResource::class,
+ UserResource::class,
+ RoleResource::class,
+ PermissionResource::class,
])
->pages([
- \App\Filament\Pages\Dashboard::class,
- \Modules\Settings\Filament\Pages\Settings::class,
+ Dashboard::class,
+ Settings::class,
])
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\Filament\Widgets')
->widgets([
AccountWidget::class,
- FilamentInfoWidget::class,
- \LaraCoreKit\DemoModule\Filament\Widgets\DemoBannerWidget::class,
+ OverviewStats::class,
+ ...(config('demo.enabled') && class_exists(DemoBannerWidget::class)
+ ? [DemoBannerWidget::class] : []),
])
->middleware([
EncryptCookies::class,
diff --git a/app/Providers/ModuleServiceProvider.php b/app/Providers/ModuleServiceProvider.php
deleted file mode 100644
index b892867..0000000
--- a/app/Providers/ModuleServiceProvider.php
+++ /dev/null
@@ -1,27 +0,0 @@
- $moduleConfig) {
- if ($moduleConfig['enabled'] ?? false) {
- $providerClass = $moduleConfig['provider'] ?? null;
- if ($providerClass && class_exists($providerClass)) {
- $this->app->register($providerClass);
- }
- }
- }
- }
-
- public function boot(): void
- {
- //
- }
-}
diff --git a/bootstrap/app.php b/bootstrap/app.php
index dc9585d..610542c 100644
--- a/bootstrap/app.php
+++ b/bootstrap/app.php
@@ -1,5 +1,6 @@
withMiddleware(function (Middleware $middleware) {
- $middleware->web(append: [
- \Modules\Core\Http\Middleware\SetLocale::class,
- ]);
-
+
$middleware->alias([
- 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+ 'guest' => RedirectIfAuthenticated::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
diff --git a/bootstrap/providers.php b/bootstrap/providers.php
index fa67da1..365d3a3 100644
--- a/bootstrap/providers.php
+++ b/bootstrap/providers.php
@@ -1,13 +1,11 @@
=5.3.0"
+ "php": ">=7.4"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9"
+ "phpunit/phpunit": "^6 || ^7 || ^8 || ^9 || ^10"
},
"type": "library",
"extra": {
@@ -3602,22 +3833,22 @@
],
"support": {
"issues": "https://github.com/Masterminds/html5-php/issues",
- "source": "https://github.com/Masterminds/html5-php/tree/2.10.0"
+ "source": "https://github.com/Masterminds/html5-php/tree/2.11.0"
},
- "time": "2025-07-25T09:04:22+00:00"
+ "time": "2026-08-18T06:18:41+00:00"
},
{
"name": "monolog/monolog",
- "version": "3.10.0",
+ "version": "3.12.1",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0"
+ "reference": "d7059e4c691d05ea1222b5124bed0f961be46e15"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0",
- "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/d7059e4c691d05ea1222b5124bed0f961be46e15",
+ "reference": "d7059e4c691d05ea1222b5124bed0f961be46e15",
"shasum": ""
},
"require": {
@@ -3643,6 +3874,7 @@
"phpstan/phpstan-strict-rules": "^2",
"phpunit/phpunit": "^10.5.17 || ^11.0.7",
"predis/predis": "^1.1 || ^2",
+ "psr/clock": "^1.0",
"rollbar/rollbar": "^4.0",
"ruflin/elastica": "^7 || ^8",
"symfony/mailer": "^5.4 || ^6",
@@ -3661,6 +3893,7 @@
"graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
"mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
"php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "psr/clock": "Required to pass a clock to the Logger and control the timestamp of log records",
"rollbar/rollbar": "Allow sending log messages to Rollbar",
"ruflin/elastica": "Allow sending log messages to an Elastic Search server"
},
@@ -3695,7 +3928,7 @@
],
"support": {
"issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/3.10.0"
+ "source": "https://github.com/Seldaek/monolog/tree/3.12.1"
},
"funding": [
{
@@ -3707,20 +3940,20 @@
"type": "tidelift"
}
],
- "time": "2026-01-02T08:56:05+00:00"
+ "time": "2026-09-29T19:21:12+00:00"
},
{
"name": "nesbot/carbon",
- "version": "3.11.4",
+ "version": "3.15.0",
"source": {
"type": "git",
"url": "https://github.com/CarbonPHP/carbon.git",
- "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60"
+ "reference": "217d38553209bdb44e01590d9e9a2e4df8354cce"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60",
- "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/217d38553209bdb44e01590d9e9a2e4df8354cce",
+ "reference": "217d38553209bdb44e01590d9e9a2e4df8354cce",
"shasum": ""
},
"require": {
@@ -3730,6 +3963,7 @@
"psr/clock": "^1.0",
"symfony/clock": "^6.3.12 || ^7.0 || ^8.0",
"symfony/polyfill-mbstring": "^1.0",
+ "symfony/polyfill-time": "^1.0",
"symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0"
},
"provide": {
@@ -3740,7 +3974,7 @@
"doctrine/orm": "^2.15.2 || ^3.0",
"friendsofphp/php-cs-fixer": "^v3.87.1",
"kylekatarnls/multi-tester": "^2.5.3",
- "phpmd/phpmd": "^2.15.0",
+ "phpmd/phpmd": "^3.0@dev",
"phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^2.1.22",
"phpunit/phpunit": "^10.5.53",
@@ -3812,7 +4046,7 @@
"type": "tidelift"
}
],
- "time": "2026-04-07T09:57:54+00:00"
+ "time": "2026-10-18T18:27:53+00:00"
},
{
"name": "nette/php-generator",
@@ -3890,16 +4124,16 @@
},
{
"name": "nette/schema",
- "version": "v1.3.5",
+ "version": "v1.3.6",
"source": {
"type": "git",
"url": "https://github.com/nette/schema.git",
- "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002"
+ "reference": "c54350438cd6914616f790a49cb424605f421562"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002",
- "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002",
+ "url": "https://api.github.com/repos/nette/schema/zipball/c54350438cd6914616f790a49cb424605f421562",
+ "reference": "c54350438cd6914616f790a49cb424605f421562",
"shasum": ""
},
"require": {
@@ -3951,22 +4185,22 @@
],
"support": {
"issues": "https://github.com/nette/schema/issues",
- "source": "https://github.com/nette/schema/tree/v1.3.5"
+ "source": "https://github.com/nette/schema/tree/v1.3.6"
},
- "time": "2026-02-23T03:47:12+00:00"
+ "time": "2026-08-16T21:58:41+00:00"
},
{
"name": "nette/utils",
- "version": "v4.1.3",
+ "version": "v4.1.5",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
- "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe"
+ "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe",
- "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe",
+ "url": "https://api.github.com/repos/nette/utils/zipball/b043439dbdf954e6c28b5ea7e34b0100f83165e0",
+ "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0",
"shasum": ""
},
"require": {
@@ -3986,7 +4220,7 @@
},
"suggest": {
"ext-gd": "to use Image",
- "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-iconv": "to use Strings::chr(), ord() and reverse()",
"ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
"ext-json": "to use Nette\\Utils\\Json",
"ext-mbstring": "to use Strings::lower() etc...",
@@ -4042,80 +4276,25 @@
],
"support": {
"issues": "https://github.com/nette/utils/issues",
- "source": "https://github.com/nette/utils/tree/v4.1.3"
- },
- "time": "2026-02-13T03:05:33+00:00"
- },
- {
- "name": "nicmart/tree",
- "version": "0.10.1",
- "source": {
- "type": "git",
- "url": "https://github.com/nicmart/Tree.git",
- "reference": "2ef11e329d26005ef49dbacd0223bcfd2515b6cc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nicmart/Tree/zipball/2ef11e329d26005ef49dbacd0223bcfd2515b6cc",
- "reference": "2ef11e329d26005ef49dbacd0223bcfd2515b6cc",
- "shasum": ""
- },
- "require": {
- "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0"
- },
- "require-dev": {
- "ergebnis/composer-normalize": "^2.48.2",
- "ergebnis/license": "^2.7.0",
- "ergebnis/php-cs-fixer-config": "^6.28.1",
- "fakerphp/faker": "^1.24.1",
- "infection/infection": "~0.26.19",
- "phpunit/phpunit": "^9.6.19",
- "psalm/plugin-phpunit": "~0.19.0",
- "vimeo/psalm": "^5.26.1"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Tree\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolò Martini",
- "email": "nicmartnic@gmail.com"
- },
- {
- "name": "Andreas Möller",
- "email": "am@localheinz.com"
- }
- ],
- "description": "A basic but flexible php tree data structure and a fluent tree builder implementation.",
- "support": {
- "issues": "https://github.com/nicmart/Tree/issues",
- "source": "https://github.com/nicmart/Tree/tree/0.10.1"
+ "source": "https://github.com/nette/utils/tree/v4.1.5"
},
- "time": "2025-11-25T08:51:01+00:00"
+ "time": "2026-07-17T23:02:45+00:00"
},
{
"name": "nikic/php-parser",
- "version": "v5.7.0",
+ "version": "v5.9.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82"
+ "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82",
- "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def",
+ "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def",
"shasum": ""
},
"require": {
- "ext-ctype": "*",
"ext-json": "*",
"ext-tokenizer": "*",
"php": ">=7.4"
@@ -4154,9 +4333,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.9.0"
},
- "time": "2025-12-06T11:56:16+00:00"
+ "time": "2026-09-13T18:51:52+00:00"
},
{
"name": "nunomaduro/termwind",
@@ -4409,16 +4588,16 @@
},
{
"name": "phpoption/phpoption",
- "version": "1.9.5",
+ "version": "1.10.0",
"source": {
"type": "git",
"url": "https://github.com/schmittjoh/php-option.git",
- "reference": "75365b91986c2405cf5e1e012c5595cd487a98be"
+ "reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be",
- "reference": "75365b91986c2405cf5e1e012c5595cd487a98be",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/67b192b6a42ec03944b972d6e633ddec78ad2c6d",
+ "reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d",
"shasum": ""
},
"require": {
@@ -4426,7 +4605,7 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34"
+ "phpunit/phpunit": "^8.5.54 || ^9.6.36 || ^10.5.64 || ^11.5.56 || ^12.5.33"
},
"type": "library",
"extra": {
@@ -4468,7 +4647,7 @@
],
"support": {
"issues": "https://github.com/schmittjoh/php-option/issues",
- "source": "https://github.com/schmittjoh/php-option/tree/1.9.5"
+ "source": "https://github.com/schmittjoh/php-option/tree/1.10.0"
},
"funding": [
{
@@ -4480,20 +4659,20 @@
"type": "tidelift"
}
],
- "time": "2025-12-27T19:41:33+00:00"
+ "time": "2026-08-24T00:54:40+00:00"
},
{
"name": "pragmarx/google2fa",
- "version": "v9.0.0",
+ "version": "v9.1.0",
"source": {
"type": "git",
"url": "https://github.com/antonioribeiro/google2fa.git",
- "reference": "e6bc62dd6ae83acc475f57912e27466019a1f2cf"
+ "reference": "f00bc788c555adfb6765c437ff3538e59cd88af1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/e6bc62dd6ae83acc475f57912e27466019a1f2cf",
- "reference": "e6bc62dd6ae83acc475f57912e27466019a1f2cf",
+ "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/f00bc788c555adfb6765c437ff3538e59cd88af1",
+ "reference": "f00bc788c555adfb6765c437ff3538e59cd88af1",
"shasum": ""
},
"require": {
@@ -4501,8 +4680,11 @@
"php": "^7.1|^8.0"
},
"require-dev": {
- "phpstan/phpstan": "^1.9",
- "phpunit/phpunit": "^7.5.15|^8.5|^9.0"
+ "phpstan/phpstan": "^1.0|^2.0",
+ "phpstan/phpstan-phpunit": "^1.0|^2.0",
+ "phpunit/phpunit": "~9|~10|~11|~12|~13",
+ "psalm/plugin-phpunit": "^0.19|^0.20",
+ "vimeo/psalm": "^5.26|^6.13"
},
"type": "library",
"autoload": {
@@ -4525,38 +4707,48 @@
"keywords": [
"2fa",
"Authentication",
+ "MFA",
"Two Factor Authentication",
- "google2fa"
+ "google-authenticator",
+ "google2fa",
+ "hotp",
+ "otp",
+ "rfc4226",
+ "rfc6238",
+ "totp"
],
"support": {
+ "docs": "https://github.com/antonioribeiro/google2fa#readme",
"issues": "https://github.com/antonioribeiro/google2fa/issues",
- "source": "https://github.com/antonioribeiro/google2fa/tree/v9.0.0"
+ "security": "https://github.com/antonioribeiro/google2fa/security/policy",
+ "source": "https://github.com/antonioribeiro/google2fa"
},
- "time": "2025-09-19T22:51:08+00:00"
+ "time": "2026-08-15T13:22:01+00:00"
},
{
"name": "pragmarx/google2fa-qrcode",
- "version": "v3.0.0",
+ "version": "v4.0.0",
"source": {
"type": "git",
"url": "https://github.com/antonioribeiro/google2fa-qrcode.git",
- "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b"
+ "reference": "16159f84fa0838c276f35d46de57fd90dfbb385c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/ce4d8a729b6c93741c607cfb2217acfffb5bf76b",
- "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b",
+ "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/16159f84fa0838c276f35d46de57fd90dfbb385c",
+ "reference": "16159f84fa0838c276f35d46de57fd90dfbb385c",
"shasum": ""
},
"require": {
- "php": ">=7.1",
- "pragmarx/google2fa": ">=4.0"
+ "php": "^8.1",
+ "pragmarx/google2fa": "^8.0|^9.0"
},
"require-dev": {
- "bacon/bacon-qr-code": "^2.0",
- "chillerlan/php-qrcode": "^1.0|^2.0|^3.0|^4.0",
+ "bacon/bacon-qr-code": "^2.0|^3.0",
+ "chillerlan/php-qrcode": "^5.0|^6.0",
"khanamiryan/qrcode-detector-decoder": "^1.0",
- "phpunit/phpunit": "~4|~5|~6|~7|~8|~9"
+ "phpstan/phpstan": "^2.0",
+ "phpunit/phpunit": "~9|~10|~11|~12|~13"
},
"suggest": {
"bacon/bacon-qr-code": "For QR Code generation, requires imagick",
@@ -4597,51 +4789,54 @@
],
"support": {
"issues": "https://github.com/antonioribeiro/google2fa-qrcode/issues",
- "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/v3.0.0"
+ "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/v4.0.0"
},
- "time": "2021-08-15T12:53:48+00:00"
+ "time": "2026-05-08T19:24:44+00:00"
},
{
- "name": "programmernomad/laracorekit-demo-module",
- "version": "v1.0.5",
- "source": {
- "type": "git",
- "url": "https://github.com/ProgrammerNomad/laracorekit-demo-module.git",
- "reference": "7237b3b79d8b5927ba17feed39fc030a40e0a34f"
- },
+ "name": "programmernomad/laracorekit",
+ "version": "dev-main",
"dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/ProgrammerNomad/laracorekit-demo-module/zipball/7237b3b79d8b5927ba17feed39fc030a40e0a34f",
- "reference": "7237b3b79d8b5927ba17feed39fc030a40e0a34f",
- "shasum": ""
+ "type": "path",
+ "url": "packages/core",
+ "reference": "5ebe60c79a9ba823b081caa1516ba2462f354b9f"
},
"require": {
- "illuminate/console": "^11.0|^12.0|^13.0",
- "illuminate/database": "^11.0|^12.0|^13.0",
- "illuminate/filesystem": "^11.0|^12.0|^13.0",
- "illuminate/support": "^11.0|^12.0|^13.0",
- "php": "^8.2|^8.3"
- },
- "require-dev": {
- "filament/filament": "^3.0|^4.0|^5.0",
- "laravel/pint": "^1.0",
- "orchestra/testbench": "^9.0|^10.0",
- "phpunit/phpunit": "^11.0"
+ "filament/filament": "^5.10",
+ "laravel/framework": "^13.37",
+ "livewire/livewire": "^4.4",
+ "php": "^8.3",
+ "spatie/laravel-medialibrary": "^11.23",
+ "spatie/laravel-permission": "^6.23"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
- "LaraCoreKit\\DemoModule\\DemoServiceProvider"
+ "LaraCoreKit\\Core\\CoreServiceProvider"
]
}
},
"autoload": {
"psr-4": {
- "LaraCoreKit\\DemoModule\\": "src/"
+ "LaraCoreKit\\Core\\": "src/",
+ "Modules\\Core\\": "modules/Core/src/",
+ "Modules\\Auth\\": "modules/Auth/src/",
+ "Modules\\User\\Database\\Seeders\\": "modules/User/database/seeders/",
+ "Modules\\User\\Database\\Factories\\": "modules/User/database/factories/",
+ "Modules\\User\\": "modules/User/src/",
+ "Modules\\Settings\\": "modules/Settings/src/",
+ "Modules\\Media\\": "modules/Media/src/",
+ "Modules\\Blog\\": "modules/Blog/src/"
}
},
- "notification-url": "https://packagist.org/downloads/",
+ "archive": {
+ "exclude": [
+ "/tests",
+ "/phpunit.xml",
+ "/.github"
+ ]
+ },
"license": [
"MIT"
],
@@ -4651,15 +4846,84 @@
"homepage": "https://github.com/ProgrammerNomad"
}
],
- "description": "Auto-resetting demo environment for Laravel applications with Filament integration",
- "homepage": "https://github.com/ProgrammerNomad/laracorekit-demo-module",
+ "description": "Modular Laravel application foundation with Filament administration, authentication, roles, settings, blog and media.",
+ "homepage": "https://www.laracorekit.com",
"keywords": [
- "auto-reset",
- "demo",
"filament",
"laracorekit",
"laravel",
- "module"
+ "livewire",
+ "modular",
+ "starter-kit"
+ ],
+ "support": {
+ "source": "https://github.com/ProgrammerNomad/laracorekit-package",
+ "issues": "https://github.com/ProgrammerNomad/LaraCoreKit/issues"
+ },
+ "transport-options": {
+ "symlink": true,
+ "relative": true
+ }
+ },
+ {
+ "name": "programmernomad/laracorekit-demo-module",
+ "version": "v1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ProgrammerNomad/laracorekit-demo-module.git",
+ "reference": "7237b3b79d8b5927ba17feed39fc030a40e0a34f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ProgrammerNomad/laracorekit-demo-module/zipball/7237b3b79d8b5927ba17feed39fc030a40e0a34f",
+ "reference": "7237b3b79d8b5927ba17feed39fc030a40e0a34f",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/console": "^11.0|^12.0|^13.0",
+ "illuminate/database": "^11.0|^12.0|^13.0",
+ "illuminate/filesystem": "^11.0|^12.0|^13.0",
+ "illuminate/support": "^11.0|^12.0|^13.0",
+ "php": "^8.2|^8.3"
+ },
+ "require-dev": {
+ "filament/filament": "^3.0|^4.0|^5.0",
+ "laravel/pint": "^1.0",
+ "orchestra/testbench": "^9.0|^10.0",
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "LaraCoreKit\\DemoModule\\DemoServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "LaraCoreKit\\DemoModule\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "ProgrammerNomad",
+ "homepage": "https://github.com/ProgrammerNomad"
+ }
+ ],
+ "description": "Auto-resetting demo environment for Laravel applications with Filament integration",
+ "homepage": "https://github.com/ProgrammerNomad/laracorekit-demo-module",
+ "keywords": [
+ "auto-reset",
+ "demo",
+ "filament",
+ "laracorekit",
+ "laravel",
+ "module"
],
"support": {
"issues": "https://github.com/ProgrammerNomad/laracorekit-demo-module/issues",
@@ -5081,16 +5345,16 @@
},
{
"name": "psy/psysh",
- "version": "v0.12.22",
+ "version": "v0.12.24",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
- "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f"
+ "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3be75d5b9244936dd4ac62ade2bfb004d13acf0f",
- "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1",
+ "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1",
"shasum": ""
},
"require": {
@@ -5154,53 +5418,9 @@
],
"support": {
"issues": "https://github.com/bobthecow/psysh/issues",
- "source": "https://github.com/bobthecow/psysh/tree/v0.12.22"
- },
- "time": "2026-03-22T23:03:24+00:00"
- },
- {
- "name": "ralouphie/getallheaders",
- "version": "3.0.3",
- "source": {
- "type": "git",
- "url": "https://github.com/ralouphie/getallheaders.git",
- "reference": "120b605dfeb996808c31b6477290a714d356e822"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
- "reference": "120b605dfeb996808c31b6477290a714d356e822",
- "shasum": ""
- },
- "require": {
- "php": ">=5.6"
- },
- "require-dev": {
- "php-coveralls/php-coveralls": "^2.1",
- "phpunit/phpunit": "^5 || ^6.5"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/getallheaders.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Ralph Khattar",
- "email": "ralph.khattar@gmail.com"
- }
- ],
- "description": "A polyfill for getallheaders.",
- "support": {
- "issues": "https://github.com/ralouphie/getallheaders/issues",
- "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ "source": "https://github.com/bobthecow/psysh/tree/v0.12.24"
},
- "time": "2019-03-08T08:55:37+00:00"
+ "time": "2026-06-29T15:41:09+00:00"
},
{
"name": "ramsey/collection",
@@ -5280,20 +5500,20 @@
},
{
"name": "ramsey/uuid",
- "version": "4.9.2",
+ "version": "4.9.4",
"source": {
"type": "git",
"url": "https://github.com/ramsey/uuid.git",
- "reference": "8429c78ca35a09f27565311b98101e2826affde0"
+ "reference": "75d73f48d02797c2c285a7e9f348fadc0102ffe2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0",
- "reference": "8429c78ca35a09f27565311b98101e2826affde0",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/75d73f48d02797c2c285a7e9f348fadc0102ffe2",
+ "reference": "75d73f48d02797c2c285a7e9f348fadc0102ffe2",
"shasum": ""
},
"require": {
- "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14",
+ "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14 || ^0.15 || ^0.16 || ^0.17 || ^0.18 || ^0.19 || ^0.20 || ^1.0",
"php": "^8.0",
"ramsey/collection": "^1.2 || ^2.0"
},
@@ -5352,9 +5572,9 @@
],
"support": {
"issues": "https://github.com/ramsey/uuid/issues",
- "source": "https://github.com/ramsey/uuid/tree/4.9.2"
+ "source": "https://github.com/ramsey/uuid/tree/4.9.4"
},
- "time": "2025-12-14T04:43:48+00:00"
+ "time": "2026-09-16T11:39:30+00:00"
},
{
"name": "ryangjchandler/blade-capture-directive",
@@ -5512,154 +5732,18 @@
],
"time": "2022-12-17T21:53:22+00:00"
},
- {
- "name": "spatie/browsershot",
- "version": "5.2.3",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/browsershot.git",
- "reference": "d2e4ac7c69162999940172a674bf83ddc5ac59ea"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/browsershot/zipball/d2e4ac7c69162999940172a674bf83ddc5ac59ea",
- "reference": "d2e4ac7c69162999940172a674bf83ddc5ac59ea",
- "shasum": ""
- },
- "require": {
- "ext-fileinfo": "*",
- "ext-json": "*",
- "php": "^8.2",
- "spatie/temporary-directory": "^2.0",
- "symfony/process": "^6.0|^7.0|^8.0"
- },
- "require-dev": {
- "pestphp/pest": "^3.0|^4.0",
- "spatie/image": "^3.6",
- "spatie/pdf-to-text": "^1.52",
- "spatie/phpunit-snapshot-assertions": "^5.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Spatie\\Browsershot\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "homepage": "https://github.com/freekmurze",
- "role": "Developer"
- }
- ],
- "description": "Convert a webpage to an image or pdf using headless Chrome",
- "homepage": "https://github.com/spatie/browsershot",
- "keywords": [
- "chrome",
- "convert",
- "headless",
- "image",
- "pdf",
- "puppeteer",
- "screenshot",
- "webpage"
- ],
- "support": {
- "source": "https://github.com/spatie/browsershot/tree/5.2.3"
- },
- "funding": [
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2026-02-18T16:10:58+00:00"
- },
- {
- "name": "spatie/crawler",
- "version": "8.5.0",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/crawler.git",
- "reference": "18198a2198adff1637c0028cb60d2c9559721556"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/crawler/zipball/18198a2198adff1637c0028cb60d2c9559721556",
- "reference": "18198a2198adff1637c0028cb60d2c9559721556",
- "shasum": ""
- },
- "require": {
- "guzzlehttp/guzzle": "^7.3",
- "guzzlehttp/psr7": "^2.0",
- "illuminate/collections": "^10.0|^11.0|^12.0|^13.0",
- "nicmart/tree": "^0.10",
- "php": "^8.2",
- "spatie/browsershot": "^5.0.5",
- "spatie/robots-txt": "^2.0",
- "symfony/dom-crawler": "^6.0|^7.0|^8.0"
- },
- "require-dev": {
- "pestphp/pest": "^2.0|^3.0|^4.0",
- "spatie/ray": "^1.37"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Spatie\\Crawler\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be"
- }
- ],
- "description": "Crawl all internal links found on a website",
- "homepage": "https://github.com/spatie/crawler",
- "keywords": [
- "crawler",
- "link",
- "spatie",
- "website"
- ],
- "support": {
- "issues": "https://github.com/spatie/crawler/issues",
- "source": "https://github.com/spatie/crawler/tree/8.5.0"
- },
- "funding": [
- {
- "url": "https://spatie.be/open-source/support-us",
- "type": "custom"
- },
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2026-02-21T22:52:37+00:00"
- },
{
"name": "spatie/image",
- "version": "3.9.4",
+ "version": "3.9.7",
"source": {
"type": "git",
"url": "https://github.com/spatie/image.git",
- "reference": "6a322b5e9268e3903d4fb6e1ff08b7dcc3aa9429"
+ "reference": "5450a2f63f315d56453fbbf58f5dacaecbf48dd4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/image/zipball/6a322b5e9268e3903d4fb6e1ff08b7dcc3aa9429",
- "reference": "6a322b5e9268e3903d4fb6e1ff08b7dcc3aa9429",
+ "url": "https://api.github.com/repos/spatie/image/zipball/5450a2f63f315d56453fbbf58f5dacaecbf48dd4",
+ "reference": "5450a2f63f315d56453fbbf58f5dacaecbf48dd4",
"shasum": ""
},
"require": {
@@ -5672,8 +5756,10 @@
"symfony/process": "^6.4|^7.0|^8.0"
},
"require-dev": {
+ "ext-ffi": "*",
"ext-gd": "*",
"ext-imagick": "*",
+ "jcupitt/vips": "^2.4",
"laravel/sail": "^1.34",
"pestphp/pest": "^3.0|^4.0",
"phpstan/phpstan": "^1.10.50",
@@ -5707,7 +5793,7 @@
"spatie"
],
"support": {
- "source": "https://github.com/spatie/image/tree/3.9.4"
+ "source": "https://github.com/spatie/image/tree/3.9.7"
},
"funding": [
{
@@ -5719,25 +5805,25 @@
"type": "github"
}
],
- "time": "2026-03-13T14:23:45+00:00"
+ "time": "2026-09-30T07:06:27+00:00"
},
{
"name": "spatie/image-optimizer",
- "version": "1.8.1",
+ "version": "1.10.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/image-optimizer.git",
- "reference": "2ad9ac7c19501739183359ae64ea6c15869c23d9"
+ "reference": "333c03952289dc2df0a91874636a0dffeb5b6aec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/2ad9ac7c19501739183359ae64ea6c15869c23d9",
- "reference": "2ad9ac7c19501739183359ae64ea6c15869c23d9",
+ "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/333c03952289dc2df0a91874636a0dffeb5b6aec",
+ "reference": "333c03952289dc2df0a91874636a0dffeb5b6aec",
"shasum": ""
},
"require": {
"ext-fileinfo": "*",
- "php": "^7.3|^8.0",
+ "php": "^7.4|^8.0",
"psr/log": "^1.0 | ^2.0 | ^3.0",
"symfony/process": "^4.2|^5.0|^6.0|^7.0|^8.0"
},
@@ -5772,22 +5858,22 @@
],
"support": {
"issues": "https://github.com/spatie/image-optimizer/issues",
- "source": "https://github.com/spatie/image-optimizer/tree/1.8.1"
+ "source": "https://github.com/spatie/image-optimizer/tree/1.10.0"
},
- "time": "2025-11-26T10:57:19+00:00"
+ "time": "2026-06-29T08:28:30+00:00"
},
{
"name": "spatie/invade",
- "version": "2.1.0",
+ "version": "2.1.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/invade.git",
- "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63"
+ "reference": "f929c7b6e75fceeefa7b41a491e91274bafb17af"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/invade/zipball/b920f6411d21df4e8610a138e2e87ae4957d7f63",
- "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63",
+ "url": "https://api.github.com/repos/spatie/invade/zipball/f929c7b6e75fceeefa7b41a491e91274bafb17af",
+ "reference": "f929c7b6e75fceeefa7b41a491e91274bafb17af",
"shasum": ""
},
"require": {
@@ -5825,7 +5911,7 @@
"spatie"
],
"support": {
- "source": "https://github.com/spatie/invade/tree/2.1.0"
+ "source": "https://github.com/spatie/invade/tree/2.1.1"
},
"funding": [
{
@@ -5833,20 +5919,20 @@
"type": "github"
}
],
- "time": "2024-05-17T09:06:10+00:00"
+ "time": "2026-08-24T12:39:05+00:00"
},
{
"name": "spatie/laravel-medialibrary",
- "version": "11.21.0",
+ "version": "11.23.9",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-medialibrary.git",
- "reference": "d6e2595033ffd130d4dd5d124510ab3304794c44"
+ "reference": "afe6e389994ada7f33b731a837ea79301a7ec6c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/d6e2595033ffd130d4dd5d124510ab3304794c44",
- "reference": "d6e2595033ffd130d4dd5d124510ab3304794c44",
+ "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/afe6e389994ada7f33b731a837ea79301a7ec6c1",
+ "reference": "afe6e389994ada7f33b731a837ea79301a7ec6c1",
"shasum": ""
},
"require": {
@@ -5931,7 +6017,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-medialibrary/issues",
- "source": "https://github.com/spatie/laravel-medialibrary/tree/11.21.0"
+ "source": "https://github.com/spatie/laravel-medialibrary/tree/11.23.9"
},
"funding": [
{
@@ -5943,20 +6029,20 @@
"type": "github"
}
],
- "time": "2026-02-21T15:58:56+00:00"
+ "time": "2026-10-05T08:08:06+00:00"
},
{
"name": "spatie/laravel-package-tools",
- "version": "1.93.0",
+ "version": "1.93.3",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-package-tools.git",
- "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7"
+ "reference": "7aeef26bd8d4909bec744dbf47aee7d1395588c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/0d097bce95b2bf6802fb1d83e1e753b0f5a948e7",
- "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7",
+ "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/7aeef26bd8d4909bec744dbf47aee7d1395588c1",
+ "reference": "7aeef26bd8d4909bec744dbf47aee7d1395588c1",
"shasum": ""
},
"require": {
@@ -5996,7 +6082,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-package-tools/issues",
- "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.0"
+ "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.3"
},
"funding": [
{
@@ -6004,7 +6090,7 @@
"type": "github"
}
],
- "time": "2026-02-21T12:49:54+00:00"
+ "time": "2026-09-28T07:16:50+00:00"
},
{
"name": "spatie/laravel-permission",
@@ -6091,47 +6177,35 @@
"time": "2026-03-17T22:46:46+00:00"
},
{
- "name": "spatie/laravel-sitemap",
- "version": "8.0.0",
+ "name": "spatie/shiki-php",
+ "version": "2.4.0",
"source": {
"type": "git",
- "url": "https://github.com/spatie/laravel-sitemap.git",
- "reference": "8c79e1420a6f41405707ea7d00bb6cc10160c0ac"
+ "url": "https://github.com/spatie/shiki-php.git",
+ "reference": "b8b0ca32d3a82bc5c533e68ffab96c5d4ec1b9ba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-sitemap/zipball/8c79e1420a6f41405707ea7d00bb6cc10160c0ac",
- "reference": "8c79e1420a6f41405707ea7d00bb6cc10160c0ac",
+ "url": "https://api.github.com/repos/spatie/shiki-php/zipball/b8b0ca32d3a82bc5c533e68ffab96c5d4ec1b9ba",
+ "reference": "b8b0ca32d3a82bc5c533e68ffab96c5d4ec1b9ba",
"shasum": ""
},
"require": {
- "guzzlehttp/guzzle": "^7.8",
- "illuminate/support": "^11.0|^12.0||^13.0",
- "nesbot/carbon": "^2.71|^3.0",
- "php": "^8.2||^8.3||^8.4||^8.5",
- "spatie/crawler": "^8.0.1",
- "spatie/laravel-package-tools": "^1.16.1",
- "symfony/dom-crawler": "^6.3.4|^7.0|^8.0"
+ "ext-json": "*",
+ "php": "^8.0",
+ "symfony/process": "^5.4|^6.4|^7.1|^8.0"
},
"require-dev": {
- "mockery/mockery": "^1.6.6",
- "orchestra/testbench": "^9.0|^10.0||^11.0",
- "pestphp/pest": "^3.7.4|^4.0",
- "spatie/pest-plugin-snapshots": "^2.1",
- "spatie/phpunit-snapshot-assertions": "^5.1.2",
- "spatie/temporary-directory": "^2.2"
+ "friendsofphp/php-cs-fixer": "^v3.0",
+ "pestphp/pest": "^1.8",
+ "phpunit/phpunit": "^9.5",
+ "spatie/pest-plugin-snapshots": "^1.1",
+ "spatie/ray": "^1.10"
},
"type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Spatie\\Sitemap\\SitemapServiceProvider"
- ]
- }
- },
"autoload": {
"psr-4": {
- "Spatie\\Sitemap\\": "src"
+ "Spatie\\ShikiPhp\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -6139,54 +6213,58 @@
"MIT"
],
"authors": [
+ {
+ "name": "Rias Van der Veken",
+ "email": "rias@spatie.be",
+ "role": "Developer"
+ },
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
- "homepage": "https://spatie.be",
"role": "Developer"
}
],
- "description": "Create and generate sitemaps with ease",
- "homepage": "https://github.com/spatie/laravel-sitemap",
+ "description": "Highlight code using Shiki in PHP",
+ "homepage": "https://github.com/spatie/shiki-php",
"keywords": [
- "laravel-sitemap",
+ "shiki",
"spatie"
],
"support": {
- "source": "https://github.com/spatie/laravel-sitemap/tree/8.0.0"
+ "source": "https://github.com/spatie/shiki-php/tree/2.4.0"
},
"funding": [
{
- "url": "https://spatie.be/open-source/support-us",
- "type": "custom"
+ "url": "https://github.com/spatie",
+ "type": "github"
}
],
- "time": "2026-02-21T23:01:14+00:00"
+ "time": "2026-04-27T14:27:52+00:00"
},
{
- "name": "spatie/robots-txt",
- "version": "2.5.4",
+ "name": "spatie/temporary-directory",
+ "version": "2.4.0",
"source": {
"type": "git",
- "url": "https://github.com/spatie/robots-txt.git",
- "reference": "a8dd35d0a94e863f52509a366a634978e9c1db03"
+ "url": "https://github.com/spatie/temporary-directory.git",
+ "reference": "32cbb9645b28839cf4f476708e99a2c70e6802c9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/robots-txt/zipball/a8dd35d0a94e863f52509a366a634978e9c1db03",
- "reference": "a8dd35d0a94e863f52509a366a634978e9c1db03",
+ "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/32cbb9645b28839cf4f476708e99a2c70e6802c9",
+ "reference": "32cbb9645b28839cf4f476708e99a2c70e6802c9",
"shasum": ""
},
"require": {
- "php": "^8.1"
+ "php": "^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^11.5.2"
+ "phpunit/phpunit": "^9.5"
},
"type": "library",
"autoload": {
"psr-4": {
- "Spatie\\Robots\\": "src"
+ "Spatie\\TemporaryDirectory\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -6195,21 +6273,22 @@
],
"authors": [
{
- "name": "Brent Roose",
- "email": "brent@spatie.be",
+ "name": "Alex Vanderbist",
+ "email": "alex@spatie.be",
"homepage": "https://spatie.be",
"role": "Developer"
}
],
- "description": "Determine if a page may be crawled from robots.txt and robots meta tags",
- "homepage": "https://github.com/spatie/robots-txt",
+ "description": "Easily create, use and destroy temporary directories",
+ "homepage": "https://github.com/spatie/temporary-directory",
"keywords": [
- "robots-txt",
- "spatie"
+ "php",
+ "spatie",
+ "temporary-directory"
],
"support": {
- "issues": "https://github.com/spatie/robots-txt/issues",
- "source": "https://github.com/spatie/robots-txt/tree/2.5.4"
+ "issues": "https://github.com/spatie/temporary-directory/issues",
+ "source": "https://github.com/spatie/temporary-directory/tree/2.4.0"
},
"funding": [
{
@@ -6221,161 +6300,35 @@
"type": "github"
}
],
- "time": "2026-02-25T07:59:20+00:00"
+ "time": "2026-06-22T07:55:44+00:00"
},
{
- "name": "spatie/shiki-php",
- "version": "2.3.3",
+ "name": "symfony/clock",
+ "version": "v7.4.21",
"source": {
"type": "git",
- "url": "https://github.com/spatie/shiki-php.git",
- "reference": "9d50ff4d9825d87d3283a6695c65ae9c3c3caa6b"
+ "url": "https://github.com/symfony/clock.git",
+ "reference": "07437f612dca89c1894c1db04491002b1e798f03"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/shiki-php/zipball/9d50ff4d9825d87d3283a6695c65ae9c3c3caa6b",
- "reference": "9d50ff4d9825d87d3283a6695c65ae9c3c3caa6b",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/07437f612dca89c1894c1db04491002b1e798f03",
+ "reference": "07437f612dca89c1894c1db04491002b1e798f03",
"shasum": ""
},
"require": {
- "ext-json": "*",
- "php": "^8.0",
- "symfony/process": "^5.4|^6.4|^7.1|^8.0"
+ "php": ">=8.2",
+ "psr/clock": "^1.0",
+ "symfony/polyfill-php83": "^1.28"
},
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^v3.0",
- "pestphp/pest": "^1.8",
- "phpunit/phpunit": "^9.5",
- "spatie/pest-plugin-snapshots": "^1.1",
- "spatie/ray": "^1.10"
+ "provide": {
+ "psr/clock-implementation": "1.0"
},
"type": "library",
"autoload": {
- "psr-4": {
- "Spatie\\ShikiPhp\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Rias Van der Veken",
- "email": "rias@spatie.be",
- "role": "Developer"
- },
- {
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "role": "Developer"
- }
- ],
- "description": "Highlight code using Shiki in PHP",
- "homepage": "https://github.com/spatie/shiki-php",
- "keywords": [
- "shiki",
- "spatie"
- ],
- "support": {
- "source": "https://github.com/spatie/shiki-php/tree/2.3.3"
- },
- "funding": [
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2026-02-01T09:30:04+00:00"
- },
- {
- "name": "spatie/temporary-directory",
- "version": "2.3.1",
- "source": {
- "type": "git",
- "url": "https://github.com/spatie/temporary-directory.git",
- "reference": "662e481d6ec07ef29fd05010433428851a42cd07"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/662e481d6ec07ef29fd05010433428851a42cd07",
- "reference": "662e481d6ec07ef29fd05010433428851a42cd07",
- "shasum": ""
- },
- "require": {
- "php": "^8.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.5"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Spatie\\TemporaryDirectory\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Alex Vanderbist",
- "email": "alex@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
- }
- ],
- "description": "Easily create, use and destroy temporary directories",
- "homepage": "https://github.com/spatie/temporary-directory",
- "keywords": [
- "php",
- "spatie",
- "temporary-directory"
- ],
- "support": {
- "issues": "https://github.com/spatie/temporary-directory/issues",
- "source": "https://github.com/spatie/temporary-directory/tree/2.3.1"
- },
- "funding": [
- {
- "url": "https://spatie.be/open-source/support-us",
- "type": "custom"
- },
- {
- "url": "https://github.com/spatie",
- "type": "github"
- }
- ],
- "time": "2026-01-12T07:42:22+00:00"
- },
- {
- "name": "symfony/clock",
- "version": "v7.4.8",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/clock.git",
- "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111",
- "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111",
- "shasum": ""
- },
- "require": {
- "php": ">=8.2",
- "psr/clock": "^1.0",
- "symfony/polyfill-php83": "^1.28"
- },
- "provide": {
- "psr/clock-implementation": "1.0"
- },
- "type": "library",
- "autoload": {
- "files": [
- "Resources/now.php"
- ],
+ "files": [
+ "Resources/now.php"
+ ],
"psr-4": {
"Symfony\\Component\\Clock\\": ""
},
@@ -6405,7 +6358,7 @@
"time"
],
"support": {
- "source": "https://github.com/symfony/clock/tree/v7.4.8"
+ "source": "https://github.com/symfony/clock/tree/v7.4.21"
},
"funding": [
{
@@ -6425,20 +6378,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-10-12T14:31:36+00:00"
},
{
"name": "symfony/console",
- "version": "v7.4.8",
+ "version": "v7.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707"
+ "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707",
- "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707",
+ "url": "https://api.github.com/repos/symfony/console/zipball/21f1bc2296f7ff6043241a8dcbc09559b3732820",
+ "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820",
"shasum": ""
},
"require": {
@@ -6503,7 +6456,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.4.8"
+ "source": "https://github.com/symfony/console/tree/v7.4.21"
},
"funding": [
{
@@ -6523,20 +6476,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T13:54:39+00:00"
+ "time": "2026-10-12T18:45:38+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v7.4.8",
+ "version": "v7.4.18",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "b055f228a4178a1d6774909903905e3475f3eac8"
+ "reference": "fecf40067fc8d8880ea87b8ac227600b9aadd1d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/b055f228a4178a1d6774909903905e3475f3eac8",
- "reference": "b055f228a4178a1d6774909903905e3475f3eac8",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/fecf40067fc8d8880ea87b8ac227600b9aadd1d0",
+ "reference": "fecf40067fc8d8880ea87b8ac227600b9aadd1d0",
"shasum": ""
},
"require": {
@@ -6572,7 +6525,7 @@
"description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/css-selector/tree/v7.4.8"
+ "source": "https://github.com/symfony/css-selector/tree/v7.4.18"
},
"funding": [
{
@@ -6592,20 +6545,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-08-23T10:03:40+00:00"
},
{
"name": "symfony/deprecation-contracts",
- "version": "v3.6.0",
+ "version": "v3.7.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
+ "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
- "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d",
+ "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d",
"shasum": ""
},
"require": {
@@ -6618,7 +6571,7 @@
"name": "symfony/contracts"
},
"branch-alias": {
- "dev-main": "3.6-dev"
+ "dev-main": "3.7-dev"
}
},
"autoload": {
@@ -6643,75 +6596,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2024-09-25T14:21:43+00:00"
- },
- {
- "name": "symfony/dom-crawler",
- "version": "v7.4.8",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/dom-crawler.git",
- "reference": "2918e7c2ba964defca1f5b69c6f74886529e2dc8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2918e7c2ba964defca1f5b69c6f74886529e2dc8",
- "reference": "2918e7c2ba964defca1f5b69c6f74886529e2dc8",
- "shasum": ""
- },
- "require": {
- "masterminds/html5": "^2.6",
- "php": ">=8.2",
- "symfony/deprecation-contracts": "^2.5|^3",
- "symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-mbstring": "~1.0"
- },
- "require-dev": {
- "symfony/css-selector": "^6.4|^7.0|^8.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\DomCrawler\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Eases DOM navigation for HTML and XML documents",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/dom-crawler/tree/v7.4.8"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1"
},
"funding": [
{
@@ -6731,20 +6616,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-06-05T06:23:12+00:00"
},
{
"name": "symfony/error-handler",
- "version": "v7.4.8",
+ "version": "v7.4.20",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa"
+ "reference": "82239fe00f7cdc9f17c4166fff4ebdc22bd26ec0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa",
- "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/82239fe00f7cdc9f17c4166fff4ebdc22bd26ec0",
+ "reference": "82239fe00f7cdc9f17c4166fff4ebdc22bd26ec0",
"shasum": ""
},
"require": {
@@ -6793,7 +6678,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v7.4.8"
+ "source": "https://github.com/symfony/error-handler/tree/v7.4.20"
},
"funding": [
{
@@ -6813,20 +6698,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-09-22T18:56:40+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v7.4.8",
+ "version": "v7.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "f57b899fa736fd71121168ef268f23c206083f0a"
+ "reference": "d269974ee93c61d03620ffee358355bfdb471d66"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f57b899fa736fd71121168ef268f23c206083f0a",
- "reference": "f57b899fa736fd71121168ef268f23c206083f0a",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d269974ee93c61d03620ffee358355bfdb471d66",
+ "reference": "d269974ee93c61d03620ffee358355bfdb471d66",
"shasum": ""
},
"require": {
@@ -6878,7 +6763,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.8"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.17"
},
"funding": [
{
@@ -6898,20 +6783,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T13:54:39+00:00"
+ "time": "2026-08-21T17:40:08+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
- "version": "v3.6.0",
+ "version": "v3.7.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "59eb412e93815df44f05f342958efa9f46b1e586"
+ "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586",
- "reference": "59eb412e93815df44f05f342958efa9f46b1e586",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c7de7a00ffb67842132da02ea92988a39ccd9f4e",
+ "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e",
"shasum": ""
},
"require": {
@@ -6925,7 +6810,7 @@
"name": "symfony/contracts"
},
"branch-alias": {
- "dev-main": "3.6-dev"
+ "dev-main": "3.7-dev"
}
},
"autoload": {
@@ -6958,7 +6843,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0"
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.1"
},
"funding": [
{
@@ -6969,25 +6854,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-09-25T14:21:43+00:00"
+ "time": "2026-06-05T06:23:12+00:00"
},
{
"name": "symfony/finder",
- "version": "v7.4.8",
+ "version": "v7.4.20",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "e0be088d22278583a82da281886e8c3592fbf149"
+ "reference": "2dd31e5208db7a0fda7bfc998ad727b79c2e4d1e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149",
- "reference": "e0be088d22278583a82da281886e8c3592fbf149",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/2dd31e5208db7a0fda7bfc998ad727b79c2e4d1e",
+ "reference": "2dd31e5208db7a0fda7bfc998ad727b79c2e4d1e",
"shasum": ""
},
"require": {
@@ -7022,7 +6911,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v7.4.8"
+ "source": "https://github.com/symfony/finder/tree/v7.4.20"
},
"funding": [
{
@@ -7042,20 +6931,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-09-26T06:31:10+00:00"
},
{
"name": "symfony/html-sanitizer",
- "version": "v7.4.8",
+ "version": "v7.4.20",
"source": {
"type": "git",
"url": "https://github.com/symfony/html-sanitizer.git",
- "reference": "9a79c53c4bf0a8a7b0d3d917fe03eda605ea6438"
+ "reference": "0b7605debddc90c7c9d4e9c1b6eb520a248f26dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/9a79c53c4bf0a8a7b0d3d917fe03eda605ea6438",
- "reference": "9a79c53c4bf0a8a7b0d3d917fe03eda605ea6438",
+ "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/0b7605debddc90c7c9d4e9c1b6eb520a248f26dc",
+ "reference": "0b7605debddc90c7c9d4e9c1b6eb520a248f26dc",
"shasum": ""
},
"require": {
@@ -7096,7 +6985,7 @@
"sanitizer"
],
"support": {
- "source": "https://github.com/symfony/html-sanitizer/tree/v7.4.8"
+ "source": "https://github.com/symfony/html-sanitizer/tree/v7.4.20"
},
"funding": [
{
@@ -7116,20 +7005,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-09-28T05:21:23+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v7.4.8",
+ "version": "v7.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "9381209597ec66c25be154cbf2289076e64d1eab"
+ "reference": "58c89144c7a36dd89c3d01917e9fa3a72d8aaf31"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9381209597ec66c25be154cbf2289076e64d1eab",
- "reference": "9381209597ec66c25be154cbf2289076e64d1eab",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/58c89144c7a36dd89c3d01917e9fa3a72d8aaf31",
+ "reference": "58c89144c7a36dd89c3d01917e9fa3a72d8aaf31",
"shasum": ""
},
"require": {
@@ -7178,7 +7067,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v7.4.8"
+ "source": "https://github.com/symfony/http-foundation/tree/v7.4.21"
},
"funding": [
{
@@ -7198,20 +7087,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-10-08T16:56:12+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v7.4.8",
+ "version": "v7.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "017e76ad089bac281553389269e259e155935e1a"
+ "reference": "4779fce7dedacb8801b2b61c703ef99159502331"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/017e76ad089bac281553389269e259e155935e1a",
- "reference": "017e76ad089bac281553389269e259e155935e1a",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4779fce7dedacb8801b2b61c703ef99159502331",
+ "reference": "4779fce7dedacb8801b2b61c703ef99159502331",
"shasum": ""
},
"require": {
@@ -7269,7 +7158,7 @@
"symfony/validator": "^6.4|^7.0|^8.0",
"symfony/var-dumper": "^6.4|^7.0|^8.0",
"symfony/var-exporter": "^6.4|^7.0|^8.0",
- "twig/twig": "^3.12"
+ "twig/twig": "^3.12|^4.0"
},
"type": "library",
"autoload": {
@@ -7297,7 +7186,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v7.4.8"
+ "source": "https://github.com/symfony/http-kernel/tree/v7.4.21"
},
"funding": [
{
@@ -7317,20 +7206,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-31T20:57:01+00:00"
+ "time": "2026-10-14T06:44:08+00:00"
},
{
"name": "symfony/mailer",
- "version": "v7.4.8",
+ "version": "v7.4.19",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
- "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62"
+ "reference": "6f6f2441bef07a42d2617b9b3aadf04a321aa514"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mailer/zipball/f6ea532250b476bfc1b56699b388a1bdbf168f62",
- "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/6f6f2441bef07a42d2617b9b3aadf04a321aa514",
+ "reference": "6f6f2441bef07a42d2617b9b3aadf04a321aa514",
"shasum": ""
},
"require": {
@@ -7381,7 +7270,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/mailer/tree/v7.4.8"
+ "source": "https://github.com/symfony/mailer/tree/v7.4.19"
},
"funding": [
{
@@ -7401,20 +7290,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-09-15T06:01:15+00:00"
},
{
"name": "symfony/mime",
- "version": "v7.4.8",
+ "version": "v7.4.19",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379"
+ "reference": "f8ac7d0a800bcabbcd1f7de56594cf05e6cd5693"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/6df02f99998081032da3407a8d6c4e1dcb5d4379",
- "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/f8ac7d0a800bcabbcd1f7de56594cf05e6cd5693",
+ "reference": "f8ac7d0a800bcabbcd1f7de56594cf05e6cd5693",
"shasum": ""
},
"require": {
@@ -7438,7 +7327,7 @@
"symfony/process": "^6.4|^7.0|^8.0",
"symfony/property-access": "^6.4|^7.0|^8.0",
"symfony/property-info": "^6.4|^7.0|^8.0",
- "symfony/serializer": "^6.4.3|^7.0.3|^8.0"
+ "symfony/serializer": "^6.4.44|^7.4.17|^8.1.5"
},
"type": "library",
"autoload": {
@@ -7470,7 +7359,7 @@
"mime-type"
],
"support": {
- "source": "https://github.com/symfony/mime/tree/v7.4.8"
+ "source": "https://github.com/symfony/mime/tree/v7.4.19"
},
"funding": [
{
@@ -7490,11 +7379,11 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T14:11:46+00:00"
+ "time": "2026-09-04T10:45:44+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.36.0",
+ "version": "v1.37.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
@@ -7553,7 +7442,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.36.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0"
},
"funding": [
{
@@ -7577,16 +7466,16 @@
},
{
"name": "symfony/polyfill-intl-grapheme",
- "version": "v1.36.0",
+ "version": "v1.43.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df"
+ "reference": "5cac8f4db97208823aa353f59a01faad2da52c75"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/ad1b7b9092976d6c948b8a187cec9faaea9ec1df",
- "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5cac8f4db97208823aa353f59a01faad2da52c75",
+ "reference": "5cac8f4db97208823aa353f59a01faad2da52c75",
"shasum": ""
},
"require": {
@@ -7635,7 +7524,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.36.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.43.0"
},
"funding": [
{
@@ -7655,28 +7544,281 @@
"type": "tidelift"
}
],
- "time": "2026-04-10T16:19:22+00:00"
+ "time": "2026-09-25T15:46:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.43.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "533d68cf99c8f8ee2e8893c59ed59192e92cfd74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/533d68cf99c8f8ee2e8893c59ed59192e92cfd74",
+ "reference": "533d68cf99c8f8ee2e8893c59ed59192e92cfd74",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2",
+ "symfony/polyfill-intl-normalizer": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Trevor Rowbotham",
+ "email": "trevor.rowbotham@pm.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "idn",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.43.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-09-23T14:40:04+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.43.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/ebd57ccc7edb93d632e184efbe7693d2517bab3b",
+ "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.43.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-09-23T22:02:09+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.43.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/4d5d331bf731e0aedbc6b2f5e61135b7b7996a72",
+ "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.43.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-09-24T15:19:04+00:00"
},
{
- "name": "symfony/polyfill-intl-idn",
- "version": "v1.36.0",
+ "name": "symfony/polyfill-php80",
+ "version": "v1.43.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-intl-idn.git",
- "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3"
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "9c6a5d6b01ca51d486c813e9a9c0ed55f208bb74"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3",
- "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/9c6a5d6b01ca51d486c813e9a9c0ed55f208bb74",
+ "reference": "9c6a5d6b01ca51d486c813e9a9c0ed55f208bb74",
"shasum": ""
},
"require": {
- "php": ">=7.2",
- "symfony/polyfill-intl-normalizer": "^1.10"
- },
- "suggest": {
- "ext-intl": "For best performance"
+ "php": ">=7.2"
},
"type": "library",
"extra": {
@@ -7690,8 +7832,11 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Intl\\Idn\\": ""
- }
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -7699,30 +7844,28 @@
],
"authors": [
{
- "name": "Laurent Bassin",
- "email": "laurent@bassin.info"
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
},
{
- "name": "Trevor Rowbotham",
- "email": "trevor.rowbotham@pm.me"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
- "idn",
- "intl",
"polyfill",
"portable",
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.36.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.43.0"
},
"funding": [
{
@@ -7742,28 +7885,25 @@
"type": "tidelift"
}
],
- "time": "2024-09-10T14:38:51+00:00"
+ "time": "2026-09-25T15:50:05+00:00"
},
{
- "name": "symfony/polyfill-intl-normalizer",
- "version": "v1.36.0",
+ "name": "symfony/polyfill-php82",
+ "version": "v1.43.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ "url": "https://github.com/symfony/polyfill-php82.git",
+ "reference": "843bbe8b2a7934307b749751eede0f111f5d1cfc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
- "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/843bbe8b2a7934307b749751eede0f111f5d1cfc",
+ "reference": "843bbe8b2a7934307b749751eede0f111f5d1cfc",
"shasum": ""
},
"require": {
"php": ">=7.2"
},
- "suggest": {
- "ext-intl": "For best performance"
- },
"type": "library",
"extra": {
"thanks": {
@@ -7776,7 +7916,7 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ "Symfony\\Polyfill\\Php82\\": ""
},
"classmap": [
"Resources/stubs"
@@ -7796,18 +7936,16 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "description": "Symfony polyfill backporting some PHP 8.2+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
- "intl",
- "normalizer",
"polyfill",
"portable",
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.36.0"
+ "source": "https://github.com/symfony/polyfill-php82/tree/v1.43.0"
},
"funding": [
{
@@ -7827,32 +7965,25 @@
"type": "tidelift"
}
],
- "time": "2024-09-09T11:45:10+00:00"
+ "time": "2026-09-25T15:50:05+00:00"
},
{
- "name": "symfony/polyfill-mbstring",
- "version": "v1.36.0",
+ "name": "symfony/polyfill-php83",
+ "version": "v1.43.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315"
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "80ccff923a8d61f73ebe9da0aa94e25232f004ce"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315",
- "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/80ccff923a8d61f73ebe9da0aa94e25232f004ce",
+ "reference": "80ccff923a8d61f73ebe9da0aa94e25232f004ce",
"shasum": ""
},
"require": {
- "ext-iconv": "*",
"php": ">=7.2"
},
- "provide": {
- "ext-mbstring": "*"
- },
- "suggest": {
- "ext-mbstring": "For best performance"
- },
"type": "library",
"extra": {
"thanks": {
@@ -7865,8 +7996,11 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- }
+ "Symfony\\Polyfill\\Php83\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -7882,17 +8016,16 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for the Mbstring extension",
+ "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
- "mbstring",
"polyfill",
"portable",
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.36.0"
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.43.0"
},
"funding": [
{
@@ -7912,20 +8045,20 @@
"type": "tidelift"
}
],
- "time": "2026-04-10T17:25:58+00:00"
+ "time": "2026-09-25T15:50:05+00:00"
},
{
- "name": "symfony/polyfill-php80",
- "version": "v1.36.0",
+ "name": "symfony/polyfill-php84",
+ "version": "v1.43.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411"
+ "url": "https://github.com/symfony/polyfill-php84.git",
+ "reference": "22c6548499cbe5c5bb072fc0c42312dff062a015"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411",
- "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411",
+ "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/22c6548499cbe5c5bb072fc0c42312dff062a015",
+ "reference": "22c6548499cbe5c5bb072fc0c42312dff062a015",
"shasum": ""
},
"require": {
@@ -7943,7 +8076,7 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Php80\\": ""
+ "Symfony\\Polyfill\\Php84\\": ""
},
"classmap": [
"Resources/stubs"
@@ -7954,10 +8087,6 @@
"MIT"
],
"authors": [
- {
- "name": "Ion Bazan",
- "email": "ion.bazan@gmail.com"
- },
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
@@ -7967,7 +8096,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
@@ -7976,7 +8105,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.36.0"
+ "source": "https://github.com/symfony/polyfill-php84/tree/v1.43.0"
},
"funding": [
{
@@ -7996,20 +8125,20 @@
"type": "tidelift"
}
],
- "time": "2026-04-10T16:19:22+00:00"
+ "time": "2026-09-23T22:01:09+00:00"
},
{
- "name": "symfony/polyfill-php83",
- "version": "v1.36.0",
+ "name": "symfony/polyfill-php85",
+ "version": "v1.43.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php83.git",
- "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149"
+ "url": "https://github.com/symfony/polyfill-php85.git",
+ "reference": "86a42cbcc07adc331481a5ab310a4024bfc227f6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/3600c2cb22399e25bb226e4a135ce91eeb2a6149",
- "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149",
+ "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/86a42cbcc07adc331481a5ab310a4024bfc227f6",
+ "reference": "86a42cbcc07adc331481a5ab310a4024bfc227f6",
"shasum": ""
},
"require": {
@@ -8027,7 +8156,7 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Php83\\": ""
+ "Symfony\\Polyfill\\Php85\\": ""
},
"classmap": [
"Resources/stubs"
@@ -8047,7 +8176,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
+ "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
@@ -8056,7 +8185,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php83/tree/v1.36.0"
+ "source": "https://github.com/symfony/polyfill-php85/tree/v1.43.0"
},
"funding": [
{
@@ -8076,20 +8205,20 @@
"type": "tidelift"
}
],
- "time": "2026-04-10T17:25:58+00:00"
+ "time": "2026-09-25T15:46:47+00:00"
},
{
- "name": "symfony/polyfill-php84",
- "version": "v1.36.0",
+ "name": "symfony/polyfill-php86",
+ "version": "v1.43.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php84.git",
- "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06"
+ "url": "https://github.com/symfony/polyfill-php86.git",
+ "reference": "8840df45b24f33a49dc419fa18dc0057231ae1d8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06",
- "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06",
+ "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/8840df45b24f33a49dc419fa18dc0057231ae1d8",
+ "reference": "8840df45b24f33a49dc419fa18dc0057231ae1d8",
"shasum": ""
},
"require": {
@@ -8107,7 +8236,7 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Php84\\": ""
+ "Symfony\\Polyfill\\Php86\\": ""
},
"classmap": [
"Resources/stubs"
@@ -8127,7 +8256,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",
+ "description": "Symfony polyfill backporting some PHP 8.6+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
@@ -8136,7 +8265,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php84/tree/v1.36.0"
+ "source": "https://github.com/symfony/polyfill-php86/tree/v1.43.0"
},
"funding": [
{
@@ -8156,24 +8285,24 @@
"type": "tidelift"
}
],
- "time": "2026-04-10T18:47:49+00:00"
+ "time": "2026-09-25T15:46:47+00:00"
},
{
- "name": "symfony/polyfill-php85",
- "version": "v1.36.0",
+ "name": "symfony/polyfill-time",
+ "version": "v1.42.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php85.git",
- "reference": "2c408a6bb0313e6001a83628dc5506100474254e"
+ "url": "https://github.com/symfony/polyfill-time.git",
+ "reference": "ac9f1ed802dd58f37e720388130c088434aa09fc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/2c408a6bb0313e6001a83628dc5506100474254e",
- "reference": "2c408a6bb0313e6001a83628dc5506100474254e",
+ "url": "https://api.github.com/repos/symfony/polyfill-time/zipball/ac9f1ed802dd58f37e720388130c088434aa09fc",
+ "reference": "ac9f1ed802dd58f37e720388130c088434aa09fc",
"shasum": ""
},
"require": {
- "php": ">=7.2"
+ "php": ">=8.1"
},
"type": "library",
"extra": {
@@ -8183,11 +8312,8 @@
}
},
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Php85\\": ""
+ "Symfony\\Polyfill\\Time\\": ""
},
"classmap": [
"Resources/stubs"
@@ -8199,24 +8325,30 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Ignace Philippe Nyamagana Butera",
+ "email": "nyamsprod@gmail.com"
+ },
+ {
+ "name": "Tim Düsterhus",
+ "email": "tim@tideways-gmbh.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions",
+ "description": "Symfony polyfill for the Time API added to PHP 8.6",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
+ "duration",
"polyfill",
"portable",
- "shim"
+ "shim",
+ "time"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php85/tree/v1.36.0"
+ "source": "https://github.com/symfony/polyfill-time/tree/v1.42.0"
},
"funding": [
{
@@ -8236,20 +8368,20 @@
"type": "tidelift"
}
],
- "time": "2026-04-10T16:50:15+00:00"
+ "time": "2026-08-07T13:08:13+00:00"
},
{
"name": "symfony/polyfill-uuid",
- "version": "v1.36.0",
+ "version": "v1.43.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-uuid.git",
- "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94"
+ "reference": "b23ff8245cc5c4479ea2be3d0132d2e6dd433993"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94",
- "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94",
+ "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/b23ff8245cc5c4479ea2be3d0132d2e6dd433993",
+ "reference": "b23ff8245cc5c4479ea2be3d0132d2e6dd433993",
"shasum": ""
},
"require": {
@@ -8299,7 +8431,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/polyfill-uuid/tree/v1.36.0"
+ "source": "https://github.com/symfony/polyfill-uuid/tree/v1.43.0"
},
"funding": [
{
@@ -8319,20 +8451,20 @@
"type": "tidelift"
}
],
- "time": "2026-04-10T16:19:22+00:00"
+ "time": "2026-09-24T05:20:52+00:00"
},
{
"name": "symfony/process",
- "version": "v7.4.8",
+ "version": "v7.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "60f19cd3badc8de688421e21e4305eba50f8089a"
+ "reference": "e5247f4a5e0797d232ad8e8e6803aeb341843c83"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/60f19cd3badc8de688421e21e4305eba50f8089a",
- "reference": "60f19cd3badc8de688421e21e4305eba50f8089a",
+ "url": "https://api.github.com/repos/symfony/process/zipball/e5247f4a5e0797d232ad8e8e6803aeb341843c83",
+ "reference": "e5247f4a5e0797d232ad8e8e6803aeb341843c83",
"shasum": ""
},
"require": {
@@ -8364,7 +8496,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.4.8"
+ "source": "https://github.com/symfony/process/tree/v7.4.21"
},
"funding": [
{
@@ -8384,20 +8516,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-10-08T16:56:12+00:00"
},
{
"name": "symfony/routing",
- "version": "v7.4.8",
+ "version": "v7.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b"
+ "reference": "7a344cf871532d081875bfdd18f3dff8dca36c5b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b",
- "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/7a344cf871532d081875bfdd18f3dff8dca36c5b",
+ "reference": "7a344cf871532d081875bfdd18f3dff8dca36c5b",
"shasum": ""
},
"require": {
@@ -8449,7 +8581,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v7.4.8"
+ "source": "https://github.com/symfony/routing/tree/v7.4.21"
},
"funding": [
{
@@ -8469,20 +8601,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-10-11T18:40:59+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v3.6.1",
+ "version": "v3.7.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43"
+ "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43",
- "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257",
+ "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257",
"shasum": ""
},
"require": {
@@ -8500,7 +8632,7 @@
"name": "symfony/contracts"
},
"branch-alias": {
- "dev-main": "3.6-dev"
+ "dev-main": "3.7-dev"
}
},
"autoload": {
@@ -8536,7 +8668,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v3.6.1"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.7.3"
},
"funding": [
{
@@ -8556,20 +8688,20 @@
"type": "tidelift"
}
],
- "time": "2025-07-15T11:30:57+00:00"
+ "time": "2026-07-27T15:39:01+00:00"
},
{
"name": "symfony/string",
- "version": "v7.4.8",
+ "version": "v7.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "114ac57257d75df748eda23dd003878080b8e688"
+ "reference": "9bc35d074ad16a58c21cd52b18c5cacc4f4c3981"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/114ac57257d75df748eda23dd003878080b8e688",
- "reference": "114ac57257d75df748eda23dd003878080b8e688",
+ "url": "https://api.github.com/repos/symfony/string/zipball/9bc35d074ad16a58c21cd52b18c5cacc4f4c3981",
+ "reference": "9bc35d074ad16a58c21cd52b18c5cacc4f4c3981",
"shasum": ""
},
"require": {
@@ -8627,7 +8759,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.4.8"
+ "source": "https://github.com/symfony/string/tree/v7.4.21"
},
"funding": [
{
@@ -8647,20 +8779,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-10-03T15:15:30+00:00"
},
{
"name": "symfony/translation",
- "version": "v7.4.8",
+ "version": "v7.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "33600f8489485425bfcddd0d983391038d3422e7"
+ "reference": "2ee1e4a3b32a528a642babe041ff7c440b213b4b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/33600f8489485425bfcddd0d983391038d3422e7",
- "reference": "33600f8489485425bfcddd0d983391038d3422e7",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/2ee1e4a3b32a528a642babe041ff7c440b213b4b",
+ "reference": "2ee1e4a3b32a528a642babe041ff7c440b213b4b",
"shasum": ""
},
"require": {
@@ -8727,7 +8859,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v7.4.8"
+ "source": "https://github.com/symfony/translation/tree/v7.4.17"
},
"funding": [
{
@@ -8747,20 +8879,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-08-21T17:40:08+00:00"
},
{
"name": "symfony/translation-contracts",
- "version": "v3.6.1",
+ "version": "v3.7.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
- "reference": "65a8bc82080447fae78373aa10f8d13b38338977"
+ "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977",
- "reference": "65a8bc82080447fae78373aa10f8d13b38338977",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/ccb206b98faccc511ebae8e5fad50f2dc0b30621",
+ "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621",
"shasum": ""
},
"require": {
@@ -8773,7 +8905,7 @@
"name": "symfony/contracts"
},
"branch-alias": {
- "dev-main": "3.6-dev"
+ "dev-main": "3.7-dev"
}
},
"autoload": {
@@ -8809,7 +8941,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1"
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.7.1"
},
"funding": [
{
@@ -8829,20 +8961,20 @@
"type": "tidelift"
}
],
- "time": "2025-07-15T13:41:35+00:00"
+ "time": "2026-06-05T06:23:12+00:00"
},
{
"name": "symfony/uid",
- "version": "v7.4.8",
+ "version": "v7.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/uid.git",
- "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56"
+ "reference": "3e706a245b5343ea93be9cafe84525bfb54e60fc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/uid/zipball/6883ebdf7bf6a12b37519dbc0df62b0222401b56",
- "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/3e706a245b5343ea93be9cafe84525bfb54e60fc",
+ "reference": "3e706a245b5343ea93be9cafe84525bfb54e60fc",
"shasum": ""
},
"require": {
@@ -8887,7 +9019,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/uid/tree/v7.4.8"
+ "source": "https://github.com/symfony/uid/tree/v7.4.21"
},
"funding": [
{
@@ -8907,20 +9039,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-10-12T14:31:36+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v7.4.8",
+ "version": "v7.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd"
+ "reference": "55d06b02f49eca9bff61828548988e6f8763e8a6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9510c3966f749a1d1ff0059e1eabef6cc621e7fd",
- "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/55d06b02f49eca9bff61828548988e6f8763e8a6",
+ "reference": "55d06b02f49eca9bff61828548988e6f8763e8a6",
"shasum": ""
},
"require": {
@@ -8936,7 +9068,7 @@
"symfony/http-kernel": "^6.4|^7.0|^8.0",
"symfony/process": "^6.4|^7.0|^8.0",
"symfony/uid": "^6.4|^7.0|^8.0",
- "twig/twig": "^3.12"
+ "twig/twig": "^3.12|^4.0"
},
"bin": [
"Resources/bin/var-dump-server"
@@ -8974,7 +9106,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v7.4.8"
+ "source": "https://github.com/symfony/var-dumper/tree/v7.4.21"
},
"funding": [
{
@@ -8994,7 +9126,7 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T13:44:50+00:00"
+ "time": "2026-10-13T05:48:33+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -9053,16 +9185,16 @@
},
{
"name": "ueberdosis/tiptap-php",
- "version": "2.1.0",
+ "version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/ueberdosis/tiptap-php.git",
- "reference": "6ea321fa665080e1a72ac5f52dfab19f6a292e2d"
+ "reference": "5a2e8155c5b09c9ad4efd480550270a6924865b9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/6ea321fa665080e1a72ac5f52dfab19f6a292e2d",
- "reference": "6ea321fa665080e1a72ac5f52dfab19f6a292e2d",
+ "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/5a2e8155c5b09c9ad4efd480550270a6924865b9",
+ "reference": "5a2e8155c5b09c9ad4efd480550270a6924865b9",
"shasum": ""
},
"require": {
@@ -9102,7 +9234,7 @@
],
"support": {
"issues": "https://github.com/ueberdosis/tiptap-php/issues",
- "source": "https://github.com/ueberdosis/tiptap-php/tree/2.1.0"
+ "source": "https://github.com/ueberdosis/tiptap-php/tree/2.2.0"
},
"funding": [
{
@@ -9118,27 +9250,27 @@
"type": "open_collective"
}
],
- "time": "2026-01-10T16:40:02+00:00"
+ "time": "2026-08-31T07:00:09+00:00"
},
{
"name": "vlucas/phpdotenv",
- "version": "v5.6.3",
+ "version": "v5.7.0",
"source": {
"type": "git",
- "url": "https://github.com/vlucas/phpdotenv.git",
- "reference": "955e7815d677a3eaa7075231212f2110983adecc"
+ "url": "https://github.com/phpdotenv/phpdotenv.git",
+ "reference": "301c07936b16d88628b126b01d082ba153cf4c40"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc",
- "reference": "955e7815d677a3eaa7075231212f2110983adecc",
+ "url": "https://api.github.com/repos/phpdotenv/phpdotenv/zipball/301c07936b16d88628b126b01d082ba153cf4c40",
+ "reference": "301c07936b16d88628b126b01d082ba153cf4c40",
"shasum": ""
},
"require": {
"ext-pcre": "*",
- "graham-campbell/result-type": "^1.1.4",
+ "graham-campbell/result-type": "^1.2",
"php": "^7.2.5 || ^8.0",
- "phpoption/phpoption": "^1.9.5",
+ "phpoption/phpoption": "^1.10",
"symfony/polyfill-ctype": "^1.26",
"symfony/polyfill-mbstring": "^1.26",
"symfony/polyfill-php80": "^1.26"
@@ -9182,7 +9314,7 @@
"homepage": "https://github.com/vlucas"
}
],
- "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+ "description": "Loads environment variables from `.env` to `$_ENV` and `$_SERVER` automagically, and optionally to `getenv()`.",
"keywords": [
"dotenv",
"env",
@@ -9190,7 +9322,7 @@
],
"support": {
"issues": "https://github.com/vlucas/phpdotenv/issues",
- "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.3"
+ "source": "https://github.com/vlucas/phpdotenv/tree/v5.7.0"
},
"funding": [
{
@@ -9202,20 +9334,20 @@
"type": "tidelift"
}
],
- "time": "2025-12-27T19:49:13+00:00"
+ "time": "2026-08-24T18:07:49+00:00"
},
{
"name": "voku/portable-ascii",
- "version": "2.1.0",
+ "version": "2.1.1",
"source": {
"type": "git",
"url": "https://github.com/voku/portable-ascii.git",
- "reference": "d870a33f0f79d2b4579740b0620200221ee44aeb"
+ "reference": "8e1051fe39379367aecf014f41744ce7539a856f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/voku/portable-ascii/zipball/d870a33f0f79d2b4579740b0620200221ee44aeb",
- "reference": "d870a33f0f79d2b4579740b0620200221ee44aeb",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f",
+ "reference": "8e1051fe39379367aecf014f41744ce7539a856f",
"shasum": ""
},
"require": {
@@ -9252,7 +9384,7 @@
],
"support": {
"issues": "https://github.com/voku/portable-ascii/issues",
- "source": "https://github.com/voku/portable-ascii/tree/2.1.0"
+ "source": "https://github.com/voku/portable-ascii/tree/2.1.1"
},
"funding": [
{
@@ -9276,7 +9408,7 @@
"type": "tidelift"
}
],
- "time": "2026-04-16T23:10:39+00:00"
+ "time": "2026-04-26T05:33:54+00:00"
}
],
"packages-dev": [
@@ -9345,16 +9477,16 @@
},
{
"name": "filp/whoops",
- "version": "2.18.4",
+ "version": "2.18.7",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
- "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d"
+ "reference": "50670ba239926c50f2073e868f6672f775cd57ec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d",
- "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/50670ba239926c50f2073e868f6672f775cd57ec",
+ "reference": "50670ba239926c50f2073e868f6672f775cd57ec",
"shasum": ""
},
"require": {
@@ -9363,8 +9495,8 @@
},
"require-dev": {
"mockery/mockery": "^1.0",
- "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3",
- "symfony/var-dumper": "^4.0 || ^5.0"
+ "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3 || ^10.5.58",
+ "symfony/var-dumper": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0"
},
"suggest": {
"symfony/var-dumper": "Pretty print complex values better with var-dumper available",
@@ -9404,7 +9536,7 @@
],
"support": {
"issues": "https://github.com/filp/whoops/issues",
- "source": "https://github.com/filp/whoops/tree/2.18.4"
+ "source": "https://github.com/filp/whoops/tree/2.18.7"
},
"funding": [
{
@@ -9412,23 +9544,25 @@
"type": "github"
}
],
- "time": "2025-08-08T12:00:00+00:00"
+ "time": "2026-10-18T13:17:38+00:00"
},
{
"name": "hamcrest/hamcrest-php",
- "version": "v2.1.1",
+ "version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/hamcrest/hamcrest-php.git",
- "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487"
+ "reference": "b61cd040da1a4925bc90a51c074f5297e7c0fa52"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487",
- "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487",
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b61cd040da1a4925bc90a51c074f5297e7c0fa52",
+ "reference": "b61cd040da1a4925bc90a51c074f5297e7c0fa52",
"shasum": ""
},
"require": {
+ "ext-ctype": "*",
+ "ext-dom": "*",
"php": "^7.4|^8.0"
},
"replace": {
@@ -9437,13 +9571,15 @@
"kodova/hamcrest-php": "*"
},
"require-dev": {
+ "phpstan/phpstan": "^2.1",
+ "phpstan/phpstan-phpunit": "^2.0",
"phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0",
"phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.1-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
@@ -9461,22 +9597,152 @@
],
"support": {
"issues": "https://github.com/hamcrest/hamcrest-php/issues",
- "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1"
+ "source": "https://github.com/hamcrest/hamcrest-php/tree/v3.0.0"
+ },
+ "time": "2026-03-17T11:56:53+00:00"
+ },
+ {
+ "name": "iamcal/sql-parser",
+ "version": "v0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/iamcal/SQLParser.git",
+ "reference": "610392f38de49a44dab08dc1659960a29874c4b8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/iamcal/SQLParser/zipball/610392f38de49a44dab08dc1659960a29874c4b8",
+ "reference": "610392f38de49a44dab08dc1659960a29874c4b8",
+ "shasum": ""
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^1.0",
+ "phpunit/phpunit": "^5|^6|^7|^8|^9"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "iamcal\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Cal Henderson",
+ "email": "cal@iamcal.com"
+ }
+ ],
+ "description": "MySQL schema parser",
+ "support": {
+ "issues": "https://github.com/iamcal/SQLParser/issues",
+ "source": "https://github.com/iamcal/SQLParser/tree/v0.7"
+ },
+ "time": "2026-01-28T22:20:33+00:00"
+ },
+ {
+ "name": "larastan/larastan",
+ "version": "v3.13.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/larastan/larastan.git",
+ "reference": "24ee69a7705ffc7c2cd8a3c96a5f498a4c2de5e3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/larastan/larastan/zipball/24ee69a7705ffc7c2cd8a3c96a5f498a4c2de5e3",
+ "reference": "24ee69a7705ffc7c2cd8a3c96a5f498a4c2de5e3",
+ "shasum": ""
+ },
+ "require": {
+ "iamcal/sql-parser": "^0.7.0",
+ "illuminate/console": "^11.44.2 || ^12.4.1 || ^13",
+ "illuminate/container": "^11.44.2 || ^12.4.1 || ^13",
+ "illuminate/contracts": "^11.44.2 || ^12.4.1 || ^13",
+ "illuminate/database": "^11.44.2 || ^12.4.1 || ^13",
+ "illuminate/http": "^11.44.2 || ^12.4.1 || ^13",
+ "illuminate/pipeline": "^11.44.2 || ^12.4.1 || ^13",
+ "illuminate/support": "^11.44.2 || ^12.4.1 || ^13",
+ "php": "^8.2",
+ "phpstan/phpstan": "^2.3.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^14",
+ "laravel/framework": "^11.44.2 || ^12.7.2 || ^13",
+ "mockery/mockery": "^1.6.12",
+ "nikic/php-parser": "^5.4",
+ "orchestra/canvas": "^v9.2.2 || ^10.0.1 || ^11",
+ "orchestra/testbench-core": "^9.12.0 || ^10.1 || ^11",
+ "phpstan/phpstan-deprecation-rules": "^2.0.1",
+ "phpunit/phpunit": "^10.5.35 || ^11.5.15 || ^12.5.8 || ^13.3.0"
+ },
+ "suggest": {
+ "orchestra/testbench": "Using Larastan for analysing a package needs Testbench",
+ "phpmyadmin/sql-parser": "Install to enable Larastan's optional phpMyAdmin-based SQL parser automatically"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Larastan\\Larastan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Can Vural",
+ "email": "can9119@gmail.com"
+ }
+ ],
+ "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan extension for Laravel",
+ "keywords": [
+ "PHPStan",
+ "code analyse",
+ "code analysis",
+ "larastan",
+ "laravel",
+ "package",
+ "php",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/larastan/larastan/issues",
+ "source": "https://github.com/larastan/larastan/tree/v3.13.0"
},
- "time": "2025-04-30T06:54:44+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/canvural",
+ "type": "github"
+ }
+ ],
+ "time": "2026-10-07T14:14:28+00:00"
},
{
"name": "laravel/pail",
- "version": "v1.2.6",
+ "version": "v1.2.7",
"source": {
"type": "git",
"url": "https://github.com/laravel/pail.git",
- "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf"
+ "reference": "2f7d27dada8effc48b8c424445a69cca7007daaa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/pail/zipball/aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf",
- "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf",
+ "url": "https://api.github.com/repos/laravel/pail/zipball/2f7d27dada8effc48b8c424445a69cca7007daaa",
+ "reference": "2f7d27dada8effc48b8c424445a69cca7007daaa",
"shasum": ""
},
"require": {
@@ -9543,20 +9809,20 @@
"issues": "https://github.com/laravel/pail/issues",
"source": "https://github.com/laravel/pail"
},
- "time": "2026-02-09T13:44:54+00:00"
+ "time": "2026-05-20T22:24:57+00:00"
},
{
"name": "laravel/pint",
- "version": "v1.29.1",
+ "version": "v1.32.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/pint.git",
- "reference": "0770e9b7fafd50d4586881d456d6eb41c9247a80"
+ "reference": "006bd7825eb01daf92959d060b89cd9514fe4253"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/pint/zipball/0770e9b7fafd50d4586881d456d6eb41c9247a80",
- "reference": "0770e9b7fafd50d4586881d456d6eb41c9247a80",
+ "url": "https://api.github.com/repos/laravel/pint/zipball/006bd7825eb01daf92959d060b89cd9514fe4253",
+ "reference": "006bd7825eb01daf92959d060b89cd9514fe4253",
"shasum": ""
},
"require": {
@@ -9564,17 +9830,19 @@
"ext-mbstring": "*",
"ext-tokenizer": "*",
"ext-xml": "*",
- "php": "^8.2.0"
+ "php": "^8.3.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^3.95.1",
- "illuminate/view": "^12.56.0",
- "larastan/larastan": "^3.9.6",
- "laravel-zero/framework": "^12.1.0",
- "mockery/mockery": "^1.6.12",
+ "composer/semver": "^3.4.4",
+ "friendsofphp/php-cs-fixer": "^3.95.25",
+ "illuminate/view": "^13.31.0",
+ "larastan/larastan": "^3.11.0",
+ "laravel-zero/framework": "^13.0.0",
+ "laravel/agent-detector": "^2.0.2",
+ "laravel/prompts": "^0.3.24",
+ "mockery/mockery": "^1.6.15",
"nunomaduro/termwind": "^2.4.0",
- "pestphp/pest": "^3.8.6",
- "shipfastlabs/agent-detector": "^1.1.3"
+ "pestphp/pest": "^4.7.8"
},
"bin": [
"builds/pint"
@@ -9611,20 +9879,20 @@
"issues": "https://github.com/laravel/pint/issues",
"source": "https://github.com/laravel/pint"
},
- "time": "2026-04-20T15:26:14+00:00"
+ "time": "2026-09-10T10:47:55+00:00"
},
{
"name": "laravel/sail",
- "version": "v1.57.0",
+ "version": "v1.69.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/sail.git",
- "reference": "fa8d057b6e9310380ccbc3a209ed7f927d54f648"
+ "reference": "3587ac9d68e8f2eaf36bd9fb003a4555861dca9d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/sail/zipball/fa8d057b6e9310380ccbc3a209ed7f927d54f648",
- "reference": "fa8d057b6e9310380ccbc3a209ed7f927d54f648",
+ "url": "https://api.github.com/repos/laravel/sail/zipball/3587ac9d68e8f2eaf36bd9fb003a4555861dca9d",
+ "reference": "3587ac9d68e8f2eaf36bd9fb003a4555861dca9d",
"shasum": ""
},
"require": {
@@ -9674,33 +9942,32 @@
"issues": "https://github.com/laravel/sail/issues",
"source": "https://github.com/laravel/sail"
},
- "time": "2026-04-14T13:32:04+00:00"
+ "time": "2026-10-08T20:06:52+00:00"
},
{
"name": "mockery/mockery",
- "version": "1.6.12",
+ "version": "1.6.15",
"source": {
"type": "git",
"url": "https://github.com/mockery/mockery.git",
- "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699"
+ "reference": "967a801bd188989a5669bd280f252d51c0fdc9ee"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699",
- "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/967a801bd188989a5669bd280f252d51c0fdc9ee",
+ "reference": "967a801bd188989a5669bd280f252d51c0fdc9ee",
"shasum": ""
},
"require": {
- "hamcrest/hamcrest-php": "^2.0.1",
- "lib-pcre": ">=7.0",
+ "hamcrest/hamcrest-php": "^2.0 || ^3.0",
"php": ">=7.3"
},
"conflict": {
"phpunit/phpunit": "<8.0"
},
"require-dev": {
- "phpunit/phpunit": "^8.5 || ^9.6.17",
- "symplify/easy-coding-standard": "^12.1.14"
+ "phpunit/phpunit": "^9.6.36",
+ "symplify/easy-coding-standard": "^13.2.17"
},
"type": "library",
"autoload": {
@@ -9757,24 +10024,24 @@
"security": "https://github.com/mockery/mockery/security/advisories",
"source": "https://github.com/mockery/mockery"
},
- "time": "2024-05-16T03:13:13+00:00"
+ "time": "2026-08-19T19:37:52+00:00"
},
{
"name": "myclabs/deep-copy",
- "version": "1.13.4",
+ "version": "1.14.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a"
+ "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a",
- "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae",
+ "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "php": "^8.0"
},
"conflict": {
"doctrine/collections": "<1.6.8",
@@ -9809,35 +10076,35 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0"
},
"funding": [
{
- "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
- "type": "tidelift"
+ "url": "https://github.com/mnapoli",
+ "type": "github"
}
],
- "time": "2025-08-01T08:46:24+00:00"
+ "time": "2026-08-11T10:17:44+00:00"
},
{
"name": "nunomaduro/collision",
- "version": "v8.9.3",
+ "version": "v8.9.5",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/collision.git",
- "reference": "b0d8ab95b29c3189aeeb902d81215231df4c1b64"
+ "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b0d8ab95b29c3189aeeb902d81215231df4c1b64",
- "reference": "b0d8ab95b29c3189aeeb902d81215231df4c1b64",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/fb53eacd509a1d303858e2d20cfebf2d630254ec",
+ "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec",
"shasum": ""
},
"require": {
"filp/whoops": "^2.18.4",
"nunomaduro/termwind": "^2.4.0",
"php": "^8.2.0",
- "symfony/console": "^7.4.8 || ^8.0.4"
+ "symfony/console": "^7.4.14 || ^8.1.1"
},
"conflict": {
"laravel/framework": "<11.48.0 || >=14.0.0",
@@ -9845,12 +10112,12 @@
},
"require-dev": {
"brianium/paratest": "^7.8.5",
- "larastan/larastan": "^3.9.3",
- "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.2.0",
- "laravel/pint": "^1.29.0",
- "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.0.0",
- "pestphp/pest": "^3.8.5 || ^4.4.3 || ^5.0.0",
- "sebastian/environment": "^7.2.1 || ^8.0.4 || ^9.0.0"
+ "larastan/larastan": "^3.10.0",
+ "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.20.0",
+ "laravel/pint": "^1.29.3",
+ "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.3.5",
+ "pestphp/pest": "^3.8.5 || ^4.7.5 || ^5.0.0",
+ "sebastian/environment": "^7.2.1 || ^8.1.2 || ^9.3.2"
},
"type": "library",
"extra": {
@@ -9913,7 +10180,7 @@
"type": "patreon"
}
],
- "time": "2026-04-06T19:25:53+00:00"
+ "time": "2026-07-15T19:09:14+00:00"
},
{
"name": "phar-io/manifest",
@@ -10033,6 +10300,70 @@
},
"time": "2022-02-21T01:04:05+00:00"
},
+ {
+ "name": "phpstan/phpstan",
+ "version": "2.3.1",
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/6155239b488e95d26d1ebd95c6b4bb294d7f09db",
+ "reference": "6155239b488e95d26d1ebd95c6b4bb294d7f09db",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ondřej Mirtes"
+ },
+ {
+ "name": "Markus Staab"
+ },
+ {
+ "name": "Vincent Langlet"
+ }
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ }
+ ],
+ "time": "2026-10-08T21:09:11+00:00"
+ },
{
"name": "phpunit/php-code-coverage",
"version": "11.0.12",
@@ -10382,26 +10713,26 @@
},
{
"name": "phpunit/phpunit",
- "version": "11.5.55",
+ "version": "11.5.57",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00"
+ "reference": "36b75bf56a8535623f5b3e24b27ea1823759da1a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/adc7262fccc12de2b30f12a8aa0b33775d814f00",
- "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/36b75bf56a8535623f5b3e24b27ea1823759da1a",
+ "reference": "36b75bf56a8535623f5b3e24b27ea1823759da1a",
"shasum": ""
},
"require": {
"ext-dom": "*",
+ "ext-filter": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
- "ext-xml": "*",
"ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.13.4",
+ "myclabs/deep-copy": "^1.14.0",
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
"php": ">=8.2",
@@ -10464,31 +10795,15 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.55"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.57"
},
"funding": [
{
- "url": "https://phpunit.de/sponsors.html",
- "type": "custom"
- },
- {
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
- },
- {
- "url": "https://liberapay.com/sebastianbergmann",
- "type": "liberapay"
- },
- {
- "url": "https://thanks.dev/u/gh/sebastianbergmann",
- "type": "thanks_dev"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
- "type": "tidelift"
+ "url": "https://phpunit.de/sponsoring.html",
+ "type": "other"
}
],
- "time": "2026-02-18T12:37:06+00:00"
+ "time": "2026-10-05T05:47:54+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -11530,16 +11845,16 @@
},
{
"name": "symfony/yaml",
- "version": "v7.4.8",
+ "version": "v7.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "c58fdf7b3d6c2995368264c49e4e8b05bcff2883"
+ "reference": "044907929c7999814378be22da34722c7a86bad4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/c58fdf7b3d6c2995368264c49e4e8b05bcff2883",
- "reference": "c58fdf7b3d6c2995368264c49e4e8b05bcff2883",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/044907929c7999814378be22da34722c7a86bad4",
+ "reference": "044907929c7999814378be22da34722c7a86bad4",
"shasum": ""
},
"require": {
@@ -11582,7 +11897,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v7.4.8"
+ "source": "https://github.com/symfony/yaml/tree/v7.4.21"
},
"funding": [
{
@@ -11602,7 +11917,7 @@
"type": "tidelift"
}
],
- "time": "2026-03-24T13:12:05+00:00"
+ "time": "2026-10-12T12:34:30+00:00"
},
{
"name": "theseer/tokenizer",
@@ -11656,8 +11971,10 @@
}
],
"aliases": [],
- "minimum-stability": "dev",
- "stability-flags": {},
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "programmernomad/laracorekit": 20
+ },
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
diff --git a/config/auth.php b/config/auth.php
index d56848e..4830175 100644
--- a/config/auth.php
+++ b/config/auth.php
@@ -1,5 +1,7 @@
[
'users' => [
'driver' => 'eloquent',
- 'model' => env('AUTH_MODEL', Modules\User\Models\User::class),
+ 'model' => env('AUTH_MODEL', User::class),
],
// 'users' => [
diff --git a/config/laracorekit.php b/config/laracorekit.php
new file mode 100644
index 0000000..07a86cb
--- /dev/null
+++ b/config/laracorekit.php
@@ -0,0 +1,10 @@
+ true,
+ // This host demonstrates a custom panel; the package supplies its own in fresh apps.
+ 'panel' => ['enabled' => false, 'id' => 'admin', 'path' => 'admin'],
+ 'modules' => ['Auth' => true, 'User' => true, 'Settings' => true, 'Media' => true, 'Blog' => true],
+ 'registration' => true,
+ 'locales' => ['en', 'hi', 'ar'],
+];
diff --git a/config/modules.php b/config/modules.php
deleted file mode 100644
index d99187a..0000000
--- a/config/modules.php
+++ /dev/null
@@ -1,41 +0,0 @@
- [
- 'Core' => [
- 'enabled' => true,
- 'namespace' => 'Modules\Core',
- 'provider' => 'Modules\Core\CoreServiceProvider',
- ],
- 'Auth' => [
- 'enabled' => true,
- 'namespace' => 'Modules\Auth',
- 'provider' => 'Modules\Auth\AuthServiceProvider',
- ],
- 'User' => [
- 'enabled' => true,
- 'namespace' => 'Modules\User',
- 'provider' => 'Modules\User\UserServiceProvider',
- ],
- 'Blog' => [
- 'enabled' => true,
- 'namespace' => 'Modules\Blog',
- 'provider' => 'Modules\Blog\BlogServiceProvider',
- ],
- 'Settings' => [
- 'enabled' => true,
- 'namespace' => 'Modules\Settings',
- 'provider' => 'Modules\Settings\SettingsServiceProvider',
- ],
- 'Media' => [
- 'enabled' => true,
- 'namespace' => 'Modules\Media',
- 'provider' => 'Modules\Media\MediaServiceProvider',
- ],
- 'Docs' => [
- 'enabled' => true,
- 'namespace' => 'Modules\Docs',
- 'provider' => 'Modules\Docs\DocsServiceProvider',
- ],
- ],
-];
diff --git a/config/permission.php b/config/permission.php
index f39f6b5..85b8832 100644
--- a/config/permission.php
+++ b/config/permission.php
@@ -1,5 +1,9 @@
[
@@ -13,7 +17,7 @@
* `Spatie\Permission\Contracts\Permission` contract.
*/
- 'permission' => Spatie\Permission\Models\Permission::class,
+ 'permission' => Permission::class,
/*
* When using the "HasRoles" trait from this package, we need to know which
@@ -24,7 +28,7 @@
* `Spatie\Permission\Contracts\Role` contract.
*/
- 'role' => Spatie\Permission\Models\Role::class,
+ 'role' => Role::class,
],
@@ -136,7 +140,7 @@
/*
* The class to use to resolve the permissions team id
*/
- 'team_resolver' => \Spatie\Permission\DefaultTeamResolver::class,
+ 'team_resolver' => DefaultTeamResolver::class,
/*
* Passport Client Credentials Grant
@@ -183,7 +187,7 @@
* When permissions or roles are updated the cache is flushed automatically.
*/
- 'expiration_time' => \DateInterval::createFromDateString('24 hours'),
+ 'expiration_time' => DateInterval::createFromDateString('24 hours'),
/*
* The cache key used to store all permissions.
diff --git a/config/site.php b/config/site.php
new file mode 100644
index 0000000..9f31cae
--- /dev/null
+++ b/config/site.php
@@ -0,0 +1,6 @@
+ env('LARACOREKIT_COLLECT_STATS', false),
+];
diff --git a/modules/Blog/database/seeders/BlogSeeder.php b/database/seeders/BlogSeeder.php
similarity index 99%
rename from modules/Blog/database/seeders/BlogSeeder.php
rename to database/seeders/BlogSeeder.php
index 7edd608..6af3f07 100644
--- a/modules/Blog/database/seeders/BlogSeeder.php
+++ b/database/seeders/BlogSeeder.php
@@ -1,10 +1,10 @@
first();
- if (!$admin) {
+ if (! $admin) {
$admin = User::first();
}
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
index ed9bd96..9cffe0c 100644
--- a/database/seeders/DatabaseSeeder.php
+++ b/database/seeders/DatabaseSeeder.php
@@ -2,22 +2,17 @@
namespace Database\Seeders;
-use Modules\User\Models\User;
-// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
+use Modules\User\Database\Seeders\RolePermissionSeeder;
class DatabaseSeeder extends Seeder
{
- /**
- * Seed the application's database.
- */
public function run(): void
{
- $this->call([
- \Modules\User\Database\Seeders\RolePermissionSeeder::class,
- \Modules\User\Database\Seeders\UserSeeder::class,
- \Modules\Settings\Database\Seeders\SettingSeeder::class,
- \Modules\Blog\Database\Seeders\BlogSeeder::class,
- ]);
+ // Safe defaults: roles only. Demo content requires an explicit DemoSeeder invocation.
+ $this->call(RolePermissionSeeder::class);
+ if (config('demo.enabled')) {
+ $this->call(DemoSeeder::class);
+ }
}
}
diff --git a/database/seeders/DemoSeeder.php b/database/seeders/DemoSeeder.php
new file mode 100644
index 0000000..fcda371
--- /dev/null
+++ b/database/seeders/DemoSeeder.php
@@ -0,0 +1,23 @@
+call([
+ RolePermissionSeeder::class,
+ UserSeeder::class,
+ SettingSeeder::class,
+ BlogSeeder::class,
+ ]);
+ }
+}
diff --git a/modules/Settings/database/seeders/SettingSeeder.php b/database/seeders/SettingSeeder.php
similarity index 98%
rename from modules/Settings/database/seeders/SettingSeeder.php
rename to database/seeders/SettingSeeder.php
index 3824124..196dd77 100644
--- a/modules/Settings/database/seeders/SettingSeeder.php
+++ b/database/seeders/SettingSeeder.php
@@ -1,9 +1,9 @@
config('demo.credentials.admin.email', 'admin@laracorekit.com')],
@@ -21,9 +25,9 @@ public function run(): void
);
// Assign Admin role if it exists
- if (class_exists(\Spatie\Permission\Models\Role::class)) {
- $adminRole = \Spatie\Permission\Models\Role::where('name', 'Admin')->first();
- if ($adminRole && !$admin->hasRole('Admin')) {
+ if (class_exists(Role::class)) {
+ $adminRole = Role::where('name', 'Admin')->first();
+ if ($adminRole && ! $admin->hasRole('Admin')) {
$admin->assignRole('Admin');
}
}
@@ -33,14 +37,14 @@ public function run(): void
['email' => 'editor@laracorekit.com'],
[
'name' => 'Editor User',
- 'password' => Hash::make('password'),
+ 'password' => Hash::make(config('demo.credentials.admin.password', 'Admin@123')),
'email_verified_at' => now(),
]
);
- if (class_exists(\Spatie\Permission\Models\Role::class)) {
- $editorRole = \Spatie\Permission\Models\Role::where('name', 'Editor')->first();
- if ($editorRole && !$editor->hasRole('Editor')) {
+ if (class_exists(Role::class)) {
+ $editorRole = Role::where('name', 'Editor')->first();
+ if ($editorRole && ! $editor->hasRole('Editor')) {
$editor->assignRole('Editor');
}
}
@@ -55,9 +59,9 @@ public function run(): void
]
);
- if (class_exists(\Spatie\Permission\Models\Role::class)) {
- $userRole = \Spatie\Permission\Models\Role::where('name', 'User')->first();
- if ($userRole && !$user->hasRole('User')) {
+ if (class_exists(Role::class)) {
+ $userRole = Role::where('name', 'User')->first();
+ if ($userRole && ! $user->hasRole('User')) {
$user->assignRole('User');
}
}
diff --git a/docs/SCREENSHOT_GUIDE.md b/docs/SCREENSHOT_GUIDE.md
index 9a458d7..a1a20f0 100644
--- a/docs/SCREENSHOT_GUIDE.md
+++ b/docs/SCREENSHOT_GUIDE.md
@@ -1,309 +1,19 @@
-# Screenshot and Media Guide for LaraCoreKit
+# Real application screenshots
-This guide explains exactly which screenshots and GIF animations you need to create and where to place them.
+Screenshots are generated from a disposable local SQLite application, never customer data. Files are stored in `docs/images/screenshots` for the README and `public/images/screenshots` for the website. They show the host application, including optional showcase features.
-## Directory Structure
+## Reproduce
-Create this directory structure for all images:
+Install the project dependencies and build assets. Configure an isolated test process with `APP_ENV=testing`, `DB_CONNECTION=sqlite`, `DB_DATABASE` pointing to a disposable file named `laracorekit-preview.sqlite`, `DEMO_MODE=false`, `CACHE_STORE=array`, `SESSION_DRIVER=file` and a localhost APP_URL. Create the empty file, run migrations, then `php tools/preview-seed.php`. The fixture refuses to run outside this setup.
-```
-docs/
- images/
- screenshots/
- admin-dashboard.png
- blog-editor.png
- ui-showcase.png
- rtl-support.png
- create-blog-post.gif
- language-switching.gif
-```
+Start `php artisan serve --host=127.0.0.1 --port=8765 --no-reload` with the same environment. With Playwright available, run `node tools/browser-smoke.cjs`. The script uses Edge by default; set PLAYWRIGHT_CHANNEL for a supported installed browser. Set LARACOREKIT_PREVIEW_URL if using a different local server URL.
-## Required Screenshots
+The fixture's preview account is test-only and its password appears only in local test tooling. Do not deploy the fixture or reuse its credentials. No Packagist/GitHub account tokens are used in screenshots.
-### 1. Admin Dashboard (admin-dashboard.png)
+Captured pages include homepage, documentation, public blog, admin dashboard, blog management/editor, mobile navigation and UI showcase. Inspect images after capture; passing HTTP checks does not guarantee good layout. The README walkthrough GIF uses these actual views, with no placeholder UI.
-**What to capture:**
-- Navigate to: http://localhost:8000/admin or https://www.laracorekit.com/admin
-- Login as admin user
-- Capture the main dashboard view showing:
- - Filament admin navigation sidebar
- - Dashboard widgets (if any)
- - Dark mode toggle visible
- - User menu in top-right
- - At least 2-3 resources visible in sidebar (Users, Blog Posts, etc.)
+Set `LARACOREKIT_CRAWL_SHOWCASE=true` when running the browser script to additionally validate every linked showcase URL. Theme and Arabic RTL checks capture additional real views.
-**Technical requirements:**
-- Resolution: 1920x1080 or higher
-- Format: PNG
-- Show full browser window or crop to just the admin panel area
-- Include visible data (users, blog posts, etc.) from seeded data
-- Optional: Take both light and dark mode versions
+## README animation
-**Recommended tool:**
-- Windows: Snipping Tool (Win + Shift + S)
-- Browser: Full page screenshot extension
-- Professional: ShareX, Greenshot
-
----
-
-### 2. Blog Editor (blog-editor.png)
-
-**What to capture:**
-- Navigate to: http://localhost:8000/admin/blog-posts/create or edit an existing post
-- Show the Filament form for creating/editing a blog post with:
- - Rich text editor visible with content
- - SEO fields section visible (slug, meta description)
- - Language selector showing multilingual support
- - Status selector (Draft/Published)
- - Featured image upload area
- - Save/Cancel buttons
-
-**Technical requirements:**
-- Resolution: 1920x1080 or higher
-- Format: PNG
-- Capture the full form or most important sections
-- Show actual content in the editor, not empty fields
-- Make sure multilingual tabs/selector is visible
-
-**Example content to show:**
-Use one of the seeded blog posts or create a new one titled "Getting Started with LaraCoreKit"
-
----
-
-### 3. UI Component Showcase (ui-showcase.png)
-
-**What to capture:**
-- Navigate to: http://localhost:8000/ui-showcase or https://www.laracorekit.com/ui-showcase
-- Capture a view showing:
- - Multiple component categories visible
- - At least 6-8 different components rendered
- - Variety of components (buttons, forms, cards, tables, etc.)
- - Clean, organized layout
- - Navigation showing component categories
-
-**Technical requirements:**
-- Resolution: 1920x1080 or higher
-- Format: PNG
-- Capture a scrolled view showing component variety
-- Ensure text is readable
-- Show colorful, visually appealing components
-
-**Alternative:**
-Create a collage showing 4-6 individual component categories in a grid layout
-
----
-
-### 4. RTL Support (rtl-support.png)
-
-**What to capture:**
-- Navigate to homepage or blog page
-- Switch language to Arabic using language switcher
-- Capture a page showing:
- - Right-to-left text direction
- - Navigation aligned to right
- - Content properly flowing RTL
- - Arabic text visible and readable
- - UI elements mirrored correctly
-
-**Technical requirements:**
-- Resolution: 1920x1080 or higher
-- Format: PNG
-- Show clear before/after or side-by-side comparison if possible
-- Ensure Arabic text is properly displayed
-- Show both navigation and content areas
-
-**Recommended approach:**
-Take two screenshots (LTR English and RTL Arabic) and combine them side-by-side using image editor, OR take a single screenshot showing the RTL layout prominently
-
----
-
-## Required GIF Animations
-
-### 5. Creating a Blog Post (create-blog-post.gif)
-
-**What to record:**
-A short workflow showing:
-1. Navigate to admin panel
-2. Click "Blog Posts" in sidebar
-3. Click "Create" button
-4. Fill in title field (type: "My First Blog Post")
-5. Add some content to the rich text editor
-6. Select "Published" status
-7. Click "Save" button
-8. Show success notification
-9. See the new post in the list
-
-**Technical requirements:**
-- Duration: 15-30 seconds
-- Resolution: 1920x1080 or 1280x720
-- Format: GIF (optimized, max 5MB) or MP4
-- Frame rate: 10-15 fps for GIF, 30 fps for MP4
-- Show cursor movements clearly
-- Smooth transitions
-
-**Recommended tools:**
-- Windows: ScreenToGif (free, excellent)
-- Cross-platform: OBS Studio + GIF converter
-- Online: Recordit, Gifox
-- Browser extension: Chrome Capture, Loom
-
-**Tips:**
-- Record at normal speed, then speed up 1.5x
-- Pause briefly on important steps
-- Crop to focus on relevant area
-- Optimize GIF size (use fewer colors, lower fps if needed)
-
----
-
-### 6. Language Switching (language-switching.gif)
-
-**What to record:**
-A short workflow showing:
-1. Start on homepage in English
-2. Show language switcher in navigation
-3. Click language dropdown
-4. Select "Arabic" or "Hindi"
-5. Show page content changing language
-6. Show RTL layout shift (if switching to Arabic)
-7. Navigate to one more page (like Blog or About)
-8. Show consistent language across site
-
-**Technical requirements:**
-- Duration: 10-20 seconds
-- Resolution: 1920x1080 or 1280x720
-- Format: GIF (optimized, max 5MB) or MP4
-- Frame rate: 10-15 fps for GIF
-- Show smooth transition
-- Visible UI changes
-
-**Tips:**
-- Show clear before/after state
-- Highlight the language switcher
-- Show multiple pages if possible (homepage + blog)
-- For Arabic, emphasize the RTL layout change
-
----
-
-## File Placement
-
-After creating all screenshots and GIFs:
-
-1. Create the directory structure:
-```bash
-mkdir -p docs/images/screenshots
-```
-
-2. Place files with exact names:
-```
-docs/images/screenshots/admin-dashboard.png
-docs/images/screenshots/blog-editor.png
-docs/images/screenshots/ui-showcase.png
-docs/images/screenshots/rtl-support.png
-docs/images/screenshots/create-blog-post.gif
-docs/images/screenshots/language-switching.gif
-```
-
-3. Verify files:
- - All files exist
- - File names match exactly (lowercase, hyphens, correct extensions)
- - PNG files are not too large (compress if over 1MB each)
- - GIF files are optimized (max 5MB each, preferably under 3MB)
-
-## Image Optimization
-
-### PNG Optimization
-Use one of these tools to compress PNG files without losing quality:
-- **TinyPNG** - https://tinypng.com (online, drag and drop)
-- **ImageOptim** - https://imageoptim.com (Mac)
-- **PNGGauntlet** - https://pnggauntlet.com (Windows)
-- **squoosh.app** - https://squoosh.app (online, advanced)
-
-Target: Keep each PNG under 500KB if possible, max 1MB
-
-### GIF Optimization
-Use these tools to reduce GIF file size:
-- **ScreenToGif** - Has built-in optimizer (Windows)
-- **ezgif.com** - https://ezgif.com/optimize (online)
-- **gifsicle** - Command line tool for advanced optimization
-- Convert to MP4 if GIF is too large, then use video tag in docs
-
-Target: Keep each GIF under 3MB, ideally under 2MB
-
-**GIF optimization tips:**
-- Reduce colors to 64-128 instead of 256
-- Lower frame rate to 10-12 fps
-- Resize to 1280x720 or 1024x768 if needed
-- Crop to focus area only
-- Remove unnecessary frames
-
-## Alternative: Video Format
-
-If GIF files are too large even after optimization, you can use MP4 format instead:
-
-1. Record as MP4 using OBS Studio or similar
-2. Place in same directory with .mp4 extension
-3. Update README.md to use HTML5 video tag:
-
-```html
-
-```
-
-MP4 files are usually 10-20x smaller than GIFs for the same quality.
-
-## Checklist
-
-Before committing, verify:
-
-- [ ] All 6 files created and placed in correct directory
-- [ ] File names match exactly (lowercase, hyphens, correct extensions)
-- [ ] PNG files are clear and readable (1920x1080 or higher)
-- [ ] PNG files are optimized (under 1MB each)
-- [ ] GIF files show smooth animations (15-30 seconds)
-- [ ] GIF files are optimized (under 3MB each)
-- [ ] All screenshots show seeded demo data, not empty screens
-- [ ] RTL screenshot clearly shows right-to-left layout
-- [ ] Images look professional (no personal info, clean browser, etc.)
-- [ ] Test that images display correctly in README.md
-
-## After Adding Images
-
-Once all images are added:
-
-1. Commit the images:
-```bash
-git add docs/images/screenshots/
-git commit -m "Add product screenshots and demo GIFs"
-```
-
-2. Push to GitHub:
-```bash
-git push origin main
-```
-
-3. Verify images display on GitHub README
-4. Update website homepage with same images
-5. Consider adding to docs pages as well
-
-## Additional Screenshots (Optional)
-
-Consider adding these for documentation and marketing:
-
-- **Login page** - show auth UI (login-page.png)
-- **User profile** - show profile editing (user-profile.png)
-- **Settings page** - show admin settings (settings-page.png)
-- **Media library** - show file management (media-library.png)
-- **Mobile view** - show responsive design (mobile-view.png)
-- **Dark mode** - show dark mode UI (dark-mode.png)
-
-Place these in docs/images/additional/ directory.
-
----
-
-**Questions or need help?**
-
-If you encounter issues capturing screenshots or creating GIFs, you can:
-1. Use the live demo site at https://www.laracorekit.com
-2. Seed your local database with demo data: `php artisan db:seed`
-3. Ask for help: https://github.com/ProgrammerNomad/LaraCoreKit/discussions
+After browser capture succeeds, run `python tools/build-demo-gif.py` (requires Pillow). It creates `docs/images/screenshots/walkthrough.gif`, a 960x720 four-view, 12-second loop covering the public homepage, blog, admin and documentation. Static screenshots remain available. Inspect each frame and keep the GIF below 1 MB; regenerate it when branding or primary screens change.
diff --git a/docs/admin/custom-pages.md b/docs/admin/custom-pages.md
index d8946f4..9cb2c6d 100644
--- a/docs/admin/custom-pages.md
+++ b/docs/admin/custom-pages.md
@@ -1,119 +1,7 @@
-# Custom Admin Pages
+# Custom admin pages
----
-**Supported Stack:** Laravel 13 / Filament 5 / Livewire 4 / Tailwind 4
-**Last Updated:** April 22, 2026
-**Source Files:** [Settings Page example](../../modules/Settings/views/filament/pages/settings.blade.php)
----
+The package Settings page lives under `packages/core/modules/Settings/src/Filament/Pages`. Its view namespace is `settings`. The demo Dashboard lives under `app/Filament/Pages` and is host-only.
-Filament Custom Pages let you build completely custom screens in the admin panel - dashboards, reports, settings forms, and more - without being tied to a specific Eloquent model.
+Use Filament 5's page APIs for your own application pages and register them in a custom panel. Enforce permissions again inside public Livewire mutation methods; navigation visibility alone is insufficient. Settings provides an example by checking edit permission in `save()`.
----
-
-## Creating a Custom Page
-
-```bash
-php artisan make:filament-page DashboardStats
-```
-
-Move to your module:
-```
-modules/Core/src/Filament/Pages/DashboardStats.php
-```
-
----
-
-## Custom Dashboard Page
-
-```php
-stats = [
- 'users' => User::count(),
- 'posts' => Post::where('status', 'published')->count(),
- 'drafts' => Post::where('status', 'draft')->count(),
- 'new_today' => User::whereDate('created_at', today())->count(),
- ];
- }
-}
-```
-
----
-
-## Custom Page View
-
-```blade
-{{-- modules/Core/views/filament/pages/dashboard-stats.blade.php --}}
-
- {{ str_replace('_', ' ', $key) }} {{ number_format($value) }} {{ $post->excerpt }}
-```
-
----
-
-## Livewire Optimization
-
-```php
-// Use lazy loading for heavy components
-@livewire('blog.blog-list', lazy: true)
-
-// Use wire:navigate for SPA-like navigation (Livewire 4)
-Blog
-
-// Minimize re-renders with computed properties
-#[Computed]
-public function posts()
-{
- return Post::published()->latest()->paginate(12);
-}
-```
-
----
-
-## Benchmark Your App
-
-```bash
-# Install k6 for load testing
-# https://k6.io
-
-# Or use Apache Benchmark
-ab -n 1000 -c 10 https://www.laracorekit.com/blog
-```
-
----
-
-## Monitoring
-
-Use these tools in production:
-
-| Tool | Purpose |
-|------|---------|
-| Laravel Telescope | Debug queries, jobs, requests |
-| Sentry | Error tracking |
-| UptimeRobot | Uptime monitoring |
-| New Relic / Datadog | APM (Application Performance Monitoring) |
-
----
-
-## Next Steps
-
-**[Testing →](../advanced/testing)**
+Use production builds, reviewed lockfiles, OPcache, appropriate cache storage and eager loading for public content. Paginate lists and measure real response times with representative data before making performance claims.
+Run `npm run build:core` for the package's prebuilt public stylesheet and `npm run build` for the demo host. Package consumers do not need the demo's npm dependencies to use default views. Test view overrides after changes.
+See [installation](/docs/installation) and [package architecture](/docs/core/architecture).
diff --git a/docs/deployment/production.md b/docs/deployment/production.md
index d54f2cf..32efb27 100644
--- a/docs/deployment/production.md
+++ b/docs/deployment/production.md
@@ -1,220 +1,38 @@
-# Production Setup
+# Production setup
-**Estimated time:** 15 minutes
-**Difficulty:** Intermediate
+Start with [package installation](/docs/installation) and test in staging. The package supplies frontend and admin features; your application remains responsible for infrastructure and operations.
----
+1. Set `APP_ENV=production`, `APP_DEBUG=false`, a unique application key and correct HTTPS `APP_URL`.
+2. Keep `DEMO_MODE=false`. Do not seed demo accounts or run the demo reset scheduler in a customer application.
+3. Install from reviewed lockfiles with `composer install --no-dev --optimize-autoloader`. Build and publish assets during deployment; do not run a Vite development server publicly.
+4. Back up data before running `php artisan migrate --force`. Create the first administrator using `php artisan laracorekit:admin` and a unique password.
+5. Configure transactional mail and test password recovery. Email-verification enforcement is not bundled.
+6. Configure storage, file-size/type restrictions, queue workers and scheduled tasks appropriate to your application. Run `php artisan storage:link` for public local uploads.
+7. Cache configuration/routes/views, monitor failures, test backups and restore procedures, and run dependency audits regularly.
+8. Verify anonymous visitors cannot read unpublished or future-dated posts, regular users cannot enter the admin panel, and editors cannot manage users or roles.
-This guide covers what you need to do to deploy LaraCoreKit to a live production server safely and efficiently.
+The installer never creates known production credentials. Registration is disabled by default. Login failures are rate limited; choose a shared cache store across application servers so limits apply consistently.
----
+Security reports belong in the repository's [security policy](https://github.com/ProgrammerNomad/LaraCoreKit/security/policy), not public issues containing sensitive details.
-## Pre-Deployment Checklist
+## Application deployment
-Before going live, verify:
-
-- [ ] `APP_ENV=production`
-- [ ] `APP_DEBUG=false`
-- [ ] `APP_URL` set to your real domain
-- [ ] Database configured with a strong password
-- [ ] Mail configured (Mailgun, SES, Postmark)
-- [ ] Storage configured (local or S3)
-- [ ] Queue worker running (Redis recommended)
-- [ ] HTTPS certificate installed (Let's Encrypt)
-- [ ] File permissions set correctly
-
----
-
-## Environment Variables
-
-```env
-APP_NAME="My App"
-APP_ENV=production
-APP_DEBUG=false
-APP_URL=https://www.laracorekit.com
-APP_KEY=base64:... # Generate with: php artisan key:generate
-
-LOG_CHANNEL=stack
-LOG_LEVEL=error
-
-DB_CONNECTION=mysql
-DB_HOST=127.0.0.1
-DB_PORT=3306
-DB_DATABASE=laracorekit_prod
-DB_USERNAME=dbuser
-DB_PASSWORD=very_secure_password_here
-
-BROADCAST_DRIVER=log
-CACHE_DRIVER=redis
-FILESYSTEM_DISK=local
-QUEUE_CONNECTION=redis
-SESSION_DRIVER=redis
-SESSION_LIFETIME=120
-
-REDIS_HOST=127.0.0.1
-REDIS_PORT=6379
-REDIS_PASSWORD=null
-
-MAIL_MAILER=smtp
-MAIL_HOST=smtp.mailgun.org
-MAIL_PORT=587
-MAIL_USERNAME=your@mailgun.org
-MAIL_PASSWORD=your-mailgun-key
-MAIL_FROM_ADDRESS=noreply@laracorekit.com
-MAIL_FROM_NAME="${APP_NAME}"
-```
-
----
-
-## Deployment Script
+Install the tagged Packagist package in a fresh Laravel application as described in the installation guide. Commit the resulting application lockfile. Deploy from that lockfile rather than resolving new versions on the production server:
```bash
-#!/bin/bash
-set -e
-
-# Navigate to app
-cd /var/www/laracorekit
-
-# Pull latest code
-git pull origin main
-
-# Install/update PHP dependencies
-composer install --no-dev --optimize-autoloader --no-interaction
-
-# Install/build frontend
-npm ci && npm run build
-
-# Cache everything
-php artisan config:cache
-php artisan route:cache
-php artisan view:cache
-php artisan event:cache
-
-# Run migrations
+composer install --no-dev --prefer-dist --optimize-autoloader
+php artisan laracorekit:install
php artisan migrate --force
-
-# Create storage symlink (if not exists)
php artisan storage:link
-
-# Restart queue workers
-php artisan queue:restart
-
-echo " Deployment complete!"
-```
-
-Make it executable:
-```bash
-chmod +x deploy.sh
-./deploy.sh
-```
-
----
-
-## Nginx Configuration
-
-```nginx
-server {
- listen 80;
- listen 443 ssl http2;
- server_name www.laracorekit.com laracorekit.com;
- root /var/www/laracorekit/public;
- index index.php;
-
- ssl_certificate /etc/letsencrypt/live/laracorekit.com/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/laracorekit.com/privkey.pem;
-
- # Redirect HTTP to HTTPS
- if ($scheme != "https") {
- return 301 https://$server_name$request_uri;
- }
-
- # Gzip Compression
- gzip on;
- gzip_types text/plain text/css application/json application/javascript;
-
- # Browser caching for assets
- location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
- expires 1y;
- add_header Cache-Control "public, immutable";
- try_files $uri =404;
- }
-
- location / {
- try_files $uri $uri/ /index.php?$query_string;
- }
-
- location ~ \.php$ {
- fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
- fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
- include fastcgi_params;
- }
-
- location ~ /\. {
- deny all;
- }
-}
-```
-
----
-
-## File Permissions
-
-```bash
-# Set correct ownership
-sudo chown -R www-data:www-data /var/www/laracorekit
-
-# Set permissions
-sudo find /var/www/laracorekit -type f -exec chmod 644 {} \;
-sudo find /var/www/laracorekit -type d -exec chmod 755 {} \;
-
-# Storage and cache dirs need write access
-sudo chmod -R 775 /var/www/laracorekit/storage
-sudo chmod -R 775 /var/www/laracorekit/bootstrap/cache
-```
-
----
-
-## Queue Worker (Supervisor)
-
-```ini
-; /etc/supervisor/conf.d/laracorekit-queue.conf
-[program:laracorekit-queue]
-process_name=%(program_name)s_%(process_num)02d
-command=php /var/www/laracorekit/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
-autostart=true
-autorestart=true
-stopasgroup=true
-killasgroup=true
-user=www-data
-numprocs=2
-redirect_stderr=true
-stdout_logfile=/var/log/laracorekit-queue.log
-stopwaitsecs=3600
-```
-
-```bash
-supervisorctl reread
-supervisorctl update
-supervisorctl start laracorekit-queue:*
-```
-
----
-
-## Scheduled Tasks (Cron)
-
-```cron
-* * * * * www-data php /var/www/laracorekit/artisan schedule:run >> /dev/null 2>&1
-```
-
-Add via:
-```bash
-crontab -e -u www-data
+php artisan optimize
```
----
+Run migrations only after a backup and staging verification. The package installer preserves published configuration and refreshes assets. The package's default public views do not require the demo host's npm build. Custom frontend assets still need their own build.
-## Next Steps
+## Website and demonstration host
-**[Docker →](docker)**
+The main repository is also a development monorepo: it uses its local `packages/core` source through Composer, so keep that directory in the deployment checkout. Build core and host assets with `npm ci`, `npm run build:core` and `npm run build`. Point the HTTPS document root only at `public/`; keep `.env`, storage logs and database backups private. Use a dedicated database and storage for any disposable demo, with least-privilege database credentials separated from customer infrastructure.
+Verify mail delivery, password recovery, uploads, authorization, scheduled jobs, queue workers and backup restoration in the actual deployment environment. Check Laravel's `/up` health endpoint and representative public/admin routes after deployment. Source validation alone does not verify TLS, server configuration or operational readiness.
+GitHub Actions may remain blocked by account billing even when local checks pass. Resolve that account state and pass the configured PHP/database/build/consumer jobs before treating remote validation as complete. No independent security certification or production deployment is implied by the release tag.
diff --git a/docs/faq.md b/docs/faq.md
index b1a571b..92b2176 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -1,418 +1,35 @@
-# Frequently Asked Questions (FAQ)
+# Frequently asked questions
-Comprehensive answers to common questions about LaraCoreKit.
+## Is this only an admin panel?
----
+No. The package provides a public Livewire frontend and a Filament admin workspace, with shared users, roles, blog, settings and media.
-## General Questions
+## Should I clone GitHub or install with Composer?
-### What is LaraCoreKit?
+Install `programmernomad/laracorekit:"^0.1"` from Packagist in a fresh Laravel application for your product. Clone the full repository to run the demo website, docs and showcase or contribute. GitHub dev-main is for testing unreleased changes.
-LaraCoreKit is a modular Laravel 13 starter kit that provides a feature-rich foundation for building admin-driven and content-driven applications. It combines Filament 5 (admin panel), Livewire 4 (dynamic frontend), and Tailwind 4 (styling) with built-in modules for auth, blog, media, settings, multilingual support, and RTL layouts.
+For Composer, first run `composer create-project laravel/laravel my-app "^13.0"` and enter `my-app`. Requiring the core and running its installer alone do not finish setup: configure the database, migrate and create an administrator. A GitHub clone already contains Laravel, but still needs environment setup and asset builds. Follow the [complete installation commands](/docs/installation) for your chosen path.
-### Is LaraCoreKit free?
+## Does Composer install the demo too?
-Yes, 100% free and open-source under the MIT license. You can use it for personal projects, commercial projects, and client work without any restrictions.
+No. The package has no dependency on the demo module, marketing website, Docs module or UIShowcase module. Its own Laravel/Filament dependencies still need to be downloaded.
-### Who maintains LaraCoreKit?
+## Can I update my application later?
-Created and maintained by Shiv Singh (ProgrammerNomad) and the open-source community. It is a community-driven project.
+Yes, package code can be updated through Composer. Your application code and view overrides stay outside vendor. Read release notes, back up data and test migrations in staging. Before 1.0, pin a tested minor release series.
-### Is LaraCoreKit production-ready?
+## Can I add it to an existing application?
-LaraCoreKit is actively developed with quality assurance tools (tests, code formatting, static analysis). As a newer project, we recommend thorough testing before production deployment.
+The initial supported path is a fresh Laravel 13 application. Existing authentication models, route names, tables and Modules namespaces require compatibility review. The installer does not resolve those conflicts automatically.
-### What are the system requirements?
+## Is everything advertised implemented?
-- PHP 8.3 or higher
-- Composer 2.x
-- Node.js 18.x or higher
-- MySQL 8.0+, PostgreSQL 13+, or SQLite 3.x
-- 512MB RAM minimum (2GB+ recommended)
+The installation and introduction pages list the implemented scope. API tokens, email-verification enforcement, billing, tenancy and a module marketplace are not bundled. There is no claim of a completed independent security audit.
----
+## Are installations tracked?
-## Installation & Setup
+No telemetry or registration is required. Packagist downloads indicate distribution activity, but cannot identify developers or count unique active installations.
-### I get "Class not found" errors
+## Can AI tools read the documentation?
-```bash
-composer dump-autoload
-php artisan optimize:clear
-```
-
-### Migration fails with database connection error
-
-1. Check `.env` database credentials
-2. Ensure database server is running
-3. For MySQL, create database: `CREATE DATABASE laracorekit;`
-
-### Vite build fails with Node.js errors
-
-```bash
-rm -rf node_modules package-lock.json
-npm install --legacy-peer-deps
-npm run build
-```
-
-### White screen after installation
-
-Check:
-- `.env` file exists and configured
-- Storage permissions: `chmod -R 755 storage bootstrap/cache`
-- Run `php artisan config:clear`
-- Check `storage/logs/laravel.log`
-
----
-
-## Features
-
-### Does it include a blog?
-
-Yes! Full blog module with multilingual posts, rich text editor, SEO fields, draft/published states, Filament admin, and Livewire frontend.
-
-### Does it support e-commerce?
-
-UI components are included, but no full e-commerce module yet. Planned as future addon module.
-
-### Does it have payment integration?
-
-No, payment systems are planned as separate addon modules (Stripe, Razorpay, PayPal).
-
-### Can I build a SaaS with this?
-
-Partially. Includes foundation (auth, admin, roles/permissions, API), but lacks subscription billing and multi-tenancy. These are planned as addon modules.
-
-### How many languages are included?
-
-Three: English, Hindi, and Arabic. Easy to add more via JSON translation files.
-
-### What's included in the 175+ components?
-
-Typography, Buttons, Forms, Navigation, Layouts, Data Display, Feedback, Charts, Media, Auth, E-commerce, and Advanced components.
-
----
-
-## Modules
-
-### Can I remove modules I don't need?
-
-Yes! Each module is self-contained. To remove:
-1. Delete module directory
-2. Remove service provider from `bootstrap/providers.php`
-3. Remove module routes
-4. Update tests
-
-### Can I disable a built-in module?
-
-Set `enabled => false` in `config/modules.php`, then run `php artisan optimize:clear`.
-
-### Can I create my own modules?
-
-Yes! See [Module Development Guide](https://www.laracorekit.com/docs/contributing/module-development).
-
-### I added a new module but routes aren't loading
-
-1. Add to `config/modules.php` with `enabled => true`
-2. Add namespace to `composer.json` autoload psr-4
-3. Run `composer dump-autoload && php artisan optimize:clear`
-
----
-
-## Admin Panel
-
-### I can't log into the admin panel
-
-Create admin user:
-```bash
-php artisan filament:user
-```
-
-### How do I change the admin URL?
-
-Edit `app/Providers/Filament/AdminPanelProvider.php`:
-```php
-->path('dashboard') // Changes /admin to /dashboard
-```
-
-### Where are Filament admin resources?
-
-Inside each module: `modules/{Module}/src/Filament/Resources/`
-
-### Filament admin not loading
-
-Check:
-- Admin user created
-- Assets published: `php artisan filament:assets`
-- Clear cache: `php artisan cache:clear`
-
----
-
-## Customization
-
-### Can I change the design/styling?
-
-Yes! Edit `tailwind.config.js`, modify Blade templates, add custom CSS in `resources/css/app.css`, then run `npm run build`.
-
-### Can I use Bootstrap instead of Tailwind?
-
-Not recommended. Entire UI built with Tailwind. Switching requires rewriting all templates.
-
-### Can I use Inertia instead of Livewire?
-
-Not easily. Livewire deeply integrated. Consider Laravel Breeze with Inertia for that preference.
-
-### Can I customize UI components?
-
-Yes! Edit directly in `modules/*/views/`, extend with your variants, or replace entirely.
-
----
-
-## Multilingual & RTL
-
-### How does multilingual content work?
-
-Two approaches:
-1. **Static text** - JSON files in `lang/` directories
-2. **Database content** - JSON columns for translatable fields
-
-### How do I add a new language?
-
-1. Add `lang/fr.json`
-2. Add to each module: `modules/*/lang/fr.json`
-3. Update language switcher
-4. Add to `config/app.php` supported locales
-
-### How does RTL support work?
-
-- Locale middleware detects Arabic/Hebrew
-- Tailwind RTL plugin handles layout mirroring
-- Use `rtl:` prefix for custom RTL styles
-
-### Can I make the site RTL by default?
-
-Set default locale in `config/app.php`:
-```php
-'locale' => 'ar',
-```
-
----
-
-## Development
-
-### How do I run tests?
-
-```bash
-php artisan test
-# Or
-composer test
-```
-
-### How do I check code quality?
-
-```bash
-composer review # Runs all checks
-# Or individually:
-composer pint # Format code
-composer pint-test # Check style
-composer phpstan # Static analysis
-```
-
-### How do I enable debug mode?
-
-Edit `.env`:
-```env
-APP_DEBUG=true
-APP_ENV=local
-```
-Never enable in production!
-
-### I updated a view but see old content
-
-```bash
-php artisan view:clear
-```
-
-### How do I see SQL queries?
-
-Install Laravel Telescope:
-```bash
-composer require laravel/telescope --dev
-php artisan telescope:install
-php artisan migrate
-```
-Visit `/telescope`
-
----
-
-## Deployment
-
-### Can I deploy to shared hosting?
-
-Yes, but requires PHP 8.3+, Composer, Node.js, and SSH. Modern platforms (Forge, Vapor, DigitalOcean) recommended.
-
-### Does it work with Docker?
-
-Yes! Works with Laravel Sail or custom Docker setups:
-```bash
-composer require laravel/sail --dev
-php artisan sail:install
-./vendor/bin/sail up
-```
-
-### Does it work with Laravel Forge/Vapor?
-
-Yes! Standard Laravel application compatible with all Laravel deployment tools.
-
-### How do I set up queues?
-
-Configure in `.env`:
-```env
-QUEUE_CONNECTION=database
-```
-
-Run:
-```bash
-php artisan queue:table
-php artisan migrate
-php artisan queue:work
-```
-
-For production, use Supervisor.
-
----
-
-## Performance & Security
-
-### How do I speed up my app?
-
-```bash
-php artisan optimize # Cache everything
-```
-
-Use Redis for cache/sessions/queues in `.env`:
-```env
-CACHE_DRIVER=redis
-SESSION_DRIVER=redis
-QUEUE_CONNECTION=redis
-```
-
-### Is LaraCoreKit secure?
-
-Includes: CSRF protection, XSS protection, SQL injection protection, password hashing, rate limiting, Sanctum API auth, and RBAC.
-
-### How do I report security vulnerabilities?
-
-Use GitHub Security Advisories (recommended):
-- https://github.com/ProgrammerNomad/LaraCoreKit/security/advisories/new
-
-Or contact the repository owner directly through GitHub. See [Security Policy](SECURITY.md) for full details.
-
-**Do not create public issues for security vulnerabilities.**
-
-### Is it GDPR compliant?
-
-Provides tools (data export, deletion) but compliance is your responsibility. Consult legal counsel.
-
----
-
-## Comparisons
-
-### LaraCoreKit vs Laravel Breeze?
-
-- Breeze: Minimal auth only
-- LaraCoreKit: Full starter with admin, blog, media, settings
-
-Use Breeze for minimal auth, LaraCoreKit for complete foundation.
-
-### LaraCoreKit vs Laravel Jetstream?
-
-- Jetstream: Auth + teams + 2FA + API
-- LaraCoreKit: Auth + admin + blog + media + multilingual
-
-Different focus: Jetstream on auth, LaraCoreKit on content management.
-
-### LaraCoreKit vs Filament?
-
-- Filament: Admin panel framework
-- LaraCoreKit: Complete starter using Filament
-
-LaraCoreKit includes Filament plus frontend, modules, multilingual.
-
-See detailed comparisons:
-- [LaraCoreKit vs Larament](comparisons/laracorekit-vs-larament.md)
-- [LaraCoreKit vs Official Livewire Starter](comparisons/laracorekit-vs-livewire-starter.md)
-
----
-
-## Troubleshooting
-
-### Images not displaying
-
-Check:
-- Storage linked: `php artisan storage:link`
-- Permissions: `chmod -R 755 storage`
-- Config: `config/filesystems.php`
-- APP_URL in `.env`
-
-### Dark mode not working
-
-Add to `` tag:
-```blade
-
-```
-
-Or toggle with Alpine.js:
-```javascript
-document.documentElement.classList.toggle('dark');
-```
-
----
-
-## Support
-
-### Where can I get help?
-
-- **Documentation:** https://www.laracorekit.com/docs
-- **GitHub Issues:** https://github.com/ProgrammerNomad/LaraCoreKit/issues
-- **Discussions:** https://github.com/ProgrammerNomad/LaraCoreKit/discussions
-
-### How do I report bugs?
-
-Use [Bug Report template](https://github.com/ProgrammerNomad/LaraCoreKit/issues/new?template=bug_report.md) with Laravel version, PHP version, steps to reproduce, and error logs.
-
-### Can I contribute?
-
-Yes! See [Contributing Guide](CONTRIBUTING.md). Fix bugs, add features, improve docs, write tests, or help in discussions.
-
-### Is there paid support?
-
-Not currently. Community support is available via GitHub Discussions and Issues. See [Support section in README](../README.md#support).
-
----
-
-## License
-
-### Can I use this for client projects?
-
-Yes! MIT license allows commercial use without restriction.
-
-### Do I need to credit LaraCoreKit?
-
-Not required, but appreciated! Only requirement is including the license file.
-
-### Can I sell products built with LaraCoreKit?
-
-Yes! MIT license allows commercial products.
-
-### Can I create paid themes/modules?
-
-Yes! Create and sell extensions for LaraCoreKit.
-
----
-
-**Don't see your question?**
-
-Search [GitHub Issues](https://github.com/ProgrammerNomad/LaraCoreKit/issues) or ask in [Discussions](https://github.com/ProgrammerNomad/LaraCoreKit/discussions).
-
-Last updated: April 22, 2026
+Documentation is server-rendered HTML with stable links and a plain-text index at `/llms.txt`. Markdown source is available under `/docs-source/{page}`. These formats help tools retrieve accurate information; they do not guarantee search rankings or recommendations.
diff --git a/docs/features/authentication.md b/docs/features/authentication.md
index a89db6b..e06b817 100644
--- a/docs/features/authentication.md
+++ b/docs/features/authentication.md
@@ -1,202 +1,11 @@
-# Features: Authentication
+# Authentication
----
-**Supported Stack:** Laravel 13 / Filament 5 / Livewire 4 / Tailwind 4
-**Module Status:** Core
-**Last Updated:** April 22, 2026
-**Source Files:** [Auth Module](../../modules/Auth/) | [Login Component](../../modules/Auth/views/livewire/login.blade.php)
----
+The Auth module implements session login, optional public registration, logout, password recovery and an authenticated account dashboard using Livewire. It is custom application code, not an installed Breeze scaffold. Sanctum API tokens and email-verification enforcement are not implemented.
-LaraCoreKit's Auth module provides a complete, production-ready authentication system built on **Laravel Breeze** with added enhancements for multilingual support, admin integration, and API token management.
+Routes: `/login`, `/forgot-password`, `/reset-password/{token}`, `/dashboard` and POST `/logout`. `/register` exists only when `laracorekit.registration` is enabled. Form submission uses Livewire actions, not standalone POST login/register controllers.
----
+Login failures are limited per normalized email/IP and per IP. Successful login regenerates the session and clears the account counter. Registration and reset requests are rate limited. Configure a shared cache in multi-server deployments and working mail transport for password recovery.
-## What's Included
-
-| Feature | Status |
-|---------|--------|
-| Login / Register | |
-| Email Verification | |
-| Password Reset | |
-| Remember Me | |
-| Sanctum API Tokens | |
-| Filament Admin Auth | |
-| Multilingual Forms | |
-
----
-
-## Module Location
-
-```
-modules/Auth/
-├── src/
-│ ├── AuthServiceProvider.php
-│ └── Http/
-│ └── Livewire/
-│ ├── Login.php
-│ ├── Register.php
-│ └── ForgotPassword.php
-├── views/
-│ └── auth/
-│ ├── login.blade.php
-│ └── register.blade.php
-└── routes/
- └── web.php
-```
-
----
-
-## Routes
-
-The Auth module registers these routes automatically:
-
-```php
-GET /login → Auth\Login
-POST /login → Auth\Login (Livewire action)
-GET /register → Auth\Register
-POST /register → Auth\Register (Livewire action)
-GET /forgot-password → Auth\ForgotPassword
-POST /forgot-password → Email password reset link
-GET /reset-password/{token}
-POST /logout
-GET /email/verify
-GET /email/verify/{id}/{hash}
-```
-
----
-
-## Login Component
-
-The `Login` Livewire component handles authentication:
-
-```php
-namespace Modules\Auth\Http\Livewire;
-
-use Livewire\Component;
-use Illuminate\Support\Facades\Auth;
-
-class Login extends Component
-{
- public string $email = '';
- public string $password = '';
- public bool $remember = false;
-
- public function login()
- {
- $this->validate([
- 'email' => 'required|email',
- 'password' => 'required|min:6',
- ]);
-
- if (!Auth::attempt(['email' => $this->email, 'password' => $this->password], $this->remember)) {
- $this->addError('email', __('auth.failed'));
- return;
- }
-
- redirect()->intended('/dashboard');
- }
-}
-```
-
----
-
-## Protecting Routes
-
-Use standard Laravel middleware to protect routes:
-
-```php
-// In any module's routes/web.php
-Route::middleware(['auth'])->group(function () {
- Route::get('/dashboard', DashboardPage::class)->name('dashboard');
-});
-
-// Verify email
-Route::middleware(['auth', 'verified'])->group(function () {
- Route::get('/profile', ProfilePage::class)->name('profile');
-});
-```
-
----
-
-## Admin Authentication
-
-Filament admin authentication is handled separately. Admin users must be explicitly created:
-
-```bash
-php artisan filament:user
-```
-
-Under the hood, Filament checks `canAccessFilament()` on the User model via a Filament Panel configuration in `app/Providers/Filament/AdminPanelProvider.php`.
-
----
-
-## Email Verification
-
-Enable email verification by implementing `MustVerifyEmail` on the User model:
-
-```php
-use Illuminate\Contracts\Auth\MustVerifyEmail;
-
-class User extends Authenticatable implements MustVerifyEmail
-{
- // ...
-}
-```
-
-Configure your mail settings in `.env`:
-
-```env
-MAIL_MAILER=smtp
-MAIL_HOST=smtp.mailgun.org
-MAIL_PORT=587
-MAIL_USERNAME=your@mailgun.org
-MAIL_PASSWORD=secret
-MAIL_FROM_ADDRESS=noreply@laracorekit.com
-```
-
----
-
-## Sanctum API Tokens
-
-For API authentication, Sanctum is pre-configured:
-
-```php
-// Create a token for the authenticated user
-$token = $user->createToken('my-app')->plainTextToken;
-
-// Revoke all tokens
-$user->tokens()->delete();
-```
-
-API routes should use:
-
-```php
-Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
- return $request->user();
-});
-```
-
----
-
-## Customization
-
-### Custom Login Redirect
-
-Override the `redirectTo` property in the Login component:
-
-```php
-protected string $redirectTo = '/dashboard';
-```
-
-### Custom Guards
-
-Add a new guard in `config/auth.php` and create a corresponding provider.
-
----
-
-## Next Steps
-
-**[Users & Profiles →](users)**
-
-Learn how to manage user profiles, avatars, and extended user data.
+Registration creates an ordinary User role and redirects to the account dashboard. Administrative access requires the appropriate role and resource permissions. Create administrators with `php artisan laracorekit:admin`.
+See [installation](/docs/installation) and [package architecture](/docs/core/architecture).
diff --git a/docs/features/blog.md b/docs/features/blog.md
index 2c00a13..3f1f98d 100644
--- a/docs/features/blog.md
+++ b/docs/features/blog.md
@@ -1,139 +1,9 @@
-# Blog System
+# Blog
----
-**Supported Stack:** Laravel 13 / Filament 5 / Livewire 4 / Tailwind 4
-**Module Status:** Core
-**Last Updated:** April 22, 2026
-**Source Files:** [BlogResource](../../modules/Blog/src/Filament/Resources/BlogResource.php) | [Routes](../../modules/Blog/routes/web.php) | [Post Model](../../modules/Blog/src/Models/Post.php)
----
+Blog supports JSON translations for titles, excerpts, content, categories and metadata, unique slugs, authors, draft/published/archived status, featured posts, publication timestamps and soft deletion.
-The Blog module in LaraCoreKit provides a fully multilingual blog system with SEO-friendly slugs, categories, and Filament admin integration.
+Public routes are `/blog` and `/blog/{slug}`. The published scope requires published status and a publication time at or before now, so future-dated posts and drafts remain private. Blog HTML is sanitized before public rendering. The list includes search, categories and pagination; related-post filtering uses Laravel JSON queries rather than MySQL-specific raw SQL.
----
+Filament BlogResource provides authoring and permission checks. Featured-image and gallery attachments use Media Library. Configure storage and workers for the media operations you enable. Blog depends on User and Media.
-## Features
-
-- Multilingual posts (EN, HI, AR)
-- SEO-friendly slugs
-- Categories and tags
-- Featured images via Media Library
-- Draft/Published status
-- Author attribution
-- Filament admin CRUD
-
----
-
-## Routes
-
-```
-GET /blog → BlogList (Livewire)
-GET /blog/{slug} → BlogDetail (Livewire)
-GET /admin/posts → Filament admin
-```
-
----
-
-## Post Model
-
-```php
-namespace Modules\Blog\Models;
-
-use Illuminate\Database\Eloquent\Model;
-use Spatie\MediaLibrary\HasMedia;
-use Spatie\MediaLibrary\InteractsWithMedia;
-
-class Post extends Model implements HasMedia
-{
- use InteractsWithMedia;
-
- protected $fillable = [
- 'title', 'slug', 'content', 'excerpt',
- 'status', 'locale', 'author_id', 'published_at',
- ];
-
- public function scopePublished($query)
- {
- return $query->where('status', 'published');
- }
-
- public function scopeLocale($query, string $locale)
- {
- return $query->where('locale', $locale);
- }
-}
-```
-
----
-
-## Creating a Post Programmatically
-
-```php
-use Modules\Blog\Models\Post;
-
-Post::create([
- 'title' => 'Getting Started with LaraCoreKit',
- 'slug' => 'getting-started-with-laracorekit',
- 'content' => '...',
- 'excerpt' => 'A short summary of the post.',
- 'status' => 'published',
- 'locale' => 'en',
- 'published_at' => now(),
-]);
-```
-
----
-
-## Displaying Posts in Blade
-
-```blade
-@foreach($posts as $post)
-
{{ $post->title }}
-
-```
-
----
-
-## Admin Media Library
-
-Access the media browser at `/admin/media` to:
-- Browse all uploaded files
-- Delete unused media
-- Preview images
-
----
-
-## Storage Configuration
-
-For production, use S3:
-
-```env
-FILESYSTEM_DISK=s3
-AWS_ACCESS_KEY_ID=your-key
-AWS_SECRET_ACCESS_KEY=your-secret
-AWS_DEFAULT_REGION=us-east-1
-AWS_BUCKET=your-bucket
-```
-
----
-
-## Next Steps
-
-**[Settings →](settings)**
+The Media module supplies infrastructure, not a standalone `/admin/media` library resource. Automatic thumbnails, a full media browser and storage-specific configuration should not be assumed. Configure permitted file types, size limits, storage and queue behavior for your application, and test uploads before deployment.
+Run `php artisan storage:link` when using public local storage. S3 requires your own disk configuration and credentials. The demo's reset behavior is separate from this module.
+See [installation](/docs/installation) and [package architecture](/docs/core/architecture).
diff --git a/docs/features/multilingual.md b/docs/features/multilingual.md
index 0ca7365..f5fe5bf 100644
--- a/docs/features/multilingual.md
+++ b/docs/features/multilingual.md
@@ -1,131 +1,9 @@
-# Multilingual Support
+# Multilingual content
----
-**Supported Stack:** Laravel 13 / Filament 5 / Livewire 4 / Tailwind 4
-**Module Status:** Core
-**Last Updated:** April 22, 2026
-**Source Files:** [LocaleSwitcher](../../modules/Core/src/Http/Livewire/LocaleSwitcher.php) | [Middleware](../../modules/Core/src/Http/Middleware/SetLocale.php)
----
+English, Hindi and Arabic are the default locale choices. Core supplies language switching and locale middleware, while package JSON translations provide interface text. Blog/settings fields can store language-keyed JSON values.
-LaraCoreKit ships with multilingual support for **English**, **Hindi**, and **Arabic** out of the box, including automatic RTL layout switching for Arabic.
+The session locale is checked against configured supported locales before application locale is changed. The locale switch returns to the application's root. Content views generally fall back to English when a field translation is missing.
----
+Adding a language requires configuring its locale, labels, JSON translations and any content/form fields your application needs. The demo marketing copy may fall back to English; supported locale selection does not imply every site paragraph is translated.
-## Supported Languages
-
-| Code | Language | Direction | Flag |
-|------|----------|-----------|------|
-| `en` | English | LTR | |
-| `hi` | Hindi | LTR | |
-| `ar` | Arabic | RTL | |
-
----
-
-## Locale Switcher
-
-The `LocaleSwitcher` Livewire component (Core module) handles language switching:
-
-```blade
-@livewire('locale-switcher')
-```
-
-It stores the selected locale in the session and redirects back with the new locale active.
-
-**Component:** `modules/Core/src/Http/Livewire/LocaleSwitcher.php`
-
----
-
-## Translation Files
-
-### JSON translations (recommended for UI strings)
-
-```
-lang/
-├── en.json
-├── hi.json
-└── ar.json
-```
-
-```json
-// lang/hi.json
-{
- "Welcome": "स्वागत है",
- "Log in": "लॉग इन करें",
- "Register": "पंजीकरण करें"
-}
-```
-
-### PHP translation files (for organized namespaced strings)
-
-```php
-// lang/hi/auth.php
-return [
- 'failed' => 'प्रमाण-पत्र इनमें से किसी से मेल नहीं खाते।',
- 'throttle' => 'बहुत अधिक लॉगिन प्रयास।',
-];
-```
-
----
-
-## Using Translations in Blade
-
-```blade
-{{ __('Welcome') }}
-{{ __('Hello, :name!', ['name' => $user->name]) }}
-@lang('auth.failed')
-```
-
----
-
-## Using Translations in PHP
-
-```php
-__('Welcome');
-trans('auth.failed');
-app()->getLocale(); // 'en', 'hi', 'ar'
-```
-
----
-
-## Detecting Current Locale
-
-```php
-$locale = app()->getLocale();
-$isRTL = in_array($locale, ['ar']);
-```
-
----
-
-## Adding a New Language
-
-1. Create `lang/{locale}.json` with translations:
-
-```json
-// lang/fr.json
-{
- "Welcome": "Bienvenue",
- "Log in": "Se connecter"
-}
-```
-
-2. Add to the locale switcher options in `CoreServiceProvider.php`
-
-3. If it's RTL, add to the RTL detection in your layout
-
----
-
-## SEO with Multilingual
-
-Use `hreflang` tags for multilingual SEO:
-
-```blade
-
-
-
-```
-
----
-
-## Next Steps
-
-**[RTL Support →](rtl-support)**
+See [installation](/docs/installation) and [package architecture](/docs/core/architecture).
diff --git a/docs/features/roles-permissions.md b/docs/features/roles-permissions.md
index dc83cb8..25355bb 100644
--- a/docs/features/roles-permissions.md
+++ b/docs/features/roles-permissions.md
@@ -1,136 +1,9 @@
-# Roles & Permissions
+# Roles and permissions
----
-**Supported Stack:** Laravel 13 / Filament 5 / Livewire 4 / Tailwind 4
-**Module Status:** Core
-**Last Updated:** April 22, 2026
-**Source Files:** [RoleResource](../../modules/User/src/Filament/Resources/RoleResource.php) | [Config](../../config/permission.php)
----
+Spatie Laravel Permission supplies authorization. `RolePermissionSeeder` creates Admin, Editor and User roles with permissions for user/role management, blog actions, settings and media-related operations. It never promotes a user based on a well-known email address.
-LaraCoreKit uses **Spatie Laravel Permission** for role-based access control (RBAC), pre-configured and seeded with sensible defaults.
+The User model permits Admin and Editor roles into the panel. Resources additionally check the relevant permissions for viewing, creating, editing and deleting records; entering the panel does not grant access to every resource. Settings saves check `edit-settings`. Blog publication checks `publish-blog`.
----
+Default editors can author and publish blog content but cannot manage users or roles. Test custom roles and direct resource URLs when extending authorization. Do not treat hidden navigation items as a security boundary.
-## Default Roles
-
-| Role | Description |
-|------|-------------|
-| `super-admin` | Full access to everything |
-| `admin` | Access to admin panel |
-| `editor` | Can manage blog content |
-| `user` | Standard registered user |
-
----
-
-## Default Permissions
-
-| Permission | Description |
-|-----------|-------------|
-| `view users` | List all users |
-| `edit users` | Update user profiles |
-| `delete users` | Remove users |
-| `manage posts` | Full blog post access |
-| `manage settings` | Change site configuration |
-
----
-
-## Assigning Roles
-
-```php
-// Assign a single role
-$user->assignRole('editor');
-
-// Assign multiple roles
-$user->assignRole('editor', 'user');
-
-// Sync roles (removes old ones)
-$user->syncRoles(['editor', 'user']);
-
-// Remove a role
-$user->removeRole('editor');
-```
-
----
-
-## Checking Roles & Permissions
-
-```php
-// Check role
-$user->hasRole('admin');
-$user->hasAnyRole(['admin', 'super-admin']);
-$user->hasAllRoles(['admin', 'editor']);
-
-// Check permission
-$user->can('edit posts');
-$user->hasPermissionTo('delete users');
-
-// Via Gate facade
-Gate::allows('manage posts');
-```
-
----
-
-## In Blade Templates
-
-```blade
-@role('admin')
- Admin Panel
-@endrole
-
-@can('edit posts')
- Edit Post
-@endcan
-
-@hasanyrole('admin|editor')
- {{-- Admin or editor content --}}
-@endhasanyrole
-```
-
----
-
-## In Middleware
-
-```php
-// In routes
-Route::middleware(['role:admin'])->group(function () {
- Route::get('/admin', AdminDashboard::class);
-});
-
-Route::middleware(['permission:manage posts'])->group(function () {
- Route::get('/posts/create', CreatePost::class);
-});
-```
-
----
-
-## Creating Custom Roles
-
-Via Seeder:
-
-```php
-use Spatie\Permission\Models\Role;
-use Spatie\Permission\Models\Permission;
-
-// Create role
-$role = Role::create(['name' => 'moderator']);
-
-// Create permission
-$permission = Permission::create(['name' => 'moderate comments']);
-
-// Assign permission to role
-$role->givePermissionTo('moderate comments');
-```
-
----
-
-## Admin Panel
-
-Manage roles and permissions from the Filament admin:
-- `/admin/roles` - Create, edit, delete roles
-- `/admin/users` - Assign roles to users
-
----
-
-## Next Steps
-
-**[Blog System →](blog)**
+See [installation](/docs/installation) and [package architecture](/docs/core/architecture).
diff --git a/docs/features/rtl-support.md b/docs/features/rtl-support.md
index 8592a52..6caeb15 100644
--- a/docs/features/rtl-support.md
+++ b/docs/features/rtl-support.md
@@ -1,105 +1,7 @@
-# RTL Support
+# Right-to-left layouts
----
-**Supported Stack:** Laravel 13 / Filament 5 / Livewire 4 / Tailwind 4
-**Module Status:** Core
-**Last Updated:** April 22, 2026
----
+The shared public layout sets `dir="rtl"` for Arabic and `ltr` otherwise. The website uses logical spacing where practical, and Filament supplies its own locale-aware interface.
-LaraCoreKit automatically enables RTL (right-to-left) layout when the Arabic locale is active, without any additional setup required.
+Test your custom views, dropdown alignment, tables and embedded widgets in Arabic. Direction switching does not translate text automatically. The component showcase contains examples rather than a guarantee that every third-party widget is RTL compatible.
----
-
-## How It Works
-
-The layout detects the current locale and sets the HTML `dir` attribute automatically:
-
-```blade
-
-```
-
-When `ar` locale is set, the entire page flips to RTL - text, navigation, sidebars, and all components.
-
----
-
-## TailwindCSS v4 RTL Classes
-
-TailwindCSS v4 supports RTL modifiers natively:
-
-```html
-
-
Page content here
-