Aisle is a commerce agent: it discovers, decides, gets one human approval, and buys through any merchant's real checkout. Chat with it.
CommerceTypeScript · CSSGitHub @NoelVFXOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Aisle is an agentic-checkout commerce agent. You tell it what you want in plain language;
it finds real products, ranks and pitches them to your taste, gets one approval, and
completes a real merchant checkout, without ever seeing or typing your card. The same engine
also rescues an AI agent that hits a paywall mid-task: it buys the smallest top-up that clears
the wall and replays the call.
The repo is two layers that share one philosophy (find → price → one approval → buy → verify):Read the full README ↗Aisle is an agentic-checkout commerce agent. You tell it what you want in plain language; it finds real products, ranks and pitches them to your taste, gets one approval, and completes a real merchant checkout, without ever seeing or typing your card. The same engine also rescues an AI agent that hits a paywall mid-task: it buys the smallest top-up that clears the wall and replays the call.
The repo is two layers that share one philosophy (find → price → one approval → buy → verify):
web/: chat with Aisle to buy real
Shopify products and SaaS tools. Live demo: https://aisle-mauve.vercel.appsrc/: signed mandates, balance gates,
and a fast/slow purchase ladder that make autonomous buying safe. This is the "signed
mandates, balance verification, 300+ tests" machinery behind the one-tap checkout.A premium chat interface where you talk to the Aisle agent. It surfaces the full agentic-checkout experience: personalized discovery, tone-tested pitches, one-tap approval, checkout complements, receipts, order tracking, and SaaS tool discovery. Built with Next.js (App Router) + Geist, and it ships with a demo agent so it deploys and demos on its own.
| Try this | You get |
|---|---|
| "Show me a blazer" / "Find me a keyboard" | A ranked, pitched shortlist, each card in a different tone |
| Click a product | The approval card: total, vaulted-card mandate, and "frequently bought together" |
| "Approve and buy" | A verified receipt (demo: nothing is really charged) |
| "Set up my profile" | Consent-gated persona capture (gender, budget, life stage, style, delivery address) that re-ranks results |
| "I need an MCP tool that sends email" | A SaaS recommendation with a buyable plan, plus complementary tools |
| "My For You" | Empty for a first-time user; fills after a purchase |
| Click "View order" on a receipt | An order-tracking page with a chat to cancel, reschedule, or change the delivery address |
What makes the shortlist yours:
cd web
npm install
npm run dev # http://localhost:3000
Demo mode needs no keys. To light up the real features, set these (in web/.env.local, or in
your Vercel project) — see web/README.md and web/.env.example:
| Variable | Enables |
|---|---|
AGNIC_TOKEN | Real Shopify product browse (without it, browse says "connect Agnic") |
OPENROUTER_API_KEY | Intelligent chat + the tone pitches (default model deepseek/deepseek-chat-v3.1, override with AISLE_CHAT_MODEL) |
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY | Sign-in and cross-device profile sync |
NEXT_PUBLIC_SITE_URL | Email-confirmation links that point at your real domain, not localhost |
Auth uses Supabase (cookie sessions via @supabase/ssr, with session-refresh middleware). Run
the SQL in supabase/migrations/ 001 → 005 in the Supabase SQL
editor; 005_profile_address.sql adds the delivery-address column.
When an AI agent's tool call hits a paywall ("insufficient credits", HTTP 402), the gateway pauses the call, works out the smallest one-time top-up that fixes it, asks for one approval tap, buys it (through the vendor's MCP purchase tools or in a Steel cloud browser), checks that the balance actually rose, and replays the exact same call. The agent gets its answer as if nothing happened.
flowchart LR
A[Agent<br/>Claude Code / Codex] -->|tool call| G[Aisle MCP gateway]
G -->|forward| V[Vendor API]
V -->|402 insufficient credits| G
G --> Q[Classify → check balance<br/>→ quote → sign mandate]
Q --> T{{One tap on /browse}}
T --> F[Fast lane<br/>vendor MCP purchase tool]
T --> S[Slow lane<br/>Steel browser]
F --> C[Verify balance rose]
S --> C
C -->|replay same call| V
V -->|result| A
The rules that keep it safe:
src/gateway/upstreams.json), never from an error body, a page, or a model..env). One-time packages only, never subscriptions or auto-renew.PURCHASE_UNKNOWN and blocks a second one.npm install
cp .env.example .env # fill in STEEL_API_KEY, OPENROUTER_INFRA_KEY, vendor keys
npm run gateway:http # MCP at :8788/mcp, /browse + approvals at :8787
claude mcp add --transport http aisle http://127.0.0.1:8788/mcp
codex mcp add aisle --url http://127.0.0.1:8788/mcp # also set tool_timeout_sec = 300
http://127.0.0.1:8787/browse is the watch-and-approve page: a live Steel browser on the left,
the approval card and event timeline on the right. Everything is logged to .aisle/events.jsonl.
MCP tools: openrouter__chat, openai__chat, higgsfield__generate_image,
studio__generate_image, aisle__wait_for_recovery, aisle__spend_report.
| Vendor | Buys on | Status |
|---|---|---|
| Studio (demo) | /billing → Stripe Checkout, test mode | End to end with card 4242, balance verified |
| OpenRouter | openrouter.ai/settings/credits | Real purchase verified ($0 → $5) |
| OpenAI | platform.openai.com billing | Staged only: stops at Gate 1 |
| Higgsfield | higgsfield.ai top-up | Navigation built; top-ups need a paid subscription |
A vendor is paid with real money only if it is in AISLE_REAL_PURCHASE_PROVIDERS; everyone else
stops after Gate 1. Aisle never types real card details — the card must already be saved on the
vendor account. The slow lane climbs a ladder (page JSON-LD → recorded steps → an accessibility
picker model → a vision fallback, never for the Pay click); see docs/steel.md.
# .env: STRIPE_SECRET_KEY=sk_test_… (live keys are refused)
npm run vendor:studio # site + cloudflared tunnel; vaults the demo login in Steel
npm run gateway:http # restart so it picks up .aisle/studio.json
ENTITLEMENT_CHECKED balance 200, required 400
QUOTE_CREATED 500 credits at $5 (smallest pack that clears the shortfall)
APPROVAL_GRANTED
CHECKOUT_STAGED $5 USD, one_time, autoRenew false
MANDATE_COMPARISON_PASSED staged 5 ≤ cap 6.25
TEST_CARD_ENTERED stripe 4242, testMode
CONFIRM_CLICKED "Pay", deterministic
ENTITLEMENT_VERIFIED before 200, after 700
Using the engine as a library (classifyFailure, signMandate, runFastLane, runSlowLane, …)
and host integration are in INTEGRATION.md.
web/ Personalized Explore: Next.js chat app (the shopping agent)
├── app/ routes: /, /profile, /order/[id], api/chat, api/order-chat, api/profile
├── components/ Chat, ProfileEditor, AuthPanel, product/receipt blocks
└── lib/ agent, pitch (ranking + tone), agnic, recommend, supabase
supabase/migrations/ profiles schema + repairs (001 → 005)
src/ the purchase engine (MCP gateway)
├── classifier.ts, interceptor.ts paywall detection → one recovery per requirement
├── core/ quote/ policy/ mandate/ checkpoint, quote, ceilings + origin lock, signed mandate
├── fast-lane/ slow-lane/ vendor MCP purchase tools; Steel click ladder, picker, profiles
├── recovery-flow/ gateway/ recovery state machine; MCP gateway, /browse, purchaser, upstreams.json
└── demo-vendor/ Studio: Stripe test-mode vendor
docs/ specs: aisle-pipeline.md, steel.md, web-path.md, SETUP.md
# web app
cd web && npm run dev # or: npm run build
# purchase engine
npm test # vitest
npm run typecheck
npm run gateway:http # HTTP MCP gateway + /browse
npm run gateway # stdio MCP gateway
npm run vendor:studio # Stripe test-mode demo vendor
npm run steel:login -- <vendor>
npm run smoke:steel
Web env is in web/.env.example; engine env is in .env.example.
The specs in docs/ are the source of truth where they disagree with this README.
AGNIC_TOKEN and Supabase keys; without them the app runs in demo mode.