Skip to content

Release v0.16.1-rc1

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 14 Oct 15:06
· 3 commits to main since this release
v0.16.1-rc1

Obol banner

v0.16.1-rc1 - Hardening

A security and reliability release on top of v0.16.0. It tightens the paid-request path, how secrets are stored, what the public storefront serves, and every command that can destroy a cluster. Several features change behaviour to get there: we're in v0 and would rather be safe by default than keep a risky path working.

This is a pre-release for testing. Please report anything that breaks.

Warning

This software is early alpha, you could lose what you put in. Please use caution when it comes to non-testnet assets. Back up before upgrading: obol stack export --file backup.tar.gz.

Install / Upgrade

# Fresh install
curl -fsSL https://stack.obol.org/v0.16.1-rc1 | bash
obol stack init && obol stack up

# Upgrade an existing stack
curl -fsSL https://stack.obol.org/v0.16.1-rc1 | bash
obol stack up
obol doctor

Release Highlights

Paid requests

  • One payment, one request. A signed payment can only be used once. Sending the same payment again, or several copies at once, gets 409 payment_in_use before it reaches your service. If a request fails before settlement, the buyer can retry with the same payment.
  • Exact prices. Prices are parsed exactly, down to the token's own precision (6 decimal places for USDC, 18 for OBOL). Zero, negative and malformed prices are refused by the CLI and by the ServiceOffer schema. Per-MTok prices always round up to at least the smallest token unit.
  • Buyers set a ceiling. buy.py pay, pay-agent and go refuse any quote above --max-price (default: 1 token, or OBOL_BUY_MAX_PRICE). Generated buy commands add the flag when an offer costs more.
  • obol buy follows only safe catalog links. A seller's catalog can only send you to its own origin or to a public https hostname.

Selling a host inference server

obol sell inference is now standalone-only. On a machine with a stack, it stops and prints the supported path instead:

obol model setup custom --endpoint http://<host>:<port>/v1 --model <id>
obol sell http <name> --upstream litellm --port 4000 --namespace llm --model <id> --per-mtok <price>

That path pins the model, limits buyers to the chat, completions and embeddings endpoints, and only charges for replies that deliver something. Use --standalone to run the gateway on its own regardless. The standalone gateway now serves only its paid routes and /health; everything else returns 404.

Secrets and backups

  • Keystores, passwords, tokens and the kubeconfig are always written owner-only (0600), even when a file already existed with looser permissions.
  • obol stack import restores files owner-only, won't overwrite existing agent data without --force, and is protected against oversized archives.
  • obol stack export archives are owner-only.

Storefront and public endpoints

  • Branding text (display name, tagline, registration name) must be plain text: no angle brackets or control characters. The storefront page escapes everything it embeds.
  • Job status pages report upstream failures generically; details go to the server logs.
  • Sign-in links use the right scheme on local hosts.

Safer cluster commands

  • Destroying a cluster always asks. Switching backends with obol stack init --force asks before deleting the old cluster (or needs --yes), even when nothing looks live or the cluster can't be reached. If obol stack down can't stop a cluster, it no longer quietly deletes it.
  • Your edits to the defaults are kept. obol stack up no longer overwrites hand-edited files under the defaults tree. When a new default ships for a file you changed, it's saved to defaults.obol-new/ and you get a warning. obol stack up --reset-defaults takes the new defaults and backs your edits up first.
  • k3s backend: obol only stops the k3s process it started, checked by PID and start time.

Truthful status

  • obol tunnel status says degraded when the public URL isn't reachable.
  • Agents with a wallet are Ready only once their signer is running; purchases show BuyerUnavailable while the buyer can't be reached.
  • ERC-8004 metadata and URI updates fail loudly if the transaction reverts, and recovering a previous registration checks the wallet still owns it.

Installer (obolup)

  • Tools (kubectl, helm, k3d, helmfile, k9s, helm-diff) are installed by obol from checksum-pinned downloads.
  • Without a terminal, the installer never waits on a prompt: it picks the safe option and prints the command for later.
  • Ollama is installed only if you say yes (or set OBOL_INSTALL_OLLAMA=true); --yes alone no longer installs it.
  • Steps that need sudo are skipped with exact instructions when sudo can't ask for a password.
  • No "start the stack?" question when your stack is already running.

Smaller wins

  • Partial archives say what they keep - obol network list and status show archive since cancun (block 19,426,587) or archive, last 365d, and JSON gains archive_scope.
  • obol doctor warns about an exposed Ollama - on Linux, when Ollama listens on every interface, with a firewall rule to limit it to Docker.
  • buy.py go works on chat and agent offers again.

Breaking changes / Migration notes

  • obol sell inference with a stack now refuses. Re-create those offers with the LiteLLM recipe above. On upgrade, old cluster-routed inference offers aren't resumed; obol sell delete <name> -n <ns> cleans them up. If a gateway started by an older release is still running, obol tells you its PID so you can stop it.
  • Zero prices are rejected (--per-request 0). Use free routes (--route path=/x,gate=free) for free endpoints.
  • One request per payment on verify-only routes. A payment verified through the ForwardAuth /verify path now opens exactly one request.
  • Hermes messaging gateway is closed by default (GATEWAY_ALLOW_ALL_USERS=false). If you connect Telegram, Discord or another platform, set that platform's allowlist.
  • stack import over existing agent data needs --force.
  • First obol stack up after upgrading backs up any defaults file that differs from the new version to defaults.bak.<timestamp>/ once, then keeps your edits from then on.
  • obolup.sh --yes no longer installs Ollama.

Known issues

  • Gloas on testnets: as in v0.16.0, use --consensus-client teku, lodestar, nimbus or prysm on Sepolia and Hoodi.
  • Ollama on Linux still has to listen beyond localhost so the cluster can reach it; obol doctor explains how to firewall it. A tighter setup is planned.

What's Changed

  • chore(deps): update obolup.sh dependency updates by @github-actions[bot] in #822

Full Changelog: v0.16.0...v0.16.1-rc1