A minimal, production-ready storefront template for Saleor.
Clean as a blank page β built to ship.
Tip
Questions or issues? Check our Discord for help.
Ship faster, customize everything. Paper is a new releaseβexpect some rough edgesβbut every component is built with real-world e-commerce in mind. This is a foundation you can actually build on.
The checkout is where most storefronts fall apart or fall short. Paper's doesn't. We aim to provide open UI components and full wiring around the whole process.
- Multi-step, mobile-first β Each step is a focused form. No infinite scrolling on phones.
- Guest & authenticated β Seamless flow for everyone. Logged-in users get address book and saved preferences.
- International address forms β Country-aware fields that adapt (US states, UK postcodes, German formats).
- Connection resilience β Automatic retries with exponential backoff. Flaky networks? Handled.
- Componentized architecture β Swap steps, add steps, remove steps. It's your checkout.
- Multi-channel ready β Different currencies and shipping zones per channel.
One codebase, many storefronts. Channel-scoped routing means /us/products and /eu/products can serve different catalogs, prices, and shipping optionsβall from the same deployment.
The hard parts are solved. Adapt the look, keep the logic.
- Multi-attribute variant selection β Color + Size + Material? Handled. Complex variant matrices just work.
- Dynamic pricing β Sale prices, variant-specific pricing, channel pricingβall reactive.
- Image gallery β Next.js Image optimization, proper aspect ratios, keyboard navigation.
Not an afterthought. Focus management on step transitions, keyboard navigation everywhere, semantic HTML, proper ARIA labels. Everyone deserves to shop.
Built for front-end developers and AI agents. The codebase includes:
AGENTS.mdβ Architecture overview and quick reference for AI assistantsskills/saleor-paper-storefront/β 11 task-specific rules covering GraphQL, caching, variant selection, checkout, and more.agents/skills/β Installed community skills (Vercel React best practices, composition patterns)- Consistent patterns β Predictable structure that AI tools can navigate and modify confidently
Whether you're pair-programming with Cursor, Claude, or Copilotβthe codebase is designed to help them help you.
- Next.js 16 with App Router and Server Components
- React 19 with the latest concurrent features
- TypeScript in strict modeβyour IDE will thank you
- Tailwind CSS with design tokens (OKLCH colors, CSS variables)
- GraphQL Codegen for type-safe Saleor API calls
| Feature | Description |
|---|---|
| Checkout | Multi-step flow with guest/auth support, address selector, international forms |
| Cart | Slide-over drawer with real-time updates, quantity editing |
| Product Pages | Multi-attribute variants, image gallery, sticky add-to-cart |
| Product Listings | Category & collection pages with pagination |
| Navigation | Dynamic menus from Saleor, mobile hamburger |
| SEO | Metadata, JSON-LD, Open Graph images |
| Caching | ISR with on-demand revalidation via webhooks |
| Customer Profile | Account dashboard, address book, order history, password change, account deletion |
| Authentication | Login, register, password reset, guest checkout |
| API Resilience | Automatic retries, rate limiting, timeoutsβhandles flaky connections gracefully |
Paper uses Cache Components (Partial Prerendering) for optimal performanceβstatic shells load instantly while dynamic content streams in. Learn more in the Next.js documentation or see skills/saleor-paper-storefront/rules/data-caching.md for project-specific implementation details.
The display-cached, checkout-live model ensures fast browsing with accurate checkout:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATA FRESHNESS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Product Pages Cart / Checkout Payment β
β ββββββββββββββ ββββββββββββββ βββββββ β
β β
β βββββββββββββ βββββββββββββ βββββββββββββ β
β β CACHED ββββββββββΆβ LIVE βββββββββββΆβ LIVE β β
β β 5 min β Add β Always β Pay β Always β β
β βββββββββββββ to βββββββββββββ βββββββββββββ β
β Cart β
β Fast page loads Real-time prices Saleor validates β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Component | Freshness | Why |
|---|---|---|
| Product pages | Cached (5 min TTL) | Instant loads, great Core Web Vitals |
| Category/Collection | Cached (5 min TTL) | Fast browsing experience |
| Cart drawer | Always live | Saleor API with cache: "no-cache" |
| Checkout | Always live | Direct API calls, real-time totals |
Configure Saleor webhooks to invalidate cache immediately when data changes:
- Create webhook in Saleor Dashboard β Configuration β Webhooks
- Point to
https://your-store.com/api/revalidate - Subscribe to
PRODUCT_UPDATED,CATEGORY_UPDATED, etc. - Set
SALEOR_WEBHOOK_SECRETenv var
Without webhooks? TTL handles itβcached data expires naturally after 5 minutes.
- Saleor is the source of truth:
checkoutLinesAddcalculates prices server-side - Cart always fetches fresh: Users see current prices before checkout
- Payment validates:
checkoutCompleteuses real-time data
π Deep dive: See
skills/saleor-paper-storefront/rules/data-caching.mdfor the full architecture, Cache Components (PPR), webhook setup, and debugging guide.
Note
New to Saleor? Check out saleor.io/start to learn how storefronts work underneath.
Option A: Free Saleor Cloud account (recommended)
Option B: Run locally with Docker
# Using Saleor CLI (recommended)
npm i -g @saleor/cli@latest
saleor storefront create --url https://{YOUR_INSTANCE}/graphql/
# Or manually
git clone https://github.com/saleor/storefront.git
cd storefront
cp .env.example .env
pnpm installEdit .env with your Saleor instance details:
NEXT_PUBLIC_SALEOR_API_URL=https://your-instance.saleor.cloud/graphql/
NEXT_PUBLIC_DEFAULT_CHANNEL=default-channel # Your Saleor channel slugFinding your channel slug: In Saleor Dashboard β Configuration β Channels β copy the slug
pnpm devOpen localhost:3000. That's it.
pnpm dev # Start dev server
pnpm build # Production build
pnpm run generate # Regenerate GraphQL types (storefront)
pnpm run generate:checkout # Regenerate GraphQL types (checkout)src/
βββ app/ # Next.js App Router
β βββ [channel]/ # Channel-scoped routes
β βββ checkout/ # Checkout pages
βββ checkout/ # Checkout components & logic
βββ graphql/ # GraphQL queries
βββ gql/ # Generated types (don't edit)
βββ ui/components/ # UI components
β βββ account/ # Customer profile & address book
β βββ pdp/ # Product detail page
β βββ plp/ # Product listing page
β βββ cart/ # Cart drawer
β βββ ui/ # Primitives (Button, Badge, etc.)
βββ styles/brand.css # Design tokens
If you're working with AI coding assistants, point them to:
AGENTS.mdβ Architecture, commands, gotchasskills/saleor-paper-storefront/β 11 project-specific rules (GraphQL, caching, checkout, etc.).agents/skills/β Installed community skills (React best practices, composition patterns)
To install the project skill for agent auto-discovery:
npx skills add . --skill saleor-paper-storefront# Required
NEXT_PUBLIC_SALEOR_API_URL=https://your-instance.saleor.cloud/graphql/
# Optional
NEXT_PUBLIC_STOREFRONT_URL= # For canonical URLs and OG images
REVALIDATE_SECRET= # Manual cache invalidation
SALEOR_WEBHOOK_SECRET= # Webhook HMAC verification
SALEOR_APP_TOKEN= # For channels queryThe checkout architecture supports Saleor payment apps like Adyen and Stripe. The heavy lifting is doneβintegrating your gateway requires minimal work compared to building from scratch.
Paper works as a reference implementation and as a starting point for your own storefront. Start here:
- Colors & typography β
src/styles/brand.css - Components β
src/ui/components/ - Checkout flow β
src/checkout/views/SaleorCheckout/
The design token system uses CSS custom propertiesβswap the entire color palette by editing a few lines.
Features planned for future development:
- Filtering logic iteration. Fetching attributes from API for dynamic product filters.
- Paper App. Iteration on the revalidation logic and supported webhooks, providing a Preview in storefront feature in Saleor Dashboard.
- Opinionated model for standard content. Moving currently hardcoded stuff like Credibility or Free checkout information to API models.
FSL-1.1-ALv2 (Functional Source License, Version 1.1, ALv2 Future License) β use it, modify it, ship it. Build your storefront, run your business. The license converts to Apache 2.0 after two years.
Want to offer it as a managed service? Let's talk.
Built with π€ by the Saleor team