Releases: ObolNetwork/obol-stack
Release list
v0.14.0-rc1 - Talk to the agent you're selling
v0.14.0-rc1 - Talk to the agent you're selling
The chat widget is back. Buyers open your agent's page, sign once, and start talking — every turn paid on-chain, no wallet popup per message.
v0.14.0-rc1 re-lands the built-in browser chat widget that was carved out of rc0, and pairs it with the payment plumbing it needs: an opt-in auth-capture unlock gate that settles a client-signed fee split on-chain, and fee-revenue metrics for operators who want to see what a session actually earned. Every type=agent offer now ships a themed, zero-dependency chat page on its own origin at /chat.
The rest of the cycle is fixes: the payment path now surfaces the on-chain settle tx hash when a settle errors (so you never pay twice by accident), agent offers stop leaking their internal backing model to buyers, and a handful of CLI and tunnel edges got smoothed.
Install with OBOL_RELEASE=v0.14.0-rc1 (command below) and put it through its paces before the tagged release.
Note
rc0's release note said the widget would return on top of x402 batch-settlement. What actually ships here is the session-key design: one Sign-In-With-Ethereum signature derives a local session key, you fund it once, and each turn is paid with a silently-signed EIP-3009 transferWithAuthorization (gasless for the payer). Same UX goal — no per-turn popup — reached without the deposit-once escrow, which remains in progress.
Important
The auth-capture unlock gate is opt-in and disabled by default. Obol takes no fee unless you explicitly configure authCaptureUnlock in your verifier pricing config with your own feeRecipient and fee bps. Enabling it also requires a facilitator that supports the v2-eip155-auth-capture scheme (hosted facilitator: beta-2.0.2, see obol-infrastructure#2997).
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.14.0-rc1 bash <(curl -s https://stack.obol.org)
# Run the stack
obol stack init && obol stack up
# Declare an agent, then make it sellable — the chat page comes with it
obol agent new quant --skills buy-x402 --model <model> --create-wallet
obol sell agent quant --price 0.01 --token USDC --network base-sepoliaRelease Highlights
The agent chat widget - a buyer-ready chat page on every agent offer
Every offer of type=agent now serves a self-contained chat client at /chat on its dedicated origin, and embeds it on the offer's landing page. It renders in the same identity as the rest of that origin — the offer's display name and the same resolved storefront theme tokens as its landing page — so default and branded storefronts flow through identically.
The payment flow is what makes it usable:
- The visitor connects an injected wallet and signs one fixed Sign-In-With-Ethereum message.
- The
keccak256of that signature becomes a deterministic local session key, which never leaves the page and is never persisted — re-signing the same message re-derives it. - They fund that session address once with a small USDC transfer.
- Every subsequent turn is paid silently over x402: an EIP-3009
transferWithAuthorizationsigned by the session key, gasless for the payer, with no wallet prompt per message.
Pricing is discovered at runtime from the origin's own 402 challenge — price, model, network and asset all come from the challenge on POST /v1/chat/completions, so the page never carries stale hardcoded pricing. A per-turn spend cap pins payment to the price shown when the page loaded; if the price moves up mid-session, the turn is refused rather than silently overpaid.
The widget's only dependency (viem + x402) is bundled into the controller binary and served from the same origin, so the page loads with zero external requests and works on air-gapped stacks.
Note
/chat holds a hot session key that signs USDC transfers, so it is served with Content-Security-Policy: frame-ancestors 'self' — the offer's own landing page can embed it, but it cannot be framed cross-origin. The /chat and /chat-vendor.js routes and the landing-page embed exist only for type=agent offers; every other offer type is untouched.
Auth-capture unlock gate + fee revenue metrics (opt-in)
A new optional gate lets an operator sell a session unlock whose payment carries a client-signed fee split, captured on-chain by AuthCaptureEscrow rather than divided off-chain after the fact. The buyer signs the feeBps → feeRecipient terms as part of the authorization, so the split is bounded by what they agreed to and enforced by the escrow contract at capture time.
Operators get fee_revenue_atomic and settled-volume Prometheus metrics alongside the existing verifier metrics.
This is configured per-stack under authCaptureUnlock in the verifier pricing config (fixed rate — minFeeBps == maxFeeBps), and is off unless you turn it on.
Agent offers stop leaking their internal model
Agent offers run their own pinned model and ignore the request's model field, so surfacing that id to buyers was both meaningless and a staleness trap — it went wrong the moment an operator swapped the backing model. It is now omitted everywhere buyer-facing: /api/services.json, the /skill.md worked examples, the 402 challenge copy and extra block, pay-agent, and the bazaar example. Inference offers, where the buyer genuinely selects a model, are unchanged.
Don't pay twice - settle failures now surface the on-chain tx
When the facilitator returns an error from /settle but the transaction already landed on-chain, the unlock path now surfaces that tx hash in X-PAYMENT-RESPONSE (matching the regular paid path) and returns a hint telling you to verify against the chain before retrying. Previously the hash was dropped, and a retry could pay a second time.
Breaking changes / Migration notes
- No breaking changes. This is an RC over v0.14.0-rc0; upgrade in place with
obol stack up. - The chat widget requires no configuration — it appears automatically on
type=agentoffers once the controller is upgraded. A dedicated public hostname (--hostname, permanent Cloudflare tunnel) gives it its own origin. - The auth-capture unlock gate is opt-in and needs a
v2-eip155-auth-capture-capable facilitator; existing offers are unaffected if you don't enable it.
What's Changed
- fix(ui): honor OBOL_NONINTERACTIVE on a real TTY by @bussyjd in #789
- fix(agentcrd): strip server-managed metadata before ResumeAll re-apply by @bussyjd in #790
- fix(serviceoffercontroller): align well-known/x402 resource path with openapi for inference/agent by @bussyjd in #791
- fix(stack): don't treat own cluster's ports as conflicts under --force by @bussyjd in #792
- fix(tunnel): make hostname add idempotent for already-bound hosts by @bussyjd in #793
The headline work in this RC landed through the integration branch (#800) rather than as individual merges to main, so it does not appear in the auto-generated list above:
- feat(storefront): built-in browser chat widget for agent-type offers (#752), hardening (#785), re-land after the rc0 carve-out (#801)
- feat(x402): auth-capture unlock gate + fee revenue metrics (#798)
- feat(agents): complete agent model-strip (#673)
- fix(network): stop reth liveness probe from killing consistency recovery (#750)
- fix(x402): default 402 challenge resource.url to https on public hosts (#751)
Full Changelog: v0.14.0-rc0...v0.14.0-rc1
v0.14.0-rc0 - Hardening pass
v0.14.0-rc0 - Hardening pass
Fewer sharp edges. A release cycle spent making the paths you already use fail closed, stay honest, and survive restarts.
v0.14.0-rc0 is a stability and security-hardening release candidate. Rather than a single headline feature, this cycle tightened the surfaces that matter when a stack is actually selling: input validation and fail-closed behavior on the x402 payment path, SSRF and injection defenses in service discovery, and safer defaults for the CLI's destructive operations. It also makes eRPC configuration durable — operator overlays now survive obol stack up instead of being reconciled away.
Install with OBOL_RELEASE=v0.14.0-rc0 (command below) and put it through its paces before the tagged release.
Note
The built-in browser chat widget that landed in the integration branch during this cycle was carved back out of rc0. It and its browser session wallet are being reworked on top of x402 batch-settlement (deposit-once, silent session-key vouchers) and will return in a later RC — so it is intentionally absent here even though the generated PR list below references its merges.
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.14.0-rc0 bash <(curl -s https://stack.obol.org)
# Run the stack
obol stack init && obol stack up
# Durable eRPC config (new)
obol network erpc statusRelease Highlights
Durable eRPC configuration - obol network erpc set|status|reset
eRPC overlay entries are now first-class, durable config. Set an upstream, inspect the effective overlay, or reset to defaults — and the changes survive obol stack up instead of being reconciled back to the shipped baseline. Entries are validated and preserved on every set/reset, so a hand-tuned RPC endpoint stays put across upgrades.
obol network erpc set # add / update an eRPC upstream overlay entry
obol network erpc status # show the effective overlay
obol network erpc reset # return to the shipped baselinePayment path fails closed
The x402 verifier no longer serves anything for free by accident. Zero-priced and sub-atomic routes fail closed, price inputs are validated up front, and malformed on-chain amounts are rejected rather than silently coerced. Free routes keep their upstream Origin (preserving CSRF defenses), while gated routes strip browser fetch-context headers so paid browser requests aren't rejected after payment already verified.
Discovery & registration hardening
Upstream-OpenAPI discovery gained a size cap, response cache, and SSRF guard, and now assembles the full upstream schema with per-origin agent-registration. ERC-8004 agentId is scoped to the offer's own chain, registration is nonce-pinned with origin validation, and route publication is gated on real Traefik acceptance (observedGeneration) so status never runs ahead of reality.
Safer CLI & supply-chain defaults
obol stack init --forcenow requires explicit confirmation before destroying a backend switch with live services.obolupfails closed on a release-checksum mismatch instead of running an unverified binary.- Agent
--idis validated as a DNS label, closing an/etc/hostsinjection vector. - Untrusted import fields and Ollama model names are YAML-escaped before being written into overlays.
Breaking changes / Migration notes
- No breaking changes. This is a hardening RC over v0.13.0; upgrade in place with
obol stack up.
What's Changed
- fix(serviceoffer): namespace-disambiguate ReferenceGrant names by @bussyjd in #757
- fix(serviceoffer): require 2xx for UpstreamHealthy probes by @bussyjd in #758
- fix(serviceoffer): split inFlightReq and rateLimit middlewares by @bussyjd in #759
- fix(x402): public path + https in 402 resource.URL by @bussyjd in #760
- fix(sell): enable offers after CLI ERC-8004 register by @bussyjd in #761
- fix(sell): registration-hygiene trio — origin validation, nonce pinning, scoped enable by @bussyjd in #765
- fix(tunnel): tear down storefront route when every hostname is offer-bound by @bussyjd in #766
- fix(serviceoffer): gate RoutePublished on Traefik acceptance, sweep legacy ReferenceGrant by @bussyjd in #767
- fix(sell): stop defaulting agent offer description to the internal objective by @bussyjd in #768
- fix(x402scan): detect testnet-only origins and surface per-endpoint 422 detail by @bussyjd in #769
- docs(testing): proactive bug-finding harness + 2026-07-16 audit (11 confirmed) by @bussyjd in #770
- fix(x402): validate price input and fail closed on malformed on-chain amounts by @bussyjd in #771
- fix(stack): gate init --force backend-switch destroy on live-services confirmation by @bussyjd in #773
- fix(agent): validate --id as a DNS label to stop /etc/hosts injection by @bussyjd in #774
- fix(openclaw): escape untrusted import fields before writing overlay YAML by @bussyjd in #775
- fix(obolup): fail closed on release-checksum verification failure by @bussyjd in #776
- fix(serviceoffer): scope ERC-8004 agentId to the offer's own chain by @bussyjd in #764
- chore: remove internal audit tooling/docs from production repo by @bussyjd in #778
- fix(discovery): harden upstream-OpenAPI discovery (size cap, cache, SSRF, pricing, ERC-8004) by @bussyjd in #779
- fix(sell): default ollama health-path to / and harden registration edges by @bussyjd in #780
- fix(serviceoffer): gate httpRouteAccepted on observedGeneration, fail closed by @bussyjd in #781
- fix(network): validate + preserve eRPC overlay entries on set/reset by @bussyjd in #782
- fix(openclaw): yaml-escape Ollama model names in overlay generation by @bussyjd in #783
- fix(x402): fail closed on zero/sub-atomic priced routes, preserve Origin on free routes by @bussyjd in #784
- chore: fix assorted PR #756 review nits by @bussyjd in #786
- feat(network): durable eRPC config via erpc set|status|reset by @bussyjd in #772
- fix(discovery): full upstream OpenAPI + per-origin agent-registration by @bussyjd in #777
The chat-widget merges (#752, #785) that appear in the auto-generated diff were reverted out of rc0 (see the note above); their net change is not in this release.
Full Changelog: v0.13.0...v0.14.0-rc0
v0.13.0 - Your storefront, your brand
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 |
|---|---|
![]() |
![]() |
Buyers hitting a paid route in a browser get a checkout-style 402 page in the same identity:
| Default 402 checkout | Branded 402 checkout |
|---|---|
![]() |
![]() |
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 infoRelease 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/auditBuyers 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 publicmakes 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 x402scanThe 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
auditdon port 8080 in thesecnamespace. 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/auditto 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....
v0.13.0-rc4 Custom Storefronts
v0.13.0-rc4 - 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-rc4 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 |
|---|---|
![]() |
![]() |
Buyers hitting a paid route in a browser get a checkout-style 402 page in the same identity:
| Default 402 checkout | Branded 402 checkout |
|---|---|
![]() |
![]() |
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-rc4 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 infoRelease 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/auditBuyers 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 publicmakes 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 x402scanThe 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.
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
auditdon port 8080 in thesecnamespace. 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/auditto 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.
- Logo preflight -
obol sell info setvalidates logo/asset URLs up front instead of publishing a broken image.
Breaking changes / Migration notes
- **Pre-...
v0.13.0-rc3 Multi-storefront
v0.13.0-rc3 - Multiple Storefronts
Production installs pull
repo:<git-commit>@sha256:…— digests are bound at apply time, never committed.
This release candidate closes the job-broker ImagePullBackOff GA follow-up from rc2 and replaces the digests-in-git / repin-PR release train with a single image policy.
Warning
This software is early alpha, you could lose what you put in. Please use caution when it comes to non-testnet assets. This is a pre-release candidate.
Install / Upgrade
# Install this release candidate
OBOL_RELEASE=v0.13.0-rc3 bash <(curl -s https://stack.obol.org)
# Run the stack
obol stack init && obol stack upRelease Highlights
Stack-owned images resolve from the CLI commit (no repin PR)
Embedded templates no longer store mutable digests. They use a placeholder rewritten at apply time:
| Mode | Image ref |
|---|---|
| Production | repo:<GitCommit>@sha256:<index-digest> (digest from GHCR when reachable) |
OBOL_DEVELOPMENT=true |
repo:dev-<sha> (local k3d import) |
- Short-SHA tags are published by
docker-publish-x402on every relevantmainpush (and onv*tags). - The released CLI embeds the same short SHA via ldflags (
version.GitCommit). - Release gate: GHCR must already have images for that short SHA (
verify-release-images.sh).
Docs: docs/release-images.md.
job-broker is published
job-broker is now part of the x402 publish matrix (and the release image gate), so non-dev installs can pull a real registry image for async offers — fixing the rc2 known issue.
Breaking changes / Migration notes
- No intentional breaking API changes.
- Operators who hand-edited embedded digests should stop; upgrade the CLI and re-run
obol stack upso apply-time rewrite stamps the correct short-SHA (+ digest).
Known issues / GA follow-ups
eth-mainneteRPC has no public fallback (carried from rc2).
Validation
Unit / package tests for the image-resolve path (local):
go test ./internal/images/ ./internal/defaults/ ./internal/embed/ ./internal/x402/ ./internal/stack/ ./cmd/obol/ -count=1
# Live GHCR digest bind for x402-verifier:656e5f6 — PASS
Full release-smoke was last green on rc2; this RC is a release-pipeline / image-publish fix on top of that surface.
v0.13.0-rc2 - Multi-storefront and returning customers
v0.13.0-rc2 - Route-surface gates & async jobs
One offer, many routes — sell a free health check, a paid inference route, and an identity-gated endpoint from a single ServiceOffer, and take long-running paid jobs that settle up front and deliver later.
This release candidate rolls up the route-surface gating, async job-broker, x402 security/spec-fidelity hardening, and x402scan discovery work staged in integration/v0.13.0-rc1, on top of the v0.13.0-rc0 agent-runtime line.
Get started by declaring a route table with obol sell http --route and listing it with obol sell register x402scan.
Warning
This software is early alpha, you could lose what you put in. Please use caution when it comes to non-testnet assets. This is a pre-release candidate: do not promote to v0.13.0 until the GA follow-up below (publish the job-broker image) is addressed.
Install / Upgrade
# Install this release candidate
OBOL_RELEASE=v0.13.0-rc2 bash <(curl -s https://stack.obol.org)
# Run the stack
obol stack init && obol stack up
# Sell one offer with mixed gate classes
obol sell http my-api --upstream my-svc --port 8080 \
--route "path=/health,gate=free" \
--route "path=/v1/chat/completions,gate=paid" \
--route "path=/private,gate=auth"Release Highlights
Multi-route gate classes — one offer, mixed free / paid / identity routes
A ServiceOffer can now declare an explicit route table (spec.routes[]) instead of a single paid catch-all. Each route carries a gate class the x402-verifier enforces per-request, and the published OpenAPI advertises exactly the gate the verifier charges (no discovery/enforcement drift):
gate=free— proxied without payment,gate=paid— answered with a402challenge until settled,gate=auth— identity-gated by Sign-In-With-X.
obol sell http my-api --upstream my-svc --port 8080 \
--route "path=/health,gate=free" \
--route "path=/v1/chat/completions,gate=paid" \
--route "path=/private,gate=auth"Undeclared sibling paths fail closed. This is the canonical way to monetize a mixed API surface — a free probe, a paid hot path, and a members-only route — from one offer.
Async job offers — pay up front, deliver later
For work that takes minutes rather than one request/response, --async splits purchase from delivery. The verifier settles payment at accept time and hands the request to a job-broker (behind a NetworkPolicy and, when configured, an HMAC on the verifier→broker hop); the broker replays the call with no deadline and serves the result later, retrieved with the same wallet that paid (SIWx-gated, no second payment).
obol sell http my-audit --async --job-ttl 15m --upstream my-svc --port 8080
# submit → 402 → pay → 202 { jobId, statusUrl, resultUrl, jobToken }
# → poll statusUrl → GET resultUrl (Authorization: Bearer <jobToken>)x402 security & spec-fidelity hardening
The paid gateway and route surface were hardened against the review findings on the source PRs:
- Broker trust boundary —
NetworkPolicypinningjob-brokeringress to the verifier pod, plus an optional HMAC over the contract headers (upstreamURL/offer/upstreamAuth) so a pod that slips past the network layer still cannot forge an arbitrary-URL, attacker-credentialed job. - Login-CSRF guard on
/auth/verify(application/jsonrequired, cross-siteSec-Fetch-Siterejected,SameSite=Strictsession cookie). - Open-redirect fix —
sanitizeNextPathrejects backslash-escaped off-origin targets. - OpenAPI/verifier gate-drift fix — discovery can no longer advertise a route free that the gate charges.
- Fail-closed exact-only tables and reserved-path validation at admission.
sign-in-with-xinterop — the standardSIGN-IN-WITH-Xheader is accepted, and the401challenge advertises the extension (fresh nonce, supported EVM chains) so a stock x402 client can construct the credential.
x402scan discovery
obol sell register x402scan submits the storefront's public origin to the x402scan.com index, signing the registry's Sign-In-With-X challenge via the agent's remote-signer (no key material in the CLI). A local preflight warns when the origin is unreachable, advertises no operations, or collapses many offers into one shared /openapi.json (which reads as a single blurry product to crawlers — one origin per offer is the clean shape).
obol sell register x402scanSmaller wins
- job-broker dev image -
OBOL_DEVELOPMENTnow rewrites:latestimage pins to the local dev tag, so the freshly-builtjob-brokerruns instead ofImagePullBackOff-ing against an unpublished registry ref. - Live smoke coverage - three previously-unit-only features now have end-to-end flows: identity-gated SIWx routes, async job offers, and multi-route gate classes + per-offer hostname binding.
Breaking changes / Migration notes
- No breaking changes. New
spec.routes[]is additive — offers with no route table keep the implicit paid catch-all.
Validation — release smoke
Full flows/release-smoke.sh run from the integration tip (bfaa4c0) on a wiped k3d cluster, with inference served remotely (external OBOL_LLM_ENDPOINT, gemma4). All 16 flows PASS — release smoke passed.
| Flow | Result |
|---|---|
| flow-01-prerequisites | PASS |
| flow-02-stack-init-up | PASS |
| flow-03-inference | PASS |
| flow-04-agent | PASS |
| flow-05-network | PASS |
| flow-06-sell-setup | PASS |
| flow-07-sell-verify | PASS |
| flow-08-buy | PASS |
| flow-09-lifecycle | PASS |
| flow-10-anvil-facilitator | PASS |
| flow-16-sell-agent | PASS |
| flow-17-sell-mcp | PASS |
| flow-19-sell-auth (new — SIWx identity gate) | PASS |
| flow-20-async-job (new — async job-broker) | PASS |
| flow-21-route-surface (new — gate classes + hostname/P1b) | PASS |
| flow-11-dual-stack | PASS |
The RC-gated live-chain flows (flow-13/flow-14, RELEASE_SMOKE_INCLUDE_OBOL*) were not run in this pass — they require a funded Base Sepolia wallet + paid RPC, which the validation host did not carry.
Known issues / GA follow-ups
- Publish the
job-brokerimage. It is absent from.github/workflows/docker-publish-x402.yml, so a production (non-OBOL_DEVELOPMENT) install wouldImagePullBackOffonghcr.io/obolnetwork/job-broker:latest. Add it to the publish matrix before promoting tov0.13.0. eth-mainneteRPC has no public fallback. The single obol-gcp mainnet upstream intermittently trips its own circuit breaker; consider apublicnodefallback likebase-sepoliaalready has.
What's Changed
What's Changed
- release: merge v0.13.0-rc1 into main by @bussyjd in #723
- chore: pin obol-frontend to v0.1.28-rc3 by @maeliosakyne in #724
New Contributors
- @maeliosakyne made their first contribution in #724
Full Changelog: v0.13.0-rc1...v0.13.0-rc2
v0.13.0-rc1 - Route-surface gates & async jobs
v0.13.0-rc1 - Route-surface gates & async jobs
One offer, many routes — sell a free health check, a paid inference route, and an identity-gated endpoint from a single ServiceOffer, and take long-running paid jobs that settle up front and deliver later.
This release candidate rolls up the route-surface gating, async job-broker, x402 security/spec-fidelity hardening, and x402scan discovery work staged in integration/v0.13.0-rc1, on top of the v0.13.0-rc0 agent-runtime line. Unlike rc0, the full release smoke is green — 16/16 flows — validated from the integration tip on real hardware with remote inference.
Get started by declaring a route table with obol sell http --route and listing it with obol sell register x402scan.
Note
Paid routes settle over x402 on base-sepolia (→ base for production). Identity-gated routes use Sign-In-With-X (EIP-4361/CAIP-122) and never touch the facilitator — a wallet just proves control of an address.
Warning
This software is early alpha, you could lose what you put in. Please use caution when it comes to non-testnet assets. This is a pre-release candidate: do not promote to v0.13.0 until the GA follow-up below (publish the job-broker image) is addressed.
Install / Upgrade
# Install this release candidate
OBOL_RELEASE=v0.13.0-rc1 bash <(curl -s https://stack.obol.org)
# Run the stack
obol stack init && obol stack up
# Sell one offer with mixed gate classes
obol sell http my-api --upstream my-svc --port 8080 \
--route "path=/health,gate=free" \
--route "path=/v1/chat/completions,gate=paid" \
--route "path=/private,gate=auth"Release Highlights
Multi-route gate classes — one offer, mixed free / paid / identity routes
A ServiceOffer can now declare an explicit route table (spec.routes[]) instead of a single paid catch-all. Each route carries a gate class the x402-verifier enforces per-request, and the published OpenAPI advertises exactly the gate the verifier charges (no discovery/enforcement drift):
gate=free— proxied without payment,gate=paid— answered with a402challenge until settled,gate=auth— identity-gated by Sign-In-With-X.
obol sell http my-api --upstream my-svc --port 8080 \
--route "path=/health,gate=free" \
--route "path=/v1/chat/completions,gate=paid" \
--route "path=/private,gate=auth"Undeclared sibling paths fail closed. This is the canonical way to monetize a mixed API surface — a free probe, a paid hot path, and a members-only route — from one offer.
Async job offers — pay up front, deliver later
For work that takes minutes rather than one request/response, --async splits purchase from delivery. The verifier settles payment at accept time and hands the request to a job-broker (behind a NetworkPolicy and, when configured, an HMAC on the verifier→broker hop); the broker replays the call with no deadline and serves the result later, retrieved with the same wallet that paid (SIWx-gated, no second payment).
obol sell http my-audit --async --job-ttl 15m --upstream my-svc --port 8080
# submit → 402 → pay → 202 { jobId, statusUrl, resultUrl, jobToken }
# → poll statusUrl → GET resultUrl (Authorization: Bearer <jobToken>)x402 security & spec-fidelity hardening
The paid gateway and route surface were hardened against the review findings on the source PRs:
- Broker trust boundary —
NetworkPolicypinningjob-brokeringress to the verifier pod, plus an optional HMAC over the contract headers (upstreamURL/offer/upstreamAuth) so a pod that slips past the network layer still cannot forge an arbitrary-URL, attacker-credentialed job. - Login-CSRF guard on
/auth/verify(application/jsonrequired, cross-siteSec-Fetch-Siterejected,SameSite=Strictsession cookie). - Open-redirect fix —
sanitizeNextPathrejects backslash-escaped off-origin targets. - OpenAPI/verifier gate-drift fix — discovery can no longer advertise a route free that the gate charges.
- Fail-closed exact-only tables and reserved-path validation at admission.
sign-in-with-xinterop — the standardSIGN-IN-WITH-Xheader is accepted, and the401challenge advertises the extension (fresh nonce, supported EVM chains) so a stock x402 client can construct the credential.
x402scan discovery
obol sell register x402scan submits the storefront's public origin to the x402scan.com index, signing the registry's Sign-In-With-X challenge via the agent's remote-signer (no key material in the CLI). A local preflight warns when the origin is unreachable, advertises no operations, or collapses many offers into one shared /openapi.json (which reads as a single blurry product to crawlers — one origin per offer is the clean shape).
obol sell register x402scanSmaller wins
- job-broker dev image -
OBOL_DEVELOPMENTnow rewrites:latestimage pins to the local dev tag, so the freshly-builtjob-brokerruns instead ofImagePullBackOff-ing against an unpublished registry ref. - Live smoke coverage - three previously-unit-only features now have end-to-end flows: identity-gated SIWx routes, async job offers, and multi-route gate classes + per-offer hostname binding.
Breaking changes / Migration notes
- No breaking changes. New
spec.routes[]is additive — offers with no route table keep the implicit paid catch-all.
Validation — release smoke
Full flows/release-smoke.sh run from the integration tip (bfaa4c0) on a wiped k3d cluster, with inference served remotely (external OBOL_LLM_ENDPOINT, gemma4). All 16 flows PASS — release smoke passed.
| Flow | Result |
|---|---|
| flow-01-prerequisites | PASS |
| flow-02-stack-init-up | PASS |
| flow-03-inference | PASS |
| flow-04-agent | PASS |
| flow-05-network | PASS |
| flow-06-sell-setup | PASS |
| flow-07-sell-verify | PASS |
| flow-08-buy | PASS |
| flow-09-lifecycle | PASS |
| flow-10-anvil-facilitator | PASS |
| flow-16-sell-agent | PASS |
| flow-17-sell-mcp | PASS |
| flow-19-sell-auth (new — SIWx identity gate) | PASS |
| flow-20-async-job (new — async job-broker) | PASS |
| flow-21-route-surface (new — gate classes + hostname/P1b) | PASS |
| flow-11-dual-stack | PASS |
The RC-gated live-chain flows (flow-13/flow-14, RELEASE_SMOKE_INCLUDE_OBOL*) were not run in this pass — they require a funded Base Sepolia wallet + paid RPC, which the validation host did not carry.
Known issues / GA follow-ups
- Publish the
job-brokerimage. It is absent from.github/workflows/docker-publish-x402.yml, so a production (non-OBOL_DEVELOPMENT) install wouldImagePullBackOffonghcr.io/obolnetwork/job-broker:latest. Add it to the publish matrix before promoting tov0.13.0. eth-mainneteRPC has no public fallback. The single obol-gcp mainnet upstream intermittently trips its own circuit breaker; consider apublicnodefallback likebase-sepoliaalready has.
Superseded PRs
This integration release folds in and supersedes: #697 (x402scan register CLI), #717 (multi-routes + async jobs), #718 (route-surface hardening), #719 (job-broker dev-image fix), #720 / #721 / #722 (live smoke coverage). Promoted to main via #723.
What's Changed
Full Changelog: v0.13.0-rc0...v0.13.0-rc1
v0.13.0-rc0 - Agent runtime resilience
v0.13.0-rc0 - Agent runtime resilience
This draft release candidate rolls up the seller-journey, app-resume, LiteLLM zero-downtime, remote-signer, Hermes-agent, skills, dependency-update, and smoke-hardening work staged in integration/v0.13.0-rc0.
Warning
This is a pre-release candidate. The RC smoke is not fully green yet (flow-13 agent-buy and flow-14 chart-fetch blockers, see Known Issues); do not promote to v0.13.0 until they are fixed and the full release smoke passes from the integration tip.
Install / Upgrade
# Install this release candidate
OBOL_RELEASE=v0.13.0-rc0 bash <(curl -s https://stack.obol.org)
# Run the stack
obol stack init && obol stack upRelease Highlights
Seller and agent journey polish
The RC includes the seller journey README refresh, buyer discovery hardening, installed app resume, persisted overrides, and stronger sell/buy failure reporting so operators get clearer recovery paths when an agent or paid route cannot resume cleanly.
Zero-downtime LLM and payment gate hardening
LiteLLM hot-path config changes avoid unnecessary restarts, the x402 buyer sidecar is split out for cleaner rollout behavior, and payment/RPC gate PodDisruptionBudgets protect single-replica services during node maintenance.
Hermes and remote-signer updates
The RC picks up the Hermes agent image bump and remote-signer chart bump. Hermes dashboard auth and default-agent sync behavior are part of the smoke validation surface for this release.
Release and QA tooling
The RC includes GoReleaser publishing work, refreshed skills, release-smoke QA documentation improvements, and the #715 flow13 catalog-envelope smoke fix.
Superseded PRs
This integration release supersedes the source PRs that were folded into the RC branch: #699, #700, #701, #702, #703, #704, #705, #706, #707, #708, #711, #712, #713, #714, and #715.
Known Issues / Draft Validation Status
Current validation target: integration/v0.13.0-rc0 at a29c8262398afc63044d0fad1b57977286699ab4.
Release smoke status before #715:
- PASS: flow-01, flow-03, flow-04, flow-05, flow-06, flow-07, flow-08, flow-09, flow-10, flow-11, flow-16, flow-17.
- FAIL: flow-02 due kube-state-metrics image pull/bootstrap stall.
- FAIL: flow-13 due the stale smoke helper parsing
/api/services.jsonas a bare array. - FAIL: flow-14 due timeout fetching
bedag/raw-2.0.2.tgzduring Hermes install. - flow-11 accounting issue: the flow completed its paid path but emitted a report-level SKIP because registration was already reflected in ServiceOffer status while receipt lookup was unavailable.
Post-#715 targeted validation:
- flow13 was rerun from integration tip
a29c8262. - The former catalog failure is fixed: Bob's agent pod discovered
alice-obol-inferencein/api/services.jsonwithHTTP 200 ... OBOL permit2. - Full flow13 still failed later at the agent-buy step because no
PurchaseRequestwas created after the retry. This is a separate blocker from the fixed catalog-envelope bug.
Do not promote this RC to v0.13.0 until the remaining blockers are fixed and the full release smoke is rerun from the integration tip.
What's Changed
Generated changelog will be refreshed before promotion.
Full Changelog: v0.12.0...v0.13.0-rc0
v0.12.0 - Custom Storefronts
v0.12.0 — Make the storefront yours
Brand your storefront, sell it from more than one domain, and give the agents shopping it a cleaner buy flow.
v0.11.0 opened up the agent marketplace — bring-your-own-key inference, multi-currency offers, and permanent Cloudflare tunnels. v0.12.0 builds on that shopfront: now you can set your storefront's name, tagline, and logo, expose it on more than one domain, and have a tidier buy experience for the agents purchasing your services — plus payment-correctness and dependency fixes.
Get started with obol sell demo for a hello-world service, then obol model setup and obol sell demo quant to put a model-backed agent up for sale. Tag @Obol_Collective on X with your storefront URL and maybe we'll check it out. 👀 Once you've services up on a permanent URL, consider listing them on x402scan.
Checkout some example storefronts built on the Stack; Ask for Hyperliquid analysis from the HyperAnalyst (x402scan) or pay for the raw data APIs from the Hyperliquid Trading Intelligence storefront (x402scan), then study up on BankrBot launches with this BankrAnalyst (x402scan).
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.12.0 bash <(curl -s https://stack.obol.org)
# Run the stack
obol stack init && obol stack up
# Brand your storefront, then preview it as buyers see it
obol sell info set --display-name "Acme Labs" --tagline "Paid APIs." --logo-url "https://acme.example/logo.png"
obol sell info
# Stand up a paid service and an agent that uses a model
obol sell demo
obol sell demo quantRelease Highlights
Storefront branding — name, tagline, email, and logo
obol sell info set sets your storefront's display name, tagline, email, and logo. They flow into the public catalog (/api/services.json), the storefront landing page, and its OpenGraph/social preview. obol sell info shows the storefront and everything on sale exactly as buyers see it, and obol sell info <name> focuses a single service with how-to-buy instructions.
obol sell info set --display-name "Acme Labs" --tagline "Paid APIs."
obol sell infoSell from more than one domain — multi-hostname tunnels
obol tunnel hostname add puts your storefront on additional domains without disturbing the ones already live, obol tunnel hostname list shows them, and obol tunnel delete tears a tunnel down cleanly. Headless setups now reuse an existing cloudflared cert.
Cleaner buy flow
HTTP service cards link straight to Swagger UI and openapi.json, and the buy prompts are clearer — they require a real task and tidy up the agent, inference, and HTTP copy.
Smaller wins
- Base Sepolia USDC payments — corrected the USDC EIP-712 domain name to
"USDC"(it's FiatTokenV2_2, not mainnet's"USD Coin"), so real facilitators accept otherwise-valid signatures. - Multi-currency
--accept— stopped cli/v3 from comma-splitting a multi-currency--acceptvalue, so multi-token offers parse whole. - x402 Go SDK — bumped to
/v2(v2.16.0). - Frontend
v0.1.28-rc0— storefront/UI refresh bundled in. - Dependency & client bumps — Hermes agent, cloudflared, Gateway API
v1.6.0, Ethereum EL/CL clients, Aztec, and theobolup.shtoolchain (kubectl, helm, k3d, helmfile, k9s, ollama).
Breaking changes / Migration notes
/api/services.jsonis now an envelope, not a bare array:{ "displayName", "tagline", "logoUrl", "services": [ … ] }(services moved under theserviceskey). This backs storefront branding, and there is no backward compatibility — update sellers and buyers together (obol updateon every stack). A current buyer against an un-upgraded seller (still serving the old array) will fail to read the catalog.- No schema or volume-ownership breaks since v0.10.0 — upgrading in place is otherwise expected to work.
What's Changed
- fix(x402): require a real task in storefront buy prompts by @HananINouman in #650
- chore(deps): update aztecprotocol/aztec docker tag to v4.4.0 by @github-actions[bot] in #575
- chore(deps): update obolup.sh dependency updates by @github-actions[bot] in #603
- chore(deps): update dependency kubernetes-sigs/gateway-api to v1.6.0 by @github-actions[bot] in #678
- chore(deps): update ethereum el/cl client updates by @github-actions[bot] in #658
- chore(deps): update cloudflare/cloudflared docker tag to v2026.6.1 by @github-actions[bot] in #642
- chore(deps): update nousresearch/hermes-agent docker tag to v2026.6.19 by @github-actions[bot] in #659
- Chore/dev docs and storefront api links v2 by @HananINouman in #676
- ci: repin x402 pins via a release-time PR, not a push to main by @bussyjd in #662
- feat(sell): allow for the control of your storefront branding by @HananINouman in #663
- fix(sell): keep multi-currency --accept whole (disable cli/v3 comma split) by @bussyjd in #665
- chore(deps): bump x402-foundation/x402/go to /v2 (v2.16.0) by @bussyjd in #672
- test(smoke): flow-12 runnable on macOS + against override facilitator images by @bussyjd in #636
- fix(x402): base-sepolia usdc eip-712 domain is usdc by @OisinKyne in #681
- feat(tunnel): multi-hostname support, headless cert reuse, and tunnel delete by @bussyjd in #670
- chore: latest docker images by @OisinKyne in #682
- fix(hermes): unblock pay-agent buys from obol.stack chat by @HananINouman in #684
- feat(agent): fix sub-agent hang, improve guide prompts by @OisinKyne in #685
- fix(x402): accept x402 v2 PAYMENT-SIGNATURE header in ForwardAuth verifier by @bussyjd in #689
- Revert "fix(x402): accept x402 v2 PAYMENT-SIGNATURE header in ForwardAuth verifier" by @OisinKyne in #691
- chore(frontend): pin dashboard image to v0.1.28-rc1 by @HananINouman in #692
- integration(x402): buyer-funnel stack + v2 PAYMENT-SIGNATURE (supersedes #686–689) by @bussyjd in #690
- fix(serviceoffer-controller): skip skill catalog rollout when hash un… by @HananINouman in #693
- feat(sell): add OpenAPI contact email for x402scan discovery by @HananINouman in #695
- feat(sell): pre-flight check logo URLs for pitfalls by @OisinKyne in #694
- fix(serviceoffer-controller): advertise stream:false on generated chat openapi by @bussyjd in #696
Full Changelog: v0.11.0...v0.12.0
v0.12.0-rc1 - Custom Storefronts
v0.12.0-rc1 — Make the storefront yours
Brand your storefront, sell it from more than one domain, and give the agents shopping it a cleaner buy flow.
v0.11.0 opened up the agent marketplace — bring-your-own-key inference, multi-currency offers, and permanent Cloudflare tunnels. v0.12.0 builds on that shopfront: set your storefront's name, tagline, and logo, expose it on more than one domain, and a tidier buy experience for the agents purchasing your services — plus payment-correctness and dependency fixes.
Get started with obol sell demo for a hello-world service, then obol model setup and obol sell demo quant to put a model-backed agent up for sale. Tag @Obol_Collective on X with your storefront URL and maybe we'll check it out. 👀 Once you've services up on a permanent URL, consider listing them on x402scan.
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.12.0-rc1 bash <(curl -s https://stack.obol.org)
# Run the stack
obol stack init && obol stack up
# Brand your storefront, then preview it as buyers see it
obol sell info set --display-name "Acme Labs" --tagline "Paid APIs." --logo-url "https://acme.example/logo.png"
obol sell info
# Stand up a paid service and an agent that uses a model
obol sell demo
obol sell demo quantRelease Highlights
Storefront branding — name, tagline, and logo
obol sell info set sets your storefront's display name, tagline, and logo. They flow into the public catalog (/api/services.json), the storefront landing page, and its OpenGraph/social preview. obol sell info shows the storefront and everything on sale exactly as buyers see it, and obol sell info <name> focuses a single service with how-to-buy instructions.
obol sell info set --display-name "Acme Labs" --tagline "Paid APIs."
obol sell infoSell from more than one domain — multi-hostname tunnels
obol tunnel hostname add puts your storefront on additional domains without disturbing the ones already live, obol tunnel hostname list shows them, and obol tunnel delete tears a tunnel down cleanly. Headless setups now reuse an existing cloudflared cert.
Cleaner buy flow
HTTP service cards link straight to Swagger UI and openapi.json, and the buy prompts are clearer — they require a real task and tidy up the agent, inference, and HTTP copy.
Smaller wins
- Base Sepolia USDC payments — corrected the USDC EIP-712 domain name to
"USDC"(it's FiatTokenV2_2, not mainnet's"USD Coin"), so real facilitators accept otherwise-valid signatures. - Multi-currency
--accept— stopped cli/v3 from comma-splitting a multi-currency--acceptvalue, so multi-token offers parse whole. - x402 Go SDK — bumped to
/v2(v2.16.0). - Frontend
v0.1.28-rc0— storefront/UI refresh bundled in. - Dependency & client bumps — Hermes agent, cloudflared, Gateway API
v1.6.0, Ethereum EL/CL clients, Aztec, and theobolup.shtoolchain (kubectl, helm, k3d, helmfile, k9s, ollama).
Breaking changes / Migration notes
/api/services.jsonis now an envelope, not a bare array:{ "displayName", "tagline", "logoUrl", "services": [ … ] }(services moved under theserviceskey). This backs storefront branding, and there is no backward compatibility — update sellers and buyers together (obol updateon every stack). A current buyer against an un-upgraded seller (still serving the old array) will fail to read the catalog.- No schema or volume-ownership breaks since v0.10.0 — upgrading in place is otherwise expected to work.
What's Changed
- fix(hermes): unblock pay-agent buys from obol.stack chat by @HananINouman in #684
- feat(agent): fix sub-agent hang, improve guide prompts by @OisinKyne in #685
- fix(x402): accept x402 v2 PAYMENT-SIGNATURE header in ForwardAuth verifier by @bussyjd in #689
- Revert "fix(x402): accept x402 v2 PAYMENT-SIGNATURE header in ForwardAuth verifier" by @OisinKyne in #691
- chore(frontend): pin dashboard image to v0.1.28-rc1 by @HananINouman in #692
- integration(x402): buyer-funnel stack + v2 PAYMENT-SIGNATURE (supersedes #686–689) by @bussyjd in #690
Full Changelog: v0.12.0-rc0...v0.12.0-rc1






