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.
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.
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.
Persistent opportunity memory
Every conversation, commitment, interview and signal stays attached to the opportunity it belongs to. Context is never rediscovered.
Facts outrank inferences
Every derived value carries its source and its confidence. A correction you make always outranks what the system guessed.
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.
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.
Interviews that leave something behind
A recorded conversation becomes a review, and the questions you were asked join a library that outlives the process.
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.
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.
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
- Decisions recorded
- 24
- Tests
- 1,080
- Running cost
- ~$18/mo
Each usable, tested and documented before the next began.
What was chosen, what it cost, and what was rejected.
Green before anything ships. No mocked database.
$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.
- Contact
- mike@mikemiller.ai
- Elsewhere
- mikemiller.ai
- The engineering
- How CareerOps is built