Le problème produit.
Les informations professionnelles se dispersent souvent entre d’anciens CV, des plateformes d’emploi, des notes et des portails de candidature. Les outils AI génériques ajoutent un risque : une réponse soignée peut perdre le lien avec le fait qui la justifie.
Le premier démarrage part de ce que beaucoup de personnes possèdent déjà : un CV. CareerOS crée d’abord le plus petit profil valide et révisionné, importe le document localement dans des limites fixes et laisse chaque fait extrait non confirmé. L’utilisateur arrive directement à la relecture des faits, pas dans un compte à moitié créé ni face à une erreur inexpliquée.
Ce que le système doit protéger.
L’architecture suit quatre contraintes produit :
- Les données professionnelles privées, les documents générés et les analyses restent sur l’appareil.
- Le matching et le coaching assistés par LLM exigent un runtime local approuvé ; aucun modèle cloud ne sert de solution de repli.
- Les suggestions générées ne peuvent pas remplacer silencieusement les faits sources ni leur historique.
- Sauvegardes, exports et effacement doivent couvrir ensemble les données structurées et les artefacts locaux.
La décision de conception.
La difficulté n’était pas d’ajouter une fenêtre de chat. Il fallait séparer les preuves, l’état déterministe des workflows et l’interprétation du modèle. Ces trois domaines ne présentent pas les mêmes défaillances et ne doivent pas partager une structure de données vague.
Je les ai répartis entre un coffre de carrière, des registres reproductibles de préparation et de candidature, et des pipelines d’analyse locale validés par schéma. L’interface peut montrer l’origine d’une conclusion et la correction qui appartient au fait source.
Un runtime local supervisé.
Tauri gère l’application de bureau et supervise un sidecar FastAPI sur loopback. React fournit l’espace de travail, SQLite et les artefacts locaux conservent le registre durable, tandis qu’un runtime géré compatible avec llama.cpp exécute l’analyse LLM obligatoire sans devenir une couche de stockage.
Pourquoi ces technologies.
Chaque composant garde le produit local, vérifiable et raisonnablement simple à distribuer.
Tauri comme shell de bureau.
- Pourquoi
- Il convient à une application locale qui doit intégrer fenêtres natives, fichiers et supervision de services sans embarquer un navigateur complet.
- Ce que j’ai écarté
- Electron alourdirait le produit et sa surface d’exécution ; une solution uniquement web ne piloterait pas le sidecar et les artefacts locaux avec la même fiabilité.
- Ce que cela a coûté
- J’accepte une frontière Rust supplémentaire et un packaging propre à chaque plateforme.
Un sidecar FastAPI pour les services applicatifs.
- Pourquoi
- Les workflows documentaires et analytiques restent en Python, tout en étant exposés au shell par une API loopback étroite et vérifiable.
- Ce que j’ai écarté
- Tout réécrire en Rust dupliquerait l’écosystème Python ; placer la logique dans le navigateur affaiblirait le contrôle sur les données locales.
- Ce que cela a coûté
- Je dois donc démarrer, superviser et versionner un second processus.
SQLite comme registre versionné.
- Pourquoi
- Transactions, migrations et fichier unique correspondent à un espace de travail personnel possédé localement, et non à un service partagé hébergé.
- Ce que j’ai écarté
- Un serveur de base local ajouterait un processus d’administration et des identifiants ; un stockage cloud introduirait le réseau et la frontière du fournisseur. Aucun ne répond à un besoin de service partagé présent dans le périmètre.
- Ce que cela a coûté
- La contrepartie tient à une concurrence limitée et à la responsabilité des migrations et sauvegardes locales.
Un runtime local compatible avec llama.cpp.
- Pourquoi
- L’analyse reste dans la frontière déclarée de l’appareil et peut être limitée aux modèles et tâches approuvés.
- Ce que j’ai écarté
- Une API LLM cloud transférerait les données professionnelles hors de l’appareil et ferait dépendre confidentialité et comportement d’un service distant.
- Ce que cela a coûté
- En échange, la première configuration prend du temps et l’expérience dépend du matériel et des modèles pris en charge.
Les choix qui en font un véritable utilitaire.
Le travail utile se déroule avant et après l’appel au modèle.
Créer le registre avant d’importer le CV
Le premier démarrage crée un profil révisionné minimal, puis lance un import local borné. Les faits extraits restent des candidats jusqu’à leur validation. Le CV accélère donc la configuration sans devenir une vérité incontestable.
Le compromisL’onboarding exige une relecture explicite, mais une extraction incomplète ou en échec ne laisse pas le coffre dans un état ambigu.
Journaliser avant de modifier les données privées
Réinitialisation, restauration, effacement, migrations et fichiers privés consignent d’abord une intention bornée. La reprise vérifie identité, taille et condensat par des descripteurs stables.
Le compromisLa maintenance exige une logique de reprise ; en échange, redémarrage ou commit ambigu ne laisse pas d’opération partielle silencieuse.
Donner aux agents une porte séparée en lecture seule
Agent Access demande à l’utilisateur connecté de choisir les périmètres et de s’authentifier à nouveau avant d’afficher une seule fois le jeton bearer. Les autorisations expirent et restent révocables. La CLI installable et le serveur MCP exposent sur stdio un ensemble fermé d’outils en lecture seule, sans prompt libre ni API distante d’écriture.
Le compromisL’utilisateur doit encore configurer son client agent, et un client externe peut transmettre les données lues. Ce contrat étroit rend l’automatisation utile sans partager la session de bureau.
Comment le produit est vérifié.
Pour v1.11.1, 2 194 tests backend réussissent, 7 sont ignorés comme prévu et la couverture globale atteint 81,91 %, branches comprises. S’y ajoutent 476 tests frontend dans 79 fichiers et 27 tests Rust. Migration, archive, journaux, reprise et publication concurrente sont testés en échec.
CI protégée, CodeQL et conteneurs sont au vert sur 96ca0f8. La répétition et le tag signé ont chacun construit et testé six paquets natifs ; les mêmes octets du wheel ont fonctionné sous Linux, macOS et Windows avec Python 3.12 et 3.13. La version immuable publie 26 artefacts liés par digest.
Ce qui existe aujourd’hui.
v1.11.1 fournit un utilitaire de bureau avec démarrage depuis un CV, Career Vault, recherche guidée, Job Library, timelines, studio de CV, archive v6 et analyse locale. Réinitialisation, restauration, effacement, migrations et fichiers privés reprennent durablement après redémarrage.
Familles de sessions à rotation, configuration fermée et réponses locales bornées protègent loopback. Les diagnostics publics sont sans contenu privé ; forced-colors, clavier et WCAG couvrent connexion et Agent Access en anglais et italien sur les layouts responsives.
L’application de bureau authentifiée gère maintenant les autorisations de sept opérations en lecture seule exposées par une CLI et un serveur MCP sur stdio, tous deux livrés dans le wheel de publication et authentifiés par jeton bearer. Codex, Claude Code et les scripts shell peuvent consulter une vue volontairement réduite d’un compte autorisé, mais ne peuvent ni modifier le coffre, ni invoquer de prompts libres, ni ouvrir de transport distant.
Il ne prétend pas qu’un LLM puisse décider d’une carrière. Le modèle aide à interpréter un ensemble de preuves maîtrisé ; l’utilisateur conserve le registre, les sources et la décision finale.
Registre des preuves.
Le dépôt actuel consigne ces vérifications et limites reproductibles :
- Backend
- La suite de publication de la v1.11.1 réussit 2 194 tests backend ; 7 sont ignorés comme prévu. La couverture globale atteint 81,91 %, branches comprises.
- Frontend + shell
- Les 476 tests frontend dans 79 fichiers et les 27 tests Rust réussissent. Les contrats de licences, d’icônes, de bundle, de navigateur, de conteneurs et de supply chain portent sur le même commit.
- Reprise durable après redémarrage
- Des états persistants et journaux bornés avec sommes de contrôle permettent à réinitialisation, restauration, effacement, migrations et fichiers privés de converger après redémarrage, sans chemin ni contenu non borné.
- Sessions et diagnostics
- La rotation à usage unique appartient à des familles de sessions persistantes ; un rejeu révoque la famille et la maintenance reste séparée de l’espace de travail. Les diagnostics publics viennent uniquement d’un registre fermé, typé et sans contenu privé.
- Accès des agents
- L’application de bureau délivre des autorisations limitées et révocables pour sept opérations en lecture seule exposées par la CLI et le serveur MCP. La version fournit les deux commandes dans un wheel Python installable, affiche une fois le jeton bearer et ne conserve que son condensat.
Version publiée vérifiée v1.11.1 Vérification du
Cette étude décrit la version immuable v1.11.1 au commit 96ca0f8. Tag signé et 26 artefacts suivent une répétition sur six cibles natives et six combinaisons système/Python pour Agent Access. Sommes de contrôle et provenance GitHub lient les octets ; les paquets natifs restent des builds communautaires non signés, sans signature de plateforme ni notarisation. Aucun résultat professionnel, précision de modèle ou support matériel universel n’est revendiqué.