Skip to content
codexa

Ecommerce · React

Coffee roaster shop

Dark storefront for a specialty roaster with single origins, a subscription, brew gear and shipping info.

Coffee roaster shop starter, as built from its own files
Starter screenshot captured from this template's own build at 1440×900. It shows the template as it ships, not output generated from a prompt.

What you get

An online shop for a small-batch coffee roaster: an editorial hero, filter and espresso coffees with tasting notes, brewing gear, a flexible subscription, the roasting process, shipping details and a roast-calendar newsletter. All content lives in src/site.ts.

Files

Exactly what is copied into a new project: 13 files, nothing generated.

Raw data: GET /api/v1/templates/shop-coffee-roaster

src/site.ts
src/site.ts
import type { Site } from "./types"; /** Everything this site shows. Edit freely. */export const site: Site = {  "brand": "Halde Coffee",  "nav": [    {      "label": "Coffee",      "href": "#coffee"    },    {      "label": "Subscription",      "href": "#subscription"    },    {      "label": "Roasting",      "href": "#roasting"    },    {      "label": "Shipping",      "href": "#shipping"    }  ],  "navCta": {    "label": "Start a subscription",    "href": "#subscription"  },  "sections": [    {      "kind": "hero",      "variant": "editorial",      "eyebrow": "Roasted on Tuesdays and Fridays in Leipzig",      "title": "Coffee roasted to taste like where it grew.",      "text": "Eight coffees from farms we buy from year after year, roasted in small batches and shipped within 48 hours of leaving the drum.",      "primary": {        "label": "Shop coffee",        "href": "#coffee"      },      "secondary": {        "label": "How we roast",        "href": "#roasting"      },      "visual": {        "type": "tiles",        "tones": [          "#78350f",          "#a16207",          "#3f2a1d",          "#1f1610"        ],        "caption": "Friday roast · 14 batches"      }    },    {      "kind": "products",      "id": "coffee",      "eyebrow": "Shop",      "title": "This season's coffees",      "text": "All coffees are 250 g, whole bean unless you ask us to grind them.",      "currency": "€",      "items": [        {          "name": "Huila, Colombia",          "price": 16.5,          "category": "Filter",          "tone": "#7c2d12",          "text": "Red grapefruit, cane sugar, black tea.",          "badge": "New"        },        {          "name": "Kochere, Ethiopia",          "price": 15,          "category": "Filter",          "tone": "#92400e",          "text": "Bergamot, peach and jasmine. Washed.",          "badge": "Bestseller"        },        {          "name": "Nyeri AA, Kenya",          "price": 17,          "category": "Filter",          "tone": "#5c2b16",          "text": "Blackcurrant, tomato, demerara.",          "badge": "Low stock"        },        {          "name": "Halde House Espresso",          "price": 13.5,          "category": "Espresso",          "tone": "#3f2a1d",          "text": "Brazil and Guatemala. Milk chocolate, hazelnut.",          "badge": "Bestseller"        },        {          "name": "Cerrado Natural, Brazil",          "price": 12,          "category": "Espresso",          "tone": "#57442f",          "text": "Cocoa, roasted almond, low acidity."        },        {          "name": "La Soledad, Guatemala",          "price": 14.5,          "category": "Espresso",          "tone": "#6b3a1e",          "text": "Brown sugar, red apple, cocoa nib."        },        {          "name": "Sugarcane Decaf, Colombia",          "price": 13,          "category": "Decaf",          "tone": "#4a3f35",          "text": "Toffee and orange. Naturally decaffeinated."        },        {          "name": "Swiss Water Decaf, Peru",          "price": 13.5,          "category": "Decaf",          "tone": "#44403c",          "text": "Milk chocolate and walnut. Chemical-free process."        },        {          "name": "Ceramic dripper",          "price": 28,          "category": "Brewing",          "tone": "#78716c",          "text": "Single-cup cone, fits size 02 papers."        },        {          "name": "Hand grinder",          "price": 89,          "category": "Brewing",          "tone": "#292524",          "text": "Steel conical burrs, 40 g capacity."        },        {          "name": "Filter papers, 100",          "price": 6,          "category": "Brewing",          "tone": "#a8a29e",          "text": "Unbleached, size 02."        }      ]    },    {      "kind": "split",      "id": "subscription",      "eyebrow": "Subscription",      "title": "Fresh coffee on your schedule",      "text": "Pick filter, espresso or roaster's choice, then choose how often. Skip, pause or swap coffees from your account at any time before the roast day.",      "bullets": [        "Every 1, 2 or 4 weeks",        "10% off every bag, free shipping in Germany",        "No minimum term, cancel online"      ],      "visual": {        "type": "card",        "tone": "#78350f",        "title": "Roaster's choice",        "lines": [          "Two 250 g bags per delivery",          "From €26 per delivery",          "Tasting notes card in every box"        ]      }    },    {      "kind": "steps",      "id": "roasting",      "eyebrow": "How we roast",      "title": "From green bean to your door in four days",      "items": [        {          "title": "Sample roast",          "text": "Every new lot is sample-roasted and cupped three times before we commit to buying it."        },        {          "title": "Roast in small batches",          "text": "12 kg batches on our 15 kg drum roaster, logged so every batch tastes like the last."        },        {          "title": "Rest and cup",          "text": "We taste each roast the next morning. Anything off profile is sold as a discounted blend."        },        {          "title": "Pack and ship",          "text": "Valve bags, packed by hand and posted within 48 hours of roasting."        }      ]    },    {      "kind": "features",      "id": "shipping",      "eyebrow": "Shipping & returns",      "title": "Shipping, simply",      "columns": 4,      "items": [        {          "title": "Germany",          "text": "€4.50 with DHL, free over €40. Usually 1 to 2 working days.",          "icon": "truck"        },        {          "title": "EU",          "text": "€9.90, free over €70. Usually 3 to 5 working days.",          "icon": "globe"        },        {          "title": "Not for you?",          "text": "If a coffee doesn't suit you, tell us within 14 days and we'll swap it once.",          "icon": "cup"        },        {          "title": "Roast dates",          "text": "Every bag shows its roast date. Best between 7 and 40 days after roasting.",          "icon": "calendar"        }      ]    },    {      "kind": "quotes",      "eyebrow": "Customers",      "title": "Notes from the subscriber list",      "items": [        {          "quote": "The Kochere tasted so much like peach tea that I made my partner try it blind.",          "name": "Jonas B.",          "role": "Filter subscriber since 2024"        },        {          "quote": "House Espresso is forgiving enough for my old machine and still tastes like chocolate in milk.",          "name": "Sophie L.",          "role": "Espresso at home"        },        {          "quote": "I pause my subscription every summer holiday. It takes ten seconds.",          "name": "Mateo G.",          "role": "Roaster's choice, every 2 weeks"        }      ]    },    {      "kind": "cta",      "title": "Get the roast calendar",      "text": "A short email when new coffees land, with the farm's story and our brew recipe. About twice a month.",      "primary": {        "label": "Sign up",        "href": "#contact"      },      "secondary": {        "label": "Browse coffee",        "href": "#coffee"      }    },    {      "kind": "contact",      "eyebrow": "Roast calendar",      "title": "New coffees, first",      "text": "Add your email and we'll tell you when a new lot is on the roaster. Unsubscribe any time.",      "fields": [        "name",        "email"      ],      "button": "Send me the calendar"    }  ],  "footer": {    "text": "Small-batch specialty coffee roasted in Leipzig.",    "columns": [      {        "title": "Shop",        "links": [          "Filter",          "Espresso",          "Decaf",          "Brewing gear"        ]      },      {        "title": "Help",        "links": [          "Shipping",          "Subscriptions",          "Grind guide"        ]      },      {        "title": "Visit",        "links": [          "Roastery open Saturdays 10–14",          "Karl-Heine-Straße 82"        ]      }    ],    "legal": "© Halde Coffee. Sample content: replace it in src/site.ts."  }};

Remix

Remix this template

Describe what to change and the agent starts from Coffee roaster shop's files. The box is already started for you: finish “Start from Coffee roaster shop and …”

Agent ready

Creates a free account first; your idea is carried over.

Dependencies

Documented from the template's package.json. The runtime has a prebuilt dependency set for Vite + React + TypeScript, so installs are fast.

  • react^19.1.0
  • react-dom^19.1.0
  • vite^6.3.0
  • @vitejs/plugin-react^4.4.0
  • tailwindcss^4.1.0
  • @tailwindcss/vite^4.1.0
  • typescript^5.8.0

How it runs

Framework
Vite + React + TypeScript
Dev command
npm run dev
Build command
npm run build
Output directory
dist
Port
5173
Entry route
/

Projects run in an isolated sandbox with a live preview. Read the projects documentation for settings, snapshots and deployment.

All templates

Build on Coffee roaster shop

Create a free account, start from this template, and ask the AI agent to turn it into your app.