
###> symfony/framework-bundle ###
/.env.local
/.env.local.php
/.env.*.local
/config/secrets/prod/prod.decrypt.private.php
# Regenerated by Symfony on every cache warm-up, and not deterministically:
# the order of two keys inside one @psalm-type block flips between runs, so a
# tracked copy shows a phantom two-line diff after any command that boots the
# kernel. Its own header says it is auto-generated and for apps only — it is a
# build artefact that exists to help an IDE, not source.
/config/reference.php
/public/bundles/
/var/
/vendor/
###< symfony/framework-bundle ###

###> phpunit/phpunit ###
/phpunit.xml
/.phpunit.cache/
###< phpunit/phpunit ###

###> symfony/asset-mapper ###
/public/assets/
/assets/vendor/
###< symfony/asset-mapper ###

# IDE
.idea/
.vscode/

# Personal compose overrides; compose auto-loads them, so they never get committed.
compose.override.yaml
docker-compose.override.yml

# Mutex directory for the one-time `composer install` in the dev entrypoint.
/.composer-install.lock/

# Symfony CLI reads a php.ini here and passes it to the PHP-FPM behind
# `symfony serve`. CI writes one (a copy of frankenphp/conf.d/10-app.ini) so the
# local server gets the same upload limits as the Docker image. Committing one
# would override those limits for everyone, from a file nothing points at.
/php.ini


###> lexik/jwt-authentication-bundle ###
/config/jwt/*.pem
###< lexik/jwt-authentication-bundle ###

###> playwright ###
/node_modules/
/test-results/
/playwright-report/
/blob-report/
# Saved storage state from auth.setup.ts — a real authenticated session.
/playwright/.auth/
###< playwright ###
todo.md

###> plmail site ###
# Built by bin/build-site.php and published by .github/workflows/pages.yml.
# Never committed: it is generated from README.md and docs/, so a copy in git
# is a second answer to the same question.
/build/
###< plmail site ###
.claude/
