incr/CHANGELOG.md
myrmidex 2183dff508
All checks were successful
CI / ci (push) Successful in 31s
CI / build (push) Successful in 1m4s
CI / ci (pull_request) Successful in 29s
CI / build (pull_request) Successful in 1m2s
61 - Relicense to AGPL, add CONTRIBUTING and CHANGELOG
2026-08-16 11:32:58 +02:00

3.8 KiB

Changelog

All notable changes to this project will be documented in this file.

[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.