guide · ai

Darkbloom Setup: The Two-Sided Alpha Risks Before You Join

Both sides of the Darkbloom public-alpha network: developer API setup (consumer) and Apple Silicon Mac provider setup, with hardware, install, and earnings caveats.

August 27, 2026 · By Alastair Fraser

Darkbloom provider node illustration showing an Apple Silicon Mac running inference with encrypted request routing

One-line job: Set up Darkbloom on both sides — make your first API call as a developer consumer, and (optionally) run a provider node on an Apple Silicon Mac. Audience: Developers who want an OpenAI/Anthropic-compatible endpoint that runs inference on third-party hardware, and Mac owners evaluating whether to earn from idle compute. Not for: Intel Macs, macOS <14, machines under 48 GB unified memory, or anyone who needs a production SLA. Darkbloom is a public alpha that has not been audited (repo disclaimer). Last verified: 2026-08-27 Evidence weight: documentation-verified + independent third-party review

Steps follow the Darkbloom docs at Layr-Labs/d-inference and darkbloom.dev as of August 2026. Pricing changes often, and the consumer quickstart does not mirror live prices. Query GET /v1/pricing for the current snapshot. The repo and Wavect review were independently re-read on 2026-08-27.

Darkbloom is a network, not a model. It routes OpenAI/Anthropic-style API requests to verified Apple Silicon Macs that have opted in as providers. So the “what model do I install” question does not apply here. You pick a model from the live catalog returned by GET /v1/models, and the network picks a provider for each call. If that mental model is not what you wanted, this is not the guide you wanted (Darkbloom landing page, Wavect review).

Acronyms used in this article (spelled out on first use per the Darkbloom docs):

  • MLA — Multi-head Latent Attention (a transformer attention layout)
  • MTP — Multi-Token Prediction (predicts more than one token per step)
  • CVM — Confidential VM (a hardware-isolated virtual machine)
  • SE — Secure Enclave (Apple’s hardware key store)
  • MDA — Apple Device Attestation (Apple-issued device-identity chain)
  • MDM — Mobile Device Management (the protocol the SE enrollment step uses)

Pick your path first

Two distinct user stories live in this article. Pick the one that matches you:

  • Path A: Consumer. You want to call Darkbloom from your code (Python, cURL, OpenAI SDK, Anthropic SDK). You do not need to install anything on your own hardware. → 1
  • Path B: Provider. You have an Apple Silicon Mac with ≥48 GB of unified memory, and you want to run a node that earns a share of inference revenue. → 2

If you wear both hats — running a provider on the same Mac you develop on — read 2, then 1. The “self-route” pattern in 1.F is the reason to do both.


1. Consumer setup — “I want to call Darkbloom from my code”

1.A Prerequisites

  1. A Darkbloom account at console.darkbloom.dev.
  2. An API key from Settings → API Keys, or via POST /v1/keys authenticated with a Privy JWT. The coordinator’s requireAuth accepts both forms: API keys look like sk-db-... and Privy JWTs look like eyJ... (consumer quickstart).
  3. A target model ID. The live catalog is at GET https://api.darkbloom.dev/v1/models; the quickstart example is gemma-4-26b. Pull your ID at startup so alias changes do not break you.

1.B Base URL and auth

https://api.darkbloom.dev/v1

Authentication: Authorization: Bearer <api-key-or-privy-jwt>. The coordinator accepts either form (consumer quickstart).

The privacy model is hop-by-hop, not end-to-end. With optional application/eigeninference-sealed+json request bodies (NaCl Box, X25519 + XSalsa20-Poly1305), your request reaches the coordinator’s long-lived public key. The coordinator decrypts inside Confidential VM memory, re-seals to the matched provider, and the provider decrypts inside a hardened process. The coordinator sees your plaintext in memory only while it routes and bills the request. See the encryption architecture doc and Wavect’s review for the precise trust boundary. This is not E2E encrypted.

1.C Your first request — Python (OpenAI SDK)

🤖 Let your agent do it: open a chat with Claude Code, Codex, Cursor, or Hermes and say:

