Install
Two commands,
then one click.
Setup checks what you have, installs what it can, and verifies each permission actually worked rather than assuming it did.
You need
- A Mac JobSeeker drives macOS directly. It does not run on Windows or Linux.
- Claude Code Where the agents live, and where you talk to them.
- Google Chrome Logged in to the accounts you want read, so nothing ever asks for a password.
- Node 20 or newer Runs the dashboard. There is nothing else to install.
Apps the agent will connect to
A few tools you already use.
You will need to connect Claude to a handful of things already on your Mac — your email, your browser, WhatsApp. That is what lets the work happen automatically while you are not around, instead of only when you are sitting there asking for it. Each one unlocks a different part of the system, so skipping one costs you that part and nothing else. Onboarding checks every one of them and the dashboard tells you which are live.
- Gmail and Google Calendar. Without these, nothing reads your email, and your applications will only ever be as current as what you type in yourself.
- Chrome, connected to Claude. This is what reads WhatsApp and LinkedIn, and what fills in an application inside your own logged-in session — so you are never asked to hand over a password. Chrome also needs one setting ticked by hand, under View ▸ Developer ▸ Allow JavaScript from Apple Events, and macOS will ask you once to permit automation. Without it, email and job-hunting still work; WhatsApp, LinkedIn and assisted applications do not.
- WhatsApp. How the morning digest reaches your phone, and how you approve or reject something while away from your desk. This is the one piece you install yourself — the next section covers it. Without it everything still runs; you just read the results on the dashboard instead.
- Your CV. Read once, at setup. Every relevance score and every prefilled application answer comes from it, so this is the one thing that makes the results yours rather than generic.
First, check if you have Node
You probably have it. Check before installing anything.
There is no separate npm to install. npm comes bundled with Node — install one and you have both. macOS does not ship with either, so if you have never done web or JavaScript work on this Mac, you likely need Node once.
Paste this and see what comes back:
node -v
A version number of v20 or higher means you are set — skip ahead. If
instead you see command not found, install Node. The simplest route is
the installer from nodejs.org: download the LTS build, open it,
click through, done. If you already use Homebrew, this is quicker:
brew install node
Either way, confirm both arrived before moving on:
node -v && npm -v
Install
git clone https://github.com/cventour/jobseeker
cd jobseeker
npm run setup
Note there is no npm install step, and that is not an omission — the
whole system runs on Node's own built-ins and on shell, so there are no third-party packages to
download, audit or keep up to date. npm is used here only as the way to run
commands, not to fetch anything.
If you want to connect your WhatsApp
The one piece you install yourself.
Email, calendar and the browser are connections Claude already offers. WhatsApp is different: it needs a small server of its own — an MCP server — running alongside Claude Code, and it comes from a separate open-source plugin. Without it installed and paired there is no morning digest.
Only if you want the digest on your phone
Install the plugin, then link your phone.
Two commands in your terminal. The first registers where the plugin comes from, the second installs it:
claude plugin marketplace add Rich627/whatsapp-claude-plugin
claude plugin install whatsapp-claude-channel@whatsapp-claude-plugin
Start Claude Code and it loads by itself. Then give it the number you want it to act as — country code and number, no plus sign:
> /whatsapp-claude-channel:configure 971551234567
A pairing code appears in your terminal.
On your phone, open WhatsApp ▸ Settings ▸ Linked Devices ▸ Link a Device, choose Link with phone number instead, and type the code in.
That is the same mechanism WhatsApp Web uses, so there is no Business API, no Meta developer account and no API keys involved — it is your own WhatsApp, with one more linked device on it.
Worth knowing before you do
- It only sends. This server delivers your digest and sends messages you have already approved. It does not read your conversations — that is the browser's job, and a separate decision. So installing it does not give anything access to your chat history.
- Messages come from your own number. Anyone receiving one sees it as coming from you, because it is. If you would rather keep a separate identity for it, pair a different number.
- One session holds the link at a time. WhatsApp allows the server a single device link, so two Claude sessions cannot share it. If you have a scheduled run,it reclaims the link to whatsapp when it starts — otherwise a session you left open days ago would quietly hold it and the scheduled digest would go nowhere.
- It is someone else's plugin. JobSeeker does not ship or maintain it. It is worth reading before you install it, as with anything that connects to your accounts: Rich627/whatsapp-claude-plugin.
How to prepare your Mac
Setting up permissions for the agents to do work for you.
Setup handles this for you — it triggers each prompt at the right moment and then checks the result rather than assuming it worked. This section is here so you know what you are agreeing to, and so you can skip the parts you do not need.
The whole of it comes down to one macOS permission: Automation ▸ Google Chrome, which is what lets JobSeeker read a page you already have open. How many times you grant it depends entirely on how you intend to run things.
Everyone
Nothing to change.
Reading your email and calendar, researching companies, finding roles and scoring them against your CV all happen through Claude's own connections. None of it touches a macOS privacy setting. If that is all you want, you are already done.
Only for WhatsApp, LinkedIn and assisted applications
Let Claude read a page in your browser.
These are the only features that need your real browser, because they depend on you already being logged in. The first time it happens macOS asks whether Claude may control Google Chrome — click Allow. You can trigger that prompt deliberately, while you are sitting there, rather than being surprised by it later:
npm run browser:probe
Chrome then needs one box ticked by hand, which no script can do for it: Chrome menu bar ▸ View ▸ Developer ▸ Allow JavaScript from Apple Events. Without it, JobSeeker can see that you have eleven unread on WhatsApp Web but cannot read them. It is a Chrome preference rather than a macOS one, so it will not appear in System Settings. There is deliberately no script for it: automating that menu would need blanket Accessibility access, which is a far larger permission than one checkbox is worth.
Expect this prompt to come back occasionally. macOS attaches the permission to the exact program that asked, and Claude Code is version-pinned — so a new version is, as far as macOS is concerned, a new program asking. Clicking Allow is permanent for that version. You are at the keyboard when it appears, so it costs you a click.
When you want it to run on schedule, as a routine
The scheduled run asks separately.
This is the part worth understanding, because it is the one that fails quietly.
macOS ties permission to whichever program does the asking. When you run things yourself that
is Claude. When the daily run fires by itself it is bash, which macOS treats as a
completely different requester — so approving one does not approve the other. That is
exactly how a set-up that works perfectly while you watch it does nothing at 08:00, with
nobody there to click the dialog it is waiting on.
So you clear that second prompt once, on purpose, while you are present:
launchctl kickstart -k gui/$(id -u)/com.jobseeker.browser
Click Allow and the scheduled run is covered for good — unlike the interactive one, this grant survives updates and reboots, because it is attached to a system binary whose identity never changes.
If you would rather not grant it at all, do not schedule anything. Run the morning routine by hand when it suits you and this whole tier is unnecessary. Setup skips it entirely when you decline the scheduler. To choose a time later, or to change your mind:
npm run schedule -- 09:00
And to stop it running on a schedule again:
npm run schedule -- --remove
What it never asks for
These are the permissions people expect an automation like this to want. It works without every one of them, by design.
- Accessibility. Nothing here clicks, types or submits on your behalf without you watching. There are no synthetic keystrokes to grant.
- Screen Recording. Nothing is ever screenshotted. Page text is read directly, not captured off your display.
- Full Disk Access. Only this project's own folder is read and written.
- A Chrome debugging port. Deliberately avoided — leaving one open would let any program on your Mac drive your browser as you, which is a much bigger door than this needs.
To check what is actually working at any point, or after changing something:
npm run browser:probe
It reports each capability separately rather than one vague failure, so you can see whether the problem is the macOS grant, the Chrome checkbox, or Chrome simply not being open. The full reference lives in PERMISSIONS.md.
Then
claude
> /onboard
Or open the dashboard and use Settings ▸ Setup, which does the same thing in a form — targeting, spend caps, the daily run time, and a live check of what is working.
Onboarding asks what you are looking for — markets, roles, locations, seniority — reads your CV, and saves your answers. After that, one command each morning:
> /job-run
