Each variant takes one angle, aims it at one audience, and proves it with store data rather than adjectives.
The product does not change. What changes is which part of it you lead with.
The carts you already lost, recovered on a timer.
Merchants losing carts
Open the admin and the day is already sorted.
Operators running the day
Every number about money can be traced to a row.
Finance and founders
Every unit that moved, and what moved it.
Anyone holding inventory
Rearrange the storefront without opening an editor.
Merchandisers and marketers
Your next customer will ask, not browse.
Teams watching AI search
Every order traced back to what produced it.
Growth teams
The database is yours, permanently.
Teams leaving a platform
Twenty-five checks between you and a broken store.
Engineering teams
The whole store, in one repository.
Everyone evaluating
It can read everything. It can spend nothing.
Teams putting AI near operations
localhost:3000/admin
kinds of task the store spots for you
block types to build any page from
and the storefront reorders itself
tests keeping the money right
tables, all yours to query
database — nothing to sync
Five commands. No account, no CLI login, no dashboard in between.
~/litestore
$git clone https://github.com/litestore/litestore
$bun install
$cp .env.example .env.local
$bun run db:push && bun run db:seed
$bun run dev
✓ storefront http://localhost:3000
✓ admin http://localhost:3000/admin
$ _
Orders
Maya Okonkwo · 3 items
$182.40Leo Martins · 1 item
$96.00Priya Shah · 5 items
$248.10Dana Feld · 2 items
$74.00Twenty-nine kinds of task. Ship the order and the task disappears.
The badge says 24 to fulfil and the list beneath it has 24 rows. Ship one and both drop to 23.
AI content
18 in reviewSunset Linen Shirt
DraftedCeramic Pour-Over Set
DraftedCanvas Weekender Bag
QueuedIt fills in descriptions, SEO fields and alt text. Nothing reaches the storefront until someone says yes.
Product page
5 modulesDrag them into a new order. No theme file, no deploy.
Reorder them in the admin and the storefront follows. No theme file to edit and nothing to deploy.
Cart recovery
Running312 carts idle
$9.4k at stake · oldest 4d
Recovered
AOV
Revenue
Waits three days, then emails them the code once.
Three days after a cart goes quiet, one email leaves with a code. It sends once, even if you deploy in between.
The product editor and the order view.
Sunset Linen Shirt
DraftBlue linen shirt, short sleeve
oldBreathable European linen, cut for hot days
AIVariants
In stock
SEO score
Copy, SEO, and alt text drafted · publish when you approve.
Point Litestore at a product and it drafts the description, SEO fields, and alt text in your brand voice. Every draft lands in review — nothing goes live on its own.
Order #1042
PaidMaya Okonkwo · returning
Checkout completed in 41 seconds
Captured via Stripe
Reserved across 2 locations
Receipt and tracking sent
Total
Items
Ship
Ready to ship · payment, stock, and address all check out.
Cart, payment, inventory, receipts, and shipping all live in the same app and the same database. No middleware, no per-order platform cut.
Write it into the same codebase. The compiler checks it fits.
lib/rules/workflows.ts
Durable{
event: "cart.abandoned",
name: "recover-abandoned-cart",
run: async (payload, step) => {
await step.sleep("settle", "3d")
await step.run("send-offer", () =>
queueEmail({ template: "cart-recovery", to: payload.email })
)
},
}A full cart-recovery flow. The three-day wait survives restarts and deploys, and the email is sent once.
React to any domain event in one entry
Add a block type the compiler then demands you finish
Place your own module into a PDP section
Inherit list, detail, mutations, activity, and permissions
Plus payment providers, outbound webhooks, swappable services, and checks that fail the build when an extension is wrong.
How extensibility worksThese are seams inside your own copy of the code. There is no versioned plugin API.
Including where the other one is a better fit.