astro
Astro 7 conventions for ONE sites — plugin wiring via one.config.ts, OneChat/OneTrack placement, Cloudflare SSR. Invoke when…
Take money on this site — a crypto payment link that needs no backend and no account, or a card charge through Stripe. Knows which one the situation calls for and refuses to quote a price the server did not resolve.
$ npx -y skills add one-ie/one --skill sell --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/sellContext preview
The summary Claude sees to decide when to auto-load this skill.
Take money on this site — a crypto payment link that needs no backend and no account, or a card charge through Stripe. Knows which one the situation calls for and refuses to quote a price the server did not resolve.
name: sell description: Take money on this site — a crypto payment link that needs no backend and no account, or a card charge through Stripe. Knows which one the situation calls for and refuses to quote a price the server did not resolve. model: openrouter/auto lifecycle: beta reads: - ai/context.md
Two rails ship in this repo and they are not interchangeable. Pick by what the buyer needs, not by which is easier to call.
| Buyer needs | Rail | Route | Needs a ONE account? | |---|---|---|---| | to pay in crypto, from any wallet | **payment link** | `POST /api/pay/link` | **no** | | to pay by card | **Stripe** | `POST /api/pay/create-intent` | no, but needs Stripe keys |
`POST /api/pay/link` calls `pay.one.ie`'s `payment_link_create` and returns `{ url, qr }`. Three facts about it decide when to reach for it:
**The treasuries are the site's own addresses.** `readSelfHostedWallet()` reads what `one wallet keygen` wrote into `.dev.vars`, and those addresses go to pay.one.ie as the link's treasuries. Funds land directly in the wallet `/wallet` displays. Nothing custodies them on the way.
**It never touches the substrate.** No `ONE_API_KEY`, no workspace, no account. Only the *payer* signs, and only at claim time, so creating the link needs no signature at all. A clone with an empty `.env` can take a crypto payment.
**Four chains, and the payer picks.** `CHAIN_TO_PAY` maps `sui → SUI`, `evm → ETH`, `sol → SOL`, `btc → BTC`. Whichever of those the wallet has an address for becomes an option on the link.
If no wallet is configured the route answers **409** with the fix in the message — `one wallet keygen`, then the addresses into `.dev.vars`. Say that to the operator verbatim rather than inventing a cause.
When `ONE_API_KEY` is present the route opts the link into `/api/pay/crypto-webhook`, so a claimed payment lands as a settlement and a signal in the workspace. **No credits are granted and custody does not change.** Both extra fields are `undefined` without a key, and `JSON.stringify` drops them, so the body sent to pay.one.ie is byte-identical in the two modes. A connected site and a standalone site create the same link; only one of them gets told when it is paid.
The route resolves prices **server-side, from their own field**, and you must match that discipline when you build a call:
`product` is a description and resolves no price, ever. It is kept separate from `productId` precisely so a buyer's free text can never match a catalog slug and hijack what they are charged. When you have a catalog item, send `productId` and let the server price it — sending `amountCents` for something that has a catalog price is how a discount becomes a vulnerability.
`amount` is **integer cents** despite `unit: 'usd'`. An amount that is not finite or not greater than zero is a 400.
send `productId` and report what came back.
settled; there is no chargeback to promise.
is an unconfigured wallet, not a rejected buyer.
Report the message it carries rather than guessing.
Make Your Ideas Real. Build Apps, Websites and AI Agents with Plain English with Astro, React, Shadcn and Cloudflare
Astro 7 conventions for ONE sites — plugin wiring via one.config.ts, OneChat/OneTrack placement, Cloudflare SSR. Invoke when…
React 19 conventions in ONE sites — client islands, @oneie/react hooks, no useEffect for ONE data. Invoke when editing .tsx…
Use the ONE backend (@oneie/sdk) from this frontend via the plugin-backend wrapper. Invoke when reading/writing ONE data in API…
shadcn/ui under the ONE 6-token design system — CSS var tokens only, no hex, add components via the CLI. Invoke when editing…
Give this workspace a resource type — products, lessons, tickets, whatever the business actually tracks — by writing one TOML…
Put words on this site — a blog post, a docs page, a product, or a live page from ONE's editor. Knows which of the four surfaces…