PORTFOLIO / 2026
FULL-STACK E-COMMERCE
Modern
Commerce
Platform
Decoupled architecture between Nuxt.js as a customer-facing storefront and Laravel as an API backend — designed for scalability, security, and an efficient content management experience.
FRONTEND
Nuxt.js 3
BACKEND
Laravel + Filament
DATABASE
Neon Postgres
STORAGE
Cloudflare R2
System Architecture
Customer
/catalogs, /catalogs/[slug], and /products/[slug]
/gallery
/contact -> send-email.post.ts → Resend
/profile -> CRUD Addresses
Pinia + localStorage
Redirect → Laravel Socialite
List catalog
Catalog +
Product details
Gallery images list
CRUD Addresses — protected
OAuth callback → issue token
CRUD Catalog
CRUD Product
CRUD Gallery
Manage user, role, permission
Granular permission per role
Admin / Staff
Email delivery from Message Me via server/api/send-email.post.ts
Serverless DB — data, relationships, image URLs
Object storage for images — S3-compat DB only stores upload URLs
Identity provider via Socialite Callback handled by Laravel
Nuxt.js Pages & Features
OAuth Google Flow
Laravel acts as an OAuth broker — verifying Google identity via Socialite and returning an internal token to Nuxt, so Nuxt doesn't need to store Google credentials.
Laravel Backend & Filament CMS
Tech Stack Summary
| TECHNOLOGY | LAYER | Peran dalam Sistem |
|---|---|---|
| Nuxt.js | frontend | Storefront SSR, routing, server API routes, state management |
| Pinia | frontend | Global state for cart — persisted in localStorage |
| Laravel | backend | REST API, Google OAuth via Socialite, business logic |
| Filament v3 | backend | Admin panel CMS — CRUD for catalogs, products, gallery |
| Filament Shield + Spatie | backend | RBAC — granular role & permission management for staff |
| Neon Postgres | infra | Serverless PostgreSQL — data, relationships, image URLs |
| Cloudflare R2 | infra | Image object storage — S3-compatible, zero egress fee |
| Resend | infra | Email delivery from contact form via Nuxt server route |
| Google OAuth / Socialite | auth | Customer login — handshake via Laravel, token returned to Nuxt |