← Back to Home

RMUX: A Modern Rust Terminal Multiplexer with SDK, Ratatui, and Web Sharing

RMUX: A Modern Rust Terminal Multiplexer with SDK, Ratatui, and Web Sharing 🦀

What is it? RMUX (v0.5.0) is a modern, async Rust terminal multiplexer engine with a tmux-compatible CLI, a persistent daemon, a public Rust SDK, a Ratatui widget, and optional end-to-end encrypted web session sharing. It supports 90+ tmux commands natively on Linux, macOS, and Windows — with no WSL required on Windows.

Why it's trending: RMUX hit 1,500+ GitHub stars in under three weeks because it tackles a real pain point. Tmux is battle-hardened but built in C and difficult to extend programmatically. Zellij is written in Rust but uses a proprietary layout model. RMUX bridges the gap: you get a familiar tmux-style CLI for daily driving, plus a typed Rust SDK (rmux-sdk) to script persistent agent workflows, plus a Ratatui widget (ratatui-rmux) to embed terminal panes in your own TUI, plus web sharing so you can expose a pane in a browser. It's the first multiplexer designed as a platform, not just a terminal manager.


📋 Prerequisites

Before we start, make sure you have:

  • Linux, macOS, or Windows (native support on all three)
  • A terminal emulator (Kitty, Ghostty, WezTerm, foot, Alacritty, iTerm2, Windows Terminal — all work)
  • Optionally Rust toolchain (rustup + cargo) if building from source or using the SDK
  • Optional: curl for the portable installer

🧠 Architecture Overview

Here's how RMUX is structured:

RMUX Architecture

The architecture follows a clean client-daemon pattern:

  1. User & CLI — You interact with RMUX through the rmux CLI. Commands like new-session, split-window, send-keys, and attach-session all go through the local client.

  2. rmux-client — The local IPC client sends requests to the daemon over Unix sockets (Linux/macOS) or named pipes (Windows). It handles session attachment, pane rendering, and user input forwarding.

  3. rmux-server (Daemon) — A persistent Tokio-based daemon that runs in the background. It manages sessions, windows, panes, layouts, PTY processes, and all multiplexer state. The daemon keeps running even when no clients are attached — so long-running processes survive terminal closure.

  4. rmux-core — The brain of the multiplexer. It implements sessions, windows, panes, layouts, hooks, buffers, history, and format expansions. It's the central orchestrator that knows how every piece fits together.

  5. rmux-pty — The PTY allocator and child process controller. On Linux it uses Unix PTY, on macOS Unix PTY, and on Windows ConPTY. It handles resize signals, terminal capability probing, and graphics passthrough (Kitty/SIXEL).

  6. rmux-sdk — The public typed Rust SDK for building persistent AI agent workflows. You can programmatically create sessions, send commands, wait for output text, and take pane snapshots — all from Rust code using the daemon's rich IPC protocol.

  7. ratatui-rmux — A Ratatui widget that renders live RMUX pane content inside your own TUI application. Feed it a PaneSnapshot and it draws the terminal contents with ANSI color support.

  8. Web Share — Optional browser-based terminal sharing. The daemon exposes a selected pane or session through an end-to-end encrypted WebSocket. You can share a live terminal session in a browser without exposing your machine — execution stays local, only the rendered view is sent.


⚡ Quick Start: Daily Driving RMUX

Installation

The easiest way to install RMUX on Linux or macOS:

curl -fsSL https://rmux.io/install.sh | sh

On Windows:

irm https://rmux.io/install.ps1 | iex

Or via Cargo (all platforms):

cargo install rmux --locked

Start Your First Session

# Create a detached session named "work"
rmux new-session -d -s work

# Attach to it
rmux attach-session -t work

# Inside the session: split panes
# Default key: Ctrl+b %   (horizontal split)
# Default key: Ctrl+b "   (vertical split)

Essential CLI Commands

# Create and manage sessions
rmux new-session -d -s work
rmux new-session -d -s dev -c ~/projects

# Split windows
rmux split-window -h -t work
rmux split-window -v -t work

# Send commands programmatically
rmux send-keys -t work 'htop' Enter
rmux send-keys -t work:0 'npm run dev' Enter

# List everything
rmux list-sessions
rmux list-windows -t work
rmux list-panes -t work

# Kill and detach
rmux kill-session -t work
rmux detach-client -s work

Migration from tmux

RMUX reads ~/.tmux.conf as a migration fallback when no RMUX config exists. Most static options and key unbindings carry over. If you want to disable the fallback:

export RMUX_DISABLE_TMUX_FALLBACK=1

🎛️ Configuration

