Skip to main content
Reprodisseny’s web platform is a Nuxt 4 application that combines static-site generation (SSG) with incremental static regeneration (ISR). Content is managed in SharePoint, synced to local JSON at build time, and served through Nitro server routes. File attachments and media assets are stored in Azure Blob Storage.

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 patternStrategyTTL
/categorias/**ISR600 s (10 min)
/api/categorias/**SWR300 s (5 min)
/productos/**ISR600 s (10 min)
/api/productos/**SWR300 s (5 min)
These values are set in nuxt.config.ts under routeRules.

Data stores

StorePurposeAccess
SharePoint CMS ListsCategories, products, page contentMicrosoft Graph API (build-time sync)
SharePoint CRM ListsPrice request submissions, commentsMicrosoft Graph API (runtime)
Azure Blob (webcms container)Media images, quote attachmentsPublic CDN + Drive API
SQLite (in-process)IP-based rate limitingbetter-sqlite3 (runtime only)

Key directories

server/
├── api/
   ├── price-requests.post.ts     # Quote request submission
   ├── categorias.get.ts          # Full category catalog
   ├── search/
   └── suggest.get.ts         # Fuzzy search suggest
   ├── nav/
   └── categorias.get.ts      # Navigation tree
   ├── home/
   └── categorias.get.ts      # Home page featured categories
   ├── places/
   └── reviews.get.ts         # Google Places reviews
   └── cms/
       ├── categories.get.ts      # CMS category list
       ├── products.get.ts        # CMS product list
       ├── category/
   └── [...slug].get.ts   # Category detail by path
       └── product/
           └── [slug].get.ts      # Product detail by slug
├── services/
   └── priceRequests/
       └── priceRequestService.server.ts
└── utils/
    ├── rateLimit.server.ts
    └── cmsCatalog.server.ts

composables/
├── usePriceRequests.ts
├── useCategoriasNav.ts
├── useProductsCatalog.ts
├── useCategoriaProductos.ts
├── useHomeCategoriesGrid.ts
└── useSeoContent.ts

scripts/
└── sync-sharepoint-to-cms.mjs    # SharePoint → cms/catalog.json

cms/
├── catalog.json                  # Generated by cms:sync
└── routes.json                   # Pre-render route list

Build docs developers (and LLMs) love