Local network tool that transparently redirects all X/Twitter traffic to xcancel.com, allowing you to browse Twitter content without directly accessing X's servers.
Help choosing the right setup for your needs
This guide helps you navigate the various options for setting up xcancel-forwarder. Use the flowcharts below to determine the best approach for your situation.
START HERE
│
├─ Do you want the easiest setup?
│ └─ YES → Use Web Wizard (10-15 min) → DONE
│
├─ Are you setting up on a headless server via SSH?
│ └─ YES → Use CLI Wizard (5-10 min) → DONE
│
└─ Do you want to understand how everything works?
└─ YES → Continue reading this guide
Choose this if:
Launch: Web Wizard
Time: 10-15 minutes
Choose this if:
Command: python3 scripts/setup-wizard.py
Time: 5-10 minutes
Choose this if:
Start: Follow QUICKSTART.md
Time: 20-30 minutes
Do you already have Pi-hole?
│
├─ YES → Use Pi-hole DNS override
│ └─ Guide: PIHOLE_SETUP.md
│ └─ Pros: Easy web UI, already familiar
│ └─ Cons: None
│
└─ NO
│
├─ Do you want a dedicated DNS server?
│ │
│ ├─ YES → Use included dnsmasq
│ │ └─ Guide: DNSMASQ_SETUP.md
│ │ └─ Pros: Fast, lightweight, full-featured
│ │ └─ Cons: One more container to manage
│ │
│ └─ NO
│ │
│ ├─ Can you access your router's DNS settings?
│ │ │
│ │ ├─ YES → Use router DNS override
│ │ │ └─ Guide: OTHER_DNS.md (Router section)
│ │ │ └─ Pros: Network-wide, no additional services
│ │ │ └─ Cons: Router-dependent, may be limited
│ │ │
│ │ └─ NO → Use per-device hosts file
│ │ └─ Guide: OTHER_DNS.md (Hosts file section)
│ │ └─ Pros: No DNS server needed, simple
│ │ └─ Cons: Must configure each device individually
| Method | Difficulty | Network-Wide | Best For | Limitations |
|---|---|---|---|---|
| Pi-hole | Easy | ✅ Yes | Existing Pi-hole users | Requires Pi-hole |
| dnsmasq | Medium | ✅ Yes | Dedicated DNS server | One more container |
| Router | Medium | ✅ Yes | Simple network-wide setup | Router-dependent |
| Hosts file | Easy | ❌ No | Single device, no Docker DNS | Per-device config |
Setup time: 5 minutes
Setup time: 10-15 minutes
Setup time: 10 minutes (varies by router)
Setup time: 5 minutes per device
Do you want HTTPS interception?
│
├─ NO → Skip SSL setup (HTTP only)
│ └─ Pros: Simplest, no certificate management
│ └─ Cons: Browser warnings for https://twitter.com
│ └─ Action: Comment out SSL config in nginx
│
└─ YES
│
├─ Do you want the easiest SSL setup?
│ │
│ ├─ YES → Use mkcert
│ │ └─ Guide: SSL_SETUP_MKCERT.md
│ │ └─ Pros: Automatic CA installation, simple commands
│ │ └─ Cons: Requires mkcert installation
│ │ └─ Time: 10 minutes
│ │
│ └─ NO
│ │
│ └─ Want full control over CA parameters?
│ │
│ ├─ YES → Use manual OpenSSL
│ │ └─ Guide: SSL_SETUP.md
│ │ └─ Pros: Complete control, learn PKI
│ │ └─ Cons: More complex, manual steps
│ │ └─ Time: 20-30 minutes
│ │
│ └─ NO → Use mkcert (it's really easier)
| Method | Difficulty | Setup Time | Best For | Learn PKI |
|---|---|---|---|---|
| No SSL | Easiest | 0 min | HTTP-only, testing | No |
| mkcert | Easy | 10 min | Most users, quick setup | No |
| OpenSSL | Hard | 30 min | Learning, full control | Yes |
Browser experience: Works for http://twitter.com, warnings for https://twitter.com
Browser experience: Seamless HTTPS, no warnings
Installation: brew install mkcert (macOS), package manager on Linux
Browser experience: Seamless HTTPS, no warnings (once CA installed)
Learning value: High - understand certificate signing, trust chains
Do you already know nginx?
│
├─ YES → Use nginx (default)
│ └─ Pros: You're familiar, powerful, widely used
│ └─ Cons: More complex config
│
└─ NO
│
├─ Do you want the simplest possible configuration?
│ │
│ ├─ YES → Use Caddy
│ │ └─ Guide: CADDY_ALTERNATIVE.md
│ │ └─ Pros: 4-line config, easier to understand
│ │ └─ Cons: Less common, different paradigm
│ │ └─ Config: docker-compose.caddy.yaml
│ │
│ └─ NO → Use nginx (default)
│ └─ Pros: Industry standard, lots of examples
│ └─ Cons: 27-line config vs Caddy's 4 lines
| Feature | nginx | Caddy |
|---|---|---|
| Config Lines | 27 | 4 |
| Learning Curve | Steeper | Gentler |
| Performance | Excellent | Excellent |
| Common Issues | More docs available | Less common, fewer examples |
| Industry Usage | Very common | Growing |
| Best For | Production, familiarity | Simplicity, learning |
Note: Both perform identically for this use case. The difference is purely configuration complexity.
Do you have Pi-hole or dnsmasq DNS server on the Docker host?
│
├─ YES → Use macvlan networking
│ └─ Pros: Dedicated IP, DNS server can reach it
│ └─ Cons: Docker host can't reach container directly
│ └─ Setup: Uncomment macvlan section in docker-compose.yaml
│
└─ NO
│
├─ Do you want nginx on a separate IP?
│ │
│ ├─ YES → Use macvlan networking
│ │ └─ Pros: Clean IP separation, dedicated address
│ │ └─ Cons: More complex, Docker host isolation
│ │
│ └─ NO → Use bridge networking (default)
│ └─ Pros: Simpler, standard Docker
│ └─ Cons: Uses host IP, port forwarding
| Mode | Complexity | nginx IP | Best For | Limitations |
|---|---|---|---|---|
| Bridge | Simple | Host IP | Simple setups | Port conflicts possible |
| Macvlan | Medium | Dedicated IP | DNS server on host, IP separation | Host can’t reach directly |
Configuration: Default in docker-compose.yaml
Configuration: Uncomment macvlan section, set IP/subnet in .env
Total Time: 20-25 minutes
Total Time: 15-20 minutes
Total Time: 60-90 minutes (educational)
Total Time: 10 minutes
Total Time: 20-25 minutes
Use this to finalize your choices:
Once decided, proceed to the appropriate guides:
python3 scripts/setup-wizard.pyRecommended setup:
Action: Launch Web Wizard
Recommended setup:
Action: Read QUICKSTART.md and follow along
Recommended setup:
Action: Run python3 scripts/setup-wizard.py
A: Yes! Most choices are not permanent:
A: All setups are equally reliable once configured. Choose based on your comfort level, not reliability concerns.
A: This is intended for home networks. For “production home use”:
A:
A: No problem! Most choices can be changed by:
docker compose down && docker compose up -dSee relevant guide for your desired configuration.