GitHub Actions bb14ae73cc fix(uptime): fix TCP monitor UX — correct format guidance and add client-side validation
The TCP monitor creation form showed a placeholder that instructed users to enter a URL with the tcp:// scheme prefix (e.g., tcp://192.168.1.1:8080). Following this guidance caused a silent HTTP 500 error because Go's net.SplitHostPort rejects any input containing a scheme prefix, expecting bare host:port format only.

- Corrected the urlPlaceholder translation key to remove the tcp:// prefix
- Added per-type dynamic placeholder (urlPlaceholderHttp / urlPlaceholderTcp) so the URL input shows the correct example format as soon as the user selects a monitor type
- Added per-type helper text below the URL input explaining the required format, updated in real time when the type selector changes
- Added client-side validation: typing a scheme prefix (://) in TCP mode shows an inline error and blocks form submission before the request reaches the backend
- Reordered the Create Monitor form so the type selector appears before the URL input, giving users the correct format context before they type
- Type selector onChange now clears any stale urlError to prevent incorrect error messages persisting after switching from TCP back to HTTP
- Added 5 new i18n keys across all 5 supported locales (en, de, fr, es, zh)
- Added 10 RTL unit tests covering all new validation paths including the type-change error-clear scenario
- Added 9 Playwright E2E tests covering placeholder variants, helper text, inline error lifecycle, submission blocking, and successful TCP creation

Closes #issue-5 (TCP monitor UI cannot add monitor when following placeholder)
2026-03-20 01:19:43 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00
2026-03-04 18:34:49 +00:00

Charon

Charon

Your server, your rules—without the headaches.

Manage reverse proxies with a clean web interface.
No config files. No cryptic syntax. No networking degree required.

Docker Pulls Latest Release MIT License


🚀 Why Charon?

You want your apps online.

You dont want to edit config files or memorize reverse proxy syntax.

Charon gives you:

  • Automatic HTTPS certificates
  • Clean domain routing
  • Built-in security protection
  • One-click Docker app discovery
  • Live updates without restarts
  • Zero external dependencies

If you can use a website, you can run Charon.


🛡 Built-In Security

Charon includes security features that normally require multiple tools:

  • Web Application Firewall (WAF)
  • CrowdSec intrusion detection
  • Access Control Lists (ACLs)
  • Rate limiting
  • Emergency recovery tools

Secure by default. No extra containers required.

📖 Learn more about security →


Quick Start (5 Minutes)

1 Create docker-compose.yml

services:
  charon:
    image: wikid82/charon:latest
    container_name: charon
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
      - "8080:8080"
    volumes:
      - ./charon-data:/app/data
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - TZ=America/New_York
      # Generate with: openssl rand -base64 32
      - CHARON_ENCRYPTION_KEY=your-32-byte-base64-key
    healthcheck:
      test: ["CMD-SHELL", "curl -fsS http://localhost:8080/api/v1/health || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

Docker Socket Access: Charon runs as a non-root user. If you mount the Docker socket for container discovery, the container needs permission to read it. Find your socket's group ID and add it to the compose file:

stat -c '%g' /var/run/docker.sock

Then add group_add: ["<gid>"] under your service (replace <gid> with the number from the command above). For example, if the result is 998:

    group_add:
      - "998"

2 Generate encryption key:

openssl rand -base64 32

3 Start Charon:

docker-compose up -d

4 Access the dashboard:

Open your browser and navigate to http://localhost:8080 to access the dashboard and create your admin account.

http://localhost:8080

Getting Started:

Full setup instructions and documentation are available at https://wikid82.github.io/Charon/docs/getting-started.html.

--- ## Top 10 Features

🎯 Point & Click Management

No config files. No terminal commands. Just click, type your domain name, and you're live. If you can use a website, you can run Charon.

🔐 Automatic HTTPS Certificates

Free SSL certificates that request, install, and renew themselves. Your sites get the green padlock without you lifting a finger.

🌐 DNS Challenge for Wildcard Certificates

Secure all your subdomains with a single *.example.com certificate. Supports 15+ DNS providers including Cloudflare, Route53, DigitalOcean, and Google Cloud DNS. Credentials are encrypted and automatically rotated.

🛡️ Enterprise-Grade Security Built In

Web Application Firewall, rate limiting, geographic blocking, access control lists, and intrusion detection via CrowdSec. Protection that "just works."

🔐 Supply Chain Security

Verifiable builds with cryptographic signatures, SLSA provenance attestation, and comprehensive SBOMs. Verify what you run with transparent, tamper-proof evidence.

🌐 Smart Proxy Headers

Automatically adds standard headers (X-Real-IP, X-Forwarded-Proto, etc.) so your backend applications see real client IPs, enforce HTTPS correctly, and log accurately—with full backward compatibility for existing hosts.

🐳 Instant Docker Discovery

Already running apps in Docker? Charon finds them automatically and offers one-click proxy setup. No manual configuration required.

📊 Real-Time Monitoring & Logs

See exactly what's happening with live request logs, uptime monitoring, and instant notifications when something goes wrong.

📥 Migration Made Easy

Already invested in another reverse proxy? Bring your work with you by importing your existing configurations with one click:

  • Caddyfile — Migrate from other Caddy setups
  • Nginx — Import from Nginx based configurations (Coming Soon)
  • Traefik - Import from Traefik based configurations (Coming Soon)
  • CrowdSec - Import from CrowdSec configurations
  • JSON Import — Restore from Charon backups or generic JSON configs

Live Configuration Changes

Update domains, add security rules, or modify settings instantly—no container restarts needed.* Your sites stay up while you make changes.

🌍 Multi-App Management

Run dozens of websites, APIs, or services from a single dashboard. Perfect for homelab enthusiasts and small teams managing multiple projects.

🚀 Zero-Dependency Deployment

One Docker container. No databases to install. No external services required. No complexity—just pure simplicity.

💯 100% Free & Open Source

No premium tiers. No feature paywalls. No usage limits. Everything you see is yours to use, forever, backed by the MIT license. * Note: Initial security engine setup (CrowdSec) requires a one-time container restart to initialize the protection layer. All subsequent changes happen live. **

Explore All Features →**


💬 Support

GitHub issues


❤️ Free & Open Source

Charon is 100% free and open source under the MIT License.

No premium tiers. No locked features. No usage limits.

Built for the self-hosting community.

Description
A lightweight, user-friendly web interface for managing Caddy as a reverse proxy. It simplifies SSL management and host routing for self-hosters who want the power of Caddy without the manual configuration.
Readme MIT 77 MiB
Languages
Go 52.2%
TypeScript 43.6%
Shell 3.5%
Dockerfile 0.3%
JavaScript 0.2%