Reading the repo
Reading the repo
How to install on Windows
Open source AI Employees. 8 scheduled business roles, 60 routines, on Claude Code and 10 other harnesses. They drive your browser the way you do and improve every run. You own the files.
Saved setup from 47 min ago
Will it work on my device?
docs/INSTALL.mdThe short version is two steps: extract a kit to a local folder, then open your agent in that folder and tell it to install the employee from there. The employee's first run takes about an hour and may ask for a second session. This page is the long version of the README's two steps: every operating system, every scheduler, and what a first run should look like so you know when it did not.
Read docs/PREREQUISITES.md first. Item 3, the login, is the one that fails silently.
INSTALL-PROMPT.md.SCHEDULE.md, or fire times moved to after it normally wakes.Pick one. The GTM Engineer is the one I have run in production the longest, so it is the one to start with unless your business needs one of the others more.
Path A, the installer:
npx ai-employees hire gtm-engineer --to D:\AgentOps\gtm-engineer
It copies that one folder, refuses a path under OneDrive, Dropbox, Google Drive or iCloud, runs the three self tests, and prints the install prompt with your path filled in. On macOS or Linux, --to ~/ai-employees/gtm-engineer. Without --to it uses ./employees/<slug> under the current folder.
Path B, a clone:
git clone https://github.com/markfulton/ai-employees.git
Then copy employees/gtm-engineer to a folder outside cloud sync. Do not run an employee from inside the clone if the clone sits in a synced folder.
Path C, the Claude Code plugin: in any Claude Code session, run /plugin marketplace add markfulton/ai-employees, then /plugin install ai-employees@ai-employees, then say "hire the GTM Engineer into D:\AgentOps\gtm-engineer" or run /ai-employees:hire. The plugin carries all eight kits and the installer, so the skill runs Path A from the bundled files with no download. To take a newer release later, run /plugin marketplace update ai-employees.
Path D, any harness that reads the skill format: copy skills/hire into ~/.claude/skills/ (or your harness's skills folder) and say "hire the GTM Engineer into D:\AgentOps". Outside the plugin it uses the installer through npx, which is Path A.
From the employee folder:
node --version
node scripts/copy-check.mjs --selftest
node scripts/runlog.mjs --selftest
node scripts/guard.mjs --selftest
claude auth status
Four passes and loggedIn: true. If the last one says false, run claude and /login before anything else. On another harness, swap the last line for its own login check; a signed in account is the requirement, not the command.
Open a session in that folder in the harness you use. On Claude Code, the Desktop app: open the folder, trust it; the CLI: cd into it and run claude. On another harness, docs/HARNESSES.md has its command. Say "install the GTM Engineer from this folder" and it reads INSTALL-PROMPT.md itself. Or paste it: open that file, fill in the block marked FILL THIS IN if you want to hand it your folder path and home page up front, copy everything between === BEGIN PROMPT === and === END PROMPT ===, and paste it.
Then let it work. It reads the contract, checks the machine, researches your business from your own public pages instead of interviewing you, writes the strategy folder, seeds the board, builds the dashboard, registers its own schedule, and stops exactly once for you to read its first drafts. It asks about at most five things a crawl genuinely could not settle, and it does not wait for the answers.
If the session ends before it finishes, open a new one in the same folder and paste the prompt again. It resumes from progress[] in its state file rather than starting over.
The install prompt does this itself where it can, and it proves one routine by hand before it registers the rest. What follows is what it does, per scheduler, so you can check it or do it yourself.
Routines, New routine, Local. One task per routine, named exactly after the routine id (gtm-board-standup and so on), prompt Read D:\AgentOps\gtm-engineer/routines/gtm-board-standup/SKILL.md and follow it., working folder set to the employee folder, the fire time from SCHEDULE.md. Click Run now once per task and choose always allow on each prompt so later runs do not stall. Turn on Keep computer awake in Settings. Local tasks need app version 1.1.5368 or later.
What happens after sleep: the app skips a fire the machine slept through and, on wake, runs exactly one catch up for the most recently missed time, looking back seven days. The kit's window guard decides whether that catch up does anything.
Every routine ships run/<routine-id>.cmd.example. Copy it to run/<routine-id>.cmd, replace the «..._ROOT» placeholder with your folder, and check the path to claude.exe (where.exe claude; the native installer puts it at %USERPROFILE%\.local\bin\claude.exe). Never point it at the Desktop app's bundled copy, which lives under a path Task Scheduler cannot see.
Run one by hand first:
cmd /c run\gtm-board-standup.cmd
Count the lines in runlog.jsonl before and after. One new line means it worked. Then register the rest with the schtasks lines in CAPABILITIES.md section 9.4, and turn on "Run task as soon as possible after a scheduled start is missed" on each.
Four things in that launcher are there because a scheduled fire found each one missing: the full path to the binary (Task Scheduler starts with the system PATH and claude is not on it), < nul (without it every fire waits three seconds for stdin), an explicit --permission-mode (a run that waits on a prompt at 06:45 never fails and never writes a record), and the if errorlevel 1 line that writes a failed run record when the harness exits before the routine could (which is what a missing login looks like).
Same as the Windows app route: Routines, New routine, Local, one task per routine, prompt Read ~/ai-employees/gtm-engineer/routines/gtm-board-standup/SKILL.md and follow it., working folder the employee folder, always allow on first run, Keep computer awake on.
One plist per routine at ~/Library/LaunchAgents/com.aiemployees.<routine-id>.plist. The weekday standup, as an example:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>com.aiemployees.gtm-board-standup</string>
<key>WorkingDirectory</key><string>/Users/you/ai-employees/gtm-engineer</string>
<key>ProgramArguments</key><array>
<string>/bin/zsh</string><string>-lc</string>
<string>/Users/you/.local/bin/claude -p "Read /Users/you/ai-employees/gtm-engineer/routines/gtm-board-standup/SKILL.md and follow it." --permission-mode acceptEdits --output-format json < /dev/null || node /Users/you/ai-employees/gtm-engineer/scripts/runlog.mjs --failed-run gtm-board-standup --exit-code $?</string>
</array>
<key>StartCalendarInterval</key><array>
<dict><key>Weekday</key><integer>1</integer><key>Hour</key><integer>7</integer><key>Minute</key><integer>30</integer></dict>
<dict><key>Weekday</key><integer>2</integer><key>Hour</key><integer>7</integer><key>Minute</key><integer>30</integer></dict>
<dict><key>Weekday</key><integer>3</integer><key>Hour</key><integer>7</integer><key>Minute</key><integer>30</integer></dict>
<dict><key>Weekday</key><integer>4</integer><key>Hour</key><integer>7</integer><key>Minute</key><integer>30</integer></dict>
<dict><key>Weekday</key><integer>5</integer><key>Hour</key><integer>7</integer><key>Minute</key><integer>30</integer></dict>
</array>
<key>StandardOutPath</key><string>/Users/you/ai-employees/gtm-engineer/run/gtm-board-standup.log</string>
<key>StandardErrorPath</key><string>/Users/you/ai-employees/gtm-engineer/run/gtm-board-standup.log</string>
</dict></plist>
Monthly rows use Day entries 1 to 7 (the intake) and 25 to 31 (the refresh) instead of Weekday; the routine's own days and period key reduce that burst to one run. Load with launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.aiemployees.gtm-board-standup.plist, test with launchctl kickstart -k gui/$(id -u)/com.aiemployees.gtm-board-standup, remove with launchctl bootout gui/$(id -u)/com.aiemployees.gtm-board-standup. /bin/zsh -lc is what gives the job your PATH and home. launchd coalesces every fire missed during sleep into one run on wake.
Install the CLI with curl -fsSL https://claude.ai/install.sh | bash, log in once with claude and /login, and brew install node for the scripts. For the browser lane, install the Claude in Chrome extension and run claude --chrome once interactively to accept the first run dialog.
One line per routine, from CAPABILITIES.md section 9.3, with the full path to the binary and < /dev/null. cron skips a fire the machine slept through and never catches up, so on a laptop put the fire times after it normally wakes. The two monthly lines leave the day of week field open on purpose; the file explains why.
OpenClaw, Hermes, Cline and Qwen Code have a built in cron, Codex has scheduled runs, Antigravity has the agy job runner, DeepSeek schedules through a plugin, and Grok Bot, Muse and Dots run recurring tasks from a cloud computer of their own: register one job per routine in that scheduler, with the kit folder as the working directory, the fire time from SCHEDULE.md, and the prompt Read <root>/routines/<id>/SKILL.md and follow it.. OpenCode and Pi have no scheduler of their own, so use the operating system's route above with their headless command in place of claude -p. docs/HARNESSES.md has the exact invocation and the first run check for each, and the same rule holds everywhere: run one routine by hand before you register the rest. Grok Bot is the one whose computer is not yours, and Muse and Dots share that shape: the bot installs the kit on its own cloud computer, you paste the kit's AGENTS.md into the bot's Instructions field, and the brief reaches you in the bot's thread. The hosted section of docs/HARNESSES.md has the rest, including what the shared computer means for your logins.
Day one ends with a strategy folder in your own words, a command center you can click through, a schedule that is registered and proven with one run by hand, and a first small batch of drafts you have corrected. The next weekday the standup writes brief-latest.md before you are up. It is capped at thirty lines and it never lists what passed.
claude auth status on Claude Code, your harness's own check elsewhere), check the machine was awake, and run the launcher by hand. A run that hangs on a permission prompt leaves nothing behind; CAPABILITIES.md section 10 is the fix.failed record that names the launcher. The harness exited before the routine wrote anything. Login first, binary path second.skipped-out-of-window on a day it should have run. The fire arrived late, outside the window. Move the fire time or widen nothing: a wider window invites an overlap.runlog.mjs refused a record. It carried a URL, an email address, a draft, or a secret. That is the rule working; the detail belongs in the queue file, not the log.FILL THIS IN path, and re-register the jobs. The install prompt does this itself if it notices.Run this on your first macOS install and open an issue with what each step recorded and what you changed. It goes into the notes in docs/HARNESSES.md, with your name on the change.
sw_vers, node --version, claude --version, claude auth status (expect loggedIn: true).~/ai-employees/gtm-engineer, run the three self tests, record the three PASS lines.state/gtm-intake-and-dashboard.json.gtm-board-standup by hand with the exact plist command line and confirm brief-latest.md plus one runlog.jsonl line.--chrome while signed in to LinkedIn and confirm it never types there and records blocked-login on a checkpoint.--output-format json total_cost_usd for each routine so docs/COST.md gets a Mac column.Then run powershell -ExecutionPolicy Bypass -File .\setup.ps1. It stops at the first error and is safe to run again. Servers and tests aren't started; it lists them at the end. Read it first.
Needs Git: winget install Git.Git
git clone https://github.com/sebeaguele/ai-employees.git cd ai-employees
Node.js >=18
winget install CoreyButler.NVMforWindows nvm install lts nvm use lts
npm install
npm test
The fastest way: hire your first AI Employee in the Agent Ops Club. Pick the role, and the club writes the one prompt your agent runs from start to finish: it downloads the kit, researches your business from your website, builds your dashboard and schedules its own routines. A free account, no card, and the Hire Your First AI Employee walkthrough is waiting on the other side. The two steps below are the same install done by hand.
1. Download a kit and extract it to your PC. Click Code, Download ZIP above, or run npx ai-employees hire gtm-engineer --to <folder>. Any folder not inside OneDrive, Dropbox, Google Drive or iCloud.
2. Open your agent in that folder and say "Install the GTM Engineer from this folder." It researches your business from your website, builds your dashboard, schedules its own routines, and stops once to show you its first drafts.
You need an AI agent you are logged in to (Claude Code is what I use) and a browser signed in to the accounts it should read. Prerequisites. Full install guide.
This repository is also a Claude Code plugin with one skill, hire, and all eight kits bundled. In any Claude Code session:
/plugin marketplace add markfulton/ai-employees
/plugin install ai-employees@ai-employees
Then say "hire the GTM Engineer into D:\AgentOps\gtm-engineer", or run /ai-employees:hire. The skill checks the folder is outside cloud sync, copies the kit from the plugin with no download, runs the self tests, and tells you the one line to say in a fresh session in that folder. It registers nothing and sends nothing. The plugin page has the same steps with a walkthrough.
What the plugin runs. The hire skill runs one command, node installer/cli.mjs hire <employee> --to <folder>, from the installer bundled in the plugin. It copies one kit from the plugin into the folder you choose, writes .installed.json there, runs every kit script with --selftest under Node, and runs claude auth status to see whether you are signed in. On that path it makes no network request, collects no data and sends no telemetry. The installer downloads a kit from github.com/markfulton/ai-employees only when it has no bundled copy, which never happens inside the plugin or the npm package, since both carry the kits. Used without the plugin, the skill asks before it fetches anything from npm or GitHub. It registers no schedule, sends nothing and never reads or enters a credential. A hired employee is a separate step that runs in its own folder, and docs/GUARDRAILS.md says what it may and may not do.
Not on Claude Code? The same two steps work on OpenClaw, Hermes, OpenCode, Grok Bot, Codex, Antigravity, Pi, Cline, Qwen Code, DeepSeek, Muse and Dots. docs/HARNESSES.md has the command for each.
<table> <tr><td align="center" width="900"> <h2>Get your install prompt and a guided first hire, free</h2> <p>Hiring one or all eight, pick your roles in the Agent Ops Club and copy one prompt your agent runs from start to finish. The Hire Your First AI Employee walkthrough takes you through it step by step.</p><a href="https://club.reinventing.ai/ai-employees-setup?utm_source=github&utm_medium=readme&utm_campaign=ai-employees&utm_content=cta-setup-guide"><img src="assets/cta-install-prompt.png" width="470" alt="Get my install prompt and walkthrough, free in the Agent Ops Club"></a>
<p><sub><b>Free account, no card.</b></sub></p> </td></tr> </table>No reports for Windows yet.
Opens a chat with this manual already filled in, for Windows. It uses your own account; gitmanual sends nothing.