Adopte un Job : on swipe les vrais postes de l'OPT-NC, et on voit pourquoi ils nous correspondent

本文为原文前 6,000 字符的节选翻译,完整内容请查看原文。

🏁 Track : SaaS no limit 🌐 Application : https://zako.nc/avp/ 💻 Code : https://github.com/C2Bx/adopte-un-job 🎬 Vidéo : https://zako.nc/avp/video/adopte-un-job.mp4 🎯 Le problème « Une offre d’emploi publiée n’est pas une offre d’emploi trouvée. » — l’énoncé du #HackAVP Les avis de vacance de poste (AVP) de l’OPT-NC sont ouverts, au format schema.org/JobPosting, et servis par une API. 📦 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 ? »

🏁 轨道:SaaS 无限制 🌐 应用:https://zako.nc/avp/ 💻 代码:https://github.com/C2Bx/adopte-un-job 🎬 视频:https://zako.nc/avp/video/adopte-un-job.mp4 🎯 问题:“发布了招聘信息并不等于找到了工作。”——这是 #HackAVP 的核心命题。OPT-NC 的职位空缺公告(AVP)是公开的,采用 schema.org/JobPosting 格式,并通过 API 提供。📦 数据就在那里。所缺失的是新喀里多尼亚人与适合他们的职位之间的桥梁:🗂️ 他们不熟悉的行政词汇;🤷 无法说明目标受众的职位描述;❓ 以及对唯一重要问题的回答缺失:“这个职位适合我吗?”

💡 La réponse : Adopte un Job Une application où l’on fait défiler les vrais postes ouverts à l’OPT-NC : 👉 à droite pour candidater ; 👈 à gauche pour passer ; 📊 et pour chaque offre, une adéquation qui s’explique, compétence par compétence. 🎬 La démo en vidéo ▶️ Clique sur l’image pour regarder la vidéo dans ton navigateur (2 min 33, 1080p).

💡 答案:Adopte un Job(领养一份工作)。这是一个可以浏览 OPT-NC 真实空缺职位的应用程序:👉 向右滑动申请;👈 向左滑动跳过;📊 对于每个职位,系统都会逐项解释其匹配度。🎬 视频演示 ▶️ 点击图片在浏览器中观看视频(2分33秒,1080p)。

🧩 Un module dans une équipe de sept Adopte un Job n’est pas seul. C’est MS3, le front candidat d’un projet en sept modules. Le profil du candidat y circule dans un format commun, le JSON Resume ; les offres gardent celui des AVP.

🧩 七人团队中的一个模块。Adopte un Job 并非孤军奋战。它是七个模块项目中的 MS3,即候选人前端。候选人的个人资料以通用格式 JSON Resume 在其中流转;职位信息则保留 AVP 的格式。

🔒 Adopte un Job ne garde rien : ni base de données, ni API à lui, ni CV. Il affiche ce que HACKAVPI et CV-Matching lui donnent, et leur transmet ce que la personne saisit. Une seule source de vérité, et aucune donnée personnelle dupliquée dans un coin.

🔒 Adopte un Job 不存储任何内容:没有数据库,没有自己的 API,也不存储简历。它仅显示 HACKAVPI 和 CV-Matching 提供的内容,并将用户输入的信息传输给它们。保持单一事实来源,且不会在任何角落复制个人数据。

👀 Ce qu’on voit à l’écran 🃏 Le deck Une carte = un vrai AVP : l’intitulé, la direction, le lieu, le contrat, le nombre de jours avant la clôture, puis les missions et ce que le poste demande, page par page. On glisse depuis n’importe quel point de la carte, 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.

👀 屏幕上显示的内容 🃏 卡片组:一张卡片对应一个真实的 AVP:标题、部门、地点、合同类型、截止日期前的天数,以及逐页展示的任务和职位要求。你可以从卡片的任何位置滑动,点击按钮,或使用键盘:按键 动作 ➡️ 申请 ⬅️ 跳过 ⬇️ 稍后再看 ⌫ 后退 撤销上一个决定。

🔎 Le détail de l’offre L’AVP en clair : description, missions, relations de travail, employeur. Un encadré En bref résume l’essentiel : rattachement hiérarchique, place dans l’organigramme, corps, métier OPT et métier ROME, horaires, habilitations, condition de résidence quand l’avis en pose une. 📬 Et surtout : à qui écrire pour candidater, avec un mail déjà adressé au bon contact, objet compris.

🔎 职位详情:清晰的 AVP 内容:描述、任务、工作关系、雇主。“简而言之”框总结了要点:汇报关系、组织架构中的位置、职系、OPT 职业与 ROME 职业、工作时间、资质要求,以及公告中设定的居住条件。📬 最重要的是:告知申请人写信给谁,并提供已填好收件人和主题的邮件草稿。

👤 Le profil Trois façons de le remplir, côte à côte : ✏️ à la main ; 💬 par neuf questions courtes ; 📎 en déposant son CV (PDF, PNG, JPEG). 📋 Les candidatures La décision du recruteur, lue dans l’API de l’équipe : ⏳ en attente ✅ retenue ❌ non retenue 📅 entretien à programmer.

👤 个人资料:三种填写方式并列:✏️ 手动填写;💬 通过九个简短问题;📎 上传简历(PDF、PNG、JPEG)。📋 申请状态:从团队 API 读取的招聘人员决定:⏳ 待处理 ✅ 已录用 ❌ 未录用 📅 待安排面试。

