Scène 3D : le portique du logo Portico, un entablement sur deux colonnes, dont l’arche éclairée est traversée par un tunnel d’anneaux et un flux de particules.

Client SSH · Rust · macOS & Linux

Le portique de vos serveurs.

Portico est un gestionnaire de sessions SSH local-first, rapide et pensé pour le clavier. Un moteur Rust, deux interfaces : une TUI et une GUI. Votre ~/.ssh/config reste la source de vérité.

  • {rust:1.90}
  • {unsafe:forbid}
  • {cloud:0}
  • {tui:<100ms}
Défiler pour entrer

kex curve25519-sha256

Principes

Votre setup est la source de vérité.

Portico lit ~/.ssh/config, known_hosts, ssh-agent et vos clés. Il ne réécrit jamais votre configuration : ses métadonnées (tags, favoris, groupes) vivent à côté, dans un TOML lisible. Pas de compte, pas de synchronisation imposée, pas de lock-in.

  1. P.001

    Zéro lock-in

    Données en TOML lisible et versionnable. Supprimez Portico, votre SSH n’a pas bougé.

  2. P.002

    Keyboard-first

    Chaque action a un raccourci. La palette ⌘K expose tout, la souris n’est jamais requise.

  3. P.003

    Performance

    TUI utilisable en moins de 100 ms à froid. Aucun redraw quand rien ne change.

  4. P.004

    Respect d’OpenSSH

    Include, Match, ProxyJump, tokens, ordre d’authentification : la sémantique exacte d’OpenSSH.

0 compte, cloud ou télémétrie. Tout fonctionne hors ligne.

7 Mo de mémoire au repos pour la TUI, terminal ouvert.

0,5 s pour afficher 500 000 lignes dans le terminal TUI.

140 + tests, dont un serveur SSH en process et l’interop OpenSSH réelle.

Interfaces

Un moteur. Deux interfaces.

portico-core porte tout le métier : sessions, authentification, SFTP, tunnels. La TUI vit dans votre terminal, la GUI dans une fenêtre native. Même moteur, mêmes raccourcis, mêmes thèmes.

~ portico 92×26
 ╭┴┴╮ PORTICO  │▍Hosts 9                                                           Obsidian 
 ╭──────────────────────────────────────╮ ╭───────────────────────────────────────────────╮ 
 │ ⌕ Search hosts   /                   │ │                                               │ 
 ╰──────────────────────────────────────╯ │  db-prod                                      │ 
 ╭ Hosts ───────────────────────────────╮ │  postgres@10.0.4.12:22                        │ 
 │ ▍● db-prod ★  postgres@10.0.4.12 #pro│ │                                               │ 
 │  ● bastion  ops@bastion.example.com #│ │  ● Disconnected                               │ 
 │  ● web-01  deploy@web-01.internal #pr│ │                                               │ 
 │  ● staging  deploy@staging.example.co│ │   ↵  connect                                  │ 
 │  ● nas ★  admin@nas.home.arpa #home  │ │                                               │ 
 │  ● api-01  deploy@api-01.internal #pr│ │  Jump          bastion → db-prod              │ 
 │  ● gitlab-runner  gitlab-runner@runne│ │  Forward -L    5432 localhost:5432            │ 
 │  ● raspberry  pi@192.168.1.42 #home #│ │  Tags          #prod #db                      │ 
 │  ● homelab-k3s  ubuntu@192.168.1.60 #│ │  Defined in    ~/.ssh/config:12               │ 
 │                                      │ │                                               │ 
 │                                      │ │                                               │ 
 │                                      │ │                                               │ 
 │                                      │ │                                               │ 
 │                                      │ │                                               │ 
 │                                      │ │                                               │ 
 │                                      │ │                                               │ 
 │                                      │ │                                               │ 
 │                                      │ │                                               │ 
 │                                      │ │                                               │ 
 ╰──────────────────────────────────────╯ ╰───────────────────────────────────────────────╯ 
  HOSTS   ↵ connect   / search   d disconnect   t theme   ? help                            

Essayez : j / k pour naviguer, ↵ pour se connecter, / pour chercher, t pour le thème.

