Minimal, file-backed calendar CLI with strict timezone-aware datetimes.
- Stores events as JSON on disk (default:
~/.clawendar/events.json) - Requires ISO-8601 datetimes with a timezone offset (e.g.
2026-02-14T10:00:00+01:00) - Written for Node >= 22
From this directory:
npm test
# Run without installing:
node ./bin/clawendar.js today
# Optional: install the `clawendar` command into your PATH
npm i -g .
# or (for local dev)
npm linkThis repo ships an OpenClaw Skill at skills/clawendar/SKILL.md.
- Go to this repo’s GitHub Releases.
- Download the attached
clawendar.skillfile. - Install it into your OpenClaw instance (Skill installer / skills directory).
Point OpenClaw at this repo’s skills/ directory, e.g. set:
skills.load.extraDirs = ["/path/to/local-clawendar/skills"]
By default the CLI writes to:
~/.clawendar/events.json
Override with:
CLAWENDAR_DATA_DIR=/some/dir
Example:
CLAWENDAR_DATA_DIR=/tmp/my-cal node ./bin/clawendar.js week--start, --end, --from, and --to must be strict ISO-8601 with an explicit offset:
- ✅
2026-02-14T10:00:00+01:00 - ❌
2026-02-14 10:00 - ❌
2026-02-14T10:00:00Z(UTCZis currently not accepted; use+00:00)
If --end is omitted on add, it defaults to start + 1 hour.
clawendar add "Dinner" \
--start 2026-02-14T19:00:00+01:00 \
--end 2026-02-14T21:00:00+01:00 \
--place "Home" \
--participants "Alice,Bob"Notes:
- The title is the first non-flag argument after
add. --participantsis a comma-separated string (no spaces) and is stored as an array.
Recurrence is designed to be wall-clock stable in an IANA timezone (for example Europe/Warsaw), meaning a “09:00 weekly meeting” stays 09:00 local time even when DST changes (the offset will change).
clawendar add "Team sync" \
--start 2026-03-10T10:00:00+01:00 \
--tz Europe/Warsaw \
--rrule "FREQ=MONTHLY;INTERVAL=1;BYDAY=TU;BYSETPOS=2"RRULE notes:
- Supports nth weekday patterns via
BYDAY=<weekday>;BYSETPOS=<n>(e.g.2nd Tuesday). - The
--startvalue must still be a strict ISO-8601 datetime with an explicit offset.
clawendar occurrences <id> \
--from 2026-03-01T00:00:00+01:00 \
--to 2026-05-01T00:00:00+02:00clawendar skip <id> --date 2026-03-30T09:00:00+02:00clawendar today
clawendar week
clawendar list \
--from 2026-03-01T00:00:00+01:00 \
--to 2026-03-31T23:59:59+01:00clawendar edit <id> --title "New title"
clawendar edit <id> --place "Room 42"
clawendar edit <id> --participants "Alice,Bob,Charlie"
clawendar edit <id> --start 2026-02-14T11:00:00+01:00 --end 2026-02-14T12:00:00+01:00clawendar delete <id>Each event prints as a single line:
<id> <start> <title> [<place>] (<participants...>) {series|occurrence}
- Place / participants only appear when present.
- Recurring event definitions are tagged
{series}. - Expanded instances (from
occurrences) are tagged{occurrence}.