Connect Your Node
Point am-i.exposed at your own mempool instance for maximum privacy. This guide covers Umbrel, Start9, Docker, and bare-metal setups.
Why Self-Host?
When you use the public mempool.bitcoin-austria.at API, their servers see your IP address and every address and transaction you query. This creates a log linking your network identity to your Bitcoin activity.
By pointing am-i.exposed at your own node, API requests never leave your local network.
Umbrel
Install the Umbrel App
The easiest way. Install am-i.exposed directly on your Umbrel and it automatically connects to your local mempool instance. No CORS headers, no SSH tunnel, no configuration needed.
- 1.Open your Umbrel dashboard and go to the App Store
- 2.Click the three-dot menu (top right) and select Community App Stores
- 3.Paste the store URL and click Add:
https://github.com/Copexit/copexit-umbrel-app-store
- 4.Find am-i.exposed in the store and click Install
The app detects your local mempool automatically. All API requests stay on your local network and Chainalysis lookups are routed through a built-in Tor proxy.
Manual Setup
For Start9, Docker, bare-metal, or if you prefer using the am-i.exposed website with your own node instead of the Umbrel app.
Two things must be true for manual setup
- Your mempool instance must have CORS headers enabled (mempool does not include them by default)
- Your URL must end with /api (e.g., http://localhost:3006/api)
Step 1: Add CORS Headers
This is the #1 reason connections fail. Mempool's nginx config does not include CORS headers by default. Without them, your browser silently blocks every API response - even if the network connection is working perfectly.
Add these lines to your mempool nginx config, inside the existing location /api/ { } block:
# Add these lines inside your existing location /api/ { } block
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
if ($request_method = 'OPTIONS') {
return 204;
}After editing, reload nginx:
nginx -s reload
Where to find the nginx config depends on your platform - see the platform-specific sections below.
Step 2: SSH Tunnel
This site is served over HTTPS. Browsers block HTTP requests from HTTPS pages (called mixed content) unless the target is localhost. An SSH tunnel forwards your node's mempool port to localhost on your machine, bypassing this restriction.
Open a terminal and run:
ssh -L 3006:localhost:3006 user@your-node-ip
Replace user@your-node-ip with your node's SSH credentials. This maps port 3006 on your desktop to port 3006 on your node.
Then in the am-i.exposed settings (the gear icon), enter:
http://localhost:3006/api
Umbrel (Manual)
If you prefer using the am-i.exposed website instead of the Umbrel app, you can point it at your Umbrel's mempool instance. The mempool app listens on port 3006 via Umbrel's app_proxy container.
1. Add CORS headers
SSH into your Umbrel and exec into the mempool web container:
ssh umbrel@umbrel.local docker exec -it mempool_web_1 sh vi /etc/nginx/conf.d/nginx-mempool.conf
Find the location /api/ { block and add the CORS headers shown above. Then reload nginx inside the container:
nginx -s reload
2. SSH tunnel
From your desktop, open a terminal:
ssh -N -L 3006:localhost:3006 umbrel@umbrel.local
3. Configure am-i.exposed
Click the gear icon in the header and enter:
http://localhost:3006/api
Click Apply. You should see a green checkmark if everything is configured correctly.
Start9 / StartOS
Start9 serves mempool over HTTPS on a .local hostname with a self-signed certificate. There is no bare port to SSH tunnel to, so the approach is different from Umbrel.
1. Install the StartOS root CA
Your browser needs to trust the StartOS certificate authority. Download the CA from your StartOS dashboard and install it in your system/browser trust store. Without this, HTTPS requests to your .local address will fail.
2. Add CORS headers
SSH into your Start9 and edit the mempool nginx config to add the CORS headers shown above. The process is similar to Umbrel - find the running mempool container and edit its nginx config.
3. Configure am-i.exposed
Use your mempool's LAN address in the settings:
https://<your-mempool-hostname>.local/api
Replace <your-mempool-hostname> with the hostname shown in your StartOS dashboard for the mempool service.
Docker / Bare Metal
If you run the official mempool/mempool Docker image or a bare-metal installation:
Docker
The default Docker setup maps the frontend nginx to port 80 (or whichever port you configured). To persist CORS headers, mount a custom nginx config:
# Copy the default config out of the container docker cp mempool_frontend_1:/etc/nginx/conf.d/nginx-mempool.conf ./nginx-mempool.conf # Edit it to add CORS headers (see Step 1 above) # Restart with the custom config mounted docker run -v $(pwd)/nginx-mempool.conf:/etc/nginx/conf.d/nginx-mempool.conf ...
Bare metal
Edit your mempool nginx config directly. The default location is typically /etc/nginx/conf.d/nginx-mempool.conf or wherever you placed it during installation.
Remote access
If your node is on the same machine, use http://localhost:<port>/api directly. If it is on another machine on your network, use an SSH tunnel as described above.
Alternative: Local CORS Proxy
If you cannot or do not want to modify your node's nginx config, you can run a small reverse proxy on your desktop that adds CORS headers. This sits between your browser and the SSH tunnel.
Using Caddy
Caddy is a single-binary web server. Create a file called Caddyfile:
:8090 {
reverse_proxy localhost:3006
header Access-Control-Allow-Origin *
header Access-Control-Allow-Methods "GET, OPTIONS"
@options method OPTIONS
respond @options 204
}Then run caddy run in the same directory. In am-i.exposed settings, enter:
http://localhost:8090/api
The flow: browser -> Caddy (:8090, adds CORS) -> SSH tunnel (:3006) -> your node's mempool.
Alternative: Tor Browser + .onion
If both am-i.exposed and your mempool instance are accessed via .onion addresses in Tor Browser, there is no mixed-content blocking (both are HTTP) and Tor Browser relaxes CORS restrictions for .onion-to-.onion requests.
This requires a .onion mirror of am-i.exposed. If one is available, use Tor Browser to visit the .onion URL, then enter your mempool's .onion address in the settings.
You still need CORS headers on your mempool nginx if the .onion addresses differ (which they will, since they are separate hidden services).
Troubleshooting
"Connection failed" after setting up SSH tunnel
Cause: Missing CORS headers
This is the #1 issue. Your SSH tunnel works at the network level, but your browser blocks the response because mempool's nginx does not include CORS headers. Add the CORS headers from Step 1 and reload nginx.
"Blocked: HTTP from HTTPS page"
Cause: Mixed content
You are entering an HTTP URL that is not localhost (e.g., http://umbrel.local:3006). Use an SSH tunnel to forward the port to localhost, then use http://localhost:3006/api.
Health check passes but analysis returns no results
Cause: Missing /api suffix
Make sure your URL ends with /api. For example, http://localhost:3006/api - not http://localhost:3006. The app will warn you about this if it detects a missing suffix.
"Timeout (10s)"
Cause: No connection
Check that your SSH tunnel is still running (the terminal session must stay open). Verify the port number matches your mempool instance. Check firewall rules on your node.
"HTTP 502" or "HTTP 503"
Cause: Backend not ready
Your mempool frontend (nginx) is reachable, but the backend is not responding. This usually means the mempool backend is still syncing the blockchain. Wait for it to finish and try again.
CORS changes lost after Umbrel restart
Cause: Docker container recreated
Umbrel recreates containers on updates. You need to re-apply CORS headers after each restart, or mount a persistent custom nginx config via Docker volume.
Verifying It Works
- 1.Click the gear icon in the header and enter your URL (e.g., http://localhost:3006/api)
- 2.Click Apply - you should see a green checkmark and "Connected. Using custom endpoint."
- 3.Run an analysis on any transaction or address - results should load normally
- 4.The gear icon shows an orange dot when a custom endpoint is active