Your job search, continuously understood

A job search is not a list of applications.It is a state to maintain.

Opportunities, conversations, people, commitments and signals all move at once. CareerOps keeps that state — so you can stop asking what you are forgetting and see what changed, what matters, and what to do next.

Sign in

Synthetic data · cannot reach a private account · nothing leaves the session

Private beta, one workspace per person. Ask for access — or take the demo for a walk first, no account needed.

The film

Seventy-five seconds, end to end.

The morning brief, the inbox that files itself, the pattern across your last seven interviews, and the reply it writes but never sends — narrated start to finish.

75 seconds · sound on · captions available

What it is for

The hard part was never writing the email.

It is holding reliable state across dozens of asynchronous conversations, and working out the right next move from information that is incomplete and still changing.

01

Persistent opportunity memory

Every conversation, commitment, interview and signal stays attached to the opportunity it belongs to. Context is never rediscovered.

02

Facts outrank inferences

Every derived value carries its source and its confidence. A correction you make always outranks what the system guessed.

03

Human accountability

It drafts, proposes and prioritizes. It does not send recruiter email or make a consequential decision on its own.

What it does

Four things that keep working while you are not looking.

Each one reads something you already have — a mailbox, a calendar, a recording, a posting — and leaves a record you can check.

01

Mail that files itself

Job-search mail is read, classified and attached to the right process — with a reply drafted for the ones that deserve an answer.

02

Interviews that leave something behind

A recorded conversation becomes a review, and the questions you were asked join a library that outlives the process.

03

A posting that cannot disappear

Listings come down the week a role closes. The one you applied to is kept, and compared against what interviewers actually said.

04

Ranking that shows its working

Seven dimensions combined through weights you set. A dimension nothing can compute is blank, never a default dressed as a measurement.

A reply, one step short of sent

It writes the awkward one for you.

A recruiter asks for your range on a Tuesday afternoon and the reply takes twenty minutes you do not have. CareerOps drafts it from what the thread and your profile already say, shows you what it read, and saves it to your own Gmail drafts. Sending stays yours — there is no send path in the code to call.

Answers you can follow

Ask it what you already told it.

“What compensation did we discuss?” is a question about your own records, and it should be answered from them. Every claim carries the record it came from, and a citation the retrieval did not actually supply is deleted before you ever see it — because a footnote that cannot be followed looks like provenance and is not.

Under it

Production architecture, not a prototype.

Event-driven AWS services, relational data with isolation enforced by the database, agents bounded by deterministic orchestration, and a Model Context Protocol server — combined so that incoming signals turn into actions without anything consequential happening unasked.

AI where reasoning helps

Eleven agents read prose and say how sure they are. Not one of them computes a priority, moves a stage, or decides whether its own output may apply.

MCP in both directions

A production Model Context Protocol server exposes ten read-only tools to any AI client — over the same authenticated API a browser uses, holding no privilege of its own.

Isolation below the application

PostgreSQL row-level security, enabled and forced, with the app connecting as a role that cannot turn it off. A missing workspace matches no rows rather than all of them.

Serverless, and priced

Six CDK stacks, no Lambda in a VPC, a database that pauses to zero — and a four-hourly sweep whose real cost is the warm hour after it, which is why it is not four-minutely.

Explore the full architecture

Behind the build

Every decision here has a record, made when it was made.

A system that reads your mail and puts a number next to a job is asking for a lot of trust. The only honest way to earn it is to let somebody check the working — so the reasoning is written down, including the parts that were wrong first.

Milestones
15

Each usable, tested and documented before the next began.

Decisions recorded
24

What was chosen, what it cost, and what was rejected.

Tests
1,080

Green before anything ships. No mocked database.

Running cost
~$18/mo

$6–8 idle, plus ~$11 keeping the four-hourly sweep's database warm.

Three decisions worth arguing with, and all three are in the assistant if you want the long version: scoring is plain arithmetic over weights you set, because a model that computes its own priority cannot be audited. Answers cite only records the retrieval actually supplied, and a citation that was not in the bundle is deleted before you see it. And a calendar sync calls no model at all — a calendar is the most private thing this reads, and there is nothing in it worth sending anywhere.

Who built it

One person, in the open, while job hunting.

CareerOps is built by Mike Miller. It started as the tool the search itself needed — holding state across dozens of asynchronous conversations is the actual work, and no spreadsheet does it — and it is also the thing that shows how those decisions get made by somebody who has to live with the result.

So it is two things at once, and worth saying rather than leaving to be inferred: a private-beta product with real users and real infrastructure, and a portfolio case study with every decision written down, including the ones that were wrong first.

Review the architecture
Contact
mike@mikemiller.ai
Elsewhere
mikemiller.ai
The engineering
How CareerOps is built