muxtop
A modern, multiplexed system monitor for the terminal.
muxtop remplace le workflow htop + iftop + ctop par une interface à onglets unique.
Pensez htop, mais avec une UX de multiplexeur (à la tmux/zellij) et une palette de commandes à la VS Code.
Installation
Via crates.io
Via Homebrew (macOS / Linux)
Via APT (Debian / Ubuntu)
# Ajout du repo (une seule fois)
|
|
# Installation
Binaire pré-compilé (Linux / macOS)
|
Depuis les sources
# Binaire disponible dans target/release/muxtop
MSRV : Rust 1.88
Fonctionnalités
| Fonctionnalité | Détail |
|---|---|
| Onglets | General, Processes, Network et Containers — Alt+1 / Alt+2 / Alt+3 / Alt+4 |
| Onglet Réseau | Tableau d'interfaces avec RX/s, TX/s, totaux, erreurs + sparklines en temps réel |
| Onglet Conteneurs | Docker/Podman via bollard — table CPU/mémoire/réseau/IO, sparklines CPU+RX, actions F9 stop / F10 kill / F11 restart, détection socket automatique |
| Palette de commandes | Ctrl+P — kill firefox, sort memory, stop nginx, restart postgres, etc. |
| Raccourcis htop | F3 recherche, F4 filtre, F5 arbre, F6 tri, F9 kill, F10 quitter |
| Recherche fuzzy | Propulsé par nucleo (issu de l'éditeur Helix) |
| Vue arborescente | F5 bascule l'affichage hiérarchique parent/enfant |
| Renice | + / - pour ajuster la priorité d'un processus |
| Monitoring distant | --remote host:port + --token pour surveiller un serveur distant via TLS chiffré |
| TLS natif | Chiffrement rustls (TLS 1.2/1.3), génération auto de certificats self-signed (--tls-generate), auth par token obligatoire |
| Collecte asynchrone | Basé sur tokio — le UI n'est jamais bloqué, même à 3000+ processus |
| Thème Tokyo Night | TrueColor natif, repli automatique sur les terminaux ANSI/16 couleurs |
| Binaire statique | Un seul binaire musl, aucune dépendance système |
| Zéro télémétrie | Aucun appel réseau côté client, jamais (voir Vie privée) |
Privilèges
L'accès à la socket Docker (/var/run/docker.sock) est équivalent à un accès root sur la machine hôte : tout utilisateur du groupe docker peut lancer un conteneur privilégié et s'évader. Pour exécuter muxtop avec un budget de privilèges minimal, utilisez Podman en mode rootless — la socket utilisateur ($XDG_RUNTIME_DIR/podman/podman.sock) est isolée par utilisateur et muxtop la détecte automatiquement. Évitez de lancer muxtop-server en root sur un hôte exposé : préférez un compte de service avec uniquement la socket Podman rootless montée en lecture/écriture.
Utilisation
# Onglet Conteneurs — par défaut muxtop cherche $DOCKER_HOST, /var/run/docker.sock,
# puis les sockets Podman. Passez un chemin pour forcer, ou désactivez complètement :
# Démarrer le serveur (TLS + auth obligatoire)
# Monitoring distant (TLS)
MUXTOP_TOKEN="mon-secret-16chars"
Raccourcis clavier
| Touche | Action |
|---|---|
Ctrl+P |
Palette de commandes |
Alt+1 / Alt+2 / Alt+3 / Alt+4 |
Changer d'onglet (General / Processes / Network / Containers) |
F1 |
Aide |
F3 / / |
Recherche |
F4 |
Filtre de processus |
F5 |
Vue arborescente |
F6 |
Menu de tri |
F9 |
Tuer le processus (onglet Processes) · Stop conteneur (onglet Containers) |
F10 |
Force kill (SIGKILL) — processus ou conteneur selon l'onglet actif |
F11 |
Redémarrer le conteneur (onglet Containers) |
q |
Quitter |
j / k |
Navigation (style vim) |
+ / - |
Renice (priorité) — onglet Processes uniquement |
Benchmarks
Testé sur macOS avec 500+ processus (benchmark Thomas) :
| Métrique | Cible | muxtop |
|---|---|---|
Démarrage (--about) |
< 100 ms | ~12 ms |
| Taille du binaire | < 10 MB | 5.3 MiB (LTO + strip) |
| FPS (TUI) | > 30 | ~60 (event-driven, idle ≈ 0 redraw) |
| RSS pic (30 s) | < 15 MiB | 11.3 MiB (htop ~15, btop ~40) |
Lancez le benchmark vous-même :
# ou
Architecture
muxtop/
├── src/ # Point d'entrée (CLI clap + bootstrap tokio)
└── crates/
├── muxtop-core/ # Collecte système, modèles de données, actions
│ ├── src/collector.rs # Boucle async sysinfo (1 Hz) + boucle conteneurs (0.5 Hz)
│ ├── src/process.rs # Tri, filtrage, arbre de processus
│ ├── src/system.rs # Snapshots CPU / mémoire / charge
│ ├── src/network.rs # Interfaces réseau + historique
│ ├── src/containers.rs # Modèle conteneurs (ContainerSnapshot, états, engine)
│ ├── src/container_engine.rs # Trait async + détection socket Docker/Podman
│ └── src/docker_engine.rs # Implémentation concrète via bollard
├── muxtop-tui/ # Interface ratatui
│ ├── src/app.rs # Machine à états, gestion des événements
│ └── src/ui/ # Onglets General, Processes, Network, Containers, palette, thème
├── muxtop-proto/ # Protocole filaire et sérialisation binaire
└── muxtop-server/ # Daemon TCP pour le monitoring à distance
Développement
Feuille de route
| Version | Objectif |
|---|---|
| v0.1 ✓ | Remplacement htop — onglets, palette de commandes, vue arborescente |
| v0.2 ✓ | Onglet Réseau (remplace iftop) + architecture client-serveur (muxtop-server, --remote) |
| v0.3 ✓ | Onglet Conteneurs Docker / Podman (via bollard) + actions Stop/Kill/Restart |
| v0.3.1 | Support Kubernetes (via kube-rs) |
| v0.4 | Monitoring GPU (NVIDIA / AMD / Apple Silicon) + docker exec interactif (PTY) |
| v1.0 | Système de plugins WASM + thèmes + fichier de configuration |
Vie privée & télémétrie
muxtop ne collecte AUCUNE télémétrie, AUCUNE statistique et ne contacte PERSONNE. Jamais.
Il ne fait aucun appel réseau. Il est conçu pour les serveurs de production air-gappés. Si vous observez une activité réseau sortante depuis muxtop, c'est un bug — veuillez le signaler.
Contribuer
Les contributions sont les bienvenues ! Consultez CONTRIBUTING.md pour les prérequis, les conventions de code, le workflow de branches et les instructions pour soumettre une PR.
Licence
Disponible sous l'un ou l'autre des licences suivantes, à votre choix :
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT License (LICENSE-MIT)