Teminife ObafemiBackend engineer · Nairobi

Job recommendations

JobStash needed to rank jobs per candidate, on the site and in a weekly email, and to prove each new ranking beat the last.

Apply to, save or view jobs as this candidate, then watch similar jobs climb and the reasons for the top job change.

Example candidate

Senior backend engineer: Go, Postgres, TypeScript

Asked for senior rolesSmall companiesRemote only, so 2 on-site jobs are left out

1Act on a job

Each action lifts jobs like it: the same kind of role, tags and seniority.

  1. 1

    Data Platform Engineer

    Tidewater Data · Data · Python, Postgres

    7.7
  2. 2

    Senior Backend Engineer

    Larkspur Pay · Backend · Go, Postgres

    6.4
  3. 3

    Analytics Engineer

    Fernbank Health · Data · SQL, Python

    6.1
  4. 4

    Machine Learning Engineer

    Harrow Labs · Data · Python, ML

    5.8
  5. 5

    Frontend Engineer

    Brightmoor · Frontend · TypeScript, React

    5.4
  6. 6

    Full-Stack Engineer

    Pebblework · Frontend · TypeScript, React

    4.9
  7. 7

    Site Reliability Engineer

    Quillstone · Infrastructure · Kubernetes, Go

    4.5
  8. 8

    Staff Backend Engineer

    Copperline · Backend · TypeScript, Node

    3.6

Starting history: applied to a data job, saved another, looked at two frontend jobs.

4Did the ranking work?

Every list shown is logged. Acting on a job within 7 days counts for the ranking that showed it.

Shown in top 3
3
Acted on from top 3
0
Top 3 rate
0%

2Why #1 is on top

The job says
Your profile says

Score

3Old activity fades

Apply 8 · Save 5 · View 2 · Glance under 5s 0.5 · Unsave −3. Applies fade over about 180 days, saves 120, views 45.

    Now: Today

    Example candidate, jobs and companies, all made up. The action weights and fade rates are the real ones; how they add up to a score is simplified.

    I designed the JobStash recommendation engine. David Leonardi built it.

    Behaviour

    Every action on a job is evidence, weighted by kind: an application counts most, then a save, then a view. A bounce barely counts and an unsave counts against. Recent actions weigh more, and each kind decays at its own rate. The result is what a person leans toward: role types, tags, seniority.

    Stated preferences

    Skills and preferences come next: role, seniority, company size, salary, location, languages. Some are filters, the rest adjust the order. The feed skips companies you already belong to, and the weekly email never repeats a job.

    Text matching

    Averaging a whole job post into one vector blends the requirements with the benefits and the legal footer. The engine splits posts and profiles into sentences, drops boilerplate, and matches sentence to sentence.

    Measurement

    The engine records every job shown and its position. An action within seven days is credited to the ranking version that showed it, which gives click, save and apply rates per version, on the site and in the email, alongside unsubscribes. A new version has to beat the old one on those numbers.