From 0f4ed3c1aa19692ae07827b7dabf64a41ad0b374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ois=C3=ADn=20Kyne?= Date: Sat, 11 Jul 2026 15:29:15 +0100 Subject: [PATCH] feat(stack): customise storefronts --- .claude-plugin/plugin.json | 2 +- skills/run-obol-stack/SKILL.md | 2 +- .../references/agent-commerce.md | 19 ++++++++++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index bb45998..6d71aa0 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "obol", "description": "Skills for running decentralised infrastructure and agents with Obol", - "version": "1.3.0", + "version": "1.4.0", "author": { "name": "Obol" } diff --git a/skills/run-obol-stack/SKILL.md b/skills/run-obol-stack/SKILL.md index fc550e9..f9ffcb5 100644 --- a/skills/run-obol-stack/SKILL.md +++ b/skills/run-obol-stack/SKILL.md @@ -199,7 +199,7 @@ NICHE → SCOUT → PACK ALPHA → BUILD → EVALUATE → PRICE → SELL → MEA 3. **Build** — `obol agent new --model --skills --objective "..." --create-wallet`. 4. **Evaluate** — the gate most people skip: ask the agent the 10 hardest questions a paying buyer would ask, compare against a raw-model baseline, list only on a clear win. Details in the reference. 5. **Price + sell** — `obol sell agent --price ... --token OBOL|USDC --chain ethereum|base`. -6. **Storefront** — `obol tunnel setup` for a permanent URL (optionally `obol domain register` for a real domain), `obol sell info set --display-name ... --tagline ... --logo-url ...` for branding, `obol sell register --chain` for ERC-8004 discovery. +6. **Storefront** — `obol tunnel setup` for a permanent URL (optionally `obol domain register` for a real domain), `obol sell info set --display-name ... --tagline ... --logo-file ... --theme light|dark|obol --description ''` for branding (applies to the storefront AND the 402 paywall pages; see the agent-commerce reference for the full knob set incl. `--accent`, `--css-file`, per-hostname overrides), `obol sell register --chain` for ERC-8004 discovery. 7. **Measure + iterate** — revenue is the payTo wallet's on-chain balance; refresh alpha on a cadence; kill offers that don't sell within ~30 days and reuse the parts. The agent *inside* the Stack ships with a `sub-agent-business` skill covering this same loop from in-cluster — once the user is in `obol hermes chat`, their agent can scout, build children via its agent-factory, and evaluate them itself. Your job from outside is the host-side half: tunnel, domain, branding, registration signing, and honest quality judgment. diff --git a/skills/run-obol-stack/references/agent-commerce.md b/skills/run-obol-stack/references/agent-commerce.md index 84d8cad..a006ce7 100644 --- a/skills/run-obol-stack/references/agent-commerce.md +++ b/skills/run-obol-stack/references/agent-commerce.md @@ -181,16 +181,29 @@ When quoting prices, always name the unit explicitly (`0.01 OBOL / MTok`, `0.001 ### Storefront branding — `obol sell info` -The tunnel hostname serves a public storefront landing page plus a machine-readable catalogue at `/api/services.json` (and `/skill.md`). Branding is operator-set: +The tunnel hostname serves a public storefront landing page plus a machine-readable catalogue at `/api/services.json` (and `/skill.md`). Branding is operator-set and applies to every buyer-facing surface — storefront, 402 paywall pages, wallet sign-in, `/api` docs, per-offer landing pages: ```bash obol sell info # buyer's-eye view: branding + every on-sale service obol sell info # focus one service + how-to-buy (add --verbose for health) -obol sell info set --display-name "Acme Labs" --tagline "Paid APIs." --logo-url "https://…" +obol sell info set \ + --display-name "One Dollar Audit" \ + --tagline "A serious security audit. One dollar." \ + --logo-file ./logo.png \ + --theme obol \ + --description 'Ships as a **signed report** — findings ranked by severity.' obol sell info reset # back to defaults (or reset individual fields via flags) ``` -`sell info` shows what buyers see (only operationally-ready offers); operator health and conditions (including draining/not-ready offers) live under `obol sell status`. Run `sell info` with the user after any change — it's the fastest "would I buy from this storefront?" check. +The full knob set (all optional, all patch-only): + +- `--theme light|dark|obol` — built-in presets (`light` default); `--accent '#hex'` recolors any of them. +- `--logo-file` / `--favicon-file` / `--og-image-file` — inline local images as data: URIs (no hosting, no CORS pain); the OG image drives link previews. +- `--description ''` — longer seller copy; safe markdown subset (bold, lists, links, small headings) rendered on the storefront and paywall pages. +- `--css-file custom.css` — capped custom stylesheet injected after the theme; target the stable `data-obol="…"` attributes (e.g. `[data-obol="price"]`). This is the styling API — write CSS against these hooks, not against class names. +- `--hostname …` — per-origin override for an offer bound to its own hostname (each product gets its own identity; unset fields inherit the storefront's). `--contact-email` stays storefront-wide. + +`sell info` shows what buyers see (only operationally-ready offers); operator health and conditions (including draining/not-ready offers) live under `obol sell status`. Run `sell info` with the user after any change — it's the fastest "would I buy from this storefront?" check. For a visual check, open the tunnel URL in a browser, and curl a paid route with `Accept: text/html` to see the branded 402 checkout page. ### Surviving restarts — `obol sell resume`