Wire up the OpenAI Python SDK against Darkbloom. Base URL https://api.darkbloom.dev/v1,
auth from env var DARKBLOOM_API_KEY. Pull the model catalog with GET /v1/models, let the
user pick one, then stream a chat completion against the chosen model and print the
result. Confirm a 200 OK and that the response stream ends cleanly. Save the snippet to
~/darkbloom_first_request.py.

The agent will install the SDK if needed, write the file, and run a smoke test against the network. The manual command is below for when you’d rather do it yourself.

from openai import OpenAI

client = OpenAI(
    base_url="https://api.darkbloom.dev/v1",
    api_key="«redacted:sk-…»",
)

response = client.chat.completions.create(
    model="gemma-4-26b",  # example; live catalog at GET /v1/models
    messages=[{"role": "user", "content": "Hello, Darkbloom!"}],
    stream=True,
)

for chunk in response:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

The OpenAI Responses API is also supported per the repo README; Anthropic Messages is supported via its own SDK (next subsection).

1.D Your first request — cURL

curl -X POST https://api.darkbloom.dev/v1/chat/completions \
  -H "Authorization: Bearer $DARKB..._KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemma-4-26b",  # example; live catalog at GET /v1/models
    "messages": [{"role": "user", "content": "Hello!"}],
    "stream": true
  }'

If you see a streamed completion, the auth path works. If you get 401, check that you used Bearer and the key prefix (sk-db-... or eyJ...).

1.E Anthropic Messages API (Python)

import anthropic

client = anthropic.Anthropic(
    base_url="https://api.darkbloom.dev/v1",
    api_key="sk-db-YOUR_KEY_HERE",
)

response = client.messages.create(
    model="gemma-4-26b",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello!"}],
)
print(response.content[0].text)

1.F Self-route (free inference on your own provider)

If you run a provider on the same Mac you develop on, set private_only = false in your provider TOML (see 2.E). Your dev requests then self-route back to your machine for free. Per the consumer quickstart: “Requests routed to your own provider machine via self-route are not charged.” This is the canonical pattern for evaluation workloads. You pay for electricity, not API bills, while validating the model catalog.

Embeddings are listed as unimplemented in the consumer quickstart at the time of writing. Tool calling, vision input (base64 data: URIs inside the encrypted body), and reasoning models are supported per the compatibility list.


2. Provider setup — “I want to run a node on my Mac”

2.A Hardware requirements

🤖 Let your agent do it: “Audit my Mac for Darkbloom provider eligibility. Run sw_vers, uname -m (must be arm64), sysctl hw.memsize (unified memory in bytes, divide by 2³⁰ for GB), df -h ~, and pmset -g therm. Report PASS or FAIL per gate.”

GateMinimumWhy
ArchitectureApple Silicon onlyIntel Macs and Linux/Windows are not supported. The installer preflight fails with Darkbloom requires macOS with Apple Silicon.
macOS14 (Sonoma) or newerHard gate in the installer preflight.
Unified memory48 GB or moreSmaller Macs can register interest on the console but cannot earn yet. Landing copy: “We’re starting with Macs that have 48 GB or more.”
Free disk100 GB recommendedModels and MLX caches fill up.
Internet + thermalsStable uplink, normal thermalsProvider streams ride over wss://api.darkbloom.dev/ws/provider; see issue #550.

Apple Silicon tier mapping:

MacUnified memoryProvider-eligible?
MacBook Pro M4 Pro (base)24 GB❌ Below 48 GB
MacBook Pro M4 Pro / Max48 GB / 64 GB+
Mac Studio M2 Ultra64 GB / 192 GB
Mac Studio M3 Ultra192 GB / 256 GB+

🤖 Let your agent do it: “Install the Darkbloom provider on this Mac. Run curl -fsSL https://api.darkbloom.dev/install.sh | bash, then darkbloom --version, darkbloom doctor, darkbloom status. Report version, doctor exit code, and connection state. If doctor exits non-zero, read its output and propose the smallest fix.”

curl -fsSL https://api.darkbloom.dev/install.sh | bash

Eigen Labs publishes the installer, and codesign verifies the binary inside after install. Read the script before piping it to bash on a host you care about. 2.C covers the manual alternative. No sudo is required.

