🏁 Track : SaaS no limit
🌐 Application : https://zako.nc/avp/
💻 Code : https://github.com/C2Bx/adopte-un-job
🎯 Le contexte
Le #HackAVP est le premier hackathon dédié à l'emploi dans la fonction publique en Nouvelle-Calédonie. Son point de départ :
« Une offre d'emploi publiée n'est pas une offre d'emploi trouvée. »
L'OPT-NC (l'Office des postes et télécommunications de Nouvelle-Calédonie) publie ses offres d'emploi sous forme d'avis de vacance de poste, les AVP. Ces avis sont ouverts : n'importe qui peut les lire, dans un format standard du web (schema.org/JobPosting, celui que les moteurs de recherche comprennent), et un programme peut les récupérer automatiquement.
📦 La donnée est là. Ce qui manque, c'est le chemin entre une Calédonienne ou un Calédonien et le poste qui lui correspond :
- 🗂️ un vocabulaire administratif qui n'est pas le sien ;
- 🤷 des fiches qui ne disent pas à qui elles s'adressent ;
- ❓ et aucune réponse à la seule question qui compte : « est-ce que ce poste est pour moi ? »
💡 La réponse : Adopte un Job
Une application où l'on fait défiler les vrais postes ouverts à l'OPT-NC, comme sur une appli de rencontre :
- 👉 à droite pour candidater ;
- 👈 à gauche pour passer ;
- 📊 et pour chaque offre, une adéquation qui s'explique : ce poste te correspond à tant de pour cent, et voici pourquoi, compétence par compétence.
🎬 La démo Adopte un Job
🧩 Un projet commun du Master MIAGE
Adopte un Job n'est pas un projet isolé. Au hackathon, la promotion du Master MIAGE de l'Université de la Nouvelle-Calédonie a construit ensemble une chaîne de sept modules, chacun tenu par une ou deux personnes. Adopte un Job en est le MS3 : l'application que voit le candidat.
Qui fait quoi :
- MS1 CVForge (Florian) lit les CV ;
- MS2 HACKAVPI (Dan et Timothée), le serveur commun, porte les comptes, les offres et les candidatures ;
- MS3 Adopte un Job (Bastian) est l'application du candidat ;
- MS4 CV Generator (Anthony et Kim) produit les documents de candidature ;
- MS5 CV-Matching (Jo-Michel) calcule le score ;
- MS6 AVPRO-NC (Damien et Lucas) est l'espace des recruteurs ;
- MS7 Insight Squad (Élodie et Mathieu) suit les indicateurs. Le profil du candidat circule entre eux dans un format ouvert de CV, le JSON Resume.
👉 Le serveur commun a son propre article, qui explique pas à pas ce qu'est une API et comment elle relie tous les modules :
🧭 Le parcours, étape par étape
1️⃣ Je crée mon profil
Trois portes, côte à côte, et aucune n'est plus « officielle » que les autres :
- ✏️ un formulaire guidé, à la main ;
- 💬 neuf questions courtes (métiers visés, zones, contrat, disponibilité…) ;
- 📎 ou mon CV déposé (PDF, PNG, JPEG), que CVForge lit automatiquement.
🛡️ Une règle tient tout le reste : la lecture automatique du CV ne remplace jamais ce que la personne a saisi.
Elle n'est recopiée dans le profil que s'il est encore vide (aucune expérience, formation, compétence ni langue) ; sinon, elle reste à part et ne touche à rien. Le candidat relit et corrige : il reste le seul rédacteur de son profil.
📤 Le profil s'exporte et se réimporte en JSON Resume : il n'est prisonnier d'aucune application.
2️⃣ Je fais défiler les offres
Une carte = un vrai avis. On la glisse du doigt ou de la souris, on clique sur les boutons, ou on utilise le clavier :
| Touche | Action |
|---|---|
| ➡️ | candidater |
| ⬅️ | passer |
| ⬇️ | mettre à plus tard |
| ⌫ Retour arrière | revenir sur la dernière décision |
🔎 Le détail de l'offre donne l'AVP en clair : description, missions, relations de travail, employeur, et un encadré En bref (rattachement hiérarchique, place dans l'organigramme, métier, horaires, habilitations, condition de résidence quand l'avis en pose une).
3️⃣ Je vois pourquoi une offre me correspond
Le score vient du système de scoring de CV-Matching (Jo-Michel), qui note chaque compétence attendue par le poste face au profil ; le détail du calcul relève de ce module. Adopte un Job ne refait pas ce calcul : il le rend lisible.
🏷️ Sur chaque carte, une pastille résume le score (sur la capture ci-dessus : « Adéquation faible · 2 % », le profil de test ne parle pas de réseaux radio). Dans le détail de l'offre, un petit tableau de bord l'explique :
- 🟢 une jauge : la part des compétences du poste couvertes par le profil, pondérées par leur importance ;
- 🔢 quatre indicateurs : compétences couvertes (ici 0 sur 26), rang de cette offre parmi toutes celles analysées (ici « 20e sur 25 »), savoir-être à montrer en entretien, prérequis à vérifier ;
- 📏 une barre par compétence, notée sur 100. Au survol ou au clavier, l'explication : pour une compétence couverte, sa note et la phrase du profil qui le montre ; pour une compétence à travailler, ce qu'elle pèse dans le score (ici « Pèse 4,6 points dans le score »). Les compétences à travailler suivent, de celle qui pèse le plus dans le score à celle qui pèse le moins.
💬 C'est ce qui rend le score explicable : on voit pourquoi ce poste et ce profil se rencontrent, et où ils ne se rencontrent pas.
⚠️ Les prérequis (diplôme, permis…) sont montrés à part et ne sont jamais notés : chacun porte un statut (rempli, à vérifier, pas encore…), avec la raison donnée par CV-Matching.
🧭 Et surtout, l'adéquation est une indication, pas un filtre : toutes les offres restent dans la liste, une adéquation faible ne cache rien et n'empêche pas de candidater.
4️⃣ Je prépare ma candidature
Le tableau de bord dit déjà quoi mettre en avant et quoi préparer pour l'entretien. Pour aller plus loin, la lettre de candidature, le CV recentré sur le poste et le guide d'entretien sont produits par CV Generator (Anthony et Kim), à partir du profil du candidat et du numéro de l'AVP. Leur article détaille comment :
5️⃣ Je candidate, et je suis la réponse
👉 Glisser une carte à droite crée une vraie candidature. Elle arrive dans AVPRO-NC, l'espace des recruteurs, et le candidat suit la décision dans l'onglet Candidatures :
- ⏳ en attente
- ✅ retenue
- ❌ non retenue
- 📅 entretien à programmer
📧 Et parce qu'un AVP dit à qui écrire, chaque offre propose aussi le contact de l'avis, avec un mail prêt à partir : bon destinataire, objet « Candidature — intitulé du poste (référence) ». La candidature peut sortir de l'application sans dépendre d'elle.
🛠️ Sous le capot
Pour les développeurs.
⚛️ React 19 + TypeScript strict + Vite. L'application est un simple dossier de fichiers, accompagné d'un petit relais PHP : on le dépose sur un hébergement PHP, rien d'autre à faire tourner.
🔒 Elle ne garde rien : ni base de données, ni serveur à elle, ni CV. Elle affiche ce que HACKAVPI et CV-Matching lui donnent, et leur transmet ce que la personne saisit. Une seule source de vérité, aucune donnée personnelle dupliquée dans un coin.
🛡️ Le relais existe parce que le serveur commun n'autorise pas encore les appels directs depuis un navigateur (il n'envoie pas d'en-têtes CORS). Il est sans état et ne laisse passer que les adresses dont l'application a besoin, chacune avec sa seule méthode.
🔑 Pour CV-Matching, le relais ajoute la clé du service côté serveur : elle n'est ni dans le dépôt, ni dans le code envoyé au navigateur, et le jeton de connexion du candidat n'est jamais transmis au service de matching.
-
📐 Des standards ouverts plutôt que des formats maison :
- les AVP au format
schema.org/JobPosting; - le JSON Resume pour le profil ;
- le référentiel des métiers de l'OPT-NC (84 métiers, 409 compétences), repris de sa publication officielle ;
- les codes ROME (le répertoire national des métiers de France Travail), affichés dans le détail de chaque offre qui en porte un.
- les AVP au format
🔌 Un seul fichier parle aux serveurs (
api.ts) : il traduit leurs réponses dans les formes que les écrans connaissent. Les écrans ne savent rien des serveurs.
♿ Accessibilité
C'est le sujet même du hackathon, donc pas une case à cocher :
- ⌨️ tout le parcours de défilement se pilote au clavier, et les boutons sont nommés pour les lecteurs d'écran ;
- 🐢 les animations s'arrêtent quand le système demande moins de mouvement ;
- 👍 mobile d'abord : tout se fait au pouce, recherche et filtres compris ;
- 🌗 mode jour et mode nuit au choix, mémorisés ;
- 🗣️ un langage clair, qui tutoie : « Ton adéquation avec ce poste », « rien ne t’empêche de candidater », et un écran vide qui dit clairement qu'aucune offre n'est ouverte, plutôt qu'un « aucun résultat » qui fait croire à une panne.
♻️ Réutiliser Adopte un Job ailleurs
Si Adopte un Job peut servir ailleurs, c'est grâce à l'OPT-NC : en publiant ses offres ouvertes, au format standard schema.org/JobPosting, et son référentiel des métiers, il a rendu possible une application que d'autres peuvent reprendre.
Une autre administration qui publie ses offres de la même façon peut donc s'en servir pour les siennes. Il lui faudra brancher l'application sur ses propres données :
- l'adresse de son serveur d'offres, dans le relais ;
- la lecture de ses offres, dans
api.ts; - son référentiel des métiers ;
- les quelques libellés qui nomment l'OPT-NC.
Le défilement, le profil, l'adéquation et les candidatures restent les mêmes.
🧪 Le dépôt contient aussi la démo de départ (demo/), en HTML, CSS et JavaScript, sans framework ni étape de build, qui s'ouvre sans compte ni serveur sur des offres fictives.
🔐 Données personnelles
- 🎭 Les démonstrations, la vidéo et les visuels utilisent un profil fictif.
- 🚫 L'application n'enregistre aucun CV de son côté.
- 🕶️ Le nom, l'e-mail, le téléphone et l'adresse du profil ne sont pas envoyés au calcul d'adéquation : seuls le titre, le résumé, les expériences (bénévoles comprises), la formation, les compétences, les projets, les certifications et les langues le sont. Ces textes partent tels quels : ce qu'on y a écrit soi-même part avec.
- 🧳 Ce qui reste dans le navigateur se limite à la session (le jeton de connexion et l'adresse e-mail, effacés à la fermeture de l'onglet), aux offres mises à plus tard ou remises dans la liste, et au choix jour / nuit.
🚀 Et ensuite ?
Ce que je ferais avec un peu plus de temps :
- 🔀 Trier le deck par adéquation, en option : les offres qui te correspondent le plus d'abord, sans en cacher aucune.
- 🔔 Prévenir quand un nouvel avis arrive dans tes métiers ou tes zones : les AVP de l'OPT-NC arrivent au fil de l'eau.
- 🔐 Une session qui se renouvelle : aujourd'hui, la connexion dure une heure.
- 🧹 Supprimer le relais PHP dès que le serveur commun autorisera les appels directs depuis le navigateur : l'application deviendrait 100 % statique.
- 📄 Accepter les CV en Word, dès que le serveur commun les prendra.
- ♿ Un audit d'accessibilité complet (RGAA), avec des utilisateurs de lecteurs d'écran.
- 🏛️ Brancher une deuxième administration qui publie ses offres en
schema.org/JobPosting, pour prouver la réutilisation en vrai.
🏁 Pour finir
Une offre publiée n'est pas une offre trouvée : avec Adopte un Job, chaque avis de l'OPT-NC devient une carte qu'on comprend, avec une raison claire de candidater ou de passer, et une candidature dont on suit la réponse.
💬 Et toi ? Qu'est-ce qui t'a déjà fait renoncer à une offre d'emploi : le jargon, une fiche trop floue, ou l'impression que ce n'était pas pour toi ? Dis-le en commentaire, ça aidera à améliorer l'application.
Bastian — Adopte un Job (MS3), #HackAVP, Master MIAGE.






Top comments (0)