# 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](#what-it-does) - [Trust model](#trust-model) - [Repository layout](#repository-layout) - [Screenshots](#screenshots) - [Quick start](#quick-start) - [Self-hosted deployment](#self-hosted-deployment-docker-compose) - [Development (API)](#development-api-python) ## What it does At a high level: 1. Your integration creates an invoice (defined in XMR). 2. The UI shows payment instructions (address + amount). 3. The system observes the chain using view-only wallet access to detect payments and update invoice status. 4. 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 UI - `api/`: API service (Python) - `docker-compose.yml`: local stack and self-hosted deployment - `nginx/`: 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) 1. Copy the environment template and fill in required values: ``` cp .env.example .env ``` 2. Set required values in `.env`: - `POSTGRES_USER`, `POSTGRES_PASSWORD`, `POSTGRES_DB` - `API_KEYS`, `API_KEY_ENCRYPTION_KEY` - `SITE_URL` (public URL for the UI) - Monero view-only wallet settings (`MONERO_WALLET_RPC_*`) and daemon URL - `MONERO_DAEMON_URL` if you use your own daemon 3. 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` - Or point to an external wallet-rpc service: - Set `MONERO_WALLET_RPC_URLS`, `MONERO_WALLET_RPC_USER`, `MONERO_WALLET_RPC_PASSWORD`, and `MONERO_WALLET_RPC_WALLET_PASSWORD` 4. 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_ADDRESS` and `FOUNDER_VIEW_KEY` The UI uses the same flag (via Compose), so `/donate` stays unavailable unless donations are explicitly enabled. ## Development (API, Python) 1. Set environment variables (see `api/.env.example`): ``` export DATABASE_URL=postgresql://xmrcheckout:xmrcheckout@localhost:5432/xmrcheckout export API_KEYS=change-me-1 ``` 2. Install dependencies: ``` python -m venv .venv source .venv/bin/activate pip install -r api/requirements.txt ``` 3. Start the API: ``` uvicorn api.app.main:app --reload ``` The API listens on `http://127.0.0.1:8000`.