A secure, self-hosted QR code generator for WireGuard configurations.
Built with security in mind. Your keys never leave your infrastructure.
🌐 Live Demo • Features • Security • Setup
- 🔐 Form-based QR Generation - Enter config details and generate QR codes instantly
- 📁 File Upload Support - Upload
.conffiles to generate QR codes - ✅ Config Validation - Real-time validation ensures configs are correct before generating
- 💾 Download Configs - Export your configurations as
.conffiles - 🔑 Key Generator - Built-in WireGuard keypair generation
- 🎨 Modern UI - Clean Catppuccin Macchiato inspired theme
- 📱 Mobile Friendly - Responsive design works on all devices
Zero-Storage Architecture - Your configurations are never stored, logged, or persisted anywhere.
- ❌ No server-side storage - Configs exist only during request/response
- ❌ No browser storage - No localStorage, sessionStorage, or cookies
- ❌ No logging - Config contents are never written to logs
- ✅ Client-side processing - Downloads happen entirely in your browser
- ✅ Memory-only validation - All operations are ephemeral
- ✅ Self-hosted - Full control over your infrastructure
Why self-host? Public QR generators might expose your private keys to third parties. This app ensures your WireGuard secrets stay yours.
services:
wireguard-qr:
container_name: wireguard-qr
image: rig05/wireguard-qr:latest
restart: always
user: 1000:1000
ports:
- 127.0.0.1:5182:5182docker-compose up -dNote
Only exposes port internally. Intended for use locally or behind reverse proxy with SSL.
Remove 127.0.0.1: to expose port externally.
# Clone repository
git clone https://github.com/rig0/wireguard-qr
cd wireguard-qr
# Install dependencies
npm install
# Start application
node app.jsThe application will be available at http://localhost:5182
- Manual Entry: Fill out the WireGuard config form and click "Create QR"
- File Upload: Upload an existing
.conffile to generate a QR code - Generate Keys: Use the built-in key generator for new configurations
- Download: After generating a QR code, download the config for safekeeping
- Port: Default
5182(configurable viaPORTenvironment variable) - Reverse Proxy: Recommended for production deployments
- Private keys and preshared keys are masked (password fields)
- All forms clear after QR generation
- Forms reset on page reload
- No browser autocomplete for sensitive fields
- Validates Base64 key format (44 characters)
- Checks CIDR notation for IPs
- Validates endpoint format (host:port)
- Ensures all required fields are present
- Provides clear error messages for invalid configs
- Downloads are generated client-side using Blob API
- No server request made for downloads
- Config cleared from memory when popup closes
- No network transmission of complete configs
This is a personal project, but suggestions are welcome! Open an issue to discuss improvements.

