Paper: A Storefront Template That Actually Respects Your Time
You know the drill: you're building an e-commerce frontend, and the checkout flow is where good intentions go to die. Client-side state gets tangled, payment gateways fight your auth, and the whole thing becomes a brittle mess of workarounds. If that sounds familiar, you'll want to look at Paper, the new storefront template from the Saleor team. It's a minimal, production-ready starting point built on Next.js that takes a refreshingly server-first approach to the hardest part of any online store.
What It Does
Paper is a starter pack for building performant e-commerce experiences with Saleor, the open-source headless commerce platform. It's built on the Next.js App Router, uses Server Components and server actions, and ships with a fully integrated checkout system they call "Open Checkout (v2)".
The core idea is that the checkout isn't bolted on as an afterthought—it's woven into the same architecture as the rest of the storefront. The cart lives server-side, loaded by React Server Components on entry. The checkout flow is URL-driven, meaning each step (contact, shipping, payment) has its own query parameter that updates shallowly without triggering full page refetches. Your browser's Back button actually works to walk through the funnel, which is more than you can say for a lot of custom checkout implementations.
The tech stack is what you'd expect from a modern Next.js project: App Router, Server Components, server actions, and a BFF (backend-for-frontend) session pattern. There's no client-side GraphQL client and no browser-held Saleor tokens—auth is resolved server-side, and the checkout communicates with the backend through a shared session bridge.
Why It's Cool
The standout feature here is the checkout architecture, and it's worth unpacking why it matters.
Server-first cart state. The checkout data is loaded via React Server Components on entry, and the client context is just a cache of that server truth. This means no flash-of-empty-cart, no double-fetching, and a lot less client-side state synchronization to debug.
URL-driven steps with shallow updates. Each step of the checkout is a URL state. Clicking "continue" doesn't trigger a full page reload—it just updates the query parameter. This is a clever pattern that gives you proper navigation semantics without the performance penalty.
A dedicated confirmation page. The /checkout/complete?order= route is separate from the active cart route. That might sound minor, but it solves a real problem: you don't want users refreshing a confirmation page and accidentally re-submitting an order or landing back in an empty cart.
Extensible payment registry. Payments are handled through a registry pattern with Stripe and a Dummy gateway included out of the box. Adding a new gateway is a matter of plugging into that registry rather than rewriting the checkout flow.
Shared BFF auth. Sign-in happens through an API route, and the session is resolved server-side. The README mentions three session states—guest, authenticated, or unavailable—which gives you a clean way to handle edge cases like expired tokens or network failures.
The project also acknowledges its own rough edges. The README literally says "expect some rough edges" since it's a new release. That honesty is refreshing, and it sets the right expectation: this is a solid foundation to build on, not a finished product.
How to Try It
The fastest way to get started is the one-click Vercel deployment button in the README. It'll prompt you for a few environment variables, and you'll have a live storefront in minutes.
If you prefer to run it locally, you'll need a Saleor instance. The key environment variables are:
NEXT_PUBLIC_SALEOR_API_URL— your GraphQL endpoint (e.g.,https://your-instance.saleor.cloud/graphql/)NEXT_PUBLIC_DEFAULT_CHANNEL— the channel slug from your Saleor Dashboard (e.g.,default-channel)NEXT_PUBLIC_DEFAULT_LOCALEandNEXT_PUBLIC_STOREFRONT_LOCALES— for multi-language support (e.g.,enanden,pl,de,fr)
For multi-channel setups, you can set STOREFRONT_CHANNELS and optionally a SALEOR_APP_TOKEN for the footer channel selector.
The repository is at github.com/saleor/storefront. If you hit issues, the team points you to their Discord server rather than a faceless issue tracker—always a good sign.
Final Thoughts
Paper is best suited for developers who are already committed to Saleor or who are evaluating headless commerce and want a reference implementation that doesn't cut corners on the checkout experience. The server-first architecture is a deliberate choice that aligns with where the Next.js ecosystem is heading, and the URL-driven step pattern is genuinely clever.
It's not a finished, plug-and-play store—you'll need to customize it for your actual business logic, and the README is upfront about that. But as a starting point, it's far more thoughtful than most boilerplate you'll find. If you're tired of fighting your checkout code, Paper is worth a look.
Follow @githubprojects for more developer tools and open source projects.