Munchies (Tinloof) Medusa Starter Audit
Codebase Stats
| Metric | Value |
|---|---|
| Framework | Astro 5.16 (SSR on Cloudflare Workers) with React 19 islands |
| React version | 19.2.3 |
| Styling | Tailwind CSS v4, CSS custom properties, class-variance-authority |
| Source directory | apps/web/src/ |
| TS/TSX/JS/JSX files (web) | 158 files, ~10,068 lines |
| Astro files (web) | 51 files, ~2,259 lines |
| Total across monorepo | ~12,985 lines |
| Medusa SDK | @medusajs/js-sdk v2.13.0 |
| Package manager | pnpm 9 + Turborepo |
| Deployment target | Cloudflare Workers/Pages |
Key dependencies: Embla Carousel, Radix UI, nanostores, nuqs, Sanity, Stripe, Orama search, satori/resvg for OG images.
Project Structure
Monorepo with three apps:
| App | Path | Purpose |
|---|---|---|
@apps/web | apps/web/ | Astro SSR storefront |
@apps/medusa-backend | apps/medusa-backend/ | Medusa v2 backend with custom API routes, email templates, Sanity sync |
@apps/search | apps/search/ | Cloudflare Worker running Orama full-text search |
Page Routes
| Route | Description |
|---|---|
/ | Homepage — CMS-driven sections (hero, marquee, etc.) via Sanity |
/:countryCode/ | Localized homepage (16 countries) |
/products | Product listing with faceted filtering |
/products/:handle | PDP with image carousel, variant picker, add-to-cart |
/checkout | Multi-step checkout |
/order/confirmed/:id | Order confirmation |
/faqs | FAQ page with search and category filtering |
/:path (catch-all) | CMS-driven modular/text pages |
/cms | Embedded Sanity Studio |
/api/draft-mode/enable | Sanity visual editing draft mode |
/api/og/:info | Dynamic OG image generation |
/api/revalidate | Cache tag-based revalidation |
Commerce Components
Product
| Component | Path | Lines |
|---|---|---|
| ProductCard | src/components/shared/product-card.tsx | 73 |
| ProductsGrid | src/components/plp/products-grid.astro | 83 |
| ProductInformation | src/components/pdp/product-information.tsx | 69 |
| ProductImagesCarousel | src/components/pdp/image-carousel.tsx | 122 |
| OptionsSelect | src/components/pdp/options-select.tsx | 39 |
| Specs (accordion) | src/components/pdp/specs.tsx | 28 |
| Addons (cross-sell) | src/components/pdp/addons.tsx | 27 |
| StickyAtc (mobile) | src/components/pdp/sticky-atc.tsx | 59 |
Cart
| Component | Path | Lines |
|---|---|---|
| CartUI (slide-out drawer) | src/components/cart/cart-ui.tsx | 66 |
| LineItem | src/components/cart/line-item.tsx | 90 |
| CartFooter | src/components/cart/cart-footer.tsx | 58 |
| AddToCart | src/components/cart/add-to-cart.tsx | 75 |
| CartAddonsCarousel | src/components/cart/cart-addons-carousel.tsx | 37 |
Checkout
| Component | Path | Lines |
|---|---|---|
| CheckoutForm | src/components/checkout/checkout-form/index.tsx | 62 |
| AddressForm | src/components/checkout/checkout-form/address-form.tsx | 231 |
| Delivery | src/components/checkout/checkout-form/delivery.tsx | 130 |
| Payment | src/components/checkout/checkout-form/payment/index.tsx | 184 |
| Review | src/components/checkout/checkout-form/review.tsx | 26 |
Filtering
| Component | Path | Lines |
|---|---|---|
| FilterSelect | src/components/plp/filter-select.tsx | 163 |
| MobileFilterDropdown | src/components/plp/mobile-filter-dropdown.tsx | 140 |
| Dropdown | src/components/plp/dropdown.tsx | 96 |
| Accordion | src/components/plp/accordion.tsx | 89 |
CMS Sections
Hero, Marquee, CenteredText, MediaText, Testimonials, CollectionList, FeaturedProducts, ShopTheLook (interactive hotspots), Assurance.
Feature Inventory
Faceted Filtering
Two filter types via Orama search worker:
- Collections — multi-select checkbox dropdown
- Categories — multi-select checkbox dropdown
Proper OR-within / AND-between faceted logic. Mobile slide-out filter panel. “Clear all” button. URL-param based.
No price range, material, or attribute filters.
Search
Backend exists, no UI. The Orama search worker supports a q query parameter, but the storefront never passes one. No search bar, autocomplete, or search results page for products. FAQ page has its own client-side substring search.
Checkout
Multi-step (4 steps):
- Addresses — shipping + optional separate billing
- Delivery — shipping method radio group
- Payment — Stripe card element
- Review — terms + complete order
No express checkout.
Image Gallery
Embla Carousel: horizontal swipe on mobile, thumbnail strip on desktop. No lightbox, no zoom.
Customer Accounts
None. No login, register, account pages, order history, or saved addresses. Guest checkout only.
SEO
- OG tags via
astro-seo - Dynamic OG images (satori)
- No JSON-LD
- No sitemap
Theming
CSS custom properties in global.css (5 brand colors, 3 font families, full type scale). Moderately easy to reskin.
Assessment for Dungeon Books
Not recommended as primary starter. Despite the beautiful design and strong Sanity CMS integration:
- No customer accounts — would need to build from scratch
- No product search UI — backend supports it but no frontend
- Astro, not Next.js — different framework than what’s expected
- Cloudflare Workers deployment — different infra model than Railway
- Sanity, not Payload — different CMS
The ShopTheLook hotspot component pattern could inspire a “Staff Picks” interactive feature, and the Orama search worker architecture is interesting, but Solace is the better Medusa starter for this project.