PHP Ledger 1.1.1: setup you can watch, and a local database
Correction, 20 September 2026. This release does contain one schema migration. The package includes
034_inventory_locations, which creates the stock-locations tables and adds the optional Stock locations module; the module is off by default and does not change accounting behaviour until enabled. A fresh 1.1.1 installation applies it during setup. An installation upgraded from 1.1.0 by replacing files must runphp www/phpledger/install/migrate.phponce, or the maintenance page reports a pending migration; installing 1.1.2 from/maintenance.phpalso applies it. This release also shipped without signed update metadata, so the/maintenance.phppath named below did not work from 1.1.0; 1.1.2 restores it. The statement that 1.1.1 carries no migration was wrong; we apologise for the confusion.
A patch release. No schema change, no migration, and no change to any accounting behaviour — everything in it is browser setup, which an existing installation has already completed.
Setup you can watch
- Six stages you can see. Start, Database, Build, Checks, Account and Ready, each sized for a laptop screen. The Build stage shows a progress bar naming the step it is on — "Building the chart of accounts and journals, step 6 of 35" — instead of a button that looks like it is waiting for you.
- A failed requirement is something to clear, not an error page. A missing PHP extension takes over the screen with the places it is actually fixed: the
php.iniline on XAMPP or Laragon, the package name on Debian, the PHP Selector screen on shared hosting, and a Check again button. - Setup proves what it built. Fourteen checks on your server before you type anything, and six against the finished database afterwards — including the count of protective database rules that keep posted entries immutable. The last screen itemises what exists, read back from the database.
A database on your own computer needs no preparation
Issue #84. On localhost, 127.0.0.1 or ::1, setup accepts the account XAMPP, Laragon and MAMP install — including root with no password — and creates the database itself when it does not exist. A database on another server still needs a dedicated account with a password, and is never created.
Setup also reports the folders it will use and the address it will record, and finds a database server answering on a loopback port to fill in the port.
Plain HTTP warns instead of refusing
A site without a certificate can now be installed and used, with a warning on every setup step and on every screen afterwards naming what stays unavailable. Connections (the API, MCP and app integrations) still require an HTTPS address. Sign-in details travel unencrypted until a certificate is in place, so turn on SSL before keeping real books.
A server that would refuse the schema says so first
Issue #83. MySQL 8 writes a binary log by default and refuses CREATE TRIGGER unless the account is trusted, which used to stop the schema part-way through migration 001. Setup now reads that setting at the connection check and names log_bin_trust_function_creators = 1 before anything is written. A migration interrupted anyway records how far it got and resumes at its first unapplied statement.
Also in this release
- The schema applies in six requests instead of 35. The chain is about two seconds of work;
pl_migrate()takes a time budget as well as a batch size, and a host with a shortmax_execution_timestill hands control back between steps. - Browser setup no longer offers an optional second runtime database account (decision B24, issue #87). Restricting the account after installation is documented in INSTALL.md and turns off the automatic update path.
- Fix: an empty key folder created in advance, or pointed at by
PL_OAUTH_KEY_DIRECTORY, was treated as an interrupted installation and blocked setup. Only a folder holding some of the keys is refused now. - The two demo landing labels corrected on 19 September ship here.
Upgrading
From 1.1.0 this replaces files only; there is no migration. See UPGRADE.md.
Verify the download
sha256 8c7f8b3236661ff5f3bdacac3cc2db45ca688eccbcc31dcbf07b877f3432aee8
Built twice from 63658bc and byte-identical both times; 1,502 files verified against PACKAGE-MANIFEST.json.
Assurance
composer check passes on MySQL 8.4 and MariaDB 10.11: 316 tests, 0 failures, plus two end-to-end browser installation fixtures. A real shared host and an unfamiliar operator have still not been observed.
This release ships without a media kit, at the owner's decision of 20 September 2026: minor and patch releases do not carry one.