mirror of
https://github.com/Such-Software/xmrcheckout.git
synced 2026-10-17 05:51:34 +02:00
af60d1d4c68a8fae5a2611093cdac71606762339
xmrcheckout.com
Non-custodial Monero checkout software for merchants. Payments go directly from the customer to the merchant wallet.
This project is intentionally conservative by design:
- It never requests or stores private spend keys.
- It never signs transactions.
- It never moves funds on behalf of users.
- View-only access (wallet address + private view key) is the maximum trust boundary.
Contents
- What it does
- Trust model
- Repository layout
- Screenshots
- Quick start
- Self-hosted deployment
- Development (API)
What it does
At a high level:
- Your integration creates an invoice (defined in XMR).
- The UI shows payment instructions (address + amount).
- The system observes the chain using view-only wallet access to detect payments and update invoice status.
- Optional integrations (for example webhooks) can be used to trigger your internal order flow.
What it does not do:
- It does not provide custody, refunds, or any fund-moving automation.
- It does not act as a financial intermediary.
- It does not touch fiat rails in the core system.
Trust model
- Funds always move from the customer to the merchant wallet; xmrcheckout only observes the chain to detect payments.
- The maximum permission level is view-only wallet access (wallet address + private view key).
- If any configuration or integration implies spend authority, treat it as a misconfiguration.
Repository layout
ui/: web UIapi/: API service (Python)docker-compose.yml: local stack and self-hosted deploymentnginx/: reverse proxy / TLS termination for local HTTPS
Quick start
Homepage only (Docker)
docker build -t xmrcheckout-home .
docker run --rm -p 8080:80 xmrcheckout-home
Open http://localhost:8080.
Full stack (Docker Compose)
docker compose up --build
Open https://localhost for the UI (HTTP redirects to HTTPS).
The API runs on http://127.0.0.1:8000 and Postgres on port 5432.
Self-hosted deployment (Docker Compose)
- Copy the environment template and fill in required values:
cp .env.example .env
- Set required values in
.env:
POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_DBAPI_KEYS,API_KEY_ENCRYPTION_KEYSITE_URL(public URL for the UI)- Monero view-only wallet settings (
MONERO_WALLET_RPC_*) and daemon URL MONERO_DAEMON_URLif you use your own daemon
- Choose a wallet-rpc target and provision view-only wallets:
- Use the bundled wallet-rpc containers:
- Set
MONERO_WALLET_RPC_URLS=http://wallet-rpc-reconciler-1:18083,http://wallet-rpc-reconciler-2:18083,http://wallet-rpc-reconciler-3:18083
- Set
- Or point to an external wallet-rpc service:
- Set
MONERO_WALLET_RPC_URLS,MONERO_WALLET_RPC_USER,MONERO_WALLET_RPC_PASSWORD, andMONERO_WALLET_RPC_WALLET_PASSWORD
- Set
- Start the stack:
docker compose up --build -d
Optional: donations (disabled by default)
Donation endpoints and UI are off by default for self-hosted deployments. To enable donations:
- Set
DONATIONS_ENABLED=true - Set
FOUNDER_PAYMENT_ADDRESSandFOUNDER_VIEW_KEY
The UI uses the same flag (via Compose), so /donate stays unavailable unless donations are explicitly enabled.
Development (API, Python)
- Set environment variables (see
api/.env.example):
export DATABASE_URL=postgresql://xmrcheckout:xmrcheckout@localhost:5432/xmrcheckout
export API_KEYS=change-me-1
- Install dependencies:
python -m venv .venv
source .venv/bin/activate
pip install -r api/requirements.txt
- Start the API:
uvicorn api.app.main:app --reload
The API listens on http://127.0.0.1:8000.
Languages
TypeScript
67.1%
Python
28.5%
CSS
3.1%
JavaScript
0.6%
Dockerfile
0.4%
Other
0.3%