Agent skill

AI Desk Card

by op7418 in op7418/ai-desk-card

Drives an M5Paper e-ink desk display from an agent: probes device state, guides first-time setup, and pushes widgets such as calendar, todos and weather.

GPL-3.0Auto-check: notesProductivity & Automation

Install AI Desk Card

skills CLI
$ npx skills add op7418/ai-desk-card --skill ai-desk-card -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install op7418/ai-desk-card ai-desk-card --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
ai-desk-card
GitHub stars
151
Token cost
~2k tokens
SKILL.md length
756 words
Files
85 (incl. scripts, assets)
Skills in repo
4
Repo updated
First seen
Licence
GPL-3.0

At a glance

Drives an M5Paper e-ink desk display from an agent: probes device state, guides first-time setup, and pushes widgets such as calendar, todos and weather.

  • Works in 5 steps: ALWAYS probe state first → 5 — Identify the device profile → Route based on state → …
  • Setting up an M5Paper e-ink card for the first time, including firmware and Wi-Fi
  • SKILL.md covers Step 1 — ALWAYS probe state…, Step 1.5 — Identify the device…, Step 2 — Route based on state and Step 3 — Push a widget (the…, plus 4 more sections
  • Runs Python scripts from its folder; calls bash, curl and python3

What it does

A small e-ink panel next to your monitor shows glanceable widgets that an agent pushes to it. A local daemon renders each frame on the computer and sends pixels to the device over Wi-Fi, USB or BLE. This skill is the single entry point: it begins by running scripts/state.sh, which reports hardware, firmware, daemon and device status as JSON, and it treats the device.alive field, meaning a status report arrived in roughly the last 90 seconds, as the real sign that the device is responding.

It supports two devices: the M5Paper V1.1, a 540×960 grayscale panel with touch, and the M5Paper Color, a 600×400 Spectra 6 panel with three physical buttons and a temperature and humidity sensor, which has its own flow and daemon. The two daemons cannot share a port, so you run the one that matches the device on your desk. From the probe results the skill routes to a detailed flow, such as first-time install and firmware flashing, Wi-Fi provisioning, widget selection, scheduled refreshes or putting the screen to sleep.

Widgets named in the skill include weather, todos, calendar, inbox, PR queue, AI status, focus, deadlines, messages, now-playing, git status, system status, next meeting, break reminders and AI tasks.

When your agent uses it

  • Setting up an M5Paper e-ink card for the first time, including firmware and Wi-Fi
  • Pushing a calendar, todo list or PR queue to the desk display
  • Scheduling the card to refresh during working hours
  • Troubleshooting a card that does not respond, or putting it to sleep

Example prompts

  • “I just got an M5Paper; walk me through flashing it and connecting Wi-Fi.”
  • “Show today's calendar and my open todos on the desk card.”
  • “Refresh the card every 30 minutes during working hours.”
  • “The card is not responding, find out why.”

Requirements

  • An M5Paper V1.1 or M5Paper Color device
  • PlatformIO (pio) to flash firmware
  • Python 3 to run the daemon
  • A Wi-Fi network for the device
  • Pre-approved tools (allowed-tools): Bash, Read, Write, Edit

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. ALWAYS probe state first
  2. 5 — Identify the device profile
  3. Route based on state
  4. Push a widget (the hot path)
  5. When to suggest scheduled pushes

What it can do on your machine

Read from SKILL.md and the folder at commit dc3b498. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash
    • Read
    • Write
    • Edit

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (Python, from the files we listed), which the agent can run.

    Shell commands in SKILL.md call:

    • bash
    • curl
    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

AI Desk Card loads about 2k tokens when it runs. Until then it costs about 231 tokens; SKILL.md has 756 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~231
When it runs · the whole SKILL.md, loaded when a task matches
~2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Bash, Read, Write, Edit

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from op7418/ai-desk-card at commit dc3b498, republished under its GPL-3.0 licence (© op7418). 756 words, ~2,038 tokens.

Download SKILL.mdSave it as .claude/skills/ai-desk-card/SKILL.md (or your agent's skills folder). This skill also uses 84 other files; get the full folder from GitHub.
name
ai-desk-card
description
Drive a physical e-ink desk card (M5Paper 540×960) sitting next to the user's monitor. Use whenever the user wants to: - show / push / display ANYTHING on their card / 卡片 / 副屏 / 墨水屏 / e-ink display / desk card / glanceable display / secondary display - set up the device for the first time (flash firmware, pair, provision Wi-Fi) — phrases like "刚拿到 M5Paper", "怎么装卡片", "first-time setup", "刷固件", "卡片没反应" - schedule recurring pushes / "每小时刷一次" / "工作时间显示日历" / "auto-refresh every 30 min" - configure what the card shows (weather, todos, calendar, inbox, PR queue, AI status, focus, scratch, deadlines, messages, now-playing, git-status, system, next-meeting, break-reminder, ai-tasks) - put the device to sleep / show business card / "息屏" / "睡眠" Single Skill, agent-agnostic: probes current state, then routes to the right sub-flow. Never asks "is the daemon running" — it checks.
allowed-tools
Bash, Read, Write, Edit
trigger_keywords
card, desk card, 卡片, 副屏, 墨水屏, e-ink, M5Paper, paper card, glanceable display, secondary display, ai-desk-card, 桌面卡片, dashboard card

ai-desk-card — single Skill entry point

A 540×960 e-ink panel sitting next to the user's monitor. AI agents push widgets to it; the daemon renders frames server-side and ships pixels over Wi-Fi / USB / BLE. This Skill is the only thing an agent needs to call — it auto-detects state and routes to the right flow.

Step 1 — ALWAYS probe state first

Before doing anything, run the state probe. Do not ask the user "have you done X" — find out by checking.

bash
bash $SKILL_DIR/scripts/state.sh

($SKILL_DIR is wherever this Skill is installed. If your agent runtime sets $CLAUDE_PLUGIN_ROOT, use that. Otherwise use the repo root.)

Output is JSON with this shape:

jsonc
{
  "hardware":   { "pio_installed": bool, "m5paper_usb": str|null },
  "firmware":   { "flashed": bool, "ours": bool, "version": str|null },
  "daemon":     { "running": bool, "pid": int|null },
  "transport":  { "connected": bool, "type": "BLETransport|SerialTransport|WiFiTransport|null" },
  "device":     { "alive": bool, "last_seen_seconds": int|null,
                  "active_transport": "Wi-Fi|USB|BLE|null",
                  "battery_pct": int|null, "uptime": str|null },
  "wifi":       { "provisioned": bool, "ip": str|null },
  "interests":  { "configured": bool, "path": str|null }
}

The most important field is device.alive. It tells you whether the device has sent a status report in the last ~90 s. transport.connected only says "daemon picked a transport class"; device.alive says "we're actually hearing back from the device right now."

Step 1.5 — Identify the device profile

The Skill supports two devices with different panels + daemons:

  • M5Paper V1.1 (540×960 grayscale, GT911 touch, BLE pair) — original
  • M5Paper Color (600×400 Spectra 6 color, 3 physical buttons, audio + SHT40) — new in v0.10

If GET /heartbeat returns device_status.device == "M5PaperColor" (via color_daemon.py running), use the Color path described in flows/08_paper_color.md:

  • env: pio run -e paper-color
  • daemon: python3 daemon/color_daemon.py --device-ip <IP>
  • Wi-Fi provision: Serial JSON cmd:wifi_set (no BLE pairing UX)
  • slot names: top-left / top-right / bottom-left / bottom-right
  • extra widgets: ambient (SHT40 temp+humid)
  • physical buttons: 顶=sleep / 下左=refresh / 下中=settings

Otherwise (default) use the V1.1 path through the routing table below.

The two daemons can't run on the same port simultaneously — pick one based on which device is in front of the user. The Skill flows below work for V1.1 unless explicitly noted.

Step 2 — Route based on state

Walk the decision tree in this order. First mismatch wins; fix it, then re-probe.

ConditionNext actionDetail flow
firmware.flashed == false AND no device.aliveFirst-time hardware setupflows/01_install.md
daemon.running == falseStart the daemonbash $SKILL_DIR/plugin/scripts/start.sh
device.alive == false AND transport.connected == falseDevice unreachable — could be asleep, off, BLE not paired. Tell user, suggest physical wake (tap rotary / plug USB)flows/02_transport.md
device.alive == false AND transport.connected == true (daemon connected something but no status_report in 90s)Device transport up but not responding — restart daemon, then probeflows/02_transport.md
wifi.provisioned == false (and user wants always-on or battery mode)Provision Wi-Fiflows/03_wifi.md
interests.configured == false AND user just asked for "auto-refresh" or "定时推送"Ask about interests, write ~/.ai-desk-card/interests.yamlflows/04_interests.md
device.alive == true + user said "push X"Build widget JSON, POST to daemonflows/05_push.md
device.alive == true + user said "schedule" / "每 N 分钟" / "auto"Set up scheduled pushflows/06_schedule.md
device.alive == true + user said "sleep" / "息屏"Push business card + deep sleepflows/07_sleep.md

Always tell the user which step you're on. Don't operate silently.

Show full SKILL.md (311 more words)Show less

Step 3 — Push a widget (the hot path)

When state is OK and user asks to show something:

bash
curl -sf -X POST "${CARD_DAEMON_URL:-http://127.0.0.1:9877}/widget" \
  -H 'Content-Type: application/json' \
  -d @- <<'JSON'
{
  "slot": "top-left",
  "type": "weather",
  "data": { "city": "Beijing", "temp_c": 22, "icon": "sun", "summary": "晴" }
}
JSON
  • slot: string. Layout is 2-1-1 not 2x2 — top-left (270×280) · top-right (270×280) · middle (540×340) · bottom (540×280) · full (540×960, takes over the whole screen).
  • type: one of 16 — see plugin/skills/card-widget/schemas/ for full JSON schemas with examples.
  • Wi-Fi: response in ~0.2 s. USB: 1–32 s. BLE frame-data: broken — small commands only.

Full per-widget schema + theme reference: plugin/skills/card-widget/SKILL.md

Step 4 — When to suggest scheduled pushes

If the user's request implies recurrence ("keep my calendar updated", "check email every hour", "show me today's todos throughout the day"), don't just push once. Instead:

  1. Confirm the cadence + which widgets they want
  2. Write/update ~/.ai-desk-card/interests.yaml (see flow 04)
  3. Set up the schedule using your agent's native loop primitive:
    • Claude Code: /loop 30m or ScheduleWakeup
    • Codex / Gemini: equivalent scheduling
    • Fallback: cron line via plugin/skills/card-refresh/scripts/refresh_loop.sh

The Skill provides the what (interests + push) — your agent provides the when (loop primitive).

Constraints to never violate

  • No silent operations. Every sub-step gets a one-line update to the user.
  • No retry loops. If something fails, surface the diagnostic and stop.
  • No assuming state. Always re-probe after fixing something.
  • No font escape hatches. The CJK TTF doesn't include ▢ ▶ ✎ ♪ ↑ ↓ ● ○ — … °. Use the safe glyph set documented in plugin/skills/card-widget/SKILL.md.
  • Wi-Fi preferred over USB / BLE. 0.2 s vs 1-32 s vs broken.

Hardware: what the user needs

  • M5Paper V1.1 (~¥600 / $90) — primary target
  • USB-C data cable (one time, for flashing)
  • Optional: USB-C charger for always-on Wi-Fi mode

What this Skill is NOT

  • Not a Claude-Code-only plugin. The plugin/ directory is provided for CLIs that consume slash commands, but this SKILL.md is the agent-agnostic entry point.
  • Not a cloud service. Everything runs on the user's machine (daemon at 127.0.0.1:9877 by default) + the device's local Wi-Fi.
  • Not a generic e-ink renderer. The widgets, themes, and renderer all target this specific device + grid.

© op7418, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 84 other files (scripts, assets) in the repository root of op7418/ai-desk-card.

  • SKILL.md
  • .gitignore
  • HANDOVER.md
  • LICENSE
  • PLAN.md
  • PLAN_RENDERING_V06.md
  • PRODUCT.md
  • README.en.md
  • README.md
  • assets/profile.yaml
  • assets/qr.png
  • daemon/card_daemon.py
  • daemon/card_render.py
  • daemon/card_render_color.py
  • daemon/card_render_settings.py
  • daemon/card_render_settings_color.py
  • daemon/card_render_sleep.py
  • daemon/card_render_sleep_color.py
  • daemon/color_daemon.py
  • … and 66 more

Open the folder on GitHubat commit dc3b498

Compare with similar skills

AI Desk Card next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

AI Desk Card compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
AI Desk Card this skillop7418/ai-desk-card151—~2kAutomated safety check: NotesGPL-3.0
Implement Next Taskrvdbreemen/OTGW-firmware207—~2.1kAutomated safety check: PassGPL-3.0
RuView CLI, API and WASMruvnet/RuView97k—~1.2kAutomated safety check: NotesMIT
RuView Hardware Setupruvnet/RuView97k—~1.8kAutomated safety check: NotesMIT
Esp32 Firmware Engineeralxv2016/folloup-sticky1171 repos~3.8kAutomated safety check: PassGPL-3.0
RuView mmWave Radar Setupruvnet/RuView97k—~907Automated safety check: NotesMIT

Similar skills

  • Implement Next Task

    rvdbreemen/OTGW-firmware

    Drive the autonomous 2.0.0 ESP32-S3-only async + FreeRTOS migration (epic TASK-865).

    207 GitHub stars~2.1k tokensUpdated 4 days ago
    DevelopmentAuto-check passed
  • Covers the RuView `wifi-densepose` command line binary, its Axum REST API and the WebAssembly builds for browsers and ESP32, for embedding or scripting RuView.

    97k GitHub stars~1.2k tokensUpdated today
    Backend & APIsAuto-check: notes
  • Brings a RuView CSI sensing node online by building ESP32-S3 or ESP32-C6 firmware, flashing the board, provisioning WiFi and checking the serial output.

    97k GitHub stars~1.8k tokensUpdated today
    DevelopmentAuto-check: notes
  • Esp32 Firmware Engineer

    alxv2016/folloup-sticky

    ESP32 firmware engineering for ESP-IDF projects. An agent skill from alxv2016/folloup-sticky.

    117 GitHub starsUsed in 1 repo~3.8k tokens
    DevelopmentAuto-check passed
  • Sets up and runs 60 GHz and 24 GHz mmWave radar sensing on ESP32 boards in RuView, alone or fused with WiFi CSI.

    97k GitHub stars~907 tokensUpdated today
    DevelopmentAuto-check: notes
  • Embedded Debug

    FastLED/FastLED

    Firmware crash analysis, stack trace decoder, and register dump interpreter for ESP32/ARM/AVR platforms.

    7.5k GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed

More from op7418/ai-desk-card

  • AI Desk Card Onboarding

    op7418/ai-desk-card

    Walks a user through first-time setup of an AI Desk Card e-ink device, probing daemon, USB, BLE, Wi-Fi and firmware state and fixing whatever is missing.

    151 GitHub stars~1.2k tokensUpdated 4 mo ago
    Auto-check: notes
  • M5Paper Card Widgets

    op7418/ai-desk-card

    Pushes glanceable info such as todos, calendar, weather and AI status to an M5Paper e-ink desk card through a local daemon, picking slots and widget types.

    151 GitHub stars~3k tokensUpdated 4 mo ago
    Auto-check: notes
  • AI Desk Card Wi-Fi Setup

    op7418/ai-desk-card

    Walks a user through putting an AI Desk Card e-ink device on home Wi-Fi so frames arrive in about 0.2 seconds instead of the 32 seconds USB takes.

    151 GitHub stars~680 tokensUpdated 4 mo ago
    Auto-check: notes

Works with

Questions about AI Desk Card

What does AI Desk Card do?

Drives an M5Paper e-ink desk display from an agent: probes device state, guides first-time setup, and pushes widgets such as calendar, todos and weather. A small e-ink panel next to your monitor shows glanceable widgets that an agent pushes to it. A local daemon renders each frame on the computer and sends pixels to the device over Wi-Fi, USB or BLE.

When should I use AI Desk Card?

AI Desk Card fits situations like: setting up an M5Paper e-ink card for the first time, including firmware and Wi-Fi; pushing a calendar, todo list or PR queue to the desk display; scheduling the card to refresh during working hours; troubleshooting a card that does not respond, or putting it to sleep.

How do I install AI Desk Card in Claude Code?

Run `npx skills add op7418/ai-desk-card --skill ai-desk-card -a claude-code`. Or copy the skill folder (the op7418/ai-desk-card repository) into .claude/skills/ai-desk-card in your project. Claude Code loads it when a task matches its description.

How do I install AI Desk Card in Codex?

Run `npx skills add op7418/ai-desk-card --skill ai-desk-card -a codex`. Or copy the skill folder (the op7418/ai-desk-card repository) into .agents/skills/ai-desk-card in your project. Codex loads it when a task matches its description.

Can I use AI Desk Card in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add op7418/ai-desk-card --skill ai-desk-card -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ai-desk-card, .gemini/skills/ai-desk-card, .github/skills/ai-desk-card and .opencode/skills/ai-desk-card in your project.

What does AI Desk Card need to run?

Going by SKILL.md and its folder, AI Desk Card needs Python for the scripts in its folder and the command-line tools its instructions call (bash, curl and python3). Our summary lists: An M5Paper V1.1 or M5Paper Color device; PlatformIO (pio) to flash firmware; Python 3 to run the daemon; A Wi-Fi network for the device. Its frontmatter pre-approves these tools: Bash, Read, Write, Edit.

Does AI Desk Card access the network?

SKILL.md contains no URLs. Its commands use curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is AI Desk Card safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does AI Desk Card use?

AI Desk Card is published under the GPL-3.0 licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does AI Desk Card use?

About 2k tokens (SKILL.md is roughly 8.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to AI Desk Card?

Skills that share tags, products or a category with AI Desk Card: Implement Next Task (rvdbreemen/OTGW-firmware, 207 stars), RuView CLI, API and WASM (ruvnet/RuView, 97k stars), RuView Hardware Setup (ruvnet/RuView, 97k stars) and Esp32 Firmware Engineer (alxv2016/folloup-sticky, 117 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains AI Desk Card?

op7418 (a GitHub user) maintains it in op7418/ai-desk-card, which has 151 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on May 22, 2026.

Source: op7418/ai-desk-card on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.