Agent skill

Calendar Scheduling

by ericrisco in ericrisco/rsc-harness

A skill your agent uses when a product needs a booking surface — a pick-a-slot page, a Cal.com/Calendly embed, or real availability plus the confirmed meeting written to Google/Outlook — or when…

MITAuto-check passedProductivity & Automation

Install Calendar Scheduling

skills CLI
$ npx skills add ericrisco/rsc-harness --skill calendar-scheduling -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ericrisco/rsc-harness calendar-scheduling --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/calendar-scheduling .claude/skills/calendar-scheduling && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
calendar-scheduling
GitHub stars
180
Token cost
~2.6k tokens
SKILL.md length
1,167 words
Files
6 (incl. scripts, references)
Skills in repo
233
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when a product needs a booking surface — a pick-a-slot page, a Cal.com/Calendly embed, or real availability plus the confirmed meeting written to Google/Outlook — or when…

  • Works in 5 steps: freebusy.query across every relevant… → Compute slots server-side applying… → Place a short-lived hold/lock on the… → …
  • A product needs a booking surface — a pick-a-slot page
  • SKILL.md covers Decide the altitude first, OAuth scopes — narrowest that…, Availability without… and Timezone correctness, plus 3 more sections
  • Runs Shell scripts from its folder; reaches googleapis.com and api.cal.com

What it does