Rendu
ratatui 0.30 · crossterm
Émulateur
alacritty_terminal · 10 000 lignes
Onglets
préfixe Ctrl-Space, comme tmux

Trois thèmes sombres

Ce site utilise les tokens de portico-theme : changez de thème, la page entière suit.

Fonctionnalités

Le MVP, ligne à ligne.

Quatorze fonctionnalités, livrées par phases. Chaque phase est close par trois revues : sécurité, protocoles SSH et design.

  • Livré 08
  • En cours 02
  • Prévu 04
  1. F.001 Parsing de ~/.ssh/config Livré

    Host, Match, Include, wildcards, héritage, tokens et ProxyJump, avec la sémantique first-wins d’OpenSSH. Parser maison, testé.

  2. F.002 Recherche floue, tags et favoris Livré

    Matcher nucleo (celui de Helix), smart-case. #tag filtre par étiquette, * par favori.

  3. F.003 Connexion SSH interactive Livré

    PTY xterm-256color, onglets, redimensionnement en direct, vim et htop utilisables. ProxyJump récursif jusqu’à 8 rebonds.

  4. F.004 SFTP : explorateur et transferts Livré

    Deux panneaux façon Midnight Commander en TUI, liste et glisser-déposer en GUI. Progression, annulation, conflits gérés.

  5. F.005 Port forwarding local et distant Livré

    -L et -R, bind sur localhost par défaut. Les forwards de ssh_config sont proposés, jamais démarrés d’office.

  6. F.006 known_hosts strict Livré

    Entrées hachées, @cert-authority, @revoked. Une clé hôte modifiée provoque toujours un refus bloquant.

  7. F.007 Statut de connexion et latence Livré

    connecting → authenticating → connected, avec le RTT mesuré par keepalive@openssh.com. Erreurs avec un hint actionnable.

  8. F.008 Trois thèmes et raccourcis documentés Livré

    Obsidian, Basalt, Travertine Night. Contraste testé : texte principal AAA, secondaire AA.

  9. F.009 Clés, agent et certificats SSH En cours

    Découverte des clés et certificats livrée. Gestion de l’agent et alertes d’expiration des certificats en phase 3.

  10. F.010 Secrets dans le keyring En cours

    Keychain macOS et Secret Service Linux déjà utilisés. Vault chiffré de repli (Argon2id, XChaCha20-Poly1305) en phase 3.

  11. F.011 Génération de clés Prévu

    ed25519 par défaut, RSA 3072+ et ECDSA, avec passphrase. Refus d’écraser une clé existante.

  12. F.012 Copie de clé publique Prévu

    L’équivalent de ssh-copy-id, idempotent, vérifié par une reconnexion avec la clé.

  13. F.013 Snippets Prévu

    Globaux, par hôte ou par tag, avec placeholders. Exécutés dans l’onglet actif depuis la palette.

  14. F.014 Sessions récentes et panneau debug Prévu

    Historique, favoris éditables, logs de connexion par session et vue « config effective » façon ssh -G.

Architecture

Événementiel, de bout en bout.

Le moteur publie ses événements sur un plan de contrôle. Les octets des terminaux circulent sur des canaux dédiés et bornés. Une UI lente ne ralentit jamais une session.

Fig. 02 · Moteur et interfaces

Sécurité

Aucun secret en clair. Jamais.

Sécurité by design, vérifiée par un agent d’audit à la fin de chaque phase : tous les constats critiques et élevés ont été corrigés avant de continuer.

Alerte bloquante de Portico : clé d’hôte modifiée pour staging, empreintes attendue et reçue, commande ssh-keygen -R, un seul bouton Fermer.
Capture réelle · GUI · Obsidian
  • S.01

    Keyring système

    Mots de passe et passphrases dans Keychain ou Secret Service, liés à l’identité vérifiée de l’hôte.

  • S.02

    Clé modifiée = refus

    Même avec StrictHostKeyChecking no. Aucun bouton « accepter » : la commande ssh-keygen -R exacte est affichée.

  • S.03

    Pas de SHA-1

    ssh-rsa retiré des algorithmes hôtes. Backend crypto aws-lc-rs, sans libssh2 en C.

  • S.04

    Collage assaini

    ESC et contrôles C1 retirés avant d’atteindre le terminal. Un collage ne répond jamais à un dialogue de clé.

  • S.05

    Logs propres

    Ni secret, ni contenu de terminal dans les logs ou les événements. Debug redigé.

  • S.06

    Rust strict

    forbid(unsafe_code), zéro unwrap hors tests, clippy pedantic sans warning.

