Self-Host & Verify

Don't trust us — verify. This page explains exactly how to check that what's running at monero-web.com matches the public source code, and how to run the entire stack on your own hardware.

The short version: the frontend is a static site — clone the repo and serve it with python3 -m http.server 8080. No build step, no npm, no installs. Your keys are derived locally either way. The only thing that changes when you self-host is whose light-wallet server scans the chain with your view key.

Option 1 — Verify the live site

Every file served at monero-web.com is SHA-256 hashed in MANIFEST.txt, which is committed to GitHub. You can verify the live deployment matches the source code like this:

# 1. Fetch the MANIFEST from the live site
curl -sf https://monero-web.com/MANIFEST.txt -o live-manifest.txt

# 2. Check the commit it was generated from (line 2 of the file)
head -3 live-manifest.txt

# 3. Clone the repo and check out that exact commit
git clone https://github.com/Medtabka/monero-web.git
cd monero-web
git checkout <commit from step 2>

# 4. Compare — should return nothing if the files match
diff MANIFEST.txt ../live-manifest.txt

If diff returns nothing, the live files are byte-for-byte identical to that commit. Any difference means something on the live site doesn't match the published code.

To verify a single file (e.g. the signing module):

curl -sf https://monero-web.com/js/monero-send.js | sha256sum

Compare the output against the hash in MANIFEST.txt for js/monero-send.js.

Option 2 — Run the frontend locally

The frontend has zero build dependencies. Clone and serve with any static file server:

1

Clone the repo

git clone https://github.com/Medtabka/monero-web.git
cd monero-web
2

Serve locally

python3 -m http.server 8080

Then open http://localhost:8080 in your browser. You can't open index.html directly as a file — the WASM signing module uses absolute paths and won't load from a file:// URL.

3

Point at your own node (optional)

By default the dashboard calls our light-wallet server at node.monero-web.com. To use your own monero-lws instance, open the browser console on the dashboard and run:

LwsClient.setBaseUrl('https://your-lws.example.com')

Your monero-lws must serve CORS headers and use HTTPS. Note: this resets on every page reload — full self-hosting (Option 3) is the permanent solution.

Option 3 — Full self-hosted stack

To eliminate all third-party trust you need to run three things: the static frontend, a Monero full node (monerod), and a light-wallet server (monero-lws).

1

Run monerod

Install and sync a full Monero node. The initial sync takes 1–3 days depending on your hardware. See the official Monero downloads for binaries.

monerod --detach --log-file monerod.log
2

Run monero-lws

monero-lws is the light-wallet server that scans the chain for your outputs using your view key. Point it at your running monerod:

monero-lws-daemon \
  --daemon http://127.0.0.1:18081 \
  --rest-server http://127.0.0.1:8443 \
  --db-path ./lws-db \
  --network main
3

Serve the frontend

Any static file server works:

python3 -m http.server 8080

Open http://localhost:8080 and point the LWS URL at your local monero-lws via the browser console: LwsClient.setBaseUrl('http://127.0.0.1:8443')

What you're trusting in each setup

Setup Frontend View key goes to Spend key
monero-web.com (default) Cloudflare CDN Our server Browser only
Local frontend + our LWS Your machine Our server Browser only
Full self-hosted Your machine Your server Browser only
In every setup: your spend key and seed phrase never leave your browser tab. Transaction signing happens locally using the bundled WebAssembly module. This is true whether you use monero-web.com or run it yourself.

Questions or issues

If you find a discrepancy between the live site and the source code, or a security issue, please report it at security@monero-web.com or open an issue on GitHub.