The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Vamoose listing page.
Calendar workflows, minus the tedium.
The moose does the paperwork. You go to the beach.
Four calendar backends behind one workflow engine that branches, approves, waits, recurs, and files real leave with your HR system, driven from your terminal, Claude, Slack, or a local dashboard, and authorable by an AI agent over MCP. Every run is recorded, and the daemon resumes exactly where it left off after a crash. Install with brew install dcadolph/tap/vamoose.
Calendar busywork is death by a thousand cuts: create the hold marked free, invite your manager, Slack them for the yes, go back in and add the team one by one, add a second blocked event so your own calendar says away, then file the leave in the HR portal. vamoose turns those chores into workflows it runs for you and advances in the background. Time off is the flagship workflow, and you can define your own.

That is the whole flow: the hold shows as free so it blocks nobody, your manager's calendar accept is the approval, and the daemon notifies your team the moment it lands.
vamoose app, against
Microsoft Graph, Google, iCloud, or any CalDAV host. Same workflow, any backend.The built-in pto workflow is the flagship: hold shown free, manager approves by
accepting, team added as optional attendees so nobody's calendar gets blocked.
request, check, and promote are fronts over its steps. See Workflows.

Four backends ship behind one provider interface: Microsoft Graph (Outlook,
Microsoft 365, and Teams), Google Calendar, Apple iCloud, and any standard CalDAV host.
Pick one with --provider or the VAMOOSE_PROVIDER environment variable, and every
command works the same across them. Approval detection is the one exception: iCloud
sends invites but does not report accept/decline over CalDAV, so on iCloud you promote
by hand. See providers.
You can rig a version of this with one calendar's rules or a saved email. vamoose earns its keep the moment you have more than one account:
--provider.macOS and Linux:
Windows:
Docker (for hosting):
Or with Go 1.26 or newer:
Zips and tarballs for every platform are on the releases page.
New to vamoose? The Quickstart takes you from zero to a first approved hold in a few minutes.
Set one calendar backend and export its credentials, then run vamoose doctor to check the
setup. Every backend, including iCloud and any CalDAV host, is covered in providers.
vamoose talks to Microsoft Graph as you, using the OAuth device-code flow.
User.Read, User.Read.All (read your manager and their direct reports)Calendars.ReadWrite (create and update the hold)MailboxSettings.ReadWrite (reserved for the out-of-office reply)offline_access (stay signed in between runs)The first command opens a device-code prompt. Tokens are cached under your user
config directory and refreshed automatically after that. Run vamoose whoami
first to confirm auth and directory access before creating any holds.
For --provider google, create an OAuth desktop app client in the Google Cloud
console, enable the Google Calendar API, then sign in:
login opens your browser for consent on a local loopback address, then caches and
refreshes tokens after that. Two things catch people out. Consent is denied until you add
the signing-in account under Google Auth Platform, Audience, Test users. And while the app
sits in Testing status, Google expires its refresh tokens after seven days, so login
comes back around once a week. Both are covered step by step, with a troubleshooting
table, in the Google guide.
Google Calendar has no directory, so pass your approver with --manager and set your team
with vamoose team set.
For --provider icloud, create an app-specific password at appleid.apple.com and export:
iCloud sends invites but does not report approvals over CalDAV. Recover them with the macOS EventKit helper or a Slack Approve button, or promote by hand. See providers.
For --provider caldav, point at any standard CalDAV server, such as Fastmail or Nextcloud:
Calendar setup is enough for holds, coverage, and approvals. Reading your remaining
balance with vamoose balance, and filing approved time off as real leave, both need an
HR system as well. Skip this section if you only want the calendar side.
Point at BambooHR directly:
Or post to any HR system through a webhook:
Without one of these, vamoose balance exits reporting that no HR system is configured.
Run vamoose doctor to see which parts are set.
Times accept YYYY-MM-DD for all-day holds or RFC3339 for partial days. Pass
--manager you@work.com to skip directory lookup, or --dry-run on request to
preview without sending. off also accepts explicit --start/--end.
Not everything needs approval:
A workflow is an ordered list of steps that vamoose runs and the daemon advances.
The request-approve-promote flow above is the built-in pto workflow. Run a
workflow by name, with a date phrase or explicit --start/--end:
Three workflows ship built in:
| Name | Steps | Use |
|---|---|---|
pto | hold shown free, approve, notify | Time off that a manager approves. |
notify-only | hold shown free, notify | Tell the team, no approval needed. |
away | out-of-office block | Personal out of office, no fanout. |
Define your own by dropping a JSON file in ~/.config/vamoose/workflows/<name>.json.
A file there overrides a built-in of the same name.
Then vamoose run team-heads-up next week. Steps use these verbs:
hold creates the event and invites the manager when an approve step follows.approve waits for the manager to accept the invite.notify adds the team as optional attendees.away marks you out of office with no attendees.event creates a plain event, with attendees from --attendees.cancel deletes the hold.A workflow starts with exactly one creating step (hold, away, or event).
Approval waits on the manager that only a hold invites, so an approve step
needs a hold, and only notify may follow approval. With --watch, the hold is
recorded and vamoose daemon runs the remaining steps once the manager accepts.
By default promote derives your team from the directory: your manager's direct
reports, minus you. That assumption breaks if you are the manager, your team is a
distribution list, or the directory is sparse. Set an explicit team instead:
The list is stored as JSON under your user config directory
(team.json). When it is set, promote and whoami use it; when it is absent,
they fall back to the directory.
vamoose mcp speaks the Model Context Protocol over stdio, exposing the commands as
tools so Claude can book time off for you. Point an MCP client at the binary:
Authenticate once first with vamoose whoami; the server reuses the cached token.
These guides are also on the site at vamoose.dev.
| Guide | What |
|---|---|
| Quickstart | Zero to a first approved hold in a few minutes. |
| Concepts | Holds, approval, workflows, and the three adapters. |
| Commands | Every command, flag, and environment variable. |
| Workflows | Built-in and custom workflows: branching, delays, guards. |
| Providers | Microsoft Graph, Google, iCloud, and CalDAV setup. |
| Slack | Drive vamoose from Slack, with approval buttons. |
| Claude | The MCP server and the skill. |
| Hosting | Run it as a service, secrets encrypted at rest. |
| Architecture | Surfaces, core, and adapters. |
MIT (see LICENSE). Use it, change it, ship it, sell it. No conditions beyond keeping the copyright notice.