A delegate renews users’ VTXOs before batch expiry on their behalf — without ever holding their keys. This guide runs one with Fulmine, Ark Labs’ wallet daemon, in headless mode.
What you’re running
Fulmine is a wallet daemon that doubles as delegate infrastructure: clients hand it presigned, tamper-proof intents and it submits them in a batch swap before their VTXOs expire — fully self-custodial (see Intent Delegation for the model). Run “headless,” its Delegate API needs no wallet: a fresh daemon with delegation enabled serves clients immediately, with nothing to create, unlock, or fund. Fulmine has no flag to hide the Web UI; just ignore it. Fulmine listens on three ports:| Port | Env var | Purpose |
|---|---|---|
7000 | FULMINE_GRPC_PORT | gRPC API (not needed for a delegate-only deployment) |
7001 | FULMINE_HTTP_PORT | REST API (mounted under /api) and Web UI; delegation status lookups |
7002 | FULMINE_DELEGATE_PORT | Delegate API — info and submission, served at /v1/... (no /api prefix) |
Prerequisites
- Docker — the quickest way to run Fulmine.
- The mainnet Arkade Service URL:
https://arkade.computer.
Quickstart with Docker
Start Fulmine with delegation enabled
Run the daemon as a detached container, pointed at mainnet with the delegate enabled:This publishes the HTTP port (
7001, for status lookups and the Web UI) and the delegate port (7002, the Delegate API). The gRPC port (7000) is intentionally left unpublished — it isn’t needed for a delegate-only deployment.Verify the delegate is live
Query the delegate info endpoint — it returns the delegate’s public key and fee. The Delegate API is served on port 7002 at A JSON response means your delegate server is ready for clients — no wallet creation or unlock required.
/v1/... (no /api prefix):delegateAddress is where your service fee is paid, so it may be empty while FULMINE_DELEGATE_FEE is 0. The response also carries a deprecated delegatorAddress alias — prefer delegateAddress.Essential environment variables
Fulmine is configured entirely throughFULMINE_-prefixed environment variables — there are no CLI flags. These are the ones that matter for a headless delegate:
| Variable | Example (mainnet) | Purpose |
|---|---|---|
FULMINE_ARK_SERVER | https://arkade.computer | Arkade Service the daemon connects to |
FULMINE_DELEGATE_ENABLED | true | Turns on delegate functionality (default false) |
FULMINE_DELEGATE_PORT | 7002 | Delegate server port (must differ from gRPC/HTTP) |
FULMINE_DELEGATE_FEE | 0 | Service fee applied by the delegate (default 0) |
FULMINE_DATADIR | /app/data | Data directory — image default, persisted by the volume |
How a wallet uses your delegate
Once your server is up, a client wallet uses it in three steps:- Discover — the wallet calls
GET /v1/delegate/info(port7002) to read your delegatepubkey,fee, and address, then builds a delegated address with an operator + user + delegate spend path. - Delegate — the wallet submits a presigned intent and forfeit transactions to
POST /v1/delegate(port7002). The intent is bound by a time window and signed with BIP322, so your server cannot alter or redirect the funds — only submit what was authorized. - Renew — your server watches those VTXOs and submits the intent in a batch swap just before expiry. Status can be tracked via
GET /api/v1/delegateson the HTTP port (7001), which acceptsstatus(pending,completed,failed),limit, andoffsetquery parameters.
The info endpoint is also exposed at
/v1/delegator/info as a legacy alias, but /v1/delegate/info is preferred. For a complete client-side example of building the intent and forfeit transactions, see the TS-SDK delegate.js example.Next Steps
VTXO Management
Automatic renewal and recovery from the client side
Intent Delegation
The delegation workflow and security model in depth
Fulmine Reference
The wallet daemon powering your delegate
Fulmine on GitHub
Source, releases, and full configuration