This document describes the breaking changes of major versions, and also includes notable upgrade notes for changes within a major version when extra operator action is recommended.
Table of contents:
- Upgrade from YAFFA 3.x to 4.x
- Upgrade within YAFFA 4.x
- Upgrade within YAFFA 3.x
- Upgrade from YAFFA 2.x to 3.x
- Upgrade from YAFFA 1.x to 2.x
This version removes the budget flag from Transaction and replaces it with a standalone Budget entity: a category-level spending/income target with no linked transaction. See .ai/docs/assets/budget/budget.md and .ai/docs/assets/transactions/schedules.md for the concept-level explanation.
A scheduled standard withdrawal/deposit's categorized items now always count toward category budget comparison - this used to require a separate budget flag on the transaction, which no longer exists and has no replacement opt-in/opt-out.
transactions.budgetcolumn removed. There is no replacement flag. A scheduled standard withdrawal/deposit with categorized items counts toward budget comparison automatically; a standalone target with no linked transaction is now aBudgetrow instead.- New standalone
Budgetentity andbudgetstable. Existing transactions that were budget-only (schedule = false, budget = true, i.e. created via the old "Budget" checkbox with no schedule) are automatically converted to oneBudgetrow per distinct category, then hard-deleted fromtransactions- this data migration has no downgrade path (see below). transaction_details_standard.account_from_id/account_to_idare nowNOT NULL. These were only nullable to support the old budget-only transaction case; that case no longer exists after the conversion above.- API changes:
GET /api/v1/transactions/scheduled-items— thetypequery parameter no longer acceptsbudget,budget_only,both, orany; onlyscheduleandnoneremain meaningful. A newincludeBudgets=1parameter merges standaloneBudgetrows into the response (used by the Schedules & Budgets report only).ReportApiController's budget-vs-actual chart endpoint response shape changed: each period entry now also includes abudgetBreakdownarray listing the individualBudgetrows (withaccount_id/account_name) that contributed to the total, and ascheduleBreakdownarray for the schedule-derived side.- New CRUD endpoints:
GET/POST /api/v1/budgets,GET/PATCH/DELETE /api/v1/budgets/{budget}.
- UI change: the "Budget" checkbox/section on the standard transaction form is removed. Standalone Budgets are created, edited, and deleted from the existing Schedules & Budgets report page (Reports → Schedules and Budgets) instead, alongside real schedules.
- Schedule/Budget recurrence storage collapsed into a single
rrulecolumn.transaction_schedules.frequency/interval/count/end_date(and, if present,by_day/by_month) are consolidated into one RFC 5545 RRULE string column (rrule) and the old columns are dropped. This runs automatically as part of the migration step below and needs no manual input — the request/response contract for schedules and budgets is unchanged (you still work with the same discrete frequency/interval/day/month fields in the UI and API; only the underlying storage changed). See below for the backup recommendation, since this conversion has no downgrade path once the old columns are dropped. - reCAPTCHA support removed. The login, registration, and password reset forms no longer use reCAPTCHA, and
RECAPTCHA_SITE_KEY/RECAPTCHA_SECRET_KEYare no longer read; you can delete them from your.env. If you expose a public instance, note that this bot protection is gone (login attempts remain rate limited, and users can now enable optional two-factor authentication, see below). - If you have any custom integrations or scripts against the endpoints above, update them before upgrading.
A daily scheduled task can now delete old finalized AI documents, together with their stored files and received emails, to keep the database and storage from growing indefinitely. The transaction created from a document is kept.
- It is an opt-in, per-user setting: each user sets "Delete finalized documents after (days)" in the "Document Retention" section of their AI settings. Blank (the default) keeps everything, so nothing is deleted unless a user asks for it. There is no environment variable for it (the
AI_DOCUMENT_FILE_RETENTION_DAYSvariable that appeared in earlier example files never had an effect and is not read). - Documents that are not finalized are never deleted. Users with such documents older than their retention period get one reminder email per day, linking to the filtered document list, until they finalize or delete them.
- The task runs on the container where
RUNS_SCHEDULERis enabled, and needs a working queue worker and mail configuration for the reminders. - Google Drive imports: if a Drive import has no post-import action (see the Google Drive settings), the imported files stay in the monitored folder. After their documents are deleted, a manual full sync can import those files again as duplicates. YAFFA shows a warning when a retention period is enabled in such a setup; configure a post-import action (move or rename processed files) first.
- Deleting an AI document, manually or by the cleanup, no longer deletes the transaction created from it (the foreign key is now
ON DELETE SET NULL). Before this change, deleting a finalized document deleted its transaction as well. - Documents created from pasted text stored an invalid file path, which a migration now repairs.
- Deleted documents cannot be restored. Back up before enabling it on an existing installation.
- The "Old AI document cleanup" action of the maintenance page deletes documents (not only files), following the same rules. It is disabled until a retention period is set.
This release adds two new opt-in security features, both managed from /user/settings:
- Personal access tokens — mint a scoped bearer token (
read,write, and/orsettings) for calling the/api/v1/*API outside the browser. - Two-factor authentication (TOTP) — an optional second factor on top of your normal login.
Neither feature requires any action to upgrade, and neither is enabled by default. A few notes if you plan to use them:
- Token abilities are enforced from day one. A token scoped to
readonly will get a403on any action outside that scope — this isn't a narrowing of previously working access, since no earlier YAFFA version had a supported way to create or use a personal access token in the first place. - Exception: if you previously used
php artisan tinker(or similar direct DB/console access) to manually call$user->createToken(...)— an unsupported, undocumented path that happened to work because the underlying Sanctum table already existed — that token now has itsabilitiesenforced like any other. Revoke it and re-create it from/user/settingsso its scope matches what you actually intend to grant. - New environment variables, both optional (see
.env.examplefor defaults):API_TOKEN_MAX_LIFETIME_DAYS(maximum lifetime, in days, selectable when creating a token — default365) andSCRAMBLE_PROD_AUTH(controls who can view the auto-generated API docs at/docs/apioutside thelocalenvironment — defaultnone, i.e. hidden).
This release replaces float-based money/quantity arithmetic with exact decimal arithmetic (brick/math/brick/money) across transactions and investments, to eliminate float-precision drift in split/allocation totals, investment valuations, and monthly summary balances. As part of this, several /api/v1/* fields now serialize as decimal strings instead of JSON numbers:
transaction_items[].amountconfig.amount_from/config.amount_to, and their computedamount_from_base/amount_to_base/amount_in_basecounterparts (standard transactions)config.price/config.commission/config.tax/config.dividend/config.quantity(investment transactions)investment_prices[].priceaccounts[].opening_balancecurrency_rates[].rate
Action required if you have a custom API integration: parse these fields as strings (e.g. into a decimal type) rather than assuming a JSON number. The bundled frontend already expects this format, so no action is needed there. Report endpoints (/api/v1/reports/*) are unaffected — they still return JSON numbers, since their aggregates are only converted to exact decimals internally and collapsed back to a float at the response boundary.
Two more precision-related changes, transparent to a normal upgrade:
transaction_details_investment.priceis widened fromDECIMAL(10,4)toDECIMAL(20,10)by a new migration, matchinginvestment_prices.price's existing scale. This runs automatically with the rest of the migrations and is non-destructive.ext-bcmathis now a required PHP extension (declared incomposer.json). It's already present in the Sail dev image; if you run PHP outside Sail/Docker, confirm it's compiled in before upgrading (php -m | grep bcmath) — it wasn't previously listed among YAFFA's required extensions.
Action required if you have investment transactions predating a currency change on an account or investment: an investment transaction's price (in the investment's currency) and its commission/tax/dividend (in the account's currency) are now combined with exact Brick\Money\Money arithmetic, which requires both sides to share a currency. New transactions are already prevented from mismatching (TransactionRequest's account/investment currency check, and the currency-change confirmation now shown in the account/investment edit forms), but a transaction recorded before either guard existed — back when the account or investment's currency was later changed — may still have a mismatched pair. For such a row, cashflow_value is now computed as null instead of throwing, and a warning-level log entry ("Investment transaction cash flow spans mismatched currencies (legacy data)") is written with the transaction ID. Search your logs for that message after upgrading, and manually correct the identified transactions (or the account/investment currency) to restore their cash-flow value.
Payees and categories now have detail pages (click a name in the payee or category list). No action is needed, but two things are visible to existing users:
- Find transactions: "matching items only" now also applies to the Summary and Timeline tabs. Previously only the category-aware tabs honoured it, so for split transactions the Summary and Timeline totals counted the whole transaction amount even with the option on. With the option on, they now count only the matching items, so these totals can be lower than before. Reports without the option, or without split transactions, are unchanged.
- The setting "Default date range for account details" is now "Default date range for transaction history" and also sets the initial date range on the payee and category pages. The stored value is unchanged. With "Don't load data by default", those pages load no transactions until a range is picked.
Before installing YAFFA 4.x, first update to the latest available YAFFA 3.x release (3.6.0 or later). This ensures the pre-upgrade safety check command described below is available in your existing installation.
Run the following command on your current YAFFA 3.x release before installing YAFFA 4.x:
php artisan app:check:budget-migrationThis command is read-only and reports any pre-existing data it cannot safely convert:
- a budget-only transaction with zero transaction items
- a budget-only transaction where the only non-null account side is actually a payee, not a real account
- a transfer or investment transaction with a stray
budget = trueflag (should never happen, but was never enforced at the database level) - a budget-only transaction whose currency doesn't match its linked account's current currency
The 4.x migration refuses to run while any of these are reported, to avoid silently dropping or misattributing data. If the command reports issues, resolve them (edit or delete the flagged transactions) and run it again until it succeeds.
Note: this command is removed again once you're on 4.x — once the conversion has run, the state it checks for can no longer occur.
Before running any migrations, create a complete backup of your database. php artisan migrate:rollback is not a way back to 3.x. It restores the table structure but not the data, so a backup is your only way back if something goes wrong. Specifically, a rollback leaves you with:
- Schedules without recurrence. The old
frequency,interval,count,end_date,by_day, andby_monthcolumns are re-created empty (frequencyis a blank string,intervaldefaults to1), andrruleis cleared. Every existing schedule loses its recurrence settings, and the 3.x application cannot use those rows. - No budget-only transactions. The
transactions.budgetcolumn comes back asfalseon every row, and the budget-only transactions that were converted intoBudgetrows (and hard-deleted) are not re-created. TheBudgetrows themselves are left in place, unused by 3.x. - Nullable accounts again, on
transaction_details_standard.account_from_id/account_to_id, which is the only part that is a true reversal.
Restore the database from the backup and reinstall the 3.x release instead.
# Example for MySQL/MariaDB
mysqldump -u username -p database_name > yaffa_backup_$(date +%Y%m%d).sqlSee the 2.x to 3.x guide above for Docker-volume backup examples if you're running the packaged Docker setup.
No new required environment variables are introduced by this upgrade. However, this release bumps the framework to Laravel 13, which changed the default values used for CACHE_PREFIX, REDIS_PREFIX, and SESSION_COOKIE when those are left unset (the separator used to build them from APP_NAME changed from _ to -, e.g. yaffa_cache_ → yaffa-cache-). If your .env doesn't already set these explicitly, add them to pin the previous values and avoid orphaning existing cache/session/queue data on deploy:
CACHE_PREFIX=yaffa_cache_
REDIS_PREFIX=yaffa_database_
SESSION_COOKIE=yaffa_session(Substitute yaffa with the slug of your own APP_NAME if you've customized it.)
docker compose pull
docker compose stop app scheduler
docker compose up -d db
docker compose up -d app schedulerThe container entrypoint automatically runs migrations, clears caches, and rebuilds assets on startup. Only the app container does this; the scheduler container waits for it to become healthy.
APP_KEY no longer needs to be set manually. If APP_KEY is empty, the container generates one on first boot and keeps it in the storage volume (storage/app/.app_key), so restarts and container re-creation keep using the same key. If you already have an APP_KEY in your .env or Compose environment, it keeps being used, so nothing changes for you. Do not delete the storage volume without also keeping a copy of the key, since the key protects sessions and encrypted data.
Caddy reverse proxy is now a Compose profile. docker/docker-compose.yml's Caddy service is no longer a commented-out block you manually uncomment — it's gated behind the https Compose profile, started with docker compose --profile https up -d. If you previously uncommented the old Caddy block by hand, pulling the new docker-compose.yml will conflict with (or silently discard) that edit; re-apply your Caddyfile/domain setup and switch to the --profile https flag instead of a manual edit. If you run with this profile, also set APP_PORT in your .env (e.g. APP_PORT=127.0.0.1:8080) so the app service doesn't also try to bind host port 80 alongside Caddy — see the comments in docker-compose.yml for details.
git pull
composer install
php artisan migrate
php artisan config:clear
php artisan cache:clear
php artisan view:clear
npm install && npm run buildThe migration step will:
- Backfill
transaction_schedules.rrulefrom every existing schedule'sfrequency/interval/count/end_date, then drop those columns. This step refuses to proceed if any row is somehow left without a resultingrrulevalue (should never happen — every combination the pre-upgrade UI could produce is representable). - Create the new
budgetstable (using the samerrulestorage). - Convert every remaining budget-only transaction into
Budgetrow(s) (one per distinct category, summing amounts within a category), carrying over its account (only if the non-null side is a real account, not a payee), transaction type, and recurrence settings — then hard-delete the source transaction. This step refuses to proceed if step 2's check would report any issue, even if you skipped running it manually. - Drop the
transactions.budgetcolumn. - Make
transaction_details_standard.account_from_id/account_to_idNOT NULL. - Add missing unique keys and indexes for performance and data integrity. Before adding the unique keys to the tag pivot table (
transaction_items_tags) and to the payee category preference table (account_entity_category_preference), any duplicate rows are removed automatically: for a tag attached to the same item more than once the oldest row is kept, and for a duplicated category preference the most recently saved one is kept. Duplicates only inflated tag counts or repeated a preference, so no manual step is needed. This runs on the same migration and is part of the backup recommendation.
Note: both the schedule recurrence backfill and the budget-to-Budget conversion are irreversible in practice once their respective old columns are dropped: rolling the migrations back does not restore the data (see step 3). Ensure you have a backup before proceeding.
After upgrading, open Reports → Schedules and Budgets and filter to "Budget" rows to review what was converted from your old budget-only transactions. Each converted Budget is account-scoped only if its original transaction had a real account attached; otherwise it's account-agnostic. No further action is required unless you want to adjust the converted targets.
Most 4.x upgrades do not require any special manual steps beyond the usual application update procedure for your hosting option.
The sentry/sentry-laravel package and its config/sentry.php have been removed, so exceptions are no longer reported to Sentry.
- If you used Sentry, error monitoring stops after the upgrade. Errors are now only written to the configured Laravel log channel (see
LOG_CHANNEL/LOG_STACK). SENTRY_LARAVEL_DSNandSENTRY_TRACES_SAMPLE_RATEare no longer read; you can delete them from your.env.- Source code users: run
composer installas usual, so the package is removed fromvendor/.
Most 3.x upgrades do not require any special manual steps beyond the usual application update procedure for your hosting option.
If the updated docker-compose.yml changes the database image from mysql/mysql-server:8.0 to mysql:8.0, review the Docker notes in the 3.x upgrade section below before restarting the stack.
In particular:
- Keep the existing named database volume so the new container reuses the current data directory.
- Make sure
DB_HOSTstill matches the database service name from your Docker Compose file. In the packaged YAFFA Docker setup, the service is nameddb. - Verify that your Docker deployment does not use
DB_USERNAME=root, because the officialmysqlimage does not support initializingMYSQL_USER=root. - Prefer restarting the database first, then the YAFFA application containers, to minimize user impact during the first startup on the new image.
This version introduces several significant changes:
- Transaction Types Refactored — The
transaction_typesdatabase table has been replaced with a PHP enum, which requires a database migration. - AI Document Processing — A fully new feature for uploading and AI-processing documents (PDFs, images, emails) into draft transactions. This is optional, but brings new environment variables and new database tables.
- Email Processing Migrated — The former dedicated email-receipts feature has been refactored into the AI document processing pipeline. The
received_mailstable schema is changed and legacy data is partly migrated. - Google Drive Integration — A new optional feature for automatically importing documents from a Google Drive folder.
- Category Learning — A new feature for storing and reusing AI-suggested category mappings to enhance transaction categorization.
-
Transaction Types Refactored: The
transaction_typesdatabase table has been removed and replaced with a PHP enum (App\Enums\TransactionType).- The
transactionstable now uses atransaction_typeENUM column instead of a foreign key to thetransaction_typestable. - This change cannot be automatically reversed by Laravel migrations, so a backup of your database is essential before proceeding with the migration.
- The
-
Data Migration: All existing transactions will be automatically migrated from
transaction_type_idto the newtransaction_typeenum column.- IDs 1-8 and 11 map to the active transaction types.
- IDs 9-10 (previously unused) drop support.
- WARNING: If you have transactions with IDs 9 or 10, the migration will fail. You must either delete these transactions or reassign them to a valid type before running the migration.
-
Email Processing Refactored: The
received_mailstable has been restructured. The columnstransaction_data,processed,handled, andtransaction_idare dropped.- All previously processed received mails (where
processed = true) are automatically migrated to the newai_documentstable. - Unprocessed mails are intentionally not converted and will be discarded.
- The dedicated email processing pages and routes have been removed; email-sourced receipts are now accessible under AI Documents.
- All previously processed received mails (where
-
Investment Price Providers Refactored: The
investment_provider_configstable has been introduced to store user-specific credentials and settings for investment price providers. Instead of global .env settings, users can now configure providers individually, and the scheduler checks for config availability before dispatching jobs. -
API Changes: Several API endpoints have been changed or removed with the intent of adopting versioning and a more consistent naming convention. If you have any custom integrations or scripts that interact with the YAFFA API, you will need to review and update them according to the new API structure.
-
Database Changes: Some database columns were not marked as
signedin YAFFA 2.x, even though they should be. In YAFFA 3.x, these columns are nowUNSIGNED, which means that any negative values in these columns will cause the migration to fail. Why the app should have prevented capturing such values, this is still a risk during the migration. The pre-upgrade safety check command (see below) can help identify such issues before running the migration.
Before installing YAFFA 3.x, first update to the latest available YAFFA 2.x release. This ensures the pre-upgrade safety check command is available in your existing installation.
It is also needed to be on the latest 2.x release, as all migration files of the 2.x series are moved into a schema file, and the migration path might not be complete if you are on an older 2.x release.
Run the following command on the latest YAFFA 2.x release before installing YAFFA 3.x:
php artisan app:upgrade:check-3xThis command is read-only and checks for known data issues that would block the 3.x database migrations. At the moment, it validates the following:
- presence of unsupported legacy
transaction_type_idvalues (9or10) - negative values in decimal columns that will become
UNSIGNEDin YAFFA 3.x
If the command reports any issues, fix them first, then run the command again until it succeeds.
Before running any migrations, create a complete backup of your database. This is crucial in case anything goes wrong during the migration process, allowing you to restore your data to its previous state. Additionally, there's no native downgrade path for this migration, so a backup is your safety net if you need to revert for any reason to version 2.x.
# Example for MySQL/MariaDB
# On Linux/macOS:
mysqldump -u username -p database_name > yaffa_backup_$(date +%Y%m%d).sql
# On Windows (PowerShell):
mysqldump -u username -p database_name > "yaffa_backup_$(Get-Date -Format 'yyyyMMdd').sql"
# Example for Docker, backing up a named volume (Windows PowerShell):
docker run --rm -v yaffa_yaffa_db:/data -v ${PWD}:/backup alpine tar czf /backup/yaffa_db.tar.gz -C /data .
# Example for Docker, backing up YAFFA database from the MySQL container (Windows PowerShell):
docker exec yaffa-db-1 mysqldump -u<username> -p<password> yaffa_db 2>$null ` | Out-File -FilePath yaffa_sail-mysql.sql -Encoding UTF8
Add the following new environment variables to your .env file before running migrations, so that the configuration is picked up correctly during the migration and at runtime.
AI Document Processing (required if using the feature):
# File upload limits for manual document submission
AI_DOCUMENT_MAX_FILES_PER_SUBMISSION=3
AI_DOCUMENT_MAX_FILE_SIZE_MB=20
AI_DOCUMENT_ALLOWED_TYPES=pdf,jpg,jpeg,png,txtTesseract OCR (optional — only needed if you want to process images without a Vision AI model):
TESSERACT_ENABLED=false
TESSERACT_MODE=binary
TESSERACT_PATH=/usr/bin/tesseract
TESSERACT_HTTP_HOST=localhost
TESSERACT_HTTP_PORT=8888
TESSERACT_HTTP_TIMEOUT=30| Variable | Default | Description |
|---|---|---|
TESSERACT_ENABLED |
false |
Enable Tesseract OCR for image processing |
TESSERACT_MODE |
binary |
Mode: binary (local executable) or http (sidecar) |
TESSERACT_PATH |
/usr/bin/tesseract |
Path to the tesseract binary (binary mode only) |
TESSERACT_HTTP_HOST |
localhost |
Tesseract sidecar hostname (http mode; use service name in Docker) |
TESSERACT_HTTP_PORT |
8888 |
Tesseract sidecar port (http mode only) |
TESSERACT_HTTP_TIMEOUT |
30 |
Request timeout in seconds (http mode only) |
Source code users: After editing your .env, clear the config cache before continuing:
php artisan config:clearDocker users can skip this — the container entrypoint handles cache clearing automatically on restart.
Alpha Vantage Investment Price Provider (optional — only needed if you use this provider):
- Take a note of the value of
ALPHA_VANTAGE_KEYin your.envfile, and you can remove this obsolete global setting. (You'll need to re-enter it on the updated UI.)
From this point, the steps differ depending on your hosting option. Follow only the section that applies to you.
-
Update your
docker-compose.ymlto reflect the infrastructure changes:- Decide whether to use Tesseract OCR as a local service. It is disabled by default and not needed if you only use a Vision AI model for document processing, or if you don't use document processing at all.
- If you want to use Tesseract OCR, uncomment the relevant lines in the
depends_onsection of theappservice and uncomment the entiretesseractservice definition. - If using Tesseract in
httpmode, setTESSERACT_HTTP_HOSTto the Docker service name (e.g.,tesseract) and setTESSERACT_ENABLED=true. - Make sure
DB_HOSTmatches the database service name in the compose file. In the default packaged Docker setup, this isdb. - If you are updating to a compose file that switches the database image from
mysql/mysql-server:8.0tomysql:8.0, keep the existing named database volume in place. This allows the upgraded container to reuse the current data directory instead of initializing a fresh database. - Before the first start on the new MySQL image, verify that your Docker deployment does not use
DB_USERNAME=root. The officialmysqlimage does not support initializingMYSQL_USER=root. Use a dedicated application user instead, such as the defaultyaffa_userfrom.env.example.
-
Pull the latest image and restart your container:
docker compose pull docker compose stop app scheduler docker compose up -d db docker compose up -d app scheduler
This restart order minimizes user impact during the MySQL image swap by letting the database finish its first startup on the new image before YAFFA reconnects.
If you use different service names, adapt the commands accordingly. Avoid removing the database volume unless you intentionally want a fresh empty database.
The container entrypoint automatically runs migrations, clears caches, and rebuilds assets on startup. No further action is required.
-
Pull the latest changes from GitHub:
git pull
-
Install updated dependencies:
composer install
-
Run the migrations:
php artisan migrate
This will perform the following changes:
- Add a new
transaction_typeENUM column to thetransactionstable, migrate all data, and drop the legacytransaction_type_idcolumn andtransaction_typestable. - Create new tables:
ai_documents,ai_document_files,ai_provider_configs,category_learning,google_drive_configs,ai_user_settings. - Add an
ai_document_idcolumn to thetransactionstable. - Migrate processed
received_mailsrows into theai_documentstable, then drop the legacytransaction_data,processed,handled, andtransaction_idcolumns fromreceived_mails.
Note: The transaction type migration is irreversible after the
transaction_typestable is dropped. Ensure you have a backup before proceeding. - Add a new
-
Clear caches:
php artisan config:clear php artisan cache:clear php artisan view:clear
-
Rebuild frontend assets:
npm install && npm run build
If you have investments with automatic price retrieval using the Alpha Vantage provider, you need to re-enter your API key in the new provider configuration UI, and make sure to test the connection. Make this as soon as possible after the upgrade, because the scheduler will stop working for these investments until the provider config is not configured.
The main reason for increasing the version is the migration of the framework from Laravel 10 to Laravel 12.
- Some of the environment variable names used by YAFFA were changed, and you need to update them as part of your migration.
- The broadcast driver key has been renamed. As YAFFA is not using this Laravel feature, the actual impact is minimal.
- BROADCAST_DRIVER=#your_value#
+ BROADCAST_CONNECTION=#your_value#- The key for the cache driver has been renamed. Some YAFFA features rely on caching so you need to make this change.
- CACHE_DRIVER=#your_value#
+ CACHE_STORE=#your_value#- The mail encryption environment variable has beeen renamed to be more generic, as not all mail schemes are encryption.
- Make sure to double-check the list of accepted values, and update if necessary. E.g. earlier
sslvalue should be changed tosmtporsmtps, based on your server configuration.
- MAIL_ENCRYPTION=#your_value#
+ MAIL_SCHEME=#your_value#- Add the following keys and default values that were introduced by Laravel 11. Customize them, if needed.
-
+ LOG_STACK=single
+ SESSION_ENCRYPT=false
+ SESSION_PATH=/
+ APP_MAINTENANCE_DRIVER=file
+ APP_MAINTENANCE_STORE=database
+ BCRYPT_ROUNDS=12- Even though the language of the UI is controlled by user preferences, Laravel 11 introduced some environment variables related to locale, which should be added as default values for the application
-
+ APP_LOCALE=en
+ APP_FALLBACK_LOCALE=en
+ APP_FAKER_LOCALE=en_US- Laravel Telescope is now installed in production, but disabled by default. Verify that the
TELESCOPE_ENABLEDflag is in a state as you need it.
- Update the code base from Packagist or GitHub. Make sure to install updated dependencies, run migrations, and clear cached assets.
- Pull the latest YAFFA image from Docker Hub, and restart your container. The entrypoint will take care of running the migrations and clearing various caches.