← Back to projects

evoyo.la

This website: a complete 2026 rebuild with Laravel 13, Filament 4, an inquiry pipeline, Paddle payments, and a customer portal.

evoyo.la

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

In-house Kanban instead of a plugin dependency

No actively maintained board plugin was available for Filament 4 — built instead on the SortableJS already bundled with Filament.

Hash-based instead of nonce-based CSP for static inline scripts

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.

Centralized status-change logging via an observer

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.

Portal access via two combined mechanisms

A signed route plus an additional token comparison, because a signature alone can’t revoke a URL that has already been issued.

/sitemap.xml as a real route instead of a static file

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

Tests
243 Pest tests, 767 assertions, green
Lighthouse (local, mobile)
Home page 95, other core pages 96 performance points, consistently 100 on accessibility, best practices, and SEO
Bundle
public JavaScript under the 120 KB gzip budget

Search & navigation

Navigate Open Esc Close