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.

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
- A Darkbloom account at console.darkbloom.dev.
- An API key from Settings → API Keys, or via
POST /v1/keysauthenticated with a Privy JWT. The coordinator’srequireAuthaccepts both forms: API keys look likesk-db-...and Privy JWTs look likeeyJ...(consumer quickstart). - A target model ID. The live catalog is at
GET https://api.darkbloom.dev/v1/models; the quickstart example isgemma-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 ~, andpmset -g therm. Report PASS or FAIL per gate.”
| Gate | Minimum | Why |
|---|---|---|
| Architecture | Apple Silicon only | Intel Macs and Linux/Windows are not supported. The installer preflight fails with Darkbloom requires macOS with Apple Silicon. |
| macOS | 14 (Sonoma) or newer | Hard gate in the installer preflight. |
| Unified memory | 48 GB or more | Smaller 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 disk | 100 GB recommended | Models and MLX caches fill up. |
| Internet + thermals | Stable uplink, normal thermals | Provider streams ride over wss://api.darkbloom.dev/ws/provider; see issue #550. |
Apple Silicon tier mapping:
| Mac | Unified memory | Provider-eligible? |
|---|---|---|
| MacBook Pro M4 Pro (base) | 24 GB | ❌ Below 48 GB |
| MacBook Pro M4 Pro / Max | 48 GB / 64 GB+ | ✅ |
| Mac Studio M2 Ultra | 64 GB / 192 GB | ✅ |
| Mac Studio M3 Ultra | 192 GB / 256 GB+ | ✅ |
2.B One-line install (recommended)
🤖 Let your agent do it: “Install the Darkbloom provider on this Mac. Run
curl -fsSL https://api.darkbloom.dev/install.sh | bash, thendarkbloom --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):
- Preflight. Confirms the host is macOS on Apple Silicon.
- Fetch release metadata.
GET /v1/releases/latestreturns version, bundle URL, bundle hash, binary hash, andmlx.metallibhash. - Download the bundle to a temporary path.
- Verify hashes. The installer checks the bundle,
darkbloombinary, andmlx.metallibagainst the coordinator record. - Verify the code signature with
codesign --verifyon thedarkbloombinary. - Install into
~/.darkbloom. Creates~/.darkbloom/bin/and symlinks fromDarkbloom.app/Contents/MacOS/when the.appbundle is in use. - Update
PATH. Appendsexport PATH="$HOME/.darkbloom/bin:$PATH"to~/.zshrc(or~/.bashrc). - Migrate legacy state. Copies tokens and keys from
~/.dginfor~/.eigeninferenceif those directories exist. - Provision Secure Enclave identity by running
darkbloom-enclave info. Without this step the provider cannot advertise ahardwaretrust level, and the coordinator will not route privacy-gated traffic to it. - Offer MDM enrollment. Downloads the device-attestation profile from
POST /v1/enrolland 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
curlflags, theshasum -a 256line to verify against/v1/releases/latest, thetarcommand, thecodesign --verifyline, and the~/.zshrcPATH edit. Then rundarkbloom doctorand 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/earnand 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
| Symptom | Cause | Fix |
|---|---|---|
Error: Darkbloom requires macOS with Apple Silicon | Wrong OS or architecture | Run on an Apple Silicon Mac with macOS 14+. Intel Macs and macOS <14 are not supported and never will be. |
Bundle hash mismatch | Corrupted download or tampered bundle | Re-run installer; check /v1/releases/latest for the canonical hash. |
Code signature could not be verified | Binary unsigned or modified | Re-download from the coordinator. Do not run an unsigned darkbloom binary. |
darkbloom: command not found | PATH not updated | source ~/.zshrc or add ~/.darkbloom/bin to PATH. |
Coordinator unreachable | Firewall / DNS / coordinator maintenance | Check curl https://api.darkbloom.dev/health. |
| Provider running but earning zero | Idle market — no jobs routed to your machine | See issue #264. Track for ≥48h before assuming a bug. |
| Provider running but host becomes unresponsive | Metal memory pressure under sustained traffic | See issue #550. Lower max_model_slots, raise memory_reserve_gb. |
doctor exits non-zero on enclave info | Secure Enclave identity not provisioned | Re-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 401 | Wrong key prefix or expired Privy JWT | API keys look like sk-db-...; Privy JWTs look like eyJ.... Refresh the JWT. |
Old instructions reference cargo / Rust install | Rust provider deprecated May 2026 | Use the Swift provider (current). See 2.D. |
Primary (vendor / project-owned):
- Darkbloom consumer quickstart — base URL, auth, OpenAI/Anthropic clients, fallback pricing, public-alpha fee
- Darkbloom provider installation — preflight, hash verification, PATH update, config TOML, update commands, uninstall
- Darkbloom architecture / encryption — hop-by-hop encryption model, NaCl Box, key rotation, trust levels, routing gate
- Darkbloom landing page — tagline, pricing table, install command, earnings calculator
- Darkbloom repository — repo stats (432★ / 81⑂, 949 commits, 170 releases), commit history, languages
- Darkbloom console — sign-up + provider enrollment
Secondary:
- Wavect review — Kevin Riedl, 25 Aug 2026 — third-party review covering privacy model, API compatibility, pricing, earnings caveats, production risks
- Bankless coverage — EigenLayer / restaking context
- Eigen Labs Project Darkbloom announcement — Mac economics, SE attestation, research-preview status (framing post, not a technical doc)
Independent evidence:
- Provider issue #264 — connected Mac receiving no inference jobs for >24h
- Provider issue #550 — Metal memory pressure on 256 GB M3 Ultra
Background:
- LinkedIn — public-alpha launch — operator perspective
- Reddit r/AI_Agents discussion — community skepticism around earnings
- HN thread — community discussion
Sources
- Darkbloom consumer quickstart
- Darkbloom provider installation
- Darkbloom architecture / encryption
- Darkbloom landing page
- Darkbloom repository (Layr-Labs/d-inference)
- Eigen Labs Project Darkbloom announcement
- Wavect review (third-party)
- Bankless coverage
- Provider issue #264 (no jobs >24h)
- Provider issue #550 (Metal memory pressure)
- Darkbloom console (signup + enrollment)



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.