Skip to content

v0.13.0 - Your storefront, your brand

Latest

Choose a tag to compare

@github-actions github-actions released this 14 Jul 11:55

Obol banner

v0.13.0 - Your storefront, your brand

One stack, many storefronts. Every seller page — landing page, catalog, checkout — now carries your identity, on your domain.

v0.13.0 turns the Obol Stack storefront from a single dev-tool page into a real, sellable web presence. You can now brand the whole buyer journey (name, logo, theme, colours, rich descriptions, even custom CSS), and you can run multiple storefronts from one stack — each paid service can live on its own domain with its own branding, while the main storefront keeps selling everything else.

Under the hood of that journey, selling got more expressive too: offers can now mix paid, free, and wallet-authenticated routes, deliver long-running work as async jobs buyers can poll for free, and get listed on the x402scan discovery index with one command.

Get started with obol sell info set — or better, hand the keys to your agent (prompts below).

Default storefront Branded seller
Default light storefront Branded storefront

Buyers hitting a paid route in a browser get a checkout-style 402 page in the same identity:

Default 402 checkout Branded 402 checkout
Default 402 page Branded 402 page

Note

Paid flows default to USDC on Base. For risk-free testing use --chain base-sepolia and fund your agent wallet from a Base Sepolia USDC faucet. Custom domains require a permanent Cloudflare tunnel (obol tunnel setup) — quick tunnels won't work for x402scan registration or dedicated hostnames.

Warning

This software is early alpha, you could lose what you put in. Please use caution when it comes to non-testnet assets.

Install / Upgrade