📱 Et partout Mobile d’abord : recherche et filtres tiennent dans la barre du haut d’un téléphone. 🌙 Mode jour et mode nuit, dans le menu. 🤝 Une interface qui tutoie : on parle à une personne, pas à un dossier.

📱 随处可见的移动优先设计:搜索和筛选功能集成在手机顶部栏中。🌙 菜单中提供日间和夜间模式。🤝 采用“你”(tutoie)的亲切界面:我们是在与一个人对话,而不是与一份档案对话。

⚙️ Les quatre fonctions, une par une 1️⃣ Un profil entre dans le système Trois portes, et aucune n’est plus « officielle » que les autres : le formulaire guidé, les neuf questions (métiers visés, zones, contrat, disponibilité…), ou le CV déposé. Le CV part dans l’API de l’équipe, où CVForge (Florian) le lit et en tire un JSON Resume.

⚙️ 四项功能逐一解析 1️⃣ 个人资料进入系统:有三个入口,没有哪个比其他更“官方”:引导式表单、九个问题(目标职业、区域、合同、可用性等)或上传简历。简历进入团队 API,由 CVForge (Florian) 读取并提取为 JSON Resume。

🛡️ Une règle tient tout le reste : la lecture du CV ne remplace jamais ce que la personne a saisi. La lecture automatique est rangée à part (cvJsonGenere). L’interface ne la recopie dans le profil que si le parcours est encore vide (aucune expérience, formation, compétence ni langue) ; sinon, la lecture reste à part et ne touche à rien. Le candidat relit et corrige ce qu’elle a rempli : il reste le seul rédacteur de son profil. 📤 Le profil s’exporte et s’importe au format JSON Resume : il n’est prisonnier d’aucune application.

🛡️ 一条规则贯穿始终:简历读取绝不会覆盖用户手动输入的内容。自动读取的内容被单独存放 (cvJsonGenere)。只有当个人经历为空(无经验、教育、技能或语言)时,界面才会将其复制到个人资料中;否则,读取内容保持独立,不进行任何修改。候选人会重新阅读并更正自动填写的内容:他们始终是个人资料的唯一编辑者。📤 个人资料可以 JSON Resume 格式导出和导入:它不被任何应用程序所束缚。

2️⃣ Le matching, et pourquoi il s’explique Le calcul d’adéquation est celui de CV-Matching (Jo-Michel) : des embeddings bge-m3 et un reranker, qui notent chaque compétence attendue par l’AVP face au contenu du CV. Adopte un Job ne refait pas ce calcul : il le rend lisible. 🏷️ Sur chaque carte, une pastille : « Bonne adéquation · 42 % ».

2️⃣ 匹配及其解释:匹配度计算由 CV-Matching (Jo-Michel) 完成:使用 bge-m3 嵌入和重排序模型,将 AVP 要求的每项技能与简历内容进行对比评分。Adopte un Job 不重复计算,而是使其变得可读。🏷️ 每张卡片上都有一个标签:“匹配度良好 · 42%”。

📊 Dans le détail de chaque offre, un petit tableau de bord : 🟢 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 3 sur 5), rang de cette offre parmi toutes celles analysées (« 2e 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, la preuve : Couverte à 76 / 100, puis la phrase du profil qui le montre (Dans ton profil : « … »). Les compétences à travailler viennent ensuite, de celle qui pèse le plus dans le score à celle qui pèse le moins.

📊 在每个职位的详情中,有一个小型仪表盘:🟢 一个进度条:个人资料覆盖的职位技能比例,并按重要性加权;🔢 四个指标:已覆盖技能(此处为 5 项中的 3 项)、该职位在所有分析职位中的排名(“25 个中的第 2 个”)、面试中需展示的软技能、需核实的先决条件;📏 每项技能都有一个 100 分制的进度条。鼠标悬停或使用键盘时,会显示证据:覆盖率为 76/100,并显示个人资料中对应的句子(在你的个人资料中:“……”)。接下来是需要提升的技能,按对分数影响程度从高到低排列。

💬 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. Deux choix de conception assumés : 🧭 L’adéquation est une indication, pas un filtre. Toutes les offres restent dans le deck : une adéquation faible ne cache rien et n’empêche pas de candidater. 🕶️ Les champs d’identité ne partent pas. Le nom, l’e-mail, le téléphone et l’adresse du profil ne sont pas envoyés au matching : seuls le titre, le résumé, les expériences (bénévoles comprises), la formation, les compétences, les projets, les certifications et les l

💬 这就是分数可解释的原因:我们可以看到这个职位和这份个人资料为何匹配,以及在哪些方面不匹配。⚠️ 先决条件(文凭、驾照等)单独显示,从不评分:每一项都有一个状态(已满足、待核实、尚未满足等),并附有 CV-Matching 给出的理由。两个明确的设计选择:🧭 匹配度仅供参考,而非筛选条件。所有职位都保留在卡片组中:低匹配度不会隐藏任何信息,也不会阻止申请。🕶️ 身份字段不会被发送。个人资料中的姓名、电子邮件、电话和地址不会发送给匹配系统:仅发送职位标题、摘要、经历(包括志愿者经历)、教育、技能、项目、证书和语言。