roadrunner

Beeper Desktop CLI for chats, messages, search, and reminders.

7 stars

Best use case

roadrunner is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Beeper Desktop CLI for chats, messages, search, and reminders.

Teams using roadrunner should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/roadrunner/SKILL.md --create-dirs "https://raw.githubusercontent.com/Demerzels-lab/elsamultiskillagent/main/public/skills/johntheyoung/roadrunner/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/roadrunner/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How roadrunner Compares

Feature / AgentroadrunnerStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Beeper Desktop CLI for chats, messages, search, and reminders.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 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 `--agent` for safe agent defaults: `rr --agent --enable-commands=chats,messages,status chats list`
- Use `--readonly` to block writes: `rr --readonly chats list --json`
- Use `--enable-commands` to allowlist: `rr --enable-commands=chats,messages chats list --json`
- Use `--envelope` for structured errors: `rr --json --envelope chats get "!chatid"`

Setup (once)
- `rr auth set <token>`
- `rr auth status --check`
- `rr 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 `in_groups` for participant matches.

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`. `BEEPER_TOKEN` overrides.
- `BEEPER_ACCOUNT` sets the default account ID (aliases supported).
- Message search is literal word match (not semantic).
- `rr contacts resolve` is strict and fails on ambiguous names; resolve by ID after `contacts search` when needed.
- If a DM title shows your own Matrix ID, use `--scope=participants` to find by name.
- JSON output includes `display_name` for single chats (derived from participants).
- Message JSON includes `is_sender`, `is_unread`, `attachments`, and `reactions`.
- `downloaded_attachments` is only populated when `--download-media` is used.
- `rr messages send` returns `pending_message_id` (temporary ID).
- Prefer `--json` (and `--no-input`) for automation.
- `BEEPER_URL` overrides API base URL; `BEEPER_TIMEOUT` sets timeout in seconds.
- JSON/Plain output goes to stdout; errors/hints go to stderr.
- Destructive commands prompt unless `--force`; `--no-input`/`BEEPER_NO_INPUT` fails without `--force`.
- Use `--fail-if-empty` on list/search commands to exit with code 1 if no results.
- Use `--fields` with `--plain` to select columns (comma-separated).
- In bash/zsh, `!` triggers history expansion. Prefer single quotes, or disable history expansion (`set +H` in bash, `setopt NO_HIST_EXPAND` in zsh).
- `rr version --json` returns `features` array for capability discovery.
- `rr capabilities --json` returns full CLI capability metadata.
- Envelope error codes: `AUTH_ERROR`, `NOT_FOUND`, `VALIDATION_ERROR`, `CONNECTION_ERROR`, `INTERNAL_ERROR`.

Related Skills

paylock

7
from Demerzels-lab/elsamultiskillagent

Non-custodial SOL escrow for AI agent deals.

agent-reputation

7
from Demerzels-lab/elsamultiskillagent

summary: Cross-platform AI agent reputation checker with trust scoring and PayLock escrow recommendations.

Telecom Agent Skill

7
from Demerzels-lab/elsamultiskillagent

Turn your AI Agent into a Telecom Operator. Bulk calling, ChatOps, and Field Monitoring.

OpenClaw-Finnhub

7
from Demerzels-lab/elsamultiskillagent

OpenClaw skill for real-time stock quote, and financials via Finnhub API.

```markdown

7
from Demerzels-lab/elsamultiskillagent

# OpenClaw-Last.fm

security-operator

7
from Demerzels-lab/elsamultiskillagent

Runtime security guardrails for OpenClaw agents.

operator-humanizer

7
from Demerzels-lab/elsamultiskillagent

Transform AI-generated text into authentic human writing.

kit-email-operator

7
from Demerzels-lab/elsamultiskillagent

**AI-powered email marketing for Kit (ConvertKit)**.

agora

7
from Demerzels-lab/elsamultiskillagent

Trade prediction markets on Agora — the prediction market exclusively for AI agents. Register, browse markets, trade YES/NO, create markets, earn reputation via Brier scores.

surf-check

7
from Demerzels-lab/elsamultiskillagent

Surf forecast decision engine.

jinko-flight-search

7
from Demerzels-lab/elsamultiskillagent

Search flights and discover travel destinations using the Jinko MCP server. Provides two core capabilities: (1) Destination discovery — find where to travel based on criteria like budget, climate, or activities when the user has no specific destination in mind, and (2) Specific flight search — compare flights between two known cities/airports with flexible dates, cabin classes, and budget filters. Use this skill when the user wants to: search for flights, find cheap flights, discover travel destinations, compare flight prices, plan a trip, find deals from a specific city, or explore where to go. Triggers on any flight-booking, travel-planning, or destination-discovery request. Requires the Jinko MCP server connected at https://mcp.gojinko.com.

mlx-whisper

7
from Demerzels-lab/elsamultiskillagent

Local speech-to-text with MLX Whisper (Apple Silicon optimized, no API key).