What the installer does (docs/provider/installation.md):

  1. Preflight. Confirms the host is macOS on Apple Silicon.
  2. Fetch release metadata. GET /v1/releases/latest returns version, bundle URL, bundle hash, binary hash, and mlx.metallib hash.
  3. Download the bundle to a temporary path.
  4. Verify hashes. The installer checks the bundle, darkbloom binary, and mlx.metallib against the coordinator record.
  5. Verify the code signature with codesign --verify on the darkbloom binary.
  6. Install into ~/.darkbloom. Creates ~/.darkbloom/bin/ and symlinks from Darkbloom.app/Contents/MacOS/ when the .app bundle is in use.
  7. Update PATH. Appends export PATH="$HOME/.darkbloom/bin:$PATH" to ~/.zshrc (or ~/.bashrc).
  8. Migrate legacy state. Copies tokens and keys from ~/.dginf or ~/.eigeninference if those directories exist.
  9. Provision Secure Enclave identity by running darkbloom-enclave info. Without this step the provider cannot advertise a hardware trust level, and the coordinator will not route privacy-gated traffic to it.
  10. Offer MDM enrollment. Downloads the device-attestation profile from POST /v1/enroll and opens System Settings.

2.C Manual install (for hosts that can’t pipe curl)

🤖 Let your agent do it: “Walk me through a manual Darkbloom provider install without piping any URL to bash. Tell me the curl flags, the shasum -a 256 line to verify against /v1/releases/latest, the tar command, the codesign --verify line, and the ~/.zshrc PATH edit. Then run darkbloom doctor and confirm exit 0.”

# 1. Download the latest macOS ARM64 bundle
# 2. Verify SHA-256 against the value in the release record
# 3. Extract to ~/.darkbloom
# 4. Verify code signature
codesign --verify --verbose ~/.darkbloom/bin/darkbloom
# 5. Add to PATH
echo 'export PATH="$HOME/.darkbloom/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# 6. Run doctor
darkbloom doctor

2.D Post-install verification

darkbloom --version
darkbloom doctor
darkbloom status

darkbloom doctor exits non-zero on any critical check failure. Pass --strict to also treat warnings as failures. This step catches bad installs (missing Secure Enclave provisioning, unsigned binary, unenrolled MDM, etc.), so don’t skip it.

