Install
openclaw skills install @talnirnx/clinic-activity-reportGenerate a plain-English weekly CLINIC ACTIVITY REPORT for a veterinary clinic owner from NxVET data — total recordings, per-device and per-day/hour breakdown, week-over-week trend, and health flags (silent devices, out-of-date firmware, failing webhooks). Read-only and local; nothing is sent or changed. Use when a clinic owner/manager wants a recurring "how's the clinic doing" summary.
openclaw skills install @talnirnx/clinic-activity-reportA 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: plain Markdown plus two dependency-free Python scripts. See
INSTALL.mdfor how to load it into a specific agent.
Build a small, local, read-only tool that gives a veterinary clinic owner or manager a recurring, plain-English snapshot of how the clinic is doing — the kind of thing they'd want every Monday morning:
Output is a readable markdown report (output/ClinicReport_YYYY-Www.md) the owner opens and
reads. Optionally also a simple self-contained HTML dashboard.
GET calls to the NxVET API
(https://app.nx.vet). It never creates, edits, deletes, or sends anything..env as NXVET_API_KEY=nxvet_sk_.... Never print
the full key; never commit it; never paste it anywhere that leaves the machine. See
reference/security.md.nxvet_sk_)..env with NXVET_API_KEY=.... Confirm .env is
git-ignored.GET /api/auth/me (or the get_identity MCP tool). Confirm HTTP 200 and capture the
organizationId and organizationName. Save them to config.json, along with the clinic
timezone (ask; default America/New_York).Use {baseDir}/scripts/collect_stats.py (stdlib-only Python 3; no pip installs). It reads .env +
config.json and prints a single JSON object with the week's numbers:
python3 {baseDir}/scripts/collect_stats.py --days 7 # last 7 days, clinic timezone
python3 {baseDir}/scripts/collect_stats.py --days 7 --end 2026-07-20 # a specific week
It gathers: total recordings in the window and the previous window (for the trend), a
per-device / per-weekday / per-hour breakdown, the device fleet with last-seen times and
firmware, and webhook delivery health. See reference/nxvet-api.md for the endpoint quirks
it handles (the transcript/label gotchas, types= filter, epoch-ms timestamps).
Two ways, pick based on how the tool runs:
scripts/write_report.py:
python3 {baseDir}/scripts/collect_stats.py --days 7 \
| python3 {baseDir}/scripts/write_report.py --out "output/ClinicReport_$(date +%Y-W%V).md"
Report sections: At a glance (total + trend + device count), Recordings by device, Busiest days, busiest times of day, and a Health check (silent devices, firmware, webhooks). Every figure traces back to the collected JSON.
isHardware). Never flag app/web/iOS login "devices" as silent. Default threshold:
no report in 3+ days.0.8.13 and 0.8.13.0 as the same (ignore trailing-zero formatting) — write_report.py
already does this.Set it up with the OS-native scheduler (detect the OS first): launchd on macOS, Task Scheduler
on Windows, cron on Linux. A good default is Monday 7am. Each run writes a new dated report
and leaves the previous ones in place, so the owner builds a history.
ClinicReport_YYYY-Www.md appears and reads clearly..0 is not flagged.The collector keeps a small ETag cache in state/http_cache/ and sends If-None-Match on
repeat calls, so re-runs and the rarely-changing prior-period window mostly return cheap
304 Not Modified responses. Cache the org id in config.json so /auth/me isn't re-called,
and fetch only the window you need. Full detail in reference/caching-and-state.md.
reference/nxvet-api.md — endpoints, auth, and the data-format gotchas the collector relies on.reference/security.md — secrets, the read-only/local guarantee, what to send if stuck.reference/caching-and-state.md — how the tool keeps NxVET API usage (and your server cost) low.reference/good-practices.md — honest numbers, timezones, avoiding false health alarms, testing.