Calendar Scheduling is an agent skill from ericrisco/rsc-harness. Use when a product needs a booking surface — a pick-a-slot page, a Cal.com/Calendly embed, or real availability plus the confirmed meeting written to Google/Outlook — or when fixing double-booking, DST drift, or orphaned reschedule events. NOT calendar CRUD with no booking surface (that is google-workspace), NOT the payment (that is stripe).

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/google-calendar-sync.md`).

It sits in Productivity & Automation, covering Calendar and scheduling and Cloud office suites. It works with Google Workspace and Stripe. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.

When your agent uses it

  • A product needs a booking surface — a pick-a-slot page
  • A Cal.com/Calendly embed
  • Real availability plus the confirmed meeting written to Google/Outlook —
  • Fixing double-booking

Example prompts

  • “/calendar-scheduling”

Requirements

  • A Bash shell

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. freebusy.query across every relevant calendar (the host's, plus any
  2. Compute slots server-side applying buffers (gap before/after),
  3. Place a short-lived hold/lock on the chosen slot (a row with a TTL, or a
  4. Write the event LAST — only after the lock is held.
  5. Re-check freebusy inside the write transaction. If the slot went busy

What it can do on your machine

Read from SKILL.md and the folder at commit 1f8d9bb. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (Shell), which the agent can run.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • googleapis.com
    • api.cal.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Calendar Scheduling loads about 2.6k tokens when it runs, and up to ~4.3k if it reads all its reference files. Until then it costs about 92 tokens; SKILL.md has 1,167 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~92
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~4.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from ericrisco/rsc-harness at commit 1f8d9bb, republished under its MIT licence (© ericrisco). 1,167 words, ~2,607 tokens.

Download SKILL.mdSave it as .claude/skills/calendar-scheduling/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
calendar-scheduling
description
Use when a product needs a booking surface — a pick-a-slot page, a Cal.com/Calendly embed, or real availability plus the confirmed meeting written to Google/Outlook — or when fixing double-booking, DST drift, or orphaned reschedule events. NOT calendar CRUD with no booking surface (that is `google-workspace`), NOT the payment (that is `stripe`).
tags
scheduling, booking, calendar, calcom, calendly, google-calendar, availability, webhooks
recommends
google-workspace, webhooks, automation-flows, email-connector, stripe, sales-pipeline
origin
risco

Calendar scheduling — booking surface + calendar sync, shipped together

Scheduling is always two halves bolted together: a booking surface (an external person reserves a slot — embed, atom, or API call) and calendar sync (you read free/busy to compute availability and write the confirmed event back). Ship one without the other and you get the three bugs the rest of this skill exists to prevent: double-booking, timezone drift after a DST change, and orphaned events on reschedule.

Decide the altitude first

Pick the lowest-code option that still owns the data model you actually need.

You need…Reach forWhat you ownEscape hatch
A booking page fast, minimal codeEmbed Cal.com or CalendlyNothing — the widget owns slots/syncCall the API later to read bookings / fire automation
Bookings in your UI, your branding/data modelCal.com Booker atom or Scheduling API (Cal.com / Calendly)Your UI; provider owns syncDrop to raw provider API if the data model chafes
Read/write one provider's calendar directlyGoogle freebusy.query + events.insertOAuth, refresh, slot math, watch/syncIf it's pure CRUD with no booking → google-workspace
Many providers (Google + Outlook + Apple), no N integrationsUnified API (Cronofy or Nylas v3)One auth/availability surfaceCronofy if cross-domain scheduling matters; Nylas v3 is domain-scoped

Why per row: the embed is zero-maintenance but a black box; the atom/API buys your own UI without owning sync; raw provider is full control and full liability; a unified API trades a vendor for not maintaining three calendar integrations. Hosting, auth/scopes, webhook events, cross-domain support and when each wins, per provider: references/provider-matrix.md.

  • Cal.com is open-source and self-hostable. Self-hosted instances get unlimited API access (no cloud rate limit) and full white-label by pointing the embed script at your own domain. REST base is https://api.cal.com/v2.
  • Calendly v1 API and its webhooks were discontinued in May 2025. Use v2 (REST/JSON, OAuth 2.1 or personal access token). Do not write new v1 code.

OAuth scopes — narrowest that works

The default mistake is requesting the broad scope "to be safe." On Google, both calendar and calendar.events are restricted scopes — they force a third-party security assessment before you can ship to production. Avoid them when a granular scope does the job.

ts
// Bad — restricted scope, blocks production until a security assessment.
const SCOPES = ["https://www.googleapis.com/auth/calendar"];

// Good — granular ladder, no restricted tier for the common booking case.
const SCOPES = [
  "https://www.googleapis.com/auth/calendar.app.created", // app-owned secondary calendar it creates
  "https://www.googleapis.com/auth/calendar.freebusy",    // your own availability
  // add only if you must read the user's existing events to compute slots:
  "https://www.googleapis.com/auth/calendar.events.owned", // manage only events your app created
  "https://www.googleapis.com/auth/calendar.events.freebusy", // others' busy blocks
];

Scope ladder, narrowest first:

  • calendar.app.created — a dedicated secondary calendar your app creates and owns. Best dodge for the restricted assessment when you only need your events.
  • calendar.freebusy / calendar.events.freebusy — read availability (own / others') without reading event contents.
  • calendar.readonly / calendar.events.readonly — read paths only.
  • calendar.events.owned — write, but only events your app created.
  • calendar / calendar.events — restricted; request only if you genuinely manage arbitrary events the app didn't create.

Availability without double-booking — the core flow

Both classic races (computing slots in the browser, and writing the event before re-checking) are eliminated by doing this server-side, in order:

  1. freebusy.query across every relevant calendar (the host's, plus any secondary calendars that block time). Never trust a cached availability blob.
  2. Compute slots server-side applying buffers (gap before/after), minimum notice (no "book in 5 minutes"), working hours, and slot length. The browser may render slots; it must never decide them.
  3. Place a short-lived hold/lock on the chosen slot (a row with a TTL, or a tentative event) so a second request in the same window collides on the lock, not on the calendar.
  4. Write the event LAST — only after the lock is held.
  5. Re-check freebusy inside the write transaction. If the slot went busy between step 1 and now, abort and re-offer. This is the line that actually prevents the double-book.

Decision — do you need a hold step?

SituationHold/lock?
Low traffic, single host, instant writeNo — steps 1→5 with the in-transaction re-check is enough
Multi-step booking form, payment, or high contentionYes — a TTL lock so the slot survives the form and releases if abandoned

Google's availability primitive is freebusy.query (POST, returns busy blocks per calendar); the write is events.insert. Both payloads (with conferenceData for Meet), watch channels + sync tokens, recurring-event edge cases and refresh-token handling: references/google-calendar-sync.md.

Timezone correctness

DST is where naive scheduling code dies. Rules:

  • Store the instant in UTC and carry the IANA zone id (e.g. Europe/Andorra) separately. Never store a bare wall-clock string.
  • Render in the invitee's zone, derived from the IANA id — not from a browser UTC offset. An offset (+02:00) is correct only on the day it was captured; it silently breaks across a DST boundary.
  • Google event payloads MUST set timeZone alongside dateTime, or Google interprets the time in the calendar's default zone and the meeting drifts.
json
// Bad — floating wall-clock, no zone. Drifts after the clocks change.
{ "start": { "dateTime": "2026-10-25T10:00:00" } }

// Good — instant + explicit IANA zone on both ends.
{
  "start": { "dateTime": "2026-10-25T10:00:00", "timeZone": "Europe/Andorra" },
  "end":   { "dateTime": "2026-10-25T10:30:00", "timeZone": "Europe/Andorra" }
}
Show full SKILL.md (428 more words)Show less

Webhooks that survive retries

A booking is not confirmed because the embed said so — it is confirmed when the webhook says so. Providers retry, deliver duplicates, and arrive out of order. Your handler must assume all three.

  • Verify the signature before trusting the payload (Cal.com and Calendly each sign; reject unsigned).
  • Dedupe on the provider event id — an idempotency key persisted before you act, so a retry is a no-op.
  • Handle the lifecycle: Calendly fires invitee.created / invitee.canceled (and routing-form submissions); Cal.com fires BOOKING_CREATED / BOOKING_CANCELLED / BOOKING_RESCHEDULED. Map both to your own created/canceled/rescheduled handlers.
  • Calendly webhooks require a paid plan (Standard/Teams/Enterprise) and are scoped user or organization. Single-use scheduling links expire after 90 days if unused — don't hand out links you cache forever.

The generic inbound-receiver scaffolding (queue, retry, replay) lives in the webhooks skill; this skill only owns the booking-specific lifecycle mapping. For "on booking, also create a CRM record + Slack + sheet" cross-tool fan-out, that orchestration is automation-flows, not here.

Reschedule and cancel without orphans

  • Reschedule = update the same calendar event id. Look up the event you created, events.update (or the provider's PATCH) the times — never events.insert a second one. The phantom-event bug is always a missing lookup.
  • Release the freed slot — if you held a lock or marked a row busy, free it so the old time is offerable again.
  • Cancel = delete/cancel the same event and release the slot; record the cancellation so reminders and downstream automation stop.

Anti-patterns

Anti-patternWhy it bitesDo instead
Compute available slots in the browserStale/raced data → double-bookfreebusy.query server-side, re-check in the write txn
Request auth/calendar for a read-only widgetRestricted scope → blocked by security assessmentNarrowest scope: calendar.freebusy / calendar.app.created
Store local "wall-clock" timesDrift after DST → wrong-hour meetingsUTC instant + IANA zone; set timeZone on Google payloads
Trust the embed for confirmation stateEmbed lies on network failuresConfirm only on a signature-verified webhook
Create a new event on rescheduleOrphaned phantom events pile upevents.update the same event id; release old slot
No idempotency on the webhookRetries duplicate the bookingDedupe on provider event id before acting
Cache a single-use scheduling link foreverCalendly links expire after 90 daysGenerate on demand; treat expiry as expected
Poll the calendar for changesSlow, rate-limited, misses editswatch push channels + incremental sync tokens
Write new code against Calendly v1v1 API + webhooks dead since May 2025Calendly v2 (OAuth 2.1 / PAT)

Adjacent skills: raw calendar CRUD / watch channels with no booking → ../google-workspace/SKILL.md; charging for a paid appointment → ../stripe/SKILL.md; booking funnel as sales stages → ../sales-pipeline/SKILL.md; sending the confirmation email itself → ../email-connector/SKILL.md.

© ericrisco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 5 other files (scripts, references) in skills/calendar-scheduling of ericrisco/rsc-harness.

  • SKILL.md
  • evals/README.md
  • evals/cases.yaml
  • references/google-calendar-sync.md
  • references/provider-matrix.md
  • scripts/verify.sh

Open the folder on GitHubat commit 1f8d9bb

Compare with similar skills

Calendar Scheduling next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Calendar Scheduling compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Calendar Scheduling this skillericrisco/rsc-harness180—~2.6kAutomated safety check: PassMIT
Prismer Google WorkspacePrismer-AI/PrismerCloud1.6k3 repos~4.2kAutomated safety check: PassMIT
Google Workspace CLILeoYeAI/openclaw-master-skills2.2k—~2.6kAutomated safety check: NotesMIT
Google Workspaceyc-software/qm15k—~1.8kAutomated safety check: PassMIT
Google Workspace CLIalirezarezvani/claude-skills28k—~3kAutomated safety check: NotesMIT
Gogtrpc-group/trpc-agent-go1.9k15 repos~1.1kAutomated safety check: PassApache-2.0

Similar skills

  • Prismer Google Workspace

    Prismer-AI/PrismerCloud

    Gives an agent account-scoped access to Gmail, Calendar, Drive, Contacts, Docs and Sheets through the gws CLI or a bundled Python client.

    1.6k GitHub starsUsed in 3 repos~4.2k tokens
    Productivity & AutomationAuto-check passed
  • Google Workspace CLI

    LeoYeAI/openclaw-master-skills

    Installs and authenticates the gws CLI, then automates Gmail, Drive, Sheets, Calendar, Docs, Chat and Tasks with ready-made recipes, persona bundles and security audits.

    2.2k GitHub stars~2.6k tokensUpdated 2 mo ago
    Productivity & AutomationAuto-check: notes
  • Google Workspace

    yc-software/qm

    Read and act on the user's Gmail, Google Calendar, and Google Tasks through per-user OAuth.

    15k GitHub stars~1.8k tokensUpdated today
    Productivity & AutomationAuto-check passed
  • Google Workspace CLI

    alirezarezvani/claude-skills

    Google Workspace administration via the gws CLI (github.com/googleworkspace/cli).

    28k GitHub stars~3k tokensUpdated 1 mo ago
    Documents & OfficeAuto-check: notes
  • Gog

    trpc-group/trpc-agent-go

    Google Workspace CLI for Gmail, Calendar, Drive, Contacts, Sheets, and Docs.

    1.9k GitHub starsUsed in 15 repos~1.1k tokens
    Productivity & AutomationAuto-check passed
  • Google

    letta-ai/lettabot

    Google Workspace CLI (gog) for Gmail, Calendar, Drive, Contacts, Sheets, and Docs.

    327 GitHub stars~774 tokensUpdated 4 mo ago
    Productivity & AutomationAuto-check: notes

More from ericrisco/rsc-harness

All 233 skills in this repo
  • Ab Testing

    ericrisco/rsc-harness

    A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…

    180 GitHub stars~2.4k tokensUpdated yesterday
    Auto-check passed
  • Accessibility

    ericrisco/rsc-harness

    A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…

    180 GitHub stars~3.4k tokensUpdated yesterday
    Auto-check passed
  • Ads

    ericrisco/rsc-harness

    A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…

    180 GitHub stars~2.2k tokensUpdated yesterday
    Auto-check passed
  • Agent Eval

    ericrisco/rsc-harness

    A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…

    180 GitHub stars~3.2k tokensUpdated yesterday
    Auto-check passed
  • AI Media

    ericrisco/rsc-harness

    A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…

    180 GitHub stars~3.3k tokensUpdated yesterday
    Auto-check passed
  • Analytics

    ericrisco/rsc-harness

    A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.

    180 GitHub stars~2.8k tokensUpdated yesterday
    Auto-check passed

Questions about Calendar Scheduling

What does Calendar Scheduling do?

A skill your agent uses when a product needs a booking surface — a pick-a-slot page, a Cal.com/Calendly embed, or real availability plus the confirmed meeting written to Google/Outlook — or when…. Calendar Scheduling is an agent skill from ericrisco/rsc-harness.com/Calendly embed, or real availability plus the confirmed meeting written to Google/Outlook — or when fixing double-booking, DST drift, or orphaned reschedule events.

When should I use Calendar Scheduling?

Calendar Scheduling fits situations like: A product needs a booking surface — a pick-a-slot page; A Cal.com/Calendly embed; real availability plus the confirmed meeting written to Google/Outlook —; fixing double-booking.

How do I install Calendar Scheduling in Claude Code?

Run `npx skills add ericrisco/rsc-harness --skill calendar-scheduling -a claude-code`. Or copy the skill folder (skills/calendar-scheduling in ericrisco/rsc-harness) into .claude/skills/calendar-scheduling in your project. Claude Code loads it when a task matches its description.

How do I install Calendar Scheduling in Codex?

Run `npx skills add ericrisco/rsc-harness --skill calendar-scheduling -a codex`. Or copy the skill folder (skills/calendar-scheduling in ericrisco/rsc-harness) into .agents/skills/calendar-scheduling in your project. Codex loads it when a task matches its description.

Can I use Calendar Scheduling in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill calendar-scheduling -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/calendar-scheduling, .gemini/skills/calendar-scheduling, .github/skills/calendar-scheduling and .opencode/skills/calendar-scheduling in your project.

What does Calendar Scheduling need to run?

Going by SKILL.md and its folder, Calendar Scheduling needs a shell for the scripts in its folder. Our summary lists: A Bash shell.

Does Calendar Scheduling access the network?

SKILL.md names 2 domains. In commands or code: googleapis.com and api.cal.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.

Is Calendar Scheduling safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Calendar Scheduling use?

Calendar Scheduling is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Calendar Scheduling use?

About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.7k tokens, read only when the agent opens those files.

What are the alternatives to Calendar Scheduling?

Skills that share tags, products or a category with Calendar Scheduling: Prismer Google Workspace (Prismer-AI/PrismerCloud, 1.6k stars), Google Workspace CLI (LeoYeAI/openclaw-master-skills, 2.2k stars), Google Workspace (yc-software/qm, 15k stars) and Google Workspace CLI (alirezarezvani/claude-skills, 28k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Calendar Scheduling?

ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 180 GitHub stars. The repository holds 233 skills in this directory. The repository was last updated on October 9, 2026.

Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.