Il y a quelques mois, j’ai décidé de partir vivre à Dublin. Ça implique tout un tas de choses, et surtout un nouveau départ à zéro. Dont un point assez important : trouver un travail.
Dublin est réputée pour son hub technologique. Les dernières années ont été plus calmes de ce côté-là, mais il y a quand même beaucoup d’opportunités.
Aujourd’hui je suis en recherche active, et je me rends compte qu’il est difficile de visualiser toutes les offres qui existent vraiment sur le marché. Je scroll quotidiennement Indeed et LinkedIn, mais ça prend du temps et ça finit par démotiver. Alors j’ai décidé de déléguer cette tâche à l’IA. Je vais vous expliquer comment, sans rédiger un pavé non plus.
JobCtrl, pour ne pas perdre le fil
D’abord, un outil que j’ai vibecodé avant le départ : JobCtrl. Il me permet de suivre l’ensemble de mes candidatures proprement, de voir les process en cours et d’avoir des stats claires pendant ma recherche.
C’est une application Go avec une base SQLite, servie dans un conteneur. Rien de sorcier, mais ça remplace avantageusement le tableur que tout le monde finit par abandonner au bout de trois semaines. Et je trouve ça plus joli accessoirement :D
J’ai encore des améliorations à faire dessus bien sûr, mais il est déjà bien fonctionnel.
Filon, pour aller chercher les offres
Restait le plus gros morceau : automatiser la recherche elle-même.
Je loue déjà un VPS, sur lequel j’ai installé Claude et Telegram (même process que dans mon article comment j’ai rendu mon infra vivante), ce qui me permet de le piloter rapidement depuis mon téléphone.
Je lui ai demandé de monter un scan sur toutes les sources qu’il pouvait scraper en sécurité, et de me fournir un rapport avec les offres qui correspondent le mieux à mon profil. Pour ça, je lui ai filé mon CV, toutes mes expériences, mes projets, bref tout le contexte de mon parcours professionnel. Oui, Anthropic sait donc tout de moi, mais à ce niveau ce n’est pas bien grave : j’ai déjà rendu ces infos publiques, avec ce blog par exemple.
Le résultat s’appelle Filon (Claude a choisi ce nom tout seul et je trouvais ça OK alors j’ai laissé comme ça 🙃). C’est un pipeline Python qui tourne en cron sur le VPS, sans aucune dépendance externe : tout est en bibliothèque standard. Pas de virtualenv, pas de pip install, rien à mettre à jour pour raison de sécurité.
Comment ça marche
L’idée de base, c’est que Claude ne doit pas s’occuper de ce qu’un script sait faire tout seul. Tout ce qui est vérifiable est trié par du code avant lui, et lui il ne traite que ce qui demande un avis.
La collecte, tous les soirs
Tous les soirs, un script part taper six sources : les API publiques de Greenhouse, Lever et SmartRecruiters, plus trois sites d’annonces irlandais. Il range tout dans un fichier JSON.
Un point important quand même : la même offre ressort souvent chez deux ou trois cabinets, avec un lien différent à chaque fois. Du coup la comparaison ne se fait pas sur l’URL, mais sur le nom de la boîte et le titre du poste, sinon je me la prends plusieurs fois dans le rapport.
Cette étape ne coûte aucun appel à Claude, c’est juste du script qui tourne tout seul.
Le tri, avant que Claude ne voie quoi que ce soit
Là c’est le gros morceau, et c’est surtout ce qui fait que le truc reste utilisable. Le code vire tout ce qui peut être viré sans avoir à réfléchir. Ce que ça donne par exemple au 28 août :
| Motif de rejet | Nombre |
|---|---|
| Le titre ne touche aucun mot de mon domaine | 228 |
| Contracting, que je refuse pour le moment | 108 |
| Autre métier (commercial, RH, santé, restauration) | 86 |
| Hors Irlande et pas en distanciel | 28 |
| Déjà sortie dans un rapport précédent | 8 |
| Boîte qui m’a déjà dit non (statut lu dans JobCtrl) | 6 |
| Écartée à la main depuis le tableau de bord | 2 |
| Poste où j’ai déjà candidaté | 1 |
Sur les 599 offres stockées, il n’en reste que 45 une fois tous les filtres passés. Ça tombe bien, parce que chaque offre envoyée coûte des jetons et que je suis sur l’abonnement Claude à 20 euros, donc je limite à ce niveau.
Le dashboard est encore à revoir… pas très utile avoir les stats en doublons 😅
Le rapport, mardi et vendredi
Claude reçoit ces 45 offres avec mon profil, et il me rend son classement.
Il note chaque offre selon les critères que je lui ai donnés, puis me présente sa sélection ainsi que celles qu’il a écartées.
Pour chaque offre gardée, il m’explique pourquoi il me la propose, ce qui pourrait coincer, il me donne le lien de l’annonce et un avis rapide sur l’entreprise (recherche Glassdoor, avis employés, etc.) histoire d’avoir un premier aperçu de la boîte.
Les deux outils communiquent
Les deux applis sont désormais réunies derrière un seul point d’entrée et se parlent. Filon lit JobCtrl en lecture seule pour connaître l’état de mes candidatures et savoir si j’ai déjà postulé quelque part, et je peux basculer une offre qui me plaît directement dans JobCtrl.
C’est moi qui décide, et je le lui dis
Alors oui, c’est Claude qui juge si une offre peut me correspondre, donc ce n’est peut-être pas parfait. Mais ça couvre déjà bien plus de sources que ce que je faisais avant, et je continue de checker Indeed et LinkedIn moi-même.
Sur chaque offre du rapport, je réponds oui ou non. Non ouvre un champ de justification, où j’écris pourquoi.
Ces verdicts sont réinjectés dans le prompt du rapport suivant, avec mes mots à moi, et ils priment sur la notation du modèle. C’est le signal le plus fort du système : un humain a lu et tranché. Quand un motif revient assez souvent, il devient une règle écrite en dur.
Je veux garder ce côté manuel et humain. C’est moi qui review l’offre, c’est moi qui décide de postuler, et c’est moi qui postule. Pas l’IA. Je cherche un job qui me correspond, pas un truc trop bas ni justement trop senior où j’irais me survendre.
Ce que ça m’apprend sur le marché
Effet de bord auquel je ne m’attendais pas : à force de collecter, j’ai fini par avoir une photo assez nette de ce qui est demandé ici. Le tableau de bord compte la fréquence d’une liste de technos dans les offres du terrain, sur une fenêtre de 45 jours.
| Techno | Part des offres |
|---|---|
| Développement (Java, Go…) | 37 % |
| AWS | 29 % |
| Python | 28 % |
| Azure | 25 % |
| Google Cloud | 25 % |
| Linux | 19 % |
| Kubernetes | 18 % |
| CI/CD | 14 % |
Je constate que Kubernetes devient incontournable, tout comme la pratique d’un cloud public, ou même de Python. Je sais donc ce que je dois bosser… 😅
La suite
Tout ça n’est pas encore parfait, j’imagine. On peut encore rajouter des sources et affiner les résultats.
Si l’ensemble de ce workflow devient assez propre et que j’ai la motivation, j’en ferai un projet complet sur GitHub, avec une gestion du profil plus simple et éventuellement plus d’intégrations. Faut que j’y réfléchisse.
En attendant, ça tourne, et j’ai une pile d’offres à review : à moi de jouer 😁