card-onboard
Onboard a user setting up AI Desk Card for the first time, or after moving to a new machine, plugging the device into a new…
Invoked by cron (or manually) to refresh the widgets on the ai-desk-card e-ink display with fresh data. Reads the current widget cache, decides which widgets need new data, pulls from the user's data sources (calendar, mail, git, weather APIs, etc.), and pushes back via the
Claude Code
$ npx -y skills add op7418/ai-desk-card --skill card-refresh --agent claude-code
Codex
$ npx skills add op7418/ai-desk-card --skill card-refresh -a codex -y
Cursor
$ npx skills add op7418/ai-desk-card --skill card-refresh -a cursor -y
Gemini CLI
$ npx skills add op7418/ai-desk-card --skill card-refresh -a gemini-cli -y
GitHub Copilot
$ npx skills add op7418/ai-desk-card --skill card-refresh -a github-copilot -y
OpenCode
$ npx skills add op7418/ai-desk-card --skill card-refresh -a opencode -y
Windsurf
$ npx skills add op7418/ai-desk-card --skill card-refresh -a windsurf -y
name: card-refresh description: | Invoked by cron (or manually) to refresh the widgets on the ai-desk-card e-ink display with fresh data. Reads the current widget cache, decides which widgets need new data, pulls from the user's data sources (calendar, mail, git, weather APIs, etc.), and pushes back via the card-widget skill. Use when invoked headless from cron, or when user says "刷新一下卡片" / "refresh card" / "update widgets now". trigger_keywords: - card refresh - 刷新卡片 - 更新卡片 - 更新组件 - refresh widgets allowed-tools: - Bash - Read - Write
You're invoked to re-pull data for whatever widgets are currently shown on the user's ai-desk-card 副屏. This typically runs from cron every 2 hours (see [REFRESH.md](./REFRESH.md) for the setup). Be quick, idempotent, and silent unless something's wrong.
`GET /widget` — it tells you which slots are filled with which widget types. Only refresh those; don't push new widget types unprompted.
not synced, mail offline), skip that widget. Leave the existing one in place rather than wiping with stale data.
fetcher; move on.
Emit nothing on stdout unless there's an actionable error.
curl -sf http://127.0.0.1:9877/widget | python3 -m json.tool
Parse `widgets[]`. For each `{slot, type, age}`, decide:
asked.
The card-widget skill's schemas tell you the data shape. Below are the recommended sources per widget (use whatever's actually available on the user's machine):
| Widget | Source | Notes | | --- | --- | --- | | `weather` | wttr.in / OpenWeather / system weather | Need user's location | | `calendar` | `icalbuddy` on macOS / Google Calendar API / .ics file | macOS easiest | | `next-meeting` | same as calendar — pick first event with `starts_in_min` ≥ 0 | | | `inbox` | gmail API / mailctl / IMAP / Slack API | Per-source counts only | | `messages` | iMessage db / Slack DMs | macOS: `~/Library/Messages/chat.db` (read-only) | | `pr-queue` | `gh pr list` against user's repos | List repos via config | | `git-status` | `git -C <cwd> status --porcelain` + `git log -1` | One repo only | | `system` | psutil / `uptime` / `vm_stat` | macOS: vm_stat for mem, df for disk | | `now-playing` | macOS: `osascript -e 'tell application "Spotify"...'` | Skip if not running | | `todo` | macOS Reminders (use `fetch_todo_reminders.py` in card-widget) | | | `deadlines` | user-maintained list (see assets/deadlines.yaml if it exists) | | | `break-reminder` | local idle / activity tracking | Best-effort |
**You don't need to support all of these in one refresh.** Start with the 3-4 widgets the user actually has on the card, refresh those, push, exit.
Use the card-widget skill's `push_widget.py` helper or curl. Re-push the SAME `{slot, type}` with new `data`. Daemon will replace and trigger a single debounced frame render.
Per-widget TTL: pass `ttl=7800` (2h 10min) so widgets fade if cron breaks. That way a stuck cron doesn't leave hours-old data on the panel forever.
Don't summarize, don't ask follow-up questions. Just exit. Cron user sees nothing in their terminal.
If the user says "刷新一下卡片" in conversation, do the same thing but **briefly tell them what you did**:
> Refreshed: calendar (3 events), weather (24°C 晴), pr-queue (2 reviews > waiting). Skipped: inbox (gmail API not configured).
start it from cron (user won't see the prompt). Just exit with a diagnostic line on stderr.
git-status) anyway.
rejects the bad widget; other widgets still get refreshed.
don't have a weather widget, let me add one").
interactive AI agent sessions.
credentials are configured.
cron command. Wraps the headless AI CLI invocation.
refreshes `system`, `git-status`, and `weather` (wttr.in). For users who don't want token cost.
🌏 English version: README.en.md 一个适配 Claude Code / Codex 等 Agent 的桌面副屏 Skill。把 M5Paper V1.1 4.7 寸墨水屏立在显示器旁边,由 AI Agent 推送 widget:天气、日程、todo、PR 队列、AI 状态、休息提醒…… 装上 Skill 后,烧固件 / 配 Wi-Fi / 推内容 / 设置定时全部由 Agent 引导,你不用自己跑一行 pio 或 curl。
Onboard a user setting up AI Desk Card for the first time, or after moving to a new machine, plugging the device into a new…
Push live data to the user's ai-desk-card M5Paper e-ink companion display. Use whenever the user asks to show todos, calendar,…
Walk a user through provisioning Wi-Fi on their AI Desk Card device. After provisioning, device joins the user's home Wi-Fi,…
Personalized audit that teaches the advanced Paradev (formerly Superset) features the user isn't using yet (automations, parallel…
Direct actions on one Orchestrator session or PR: stop or interrupt, resume, merge a PR, start a review, screenshot a session's…
Your capability catalog — read this at boot. Lists the temporal date-range skills and the external integrations (reached via the…