evoyo.la is my own portfolio and acquisition website, rebuilt from scratch in phases: public case studies, a Filament 4 admin, an inquiry pipeline as a Kanban board, payment processing via Paddle, and a signed customer portal — on a single codebase.
Gallery
Case Study
Situation
The previous project worked technically but carried grown legacy baggage: a desktop/mobile layout split via device-detection middleware, Google Analytics with a consent banner, PWA leftovers, and several unused but still-shipped JavaScript libraries. Instead of patching it up, a complete rebuild followed a phased workflow, with the old project serving strictly as a read-only reference for content and proven patterns.
Challenge
The site has to serve four roles at once — public case-study presentation, admin, customer self-service portal, and real payment processing — on a single codebase. At the time the inquiry-pipeline Kanban board was built, there was no actively maintained Filament 4 plugin for it, so it had to be built in-house on top of the SortableJS already bundled with Filament. Design QA also turned up a structural bug: response caching served an HTML body with a stale CSP nonce alongside a freshly generated header on a cache hit — as a result, the theme switcher practically never worked once caching was active.
Approach
Laravel 13 with PHP 8.4, Filament 4 as the admin under /admin, Blade with Tailwind CSS 4 and Alpine.js via Vite, MySQL and Redis, Pest as the test framework. Payments via Paddle Billing through Cashier Paddle, self-hosted Plausible as the sole analytics solution, GlitchTip for monitoring.
Decisions
No actively maintained board plugin was available for Filament 4 — built instead on the SortableJS already bundled with Filament.
A hash over static content can’t diverge between a cache miss and a cache hit — fixes the theme-toggle bug structurally rather than symptomatically.
Every status change — via drag and drop, a select field, an action, or a payment webhook — runs through a single logging point instead of several call sites.
A signed route plus an additional token comparison, because a signature alone can’t revoke a URL that has already been issued.
A real file in the public directory would have permanently shadowed the route — no two definitions of the same thing.
My contribution
Complete solo development, self-directed in phases and verified against tests, lint, and build after every phase; architectural decisions and deliberate gaps documented by the same person who made them.
Results