BetaMaShop is in public beta. We improve it continuously, and your feedback shapes what comes next.

Project structure

Your codeEnglish· 3 min read· Updated September 01, 2026

The real tree of the repository pushed to your GitHub account, what the template covers, what it does not, and the exact dependency versions.

Your code

The repository pushed to your GitHub account holds 712 files, sent as a single commit. It is a pnpm and Turborepo workspace with two Next.js applications sharing one Supabase project.

The tree

apps/
  storefront/   public site, server rendered
  admin/        back office
packages/
  database/     shared Supabase clients, typed queries, cents helpers, Stripe client
  emails/       React Email templates and the provider adapter
supabase/
  migrations/   the single schema
package.json  pnpm-workspace.yaml  turbo.json  README.md
FolderFiles
apps/admin564
apps/storefront83
packages/emails17
packages/database9
supabase31

Two files of MaShop's own build setup sit in the template and are excluded from the push: Dockerfile and fly.toml.

The public site

Five pages: home, /products/[slug], /cart, /checkout/success, /orders/[id]. Two server routes: /api/checkout and /api/webhooks/stripe.

Stripe is the default payment path. While STRIPE_SECRET_KEY is empty, the checkout route answers 501 with a plain message instead of failing silently. Prices are always recomputed on the server; the browser sends only a product identifier and a quantity.

The back office

43 pages and 55 server routes, grouped in fifteen sections: analytics, attributes, blog, categories, collections, coupons, customers, dashboard, inventory, orders, products, reviews, segments, seo, settings.

It signs in against your own Supabase project, with email and password or a magic link. It is a separate application, deployed on its own Netlify site.

What the template covers, and what it does not

The template is a catalogue and orders site. What it ships is a product, a cart, a payment, an order.

A product can be one of seven kinds: simple, variable, subscription, digital, bundle, gift card, service. A service product carries a duration, a place and a buffer between two appointments. A haircut, a table or a consultation can therefore be listed, priced and paid for.

Nothing in the schema stores a date and a time. There is no slot, no reservation, no ticket, no seat. A booking calendar or a ticket office is work to be generated, not a head start the template gives you.

The public site is narrower than the back office in the same way. The back office manages blog posts, categories and collections. The public site ships no route that displays any of them.

Describing what you need in the chat is the way through. A generation writes migration files as well as pages, and those new migrations are applied to your Supabase project right after the commit.

Shared packages

packages/database holds the Supabase clients, the typed queries, the cents helpers and the Stripe client. packages/emails holds nine templates: order confirmation, receipt, shipping update, order cancelled, refund, review request, low stock alert, new order for you, welcome.

Email is optional. With no provider configured, Resend being the default, those messages simply do not go out, and every event still shows in the notification bell of the back office.

Exact versions

PackageVersion
Next.js15.5.15
React19.0.0
TypeScript^5.6.3
Node>= 20
pnpm9.15.4
Turborepo^2.1.0
Tailwind^4.0.0 public site, 4.0.0-beta.4 back office
@supabase/supabase-js^2.46.0
stripe^22.3.0
lucide-react0.460.0
recharts2.15.4
zod3.23.8

Animation on the public site comes from gsap ^3.13.0, @gsap/react ^2.1.2 and lenis ^1.1.20. framer-motion and motion are not installed, so code that imports them will not build until you add them.

The back office adds Tiptap 2.10.3 for the article editor, @tanstack/react-query 5.59.20, @tanstack/react-virtual 3.10.9, @dnd-kit for drag and drop, and next-intl 3.25.1.

Interface primitives are already there: 45 shadcn components in the public site, 58 in the back office.

Run it on your machine

pnpm install
cp apps/storefront/.env.local.example apps/storefront/.env.local
cp apps/admin/.env.local.example apps/admin/.env.local
pnpm dev

Both example files list what to fill: the Supabase URL, the anon key and the service role key from your Supabase dashboard, plus the Stripe keys and an optional email provider. The scripts dev, build, start, lint and typecheck all run through Turborepo.

Two changes you can make in one move

  • Merge the two applications. Both use src/app, so the back office moves into apps/storefront/src/app/(admin)/ as a route group, with no collision.
  • Drop the back office. rm -rf apps/admin leaves the schema and the public site untouched.

Both are described in the README shipped with your repository.

structuremonoreponextjstemplatecode
Was this page helpful?
Your feedback is anonymous.