Clavier

Les mains restent sur le clavier.

Une seule grammaire pour la TUI et la GUI. Appuyez sur les touches : les raccourcis s’allument.

Hôtes

  • j k Descendre / monter
  • / Recherche floue, #tag, *
  • ↵ Se connecter
  • d Se déconnecter
  • f Fichiers (SFTP)
  • p Tunnels
  • t Changer de thème
  • ? Aide

Terminal · TUI

  • Ctrl Space Préfixe des commandes
  • ␣ n Nouvel onglet, même hôte
  • ␣ w Fermer l’onglet
  • ␣ 1…9 Aller à l’onglet n
  • ⇧ PgUp Historique

GUI · ⌘ / Ctrl-Shift

  • ⌘ K Palette de commandes
  • ⌘ T Nouvel onglet
  • ⌘ W Fermer l’onglet
  • ⌘ ⇧ F Fichiers à côté du terminal
  • ⌘ 1…9 Onglet n

Astuce : la touche t change le thème de ce site, comme dans Portico.

Tous les raccourcis

Feuille de route

Livré par phases, vérifié à chaque étape.

  1. Phase 00

    Livré

    Fondations

    Workspace, lints stricts, parser ssh_config, inventaire, thèmes, coquilles TUI et GUI.

  2. Phase 01

    Livré

    Connexion interactive

    Transport, known_hosts, auth dans l’ordre d’OpenSSH, ProxyJump, PTY et terminaux dans les deux UIs.

  3. Phase 02

    Livré

    SFTP et tunnels

    Explorateurs de fichiers, transferts streamés, forwarding -L et -R, panneau Tunnels.

  4. Phase 03

    En cours

    Clés, secrets, snippets

    Génération, copy-id, agent, vault chiffré de repli, snippets avec placeholders.

  5. Phase 04

    Prévu

    Finition MVP

    Récents, favoris, panneau debug, raccourcis configurables, paquets .dmg, .deb et AppImage.

Ensuite

  • SOCKS5 (-D)
  • Split panes
  • Enregistrement asciicast
  • Sync locale optionnelle
  • Windows
  • Mosh
  • Import Termius

Installer

Compilez-le ce soir.

Portico est en développement actif. En attendant les paquets signés de la phase 4, il se compile depuis les sources avec Rust 1.90+.

~/src bash
  1. 01 · Cloner
    git clone https://github.com/fs0ciety7000/Portico && cd Portico
  2. 02 · TUI
    cargo run --release -p portico-tui
  3. 03 · GUI
    cd apps/portico-gui && pnpm install && pnpm tauri dev

Linux : la GUI nécessite libwebkit2gtk-4.1-dev. Licence MIT OR Apache-2.0.

Questions

Avant de commencer.

Q.001 Portico modifie-t-il mon ~/.ssh/config ?

Non, jamais. Portico le lit. Ses propres métadonnées vivent dans hosts.toml. Les seules écritures dans ~/.ssh sont l’ajout dans known_hosts après votre accord, et les clés que vous demandez de générer.

Q.002 Faut-il un compte ou une connexion Internet ?

Non. Aucun compte, aucun service distant, aucune télémétrie. Portico fonctionne entièrement hors ligne.

Q.003 Pourquoi une TUI et une GUI ?

Parce que certains vivent dans tmux et d’autres dans des fenêtres. Le moteur est le même : comportement, sécurité et raccourcis identiques.

Q.004 Et Windows ?

macOS et Linux d’abord. Windows figure dans la feuille de route post-MVP.

Q.005 Comment Portico se compare-t-il à Termius ?

Portico est ouvert, local et sans abonnement. Il respecte votre configuration OpenSSH au lieu de la remplacer, et un import Termius est prévu après le MVP.

Q.006 Quelle est la licence ?

MIT OR Apache-2.0, au choix.