Project structure
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
| Folder | Files |
|---|---|
apps/admin | 564 |
apps/storefront | 83 |
packages/emails | 17 |
packages/database | 9 |
supabase | 31 |
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
| Package | Version |
|---|---|
| Next.js | 15.5.15 |
| React | 19.0.0 |
| TypeScript | ^5.6.3 |
| Node | >= 20 |
| pnpm | 9.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-react | 0.460.0 |
| recharts | 2.15.4 |
| zod | 3.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 intoapps/storefront/src/app/(admin)/as a route group, with no collision. - Drop the back office.
rm -rf apps/adminleaves the schema and the public site untouched.
Both are described in the README shipped with your repository.
