For a while now, I've been using Cloudflare Email Routing across several domains as a way to organize my email and for privacy reasons. It's a pretty top-tier tool that Cloudflare provides practically for free if you host your domain with them.

The problem with most of these kinds of services from Cloudflare is that the UI is practically built for enterprises, not for daily use. If you've used it, you know that logging into the Cloudflare dashboard every time you want to create a quick alias is quite a hassle, especially from a mobile phone.

To solve this, I created vuzon: a simple, self-hostable, and mobile-optimized web interface that connects directly to the Cloudflare API to manage Email Routing. It is designed exclusively for personal use in your homelab or private network.

Key Features

  • Quickly create aliases and routing rules.
  • Manage recipients (destination addresses).
  • Enable or disable rules with a single click.
  • Fully responsive interface with PWA support.
  • By installing it on your own server, you maintain absolute control over everything. It works with your own Cloudflare account and domains.

Quick Installation via Docker Compose

Deployment is very straightforward using Docker. Follow these steps to get it up and running on your machine:

1) Create and configure the .env file

# 1) Required: Token with permissions for Email Routing and your domain
CF_API_TOKEN=your_cloudflare_api_token
DOMAIN=yourdomain.com

# Credentials to access the vuzon dashboard
AUTH_USER=admin
AUTH_PASS=your_secure_password

# 2) Recommended: Define a stable secret to prevent logouts when restarting the container
SESSION_SECRET=a_random_and_secure_value

# 3) Optional: Port where the service will be exposed on the host (default is 8001)
VUZON_PORT=8001

# 4) Optional: Only as a documentation/proxy reference (the app does not read it at runtime)
BASE_URL=https://vuzon.yourdomain.com

⚠️ Note on CF_API_TOKEN permissions: The custom token you generate in Cloudflare strictly requires the following permissions:

  • Account → Email Routing Addresses → Edit (To manage recipients).
  • Zone → Email Routing Rules → Edit (To create and toggle aliases).
  • Zone → Zone → Read (Required solely for vuzon to auto-detect your CF_ZONE_ID and CF_ACCOUNT_ID based on your DOMAIN).

(Tip: You can generate a secure value for SESSION_SECRET by running openssl rand -hex 32 in your terminal).

2) Create the docker-compose.yml file

In the same directory where you saved your .env, create the docker-compose.yml file with the official project content:

services:
  vuzon:
    container_name: vuzon
    image: ghcr.io/kn990x/vuzon
    env_file:
      - .env
    environment:
      PORT: "8001"
    restart: unless-stopped
    ports:
      - "${VUZON_PORT:-8001}:8001"

(Note: vuzon uses client-side signed cookies (vuzon_session) to handle authentication securely, so it does not require persisting data in local folders or mounting session volumes to your server's disk).

3) Deploy

To pull the image and start the service, run this in your terminal:

docker compose pull && docker compose up -d

Once the container has started, you can open http://localhost:8001 (or your server's local IP) in your browser and log in using the username (AUTH_USER) and password (AUTH_PASS) you defined earlier.

I highly recommend placing vuzon behind a reverse proxy (like Caddy, Traefik, or Nginx Proxy Manager) with an SSL certificate (Let's Encrypt) and enabling the TRUST_PROXY=1 variable in your .env if you plan to access it from outside your home network.