Local-first · Sécurisé par conception · Open source (MIT)
Une distribution Linux (base Arch) dans laquelle une IA est intégrée au cœur du système. Un raccourci clavier global ouvre un assistant qui peut lire et organiser vos fichiers, installer des logiciels, ajuster les paramètres de la machine et piloter votre PC en langage naturel — avec une confirmation systématique pour toute action à risque. Le modèle tourne localement (Qwen via Ollama) ; un modèle cloud (Claude) peut être activé en option, par requête. Vos données restent chez vous par défaut.
My_OS est la suite logique de My_AI : on passe d'une application qui parle au PC à un système dans lequel l'IA est résidente et profondément intégrée.
État du projet : v1 complète. Les cinq jalons (socle → fichiers/permissions → pilotage système → routeur cloud → packaging) sont terminés. X11 est pleinement supporté ; le port Wayland est expérimental (cf. §7 et docs/INSTALLATION.md).
Captures à venir (placeholders) :
Popup au raccourci Confirmation d'action Mode cloud (opt-in) docs/media/popup.pngdocs/media/confirm.pngdocs/media/cloud.pngGIF de démonstration :
docs/media/demo.gif(« range mon dossier Téléchargements par type » → plan → confirmation → exécution).
- Vision
- Concept en une image
- Fonctionnalités
- Installation
- Utilisation
- Le moteur de permissions
- Sécurité
- Architecture
- Roadmap
- Arborescence du projet
- Développement
- Contribuer
- Licence · Crédits
My_OS répond à une idée simple : et si l'assistant IA n'était pas une application qu'on ouvre, mais une capacité du système lui-même, disponible partout et tout le temps via un raccourci clavier ?
- Local par défaut — le modèle Qwen tourne sur la machine via Ollama. Aucune donnée ne sort sans action explicite.
- Cloud en option — avec une clé API, on peut router une requête vers un modèle plus puissant (Claude). Opt-in, par requête, visible et journalisé.
- Accès réel au système — fichiers, paquets, paramètres, processus. L'IA agit, elle ne fait pas que répondre.
- Sûr par conception — chaque action est classée par risque ; les actions sensibles demandent confirmation ; tout est journalisé ; rien de destructeur n'est silencieux.
Objectifs du projet : portfolio technique, projet d'école (Ynov), et base open source réutilisable.
┌─────────────────────────────┐
Raccourci ──▶ │ Popup My_OS (Qt/PySide6) │
clavier global │ « Tapez votre message… » │
└──────────────┬──────────────┘
│ IPC (socket Unix)
┌──────────────▼──────────────┐
│ Daemon myosd │
│ (orchestrateur résident) │
└──────────────┬──────────────┘
│
┌────────────────────┼────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌────────────────┐ ┌─────────────────┐
│ Modèle local │ │ Moteur de │ │ Routeur cloud │
│ Qwen/Ollama │ │ permissions │ │ Claude (opt-in) │
│ (défaut) │ │ + audit │ │ │
└───────────────┘ └───────┬────────┘ └─────────────────┘
│ valide chaque action
┌───────▼────────┐
│ Outils │
│ fichiers, │
│ paquets, D-Bus,│
│ processus │
└────────────────┘
Toutes ces capacités sont opérationnelles (v1) et passent par le moteur de permissions.
- 🗂️ Fichiers — lire, lister, écrire, déplacer, créer, supprimer. Ex. « range mon
dossier Téléchargements par type ». L'escalade de risque détecte les chemins sensibles
(
~/.ssh,/etc…). - 📦 Paquets (
pacman) — rechercher, installer, supprimer, mettre à jour. Élévation ponctuelle via polkit (pkexec), jamais root en permanence. - 🔧 Réglages système (D-Bus /
pactl) — luminosité, volume, sourdine, Wi-Fi. - 📊 Processus (
psutil) — lister les processus, en tuer un (avec garde-fous : PID critiques bloqués). - 🧠 Modèle local — Qwen via Ollama, par défaut, 100 % sur la machine.
- ☁️ Cloud opt-in — Claude (API Anthropic), activé par requête via un toggle
visible ; clé API dans le trousseau du système (
keyring), jamais en clair. - 🛡️ Permissions & audit — 4 niveaux de risque, confirmations, blocklist infranchissable, journal SQLite de chaque action.
- ⌨️ Raccourci global — X11 (
pynput, nominal) et Wayland (portalGlobalShortcuts, expérimental). - 💬 Popup instantané — PySide6 +
QTextBrowser, rendu markdown, réponses en streaming, thème sombre.
Deux voies. Détails complets dans docs/INSTALLATION.md.
Une ISO bootable (base Arch + Xfce/X11) embarque My_OS prêt à l'emploi. Le profil
archiso et le script de build sont dans
packaging/ ; la construction se fait sur un hôte Arch
(sudo ./packaging/build_iso.sh) puis se teste en VM. Au 1er boot, les dépendances et
le modèle local sont récupérés (réseau requis). Voir packaging/README.md.
Prérequis : Arch Linux (ou dérivé), Python 3.10+, Ollama.
git clone https://github.com/gonicolas12/My_OS && cd My_OS
pip install -r requirements.txt
ollama pull qwen3.5:4b # modèle local recommandé (≈ 8 Go RAM)
./launch_dev.sh # lance daemon + popup (session X11)Pour une installation résidente (service systemd utilisateur, autostart), suivre
docs/INSTALLATION.md. Notes X11/Wayland : X11 fonctionne tel
quel ; Wayland nécessite un compositeur avec layer-shell + portal GlobalShortcuts et
reste expérimental.
- Appuyez sur Ctrl+Alt+Espace (raccourci par défaut, modifiable dans
config.yaml). - Le popup s'ouvre, centré et au-dessus de tout. Tapez votre demande en langage naturel.
- Pour une action sensible, une confirmation détaillée apparaît (avec, au besoin, une élévation polkit). Vous pouvez autoriser une fois, pour ce dossier, ou pour la session.
Ctrl+Ldémarre une nouvelle conversation ;Échapreferme le popup.
Exemples de requêtes :
- « Range mon dossier Téléchargements par type. »
- « Installe VLC. »
- « Baisse la luminosité à 30 %. »
- « Qu'est-ce qui mange ma RAM en ce moment ? »
- « Résume ce fichier. » (le contenu lu reste une donnée, jamais une instruction)
Mode cloud (optionnel) : cochez « ☁ Cloud (Claude) », saisissez votre clé API
Anthropic (stockée dans le trousseau) ; un indicateur signale que cette requête part
au cloud. Conseil : Ctrl+L avant, pour minimiser les données envoyées.
C'est le composant le plus important du projet : il garantit que la sûreté ne dépend pas de la fiabilité du modèle.
| Niveau | Nom | Exemples | Comportement |
|---|---|---|---|
| 0 | Auto | lire un fichier, lister, monitorer | Exécuté sans confirmation |
| 1 | Confirmation | écrire/déplacer, installer un paquet | Dialogue simple |
| 2 | Renforcée | supprimer, sudo, modifier le système, /etc /boot |
Confirmation explicite + détail |
| 3 | Bloqué | rm -rf /, formatage, zones critiques |
Jamais exécuté, même confirmé |
- Statique d'abord : le niveau vient du code (
permissions/risk_levels.py), jamais du LLM. - Escalade par arguments : ne peut qu'augmenter le risque (ex. écrire dans
~/.ssh). - Blocklist en premier : le niveau 3 est vérifié avant tout et ne peut être contourné.
- Mémorisation : une fois / ce dossier / cette session.
- Audit : chaque action et décision est journalisée dans
data/audit.db(SQLite).
La sécurité de My_OS repose sur l'architecture, pas sur des correctifs ajoutés après coup. Trois invariants non négociables :
- Le LLM ne décide jamais de son niveau de permission — c'est du code statique. La blocklist (niveau 3) est infranchissable.
- Tout contenu lu (fichier, web, écran, sortie de commande) est une donnée non fiable, jamais une instruction — défense contre l'injection de prompt indirecte.
- Le daemon tourne en utilisateur, jamais root — élévation ponctuelle via polkit ;
IPC sur socket Unix locale ; secrets via
keyring.
Le cloud reste opt-in par requête et le modèle local par défaut (privé). Sous Wayland, le confinement de la surface (layer-shell) est un plus de sécurité.
➡️ Modèle de menaces complet : docs/SECURITY.md.
Cinq couches, construites de bas en haut :
| Couche | Rôle |
|---|---|
| 0 · Base Arch Linux | kernel, drivers, paquets |
1 · Daemon myosd |
service résident, raccourci global, IPC, orchestration |
| 2 · Outils + permissions | outils système + moteur de permissions + audit (choke point) |
| 3a · Modèle local | Qwen via Ollama (défaut, privé) |
| 3b · Routeur cloud | Claude via clé API (opt-in) |
| 4 · Popup Qt | interface invoquée au raccourci |
Daemon et popup sont deux processus communiquant par socket Unix. Toute action passe
par le point de passage unique permissions/policy_engine.py.
➡️ Détails : docs/ARCHITECTURE.md · contrats d'interface : docs/INTERFACES.md.
v1 — terminée ✅ (détails et vision long terme : docs/ROADMAP.md).
- Jalon 1 — Socle : daemon systemd utilisateur, raccourci global (X11), IPC socket Unix, popup Qt.
- Jalon 2 — Fichiers + permissions : outils fichiers, moteur de permissions complet, audit SQLite, confirmations, boucle agentique, Ollama.
- Jalon 3 — Pilotage système : paquets (
pacman), réglages (D-Bus), processus (psutil), élévation polkit ponctuelle. - Jalon 4 — Routeur cloud : clé API via
keyring, toggle opt-in par requête, indicateur visible, journalisation. - Jalon 5 — Packaging : port Wayland (expérimental), profil ISO
archiso, finalisation de la documentation. - Sécurité (transverse) : daemon non-root, séparation données/instructions,
SECURITY.mdtenu à jour.
Au-delà de la v1 (vision long terme, non promise) : contrôle d'applications via accessibilité (AT-SPI), contrôle par vision d'écran, défenses anti-injection avancées, Wayland natif grand public. Voir docs/ROADMAP.md.
My_OS/
├── daemon/ # Couche 1 — cœur résident
│ ├── myosd.py # point d'entrée du service
│ ├── hotkey_listener.py # raccourci global (X11 pynput / Wayland portal)
│ ├── ipc_server.py # socket Unix daemon ↔ popup
│ ├── orchestrator.py # boucle agentique requête → modèle → outils
│ └── confirmation_provider.py
├── permissions/ # Couche 2 — sécurité (cœur)
│ ├── risk_levels.py # table statique outil → niveau
│ ├── policy_engine.py # décision + escalade (point de passage unique)
│ ├── blocklist.py # niveau 3, jamais autorisé
│ ├── confirmation.py
│ ├── session_grants.py # une fois / dossier / session
│ └── audit_log.py # journal SQLite
├── tools/ # outils système
│ ├── base_tool.py # base + risk_level
│ ├── files.py # fichiers
│ ├── packages.py # pacman
│ ├── system_settings.py # D-Bus / pactl
│ └── processes.py # psutil
├── models/ # Couche 3 — IA
│ ├── local_llm.py # Qwen/Ollama (défaut)
│ ├── cloud_router.py # routeur + API Anthropic (opt-in)
│ ├── secrets.py # clé API via keyring
│ └── stub_model.py # backend de règles (tests / sans Ollama)
├── ui/ # Couche 4 — popup Qt
│ ├── popup.py # fenêtre PySide6
│ ├── markdown_render.py # rendu via QTextBrowser
│ ├── confirm_dialog.py # dialogue de confirmation
│ ├── styles.py # thème sombre/orange
│ └── wayland_layer.py # présentation Wayland (layer-shell), repli X11
├── core/
│ ├── config.py # config + résolution socket
│ ├── ipc.py # cadrage des messages
│ ├── elevation.py # exécution système + polkit (pkexec)
│ ├── session.py # détection X11/Wayland
│ └── logger.py
├── data/
│ └── audit.db # journal d'audit (généré)
├── docs/
│ ├── ARCHITECTURE.md
│ ├── SECURITY.md # modèle de menaces
│ ├── INTERFACES.md # contrats d'interface
│ ├── INSTALLATION.md # install (sources + ISO)
│ └── ROADMAP.md # v1 + vision long terme
├── packaging/ # ISO live (archiso)
│ ├── build_iso.sh
│ ├── README.md
│ └── archiso/ # profiledef, packages, airootfs
├── tests/ # ~390 tests (permissions en priorité)
├── config.yaml
├── myosd.service # service systemd utilisateur
├── requirements.txt
├── launch_dev.sh
└── pyproject.toml
pip install -r requirements.txt
./launch_dev.sh # daemon + popup en dev (X11)
pytest # tous les tests
pytest tests/test_permissions/ # le cœur de sécurité (prioritaire)
ruff check . && ruff format . # lint + formatConventions : Python 3.10+, type hints partout, docstrings sur les fonctions publiques.
Tout nouvel outil hérite de tools/base_tool.py et doit déclarer un risk_level.
Aucune action ne contourne permissions/policy_engine.py. Aucun secret en clair.
Les contributions sont bienvenues !
- Forkez, créez une branche de feature (
git checkout -b ma-feature). - Respectez les conventions ci-dessus et les contrats de docs/INTERFACES.md.
- Couvrez le module
permissions/en priorité ;ruffpropre, tests verts. - Pour la sécurité, lisez d'abord docs/SECURITY.md — aucun changement ne doit affaiblir les trois invariants.
- Ouvrez une Pull Request claire (un sujet = une PR).
Signalements de bugs et idées : via les issues GitHub.
MIT. Vous êtes libre d'utiliser, modifier et redistribuer My_OS.
Conçu dans la lignée de My_AI. Construit pour rester local, privé et sûr. Merci aux projets qui le rendent possible : Arch Linux, archiso, Ollama, PySide6/Qt, polkit, et l'écosystème Python.