Skip to main content

Self-Hosting

Self-hosting serves the same two workflows as a hosted query API, read state and submit transactions, from infrastructure you run. You take it on for privacy (nobody sees your queries), independence (no third-party outage or rate limit in your path), or trust (validating the chain yourself instead of believing an operator).

It comes in three shapes, and they are not steps on one ladder but different trades of trust against operations. Each tab below is a complete path: start it, check it, point your SDK at it.

ShapeProcessesTrust modelResources
Data node (Dolos)OneTrusts the relays it syncs fromA few GB of RAM, one ledger copy
Node + Ogmios + KupoThreeTrustless: your node validates everythingA full node plus two light services
Full node (+ your choice of serving layer)One, then moreTrustlessReal storage, memory, and uptime commitment

Run it

What it is. Dolos is a data node: a single lightweight Rust process that syncs the ledger directly from Cardano relays and serves it over several APIs, replacing the node + indexer + API stack for read-and-submit workloads. It trusts the relays you configure and cannot produce blocks; in exchange it is the smallest self-hosted footprint there is.

Start it. Install Dolos and sync it against your network; the TxPipe quickstart covers installation and initial configuration. Then enable the API your SDK already speaks, Mini-Blockfrost, in dolos.toml and start Dolos:

[serve.minibf]
listen_address = "[::]:3000"
permissive_cors = true

Dolos exposes each API on its own port, enabled selectively: Mini-Blockfrost (REST, a subset of the Blockfrost API), Mini-Kupo (Kupo-style UTXO queries), UTxO RPC (gRPC), and the Ouroboros node-to-client socket for tools that expect a node (such as cardano-cli).

Check it. Port 3000 now serves Blockfrost-shaped responses from your local copy of the ledger, no API key required:

curl -s localhost:3000/blocks/latest | jq

Point your SDK at it. Every major transaction builder has a Blockfrost provider; point its base URL at your Dolos instance (the SDK's network must match the network Dolos is syncing):

import { preprod, Client } from "@evolution-sdk/evolution"

const client = Client.make(preprod)
.withBlockfrost({
baseUrl: "http://localhost:3000",
projectId: "dolos" // Mini-Blockfrost doesn't check the key; any value works
})
.withSeed({ mnemonic: process.env.WALLET_MNEMONIC!, accountIndex: 0 })

Size it. Not every workload needs the full chain, so Dolos stores only what you configure: ledger-only (current state, enough to build and submit), sliding window (recent history with configurable retention), or full archive (everything, for explorers and historical queries). Check the Mini-Blockfrost endpoint list covers your queries before swapping it in for a hosted API.

The managed variant: Demeter

Demeter hosts this page's architecture as a managed platform: node access, indexers (db-sync, Kupo, Mumak), and node interfaces (Ogmios, submit API, UTxO RPC, Blockfrost RYO) provisioned as cloud services across mainnet, preprod, and preview. You get the self-hosted shapes without the operations, at the price of reintroducing a platform operator into your trust model. It fits when you want stack-level control (your own Kupo patterns, your own Ogmios session) but not the servers.

Create an account at demeter.run and see the Demeter documentation for service setup; wiring an SDK to a hosted Kupmios with the platform's API keys is shown in Query the chain.

Next steps