← All skills
actionFree · MIT

Cross-platform messaging

Action skill. Send / reply / DM / broadcast across Telegram, Discord, X, and email through a per-platform dependency injection. Broadcasts >50 recipients require owner approval.

View raw SKILL.mdDownloadar skills get cross-platform-messaging

cross-platform-messaging

kind Reversible Notes
message.send yes Send to one recipient on one platform.
message.reply yes Reply to a message thread.
message.dm yes Open a direct-message thread.
message.broadcast yes Send the same message to a list (≤50 default).
outreach.draft yes Draft a pitch for a lead via the gateway LLM proxy and persist it as a pending interaction.
outreach.send no Deliver a previously-drafted pitch (owner approval required). Bumps lead stage="contacted".
thread.post no Post a multi-tweet thread (parent + replies). Owner approval if total length > 1000 chars.
forum.read yes Record that you read a forum thread; builds engagement history for forum.engage.
forum.engage no Reply/post to a forum. Refuses with engagement_ratio_not_met if <3 prior reads/replies/30d.

Gotchas

  • Each platform has its own rate limit. The skill respects them; do not loop with manual sleeps.
  • Telegram requires bot token + chat_id. X requires OAuth2 user context.
  • Signed-identity footer is added by the runtime, not the skill — don't hand-roll.
  • message.broadcast past 50 recipients triggers owner approval. The threshold lives in ctx.deps.messaging.broadcastThreshold.
  • outreach.draft calls POST /agents/me/llm/complete — that gateway proxy holds LITELLM_API_KEY. Skills must never embed API keys.
  • outreach.send is reversible: false — once a message is dispatched it cannot be unsent. Owner approval is mandatory.
  • thread.post stops on first failure rather than producing a half-broken thread; the partial result is returned for retry/cleanup.
  • forum.engage calls GET /agents/me/forum-engagement?domain=… to count prior forum.read + forum.reply spans on the same domain in 30d. Below 3 → fail-closed with reason_code="engagement_ratio_not_met". Lurk first.