# Changelog All notable changes to this project will be documented in this file. ## [0.4.1] - 2026-08-16 Cleanup after v0.4.0, found once the release was actually cut. ### Changed - The production image is built on version tags only (#62). A release merges to `main` and is tagged at the same commit, so both triggers matched and the multi-arch image was built twice — 36 minutes of the duplicate, and `:latest` published twice from identical source. - The production image should build considerably faster (#65) - PHP extensions come from prebuilt binaries rather than being compiled. Six C compiles under QEMU emulation dominated the arm64 half of the build. - Composer dependencies install before the application source is copied, so a code change no longer reinstalls them. - The build uses a registry cache, and `exif` is no longer installed. - `linux/arm64` is kept deliberately: nothing of ours deploys to it, but the image is published for self-hosters and dropping it would exclude ARM machines. - The onboarding and set-value forms are one Blade component (#64). They were near-identical, down to a 200-character class string that existed twice. ### Removed - `fakerphp/faker` and `laravel/sail`, neither of which the project used, along with `docker/dev/podman-sail-alias.sh` and the `faker_locale` config (#63) ## [0.4.0] - 2026-08-16 incr began as a tracker for VWCE shares and accumulated a ledger, asset prices, milestones, an onboarding wizard and a React frontend on the way. This release removes all of it. What remains is a counter: click the number to add one, or open a dialog to set it directly. ### Changed - **The frontend is Blade and Livewire 4 instead of React and Inertia** (#52) - `wire:click="increment"` replaces a page component, a display component, a dialog and the fetch layer between them. - The build output went from 2264 modules and 311 kB of JavaScript to two modules and 13 kB of CSS. No JavaScript is shipped to the browser. - npm dependencies went from 33 to 4: vite, tailwindcss and two plugins. - The page now renders server-side with the count already in the HTML. There is no loading spinner and no fetch after paint. - **The counter is a single integer** (#50) - It was `SUM(quantity)` over an `entries` ledger. Per-increment history was never displayed and is deliberately not kept. - `POST /increment` and `PATCH /count` return JSON with real status codes. The endpoints they replaced returned redirects, which `fetch()` followed — a validation failure reported success. - **Onboarding is a single input for the starting value** (#51) - It was a three-screen wizard asking for a label, a unit, a date, a quantity and a milestone. - A counter sitting at zero used to be indistinguishable from an unconfigured app and was sent back to setup. The gate is now whether a counter exists. - **CI runs in about 40 seconds instead of two to forty minutes** (#46, #57) - PHP is baked into a prebuilt image rather than installed on every run. - Tests run against sqlite in memory rather than a MySQL service container, taking about a second instead of 53. - The Composer cache path was wrong, so no packages were ever cached. - Thirteen migrations squashed into one (#46). The chain created and dropped nine tables to arrive at a single table, and replaying it required MySQL-specific DDL. Existing installations are unaffected. ### Removed - Asset and price tracking: the `Asset` and `AssetPrice` models, their controllers, eight routes and two tables (#48) - Milestones, the progress bar and the stats box (#49) - The user layer. The app is single-user with no authentication, but carried a fake user, an auth config, and `users`, `sessions` and `password_reset_tokens` tables that existed only to be bypassed (#53) - 51 unreachable frontend files left by the Laravel starter kit — a layout system, a component library and an unrouted landing page, none of which any page imported (#47) - Stale CI: two GitHub Actions workflows targeting a branch that does not exist, and a Jenkinsfile pointing at a registry the project left months ago (#56) ### Added - PHPStan with larastan at level 7, clean with no baseline (#55) - Test coverage for the counter, from 4 tests covering only milestones to 17 covering increment, set-value, validation and onboarding (#54) ### Fixed - The 7-segment display font never loaded in development. Vite serves assets itself, so the absolute `/fonts/` path returned 404 and the browser silently fell back to a monospace face (#59) - The browser tab said "Laravel" and the favicon was the framework default (#59) - `GET /register` returned an error rather than 404: the route and controller outlived the page component they rendered (#53) - `container_tinker` ran expressions but discarded their return values, and `container_db_read` invoked a MariaDB client against a MySQL container (#58) ### Note Price tracking (#38, #35) and a dropdown fix (#17) were closed as won't-fix. They built or repaired subsystems this release removes.