YoucaPort
Gestionnaire de ports en ligne de commande — trouve, vérifie et libère les ports réseau
utilisés localement, sans avoir besoin de connaître lsof, ss, netstat ou kill.
╭──────────────────────────────╮
│ PORTKEEPER │
│ Port Manager CLI │
╰──────────────────────────────╯
1. Ports utilisés
2. Vérifier un port
3. Libérer un port
4. Quitter
Choix :
Pourquoi YoucaPort ?
Quand vous lancez un projet (Next.js, FastAPI, PostgreSQL, Vite...), il arrive que le port soit déjà occupé :
EADDRINUSE: address already in use
Plutôt que de jongler avec lsof -i :3000, kill -9 <PID> et autres commandes système,
YoucaPort centralise tout dans une interface simple :
PORT APPLICATION PID STATUS
────────────────────────────────────────
3000 Next.js 447315 RUNNING
5173 Vite 321456 RUNNING
8000 Uvicorn 221890 RUNNING
5432 PostgreSQL 189230 RUNNING
Installation
Avec pipx (recommandé)
pipx install youcaport
Avec pip
pip install youcaport
Depuis les sources
git clone https://github.com/Fitiafenohaja/YoucaPort.git
cd youcaport
poetry install
poetry build
pipx install dist/youcaport-*.whl
Prérequis : Python 3.11+. Plateforme prioritaire : Linux (Windows/macOS non testés pour cette version, mais l'architecture est déjà abstraite pour une extension future).
Utilisation
Menu interactif
youcaport
Lance le menu principal : ports utilisés / vérifier un port / libérer un port / quitter.
Commandes directes
# Lister tous les ports utilisés
youcaport status
# Vérifier un port précis
youcaport check 3000
✗ Port 3000 occupé
Application : Next.js
PID : 447315
État : En cours d'exécution
# Libérer un port (avec confirmation obligatoire)
youcaport free 3000
Port 3000
Application : Next.js
PID : 447315
Voulez-vous arrêter cette application ?
[y/N]
# Aide et version
youcaport --help
youcaport --version
Fonctionnalités avancées (V2 → V6)
Suggérer des ports libres — Auto Port (V4)
Quand un port est occupé, check propose automatiquement des ports libres proches.
Une commande dédiée existe aussi :
youcaport suggest 3000 --count 5
Ports libres suggérés : 3001, 3002, 3003, 3004, 3005
Profils de projets — Port Profiles (V2)
Associez des ports à des projets nommés (stockage : ~/.config/youcaport/profiles.json) :
youcaport profile add frontend 3000 # associe le port 3000 au projet "frontend"
youcaport profile list # liste les profils
youcaport profile show frontend # état des ports d'un profil
youcaport profile remove frontend # supprime le profil
Ports d'un projet — Project Management (V3)
Détecte automatiquement les ports utilisés par les processus tournant depuis un dossier :
youcaport project /chemin/vers/mon/projet
# ou, depuis le dossier du projet :
youcaport project .
Dashboard web local (V5)
Interface web locale (stdlib, aucune dépendance supplémentaire), auto-rechargée :
youcaport dashboard # http://127.0.0.1:8421
youcaport dashboard --port 9000
Une API JSON est exposée sur /api/ports, pratique pour l'intégration.
Ports protégés (root / docker) — mode sudo
Certains écouteurs (services système, moteur Docker, autre utilisateur) ne sont pas
identifiables par un utilisateur normal : YoucaPort les affiche alors comme occupés
mais non identifiés, sans pouvoir les arrêter. Le mode --sudo lève ce voile en
interrogeant ss avec les privilèges root (le mot de passe sudo sert de confirmation) :
youcaport status --sudo # identifie les ports protégés
youcaport check 8080 --sudo # détail d'un port protégé
youcaport free 9100 --sudo # arrête vraiment le processus protégé (TERM puis KILL)
youcaport dashboard --sudo # enrichit l'API/la page (uniquement si sudo déjà authentifié)
Comportements importants :
- CLI : si sudo n'est pas encore authentifié, le mot de passe est demandé au lancement ;
si ce n'est pas possible (pas de terminal), un message invite à lancer une fois
sudo -v. - Dashboard : jamais de demande de mot de passe — il n'utilise que les identifiants déjà
en cache (
sudo -n), sinon les ports restent « non identifiés ». - L'arrêt reste toujours confirmé et passe par TERM puis KILL en dernier recours.
- Sous Windows, le mode
--sudoest sans effet (pas desudo/ss).
Gestion des conteneurs Docker (V6)
Quand un port est occupé par le moteur Docker, identifiez puis arrêtez le bon conteneur
(docker-proxy n'est qu'un relais — arrêter le conteneur est la bonne manière) :
youcaport docker list # conteneurs actifs + leurs ports hôtes
youcaport docker show 5432 # conteneur qui publie le port 5432 (détails)
youcaport docker stop 5432 # arrête le conteneur (confirmation obligatoire)
Port 5432 → conteneur Docker
Nom : postgres-dev
ID : a1b2c3d4e5f6
Image : postgres:16
Statut : Up 2 hours
Fonctionne partout où le CLI docker est disponible. Après l'arrêt, le port revient
libre : youcaport status le confirme.
Exécutable autonome (PyInstaller)
make binary # ou : ./scripts/dev.sh binary
./dist/youcaport --version
Windows
YoucaPort fonctionne aussi sur Windows (psutil est multiplateforme, couvert par un job CI
windows-latest). Particularités :
- Installation :
pip install youcaport(oupipx install youcaport) ; l'exécutable PyInstaller se construit sur une machine Windows (make binaryn'est pas requis, utiliserscripts/build_binary.shdans un terminal Windows). - Arrêt d'un processus : Windows n'offre pas de signal d'arrêt gracieux (SIGTERM) ;
terminate()réalise un arrêt immédiat. YoucaPort vous en avertit explicitement avant la confirmation. - Profil de projets : le fichier
profiles.jsonest stocké dans%LOCALAPPDATA%\youcaport\(au lieu de~/.config/youcaport/sur Linux/macOS).
Fonctionnement de l'arrêt d'un processus
YoucaPort ne tue jamais un processus brutalement par défaut :
- Confirmation obligatoire (
y/N) avec rappel de l'application, du PID et du port. - Envoi d'un SIGTERM (arrêt propre).
- Période de grâce de 3 secondes.
- SIGKILL uniquement si le processus n'a pas répondu au SIGTERM.
Aucune stack trace n'est jamais affichée à l'utilisateur : chaque erreur (port invalide,
permission insuffisante, processus déjà arrêté...) est traduite en message clair en français,
avec un code de sortie approprié (0 ou 1).
Architecture
youcaport/
│
├── pyproject.toml # source de vérité pour la version et les dépendances
├── poetry.lock
├── README.md
├── LICENSE
│
├── src/youcaport/
│ ├── __init__.py # version via importlib.metadata (repli tomllib en dev)
│ ├── cli.py # commandes Typer (status/check/free/suggest/project/dashboard/profile)
│ ├── menu.py # menu interactif + sous-menu — pas de logique métier
│ ├── dashboard.py # interface web locale (V5) — stdlib uniquement
│ │
│ ├── core/ # aucune dépendance d'affichage, 100% testable
│ │ ├── port_manager.py # orchestration, dataclass InfoPort
│ │ ├── process_manager.py # seul module appelant psutil (abstraction Linux/macOS/Windows)
│ │ ├── privileges.py # accès privilégié (sudo) aux processus protégés
│ │ ├── docker_manager.py # conteneurs Docker publiant des ports (V6)
│ │ ├── validator.py # validateurs + exceptions (PortInvalideError, ...)
│ │ ├── profiles.py # profils de projets (V2) — JSON via XDG
│ │ ├── suggester.py # ports libres à proximité (V4)
│ │ └── project_manager.py # ports utilisés par un projet (V3)
│ │
│ └── utils/
│ └── terminal.py # seul module Rich (tableaux, confirmations, gestion des erreurs)
│
└── tests/
├── test_ports.py # sockets réellement en écoute
├── test_processes.py # sous-processus enfants réellement lancés/tués
├── test_validator.py
├── test_profiles.py # profils de projets
├── test_suggester.py # auto-port
├── test_project.py # détection par projet
├── test_privileges.py # parsing `ss` via sudo + enrichissement
└── test_docker.py # parsing `docker ps` (V6)
Principes respectés :
core/ne dépend d'aucune bibliothèque d'affichage (testable en isolation).cli.py/menu.pyorchestrent uniquement ; tout l'affichage passe parutils/terminal.py.- Exceptions personnalisées plutôt que codes de retour épars.
- Tests réalistes (sockets et sous-processus réels), mocks réservés aux cas impossibles à reproduire en local (ex. permission refusée).
Développement
# Installer les dépendances (dev incluses)
make install
# ou : poetry install
# Lancer les tests
make test
# ou : poetry run pytest
# Lint + format
make lint
make format
# ou : poetry run ruff check . / poetry run ruff format .
# Build (wheel + sdist)
make build
# ou : poetry build
# Exécutable autonome (PyInstaller)
make binary
# ou : ./scripts/dev.sh binary
Toutes ces commandes sont aussi disponibles via scripts/dev.sh.
CI/CD
.github/workflows/ci.yml exécute à chaque push/PR :
- lint (
ruff check,ruff format --check) - tests (
pytest) sur Python 3.11 + 3.12 (Linux), et sur Windows et macOS (Python 3.12)
À chaque tag v*, le workflow publie automatiquement sur PyPI via trusted publishing
(OIDC — aucun token PyPI à stocker en secret).
git tag v0.1.0
git push origin v0.1.0
Limites de cette version
Comme prévu par le cahier des charges, YoucaPort reste volontairement simple :
- Dashboard lourd / comptes / base de données : hors périmètre MVP ; le dashboard V5 est volontairement léger (page locale, stdlib).
Licence
Voir LICENSE.
Release files for youcaport 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| youcaport-0.1.0.tar.gz | 27.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| youcaport-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 57.4 kB
Release files / youcaport-0.1.0.tar.gz
| Download URL | youcaport-0.1.0.tar.gz |
|---|---|
| Size | 27.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b40b04a5d0e79946a8601f5b4525edd159d544d74971e06f75cacaf8adbff17b
|
|
BLAKE2b-256 checksum How to use checksums |
aefe798184a655a200f858591024d176b0a19477db2f8c690857d7c6b0b68f6f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency logRelease files / youcaport-0.1.0-py3-none-any.whl
| Download URL | youcaport-0.1.0-py3-none-any.whl |
|---|---|
| Size | 30.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7b353d75caf4a1a47376c95e15de611e44ac628e80028fd78a7b7ffb6f77edbe
|
|
BLAKE2b-256 checksum How to use checksums |
dc5318b43ca3f6daef24722cb8b920e0f84446740cb1a16ee5cc995ddb759043
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency log