This guide walks through the full setup of a Tails-based Monero cold wallet, using a custom LUKS management script, Monero CLI, and proper offline signing workflow.
Boot into Tails, offline.
Open a terminal and identify the correct USB device:
lsblkFind your wallet USB partition (example: /dev/sdb1).
Double-check by size — do not guess.
Run the one-time destructive initialization:
sudo ./xmr_luks.sh init /dev/sdb1This will:
- Ask for
YES - Write a fresh LUKS header
- Open it as
/dev/mapper/xmrwallet - Format ext4
- Mount at
/mnt/xmrwallet
This creates your encrypted storage permanently.
Every time you boot Tails:
lsblk
sudo ./xmr_luks.sh open /dev/sdb1Mountpoint:
/mnt/xmrwallet
When done:
sudo ./xmr_luks.sh closeDownload Monero CLI on a normal machine, verify signatures, then bring the tarball into Tails on a separate USB.
Inside Tails:
mkdir -p ~/monero-cli
cp /media/amnesia/<tools-usb>/monero-linux-x64-*.tar.bz2 ~/monero-cli/
cd ~/monero-cli
tar xf monero-linux-x64-*.tar.bz2
cd monero-*Now the CLI tools (monero-wallet-cli, monerod, etc.) are ready.
Make sure:
- Tails is offline
- LUKS is opened
- Monero CLI is extracted
Run:
./monero-wallet-cli --generate-new-wallet /mnt/xmrwallet/xmr_cold_wallet --offlineIt will prompt for:
- Wallet password
- Display your 25-word mnemonic seed
- Show address
- (Optional) View/spend keys via in-wallet commands later
Write seeds on paper — no digital copies.
Wallet files now live ONLY in:
/mnt/xmrwallet/xmr_cold_wallet
/mnt/xmrwallet/xmr_cold_wallet.keys
Open it:
./monero-wallet-cli --wallet-file /mnt/xmrwallet/xmr_cold_wallet --offlineInside:
address
viewkey
Write these down or move via QR airgap.
./monero-wallet-cli --generate-from-view-key xmr_watchInput:
- Standard address
- Private view key
- Restore height (0 or approximate)
This wallet cannot spend, but can:
- Generate new receive addresses
- Sync with the network
- Track balance
You can receive XMR using:
- Addresses from the watch-only wallet
- Addresses from the cold wallet (offline)
Funds always belong to the cold wallet keys.
This is the secure, offline signing workflow.
./monero-wallet-cli --wallet-file xmr_watchPrevent relaying:
set do-not-relay 1
Create a transaction:
transfer 2 44...destaddress... 1.234
An unsigned_monero_tx file is written.
Copy it to a sneakernet USB.
Exit.
Boot Tails offline. Open LUKS:
sudo ./xmr_luks.sh open /dev/sdb1Open the cold wallet:
./monero-wallet-cli --wallet-file /mnt/xmrwallet/xmr_cold_wallet --offlineSign:
sign_transfer /path/to/unsigned_monero_tx
This creates:
signed_monero_tx
Copy to sneakernet USB.
Close wallet + close LUKS:
exit
sudo ./xmr_luks.sh closeBack on your online machine:
./monero-wallet-cli --wallet-file xmr_watchSubmit:
submit_transfer /path/to/signed_monero_tx
Boom.
The spend key never touched a networked system — maximum OPSEC.
After any cold wallet session:
exitwalletsudo ./xmr_luks.sh close- Unplug encrypted USB
- Shut down Tails
- Use a fresh Tails session only for wallet work
Optional but pro-tier:
- Use QR codes for the unsigned/signed tx (reduces USB attack surface)
- Don’t reuse the same Tails stick for browsing & cold wallet work