[{"data":1,"prerenderedAt":285},["ShallowReactive",2],{"work-matchpro-ru":3,"work-og-matchpro":159},{"id":4,"title":5,"bars":6,"blurb":7,"body":8,"color":132,"contacts":133,"date":133,"dateModified":133,"description":134,"extension":135,"featured":136,"groups":133,"kicker":137,"meta":138,"metrics":139,"n":133,"navigation":136,"openTabs":133,"path":149,"progress":133,"readTime":133,"reading":133,"role":150,"rules":133,"running":133,"seo":151,"ships":133,"slug":152,"stack":133,"started":133,"status":133,"stem":153,"streak":133,"tag":154,"tagColor":133,"tagline":156,"tasks":133,"timeline":133,"topics":133,"week":133,"year":157,"__hash__":158},"ru\u002Fwork\u002Fmatchpro.md","matchpro.io",4,"нишевый джоб-борд, который действительно матчит людей, а не ключевые слова. этой весной переписал матчинговый движок.",{"type":9,"value":10,"toc":124},"minimark",[11,15,25,28,31,41,44,48,77,79,83,110,121],[12,13,14],"p",{},"¶ кейс — 01 · отгружено весна '26 · срок: 11 недель · команда: 1\nтеги: matching · search · postgres",[16,17,19,20,24],"h2",{"id":18},"старый-движок-матчил-по-ключевикам-новый-читает-всё-резюме-целиком","старый движок матчил по ",[21,22,23],"em",{},"ключевикам",". новый — читает всё резюме целиком.",[12,26,27],{},"автор: евгений · 18 апр 2026 · ~8 мин чтения",[12,29,30],{},"три года matchpro матчил кандидатов с вакансиями по-ленивому — tf-idf по заголовкам с щепоткой правил. было нормально. не отлично. рекрутеры продолжали присылать мне скриншоты очевидных матчей, которые движок не находил. этой весной я сел и переписал всё целиком.",[32,33,34],"blockquote",{},[12,35,36,37,40],{},"«матчинг — это не поиск. поиск вознаграждает точность. матчинг вознаграждает ",[21,38,39],{},"интересную близость",".»",[42,43],"hr",{},[16,45,47],{"id":46},"как-это-происходило","как это происходило",[49,50,51,59,65,71],"ol",{},[52,53,54,58],"li",{},[55,56,57],"strong",{},"выкинуть ранкер"," — данные оставил, модель удалил. начал с пустого ipynb.",[52,60,61,64],{},[55,62,63],{},"эмбеддить всё"," — резюме + текст вакансии → небольшая мультиязычная модель, кэш в pg_vector.",[52,66,67,70],{},[55,68,69],{},"пере-ранжировать по сигналам"," — локация, сениорити, годы в стеке. скучные фичи всё ещё побеждают.",[52,72,73,76],{},[55,74,75],{},"тень-прогон 3 недели"," — a\u002Fb по кликам рекрутеров. смотрел на дашборды больше, чем на семью.",[42,78],{},[16,80,82],{"id":81},"результаты-через-11-недель","результаты — через 11 недель",[84,85,86,92,98,104],"ul",{},[52,87,88,91],{},[55,89,90],{},"качество матча (рекрутер 👍)"," — 41% → 78% (+37 пп)",[52,93,94,97],{},[55,95,96],{},"время до первого клика"," — 9.2с → 3.1с (−6.1с)",[52,99,100,103],{},[55,101,102],{},"трудоустройств в неделю"," — 12 → 28 (×2.3)",[52,105,106,109],{},[55,107,108],{},"latency (p95)"," — 640мс → 180мс (−72%)",[111,112,117],"pre",{"className":113,"code":115,"language":116},[114],"language-text","› bench --cohort=q1-recruiters\n  running 2,140 matches…\n  ✓ v3 beats v2 on 78% of pairs\n  ! 4 regressions — investigating\n› deploy prod\n","text",[118,119,115],"code",{"__ignoreMap":120},"",[12,122,123],{},"● опубликовано · 41kb · 2 графика · 6 сносок",{"title":120,"searchDepth":125,"depth":126,"links":127},2,3,[128,130,131],{"id":18,"depth":125,"text":129},"старый движок матчил по ключевикам. новый — читает всё резюме целиком.",{"id":46,"depth":125,"text":47},{"id":81,"depth":125,"text":82},"var(--red)",null,"matchpro.io — нишевый кипрский джоб-борд, который матчит людей, а не ключевики. весной '26 переписал матчинговый движок.","md",true,"▸ CH.04 \u002F matchpro · сейчас отгружаю v3",{},[140,143,146],[141,142],"вакансий","1.2k\u002Fмес",[144,145],"трудоустройств","~180",[147,148],"выручка","в плюсе","\u002Fwork\u002Fmatchpro","соло · дизайн + код + операции",{"title":5,"description":134},"matchpro","work\u002Fmatchpro",{"label":155,"color":132},"в центре","джоб-борд · it · кипр","2021 → сейчас","0p8ess8BgWeP9r-sRX9cAQjJnDEcrMf91zGfZzEQWZw",{"id":160,"title":5,"bars":6,"blurb":161,"body":162,"color":132,"contacts":133,"date":133,"dateModified":133,"description":266,"extension":135,"featured":136,"groups":133,"kicker":267,"meta":268,"metrics":269,"n":133,"navigation":136,"openTabs":133,"path":149,"progress":133,"readTime":133,"reading":133,"role":278,"rules":133,"running":133,"seo":279,"ships":133,"slug":152,"stack":133,"started":133,"status":133,"stem":153,"streak":133,"tag":280,"tagColor":133,"tagline":282,"tasks":133,"timeline":133,"topics":133,"week":133,"year":283,"__hash__":284},"en\u002Fwork\u002Fmatchpro.md","a niche job-board that actually matches people, not keywords. rebuilt the matching engine this spring.",{"type":9,"value":163,"toc":260},[164,167,175,178,181,190,192,196,222,224,228,252,257],[12,165,166],{},"¶ case study — 01 · shipped spring '26 · timeline: 11 weeks · team: 1\ntags: matching · search · postgres",[16,168,170,171,174],{"id":169},"the-old-engine-matched-keywords-the-new-one-reads-the-whole-résumé","the old engine matched ",[21,172,173],{},"keywords",". the new one reads the whole résumé.",[12,176,177],{},"by evgeniy · apr 18, 2026 · ~8 min read",[12,179,180],{},"for three years matchpro matched candidates to jobs the lazy way — a tf-idf over titles, with a sprinkle of rules. it was fine. not great. recruiters kept emailing me screenshots of obvious matches it missed. so this spring i sat down and rebuilt the whole thing.",[32,182,183],{},[12,184,185,186,189],{},"\"matching is not search. search rewards precision. matching rewards being ",[21,187,188],{},"interestingly close",".\"",[42,191],{},[16,193,195],{"id":194},"how-it-went-down","how it went down",[49,197,198,204,210,216],{},[52,199,200,203],{},[55,201,202],{},"throw away the ranker"," — kept the data, dropped the model. started from a blank ipynb.",[52,205,206,209],{},[55,207,208],{},"embed everything"," — résumé + job text → small multilingual model, cached in pg_vector.",[52,211,212,215],{},[55,213,214],{},"re-rank with signals"," — location, seniority, years-in-stack. boring features still win.",[52,217,218,221],{},[55,219,220],{},"shadow-run for 3 weeks"," — a\u002Fb on recruiters' clicks. watched dashboards more than family.",[42,223],{},[16,225,227],{"id":226},"results-11-weeks-later","results — 11 weeks later",[84,229,230,236,242,247],{},[52,231,232,235],{},[55,233,234],{},"match-quality (recruiter 👍)"," — 41% → 78% (+37 pp)",[52,237,238,241],{},[55,239,240],{},"time-to-first-click"," — 9.2s → 3.1s (−6.1s)",[52,243,244,103],{},[55,245,246],{},"weekly placements",[52,248,249,251],{},[55,250,108],{}," — 640ms → 180ms (−72%)",[111,253,255],{"className":254,"code":115,"language":116},[114],[118,256,115],{"__ignoreMap":120},[12,258,259],{},"● published · 41kb · 2 figures · 6 footnotes",{"title":120,"searchDepth":125,"depth":126,"links":261},[262,264,265],{"id":169,"depth":125,"text":263},"the old engine matched keywords. the new one reads the whole résumé.",{"id":194,"depth":125,"text":195},{"id":226,"depth":125,"text":227},"matchpro.io — a niche cyprus job-board that matches people, not keywords. rebuilt the matching engine in spring '26.","▸ CH.04 \u002F matchpro · currently shipping v3",{},[270,273,275],[271,272],"jobs","1.2k\u002Fmo",[274,145],"placements",[276,277],"revenue","profitable","solo · design + code + ops",{"title":5,"description":266},{"label":281,"color":132},"featured","job-board · it · cyprus","2021 → now","W3ME2VGgLsDw_xeEtEdOafRhHRaJK22QoMt28U1AVBc",1777071044047]