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

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.

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

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.

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