Releases: ObolNetwork/obol-stack
Release list
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
v0.12.0-rc0 - Custom Storefronts
v0.12.0-rc0 — 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-rc0 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(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
Full Changelog: v0.11.0...v0.12.0-rc0
v0.11.0 - Agents for hire
v0.11.0 — Agents for hire
Permanent storefront URLs, multi-currency offerings, and cheaper remote inference providers, let agent businesses improve their retention, incentivization, and profit margins.
v0.11.0 widens both ends of the agent marketplace. On the supply side, a bring-your-own-key provider registry turns obol model setup into a one-command on-ramp to hosted inference — Openrouter, Venice, NVIDIA NIM, NVIDIA GMI, Novita and Hugging Face — so a capable agent no longer needs a local GPU or the most expensive of remote inference. On the demand side, a single service can now be priced and paid in multiple currencies across multiple networks (USDC via EIP-3009, OBOL via Permit2, on Base and mainnet, others if configured manually), and persistent Cloudflare tunnels are secured and simplified so your agent sells from a permanent domain.
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 and running on a permanent URL, consider listing them on x402scan.
Note
Base Sepolia ETH faucet · Base Sepolia USDC faucet. This release also wires a Base Sepolia OBOL faucet for testing OBOL-priced offers.
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.11.0 bash <(curl -s https://stack.obol.org)
# Run the stack
obol stack init && obol stack up
# Bring your own inference provider (Openrouter, Venice, NVIDIA NIM/GMI, Novita, HF)
obol model setup
# Stand up a paid service and an agent that uses that model
obol sell demo
obol sell demo quant
# Hand over to your Claude and build an agent business of your own
claude
/plugin marketplace add ObolNetwork/skills
/plugin install obol@obol
"Help me sell a service on the Obol Stack that agents will pay for."Release Highlights
Bring your own key — one command to use many inference providers
obol model setup is now a guided BYOK on-ramp backed by a provider registry: pick Openrouter, Venice, NVIDIA NIM, NVIDIA GMI, Novita, or Hugging Face, and the CLI opens the provider's sign-up page when you don't yet have a key.
obol model setupThis is the fastest way to give your stack a capable model without hosting one, and it's the foundation every paid agent offer builds on.
Multi-currency, multi-network services — priced and settled in the tokens your buyers hold
An offer can now advertise multiple payment assets across multiple networks instead of a single currency. Buyers pay in what they already hold; settlement is USDC (EIP-3009) or OBOL (Permit2) on Base and mainnet, gated by x402.
Permanent storefronts — persistent Cloudflare tunnels, simplified
Tunnel setup is secured and streamlined so your agent sells from a permanent domain instead of an ephemeral quick-tunnel. Walkthrough in the permanent-url guide.
Ecosystem — sell from your editor
Install the Obol skills into Claude and let it package and sell services for you:
/plugin marketplace add ObolNetwork/skills
/plugin install obol@obolSmaller wins
- Remote-signer secret handling — fixed secret-modification path; chart + image bumped.
- Controller regression guard — a test pins the
NetworkPolicyGVR mapping so agent provisioning can't silently wedge. - Frontend
v0.1.27— storefront/UI refresh bundled in. - Ethereum clients — reth bumped to
v2.3.0plus EL/CL client updates for local nodes.
Breaking changes / Migration notes
-
No schema or volume-ownership breaks since v0.10.0 — upgrading in place is expected to work.
-
Pre-release tester warning: If you ran an unreleased marketplace or chart-consolidation branch before this release,
obol stack upmay fail with Helminvalid ownership metadataerrors for resources that moved into thebasechart. This is not a supported production migration path. Back up anything you need, then recreate:obol stack export obol stack down obol stack purge --force obol stack init obol stack up
What's Changed
- test(controller): guard resourceFor NetworkPolicy GVR mapping by @bussyjd in #631
- feat: obol buy inference — BYOK onboarding (Venice, OpenRouter & co.) on a single provider registry by @bussyjd in #638
- feat(remote-signer): fix secret modification by @OisinKyne in #643
- feat(tunnel): simplify tunnel setup by @OisinKyne in #645
- chore(docker): bump images by @OisinKyne in #647
- chore(deps): update ethereum el/cl client updates by @github-actions[bot] in #604
- chore(network): bump ethereum reth image to v2.3.0 by @bussyjd in #652
- feat: sell and buy services in multiple currencies + networks by @OisinKyne in #655
- chore(frontend): bump obol-stack-front-end image to v0.1.27 by @HananINouman in #660
Full Changelog: v0.10.0...v0.11.0






