01
One problem, two stories
Two testers described the same layout problem in completely different words, and each was sure they had found something separate. Removing one misleading refresh button fixed both.
1.1The button that did not belong
02
How I tested
Three rounds of testing, each with one goal. Every tester got the same laptop, the same browser and the same questions.
- 2.1I watched quietly and stepped in only when needed, looking out for frustration as much as for mistakes.
- 2.2Raw notes became summaries and quotes became themes, each tagged with a usability heuristic.
- 2.3I kept asking why until a complaint pointed to a specific design or logic choice.
- 2.4Every finding became a change I could test, and I retested after each big one.
- 2.5Reports were versioned in Obsidian, and an effort and impact matrix set the order.
- 2.6Silence about a section usually means it works.
3Rounds of testing
2Testers, one problem
1Button removed
I started out not knowing why I was testing. By the final round it was a process I could rely on.
03
From PHP to Laravel
The project began as a form in plain PHP and ended as a Laravel app, and every step on the way is documented.
The app stopped trying to keep up with the user.
- 3.1Plain PHP with PDO first, then Laravel’s MVC.
- 3.2Debugbar to trace every request.
- 3.3Migrations, factories and seeders, so the data can be rebuilt at any time.
- 3.4A many-to-many pivot table between albums and genres.
- 3.5An N+1 query problem, fixed with eager loading.
- 3.6A full rebuild from server-rendered PHP to Livewire and Alpine.
- 3.7Safe cover uploads, with temporary files cleaned up.

