Tracking: White-label refactoring of libreshop/shop
Why
libreshop/shop currently ships with MUELLERPRINTS branding, Stuttgart contact data, and notebook-specific copy hardcoded across 27 files. This blocks reuse by other adapters (third-party shops based on libreshop). The companion adapter libretech/mp consumes this image and cannot override pages, components, or composables — only runtime env vars.
The companion repo libretech/mp needs to consolidate muellerprints.de (Druckerei) and muellerprints-paperwork.com (Shop) under one domain. To do that cleanly without forking libreshop/shop, we need libreshop/shop to become a true white-label base.
Goal
libreshop/shop becomes a brand-neutral Nuxt 3 base image. Adapters extend it via Nuxt layers (native extends: mechanism). All branding, contact data, legal copy, and brand-specific feature narratives are overridable via the layer or driven by app config / env vars.
libreshop/shop still ships with real default content (a generic example "Demo Print Shop" with placeholder assets) so the bare image is deployable and demonstrable on its own.
Architecture decisions (locked)
Override mechanism: Nuxt layers (extends:) — native Nuxt 3, NOT a custom Strapi-style file-precedence system.
Three-image stack:
git.librete.ch/libreshop/shop:vX.Y.Z — white-label base
git.librete.ch/libretech/mp-shop:vA.B.C — branded adapter (built FROM base)
mp/compose.yml consumes mp-shop, not libreshop/shop directly
Versioning: semver. Major = breaking override surface (component renamed/removed, slot signature changed, env-var rename). Adapter SemVer is independent (libreshop is implementation detail).
# Tracking: White-label refactoring of libreshop/shop
## Why
libreshop/shop currently ships with MUELLERPRINTS branding, Stuttgart contact data, and notebook-specific copy hardcoded across 27 files. This blocks reuse by other adapters (third-party shops based on libreshop). The companion adapter `libretech/mp` consumes this image and cannot override pages, components, or composables — only runtime env vars.
The companion repo `libretech/mp` needs to consolidate `muellerprints.de` (Druckerei) and `muellerprints-paperwork.com` (Shop) under one domain. To do that cleanly without forking libreshop/shop, we need libreshop/shop to become a true white-label base.
## Goal
libreshop/shop becomes a brand-neutral Nuxt 3 base image. Adapters extend it via Nuxt layers (native `extends:` mechanism). All branding, contact data, legal copy, and brand-specific feature narratives are overridable via the layer or driven by app config / env vars.
libreshop/shop still ships with **real default content** (a generic example "Demo Print Shop" with placeholder assets) so the bare image is deployable and demonstrable on its own.
## Architecture decisions (locked)
- **Override mechanism:** Nuxt layers (`extends:`) — native Nuxt 3, NOT a custom Strapi-style file-precedence system.
- **Three-image stack:**
1. `git.librete.ch/libreshop/shop:vX.Y.Z` — white-label base
2. `git.librete.ch/libretech/mp-shop:vA.B.C` — branded adapter (built FROM base)
3. mp/compose.yml consumes mp-shop, not libreshop/shop directly
- **Versioning:** semver. Major = breaking override surface (component renamed/removed, slot signature changed, env-var rename). Adapter SemVer is independent (libreshop is implementation detail).
- **Stable override surface (semver-protected):** `Header`, `Footer`, `Hero`, `TrustBar`, `ProductCard`, `PageSection`, layouts `default`/`bare`/`deep`, composables `useBranding()`, `useNavigation()`, `usePageContent()`. Internal components have no stability guarantee.
- **Product schema scope (now):** notebook-specific (cover/binding/ruling/pages/pattern). Generic product abstraction is **future work**, separate epic. Adapters customize composables for now.
## Sub-issues
This issue tracks the refactor. Concrete work items as separate issues:
- [ ] Brand strings out of nuxt.config + Header + Footer → app.config + runtimeConfig
- [ ] Refactor usePageContent.ts: hardcoded MP content → generic defaults + override path
- [ ] Refactor useProductContent.ts: hardcoded notebook narratives → adapter-owned
- [ ] Add Nuxt `extends:` layer support + document stable override surface (README)
- [ ] Tailwind config: merge content globs across layers
- [ ] Server APIs (contact.post.ts, sitemap, schema.org): env-driven, not hardcoded
- [ ] CHANGELOG + semver commitment, base image publishing strategy
## Out of scope
- Generic product schema (separate future epic)
- New product types beyond notebooks
- CMS multi-tenancy (Strapi schema stays as-is)
## Companion tracking issue
libretech/mp adapter rebuild: see https://git.librete.ch/libretech/mp/issues (linked once mp tracking issue is filed)
Folded into the single muellerprints.de tracker libretech/mp#50 during the 2026-09-24 cleanup: no activity since 2026-05-04. Reopen when work resumes.
Folded into the single muellerprints.de tracker https://git.librete.ch/libretech/mp/issues/50 during the 2026-09-24 cleanup: no activity since 2026-05-04. Reopen when work resumes.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Tracking: White-label refactoring of libreshop/shop
Why
libreshop/shop currently ships with MUELLERPRINTS branding, Stuttgart contact data, and notebook-specific copy hardcoded across 27 files. This blocks reuse by other adapters (third-party shops based on libreshop). The companion adapter
libretech/mpconsumes this image and cannot override pages, components, or composables — only runtime env vars.The companion repo
libretech/mpneeds to consolidatemuellerprints.de(Druckerei) andmuellerprints-paperwork.com(Shop) under one domain. To do that cleanly without forking libreshop/shop, we need libreshop/shop to become a true white-label base.Goal
libreshop/shop becomes a brand-neutral Nuxt 3 base image. Adapters extend it via Nuxt layers (native
extends:mechanism). All branding, contact data, legal copy, and brand-specific feature narratives are overridable via the layer or driven by app config / env vars.libreshop/shop still ships with real default content (a generic example "Demo Print Shop" with placeholder assets) so the bare image is deployable and demonstrable on its own.
Architecture decisions (locked)
extends:) — native Nuxt 3, NOT a custom Strapi-style file-precedence system.git.librete.ch/libreshop/shop:vX.Y.Z— white-label basegit.librete.ch/libretech/mp-shop:vA.B.C— branded adapter (built FROM base)Header,Footer,Hero,TrustBar,ProductCard,PageSection, layoutsdefault/bare/deep, composablesuseBranding(),useNavigation(),usePageContent(). Internal components have no stability guarantee.Sub-issues
This issue tracks the refactor. Concrete work items as separate issues:
extends:layer support + document stable override surface (README)Out of scope
Companion tracking issue
libretech/mp adapter rebuild: see https://git.librete.ch/libretech/mp/issues (linked once mp tracking issue is filed)
Folded into the single muellerprints.de tracker libretech/mp#50 during the 2026-09-24 cleanup: no activity since 2026-05-04. Reopen when work resumes.