RMUX reads .rmux.conf from several locations:

  1. /etc/rmux.conf
  2. ~/.rmux.conf
  3. $XDG_CONFIG_HOME/rmux/rmux.conf
  4. ~/.config/rmux/rmux.conf

Here's a human-friendly starter config:

# Use Ctrl+A as prefix (easier on most keyboards)
set -g prefix C-a
unbind C-b
bind C-a send-prefix

# Start with mouse off for native selection
set -g mouse off
bind T toggle mouse

# Larger scrollback
set -g history-limit 100000

# Renumber windows automatically
set -g renumber-windows on

# Start numbering at 1
set -g base-index 1
setw -g pane-base-index 1

# Vi mode keys
setw -g mode-keys vi

# Cwd-preserving splits
bind % split-window -h -c "#{pane_current_path}"
bind '"' split-window -v -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"

# Clipboard integration (uncomment your platform)
# set -s copy-command 'wl-copy'       # Linux Wayland
# set -s copy-command 'xclip'         # Linux X11
# set -s copy-command 'pbcopy'        # macOS
# set -s copy-command 'clip.exe'      # Windows

📦 Using the Rust SDK

The RMUX SDK lets you drive the multiplexer programmatically. Add it to your project:

cargo add rmux-sdk
cargo add ratatui-rmux  # optional: for embedding panes in your TUI

Basic SDK Example

Create a session, send a command, and wait for output:

use std::time::Duration;
use rmux_sdk::{
    EnsureSession, EnsureSessionPolicy, Rmux, SessionName, TerminalSizeSpec,
};

#[tokio::main]
async fn main() -> rmux_sdk::Result<()> {
    let rmux = Rmux::builder()
        .default_timeout(Duration::from_secs(5))
        .connect_or_start()
        .await?;

    let session_name = SessionName::new("work").expect("valid session name");
    let session = rmux
        .ensure_session(
            EnsureSession::named(session_name)
                .policy(EnsureSessionPolicy::CreateOrReuse)
                .detached(true)
                .size(TerminalSizeSpec::new(120, 32)),
        )
        .await?;

    let pane = session.pane(0, 0);
    pane.send_text("printf 'ready\\n' && sleep 1\n").await?;
    pane.wait_for_text("ready").await?;
    let snapshot = pane.snapshot().await?;
    println!("Terminal: {}x{}", snapshot.cols, snapshot.rows);

    Ok(())
}

Ratatui Widget

Embed a live RMUX pane inside your own Ratatui application:

use ratatui::{buffer::Buffer, layout::Rect, widgets::Widget};
use ratatui_rmux::{PaneState, PaneWidget};
use rmux_sdk::PaneSnapshot;

fn render(snapshot: PaneSnapshot, area: Rect, buffer: &mut Buffer) {
    let state = PaneState::from_snapshot(snapshot);
    PaneWidget::new(&state).render(area, buffer);
}

🌐 Web Share: Share Terminals in a Browser

RMUX includes an optional web multiplexing feature. You can share a terminal pane or session in a browser:

# Start sharing over loopback (localhost only)
rmux web-share

# Share a specific named session
rmux new-session -d -s work
rmux web-share -t work

# Share beyond localhost (with a tunnel provider)
rmux web-share --tunnel-provider localhost-run

The web share is end-to-end encrypted. The daemon exposes only a rendered view through the WebSocket — execution stays on your machine. Users can move dividers with the mouse and interact with the terminal through the browser interface.


🔍 Verification Checklist

After installation, verify everything works:

# Check version
rmux -V
# Expected: rmux 0.5.0

# Create a test session
rmux new-session -d -s test
rmux send-keys -t test 'echo "RMUX works!"' Enter
rmux capture-pane -t test
# Expected output contains "RMUX works!"

# List sessions
rmux list-sessions
# Expected: test session listed

# Clean up
rmux kill-session -t test

📚 Resources

← Retour à l'Accueil

RMUX : Un Multiplexeur de Terminal Moderne en Rust avec SDK, Ratatui et Partage Web

RMUX : Un Multiplexeur de Terminal Moderne en Rust avec SDK, Ratatui et Partage Web 🦀

Qu'est-ce que c'est ? RMUX (v0.5.0) est un moteur de multiplexeur de terminal moderne écrit en Rust, avec une CLI compatible tmux, un démon persistant, un SDK Rust public, un widget Ratatui, et le partage de sessions web chiffré de bout en bout. Il supporte plus de 90 commandes tmux nativement sur Linux, macOS et Windows — sans WSL nécessaire sur Windows.

