Porulle is a REST-only, security-hardened headless commerce framework. It owns the hard parts — orders, payments, refunds, inventory, price-at-sale — in your database. Scaffold a runnable store in one prompt, with zero infrastructure to start.
Read https://porulle.asyncdot.com/start.md then follow it to scaffold a Porulle headless store. The starter gives you the 80% — server, config, an embedded Postgres, mock checkout — all done. It runs instantly; no database to install.
mkdir my-store && cd my-store curl -fsSL https://porulle.asyncdot.com/start.md | your-agent # or follow it yourself pnpm install && pnpm dev # → REST commerce API on http://localhost:4000/api # real Postgres (embedded PGlite) — no database to install
Your catalog, payments, and plugins in a single typed file — the single source of truth.
import { defineConfig } from "@porulle/core";
import { pgliteAdapter } from "@porulle/adapter-pglite";
export default defineConfig({
storeName: "My Store",
databaseAdapter: await pgliteAdapter({ path: "./.data" }),
entities: { product: { variants: { enabled: true }, fulfillment: "physical" } },
payments: [stripeAdapter({ secretKey: process.env.STRIPE_SECRET_KEY! })],
plugins: [loyaltyPlugin(), reviewsPlugin()],
}); Orders, payments, refunds, inventory, and price-at-sale live in your database — not a vendor's. Money-conservation invariants enforced in the core.
One clean REST surface with an OpenAPI spec and a typed SDK client. No GraphQL to learn, no bespoke query language.
Extend with plugins (POS, layaway, loyalty, channel connectors) and swap infrastructure through adapters — payments, storage, search, database.
Tenant isolation enforced at the data layer, PIN/API-key auth, VAPT-driven hardening. Multi-tenant safe by construction.
Ship the 80% before you own any infrastructure. Embedded PGlite runs a real Postgres in-process — no server, no connection string, no migrations.
An MCP endpoint and llms.txt out of the box. Coding agents scaffold, read, and operate a store without hand-holding.
One prompt (curl start.md) drops a runnable store — config, server, embedded database, mock checkout — all done.
Edit one config: your catalog shape, branding, and the plugins you want. The config is the single source of truth.
Swap one line to real Postgres and Stripe. Same PostgreSQL, same code, production-ready.