README.fr.md
Rama main · réplica de lectura del repositorio original.
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/wordmark-dark.svg"><img src="docs/wordmark-light.svg" alt="career-ops" width="250" height="56"></picture></p>
<p align="center">L'agent IA open source de recherche d'emploi.</p>
<p align="center">
<a href="README.md">English</a> |
<a href="README.es.md">Español</a> |
<a href="README.de.md">Deutsch</a> |
<a href="README.fr.md">Français</a> |
<a href="README.pt-BR.md">Português (Brasil)</a> |
<a href="README.ko-KR.md">한국어</a> |
<a href="README.ja.md">日本語</a> |
<a href="README.cn.md">简体中文</a> |
<a href="README.zh-TW.md">繁體中文</a> |
<a href="README.ua.md">Українська</a> |
<a href="README.ru.md">Русский</a> |
<a href="README.pl.md">Polski</a> |
<a href="README.da.md">Dansk</a> |
<a href="README.ta.md">தமிழ்</a> |
<a href="README.ar.md">العربية</a> |
<a href="README.hi.md">हिन्दी</a> |
<a href="README.tr.md">Türkçe</a> |
<a href="README.vi.md">Tiếng Việt</a> |
<a href="README.id.md">Bahasa Indonesia</a>
</p>
<p align="center"><a href="https://career-ops.org/fr/docs?utm_source=readme&utm_content=fr">Documentation complète en français : career-ops.org/fr/docs</a></p>
<!-- The non-breaking spaces ( ) and word joiners (⁠) below decide where each line wraps on a phone. Keep them when editing. -->
<p align="center"><a href="https://github.com/santifer"><img src="docs/avatar-santifer.png" width="48" height="48" align="middle" alt="Santiago Fernández de Valderrama Aparicio"></a> Créé par <a href="https://github.com/santifer"><strong>@santifer</strong></a>, avec <a href="https://github.com/career-ops-hq/career-ops/blob/main/README.fr.md#builders"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/builders-stack-dark.svg"><img src="docs/builders-stack-light.svg" alt="" height="32" align="middle"></picture></a> <a href="https://github.com/career-ops-hq/career-ops/blob/main/README.fr.md#builders">700+ contributeurs</a></p>
<p align="center">
<strong>Des mois à envoyer des CV dans le silence.</strong><br>
Alors j'ai construit le filtre dont j'avais besoin.
</p>
<p align="center">
<strong>740 annonces évaluées. 68 candidatures. 12 entretiens. 1 offre.</strong><br>
J'en ai été le premier utilisateur. J'ai eu le poste. Puis je l'ai publié en open source.
</p>
<p align="center">
Collez une offre. Sur votre machine, il vous dit si elle est encore ouverte et si elle vous correspond.<br>
Il adapte votre CV et rédige vos réponses. <strong>Vous cliquez sur Envoyer.</strong>
</p>
<p align="center">
<img src="docs/demo.gif" alt="La recherche de l'auteur lui-même dans le tableau de bord de career-ops : des annonces notées, un compteur rouge de celles marquées « ne pas postuler », puis un rapport d'évaluation complet" width="800">
</p>
<p align="center"><sub>Ma propre recherche, à mi-parcours, avec l'interface en espagnol.</sub></p>
<p align="center">
Les entreprises utilisent l'IA pour filtrer les candidats.<br>
<strong>J'ai simplement donné aux candidats une IA pour <em>choisir</em> leurs entreprises.</strong>
</p>
<p align="center">
Six mois plus tard, <strong>j'ai quitté ce poste.</strong><br>
Aujourd'hui, nous construisons career-ops pour que vous décrochiez le vôtre.
</p>
<p align="center"><a href="#à-toi">Essayer sur une offre ↓</a> · <a href="https://santifer.io/career-ops-system">Lire l'histoire complète →</a></p>
<p align="center"><sub>Tu préfères éviter le terminal ? <a href="https://career-ops.org/fr/waitlist?ref=readme-fr">Inscris-toi sur la liste d’attente d’une version web →</a></sub></p>
<br>
<p align="center"><a href="HIRED.md"><img src="docs/hired-badge.svg" alt="Hired with career-ops: public stories on the record"></a></p>
<p align="center">Ceux qui sont venus après moi ont écrit comment ils ont été embauchés.</p>
<p align="center">
<a href="HIRED.md"><img src="docs/hired-wall.svg" alt="Des histoires d'embauche que tu peux ouvrir et lire" width="800"></a>
</p>
<p align="center"><sub>Chaque carte est une issue publique que tu peux ouvrir. Tu as décroché le tien ? <a href="https://github.com/career-ops-hq/career-ops/issues/new?template=i-got-hired.yml">Laisse ta carte →</a></sub></p>
<p align="center">⭐ <strong>Si career-ops t'a été utile, une étoile aide la prochaine personne à le trouver.</strong></p>
<br>
<p align="center">
<a href="https://wired.com.gr/article/to-ai-ergaleio-pou-fernei-epanastasi-ston-tropo-pou-psachnoume-douleia/" rel="noopener noreferrer nofollow"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/press/wired-dark.svg"><img src="docs/press/wired.svg" alt="WIRED" height="32"></picture></a>
<a href="https://www.businessinsider.com/how-i-built-tool-filter-job-listings-landed-head-ai-2026-4" rel="noopener noreferrer nofollow"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/press/business-insider-dark.svg"><img src="docs/press/business-insider.svg" alt="Business Insider" height="32"></picture></a>
</p>
<p align="center">
<a href="https://vercel.com/open-source-program"><img alt="Vercel OSS Program" src="https://vercel.com/oss/program-badge-2026.svg" height="32"></a>
</p>
<p align="center">
<a href="https://trendshift.io/repositories/25195" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/repositories/25195" alt="GitHub Trending: #1 repository of the day (Trendshift)" width="250" height="55"></a>
<a href="https://www.producthunt.com/products/santifer-io?utm_source=badge-featured&utm_medium=badge" rel="noopener noreferrer"><img src="docs/press/producthunt.svg" alt="Featured on Product Hunt" width="206" height="54"></a>
</p>
## À toi
Colle une offre à laquelle tu allais postuler ce soir. Si elle revient en <em>ne pas postuler</em>, tu viens de récupérer ta soirée. Si elle revient avec un plan, tu sais quoi faire ensuite.
```bash
npx @santifer/career-ops init
```
<p align="center"><sub>Open source. En local. Dans la CLI d'IA que tu utilises déjà. <a href="docs/RUNNING_ON_A_BUDGET.md">Modèles gratuits et locaux inclus.</a></sub></p>
## Tu n'as pas à chercher seul
Le silence après avoir cliqué sur envoyer ne dit rien de toi. Assez de gens ont vu la même chose pour écrire la pratique noir sur blanc, en six lignes :
> Mieux postuler, à moins d'offres. Le signal plutôt que le volume. Les preuves plutôt que les mots-clés. Un humain décide. Local d'abord. La dignité des deux côtés de la table.
<p align="center"><a href="https://career-ops.org/manifesto?utm_source=readme"><img src="https://img.shields.io/badge/dynamic/regex?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcareer-ops-hq%2Fcareer-ops%2Fmain%2FSIGNATURES.md&search=n%3A(%5Cd%2B)%5Cs*%24&replace=%241%20signatories&label=THE%20CAREEROPS%20MANIFESTO&color=DD7627&style=for-the-badge&labelColor=2b3137" alt="Le manifeste CareerOps : nombre de signataires en direct"></a></p>
<p align="center">Quelques-uns d'entre eux, avec leurs propres mots.</p>
<p align="center">
<a href="https://career-ops.org/manifesto?utm_source=readme"><img src="docs/manifesto-wall.svg" alt="Trois signatures du manifeste CareerOps, avec leurs propres mots" width="800"></a>
</p>
<p align="center"><sub>Chaque signature est un commit que tu peux auditer. <a href="https://career-ops.org/manifesto?utm_source=readme">Les lire toutes, ou ajouter la tienne →</a></sub></p>
<br>
Le recrutement ne se réparera pas tout seul. Les gens qui le subissent, eux, le peuvent, et ils sont déjà dans la salle, à comparer leurs notes et à réparer les setups les uns des autres.
<a id="builders"></a>
<p align="center"><a href="CONTRIBUTING.md"><img src="https://warpchart.dev/api/builders?lang=fr" alt="Mur animé des avatars GitHub des contributeurs, qui se remplit par ordre d'arrivée depuis avril 2026, la case suivante restant libre." width="100%"></a></p>
[C'est ici que le correctif s'écrit](CONTRIBUTING.md). Une salle, pas un club. **Construisons ensemble.**
<p align="center"><a href="https://discord.gg/8pRpHETxa4"><img src="docs/discord-badge.svg" alt="Discord : nombre de membres du serveur career-ops en direct"></a></p>
## Sponsors
career-ops est gratuit pour les candidats, pour toujours. Ces entreprises sponsorisent le projet :
<p align="center">
<a href="https://serpapi.com/career-ops-org" title="SerpApi"><img src="docs/sponsors/serpapi.svg" alt="SerpApi" height="48"></a>
</p>
<p align="center"><strong>SerpApi</strong> · Build a portfolio project with live search data. SerpApi gives developers structured JSON/Markdown from Google Search, Maps, Shopping, and other engines through a simple API call.</p>
> Le sponsoring achète une visibilité clairement signalée, jamais de l'influence : aucune somme d'argent ne change la feuille de route ni ne place quoi que ce soit dans le produit. Les sponsors n'apparaissent jamais dans les évaluations, les classements ou les recommandations.
## Ce que career-ops fait pour toi
Colle une offre. Il te dit si la soirée en vaut la peine.
- **Toujours ouverte ?** Il vérifie que l'annonce est encore en ligne avant que tu n'écrives un mot.
- **Pas pour toi ?** Il note le poste face à ton vrai CV et te dit de passer si ça colle mal. Tu peux passer outre.
- **Ça vaut le coup ?** Il rédige le CV, la lettre de motivation et les réponses. Tu les lis. Tu les envoies.
- **À qui je parle ?** Il trouve la personne et rédige le message. Il ne l'envoie jamais.
- **Où va tout ça ?** Chaque candidature reste sur ta machine. Rien n'est envoyé chez nous.
- **Qu'est-ce que je devrais apprendre ?** Après une série de non, il nomme la lacune.
Les premiers passages sont bruts. Il ne te connaît pas encore. Parle-lui : ton CV, ce que tu veux, ce que tu refuses. Vois ça comme la première semaine d'un recruteur.
Au premier lancement, il te demande tout ça dans le chat. Rien à configurer à la main.
## Ce que career-ops ne fait pas
- **Envoyer une candidature automatiquement.** Il rédige la réponse de chaque champ ; tu relis et tu cliques sur Envoyer. Le script ne fait jamais de POST (`prepare-application.mjs`).
- **Envoyer un e-mail.** Brouillons uniquement. Il n'y a aucun transport de courrier dans ce code.
- **Téléphoner à la maison.** Pas de télémétrie, pas de backend à nous. Ton CV va de ta machine au fournisseur d'IA que tu as choisi, et nulle part ailleurs. Le seul registre public, c'est ce dépôt : `HIRED.md` et ses issues.
- **Te pousser à postuler sous 4,0/5.** Il te dira de ne pas le faire. Tu peux passer outre, et il te le dira.
Il reformule ton CV ; il ne doit jamais l'inventer. Un contrôle dans le code bloque un PDF dont les chiffres ou les faits ne figurent ni dans ton CV ni dans ton `article-digest.md`, mais il ne sait pas encore juger chaque reformulation. Relis chaque CV avant de l'envoyer. Détails dans la [FAQ](#faq).
## Fonctionnalités
| Fonctionnalité | Description |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| **Évaluation A-H** | Résumé du poste, correspondance avec le CV (avec le poids de chaque exigence pour cette annonce et l'origine de ce poids : formulation de la description, structure ou estimation, indiquée exigence par exigence ; une estimation ne peut jamais atteindre le niveau le plus élevé), stratégie de niveau, recherche de rémunération, personnalisation, préparation à l'entretien (STAR+R), plus une vérification de légitimité de l'annonce au bloc G (est-elle encore ouverte, est-ce une republication : des observations, pas des verdicts), et un signal d'autorisation de travail qui marque comme bloquant toute description excluant explicitement le parrainage de visa |
| **Human-in-the-Loop** | L'IA évalue et recommande, tu décides et tu agis. Le système ne soumet jamais une candidature : c'est toujours toi qui as le dernier mot <!-- hitl: absolute guarantee. Do not add "automatically", "by itself", "without your permission" or any other hedge when translating this row. --> |
| **Génération de PDF ATS** | CV lisibles par les ATS, adaptés à chaque description de poste à partir de ta propre expérience, au design Space Grotesk + DM Sans |
| **Générateur de lettres de motivation** | Lettres fondées sur la recherche avec reflet des mots-clés, quatre questions interactives d'angle (pourquoi/problèmes/approche/ton), validation du brouillon dans le chat et PDF A4 via le même pipeline HTML + Playwright que les CV. Rédige un brouillon à chaque évaluation ; complète et génère à la demande avec `/career-ops cover` |
| **Au-delà du CV** | La recherche sur l'entreprise ([`deep`](modes/deep.md)) fait remonter sa stratégie IA, ses mouvements récents, sa culture d'ingénierie et l'angle que ton profil devrait adopter. La découverte de contacts ([`contacto`](modes/contacto.md)) identifie le hiring manager, le recruteur ou le pair d'équipe qu'il vaut la peine de contacter et rédige un message LinkedIn de ≤300 caractères adapté à chaque type de contact. Les brouillons d'e-mails formels de candidature ([`email`](modes/email.md)) transforment un rapport évalué ou une description collée en objet, corps et liste de pièces jointes sans rien envoyer, soumettre ni cliquer. La candidature te met dans la file d'attente ; la recherche t'obtient une conversation. |
| **Analyse des tendances** | Schémas de refus et taux d'avancement par canal ATS (`analyze-patterns.mjs`), statistiques d'entonnoir sur toute la recherche (`stats.mjs`), détection des republications, signe possible d'une offre fantôme (`detect-reposts.mjs`) |
<details>
<summary><b>Tout le reste</b></summary>
| Fonctionnalité | Description |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| **Pipeline automatique** | Colle une URL, obtiens une évaluation complète + PDF + entrée dans le tracker |
| **Banque d'histoires d'entretien** | Accumule des récits STAR+Réflexion au fil des évaluations : 5 à 10 histoires maîtresses que tu peux adapter aux questions comportementales qu'on te pose |
| **Scripts de négociation** | Cadres de négociation salariale, réponse aux décotes géographiques, levier des offres concurrentes |
| **Brouillons d'e-mails de candidature** | E-mails formels pour recruteur, cooptation ou candidature spontanée à partir d'un rapport ou d'une description collée, avec objet, liste des pièces jointes, points d'adéquation sourcés et bloc de contact issu de ton profil. Brouillon uniquement : career-ops n'envoie, ne soumet et ne clique jamais rien. |
| **Scanner de portails** | 100+ entreprises préconfigurées (Anthropic, OpenAI, ElevenLabs, Retool, n8n...) + requêtes de recherche web personnalisées sur Ashby, Greenhouse, Lever, Wellfound |
| **Découverte d'entreprises financées** | La commande `company:funded`, pensée pour relire avant d'agir, fait remonter les entreprises récemment financées et des diagnostics de source à partir de flux publics structurés, sans toucher à tes données |
| **Traitement par lots** | Évaluation en parallèle avec des workers CLI sans interface (`claude -p` / `opencode run`) |
| **Dashboard TUI** | Interface terminal pour parcourir, filtrer et trier ton pipeline |
| **Intégrité du pipeline** | Fusion automatique, déduplication, normalisation des statuts, contrôles de santé |
| **Suite d'entretien** | Plans de préparation par blocs de temps, sessions d'entraînement avec retour, débriefs après entretien ([`interview/`](modes/interview/README.md)) et un détecteur de signaux d'alerte sur l'entreprise ([`interview-redflag`](modes/interview-redflag.md)) |
| **Phase d'offre** | Compagnon de lecture du contrat : parcours clause par clause plus une liste de questions pour l'avocat ([`offer-prep`](modes/offer-prep.md)), et un analyseur d'écart entre salaire souhaité, annoncé et réel (`salary-gap.mjs`) |
| **Relances et réponses** | Calculateur de cadence de relance et rappels préprogrammés (`followup-cadence.mjs`, `followup-seed.mjs`) ; classification des réponses de l'employeur en mises à jour du tracker ([`reply-watch`](modes/reply-watch.md)) |
| **Système de plugins** | Intégrations optionnelles (Gmail, Notion, Apify + un registre communautaire), désactivées par défaut ; voir [docs/PLUGINS.md](docs/PLUGINS.md) |
</details>
## Comment ça fonctionne
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/how-it-works-dark.svg"><img src="docs/how-it-works-light.svg" alt="How it works: you paste a job URL or description. Archetype Detection classifies it as LLMOps, Agentic, PM, SA, FDE or Transformation. The A-H Evaluation reads cv.md and covers match, gaps, comp research, STAR stories and legitimacy. It produces a report (reports/*.md), the tailored CV in the format set by cv.output_format — a PDF by default — and a tracker entry (data/applications.md)." width="760"></picture></p>
## Démarrage rapide
**Le plus rapide, une seule commande :**
```bash
npx @santifer/career-ops init
```
> 💡 `npx` est livré avec [Node.js](https://nodejs.org) : il exécute l'installeur une fois,
> sans rien installer globalement. Pas encore de Node ? Installe-le d'abord.
> (Tu utilises déjà une CLI Claude Code / Codex ? Alors tu l'as déjà.)
Cela clone la dernière version dans `./career-ops` et installe les dépendances. Ensuite :
```bash
cd career-ops
claude # or codex / qwen / opencode / agy / grok — open your AI CLI here
```
**Au premier lancement, career-ops te guide dans la configuration (ton CV, ton profil et les postes visés) simplement en discutant. Rien à éditer à la main.**
<details>
<summary><b>Tu préfères l'installer à la main ? (git clone)</b></summary>
```bash
git clone https://github.com/career-ops-hq/career-ops.git
cd career-ops && npm install
npx playwright install chromium # only needed for PDF generation
# On a non-Debian/Ubuntu Linux distro (Fedora, Arch, ...), Chromium's system
# libraries aren't installed by the line above — install them yourself with
# your distro's package manager if PDF generation fails to launch the browser
# (Playwright's own docs list the required libraries per platform).
# 2. Open your AI CLI in this directory. On first launch it walks you
# through setup (your CV, profile and target roles) by chatting
claude # or codex / opencode / qwen / agy / grok
# Then ask your CLI to adapt the system to you:
# "Change the archetypes to backend engineering roles"
# "Translate the modes to English"
# "Add these 5 companies to portals.yml"
# "Update my profile with this CV I'm pasting"
# 3. Start using
# Colle l'URL ou le texte d'une offre pour déclencher l'auto-pipeline.
# Tous les autres modes, et comment les demander dans ta CLI : voir Utilisation ci-dessous.
```
</details>
### Installation globale
```bash
npm i -g @santifer/career-ops
```
Cela installe le binaire `career-ops` globalement pour que tu puisses lancer `career-ops init [folder]` sans `npx`. `init` est sa seule commande : elle prépare un espace de travail, et tout le reste se passe dans ta CLI de codage IA (voir Utilisation plus bas), pas via ce binaire.
**Laquelle utiliser ?**
- `npx @santifer/career-ops init` : idéal pour la première utilisation ; crée un dossier de projet dédié.
- `npm i -g @santifer/career-ops` : si tu préfères taper `career-ops init` plutôt que la forme `npx`. Il n'ajoute aucune autre commande.
### Autres façons de l'utiliser
- **Depuis n'importe quel dossier, comme plugin Claude Code :** [docs/CLAUDE_PLUGIN.md](docs/CLAUDE_PLUGIN.md).
- **Sans CLI d'IA :** des scripts autonomes Gemini, Ollama et compatibles OpenAI évaluent une offre par eux-mêmes. Voir [docs/SCRIPTS.md](docs/SCRIPTS.md#geminieval--ollamaeval--openaieval).
> **Le système est conçu pour être personnalisé par ta CLI de codage IA elle-même.** Modes, archétypes, pondérations du score, scripts de négociation : demande-lui simplement de les changer. Elle lit les mêmes fichiers qu'elle utilise, donc elle sait exactement quoi éditer.
Voir [docs/SETUP.md](docs/SETUP.md) pour le guide d'installation complet, [docs/RUNNING_ON_A_BUDGET.md](docs/RUNNING_ON_A_BUDGET.md) pour faire tourner career-ops à moindre coût avec des modèles personnalisés ou locaux (et [docs/FREE_TIER.md](docs/FREE_TIER.md) pour le faire tourner gratuitement sur l'offre gratuite d'Antigravity CLI), [docs/AUTOMATION.md](docs/AUTOMATION.md) pour planifier des scans récurrents et une recette de tri vers une liste courte sans dépenser de tokens, [docs/APPLY_AUTOFILL.md](docs/APPLY_AUTOFILL.md) pour les détails du flux de remplissage automatique des ATS, [docs/LINKEDIN_JOIN.md](docs/LINKEDIN_JOIN.md) pour croiser un export de tes relations LinkedIn avec les entreprises de ton entonnoir, et [docs/FAQ.md](docs/FAQ.md) pour les réponses aux questions courantes de configuration, dont [comment la provenance des histoires empêche les chiffres inventés](docs/FAQ.md#why-does-career-ops-refuse-to-use-a-number-from-my-story-bank). Les principes de conception sont dans [ARCHITECTURE.md](ARCHITECTURE.md) ; les flux d'exécution dans [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
## Utilisation
Colle l'URL ou la description d'une offre dans ta CLI d'IA. career-ops vérifie qu'une offre liée est toujours ouverte (un texte collé n'a pas de lien à vérifier), la note par rapport à ton CV, rédige un rapport, adapte ton CV (en PDF par défaut) et ajoute une ligne à ton tracker. Cela suffit pour la plupart des jours. Tout le reste est un mode que tu demandes par son nom. Si une offre est illisible, le pipeline s'arrête et te demande de coller le texte.
### Demander un mode
| CLI | Comment demander `scan` |
| --- | --- |
| Claude Code, OpenCode, Antigravity CLI (`agy`), Grok Build CLI | `/career-ops scan` |
| Pi | `/skill:career-ops scan` |
| Codex, Qwen, Cursor ou toute autre CLI prise en charge | Langage naturel : « Run the career-ops scan mode » |
`/career-ops` seul affiche le menu des commandes dans les CLI qui l'utilisent. Le langage naturel fonctionne dans toutes les CLI prises en charge. En tant que plugin Claude Code, la commande est `/career-ops:career-ops`.
Toutes partagent un même routeur, `.agents/skills/career-ops/SKILL.md`, et les mêmes fichiers `modes/*.md` : toutes les CLI aiguillent donc une demande de la même façon (les modes qui sollicitent beaucoup le navigateur ont aussi besoin des outils Playwright). Les commandes slash ne sont pas garanties dans Codex : demande en langage naturel, ou lance un prompt en mode headless avec `codex exec "Evaluate this JD with career-ops auto-pipeline: https://company.com/jobs/123"` ([docs/CODEX.md](docs/CODEX.md)). La façon de lancer career-ops dans chaque CLI prise en charge, les commandes headless quand une CLI en a une, et les notes de configuration propres à chaque CLI sont dans [docs/SUPPORTED_CLIS.md](docs/SUPPORTED_CLIS.md).
### Les commandes du quotidien
| Commande | Ce qu'elle fait |
| --- | --- |
| *colle une URL ou une description d'offre* | Pipeline complet : vérification que l'offre est ouverte (URL uniquement), évaluation A-G plus H si le score est élevé, rapport, CV adapté (PDF par défaut), ligne dans le tracker |
| `scan` | Scanner tes portails pour trouver de nouvelles offres et les ajouter à la boîte d'entrée (`data/pipeline.md`) |
| `pipeline` | Parcourir les URL en attente dans la boîte d'entrée (les niveaux standard et premium peuvent écarter les offres manifestement hors sujet) |
| `apply` | Remplir un formulaire de candidature avec toi, champ par champ. Elle s'arrête avant l'envoi |
| `tracker` | Où en est chaque candidature |
| `followup` | Quelles candidatures sont à relancer, avec des brouillons |
<details>
<summary><b>Toutes les commandes, par étape de la recherche</b></summary>
`oferta`, `ofertas` et `contacto` gardent leurs noms espagnols d'origine : offre, offres, contact.
**Trouver des postes**
| Commande | Ce qu'elle fait |
| --- | --- |
| [`scan`](modes/scan.md) | Scanner les portails et découvrir de nouvelles offres |
| [`discover`](modes/discover.md) | Convertir une liste de noms d'entreprises en tableaux ATS scannables. Par défaut, simple aperçu : l'ajout à `portals.yml` n'a lieu qu'avec `--write` (sans token) |
| [`pipeline`](modes/pipeline.md) | Traiter les URL en attente de la boîte d'entrée (`data/pipeline.md`) |
| [`triage`](modes/triage.md) | Premier tri rapide go/no-go d'après `modes/_brief.md`, avant une évaluation complète (n'écrit aucun fichier) |
| [`batch`](modes/batch.md) | Évaluer de nombreuses offres avec des workers headless (en parallèle avec Claude, une par une avec les autres CLI) |
| [`titles`](modes/titles.md) | Suggérer des intitulés de poste proches à partir de ton CV pour élargir la recherche |
**Évaluer un poste**
| Commande | Ce qu'elle fait |
| --- | --- |
| *colle une URL ou une description d'offre* | [Auto-pipeline](modes/auto-pipeline.md) : évaluation + rapport + CV adapté (PDF par défaut) + entrée dans le tracker |
| [`oferta`](modes/oferta.md) | Évaluation seule, blocs A à G plus H si le score est élevé (sans PDF) |
| [`ofertas`](modes/ofertas.md) | Comparer et classer plusieurs offres |
| [`deep`](modes/deep.md) | Prompt de recherche approfondie sur l'entreprise |
| [`eu-swe`](modes/regional/eu-swe.md) | Calibrer une candidature européenne en ingénierie logicielle avant le CV, la candidature ou l'entretien |
**Candidater**
| Commande | Ce qu'elle fait |
| --- | --- |
| [`pdf`](modes/pdf.md) | CV optimisé pour les ATS, en PDF |
| [`ats`](modes/ats.md) | Contrôle de compatibilité ATS d'un CV généré : score et problèmes corrigibles |
| [`text`](modes/text.md) | CV adapté en markdown (reflète `cv.md`, sans PDF) |
| [`latex`](modes/latex.md) | Exporter le CV en `.tex` LaTeX/Overleaf |
| [`latex-tex`](modes/latex-tex.md) | Adapter ton propre `resume.tex` sur place (optionnel ; `cv.md` reste la valeur par défaut) |
| [`cover`](modes/cover.md) | Lettre de motivation, à partir d'une description collée ou d'un rapport évalué (`cover {slug}`) |
| [`email`](modes/email.md) | Brouillon d'e-mail de candidature formel. Brouillon uniquement : n'envoie, ne soumet et ne clique jamais |
| [`contacto`](modes/contacto.md) | Trouver le responsable du recrutement, un recruteur ou un pair, et rédiger un message LinkedIn |
| [`apply`](modes/apply.md) | Assistant de candidature en direct (Playwright depuis ce dépôt). Ne soumet pas |
**Entretien**
| Commande | Ce qu'elle fait |
| --- | --- |
| [`interview-prep`](modes/interview-prep.md) | Document de préparation d'entretien propre à l'entreprise |
| [`interview/plan`](modes/interview/plan.md) | Plan de préparation par plages horaires pour un entretien à venir |
| [`interview/practice`](modes/interview/practice.md) | Entretien d'entraînement, une question à la fois, avec des retours |
| [`interview/debrief`](modes/interview/debrief.md) | Débrief après l'entretien : combler les lacunes, anticiper le tour suivant |
| [`interview-redflag`](modes/interview-redflag.md) | Analyser les signaux d'alerte d'un employeur avant de le rejoindre |
**Après la candidature**
| Commande | Ce qu'elle fait |
| --- | --- |
| [`tracker`](modes/tracker.md) | Vue d'ensemble de l'état des candidatures |
| [`followup`](modes/followup.md) | Cadence de relance : signaler les candidatures en retard, générer des brouillons |
| [`reply-watch`](modes/reply-watch.md) | Classer les réponses de l'employeur et suggérer des mises à jour du tracker |
| [`outcome`](modes/outcome.md) | Enregistrer le résultat d'une candidature et archiver ses artefacts |
| [`offer-prep`](modes/offer-prep.md) | Lire avec toi une offre ou un contrat reçu : passage en revue des clauses et questions pour un avocat (pas un conseil juridique) |
**Ton profil et ton CV**
| Commande | Ce qu'elle fait |
| --- | --- |
| [`interview`](modes/interview.md) | Configuration du profil : un entretien interactif sur ton expérience qui construit ton CV et ton profil (pas un entraînement aux entretiens) |
| [`intake`](modes/intake.md) | Construire ou enrichir ton profil à partir des fichiers de `documents/` (CV maître, export LinkedIn). Rien n'est écrit sans ta confirmation |
| [`master-profile`](modes/master-profile.md) | Importer, relire et valider ton Master Career Profile, et préparer des faits choisis sous forme de puces de CV |
| [`add`](modes/add.md) | Ajouter un projet, un article ou un poste à ton CV (récupération, aperçu, confirmation) |
| [`expand`](modes/expand.md) | Découvrir les compétences absentes de ton CV, à partir des liens de ton profil |
| [`retro`](modes/retro.md) | Revoir cette session et garder ce que tu lui as appris sous forme de règles (n'écrit que celles que tu acceptes) |
**Améliorer ton ciblage**
| Commande | Ce qu'elle fait |
| --- | --- |
| [`patterns`](modes/patterns.md) | Analyser les schémas de refus et améliorer le ciblage |
| [`calibrate`](modes/calibrate.md) | Vérifier si tes scores d'évaluation prédisent tes résultats réels. Consultatif : ne modifie jamais le scoring |
| [`upskill`](modes/upskill.md) | Analyse des lacunes de compétences sur l'ensemble de tes rapports évalués |
| [`training`](modes/training.md) | Évaluer un cours ou une certification par rapport à ton North Star |
| [`project`](modes/project.md) | Évaluer une idée de projet de portfolio |
**Système**
| Commande | Ce qu'elle fait |
| --- | --- |
| [`agent-inbox`](modes/agent-inbox.md) | Mettre des demandes en file pour la prochaine session, puis les traiter à ce moment-là (`data/agent-inbox.md`). `inbox` fonctionne aussi |
| [`update`](modes/update.md) | Mettre à jour les fichiers système de career-ops, avec aperçu du diff et contrôle de compatibilité |
</details>
## Portails préconfigurés
Le scanner est livré avec **100+ entreprises** prêtes à être scannées et **35+ requêtes de recherche** sur les principaux sites d'emploi. Copie `templates/portals.example.yml` vers `portals.yml` et ajoute les tiennes :
**Labos d'IA :** Anthropic, OpenAI, Mistral, Cohere, LangChain, Pinecone
**IA vocale :** ElevenLabs, PolyAI, Parloa, Hume AI, Deepgram, Vapi, Bland AI
**Plateformes d'IA :** Retool, Airtable, Vercel, Temporal, Glean, Arize AI
**Centres de contact :** Ada, LivePerson, Sierra, Decagon, Talkdesk, Genesys
**Entreprise :** Salesforce, Twilio, Gong, Dialpad
**LLMOps :** Langfuse, Weights & Biases, Lindy, Cognigy, Speechmatics
**Automatisation :** n8n, Zapier, Make.com
**Europe :** Factorial, Attio, Tinybird, Clarity AI, Travelperk
**Sites d'emploi parcourus :** 55+ modules fournisseurs couvrent les API d'ATS, les flux de sites entiers, les flux XML/RSS, les flux markdown et les analyseurs locaux. Le tableau complet est dans [Sites d'emploi pris en charge](docs/SUPPORTED_JOB_BOARDS.md).
Par défaut, `node scan.mjs` (alias `npm run scan`) fait confiance à ce que renvoie chaque flux ATS. Certaines entreprises laissent des annonces périmées dans leur API publique même après la clôture du poste, si bien que ces entrées expirées peuvent se glisser dans `pipeline.md`. Passe `--verify` pour lancer Playwright après le passage par l'API et écarter les annonces expirées avant qu'elles n'atteignent le pipeline :
```bash
node scan.mjs --verify # zero-token discovery + Playwright liveness check
```
La vérification est séquentielle et ne porte que sur les nouvelles offres (après déduplication), donc le coût reste borné.
## Dashboard TUI
Le tableau de bord intégré au terminal te permet de parcourir ton pipeline visuellement :
```bash
npm run serve:dashboard # launch the TUI
npm run build:dashboard # optional: build the standalone binary
```
Fonctionnalités : 10 onglets de filtre, 8 modes de tri, vue groupée ou à plat, aperçus en chargement différé, changements de statut en ligne.
Il existe aussi une **interface web expérimentale** (alpha et optionnelle : rien ne tourne tant que tu ne la lances pas) : voir [`web/README.md`](web/README.md).
## Structure du projet
```
career-ops/
├── AGENTS.md # Canonical agent instructions (all CLIs)
├── CLAUDE.md # Claude Code wrapper (imports AGENTS.md)
├── CODEX.md # Codex wrapper (imports AGENTS.md)
├── OPENCODE.md # OpenCode wrapper (imports AGENTS.md)
├── GEMINI.md # Legacy no-op guard to avoid Antigravity duplicate context
├── cv.md # Your CV (create this)
├── article-digest.md # Your proof points (optional)
├── config/
│ └── profile.example.yml # Template for your profile
├── modes/ # Skill modes
│ ├── _shared.md # Shared context (customize this)
│ ├── oferta.md # Single evaluation
│ ├── pdf.md # PDF generation
│ ├── cover.md # Cover letter generation
│ ├── email.md # Formal application email drafts
│ ├── scan.md # Portal scanner
│ ├── batch.md # Batch processing
│ └── ...
├── templates/
│ ├── cv-template.html # ATS-optimized CV template
│ ├── portals.example.yml # Scanner config template
│ └── states.yml # Canonical statuses
├── batch/
│ ├── batch-prompt.md # Self-contained worker prompt
│ └── batch-runner.sh # Orchestrator script
├── dashboard/ # Go TUI pipeline viewer
├── data/ # Your tracking data (gitignored)
├── reports/ # Evaluation reports (gitignored)
├── output/ # Generated PDFs (gitignored)
├── fonts/ # Space Grotesk + DM Sans
├── docs/ # Setup, customization, budget guide, architecture
└── examples/ # Sample CV, report, proof points
```
## Répertoire de données externe (optionnel)
Par défaut, les données de la couche utilisateur (comme `cv.md`, `portals.yml` et les dossiers `data/`, `reports/`, `output/`) vivent dans le dossier racine du projet.
Pour séparer tes données personnelles du code (et ainsi changer de branche, tirer des mises à jour ou tester plusieurs profils plus facilement), tu peux configurer un répertoire de données externe selon l'ordre de priorité suivant :
1. **Variables d'environnement :** définis la variable `CAREER_OPS_ROOT` ou `CAREER_OPS_DATA_DIR` :
```bash
export CAREER_OPS_ROOT=~/my-career-data
```
2. **Fichier marqueur :** crée un fichier `.career-ops-data` à la racine du dépôt contenant le chemin vers ton répertoire de données.
3. **Par défaut :** la racine du dépôt.
Une fois résolu, tous les fichiers utilisateur sont résolus et écrits relativement à ce dossier, tandis que les fichiers de prompts et les scripts continuent d'être résolus relativement au dépôt.
- **Surcharge du tracker :** tu peux aussi définir `CAREER_OPS_TRACKER` pour indiquer directement le chemin du fichier tracker des candidatures.
- **Écritures :** toutes les opérations d'écriture (comme les fusions) visent canoniquement `{DATA_ROOT}/data/applications.md`.
- **Configuration du scanner :** `portals.yml` est lu et validé à `{DATA_ROOT}/portals.yml`, donc `node validate-portals.mjs` vérifie le fichier même que lit `scan.mjs`.
- **Documents générés :** les CV adaptés et les lettres de motivation sont écrits sous `{DATA_ROOT}/output/`, et le manifeste PDF qui les relie à un rapport se trouve dans `{DATA_ROOT}/data/pdf-index.tsv`. Tant que `CAREER_OPS_TRACKER` n'est pas défini, l'espace de travail du tracker qui encadre ces écritures est la racine des données, pas le checkout.
- **PDF avec surcharge du tracker :** `generate-pdf.mjs` résout `CAREER_OPS_TRACKER` avant de déduire l'espace de travail ; avec la surcharge définie, l'espace de travail est donc le dossier qui contient ce tracker (ou le dossier parent, quand le tracker se trouve dans un dossier `data/`). Le HTML du CV et chaque PDF doivent alors se trouver dans cet espace de travail, et le manifeste passe dans son `data/pdf-index.tsv`. Les lettres de motivation visent toujours `{DATA_ROOT}/output/` ; elles sont donc refusées quand ce dossier se trouve hors de l'espace de travail du tracker.
- **La couche de code ne bouge pas :** `node_modules/`, `providers/`, `modes/` et les scripts eux-mêmes se résolvent toujours par rapport au dépôt, jamais par rapport à la racine des données.
Le dashboard TUI en Go, les scripts Node.js et les modes d'agent IA respectent tous automatiquement cette hiérarchie de résolution.
## Pile technique





- **Agent** : CLI de codage IA avec skills et modes partagés (`AGENTS.md` + wrapper par CLI)
- **PDF** : Playwright + template HTML
- **Lettres de motivation** : template HTML + Playwright (PDF A4, même pipeline que les CV)
- **Scanner** : Playwright + API Greenhouse + WebSearch
- **Dashboard** : Go + Bubble Tea + Lipgloss (thème Catppuccin Mocha)
- **Données** : tableaux Markdown + configuration YAML + fichiers TSV de lot
<p align="center">
<a href="https://github.com/career-ops-hq/career-ops/releases/latest"><img src="docs/npm-badge.svg" alt="Latest release"></a>
</p>
<p align="center">
<a href="https://claude.com/claude-code"><img src="https://img.shields.io/badge/Built_with-Claude_Code-000?style=for-the-badge&logo=anthropic&logoColor=white" alt="Built with Claude Code"></a>
</p>
<p align="center">
<sub>Fonctionne aussi dans toute CLI compatible avec le standard des agent skills. Voir <a href="docs/SUPPORTED_CLIS.md">CLI prises en charge</a>.</sub><br>
<img src="https://img.shields.io/badge/Claude_Code-000?style=flat&logo=anthropic&logoColor=white" alt="Claude Code">
<img src="https://img.shields.io/badge/OpenCode-111827?style=flat&logo=terminal&logoColor=white" alt="OpenCode">
<img src="https://img.shields.io/badge/Antigravity_CLI-4285F4?style=flat&logo=google&logoColor=white" alt="Antigravity CLI">
<img src="https://img.shields.io/badge/Codex-412991?style=flat&logo=openai&logoColor=white" alt="Codex">
<img src="https://img.shields.io/badge/Qwen-615CED?style=flat" alt="Qwen">
<img src="https://img.shields.io/badge/Kimi-FF4B4B?style=flat" alt="Kimi">
<img src="https://img.shields.io/badge/GitHub_Copilot-000?style=flat&logo=githubcopilot&logoColor=white" alt="GitHub Copilot">
<img src="https://img.shields.io/badge/Grok_Build_CLI-000?style=flat&logo=x&logoColor=white" alt="Grok Build CLI">
<img src="https://img.shields.io/badge/Pi-4B3F72?style=flat" alt="Pi">
<br>
<img src="https://img.shields.io/badge/Node.js-339933?style=flat&logo=node.js&logoColor=white" alt="Node.js">
<img src="https://img.shields.io/badge/Go-00ADD8?style=flat&logo=go&logoColor=white" alt="Go">
<img src="https://img.shields.io/badge/Playwright-2EAD33?style=flat&logo=playwright&logoColor=white" alt="Playwright">
<img src="https://img.shields.io/badge/Bubble_Tea-FF75B5?style=flat&logo=go&logoColor=white" alt="Bubble Tea">
<img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="MIT">
<a href="TRADEMARK.md"><img src="https://img.shields.io/badge/Trademark-Policy-blue.svg" alt="Trademark Policy"></a>
</p>
## Également en open source
- **[cv-santiago](https://github.com/santifer/cv-santiago)** : le site portfolio (santifer.io) avec chatbot IA, tableau de bord LLMOps et études de cas. Si tu as besoin d'un portfolio pour accompagner ta recherche d'emploi, forke-le et fais-en le tien.
## FAQ
**Qu'est-ce que career-ops ?**
career-ops ([career-ops.org](https://career-ops.org), aussi connu sous le nom de **careerops**) est une recherche d'emploi par IA, open source, qui tourne en local dans ta CLI de codage IA (Claude Code, Codex, OpenCode et autres) et te laisse chaque décision. Il évalue les offres face à ton CV, génère des PDF adaptés aux ATS, trouve la bonne personne à contacter et suit tout au même endroit : c'est toujours toi qui as le dernier mot. C'est la première implémentation de référence du [Manifeste CareerOps](https://career-ops.org/manifesto).
**Le CV personnalisé peut-il inventer des choses ?**
Il ne doit pas, et les prompts le disent : reformuler, jamais inventer. `generate-pdf` bloque un CV dont les chiffres ou les faits ne figurent pas dans tes sources, sauf si tu passes `--skip-fact-check`. Le mode `pdf` lance aussi `cv-title-check.mjs`, qui compare chaque intitulé de poste du CV adapté à celui que cv.md donne au même poste (apparié par entreprise et dates) et te demande, pour chaque différence, si tu la gardes ou si tu reviens à l'intitulé de cv.md. Il avertit sans bloquer, car reformuler un intitulé relève parfois de ton choix. Rien ne juge encore les reformulations : [#1411](https://github.com/career-ops-hq/career-ops/issues/1411) (contrôle de fidélité bloquant) suit ce point. D'ici là, relis chaque CV avant de l'envoyer. L'[avertissement légal](LEGAL_DISCLAIMER.md) dit la même chose en plus long.
**Puis-je utiliser career-ops gratuitement, ou avec un modèle moins cher / local ?**
Oui. career-ops est indépendant de la CLI et tourne avec des modèles gratuits et locaux (modèles gratuits d'OpenRouter, Ollama ou n'importe quel endpoint compatible OpenAI), donc tu n'es lié à aucun abonnement payant. Voir [docs/RUNNING_ON_A_BUDGET.md](docs/RUNNING_ON_A_BUDGET.md) pour la configuration complète.
**Je paie Claude Pro/Max mais career-ops consomme des crédits API. Pourquoi ?**
Parce qu'une `ANTHROPIC_API_KEY` dans ton environnement prend le pas sur ton abonnement connecté : la CLI utilise la clé et facture au token. Lance `echo $ANTHROPIC_API_KEY` et, si quelque chose s'affiche, retire-la de ton profil shell, redémarre le terminal et lance `/login`. Le mode par lots est l'exception, car les workers `claude -p` n'utilisent pas la connexion interactive : lance `claude setup-token` une fois et exporte le résultat comme `CLAUDE_CODE_OAUTH_TOKEN`. Guide complet dans [docs/RUNNING_ON_A_BUDGET.md](docs/RUNNING_ON_A_BUDGET.md#2b-already-paying-for-a-subscription-make-sure-you-are-using-it).
**Avec quelles CLI d'IA career-ops fonctionne-t-il ?**
career-ops tourne sur n'importe quelle grande CLI de codage IA (Claude Code, Codex, Gemini / Antigravity, OpenCode, Grok, Qwen et plus) via le standard ouvert Agent Skill Standard, donc il n'est jamais lié à un seul fournisseur. Utilise la CLI que tu as déjà.
**Comment installer career-ops sous Windows ?**
career-ops fonctionne sous Windows. La configuration propre à la plateforme et ses pièges connus (détection de Git Bash, fins de ligne, Planificateur de tâches) sont dans [docs/WINDOWS.md](docs/WINDOWS.md). Si les skills ne se chargent pas à cause d'une erreur de lien symbolique pendant l'installation, la solution est dans [docs/FAQ.md](docs/FAQ.md). Les étapes complètes sont dans [docs/SETUP.md](docs/SETUP.md).
**career-ops postule-t-il aux offres à ma place ?**
Non. career-ops est un filtre, pas un robot qui postule en rafale. L'IA évalue, classe et rédige ; vous relisez et vous décidez. Il rédige et remplit ; il n'envoie jamais. Vous cliquez sur Envoyer. Cette conception avec l'humain aux commandes, c'est tout l'intérêt.
**career-ops est-il gratuit et open source ?**
Oui. career-ops est gratuit et open source, et pour le candidat il le restera toujours. C'est la première implémentation de référence du [Manifeste CareerOps](https://career-ops.org/manifesto). Lis-le, et s'il dit ce que tu crois, signe-le.
## À propos de l'auteur
Je m'appelle [Santiago Fernández de Valderrama Aparicio](https://santifer.io/about) (santifer), ancien fondateur : j'ai créé et vendu une entreprise qui fonctionne toujours sous mon nom. J'ai construit career-ops pour gérer ma propre recherche d'emploi, et ça a marché : il m'a permis de décrocher un poste de Head of Applied AI. Six mois plus tard, j'ai quitté ce poste pour me consacrer à plein temps au développement de career-ops.
Curieux de savoir comment un dépôt de cette taille est maintenu par une flotte d'agents IA, avec un humain qui décide de chaque fusion ? Lis [Agentic maintenance: how career-ops is run by a fleet of AI agents](https://santifer.io/ai-agent-fleet).
Mon portfolio et mes autres projets open source → [santifer.io](https://santifer.io)
Wikidata : [Santiago Fernández de Valderrama Aparicio](https://www.wikidata.org/wiki/Q138710224) · [career-ops](https://www.wikidata.org/wiki/Q139007988).
## Clause de non-responsabilité
**career-ops est un outil local et open source, PAS un service hébergé.** En utilisant ce logiciel, tu reconnais que :
1. **Tu contrôles tes données.** Ton CV, tes coordonnées et tes données personnelles restent sur ta machine et sont envoyés directement au fournisseur d'IA que tu choisis (Anthropic, OpenAI, etc.). Nous ne collectons, ne stockons ni n'avons accès à aucune de tes données.
2. **Tu contrôles l'IA.** Les prompts par défaut demandent à l'IA de ne pas soumettre de candidatures automatiquement, mais les modèles d'IA peuvent se comporter de manière imprévisible. Si tu modifies les prompts ou utilises d'autres modèles, tu le fais à tes risques. **Vérifie toujours l'exactitude du contenu généré par l'IA avant de l'envoyer.**
3. **Tu respectes les conditions d'utilisation des tiers.** Tu dois utiliser cet outil conformément aux conditions d'utilisation des portails de recrutement avec lesquels tu interagis (Greenhouse, Lever, Workday, LinkedIn, etc.). N'utilise pas cet outil pour spammer les employeurs ni pour saturer les systèmes ATS.
4. **Aucune garantie.** Les évaluations sont des recommandations, pas des vérités. Les modèles d'IA peuvent halluciner des compétences ou de l'expérience. Les auteurs ne sont pas responsables des résultats d'embauche, des candidatures refusées, des restrictions de compte ni d'aucune autre conséquence.
Voir [LEGAL_DISCLAIMER.md](LEGAL_DISCLAIMER.md) pour tous les détails. Ce logiciel est fourni sous [Licence MIT](LICENSE) « en l'état », sans garantie d'aucune sorte.
## Contributeurs
<a href="https://github.com/career-ops-hq/career-ops/graphs/contributors">
<img src="https://contrib.rocks/image?repo=career-ops-hq/career-ops&v=2" />
</a>
Toutes les personnes qui ont livré du code, de la documentation, des traductions ou des tests sont listées dans
[CONTRIBUTORS.md](CONTRIBUTORS.md), y compris les contributions hors code, que
le graphique ci-dessus ne peut pas montrer.
Tu as été embauché grâce à career-ops ? [Partage ton histoire !](https://github.com/career-ops-hq/career-ops/issues/new?template=i-got-hired.yml)
## Licence et marques déposées
Le code est distribué sous [Licence MIT](LICENSE). Le nom et la marque
« career-ops » sont régis par la [Politique de marques déposées](TRADEMARK.md),
permissive pour l'usage communautaire, réservée pour la dénomination de
produits commerciaux et les endossements.
## Historique des étoiles
<p align="center">
<a href="https://warpchart.dev/hq">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://warpchart.dev/api/chart?theme=dark&v=3">
<img alt="Live star telemetry of career-ops-hq/career-ops" src="https://warpchart.dev/api/chart?theme=light&v=3" loading="lazy">
</picture>
</a>
</p>
<p align="center"><sub>Créé et maintenu par <a href="https://santifer.io">Santiago Fernández de Valderrama Aparicio</a> (<a href="https://github.com/santifer">@santifer</a>)</sub></p>
## Connectons-nous
[](https://santifer.io)
[](https://linkedin.com/in/santifer)
[](https://x.com/santifer)
[](https://discord.gg/8pRpHETxa4)
[](mailto:hi@santifer.io)