Pourquoi il est tendance : RMUX a atteint 1 500+ étoiles GitHub en moins de trois semaines car il résout un vrai problème. Tmux est robuste mais écrit en C et difficile à étendre par programmation. Zellij est écrit en Rust mais utilise un modèle de disposition propriétaire. RMUX fait le pont : vous obtenez une CLI familière de style tmux pour un usage quotidien, plus un SDK Rust typé (rmux-sdk) pour automatiser des workflows d'agents persistants, plus un widget Ratatui (ratatui-rmux) pour intégrer des panneaux de terminal dans votre propre TUI, plus le partage web pour exposer un panneau dans un navigateur. C'est le premier multiplexeur conçu comme une plateforme, pas seulement un gestionnaire de terminaux.


📋 Prérequis

Avant de commencer, assurez-vous d'avoir :

  • Linux, macOS ou Windows (support natif sur les trois)
  • Un émulateur de terminal (Kitty, Ghostty, WezTerm, foot, Alacritty, iTerm2, Windows Terminal — tous compatibles)
  • Optionnellement l'outillage Rust (rustup + cargo) si vous compilez depuis les sources ou utilisez le SDK
  • Optionnel : curl pour l'installeur portable

🧠 Architecture

Voici comment RMUX est structuré :

Architecture RMUX

L'architecture suit un modèle client-démon classique :

  1. Utilisateur & CLI — Vous interagissez avec RMUX via la CLI rmux. Les commandes comme new-session, split-window, send-keys et attach-session passent toutes par le client local.

  2. rmux-client — Le client IPC local envoie les requêtes au démon via des sockets Unix (Linux/macOS) ou des pipes nommés (Windows). Il gère l'attachement aux sessions, le rendu des panneaux et la transmission des entrées utilisateur.

  3. rmux-server (Démon) — Un démon Tokio persistant qui tourne en arrière-plan. Il gère les sessions, fenêtres, panneaux, dispositions, processus PTY et tout l'état du multiplexeur. Le démon continue de fonctionner même sans client attaché — les processus longs survivent à la fermeture du terminal.

  4. rmux-core — Le cerveau du multiplexeur. Il implémente les sessions, fenêtres, panneaux, dispositions, hooks, tampons, historique et expansions de format. C'est l'orchestrateur central qui sait comment chaque pièce s'assemble.

  5. rmux-pty — L'allocateur PTY et le contrôleur de processus enfant. Sur Linux il utilise Unix PTY, sur macOS Unix PTY, et sur Windows ConPTY. Il gère les signaux de redimensionnement, le sondage des capacités du terminal et le passage graphique (Kitty/SIXEL).

  6. rmux-sdk — Le SDK Rust typé public pour construire des workflows d'agents IA persistants. Vous pouvez créer des sessions par programme, envoyer des commandes, attendre un texte spécifique et prendre des instantanés de panneaux — le tout en Rust via le protocole IPC riche du démon.

  7. ratatui-rmux — Un widget Ratatui qui affiche le contenu d'un panneau RMUX en direct dans votre propre application TUI. Fournissez-lui un PaneSnapshot et il dessine le contenu du terminal avec support des couleurs ANSI.

  8. Web Share — Partage de terminal optionnel via navigateur. Le démon expose un panneau ou une session sélectionné via un WebSocket chiffré de bout en bout. Vous pouvez partager une session de terminal en direct dans un navigateur sans exposer votre machine — l'exécution reste locale, seule la vue rendue est transmise.


⚡ Démarrage Rapide : RMUX au Quotidien

Installation

Le moyen le plus simple d'installer RMUX sur Linux ou macOS :

curl -fsSL https://rmux.io/install.sh | sh

Sur Windows :

irm https://rmux.io/install.ps1 | iex

Ou via Cargo (toutes les plateformes) :

cargo install rmux --locked

Lancez Votre Première Session

# Créez une session détachée nommée "work"
rmux new-session -d -s work

# Attachez-vous à la session
rmux attach-session -t work

# Dans la session : divisez les panneaux
# Touche par défaut : Ctrl+b %   (division horizontale)
# Touche par défaut : Ctrl+b "   (division verticale)

Commandes CLI Essentielles

# Créer et gérer des sessions
rmux new-session -d -s travail
rmux new-session -d -s dev -c ~/projets

# Diviser les fenêtres
rmux split-window -h -t travail
rmux split-window -v -t travail

# Envoyer des commandes par programme
rmux send-keys -t travail 'htop' Enter
rmux send-keys -t travail:0 'npm run dev' Enter

# Lister tout
rmux list-sessions
rmux list-windows -t travail
rmux list-panes -t travail

# Tuer et détacher
rmux kill-session -t travail
rmux detach-client -s travail

Migration depuis tmux

