External storefronts
Give an LLM the Grocery storefront skill to adapt the built-in experience or create a separate client.
To create a custom Grocery storefront, copy the skill and give it to your LLM. The skill will explain how features/storefront and the customer-facing app routes implement Grocery's current experience.
After that source orientation, it will ask what you dislike, what should stay, what workflows and users matter, and what the replacement should look and feel like. It then traces the exact routes, feature slices, GraphQL calls, schema, access rules, sessions, and provider boundaries in the supplied Grocery codebase before proposing work.
Skill file: /skills/openfront-grocery-custom-storefront/SKILL.md
Current storefront routes
Routes live under app/(storefront)/ with no country or region segment. Each route file re-exports a screen from features/storefront/screens or a module from features/storefront/modules. Data loaders and server actions are in features/storefront/lib/data.
| Route | Customer journey | Main operations |
|---|---|---|
/ | Home: departments, products on the shelf today, coupons to enter at checkout, links to lists | publicGroceryStorefrontSettings, publicGroceryProducts, publicGroceryCoupons, publicGroceryAvailability, departments |
/products | Browse and search products, filter by department, availability, organic, and sort | publicGroceryProducts |
/products/[slug] | Product detail; add to basket, save favorite, back-in-stock and price alerts | publicGroceryProduct, addItemToGroceryCart, saveFavoriteProduct, requestGroceryBackInStockAlert, requestGroceryPriceAlert |
/departments, /departments/[handle] | Department list and department product page | departments, publicGroceryProducts |
/deals | Specials: coupon terms and sale-priced products | publicGroceryCoupons, publicGroceryProducts |
/fulfillment | Delivery and pickup times for the week ahead, delivery area, minimums. Viewing does not reserve a time | publicGroceryAvailability |
/cart | Basket: quantities, per-item substitution preference, clear | groceryCart, updateGroceryCartItem, removeItemFromGroceryCart, clearGroceryCart, updateGrocerySubstitutionPreference |
/checkout | Choose delivery or pickup and a time, address and contact, coupon code, Stripe payment, place order | publicGroceryAvailability, activeCartPaymentProviders, initiatePaymentSession, submitGroceryOrder, resumeGroceryCheckout, restartGroceryCheckout |
/order/[id] | Order progress, picked items, substitution decisions, approve a higher final total, curbside check-in when ready | order or guestGroceryOrder, customerOrderSubstitutions, respondToOrderLineSubstitution, authorizeOrderAdjustment, customerCheckIn, guestCustomerCheckIn |
/order-access | Guests request a secure order link by order number and email; the link opens the order | requestGuestOrderAccess, guestGroceryOrder |
/account/sign-in, /account/register, /account/reset | Shopper sign-in, registration, password reset. The guest basket merges on sign-in | registerGroceryCustomer, mergeGuestGroceryCart |
/account | Account overview: recent orders and saved addresses | authenticatedItem, orders, addresses |
/account/orders | Order history; shop a past order again | orders, reorderGroceryOrder |
/account/addresses | Saved delivery addresses | addresses, createAddress, updateAddress, deleteAddress |
/account/profile | Name, contact, password, notification preferences | updateActiveUser, updateActiveUserPassword, updateGroceryNotificationPreferences |
/account/privacy | Download personal data or request erasure | groceryCustomerPrivacy, exportGroceryCustomerData, requestGroceryCustomerPrivacy |
/lists | Shopping lists: create, delete, add items, tick off, send unchecked items to the basket | shoppingLists, createCustomerShoppingList, deleteCustomerShoppingList, addToShoppingList, removeFromShoppingList, updateShoppingListItemQuantity, toggleShoppingListItemChecked, addShoppingListToCart |
/favorites | Saved products (sign-in required) | favoriteProducts, deleteFavoriteProduct |
/subscriptions | Recurring baskets and rewards (sign-in required): create, pause, resume, skip, cancel, prepare a due basket, redeem points | subscriptions, manageGrocerySubscription, getGroceryLoyalty, redeemGroceryLoyalty |
/support | Help topics and a contact form that lands in the staff inbox | submitGroceryContactMessage |
/policies | How estimates, picking, authorization and final payment, delivery and pickup, and problems with orders work | publicGroceryStorefrontSettings |
/staff/accept | Staff accept an invitation link | acceptGroceryStaffInvitation |
Journey boundaries
- Carts and guest orders use HttpOnly cookies set by server actions. The storefront middleware does no region routing.
- Prices in the basket are estimates. Weighed items are charged on the picked weight. Payment is authorized at checkout and captured after staff finalize the picked goods. If the final total is higher than the authorization, the customer must approve again on the order page.
- Coupons are entered as a code at checkout and checked against the basket. There is no clip-a-coupon command and no recipe page.
- Checkout needs a delivery or pickup time. Delivery also needs a postal code inside the store's delivery prefixes and the delivery minimum.
- Checkout takes payment through the Stripe adapter once
STRIPE_ENABLED=trueand the three Stripe keys are set. - Public reads are scoped to
PUBLIC_STORE_ID. Only published products and active departments are returned. Store details still set to the onboarding placeholders are not shown to shoppers.