Calendar Extractor
Periodically scans recent transcripts to extract calendar events and sends a daily summary of meetings to your iOS chat via push notifications.
Rank
62
Safety
84
Downloads
1.8k
Updated
Oct 10, 2026
Version
0.7.2
Source
CLAWHUB
About
What it does, and when to use it.
Capability contract not published. No trust telemetry is available yet. 1.8K downloads reported by the source. Last updated 10/10/2026.
Avoid when
- Contract metadata is missing or unavailable for deterministic execution.
Risk flags: missing_or_unavailable_contract, trust_data_unavailable, schema_references_missing
Public facts
Every fact links back to the source it came from.
- Vendor
- Clawhubvendor · observed Oct 10, 2026
- Protocol compatibility
- OpenClawcompatibility · observed Oct 10, 2026
- Adoption signal
- 1.8K downloadsadoption · observed Oct 10, 2026
- Latest release
- 0.7.2release · observed Aug 2, 2026
- Handshake status
- UNKNOWNsecurity
Install and run
Setup complexity: low.
clawhub skill install s1735yg3x5h8qgtpapgt8es6f9844ese:calendar-extractor- Install using `clawhub skill install s1735yg3x5h8qgtpapgt8es6f9844ese:calendar-extractor` in an isolated environment before connecting it to live workloads.
- No published capability contract is available yet, so validate auth and request/response behavior manually.
- Review the upstream CLAWHUB listing at https://clawhub.ai/samuel-wei/calendar-extractor before using production credentials.
Contract: missing
curl -s "https://www.xpersona.co/api/v1/agents/clawhub-samuel-wei-calendar-extractor/snapshot"
Documentation
CLAWHUB
155,746 characters of source documentation, loaded on request.
Extracted files
5 files captured from the source.
SKILL.md
---
name: calendar-extractor
description: Extract calendar events from recent recording and keyboard transcripts and push them to your iOS chat as one markdown card per event, each landing in its own Agent Chat thread. Use on demand when the user asks for "today's meetings" / "calendar extract" / "今日会议" / "提取日历", and fetch the last 24 hours of transcript data by default. The javis-server dispatcher also invokes this skill directly for every completed unit — no classifier, no route matching; this skill's own agent decides relevance itself, using this SKILL.md, and may use a deliverable hint passed in the run prompt alongside the transcript; extracted events are written PENDING and become solid only when the user taps Confirm in the iOS calendar table. If the user asks for "today's meetings", use the local day defined by the fetched reference_date field. Triggers: 'today's meetings', 'calendar extract', '今日会议', '提取日历'.
keywords: today's meetings, calendar extract, 今日会议, 提取日历, calendar-extractor
metadata:
openclaw:
runtime:
node: ">=18"
routes:
- route_id: calendar
skill: calendar-extractor
matches: "meetings, appointments, events, agenda, scheduling, dates/times mentioned"
args_template: null
risk: low
---
# Calendar Extractor
> Extract calendar events from recent recording and keyboard transcripts and push them to your iOS chat — one markdown card per event, each landing in its own Agent Chat thread. Fetch the last 24 hours of transcript data by default. If the user asks for "today's meetings", use the local day defined by the fetched reference_date field. Generate one digest per local day in the user's timezone, containing all events that occur on reference_date and any events explicitly mentioned as happening today.
## When to use
- "today's meetings"
- "calendar extract"
- "今日会议"
- "提取日历"
- Automatically, when the javis-server dispatcher invokes this skill directly after a completed voice/keyboard unit — no classifier, no route matching. This skill's own agent decides for itself, using this `SKILL.md`, whether the unit is worth acting on; if not, it does nothing (see "How this skill is invoked").
## Core commands
> **`<userId>` is optional.** Omit it and it defaults to `self`. Each HiJavis user
> runs in their own openclaw container, so `self` is correctly isolated; the gateway
> token (not the userId) authenticates every server call. No registration is needed
> to start — pass an explicit ID only if you run multiple profiles in one container.
```bash
# Step 1 — fetch recent transcripts as JSON (the agent extracts events from this)
node scripts/calendar-extractor.js fetch [--hours N] [--limit N]
# Step 1 (dispatcher run) — fetch ONE completed unit (the auto-run dispatcher unit)
node scripts/calendar-extractor.js fetch --session <sessionId> [--hours N] # audio unit
node scripts/calendar-extractor.js fetch --kbd-input <inputId> [--hours N] # keyboard unit
# Step 2 — push: pipe the extracted-eREADME.md
# Calendar Extractor > ⚠️ **Requires the HiJavis iPhone app.** This skill runs inside HiJavis — install the app first, then it's ready to use. > 📲 https://apps.apple.com/us/app/hijavis/id6745134765 Calendar Extractor finds the plans hiding in your conversations. HiJavis listens, spots anything that sounds like a meeting or appointment, and hands you a tidy list right in your chat. ## Picture this - You finish a day of back-to-back calls and can't recall what you promised anyone. You ask, "What did I agree to today?" and there it is, all in one list. - A friend says, "Let's grab coffee Friday." You'd normally forget by lunch. HiJavis already caught it. - It's 8am. You open the app and see everything you committed to today, before your first sip of coffee. - You leave a conference where you made a dozen plans out loud, and they're all waiting for you in a list. - The house is buzzing with "dentist Thursday," "soccer practice moved to 5," "dinner Saturday at the new place." HiJavis keeps track so nobody drops the ball. If any of those sound like you, this one's for you. ## What it does HiJavis listens to your conversations and meetings. Calendar Extractor reads back through your recent recordings and spots anything that sounds like a plan or appointment, such as "let's meet Tuesday at 3," "dinner Saturday at the new place," or "call me tomorrow afternoon." Then it sends each event to your chat as its own card — with the title, date, time, place, who's involved, and any notes it picked up. Every event opens in its own chat thread, so you can act on one plan without losing the rest. ## How to use it ### Just ask Open your HiJavis chat and ask. Any of these works: - "today's meetings" - "calendar extract" - "今日会议" - "提取日历" - Or a natural question like "What meetings do I have coming up?" or "Did I agree to anything today?" HiJavis scans your recent recordings and replies with your list in seconds. Nothing to set up first. ### Get a daily summary Want it to come to you? Ask HiJavis to send a summary on a schedule. By default you'll get one each morning (around 8am) and each evening (around 6pm), but you can pick your own times. Just say something like "send me my calendar summary every morning at 7," and it'll start showing up on its own. ## What makes it handy - **It gets how you talk about time.** You don't say "March 14th at 2:00 PM" out loud. You say "tomorrow," "next Thursday," "around 6," "noon." Calendar Extractor turns all of that into a real date and time in your time zone. - **It's instant.** The moment a recording or a typed note finishes, it pulls out any plans right then, so your list is ready before you even ask. - **One card per plan.** Each event arrives as its own card in its own chat thread, so they never pile into one wall of text and you can deal with them one at a time. - **It never repeats itself.** It remembers what it already showed you, so the same event won't clutter your chat twice. - **It works in English an
_meta.json
{
"ownerId": "kn73qn9mdc6qf6hnnz3s26pgch845n33",
"slug": "calendar-extractor",
"version": "0.7.2",
"publishedAt": 1785658459115
}references/route-contract.md
# calendar-extractor — route contract (for the javis-server team)
This document specifies the interface the **javis-server session-dispatcher**
control-plane must satisfy so the dispatcher can route agenda deliverables to the
`calendar-extractor` skill. It is the contract only — no javis-server code is
implemented in this repo.
See the design spec:
`docs/superpowers/specs/2026-06-08-calendar-extractor-dispatcher-adaptation-design.md`
(sections 3a–3c) and the dispatcher spec it adapts to
(javis-server `docs/superpowers/specs/2026-06-06-session-dispatcher-server-variant.md`,
implemented in `app/services/dispatcher_service.py`).
The same contract is declared, discoverably, in the skill's `SKILL.md`
`metadata.routes` block. That static block declares the skill-owned fields
(`route_id`, `skill`, `matches`, `args_template`, `risk`); `enabled` is omitted
there because it is per-user runtime state the server owns, not skill metadata.
## 3a. RouteRegistry row
Seed this row per user, enabling it when the user enables `calendar-extractor`:
| column | value |
|---|---|
| `route_id` | `"calendar"` |
| `skill` | `"calendar-extractor"` |
| `matches` | `"meetings, appointments, events, agenda, scheduling, dates/times mentioned"` |
| `args_template` | `null` (the unit + the prepended SKILL.md carry everything the skill needs) |
| `risk` | `"low"` (read-only transcript extraction + a push; no destructive side effects) |
| `enabled` | set `true` when the user enables calendar-extractor; `false`/absent otherwise |
The dispatcher only routes a deliverable to this skill when an **enabled** row with
`route_id="calendar"` exists for that user. No enabled row → the skill is never
scheduled.
## 3b. `classify_and_route` deliverable shape
Feed the user's enabled route catalog (each row's `route_id` + `matches`) into the
`classify_and_route` task prompt. For a transcript containing scheduling content,
the classifier must emit a deliverable shaped like:
```json
{
"id": "<uuid>",
"title": "Extract calendar events",
"description": "<short summary of the agenda found>",
"route_id": "calendar",
"confidence": 0.0
}
```
- `route_id` MUST be exactly `"calendar"` so it matches the RouteRegistry row.
- No scheduling content in the transcript → **no** `calendar` deliverable → no
proposal card. (This is the correct, silent outcome.)
The dispatcher then matches the deliverable's `route_id` against the enabled
`RouteRegistry` row, persists a `DispatchProposal`, and pushes a proposal card to
iOS. On the user's Approve, it claims run-once
(`DispatchRouteExecuted (user, unit, route)` via a unique constraint, before
scheduling) and triggers the skill.
## 3c. Prompt contract
The skill relies only on the `<unit>` being present and `_UNIT_RE`-valid in the run
prompt — which the generic dispatcher prompt already provides:
```
Run /calendar-extractor for <unit>. Deliverable: <title>. <description>
Fetch that unit's transcript, produce the deliverable, and push the resultdocs/pr-drafts/2026-08-02-prompt-context-fallback.md
# calendar-extractor: use embedded UNIT CONTEXT; a fetch miss no longer aborts the write - **Branch:** `feat/calendar-extractor-prompt-context-fallback` - **Date:** 2026-08-02 - **Skill:** `calendar-extractor` (currently `0.7.1`) - **Spec:** `javis-server/docs/superpowers/specs/2026-08-02-dispatch-prompt-embed-unit-context-resilience-design.md` (Approved — root-caused via systematic-debugging). This is the **coordinated skill-side half** of that spec; the server half (embed the unit context in the dispatch prompt) ships separately on javis-server branch `feat/dispatch-prompt-embed-unit-context`. ## Why A proactive, dispatcher-invoked extraction **silently vanished** when its source unit row was dropped after dispatch. Observed (wmp425, 2026-08-02): a "meeting at 1 PM today" keyboard input reached the server, `calendar-extractor` was auto-invoked, and its agent **extracted the event** (container log: *"Extracted and pushed… PENDING card"*) — but **no `skill_data` row was ever written** (`skill_data MAX(id)` stuck at 319; no POST in the server logs). No calendar event → no voice-call arming → no "Javis calls you" ring. Root cause: the dispatcher handed the skill **only the unit id**, so the skill had to **re-fetch** the unit via `GET /api/transcripts/keyboard-input/<id>`. For this event `keyboard_input 1189` **did not exist** (server `MAX(id)=1187`; rolled-back/dropped inserts — the fragile draft double-save path). The re-fetch 404'd → the skill aborted before the `/api/skill/data` POST → the extracted event was lost. The server fix threads the already-loaded transcript + `source_ref`/`source_kind`/`reference_date`/`tz` into the dispatch prompt as a delimited `UNIT CONTEXT` block. This PR makes the skill **use that embedded context as the source of truth** and treat `fetch` as an optional enrichment whose failure must not suppress the write. ## What changed **`scripts/calendar-extractor.js` — `doFetch` degrades instead of throwing.** - Wrapped the single `httpGet` in a try/catch. On failure (e.g. a 404 keyboard-input miss) it no longer propagates the throw that aborts the run. Instead it logs `⚠️ fetch miss (…) — not aborting; fall back to the run-prompt UNIT CONTEXT.` to stderr and continues with `data = null`. - The existing envelope normalization already handles a null/empty payload → an empty `sessions` array, so the emitted envelope still carries the relative-time anchor (`reference_time`/`reference_date`/`reference_weekday`/`reference_time_utc`/`tz`). - Surfaces the miss in the emitted envelope too (not just stderr): `out.fetch_error = fetchError`, so the agent can *see* the re-fetch missed and knowingly fall back to the `UNIT CONTEXT`. **`SKILL.md` — document the embedded-context path and the no-abort rule.** - Step 1 (Fetch): added the dispatcher-path **Exception** — a failed single-unit `fetch --session`/`fetch --kbd-input` (surfaced as `fetch_error`, empty sessions) does NOT mean "emit nothing"; fall back to the prompt-embedded t
AionUi
Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!
activepieces
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
cherry-studio
AI productivity studio with smart chat, autonomous agents, and 300+ assistants.
CopilotKit
The Frontend for Agents & Generative UI. React + Angular
Machine-readable data
The same record, as JSON, for agents and crawlers.
{
"facts": [
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Clawhub",
"href": "https://clawhub.ai/samuel-wei/skills/calendar-extractor",
"sourceUrl": "https://clawhub.ai/samuel-wei/skills/calendar-extractor",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-10T02:40:20.245Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-samuel-wei-calendar-extractor/contract",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-samuel-wei-calendar-extractor/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-10-10T02:40:20.245Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "1.8K downloads",
"href": "https://clawhub.ai/samuel-wei/calendar-extractor",
"sourceUrl": "https://clawhub.ai/samuel-wei/calendar-extractor",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-10T02:40:20.245Z",
"isPublic": true
},
{
"factKey": "latest_release",
"category": "release",
"label": "Latest release",
"value": "0.7.2",
"href": "https://clawhub.ai/samuel-wei/calendar-extractor",
"sourceUrl": "https://clawhub.ai/samuel-wei/calendar-extractor",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-08-02T08:14:19.115Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-samuel-wei-calendar-extractor/trust",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-samuel-wei-calendar-extractor/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
],
"events": [
{
"eventType": "release",
"title": "Release 0.7.2",
"description": "calendar-extractor 0.7.2 - Added prompt-context fallback logic for dispatcher-invoked runs: when a single-unit fetch fails (e.g. empty/404 session), now falls back to extracting and pushing events using the transcript and reference date embedded in the prompt context, instead of emitting nothing. - Added documentation for the above behavior in SKILL.md (see dispatcher path exception). - Added docs/pr-drafts/2026-08-02-prompt-context-fallback.md. - Removed obsolete skill-card.md file.",
"href": "https://clawhub.ai/samuel-wei/calendar-extractor",
"sourceUrl": "https://clawhub.ai/samuel-wei/calendar-extractor",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-08-02T08:14:19.115Z",
"isPublic": true
}
]
}Record generated Oct 10, 2026.