RMUX lit ~/.tmux.conf comme solution de repli quand aucune configuration RMUX n'existe. La plupart des options statiques et déliaisons de touches sont reprises. Pour désactiver ce repli :

export RMUX_DISABLE_TMUX_FALLBACK=1

🎛️ Configuration

RMUX lit .rmux.conf depuis plusieurs emplacements :

  1. /etc/rmux.conf
  2. ~/.rmux.conf
  3. $XDG_CONFIG_HOME/rmux/rmux.conf
  4. ~/.config/rmux/rmux.conf

Voici une configuration de départ ergonomique :

# Utiliser Ctrl+A comme préfixe (plus facile sur la plupart des claviers)
set -g prefix C-a
unbind C-b
bind C-a send-prefix

# Démarrer avec la souris désactivée pour la sélection native
set -g mouse off
bind T toggle mouse

# Mémoire de défilement plus grande
set -g history-limit 100000

# Renumérotation automatique des fenêtres
set -g renumber-windows on

# Commencer la numérotation à 1
set -g base-index 1
setw -g pane-base-index 1

# Touches de mode Vi
setw -g mode-keys vi

# Divisions conservant le répertoire courant
bind % split-window -h -c "#{pane_current_path}"
bind '"' split-window -v -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"

# Intégration presse-papiers (décommentez selon votre plateforme)
# set -s copy-command 'wl-copy'       # Linux Wayland
# set -s copy-command 'xclip'         # Linux X11
# set -s copy-command 'pbcopy'        # macOS
# set -s copy-command 'clip.exe'      # Windows

📦 Utilisation du SDK Rust

Le SDK RMUX vous permet de piloter le multiplexeur par programme. Ajoutez-le à votre projet :

cargo add rmux-sdk
cargo add ratatui-rmux  # optionnel : pour intégrer des panneaux dans votre TUI

Exemple SDK de Base

Créez une session, envoyez une commande et attendez la sortie :

use std::time::Duration;
use rmux_sdk::{
    EnsureSession, EnsureSessionPolicy, Rmux, SessionName, TerminalSizeSpec,
};

#[tokio::main]
async fn main() -> rmux_sdk::Result<()> {
    let rmux = Rmux::builder()
        .default_timeout(Duration::from_secs(5))
        .connect_or_start()
        .await?;

    let session_name = SessionName::new("travail").expect("nom de session valide");
    let session = rmux
        .ensure_session(
            EnsureSession::named(session_name)
                .policy(EnsureSessionPolicy::CreateOrReuse)
                .detached(true)
                .size(TerminalSizeSpec::new(120, 32)),
        )
        .await?;

    let pane = session.pane(0, 0);
    pane.send_text("printf 'pret\\n' && sleep 1\n").await?;
    pane.wait_for_text("pret").await?;
    let snapshot = pane.snapshot().await?;
    println!("Terminal : {}x{}", snapshot.cols, snapshot.rows);

    Ok(())
}

Widget Ratatui

Intégrez un panneau RMUX en direct dans votre application Ratatui :

use ratatui::{buffer::Buffer, layout::Rect, widgets::Widget};
use ratatui_rmux::{PaneState, PaneWidget};
use rmux_sdk::PaneSnapshot;

fn render(snapshot: PaneSnapshot, area: Rect, buffer: &mut Buffer) {
    let state = PaneState::from_snapshot(snapshot);
    PaneWidget::new(&state).render(area, buffer);
}

🌐 Web Share : Partagez vos Terminaux dans un Navigateur

RMUX inclut une fonctionnalité de multiplexage web optionnelle. Vous pouvez partager un panneau ou une session de terminal dans un navigateur :

# Commencer le partage en boucle locale (localhost uniquement)
rmux web-share

# Partager une session nommée spécifique
rmux new-session -d -s travail
rmux web-share -t travail

# Partager au-delà de localhost (avec un fournisseur de tunnel)
rmux web-share --tunnel-provider localhost-run

Le partage web est chiffré de bout en bout. Le démon expose uniquement une vue rendue via le WebSocket — l'exécution reste sur votre machine. Les utilisateurs peuvent déplacer les séparateurs avec la souris et interagir avec le terminal via l'interface navigateur.


🔍 Vérification

Après l'installation, vérifiez que tout fonctionne :

# Vérifier la version
rmux -V
# Attendu : rmux 0.5.0

# Créer une session de test
rmux new-session -d -s test
rmux send-keys -t test 'echo "RMUX fonctionne !"' Enter
rmux capture-pane -t test
# La sortie doit contenir "RMUX fonctionne !"

# Lister les sessions
rmux list-sessions
# Attendu : session test listée

# Nettoyer
rmux kill-session -t test

📚 Ressources