case study · check-in 01in progress

A network engine that happens to be job hunting

Compass is a system for the 2,164 people I have met over twenty years. It is pointed at a job search right now because that is where I am, and the search is the forcing function rather than the point.

pythonsqlitevanilla jsnetwork
project
Compass
published
2026-07-27
updated
2026-08-19

Compass is a system for the 2,164 people I have met across twenty years of work, and what it is finally for is keeping those relationships from quietly decaying into a contact list I open only when I need something. Right now it is pointed almost entirely at a job search, because that is where I am this year, and that search is the thing that forced me to build it rather than the reason it should exist. Everything below is the current shape of it, which is the narrowest and most urgent version of a considerably larger idea, and I am writing it down mid-flight instead of tidily afterward.

So start with why the narrow version exists. Here is the advice everybody gives you when you start looking for your next thing: blast the resume out, get it in front of as many recruiters as you can, set up alerts, apply to everything close enough, and play the numbers. I think that advice is garbage, and I think it survives mostly because it feels like progress. You can send forty applications on a Sunday and go to bed feeling productive, having accomplished nothing beyond entering forty lotteries. Volume was never the problem I was trying to solve.

What I am actually looking for

There are two things I want out of this, and neither one of them is a job.

The first is a company whose mission I give a damn about, and I mean that in a specific way. Not a mission I can tolerate, but one where the problem they are pointed at is a problem I would still find interesting on a Tuesday afternoon in year three, once the novelty is gone and it is just the work. The second is a role that actually fits me, because I have a shape. I am good in the tangled operational middle, where a lot of people are involved and nobody can quite say what should happen next, and if you put me on a tidy, well-specified roadmap you have wasted your money and my time.

Now go look at a job post and try to determine either of those things, because you cannot. A job post is marketing, written by a committee to survive legal review and attract volume, and it tells you the title, an inflated scope, and a list of requirements assembled by asking three people what their last hire did. It does not tell you that the mandate is fake, that the exec who sponsored the role left in March, or that you would be the fourth Principal PM in two years and that the first three all left for the same reason. You find that out in month three, from the inside, when it is expensive.

So the real question is who do I know here

This is the part people get backwards about warm introductions. Yes, an intro gets you a half step in the door and your resume gets read by a human instead of a filter, which is real, and it is also the smaller half of the value.

The bigger half is that a warm intro is the most honest research channel I have found, and the distinction that matters here is not whether a connection exists, because LinkedIn will hand you that for free and it is worth roughly what you paid. It is whether the person on the other end will actually be straight with you. Somebody I know, who works there right now, will tell me over coffee in ten minutes what a month of research would never surface. Whether the mandate is real or a title with no budget behind it, whether the team is churning, whether leadership decides things or relitigates everything, and whether I would actually like it there. That is due diligence, and it runs in both directions, because I get to find out whether I want them while they get a read on me from someone whose judgment they already trust. That read is worth considerably more than anything I could put in a cover letter. An application is me guessing about a company, and a conversation is me learning about one.

So the question that decides everything right now is not how many places I have applied to, it is who do I know here. I could not answer it, because the answer was buried in a 2,164-row LinkedIn export and a research spreadsheet that had never met each other. Joining those two things is where Compass started, and it is worth saying plainly that this is a phase of the project rather than the shape of it.

Seventeen strangers

Compass takes 2,164 connections and a 163-company research universe and reduces them to 25 ranked targets, and for each one it answers the only thing I care about: is there a warm path in, or am I a stranger here? Today, 17 of the 25 are strangers, and the dashboard opens on that number, in red, before it shows me a single thing I have accomplished.

That was deliberate, and it is the one design decision in the whole system I would defend hardest. A job search run out of a spreadsheet measures activity, meaning applications sent, calls booked, and notes taken, and every one of those numbers goes up as long as you stay busy, which is exactly why they feel good and exactly why they are worthless. They measure motion rather than position. So I inverted the scoreboard and made the system lead with what I do not have, giving every target with no known contact a red rule down its left edge and a red gap chip in the last column. There is a filter that hides everything except the gaps, because that list is the actual work, and the number I want going down is 17.

A warm path, for the record, means someone I actually know who actually works there now. Not a second-degree connection I have never spoken to, and not someone who worked there in 2019. The bar is whether I could text this person, and if the answer is no then it does not count.

The thing it is not allowed to do

Computing that turns out to be the whole system, and the hard part is not the join, it is honesty. Employer strings from a LinkedIn export are a mess, because a company calls itself one thing on a profile and another thing entirely in my spreadsheet, so an exact match fails and the fallback is fuzzy, and fuzzy means false negatives. That limitation is written into the query documentation rather than buried, because a warm path the system quietly missed is a much worse failure than one it never claimed in the first place.

Which is the rule that shaped this more than any other: the system is not allowed to make anything up. Company notes record Score: Unknown and point at the research sheet instead of copying a number across, because a copied score goes stale silently and a missing one does not, and relationship notes exist only for people I have actually talked to. That sounds pedantic right up until the first time a system tells you confidently that you know somebody at a company, you walk in believing it, and you do not.

Under the hood it is about as boring as it gets, on purpose. One local SQLite file, standard-library Python, no dependencies, and no service, with a read-only export that writes a snapshot.json so the interface reads that file instead of the database. The dashboard is 414 lines of HTML, CSS, and vanilla JavaScript, with no framework, no build step, and no external request. It serves on 127.0.0.1 and the footer says so.

Whose data this is

There are 2,164 people in the local store and six person notes in the vault, and that ratio is the design rather than a backlog. Bulk contact data belongs to the people in it and not to me, so it stays on one machine, and only a working set gets promoted into notes, deliberately, one person at a time. A hosted version of this dashboard is gated behind a written privacy review that has not happened, and until it does, the answer to whether I can check this from my phone is no.

Where this goes

This is the part I opened with, and it is worth closing on because it took running the thing to believe it. I built Compass to find a job, and the longer I run it the more obvious it becomes that the job search is the least interesting thing it does. The target list is the disposable half, and the durable half is everything sitting underneath it: who I know, where they actually are now, when we last talked, and how we know each other in the first place. None of that expires when I sign an offer.

So the direction is that Compass becomes a relationship engine, and the career search was the forcing function that got it built. The version I want tells me when a former colleague moves somewhere interesting, and flags the person I have not talked to in fourteen months and genuinely like. It answers who I could work with, hire, refer, or build something with, which is the same join pointed at a much better question than who can get me an interview.

I have spent twenty years accumulating a network and treating it like a rolodex I open when I need something, which is a bad way to treat people and, incidentally, a terrible way to get any value out of it. The gap count is what taught me that, because 17 strangers is not a networking failure that happened last month, it is twenty years of not keeping in touch, showing up as a number, in red.

This is a direction and not a roadmap. I have written it down as a proposed decision record so that a future version of me knows what I was thinking, and I fully expect the shape to change once the search produces enough real usage to argue with. The rule I set for myself is that I do not get to build any of it until the same friction shows up three weeks running in a weekly review, because running the workflow by hand first is how you find out what to build. For now the system is very good at telling me exactly where the gaps are, and closing them is still a person picking up the phone, which does not automate and should not.

← all Compass check-ins

more in this series