{"id":50521907,"url":"https://github.com/Helvesec/rmux","last_synced_at":"2026-06-05T14:00:51.498Z","repository":{"id":358299049,"uuid":"1239918790","full_name":"Helvesec/rmux","owner":"Helvesec","description":"Universal Rust multiplexer with a typed SDK — drive any CLI or TUI app from code. Native on Linux, macOS, and Windows.","archived":false,"fork":false,"pushed_at":"2026-06-01T08:59:35.000Z","size":4568,"stargazers_count":1431,"open_issues_count":13,"forks_count":62,"subscribers_count":11,"default_branch":"main","last_synced_at":"2026-06-01T10:25:28.956Z","etag":null,"topics":["agent","ai","cli","linux","macos","multiplexer","multiplexers","powershell","ratatui","rust","terminal","tokio","windows"],"latest_commit_sha":null,"homepage":"https://rmux.io","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Helvesec.png","metadata":{"files":{"readme":"README.fr.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-15T15:22:10.000Z","updated_at":"2026-06-01T10:14:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Helvesec/rmux","commit_stats":null,"previous_names":["helvesec/rmux"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/Helvesec/rmux","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Helvesec%2Frmux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Helvesec%2Frmux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Helvesec%2Frmux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Helvesec%2Frmux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Helvesec","download_url":"https://codeload.github.com/Helvesec/rmux/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Helvesec%2Frmux/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33944671,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","ai","cli","linux","macos","multiplexer","multiplexers","powershell","ratatui","rust","terminal","tokio","windows"],"created_at":"2026-06-03T05:00:34.606Z","updated_at":"2026-06-05T14:00:51.481Z","avatar_url":"https://github.com/Helvesec.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003ca href=\"https://rmux.io\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://rmux.io/rmux-header-dark.svg\"\u003e\n    \u003cimg src=\"https://rmux.io/rmux-header.svg\" alt=\"RMUX\" width=\"500\"\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n\n\n**Multiplexeur Rust universel pour l'ère des agents : détachable, scriptable et inspectable, avec CLI compatible tmux, SDK adossé à un daemon, et intégration native [Ratatui](https://ratatui.rs).**\n\n[English](README.md) · Français · [简体中文](README.zh-CN.md) · [日本語](README.ja.md)\n\n[![Licence : MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue.svg)](LICENSE-MIT)\n[![Validation de release](https://github.com/Helvesec/rmux/actions/workflows/ci.yml/badge.svg)](https://github.com/Helvesec/rmux/actions/workflows/ci.yml)\n[![rmux 0.5.0](https://img.shields.io/badge/rmux-0.5.0-informational.svg)](#install)\n[![Plateformes : Linux | macOS | Windows](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)](#platform-support)\n[![Politique unsafe](https://img.shields.io/badge/unsafe-restricted-success.svg)](#verification)\n\n\u003cbr /\u003e\n\u003ca href=\"https://rmux.io\"\u003e\n  \u003cimg src=\"https://rmux.io/rmux-terminal-demo.gif\" width=\"500\" alt=\"Démo de session terminal RMUX\" /\u003e\n\u003c/a\u003e\n\n\u003c/div\u003e\n\n\u003e [!NOTE]\n\u003e RMUX intègre maintenant un multiplexage web serverless, chiffré de bout en bout, avec échange hybride post-quantique. [Voir la documentation Web Share du dépôt](docs/web-share.md).\n\u003e\n\u003e RMUX évolue vite. Pour une demande de fonctionnalité ou un signalement, [ouvrir une issue](https://github.com/Helvesec/rmux/issues).\n\n## RMUX\n\nRMUX est un \u003cstrong\u003emoteur de multiplexage\u003c/strong\u003e Rust moderne, asynchrone et typé, avec support natif de plus de 90 commandes tmux sur macOS, Linux et Windows, sans WSL.\n\nIl fournit un SDK Rust public pour construire des workflows IA persistants et de belles TUI avec Ratatui.\n\nIl peut servir d'outil terminal quotidien, partager des sessions dans un navigateur, ou devenir la base d'un \u003cstrong\u003eoutil TUI agentique persistant\u003c/strong\u003e.\n\n## Démos\n\nQuelques exemples courts et concrets de ce que l'on peut faire avec RMUX.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" width=\"20%\"\u003e\u003ca href=\"https://rmux.io/#demo-orchestration\"\u003e\u003cimg src=\"https://rmux.io/demos/demo-orchestration.png\" width=\"150\" alt=\"Aperçu de la démo orchestration multi-agents\"\u003e\u003c/a\u003e\u003cbr\u003e\u003csub\u003e\u003ca href=\"https://github.com/Helvesec/rmux-demos/tree/main/demo-orchestration\"\u003e\u003cstrong\u003eOrchestration multi-agents\u003c/strong\u003e\u003c/a\u003e\u003c/sub\u003e\u003cbr\u003e\u003csub\u003e≃ 514 lignes\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" width=\"20%\"\u003e\u003ca href=\"https://rmux.io/#demo-broadcast\"\u003e\u003cimg src=\"https://rmux.io/demos/demo-broadcast.png\" width=\"150\" alt=\"Aperçu de la démo Agent Broadcast Arena\"\u003e\u003c/a\u003e\u003cbr\u003e\u003csub\u003e\u003ca href=\"https://github.com/Helvesec/rmux-demos/tree/main/broadcast-demo\"\u003e\u003cstrong\u003eAgent Broadcast Arena\u003c/strong\u003e\u003c/a\u003e\u003c/sub\u003e\u003cbr\u003e\u003csub\u003e≃ 2,171 lignes\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" width=\"20%\"\u003e\u003ca href=\"https://rmux.io/#demo-zellij\"\u003e\u003cimg src=\"https://rmux.io/demos/demo-zellij.png\" width=\"150\" alt=\"Aperçu de la démo Mini-Zellij\"\u003e\u003c/a\u003e\u003cbr\u003e\u003csub\u003e\u003ca href=\"https://github.com/Helvesec/rmux-demos/tree/main/mini-zellij\"\u003e\u003cstrong\u003eMini-Zellij\u003c/strong\u003e\u003c/a\u003e\u003c/sub\u003e\u003cbr\u003e\u003csub\u003e≃ 944 lignes\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" width=\"20%\"\u003e\u003ca href=\"https://rmux.io/#demo-mirroring\"\u003e\u003cimg src=\"https://rmux.io/demos/demo-mirroring.png\" width=\"150\" alt=\"Aperçu de la démo miroir terminal navigateur\"\u003e\u003c/a\u003e\u003cbr\u003e\u003csub\u003e\u003ca href=\"https://rmux.io/#demo-mirroring\"\u003e\u003cstrong\u003eMiroir terminal \u0026lt;\u0026gt; navigateur\u003c/strong\u003e\u003c/a\u003e\u003c/sub\u003e\u003cbr\u003e\u003csub\u003e≃ 649 lignes\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" width=\"20%\"\u003e\u003ca href=\"https://rmux.io/#demo-playwright\"\u003e\u003cimg src=\"https://rmux.io/demos/demo-playwright.png\" width=\"150\" alt=\"Aperçu de la démo tests Playwright\"\u003e\u003c/a\u003e\u003cbr\u003e\u003csub\u003e\u003ca href=\"https://github.com/Helvesec/rmux-demos/tree/main/terminal-playwright-demo\"\u003e\u003cstrong\u003eTests Playwright\u003c/strong\u003e\u003c/a\u003e\u003c/sub\u003e\u003cbr\u003e\u003csub\u003e≃ 1,495 lignes\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Web Multiplex (Web Share)\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://rmux.io/docs/web-share/\"\u003e\n  \u003cimg src=\"https://rmux.io/web-share-browser.png\" width=\"500\" alt=\"Partage web RMUX\" /\u003e\n\u003c/a\u003e\n\u003c/p\u003e\n\nRMUX permet de faire du multiplexage web : partager un pane ou une session RMUX sur le web, créer de nouveaux panes, déplacer les séparateurs à la souris, et utiliser RMUX avec une interface navigateur plus riche.\n\n```sh\n# Démarrer un Web Share local sur loopback\nrmux web-share\n\n# Partager une session nommée\nrmux new-session -d -s work\nrmux web-share -t work\n\n# Partager au-delà de localhost\nrmux web-share --tunnel-provider localhost-run\n```\n\nUtiliser un tunnel provider, amener son propre ingress, ou héberger le frontend statique sur son propre domaine.\n\nPoints d'entrée utiles :\n\n- [Vue d'ensemble Web Share du dépôt](docs/web-share.md)\n- [Documentation Web Share](https://rmux.io/docs/web-share/)\n- [Modèle de sécurité](https://rmux.io/docs/web-share/#/security)\n- [Tunnel providers](https://rmux.io/docs/web-share/#/tunnels)\n\n\u003ca id=\"install\"\u003e\u003c/a\u003e\n\n## Installation\n\nBinaire précompilé pour macOS et Linux :\n\n```sh\ncurl -fsSL https://rmux.io/install.sh | sh\n```\n\nBinaire macOS avec Homebrew :\n\n```sh\nbrew install helvesec/rmux/rmux\n```\n\nPaquets Linux :\n\n```sh\nsudo install -d -m 0755 /etc/apt/keyrings\ncurl -fsSL https://packages.rmux.io/debian/rmux.asc | sudo tee /etc/apt/keyrings/rmux.asc \u003e/dev/null\necho \"deb [signed-by=/etc/apt/keyrings/rmux.asc] https://packages.rmux.io/debian stable main\" | sudo tee /etc/apt/sources.list.d/rmux.list \u003e/dev/null\nsudo apt update\nsudo apt install rmux\n```\n\nBinaire précompilé pour Windows PowerShell :\n\n```powershell\nirm https://rmux.io/install.ps1 | iex\n```\n\nWindows avec Scoop :\n\n```powershell\nscoop bucket add rmux https://github.com/Helvesec/scoop-rmux\nscoop install rmux\n```\n\nLes téléchargements directs et checksums SHA256 sont disponibles dans la [GitHub Release v0.5.0](https://github.com/helvesec/rmux/releases/tag/v0.5.0).\n\nDepuis crates.io avec Cargo :\n\n```sh\ncargo install rmux --locked\n```\n\nDepuis un checkout local :\n\n```sh\ncargo install --path . --locked\n```\n\nPour les applications Rust :\n\n```sh\ncargo add rmux-sdk\ncargo add ratatui-rmux\n```\n\n## Documentation\n\nLa documentation complète de RMUX est disponible sur [rmux.io/docs](https://rmux.io/docs/).\n\nElle inclut des [guides d'installation](https://rmux.io/docs/get-started/), des [références CLI](https://rmux.io/docs/cli/), des [exemples SDK](https://rmux.io/docs/examples/), des [exemples d'automatisation terminal](https://rmux.io/docs/examples/#/terminal-playwright), et la [documentation API](https://rmux.io/docs/api/).\n\n## Démarrage rapide CLI\n\n```sh\nrmux new-session -d -s work\nrmux split-window -h -t work\nrmux send-keys -t work 'echo \"hello from rmux\"' Enter\nrmux attach-session -t work\n```\n\nAide locale des commandes :\n\n```sh\nrmux list-commands\nrmux new-session --help\nrmux split-window --help\n```\n\n## Démarrage rapide SDK\n\n```toml\n[dependencies]\nrmux-sdk = \"0.5\"\ntokio = { version = \"1\", features = [\"rt-multi-thread\", \"macros\"] }\n```\n\n```rust\nuse std::time::Duration;\n\nuse rmux_sdk::{\n    EnsureSession, EnsureSessionPolicy, Rmux, SessionName, TerminalSizeSpec,\n};\n\n#[tokio::main]\nasync fn main() -\u003e rmux_sdk::Result\u003c()\u003e {\n    let rmux = Rmux::builder()\n        .default_timeout(Duration::from_secs(5))\n        .connect_or_start()\n        .await?;\n\n    let session_name = SessionName::new(\"work\").expect(\"valid session name\");\n    let session = rmux\n        .ensure_session(\n            EnsureSession::named(session_name)\n                .policy(EnsureSessionPolicy::CreateOrReuse)\n                .detached(true)\n                .size(TerminalSizeSpec::new(120, 32)),\n        )\n        .await?;\n\n    let pane = session.pane(0, 0);\n    pane.send_text(\"printf 'ready\\\\n' \u0026\u0026 sleep 1\\n\").await?;\n\n    pane.wait_for_text(\"ready\").await?;\n    let snapshot = pane.snapshot().await?;\n    println!(\"{}x{}\", snapshot.cols, snapshot.rows);\n\n    Ok(())\n}\n```\n\n## Widget Ratatui\n\n```rust\nuse ratatui::{buffer::Buffer, layout::Rect, widgets::Widget};\nuse ratatui_rmux::{PaneState, PaneWidget};\nuse rmux_sdk::PaneSnapshot;\n\nfn render(snapshot: PaneSnapshot, area: Rect, buffer: \u0026mut Buffer) {\n    let state = PaneState::from_snapshot(snapshot);\n    PaneWidget::new(\u0026state).render(area, buffer);\n}\n```\n\n## Architecture\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://rmux.io/rmux-architecture-dark.png?v=0.5.0-web-share\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://rmux.io/rmux-architecture-light.png?v=0.5.0-web-share\"\u003e\n  \u003cimg src=\"https://rmux.io/rmux-architecture-dark.png?v=0.5.0-web-share\" alt=\"Architecture runtime RMUX\" width=\"800\"\u003e\n\u003c/picture\u003e\n\n\u003c/div\u003e\n\n`rmux` garde les shells, sessions, fenêtres, panes et processus PTY dans le daemon local. Les clients locaux utilisent l'IPC. Web Share est un accès navigateur explicite : le daemon expose un pane ou une session sélectionnée via un WebSocket chiffré de bout en bout, pendant que l'exécution reste sur votre machine.\n\n## Workspace\n\n| Crate | Rôle | Publication |\n| :--- | :--- | :--- |\n| `rmux-types` | Types de valeurs bas niveau partagés | publique |\n| `rmux-proto` | DTO IPC détachés, framing, erreurs sûres sur le fil | publique |\n| `rmux-os` | Petits helpers à la frontière OS | publique |\n| `rmux-ipc` | Endpoints et transports IPC locaux | publique |\n| `rmux-sdk` | SDK Rust adossé au daemon | publique |\n| `ratatui-rmux` | Widget d'intégration Ratatui | publique |\n| `rmux-pty` | Allocation PTY, resize et contrôle de processus enfant | crate de support |\n| `rmux-core` | Sessions, panes, layouts, formats, hooks, buffers | crate de support |\n| `rmux-server` | Daemon Tokio et dispatch des requêtes | crate de support |\n| `rmux-client` | Client IPC local et plomberie du mode attach | crate de support |\n| `rmux` | CLI et point d'entrée daemon masqué | binaire public |\n| `rmux-render-core` | Core de rendu partagé pour snapshots | interne au workspace |\n\n\u003ca id=\"platform-support\"\u003e\u003c/a\u003e\n\n## Plateformes\n\n| Plateforme | Backend PTY | Backend IPC | Endpoint par défaut |\n| :--- | :--- | :--- | :--- |\n| Linux | PTY Unix | Socket Unix | `/tmp/rmux-{uid}/default` |\n| macOS | PTY Unix | Socket Unix | `/tmp/rmux-{uid}/default` |\n| Windows | ConPTY | Named pipe | named pipe par utilisateur |\n\n## Configuration\n\nSur Linux et macOS, RMUX lit `.rmux.conf` depuis les emplacements système et utilisateur standards :\n\n1. `/etc/rmux.conf`\n2. `~/.rmux.conf`\n3. `$XDG_CONFIG_HOME/rmux/rmux.conf`\n4. `~/.config/rmux/rmux.conf`\n\nSur Windows, RMUX lit également `.rmux.conf`, depuis les emplacements suivants :\n\n1. `%XDG_CONFIG_HOME%\\rmux\\rmux.conf`\n2. `%USERPROFILE%\\.rmux.conf`\n3. `%APPDATA%\\rmux\\rmux.conf`\n4. `%RMUX_CONFIG_FILE%`\n\n### Fallback de migration `tmux.conf`\n\nQuand RMUX démarre avec la recherche de configuration par défaut et qu'aucun\nfichier RMUX n'est chargé, il peut importer un `tmux.conf` filtré pour faciliter\nla migration. Un chargement explicite avec `-f` n'utilise pas ce fallback.\n\nChemins de fallback :\n\n- Linux et macOS : `/etc/tmux.conf`, `~/.tmux.conf`, `$XDG_CONFIG_HOME/tmux/tmux.conf`, `~/.config/tmux/tmux.conf`\n- Windows : `%XDG_CONFIG_HOME%\\tmux\\tmux.conf`, `%USERPROFILE%\\.tmux.conf`, `%APPDATA%\\tmux\\tmux.conf`\n\nL'import est volontairement limité : RMUX conserve les options statiques\nsupportées et les suppressions de raccourcis, mais ignore les bindings tmux, les\nmodifications d'environnement ou de capacités terminal, les options utilisateur\nde plugins, les hooks, les commandes shell, les blocs de commandes, les\nconditions, les jobs de format comme `#(cmd)`, les `source-file` récursifs et\nles options non supportées. Définissez `RMUX_DISABLE_TMUX_FALLBACK=1` pour le\ndésactiver entièrement. Les fichiers de fallback sont lus au mieux : les fichiers\nnon réguliers et les fichiers de plus de 1 MiB sont ignorés.\n\n### Notes de compatibilité terminal\n\nRMUX fonctionne avec les shells qui interrogent les capacités du terminal,\nnotamment fish. Il répond aux requêtes d'attributs terminal et gère le timing de\nla touche Escape pour que les prompts fish et les séquences de touches se\ncomportent normalement dans les panes RMUX.\n\nLe passthrough graphique Kitty est disponible pour les terminaux externes qui\nsupportent le protocole graphique Kitty, notamment Kitty, Ghostty et WezTerm. Il\nest activé explicitement :\n\n```tmux\nset -g allow-passthrough on\n```\n\nSi votre terminal supporte les graphiques Kitty mais n'est pas détecté\nautomatiquement, ajoutez une override de capacité terminal :\n\n```tmux\nset -as terminal-features 'xterm-kitty:kitty-graphics'\n```\n\nSur Windows, RMUX active le passthrough ConPTY moderne quand l'OS le supporte.\nDéfinissez `RMUX_CONPTY_NO_PASSTHROUGH=1` pour désactiver ce mode backend lors\nd'un diagnostic.\n\n\u003ca id=\"verification\"\u003e\u003c/a\u003e\n\n## Vérification\n\nLe workspace est conçu pour être vérifié depuis les sources avec des dépendances verrouillées :\n\n```sh\ncargo fmt --all -- --check\ncargo clippy --workspace --all-targets --locked -- -D warnings\ncargo test --workspace --locked --no-fail-fast\n```\n\nVérifications locales supplémentaires :\n\n```sh\nscripts/cfg-check.sh\nscripts/unsafe-check.sh\nscripts/no-network-in-runtime.sh\nscripts/check-platform-neutrality.sh\nscripts/ratatui-rmux-budget.sh\nscripts/verify-package.sh\n```\n\nLes vérifications d'artefacts de release sont pilotées par :\n\n```sh\nscripts/release-local.sh\nscripts/package-unix.sh\n```\n\n`#![forbid(unsafe_code)]` est utilisé dans les crates de haut niveau. Le code lié à l'OS et au terminal est isolé dans les crates runtime de plus bas niveau.\n\n## Licence\n\nRMUX est distribué sous double licence, au choix :\n\n- [Licence MIT](LICENSE-MIT)\n- [Licence Apache 2.0](LICENSE-APACHE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FHelvesec%2Frmux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FHelvesec%2Frmux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FHelvesec%2Frmux/lists"}