The current provider is Swift (provider-swift/). Eigen Labs deprecated a prior Rust provider in May 2026 (#255). Old blog posts or guides that reference cargo, rustup, or darkbloom-rs describe a system that no longer exists. Install the Swift provider only.

2.E Configuration file

Canonical path: ~/.config/darkbloom/provider.toml. The loader also reads legacy paths (~/.dginf, ~/.eigeninference).

Minimal example (from docs/provider/installation.md):

[provider]
name = "darkbloom-mac16-1"
memory_reserve_gb = 4
auto_update = true
auto_restart = true

[backend]
enabled_models = []
idle_timeout_mins = 60
max_model_slots = 3

[gemma_optimizations]
prefill_layer18 = true
weighted_r1 = true

[coordinator]
url = "wss://api.darkbloom.dev/ws/provider"
private_only = false

Both Gemma controls default ON when the section or either key is absent. Provider TOML is authoritative; set a key to false and run darkbloom restart for a durable rollback.

2.F Updating

# Check for a newer release without installing
darkbloom update --check-only

# Download, verify hashes, and atomically replace the binary
darkbloom update

# Enable / disable automatic update checks at every startup
darkbloom autoupdate enable
darkbloom autoupdate disable

If the launchd service is loaded, the update path restarts it automatically.

2.G Uninstalling

# If experimental fan control was enabled, restore Auto and remove it first
sudo darkbloom fan uninstall

# Stop the daemon and remove the launchd plist
darkbloom stop --uninstall

# Remove the MDM profile (System Settings must be used for the actual removal)
darkbloom unenroll

# Remove local data (optional)
rm -rf ~/.darkbloom
rm -rf ~/.config/darkbloom

Note: sudo darkbloom fan enable is a separately opted-in root helper, not part of the standard install. It is experimental. The installer does not call it automatically, and you should not enable it without knowing what it does.

2.H Earnings and economics

🤖 Let your agent do it: “Open https://darkbloom.dev/earn and read the calculator disclaimer + tooltip. Quote both back to me verbatim. Then list three assumptions the calculator makes (bandwidth model, duty cycle, demand matching). Do not summarize — quote.”

Pricing mechanics, from the consumer quickstart:

“Darkbloom uses per-token pricing. Platform-set model prices are returned by GET /v1/pricing; if no platform price is configured, the fallback is $0.05 per 1M input tokens and $0.20 per 1M output tokens. Every charged request has a $0.0001 (100 micro-USD) minimum. During public alpha the platform fee is 0%, so providers keep 100% of the per-token revenue.”

The 0% platform fee is a temporary promotional rate. Do not build a long-term earnings projection against it. Real economics arrive when the fee kicks back in.

Calculator assumptions, from darkbloom.dev/earn:

“Estimated earning, not guaranteed. While the system is bootstrapping, we are seeing significant variation in earning levels among providers using the same machine type. The default duty cycle is 5% to reflect this.”

“How this estimate is calculated: The estimate assumes bandwidth-limited, single-stream decoding, with duty cycle as the only adjustable input.”

Calculator outputs are not guaranteed revenue. A widely-cited figure of “$146/month for Qwen 3.6 on a 32 GB M1 Mac” circulates on X as a projection; the underlying post is itself skeptical, the assumption set is narrow (bandwidth-limited single-stream decoding, 5% duty cycle, specific demand profile), and a 32 GB M1 Mac is below the current 48 GB provider-eligibility floor anyway. Use the calculator to size ranges, not to make hardware purchase decisions.

Two real-world risks from the Wavect review:

  • Issue #264: a connected Mac receiving no inference jobs for more than a day. Eligibility and uptime do not create customer demand; the calculator does not model demand.
  • Issue #550: Metal memory pressure on a 256 GB M3 Ultra under sustained provider traffic. This is one report against one version and configuration, so it is not proof that every node will fail. It is, however, reason enough to test physical footprint, memory compression, termination, and host recovery, rather than relying on process RSS.

Operational rule of thumb from the docs: do not buy a Mac from an earnings calculator. Start with hardware you already own. Track net revenue per available hour and per active inference hour across at least two settlement periods before generalizing.


3. Troubleshooting

SymptomCauseFix
Error: Darkbloom requires macOS with Apple SiliconWrong OS or architectureRun on an Apple Silicon Mac with macOS 14+. Intel Macs and macOS <14 are not supported and never will be.
Bundle hash mismatchCorrupted download or tampered bundleRe-run installer; check /v1/releases/latest for the canonical hash.
Code signature could not be verifiedBinary unsigned or modifiedRe-download from the coordinator. Do not run an unsigned darkbloom binary.
darkbloom: command not foundPATH not updatedsource ~/.zshrc or add ~/.darkbloom/bin to PATH.
Coordinator unreachableFirewall / DNS / coordinator maintenanceCheck curl https://api.darkbloom.dev/health.
Provider running but earning zeroIdle market — no jobs routed to your machineSee issue #264. Track for ≥48h before assuming a bug.
Provider running but host becomes unresponsiveMetal memory pressure under sustained trafficSee issue #550. Lower max_model_slots, raise memory_reserve_gb.
doctor exits non-zero on enclave infoSecure Enclave identity not provisionedRe-run installer (step 9) or darkbloom-enclave info directly. Without this, you do not get the hardware trust level and miss privacy-gated traffic.
Authorization: Bearer ... returns 401Wrong key prefix or expired Privy JWTAPI keys look like sk-db-...; Privy JWTs look like eyJ.... Refresh the JWT.
Old instructions reference cargo / Rust installRust provider deprecated May 2026Use the Swift provider (current). See 2.D.

Primary (vendor / project-owned):

Secondary:

Independent evidence:

Background:

Sources

#ai#local-inference#apple-silicon#darkbloom#eigen-labs#provider

Submit a take

Have a different read on this? Drop a comment below — your email isn't published, and I read every one. Nothing leaves the site until I approve it.

Your email address will not be published. Required fields are marked.