Ubuntu Bags: A Static Storefront with a Separate Admin
An e-commerce store for luxury handbags: product catalogue, cart, wishlist, reviews, and editorial content about the artisans, with an admin panel and a separate backend.
Next.js 14Laravel 12FilamentStripe

Context
A small store has no operations team. If product listings depend on an API call at every visit, any backend hiccup becomes an empty shop in front of a customer. The storefront had to survive the service behind it going down.
Scope I disclose publicly
- A statically exported Next.js storefront that reads a catalogue file generated at build time, not fetched per visit.
- A Laravel 12 backend owning products, orders, reviews, wishlists, and accounts, with Filament for administration.
- A separate Node service for the Stripe integration, isolated from both the backend and the storefront.
- An explicit fallback ladder in the catalogue fetch script: the live API, then the last committed generated file with a warning, then a loud build failure if neither exists.
Decisions and trade-offs
- The catalogue is fetched at build time rather than at request time, which decouples storefront uptime from API uptime.
- Failing the build rather than shipping an empty catalogue: a shop with no products is worse than a failed deploy, and the silent failure is the one worth preventing.
- Payments live in their own service, so payment logic never mixes with catalogue logic or the admin panel.
- Filament for administration and Next.js for the customer: two surfaces, two very different users, each with the right tool.
- The trade-off: a product change needs a rebuild and a deploy instead of appearing immediately.
I show no public link for this project, because the domain was not reachable for inspection when this page was written. What is offered here is a technical description of an architecture I built and deployed — not a link you cannot check.
Disclosure: I publish no sales figures, order counts, or conversion rates.
