{"id":20508089,"url":"https://github.com/vasilistotskas/grooveshop-storefront-ui-node-nuxt","last_synced_at":"2026-05-20T17:02:20.028Z","repository":{"id":179351482,"uuid":"662615723","full_name":"vasilistotskas/grooveshop-storefront-ui-node-nuxt","owner":"vasilistotskas","description":"Nuxt Ecommerce","archived":false,"fork":false,"pushed_at":"2026-05-16T22:28:54.000Z","size":40596,"stargazers_count":19,"open_issues_count":0,"forks_count":6,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-17T00:48:52.009Z","etag":null,"topics":["eshop","i18n","nuxt3","pwa","spa","typescript","zod"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vasilistotskas.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-07-05T14:07:59.000Z","updated_at":"2026-05-16T22:28:56.000Z","dependencies_parsed_at":"2023-08-20T03:30:55.743Z","dependency_job_id":"b7826061-3231-4172-b7c9-0593154aece1","html_url":"https://github.com/vasilistotskas/grooveshop-storefront-ui-node-nuxt","commit_stats":null,"previous_names":["vasilistotskas/grooveshop-storefront-ui-node-nuxt"],"tags_count":764,"template":false,"template_full_name":null,"purl":"pkg:github/vasilistotskas/grooveshop-storefront-ui-node-nuxt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vasilistotskas%2Fgrooveshop-storefront-ui-node-nuxt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vasilistotskas%2Fgrooveshop-storefront-ui-node-nuxt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vasilistotskas%2Fgrooveshop-storefront-ui-node-nuxt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vasilistotskas%2Fgrooveshop-storefront-ui-node-nuxt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vasilistotskas","download_url":"https://codeload.github.com/vasilistotskas/grooveshop-storefront-ui-node-nuxt/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vasilistotskas%2Fgrooveshop-storefront-ui-node-nuxt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33268271,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-20T15:12:43.734Z","status":"ssl_error","status_checked_at":"2026-05-20T15:12:42.300Z","response_time":356,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["eshop","i18n","nuxt3","pwa","spa","typescript","zod"],"created_at":"2024-11-15T20:16:53.541Z","updated_at":"2026-05-20T17:02:19.990Z","avatar_url":"https://github.com/vasilistotskas.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![CI](https://github.com/vasilistotskas/grooveshop-storefront-ui-node-nuxt/actions/workflows/ci.yml/badge.svg)](https://github.com/vasilistotskas/grooveshop-storefront-ui-node-nuxt/actions/workflows/ci.yml)\n\n# GrooveShop Nuxt Storefront\n\nA full-featured **Nuxt 4 SSR e-commerce storefront** built with Vue 3 Composition API, TypeScript, and Tailwind CSS 4. Communicates with a Django REST API backend via a Nitro proxy server.\n\n## Tech Stack\n\n| Category | Technology |\n|----------|-----------|\n| **Framework** | [Nuxt 4](https://nuxt.com/) (SSR) |\n| **UI** | [Vue 3](https://vuejs.org/) Composition API, [`@nuxt/ui`](https://ui.nuxt.com/) v4, [Tailwind CSS 4](https://tailwindcss.com/) |\n| **State** | [Pinia](https://pinia.vuejs.org/) |\n| **i18n** | [`@nuxtjs/i18n`](https://i18n.nuxtjs.org/) (Greek) |\n| **Auth** | [django-allauth](https://docs.allauth.org/) headless + `nuxt-auth-utils` |\n| **Payments** | [Stripe](https://stripe.com/) |\n| **Search** | [Meilisearch](https://www.meilisearch.com/) |\n| **Testing** | [Vitest](https://vitest.dev/) + `@nuxt/test-utils` |\n| **Package Manager** | [pnpm](https://pnpm.io/) v10 |\n| **Runtime** | Node.js 24 |\n\n## Features\n\n- **Server-Side Rendering** with hydration and build caching\n- **Product Catalog** with categories, advanced filters (price range, attributes, popularity, view count), and instant search\n- **Shopping Cart** with stock validation and real-time availability checks\n- **Checkout** with Stripe payments and stock reservation\n- **Blog** with posts, categories, tags, comments (with likes), and view tracking\n- **Authentication** — Email/password, code-based login, OAuth (Google, Facebook, GitHub, Discord), WebAuthn/passkeys, 2FA (TOTP, recovery codes)\n- **User Dashboard** — Orders, addresses, favourites (products + posts), reviews, email/password management, session management, provider linking, subscriptions, settings\n- **Loyalty Program** — Points, tiers, transactions, redemption\n- **Real-time Notifications** via Django WebSocket\n- **SEO** — Sitemap, Schema.org, OG images, canonical URLs, RSS feed\n- **Accessibility** — `@nuxt/a11y`, reduced-motion support, keyboard navigation\n- **GDPR Cookie Consent** with granular category control\n- **Cloudflare Turnstile** bot protection\n- **Internationalization** — Greek with typed routes (English and German translations available but inactive)\n- **Image Optimization** — IPX for local images (AVIF, WebP), custom media stream provider for product images\n- **Dark Mode** with system preference detection\n\n## Project Structure\n\n```\n├── app/                  # Client-side (Nuxt 4 convention)\n│   ├── pages/            # File-based routing (67 routes)\n│   ├── components/       # Vue components (140+)\n│   ├── composables/      # Vue composables (33)\n│   ├── stores/           # Pinia stores (auth, cart, user, notifications, app)\n│   ├── plugins/          # Nuxt plugins (auth, setup, websocket)\n│   ├── middleware/        # Route middleware (auth, guest, transitions, loyalty)\n│   ├── layouts/          # Layouts (default, user, auth)\n│   ├── utils/            # Client utilities\n│   ├── providers/        # Custom image providers\n│   └── assets/           # CSS, images, Lottie animations\n├── server/               # Nitro server\n│   ├── api/              # API proxy routes to Django backend\n│   ├── middleware/        # Locale detection, logging, redirects\n│   ├── plugins/          # HTTP agent pooling, cache storage\n│   ├── routes/           # OAuth callbacks, RSS feed, sitemap\n│   └── utils/            # Auth, parsing, error handling, cart session\n├── shared/               # Auto-imported in app + server\n│   ├── types/            # Hand-written TypeScript types\n│   ├── schemas/          # Zod validation schemas\n│   ├── openapi/          # Auto-generated types from Django schema\n│   ├── constants/        # Shared constants\n│   └── utils/            # Shared utilities\n├── modules/              # Custom Nuxt modules (cookies, purge-comments)\n├── runtime/              # Cookie control module runtime\n├── i18n/                 # Locale config and translation files\n├── test/                 # Vitest tests (unit, nuxt, e2e)\n├── docker/               # Dockerfile (multi-stage, Node 24 Alpine)\n└── openapi/              # OpenAPI schema files\n```\n\n## Setup\n\n### Prerequisites\n\n- Node.js 24.x\n- pnpm 10.x (`corepack enable`)\n- Docker (optional, for containerization)\n- Django backend running (see [grooveshop-django-api](https://github.com/vasilistotskas/grooveshop-django-api))\n\n### Installation\n\n```bash\n# Install dependencies\npnpm install\n\n# Copy environment file\ncp .env.example .env\n# Edit .env with your configuration\n\n# Prepare Nuxt types\npnpm prepare\n\n# Start dev server\npnpm dev\n```\n\n### Commands\n\n| Command | Description |\n|---------|-------------|\n| `pnpm dev` | Start development server |\n| `pnpm build` | Build for production |\n| `pnpm start` | Start production server |\n| `pnpm lint` | Lint with auto-fix |\n| `pnpm test` | Run all tests |\n| `pnpm test:ci` | Run unit + nuxt tests with coverage |\n| `pnpm openapi-ts` | Generate types from OpenAPI schema |\n| `pnpm prepare` | Prepare Nuxt types |\n\n### Docker\n\n```bash\n# Build\ndocker build -f docker/Dockerfile .\n\n# Or use Docker Compose\ndocker compose up\n```\n\n## Architecture\n\nThe Nuxt server acts as a **proxy** between the Vue frontend and the Django REST API. Client-side code calls `/api/...` routes on the Nuxt server, which forwards requests to Django with appropriate auth headers, caching, and Zod validation.\n\n```\nBrowser  →  Nuxt SSR / Client  →  Nitro Server (/api/*)  →  Django REST API\n                                        ↕\n                                   Redis Cache\n```\n\n### Key Patterns\n\n- **API routes**: Validate with Zod → `$fetch` to Django → `parseDataAs` response → `handleError`\n- **Caching**: Redis with memory fallback, SWR for API data, immutable caching for static assets\n- **Auth**: django-allauth headless API proxied through Nuxt, session cookies via `nuxt-auth-utils`, OAuth tokens stored in encrypted server session\n- **Image handling**: Dual provider — IPX for local, custom mediaStream for product images\n- **State**: Pinia stores for client state, server sessions for auth/cart\n\n## CI/CD\n\nGitHub Actions pipeline: **quality** (TypeScript check) → **test** (unit + nuxt with coverage) → **build** (with Redis service) → **release** (semantic-release on main).\n\nDocker images published to Docker Hub and GHCR on release.\n\n## License\n\nThis project is open-sourced under the MIT License. See the [LICENSE](LICENSE.md) file for more details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvasilistotskas%2Fgrooveshop-storefront-ui-node-nuxt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvasilistotskas%2Fgrooveshop-storefront-ui-node-nuxt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvasilistotskas%2Fgrooveshop-storefront-ui-node-nuxt/lists"}