[{"data":1,"prerenderedAt":146},["ShallowReactive",2],{"post-014-matchpro-engine-en":3,"post-og-014-matchpro-engine":97},{"id":4,"title":5,"bars":6,"blurb":7,"body":8,"color":6,"contacts":6,"date":81,"dateModified":6,"description":82,"extension":83,"featured":84,"groups":6,"kicker":85,"meta":86,"metrics":6,"n":87,"navigation":84,"openTabs":6,"path":88,"progress":6,"readTime":89,"reading":6,"role":6,"rules":6,"running":6,"seo":90,"ships":6,"slug":91,"stack":6,"started":6,"status":6,"stem":92,"streak":6,"tag":93,"tagColor":95,"tagline":6,"tasks":6,"timeline":6,"topics":6,"week":6,"year":6,"__hash__":96},"en\u002Fwriting\u002F014-matchpro-engine.md","Rewriting matchpro's matching engine",null,"What I learned from watching recruiters click for three weeks.",{"type":9,"value":10,"toc":75},"minimark",[11,15,19,24,27,30,40,69,72],[12,13,14],"p",{},"▸ featured · case study — № 014 · apr 18 '26 · 8 min",[16,17,5],"h2",{"id":18},"rewriting-matchpros-matching-engine",[12,20,21],{},[22,23,7],"em",{},[25,26],"hr",{},[12,28,29],{},"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.",[31,32,33],"blockquote",{},[12,34,35,36,39],{},"\"matching is not search. search rewards precision. matching rewards being ",[22,37,38],{},"interestingly close",".\"",[41,42,43,51,57,63],"ol",{},[44,45,46,50],"li",{},[47,48,49],"strong",{},"throw away the ranker"," — kept the data, dropped the model. started from a blank ipynb.",[44,52,53,56],{},[47,54,55],{},"embed everything"," — résumé + job text → small multilingual model, cached in pg_vector.",[44,58,59,62],{},[47,60,61],{},"re-rank with signals"," — location, seniority, years-in-stack. boring features still win.",[44,64,65,68],{},[47,66,67],{},"shadow-run for 3 weeks"," — a\u002Fb on recruiters' clicks. watched dashboards more than family.",[12,70,71],{},"the numbers after 11 weeks: match-quality 41% → 78%, time-to-first-click 9.2s → 3.1s, weekly placements 12 → 28, p95 latency 640ms → 180ms.",[12,73,74],{},"read the full postmortem on \u002Fwork\u002Fmatchpro.",{"title":76,"searchDepth":77,"depth":78,"links":79},"",2,3,[80],{"id":18,"depth":77,"text":5},"2026-04-18","Rewriting matchpro's matching engine — what I learned from watching recruiters click for three weeks.","md",true,"case study",{},"014","\u002Fwriting\u002F014-matchpro-engine","8 min",{"title":5,"description":82},"014-matchpro-engine","writing\u002F014-matchpro-engine",{"label":94,"color":95},"long read","var(--red)","zKM9k3xbKEs_rywRELI7EKj4Y_-0H1SfQ1_9haVJdH8",{"id":4,"title":5,"bars":6,"blurb":7,"body":98,"color":6,"contacts":6,"date":81,"dateModified":6,"description":82,"extension":83,"featured":84,"groups":6,"kicker":85,"meta":143,"metrics":6,"n":87,"navigation":84,"openTabs":6,"path":88,"progress":6,"readTime":89,"reading":6,"role":6,"rules":6,"running":6,"seo":144,"ships":6,"slug":91,"stack":6,"started":6,"status":6,"stem":92,"streak":6,"tag":145,"tagColor":95,"tagline":6,"tasks":6,"timeline":6,"topics":6,"week":6,"year":6,"__hash__":96},{"type":9,"value":99,"toc":140},[100,102,104,108,110,112,118,136,138],[12,101,14],{},[16,103,5],{"id":18},[12,105,106],{},[22,107,7],{},[25,109],{},[12,111,29],{},[31,113,114],{},[12,115,35,116,39],{},[22,117,38],{},[41,119,120,124,128,132],{},[44,121,122,50],{},[47,123,49],{},[44,125,126,56],{},[47,127,55],{},[44,129,130,62],{},[47,131,61],{},[44,133,134,68],{},[47,135,67],{},[12,137,71],{},[12,139,74],{},{"title":76,"searchDepth":77,"depth":78,"links":141},[142],{"id":18,"depth":77,"text":5},{},{"title":5,"description":82},{"label":94,"color":95},1777071043037]