@shopbite-de/storefront
π ShopBite Storefront
A headless Shopware 6 storefront built for food delivery.
Nuxt 4 Β· Vue 3 Β· Tailwind CSS v4 Β· TypeScript β shipped as a reusable Nuxt layer, so every shop is a handful of config lines instead of a fork.
Why this exists
Generic shop templates don't know that a kitchen closes at 22:00, that a pizza comes with four toppings priced individually, or that "delivery in 30 minutes" has to be validated against today's opening hours and the public holiday calendar.
ShopBite does. It's a pure headless frontend β no Shopware template engine, no Twig β talking to the Store API and to the custom routes added by the ShopBite Shopware plugin.
Features
| π Opening hours | Multi-interval business hours per weekday, live open/closed state |
| π Delivery slots | 5-minute increments, respects prep time, holidays and closing times |
| π§ Extras & toppings | Configurable products grouped into container line items (UUID v5 reference) |
| π Address autocomplete | Geoapify via a server proxy β the API key never reaches the browser |
| π Delivery zones | City/postcode validation before checkout even starts |
| ποΈ Vouchers | Discount codes backed by the ShopBite plugin |
| π± Installable PWA | Offline-aware service worker, app manifest, mobile bottom navigation |
| β‘ SSR + caching | Server routes with tuned TTLs for products, listings, categories |
| π SEO ready | Sitemap, canonical URLs, share previews, title template, structured data |
| π Analytics | Matomo via @nuxt/scripts |
| π¨ Themeable | Nuxt UI + Tailwind v4 tokens β brand a shop by overriding CSS variables |
| π Multi-channel | Optional sales channel switching for multi-location businesses |
Quick start
pnpm install
cp .env.example .env
pnpm dev
The shop is now running on http://localhost:3000.
Prerequisites β Node.js LTS, pnpm 10+, and a Shopware 6 instance with the ShopBite plugin installed (required for business hours, holidays and shop config).
Minimum configuration
| Variable | What it does |
|---|---|
NUXT_PUBLIC_SHOPWARE_ENDPOINT |
Store API base URL, e.g. https://shop.example.com/store-api |
NUXT_PUBLIC_SHOPWARE_ACCESS_TOKEN |
Sales channel access key |
NUXT_PUBLIC_STORE_URL |
Public shop URL, base for canonical URLs and the sitemap |
NUXT_STORE_NAME / STORE_DESCRIPTION |
Branding for <head>, PWA manifest and OG tags |
NUXT_GEOAPIFY_API_KEY |
Server-side key for address autocomplete (optional) |
See .env.example for the full list.
Use it as a Nuxt layer
This package is published to npm and designed to be extended, not cloned. A complete shop looks like this:
// nuxt.config.ts
export default defineNuxtConfig({
extends: ["@shopbite-de/storefront"],
runtimeConfig: {
public: {
site: {
name: "Masala Mio",
description: "Indische KΓΌche, italienisch gedacht",
},
},
},
});
Everything β pages, components, composables, server routes β comes along. Override any
file by recreating it at the same path in your own app/ directory.
Scripts
pnpm dev # Dev server on :3000
pnpm build # Production build
pnpm preview # Preview the production build
pnpm generate # Static generation
pnpm typecheck # nuxt typecheck β must stay at zero errors
pnpm lint:fix # Prettier + ESLint, autofix
pnpm test:unit # Vitest (unit + Nuxt environments)
pnpm test:e2e # Playwright, Chromium β needs a running server
pnpm test:ui # Vitest UI
pnpm generate-types # Regenerate Store API types after plugin changes
Run a single test:
pnpm vitest run test/nuxt/useBusinessHours.test.ts
pnpm playwright test test/e2e/simple-checkout-as-recurring-customer.test.ts
Architecture
app/
βββ components/ Cart, Checkout, Product, Food, Navigation, Header, β¦
βββ composables/ Business logic β useBusinessHours, useDeliveryTime, useAddToCart, β¦
βββ pages/ German routes: /speisekarte, /warenkorb, /konto, /bestellung
βββ validation/ Zod schemas for forms
βββ assets/css/ Tailwind v4 theme tokens
server/api/ Cached Store API proxies + the Geoapify key guard
api-types/ Auto-generated Store API types (pnpm generate-types)
content/ Legal pages as Markdown (@nuxt/content)
test/ unit Β· nuxt Β· e2e
Composables carry the domain. @shopware/composables is extended as a Nuxt layer,
so project composables in app/composables/ transparently override the upstream ones.
API responses are validated with Zod before they reach a component.
Key ones worth knowing:
useBusinessHoursβ opening hours with multiple intervals per day (Sunday is day 7)useDeliveryTimeβ slot validation in 5-minute steps, prep time and holiday awareuseAddToCartβ extras/toppings become a container line item keyed by UUID v5useShopBiteConfigβ delivery config and checkout state from the pluginuseAddressAutocompleteβ Geoapify behind/api/address/autocomplete
Docker
docker compose up --build # β http://localhost:3000
./container pnpm -v # run a command inside the container
Contributing
CI runs setup β lint β unit β e2e on every push. Before opening a PR:
pnpm lint:fix && pnpm typecheck && pnpm test:unit
Engineering notes for tricky changes live in docs/notes/;
day-to-day conventions and gotchas are in CLAUDE.md.
Related services
| Repo | Role |
|---|---|
shopware-plugin |
Custom Store API routes, DAL entities, checkout processors |
migrator |
Scrapes restaurant menus and imports them via the Admin API |
order-printer |
Polls orders and prints them on an ESC/POS thermal printer |
License
Related Packages
Reusable Nuxt Layer for Shopware design tokens and UnoCSS configuration
Scaffold an external BlueMTX headless storefront (Nuxt) using @bluemtx/storefron...
Version History
| Version | Released | License |
|---|---|---|
| 2.2.1 | MIT | |
| 2.2.0 | MIT | |
| 2.1.1 | MIT | |
| 2.1.0 | MIT | |
| 2.0.3 | MIT | |
| 2.0.2 | MIT | |
| 2.0.1 | MIT | |
| 2.0.0 | MIT | |
| 1.31.3 | MIT | |
| 1.31.2 | MIT | |
| 1.31.1 | MIT | |
| 1.31.0 | MIT | |
| 1.30.0 | MIT | |
| 1.29.0 | MIT | |
| 1.28.0 | MIT | |
| 1.27.0 | MIT | |
| 1.26.1 | MIT | |
| 1.26.0 | MIT | |
| 1.25.0 | MIT | |
| 1.24.0 | MIT | |
| 1.23.3 | MIT | |
| 1.23.2 | MIT | |
| 1.23.1 | MIT | |
| 1.23.0 | MIT | |
| 1.22.3 | MIT | |
| 1.22.2 | MIT | |
| 1.22.1 | MIT | |
| 1.22.0 | MIT | |
| 1.21.2 | MIT | |
| 1.21.1 | MIT |
Showing the latest 30 of 87. See every release on npm