# Install this release
OBOL_RELEASE=v0.13.0 bash <(curl -s https://stack.obol.org)

# Run the stack
obol stack init && obol stack up

# Brand your storefront (interactive on a TTY)
obol sell info set

# See it the way buyers do
obol sell info

Release Highlights

Customisable storefronts - make every buyer page yours

Everything a buyer sees — the storefront landing page, the service catalog, the 402 checkout page, wallet sign-in pages, job status pages, even error pages — now renders in your identity. Set it once and it applies everywhere:

obol sell info set \
  --display-name "Acme Labs" \
  --tagline "Paid APIs for autonomous agents." \
  --logo-file ./logo.png \
  --theme obol --accent '#2fe4ab' \
  --description "$(cat about.md)"

Three theme presets ship built in — light (the new default), dark, and obol — plus an accent colour override. Descriptions accept a safe markdown subset (headings, lists, links, code) and render on the storefront and per-service pages. Favicons and OG images are supported too (--favicon-file, --og-image-file), so links to your storefront unfurl properly in chats and social posts — and if you don't upload an OG image, the storefront generates a card from your name, tagline, and accent colour automatically.

Want full control short of bringing your own frontend? --css-file custom.css injects a stylesheet targeting stable data-obol attributes on every page. Run obol sell info set with no flags on a terminal for a guided interactive walkthrough, or obol sell info reset to go back to defaults.

Multi-hostname storefronts - each service on its own domain

One stack can now serve multiple storefronts. Give an offer its own public hostname and it gets a dedicated origin: routes rooted at / on that domain, its own landing page, its own /openapi.json and x402 discovery metadata — and its own branding, layered field-by-field over your storefront defaults:

# Create the offer bound to a dedicated domain
obol sell http audit \
  --upstream auditd --port 8080 --namespace sec \
  --pay-to 0x... --chain base --price 0.10 \
  --hostname audit.acme.io

# Brand that origin independently of the main storefront
obol sell info set --hostname audit.acme.io \
  --display-name "AuditCo" --theme dark --accent '#ff5c5c'

# Or bind a hostname to an existing offer later
obol tunnel hostname add audit.acme.io --offer sec/audit

Buyers on audit.acme.io see AuditCo end to end; buyers on your main tunnel hostname still see the full Acme Labs catalog. One offer per origin, enforced automatically. Point the hostname at your tunnel in the Cloudflare dashboard and you're live.

Route tables & wallet sign-in - mix paid, free, and members-only

A single offer can now serve more than one price and more than one audience. Declare a route table and each path gets its own gate — paid (x402 payment), free (open to everyone), or auth (sign-in with an Ethereum wallet, no gas required):

obol sell http audit \
  --upstream auditd --port 8080 --namespace sec \
  --pay-to 0x... --chain base --price 0.10 \
  --route "path=/submit,methods=POST,price=0.50,summary=Submit source for audit" \
  --route "path=/jobs/*,gate=free" \
  --route "path=/reports/*,gate=auth" \
  --route "path=/*,gate=paid"

Per-route pricing, free health checks and status pages, and wallet-bound member areas — all advertised automatically in your /openapi.json, skill.md, and storefront catalog so buying agents can discover the shape of your API. The auth gate uses the SIWX standard (EIP-4361): browsers get a connect-wallet sign-in page in your branding; agents sign the challenge headlessly with their stack wallet. Full guide: docs/guides/route-gating-and-auth.md.

Async jobs - sell work that takes longer than a request

Some services can't answer in one HTTP round trip — audits, renders, big model runs. Add --async to any HTTP offer and paid calls return immediately with 202 Accepted, a job ID, and a status URL. The stack's job broker replays the request to your upstream with no deadline and holds the result:

  • The status page is free — buyers (human or agent) can poll /jobs/<id> without paying again, in a browser or as JSON.
  • The result is protected — only the paying wallet (via wallet sign-in) or the holder of the job token can fetch it; --result-visibility public makes the job ID itself the capability instead.
  • Results expire after --job-ttl (default 72h).

Payment settles at acceptance, so your service gets paid even if the buyer never comes back for the result.

Get discovered - one-command x402scan registration

Your storefront can now register itself on x402scan.com, the public index of x402-payable services:

obol sell register x402scan

The CLI signs the registration challenge with your agent's wallet (keys never leave the remote signer), and x402scan crawls your published /openapi.json and live-probes each endpoint for a real 402 before listing you. Requires a permanent tunnel hostname. Idempotent — run it again after adding offers.

Payment safety - no charge without a response

The x402 payment path got a correctness guarantee: a buyer that disconnects before the response is delivered is never charged. The verifier now skips settlement when the client has gone away, so timeouts and cancelled requests can no longer turn into paid-but-undelivered calls. Validated end-to-end on Base mainnet with a real buyer stack and a USDC ledger trace accounting for every cent.

Sellers also get backpressure control: spec.maxConcurrentRuns on the Agent resource caps simultaneous agent runs (0 = unlimited), rendered straight into the Hermes gateway config — no more hand-edited ConfigMaps to survive load spikes.

Release validation you can verify on-chain

This release shipped only after the first fully green 18-flow release smoke in the project's history — including the two live flows that exercise real ERC-8004 registration and OBOL/USDC settlement on Base Sepolia. The receipts (registration tx, Permit2 settlement, USDC transfer) are in #749. Two chronic failure classes died on the way: LiteLLM's intermittent 404s from auto-discovered endpoints (a missing /v1 poisoning the model group), and Hermes agents failing against <64K-context models they couldn't measure through LiteLLM (deployment config now states context_length/max_tokens explicitly).


Have your agent do it

These features were built to be driven by agents, not just humans. Paste any of these into your stack's Hermes agent (http://obol.stack:8080), or into Claude Code pointed at your stack:

Set up my storefront identity: display name "Acme Labs", tagline "Paid APIs for autonomous agents", use the obol theme with accent #2fe4ab. Then write a friendly two-paragraph markdown description of the services I currently have on sale and set it as the storefront description. Show me the result with obol sell info.

I have a service called auditd on port 8080 in the sec namespace. Sell it at $0.50 per audit submission on Base with a free status page and wallet-gated results, delivered as async jobs with a 7-day TTL. Then check the offer is Ready and give me the public URL a buyer would use.

Bind my offer sec/audit to the hostname audit.acme.io, brand that origin as "AuditCo" with the dark theme, and tell me exactly what to configure in the Cloudflare dashboard to make it live.

Register my storefront on x402scan and confirm the listing includes all my current offers.

Browse the storefront at https://inference.example.org like a buyer: fetch /api/services.json, summarise what's for sale and at what prices, and tell me which service is the best value for summarising long PDFs.


Smaller wins

  • obol sell info - a buyer's-eye view of your own storefront from the CLI: branding plus every on-sale service, exactly as published.
  • Zero-downtime payment path - the x402 buyer now runs as its own service, so config changes and top-ups no longer interrupt in-flight paid inference.
  • Apps restart on obol stack up - installed apps come back automatically after a host reboot, alongside sell offers, agents, and RPC config.
  • New agent skills - contract/token inspection and cross-chain bridging skills, plus Arbitrum chain support out of the box.
  • Sturdier installs - stack images are pinned by digest on first bind, so a release keeps installing the exact images it shipped with.
  • Hermes runtime refresh - bundled Hermes agent updated to v2026.7.x, with the dashboard now protected by basic auth and file-tool writes correctly scoped to agent data.
  • No repin train - releases resolve stack images by the commit's short SHA and bind digests at apply time; the release gate verifies every image exists on GHCR before a tag builds.
  • Leaner codebase - ~630 lines of two-vendor-verified dead code removed across x402, erc8004, model discovery, and flow tooling.
  • Logo preflight - obol sell info set validates logo/asset URLs up front instead of publishing a broken image.

Breaking changes / Migration notes

  • Pre-release tester warning: If you ran an unreleased v0.13.0 release candidate or feature branch before this release, obol stack up may fail with Helm invalid ownership metadata errors for resources that moved between charts. This is not a supported production migration path. Back up anything you need (obol stack export), then recreate:

    obol stack down
    obol stack purge --force
    obol stack init
    obol stack up
  • Storefront default theme is now light. If you preferred the previous dark look: obol sell info set --theme dark.

What's Changed

  • integration/v0.13.0-rc4: x402 settle-guard, /v1 discovery fix, hermes context config, flow de-flakes, dead-code sweep by @bussyjd in #749

What's Changed

  • test(smoke): harden rc dual-stack catalog checks by @bussyjd in #715
  • fix(defaults): rewrite :latest image pins to the dev tag (job-broker ImagePullBackOff) by @bussyjd in #719
  • test(smoke): live coverage for multi-route gate classes, per-offer hostname (P1b), x402scan preflight by @bussyjd in #720
  • test(smoke): live SIWx identity-gated route coverage (flow-19) by @bussyjd in #721
  • test(smoke): live async job-broker coverage (flow-20) by @bussyjd in #722
  • release: merge v0.13.0-rc1 into main by @bussyjd in #723
  • feat(x402): register to x402scan via cli by @OisinKyne in #697
  • feat: v0.13.0-rc0 by @OisinKyne in #716
  • chore: pin obol-frontend to v0.1.28-rc3 by @maeliosakyne in #724
  • chore(deps): integration/v0.13.0-rc4 — collected Renovate bumps by @bussyjd in #740
  • chore(deps): update dependency @scalar/api-reference to v1.62.5 by @github-actions[bot] in #735
  • chore(deps): update ethereum el/cl client updates by @github-actions[bot] in #736
  • chore(deps): update nousresearch/hermes-agent docker tag to v2026.7.7.2 by @github-actions[bot] in #737
  • chore(deps): update obolup.sh dependency updates by @github-actions[bot] in #738
  • chore(deps): update cloudflare/cloudflared docker tag to v2026.7.1 by @github-actions[bot] in #739
  • chore(release): v0.13.0-rc4 candidate — 8 reviewed PRs (#726#734) by @bussyjd in #741
  • integration/v0.13.0-rc4: x402 settle-guard, /v1 discovery fix, hermes context config, flow de-flakes, dead-code sweep by @bussyjd in #749

New Contributors

Full Changelog: v0.12.0...v0.13.0