Awesome-openclaw-skills roadrunner
Beeper Desktop CLI for chats, messages, search, and reminders.
install
source · Clone the upstream repo
git clone https://github.com/sundial-org/awesome-openclaw-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sundial-org/awesome-openclaw-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/roadrunner" ~/.claude/skills/sundial-org-awesome-openclaw-skills-roadrunner && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sundial-org/awesome-openclaw-skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/roadrunner" ~/.openclaw/skills/sundial-org-awesome-openclaw-skills-roadrunner && rm -rf "$T"
manifest:
skills/roadrunner/SKILL.mdsource content
roadrunner (rr)
Use
rr when the user explicitly wants to operate Beeper Desktop via the local API (send, search, list chats/messages, reminders, focus).
Prefer --agent for agent use (forces JSON, envelope, no-input, readonly).
Safety
- Require explicit recipient (chat ID) and message text before sending.
- Confirm or ask a clarifying question if the chat ID is ambiguous.
- Use
for safe agent defaults:--agentrr --agent --enable-commands=chats,messages,status chats list - Use
to block writes:--readonlyrr --readonly chats list --json - Use
to allowlist:--enable-commandsrr --enable-commands=chats,messages chats list --json - Use
for structured errors:--enveloperr --json --envelope chats get "!chatid"
Setup (once)
rr auth set <token>rr auth status --checkrr doctor
Common commands
- List accounts:
rr accounts list --json - Capabilities:
rr capabilities --json - Search contacts:
rr contacts search "<account-id>" "Alice" --json - Search contacts (flag):
rr contacts search "Alice" --account-id="<account-id>" --json - Resolve contact:
rr contacts resolve "<account-id>" "Alice" --json - Resolve contact (flag):
rr contacts resolve "Alice" --account-id="<account-id>" --json - List chats:
rr chats list --json - Search chats:
rr chats search "John" --json - Search chats (filters):
rr chats search --inbox=primary --unread-only --json - Search chats (activity):
rr chats search --last-activity-after="2024-07-01T00:00:00Z" --json - Search by participant name:
rr chats search "Jamie" --scope=participants --json - Resolve chat:
rr chats resolve "Jamie" --json - Get chat:
rr chats get "!chatid:beeper.com" --json - Create chat (single):
rr chats create "<account-id>" --participant "<user-id>" - Create chat (group):
rr chats create "<account-id>" --participant "<user-a>" --participant "<user-b>" --type group --title "Project Chat" --message "Welcome!" - Default account for commands:
rr --account="imessage:+123" chats list --json - Account aliases:
rr accounts alias set work "slack:T123" - List messages:
rr messages list "!chatid:beeper.com" --json - List messages (download media):
rr messages list "!chatid:beeper.com" --download-media --download-dir ./media --json - Search messages:
rr messages search "dinner" --json - Search messages (filters):
rr messages search --sender=me --date-after="2024-07-01T00:00:00Z" --media-types=image --json - Send message:
rr messages send "!chatid:beeper.com" "Hello!" - Reply to message:
rr messages send "!chatid:beeper.com" "Thanks!" --reply-to "<message-id>" - Send message from file:
rr messages send "!chatid:beeper.com" --text-file ./message.txt - Send message from stdin:
cat message.txt | rr messages send "!chatid:beeper.com" --stdin - Tail messages (polling):
rr messages tail "!chatid:beeper.com" --interval 2s --stop-after 30s --json - Wait for message:
rr messages wait --chat-id="!chatid:beeper.com" --contains "deploy" --wait-timeout 2m --json - Message context:
rr messages context "!chatid:beeper.com" "<sortKey>" --before 5 --after 2 --json - Draft message (pre-fill without sending):
rr focus --chat-id="!chatid:beeper.com" --draft-text="Hello!" - Draft message from file:
rr focus --chat-id="!chatid:beeper.com" --draft-text-file ./draft.txt - Draft with attachment:
rr focus --chat-id="!chatid:beeper.com" --draft-attachment="/path/to/file.jpg" - Download attachment:
rr assets download "mxc://example.org/abc123" --dest "./attachment.jpg" - Reminders:
/rr reminders set "!chatid:beeper.com" "2h"rr reminders clear "!chatid:beeper.com" - Archive chat:
/rr chats archive "!chatid:beeper.com"rr chats archive "!chatid:beeper.com" --unarchive - Focus app:
rr focus - Global search:
rr search "dinner" --json - Status summary:
rr status --json - Status by account:
rr status --by-account --json - Unread rollup:
rr unread --json - Global search includes
for participant matches.in_groups
Pagination
- Chats:
rr chats list --cursor="<oldestCursor>" --direction=before --json - Messages list:
rr messages list "!chatid:beeper.com" --cursor="<sortKey>" --direction=before --json - Messages search (max 20):
rr messages search "project" --limit=20 --json - Messages search page:
rr messages search "project" --cursor="<cursor>" --direction=before --json - Global search message paging (max 20):
rr search "dinner" --messages-limit=20 --json - Global search message page:
rr search "dinner" --messages-cursor="<cursor>" --messages-direction=before --json
Notes
- Requires Beeper Desktop running; token from app settings.
- Token stored at
.~/.config/beeper/config.json
overrides.BEEPER_TOKEN
sets the default account ID (aliases supported).BEEPER_ACCOUNT- Message search is literal word match (not semantic).
is strict and fails on ambiguous names; resolve by ID afterrr contacts resolve
when needed.contacts search- If a DM title shows your own Matrix ID, use
to find by name.--scope=participants - JSON output includes
for single chats (derived from participants).display_name - Message JSON includes
,is_sender
,is_unread
, andattachments
.reactions
is only populated whendownloaded_attachments
is used.--download-media
returnsrr messages send
(temporary ID).pending_message_id- Prefer
(and--json
) for automation.--no-input
overrides API base URL;BEEPER_URL
sets timeout in seconds.BEEPER_TIMEOUT- JSON/Plain output goes to stdout; errors/hints go to stderr.
- Destructive commands prompt unless
;--force
/--no-input
fails withoutBEEPER_NO_INPUT
.--force - Use
on list/search commands to exit with code 1 if no results.--fail-if-empty - Use
with--fields
to select columns (comma-separated).--plain - In bash/zsh,
triggers history expansion. Prefer single quotes, or disable history expansion (!
in bash,set +H
in zsh).setopt NO_HIST_EXPAND
returnsrr version --json
array for capability discovery.features
returns full CLI capability metadata.rr capabilities --json- Envelope error codes:
,AUTH_ERROR
,NOT_FOUND
,VALIDATION_ERROR
,CONNECTION_ERROR
.INTERNAL_ERROR