Frontend
Vue 3 + Nuxt 4, Tailwind CSS, shadcn-nuxt, reka-ui. Pages are pre-rendered at build time and revalidated on a per-route schedule.
Backend
Nitro server routes handle form submissions, search, and CMS data. Rate limiting uses a local SQLite database via better-sqlite3.
CMS
SharePoint Lists are the source of truth for categories, products, and price requests. A sync script fetches data via Microsoft Graph and writes
cms/catalog.json before each build.Integrations
Azure Blob Storage hosts media assets and quote-request attachments. Email notifications are sent via SMTP or Microsoft Graph/SendGrid depending on the configured provider.
Request lifecycle
Route caching strategy
| Route pattern | Strategy | TTL |
|---|---|---|
/categorias/** | ISR | 600 s (10 min) |
/api/categorias/** | SWR | 300 s (5 min) |
/productos/** | ISR | 600 s (10 min) |
/api/productos/** | SWR | 300 s (5 min) |
nuxt.config.ts under routeRules.
Data stores
| Store | Purpose | Access |
|---|---|---|
| SharePoint CMS Lists | Categories, products, page content | Microsoft Graph API (build-time sync) |
| SharePoint CRM Lists | Price request submissions, comments | Microsoft Graph API (runtime) |
Azure Blob (webcms container) | Media images, quote attachments | Public CDN + Drive API |
| SQLite (in-process) | IP-based rate limiting | better-sqlite3 (runtime only) |