blink-skill
Blink Camera Skill
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Blink Camera Skill
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Read and manage Zergboard cards, boards, and workspaces. Use when the user asks to check Zergboard, view cards, find tasks, check sprint/cycle status, manage work items, invite guests, or interact with their Zergboard boards from the CLI.
Order food on DoorDash for the Beck family using the DoorDash CLI (dd-cli), composing a balanced order that covers everyone's tastes and is age-appropriate for the kids, then placing it only after Idan approves the exact items, total cost, tip, card, and ETA. Use when Idan wants to order dinner/food for the family, wants a DoorDash recommendation, or says "order us food." Reads Personal/Family Food Profile.md for tastes, allergies, and rules.
Talk to Claude by voice. Records the mic, transcribes with ElevenLabs Scribe (hosted STT, no local Whisper), sends the text to Claude via the local `claude` CLI, and speaks the reply back with ElevenLabs TTS. Use when the user wants a spoken/voice conversation, voice input, or to dictate to Claude.
Create, edit, publish, schedule, and manage Substack posts. Use when the user asks to draft or publish a Substack post, list/edit their Substack drafts, schedule a post, or upload images to Substack. Supports multiple accounts/publications.
Generate audio or video of a specific person (the user) saying arbitrary text. Clones the user's voice with ElevenLabs (Professional Voice Clone) and drives a talking-head video with fal.ai audio-driven avatar models. Use when the user wants to make their voice say something, produce a talking-head video of themselves, or build/manage their voice/face twin.
Send / track / download DocuSign envelopes from the CLI. Anchor-string-based field auto-placement (no manual tab dragging). JWT Grant auth — one-time browser consent, then any number of programmatic sends. Use when the user wants to send a PDF for signature, check envelope status, list recent envelopes, or bulk-send to multiple recipients.
| name | blink-skill |
| description | Blink Camera Skill |
Control and monitor Blink cameras via blinkpy (>= 0.25.3): status, snapshots,
cloud motion clips, arm/disarm, and live view. Every command prints a single
JSON document to stdout.
pip3 install -r ~/.claude/skills/blink-skill/requirements.txt
python3 ~/.claude/skills/blink-skill/blink_skill.py setup YOUR_EMAIL YOUR_PASSWORD
If 2FA is enabled, the tool prints PIN sent -- enter it: to stderr and
waits for you to type the PIN on stdin in the same process, then finishes
login and saves the refresh token. It must be one process: the OAuth CSRF token
and PKCE verifier are held in memory on the login instance, so a separate step
cannot resume the flow.
Run it in a real terminal (so input() can read the PIN). After success,
credentials.json holds the hardware_id + refresh_token; all later runs
reuse the refresh token and never prompt.
verify (fallback only — flaky)python3 ~/.claude/skills/blink-skill/blink_skill.py verify [PIN]
Prefer setup. verify re-drives login using the username/password saved in
credentials.json; because it triggers a fresh login it also triggers a
new PIN, so a PIN passed on the command line is usually stale. Let it prompt
interactively, or just use setup.
blink_skill.py cameras # every camera, full status
blink_skill.py networks # sync modules + arm state
blink_skill.py status "Front" # one camera (partial match)
blink_skill.py status # all cameras, summary
Status fields (honest — no fabricated percentages):
battery — string "ok" / "low" (Blink does not expose a %).battery_voltage — volts (raw 100ths-of-a-volt converted).temperature_f, temperature_c, wifi_strength, sync_signal_strength.product_type, camera_type, wired (bool), serial, version,
motion_enabled, last_record.armed — read from the sync module (network), not the camera.blink_skill.py snapshot "Front" # CHEAP: cached image, no capture
blink_skill.py snapshot "Front" --refresh # FRESH capture (battery cost)
refresh(force=True) then writes the already-cached
thumbnail. No new capture, no battery hit.--refresh = fresh capture: snap_picture() -> wait 5s -> refresh(force=True)
-> save. On battery cams the result JSON includes
"warn": "fresh capture uses battery".~/.claude/skills/blink-skill/snapshots/.blink_skill.py clips # cloud motion clips
blink_skill.py clips --camera "Front" --limit 10
blink_skill.py clips --since "2026/07/01 00:00:00"
blink_skill.py events # clips + live motion flags
blink_skill.py video "Front" # download last cached clip
clips / events use get_videos_metadata(since, camera="all", stop=pages)
for a real server-side clip list (stop is a page cap ~25 items/page; --limit
is derived into pages and then slices the newest N).--since accepts "YYYY/MM/DD HH:MM:SS"; default is the last refresh time.video writes the last cached clip via camera.video_to_file; if none is
cached it returns {"status": "no_clip"} (use clips for cloud clips).blink_skill.py arm # arm all networks
blink_skill.py arm --network "Home" # arm one network
blink_skill.py disarm
blink_skill.py disarm --network "Home"
Arming is a sync-module operation (sync.async_arm), not per-camera.
blink_skill.py liveview "Front Door" # wired cam, ~30s
blink_skill.py liveview "Front Door" --seconds 60
blink_skill.py liveview "Backyard" --force # battery cam override
--seconds default 30, hard-capped at 300.rtsps:// result: returns the URL + an ffplay_hint. Playable directly for a
short server-side window; this command does not proxy it.immis:// result (proprietary): spins a local TCP relay
(init_livestream -> start -> hold --seconds -> stop) and returns a
local_relay tcp://127.0.0.1:PORT. Marked "fragile": true — it only
serves while the process is alive; connect a player during the window.--force. Live view drains the battery
fast and battery cams share a rough ~98-minute lifetime live-view budget.
With --force the output still carries a loud warn.Default snapshots are cached (free). Only snapshot --refresh and liveview
touch the radio/capture path; on battery cams both warn, and liveview refuses
without --force.
~/.claude/skills/blink-skill/snapshots/.~/.claude/skills/blink-skill/credentials.json (chmod 600).
It contains the OAuth refresh_token + hardware_id and the account
username/password saved by blinkpy's login_attributes round-trip — treat the
file as a secret.setup.setup.setup in an interactive terminal so
the PIN is entered in the same process. verify with a stale PIN will fail.cameras.#blink #cameras #security #smart-home