Install
openclaw skills install @talnirnx/voice-notes-to-remindersTurn NxVET voice notes / button recordings into LOCAL reminders, calendar events (.ics), and a daily triage note — entirely on the user's own machine, no send paths. Use when someone wants to poll NxVET (labels or NxHub conversations) for spoken notes and turn "follow up with X about Y next Tuesday" into a calendar file + triage line.
openclaw skills install @talnirnx/voice-notes-to-remindersA NxVET recipe for AI coding agents. Point Claude Code, Codex, Cursor, or any LLM-based agent at this file and say "Read SKILL.md and implement it — start with Phase 0." The recipe is agent-neutral: it's plain Markdown plus two dependency-free Python scripts. See
INSTALL.mdfor how to load it into a specific agent.
Build a small, local-only tool that polls the NxVET API for voice notes (button recordings), interprets each transcript, and produces:
output/Reminders_YYYY-MM-DD.md) — sections for Scheduled,
Follow-ups, Ideas, Unclear, each line quoting the original transcript, and.ics files (output/events/…) the user double-clicks to add to
Outlook or Google Calendar — no OAuth, works for both.The whole point is the privacy architecture: NxVET's servers only ever see the raw voice note. The calendar, the triage note, and everything the tool does with a note live entirely on the user's machine. There is no send path — the tool only creates drafts and files for the user to accept.
This recipe is generic: it works for any NxVET organization with an API key. Adapt the person names, device name, schedule, and timezone to whoever is running it.
This skill needs three things. If the user doesn't have them, point them to these links before building — the tool can't work without them:
nxvet_sk_).GETs to the NxVET API
(https://app.nx.vet). No telemetry, no third-party services, no email, no posting anywhere..ics). Never send an email, text, or
meeting invite on anyone's behalf. Adding a real "send" step is a separate, explicitly
approved feature — not part of this tool..env as NXVET_API_KEY=nxvet_sk_.... Add .env
to .gitignore if a repo is initialized. Never print the full key; never commit it; never
paste it anywhere that leaves the machine. See reference/security.md.state/processed_ids.json of
handled label/conversation IDs and always skip them. See reference/caching-and-state.md.Work through these in order. Confirm each phase works before moving on. The reference files carry the API quirks, security rules, and state/caching design — read them; don't re-derive.
.env with NXVET_API_KEY=.... Confirm .env is
git-ignored.claude mcp add nxvet --transport http https://mcp.nx.vet/mcp \
--header "Authorization: Bearer nxvet_sk_YOUR_API_KEY"
https://mcp.nx.vet/mcp server per their config —
see https://api.nx.vet/mcp.html.) For headless scripts, a small REST client is fine — see
reference/nxvet-api.md.get_identity) or GET /api/auth/me. Confirm HTTP 200 and capture
the organizationId. Save it to config.json.GET /api/devices?organizationId=...; show the operator the device list and save the
chosen deviceId to config.json.Button recordings appear as labels (records) OR as NxHub conversations depending on the device. Determine this empirically — do not assume:
null transcripts — always
fetch the detail).config.json ("source": "labels" or "source": "nxhub") and write
a short NOTES.md with what you learned.A helper is provided: {baseDir}/scripts/nxvet_poll.py (stdlib-only Python 3; no pip installs).
Run it with python3 {baseDir}/scripts/nxvet_poll.py. It reads
.env + config.json, fetches new recordings for the configured source, skips already-processed
and still-empty transcripts, and emits new transcripts as JSON for the classifier. Run it or
adapt it. It must:
config.json + state/processed_ids.json."{}" / null) —
leave those for the next run, do not mark them processed.state/run.log.The agent does the interpretation. For each transcript pick one bucket:
| Bucket | Signal | Output |
|---|---|---|
| Timed commitment | Explicit date/time ("10am tomorrow", "next Tuesday") | .ics event + triage line under Scheduled |
| Follow-up reminder | "Follow up with X about Y", no firm time | triage line under Follow-ups (suggested date: +2 business days) |
| Idea / note | No action, just a thought | Ideas section of the triage note |
| Ambient recording | Long multi-speaker conversation (devices capture ambient audio alongside button notes — can be 20k+ chars) | One-line summary under Ambient in the triage note; do NOT extract every incidental "need to" from chatter as a reminder |
Devices record ambient conversations in the same label type as button voice notes — expect
both. Short single-speaker notes are usually deliberate voice notes; long multi-speaker
transcripts are usually ambient. A buried explicit commitment in an ambient recording
("let's meet Tuesday at 3") may still be surfaced, but flag it [FROM AMBIENT] so the
operator knows the context.
Extract who / what / when. Resolve relative dates against the recording's
timestamp, not the processing time (a note recorded Friday saying "tomorrow" means Saturday).
Use the operator's timezone (ask; default America/New_York). When genuinely ambiguous, put it
under Unclear flagged [UNCLEAR] rather than guessing a calendar slot.
Use python3 {baseDir}/scripts/make_ics.py --help to inspect the bundled calendar-file generator,
then use it to generate calendar files.
output/Reminders_YYYY-MM-DD.md — sections Scheduled, Follow-ups,
Ideas, Unclear; every line quotes the original transcript sentence so the operator can
verify.output/events/2026-07-15_follow-up-sally.ics — standard iCalendar
VEVENT (summary, description containing the original transcript, start/end, and a VALARM
reminder). Double-clicking adds it to Outlook or Google Calendar — no OAuth, no creds. Ask
the operator to double-click one as a test.Do not integrate directly with Outlook/Google APIs in the MVP.
launchd on macOS, Task Scheduler on
Windows, cron on Linux. A missed run must just catch up on the next one — the processed-IDs
state makes that safe..env + own state folder, same code..ics
appears; double-click adds it to the calendar..env + state files to demonstrate no credentials or clinic data ever leave the machine.reference/nxvet-api.md — endpoints, auth, MCP setup, and the data-format gotchas.reference/security.md — secrets, local-only guarantee, no-send rule, what to send if stuck.reference/caching-and-state.md — idempotency, the overlapping poll window, HTTP caching,
rate-limit backoff.reference/good-practices.md — code layout, error handling, timezone handling, testing.