Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Read and create Calendar.app events through a local macOS helper. Use when the user wants to inspect Apple Calendar calendars, summarize a day, check upcoming events, or create a new Calendar.app event from Codex.
.claude/skills/hashgraph-online-apple-calendar/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | -57% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 60% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -73% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 11% | 0% |
Use this skill to work with the local macOS Calendar app through the bundled helper at ../../scripts/apple_calendar.py. The helper now uses an EventKit/Swift backend for data operations. Prefer the quick commands today, tomorrow, agenda, free, and add over lower-level calls unless you need raw JSON or direct lifecycle operations like update-event, delete-event, reminder changes, or .ics export/import.
today or tomorrow. These default to the configured personal calendars in ../../config.json instead of scanning every subscribed calendar.agenda or list-events only when you need a specific date window or raw JSON payload.add --if-free for new events so overlapping slots are blocked unless the user explicitly wants a conflict.find-events first when you do not already have the event uid.List calendars and configured aliases:
bash/usr/bin/python3 ../../scripts/apple_calendar.py list-calendars
Today's agenda across the configured personal calendars:
bash/usr/bin/python3 ../../scripts/apple_calendar.py today
Tomorrow's agenda:
bash/usr/bin/python3 ../../scripts/apple_calendar.py tomorrow
List one day's events from a named calendar or alias:
bash/usr/bin/python3 ../../scripts/apple_calendar.py list-events \ --calendar "prace" \ --date today
Human-readable agenda for a specific day:
bash/usr/bin/python3 ../../scripts/apple_calendar.py agenda \ --date 2026-03-27
Find free windows:
bash/usr/bin/python3 ../../scripts/apple_calendar.py free \ --date today \ --slot-minutes 30
Quick-add a new event with conflict protection:
bash/usr/bin/python3 ../../scripts/apple_calendar.py add \ --calendar "doma" \ --title "Design Review" \ --date tomorrow \ --start-time 15:00 \ --duration-minutes 30 \ --location "Zoom" \ --notes "Bring the launch checklist." \ --if-free
Find an event by title and day:
bash/usr/bin/python3 ../../scripts/apple_calendar.py find-events \ --calendar doma \ --title "Stolní Tenis" \ --date today
Update an event:
bash/usr/bin/python3 ../../scripts/apple_calendar.py update-event \ --calendar doma \ --title "Stolní Tenis" \ --date today \ --set-location "Velká nad Veličkou 276"
Replace reminders:
bash/usr/bin/python3 ../../scripts/apple_calendar.py set-reminder \ --calendar doma \ --title "Stolní Tenis" \ --date today \ --minutes-before 30
Clear reminders:
bash/usr/bin/python3 ../../scripts/apple_calendar.py clear-reminders \ --calendar doma \ --title "Stolní Tenis" \ --date today
Export to .ics:
bash/usr/bin/python3 ../../scripts/apple_calendar.py export-ics \ --calendar doma \ --date tomorrow \ --days 1 \ --output /tmp/my-events.ics
Import from .ics:
bash/usr/bin/python3 ../../scripts/apple_calendar.py import-ics \ --calendar doma \ --input /tmp/my-events.ics \ --if-free
Delete an event:
bash/usr/bin/python3 ../../scripts/apple_calendar.py delete-event \ --calendar doma \ --title "Stolní Tenis" \ --date today
add and create-event as write operations.list-calendars.--if-free by default for new events. Use --allow-conflict only when the user explicitly wants an overlapping event.title+start+end. Set --dedupe-by none only when a true duplicate is intended.today, tomorrow, agenda, or free is sufficient, prefer those outputs over raw JSON.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 12,496 | 15,802 | +26% | 1 | 1 | 0% | 1,784 | 1,638 | -8% | 0 | 0 | — |
case-02 | fail→fail | 4,345 | 10,818 | +149% | 1 | 1 | 0% | 534 | 1,598 | +199% | 0 | 0 | — |
case-03 | fail→fail | 7,693 | 13,808 | +79% | 1 | 1 | 0% | 1,043 | 1,640 | +57% | 0 | 0 | — |
case-04 | pass→pass | 19,618 | 16,229 | -17% | 1 | 1 | 0% | 2,354 | 3,050 | +30% | 0 | 0 | — |
case-05 | pass→pass | 7,626 | 14,262 | +87% | 1 | 1 | 0% | 1,518 | 2,690 | +77% | 0 | 0 | — |
case-06 | pass→pass | 6,135 | 19,625 | +220% | 1 | 1 | 0% | 1,143 | 3,945 | +245% | 0 | 0 | — |
case-07 | fail→pass | 39,331 | 10,201 | -74% | 1 | 1 | 0% | 5,370 | 2,313 | -57% | 0 | 0 | — |
case-08 | fail→pass | 10,673 | 7,691 | -28% | 1 | 1 | 0% | 1,092 | 1,742 | +60% | 0 | 0 | — |
case-09 | fail→pass | 23,128 | 2,727 | -88% | 1 | 1 | 0% | 1,457 | 1,819 | +25% | 0 | 0 | — |
case-10 | fail→pass | 34,096 | 6,112 | -82% | 1 | 1 | 0% | 6,659 | 1,828 | -73% | 0 | 0 | — |
case-11 | fail→pass | 14,822 | 8,305 | -44% | 1 | 1 | 0% | 1,757 | 1,944 | +11% | 0 | 0 | — |
case-12 | fail→pass | 10,239 | 5,662 | -45% | 1 | 1 | 0% | 1,596 | 1,754 | +10% | 0 | 0 | — |
case-13 | fail→pass | 16,076 | 8,027 | -50% | 1 | 1 | 0% | 2,072 | 1,757 | -15% | 0 | 0 | — |
case-14 | fail→pass | 30,154 | 2,582 | -91% | 1 | 1 | 0% | 4,514 | 1,779 | -61% | 0 | 0 | — |
case-15 | fail→pass | 25,295 | 4,148 | -84% | 1 | 1 | 0% | 3,519 | 1,910 | -46% | 0 | 0 | — |
case-16 | fail→pass | 13,754 | 1,744 | -87% | 1 | 1 | 0% | 1,606 | 1,590 | -1% | 0 | 0 | — |
case-17 | fail→pass | 14,973 | 7,843 | -48% | 1 | 1 | 0% | 1,626 | 1,807 | +11% | 0 | 0 | — |
case-18 | pass→pass | 19,130 | 12,225 | -36% | 1 | 1 | 0% | 2,500 | 2,321 | -7% | 0 | 0 | — |
case-19 | fail→pass | 17,192 | 8,635 | -50% | 1 | 1 | 0% | 2,265 | 2,502 | +10% | 0 | 0 | — |
case-20 | fail→pass | 10,953 | 8,253 | -25% | 1 | 1 | 0% | 2,063 | 1,853 | -10% | 0 | 0 | — |
case-21 | fail→pass | 17,340 | 7,521 | -57% | 1 | 1 | 0% | 1,692 | 1,647 | -3% | 0 | 0 | — |
case-22 | fail→fail | 4,863 | 8,247 | +70% | 1 | 1 | 0% | 910 | 1,861 | +105% | 0 | 0 | — |
case-23 | pass→pass | 19,207 | 9,034 | -53% | 1 | 1 | 0% | 1,871 | 1,939 | +4% | 0 | 0 | — |
case-24 | fail→fail | 7,044 | 7,484 | +6% | 1 | 1 | 0% | 1,197 | 1,621 | +35% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 21 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +58 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.