A self-hosted portal for your homelab. Access all your web applications from a single dashboard with health monitoring, keyboard navigation, and a built-in reverse proxy that makes stubborn apps work in iframes.
One binary. One port. One YAML config file.
If you run services like Sonarr, Radarr, Plex, Grafana, or Home Assistant in your homelab, you probably have a dozen browser bookmarks and port numbers to remember. Muximux gives you a single page where all of those apps live — organized into groups, with live health indicators showing what's up and what's down.
Apps load inside the dashboard as iframes, so switching between them is instant — no page reloads, no losing your place. For apps that refuse to be embedded (most set X-Frame-Options: DENY), Muximux includes a reverse proxy that transparently strips those headers and rewrites paths so they work.
Everything is configured in one YAML file. There's no database, no external dependencies, and the entire application ships as a single binary with the frontend embedded.
Muximux v3 is a ground-up rewrite. The original Muximux was a PHP application that served as a simple bookmark portal. v3 replaces it with a modern stack and a much broader feature set:
- Go backend with the frontend embedded in the binary — no PHP, no web server, no runtime dependencies
- Built-in reverse proxy that rewrites HTML, CSS, JS, and headers so apps actually work inside iframes
- Real-time health monitoring via WebSocket — see which apps are up or down without refreshing
- Built-in authentication — username/password, forward auth (Authelia/Authentik), or OIDC
- Optional TLS and gateway — an embedded Caddy instance can handle HTTPS certificates and serve other sites alongside Muximux
- Guided onboarding — a setup wizard walks you through adding your first apps
- 1,600+ icons from Lucide plus thousands of service-specific icons from Dashboard Icons
- Keyboard shortcuts for power users — switch apps, toggle navigation, search, all from the keyboard
- Themes — built-in light and dark modes, plus custom themes via CSS
Muximux fits different setups. Pick the level that matches yours.
You already have Traefik, nginx, or Caddy handling TLS and auth. Run Muximux behind it with auth: none and let your proxy do the heavy lifting. Muximux serves on a single port and your proxy forwards to it. This is the simplest setup.
Same as above, but some of your apps refuse to load in iframes. Set proxy: true on those apps and Muximux will proxy them through /proxy/{slug}/, stripping blocking headers and rewriting paths. This runs inside the Go server and works in every deployment mode — no extra configuration needed.
No existing proxy? Use Muximux as your only reverse proxy. Configure tls.domain for automatic HTTPS via Let's Encrypt and a gateway Caddyfile to serve your other services on their own domains. Caddy handles TLS certificates, HTTP-to-HTTPS redirects, and routing — all from the same single binary.
See the Deployment Guide for Docker Compose examples for each setup.
docker run -d \
--name muximux \
-p 8080:8080 \
-v $(pwd)/data:/app/data \
ghcr.io/mescon/muximux:latestOpen http://localhost:8080. If no config file exists, an onboarding wizard will guide you through setup.
services:
muximux:
image: ghcr.io/mescon/muximux:latest
ports:
- "8080:8080"
volumes:
- ./data:/app/data
restart: unless-stopped./muximux --config data/config.yamlSee docker-compose.yml for a full example with environment variables, health checks, and optional TLS/gateway ports.
Everything lives in one YAML file. Here's the essentials:
server:
listen: ":8080"
title: "My Homelab"
apps:
- name: Sonarr
url: http://sonarr:8989
icon: { type: dashboard, name: sonarr }
group: Media
proxy: true # Proxy through /proxy/sonarr/
open_mode: iframe # iframe, new_tab, new_window, redirect
- name: Grafana
url: http://grafana:3000
icon: { type: dashboard, name: grafana }
group: Monitoring
groups:
- name: Media
icon: { type: lucide, name: play }
color: "#e5a00d"
- name: Monitoring
icon: { type: lucide, name: activity }
color: "#27ae60"Configuration values can reference environment variables (${OIDC_CLIENT_SECRET}), and the listen address can be overridden via --listen flag or MUXIMUX_LISTEN env var.
For the full configuration reference, authentication options, TLS setup, and more, see the Wiki.
| Reverse Proxy | Strips iframe-blocking headers, rewrites HTML/CSS/JS paths, handles gzip — makes apps work in iframes that normally refuse |
| Health Monitoring | Periodic health checks with real-time WebSocket updates and colored status indicators |
| Authentication | Built-in users (bcrypt), forward auth (Authelia/Authentik), or OIDC — or none if your proxy handles it |
| TLS / HTTPS | Automatic Let's Encrypt certificates or manual cert/key, powered by embedded Caddy |
| Gateway | Serve additional sites alongside Muximux using a standard Caddyfile |
| Navigation | 5 positions (top, left, right, bottom, floating), auto-hide, customizable width |
| Icons | 1,600+ Lucide icons, thousands of Dashboard Icons, URL icons, custom uploads |
| Keyboard Shortcuts | Configurable keybindings for switching apps, toggling navigation, search |
| Themes | Built-in light/dark modes, custom themes via CSS custom properties |
| Environment Variables | ${VAR} expansion in config.yaml, MUXIMUX_LISTEN and MUXIMUX_CONFIG overrides |
| REST API | Full CRUD for apps, groups, config, health, and auth |
| Single Binary | Frontend embedded in the Go binary — one file to deploy, no runtime dependencies |
Full documentation is available in the Wiki:
- Installation — Docker, binary, building from source
- Getting Started — First launch and onboarding
- Configuration Reference — All config.yaml options
- Apps — Adding and configuring applications
- Built-in Reverse Proxy — How the proxy works and when to use it
- Authentication — Auth methods and setup
- TLS & HTTPS — Certificates and gateway mode
- Deployment Guide — Production deployment examples
- Themes — Customizing the look
- API Reference — REST API endpoints
git clone https://github.com/mescon/Muximux.git
cd Muximux
# Frontend dev server (hot reload)
cd web && npm install && npm run dev &
# Backend
go run ./cmd/muximux --config data/config.yaml# Build frontend (outputs to internal/server/dist/)
cd web && npm run build && cd ..
# Build binary (embeds frontend)
go build -o muximux ./cmd/muximux
# With version info
go build -ldflags "-X main.version=1.0.0" -o muximux ./cmd/muximuxGPL v2 — see LICENSE for details.
- Lucide Icons for the icon library
- Dashboard Icons by Homarr Labs
- Caddy for embedded TLS and gateway support