letta/creating-letta-code-channels/SKILL.md
Builds and debugs Letta Code channels, including first-party channel adapters and dynamic user channel plugins under ~/.letta/channels. Use when adding Telegram, WhatsApp, Bluesky, Slack, Discord, or custom channel support; testing channel routing, pairing, MessageChannel, runtime dependencies, or channel plugin manifests.
npx skillsauth add letta-ai/skills creating-letta-code-channelsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this when adding or debugging Letta Code channel support.
~/.letta/channels/<id>/) for headless experiments, community plugins, and fast workflow tests.src/channels/<id>/) when the channel needs bespoke Desktop UI, custom account snapshots, Slack/Discord-style auto-routing, rich protocol fields, or migration/compatibility shims.User plugins cannot shadow first-party ids: telegram, slack, and discord are ignored under ~/.letta/channels/. Use ids like telegram-test, whatsapp-community, or custom-chat.
~/letta/letta-code or a worktree.src/channels/README.md on branches with dynamic plugins.~/.letta/channels/<id>/channel.json~/.letta/channels/<id>/plugin.mjs~/.letta/channels/<id>/accounts.jsonmessageActions if agents should reply via MessageChannel.dmPolicy: "pairing" for testing, or allowlist/open for known headless deployments.adapter.onMessage(msg) to route/pairingMessageChannel calls messageActions.handleAction → adapter.sendMessagebun run typecheck, bun run lint, bun run build.Read only what is needed:
references/user-plugins.md — dynamic plugin manifest/account/runtime/headless flow and gotchas.references/first-party-channels.md — first-party channel file cascade and safety checks.references/testing.md — smoke-test checklist and commands.Use the bundled scaffold for a minimal user plugin skeleton. Replace <path-to-this-skill> with this skill directory path:
npx tsx <path-to-this-skill>/scripts/scaffold-user-channel-plugin.ts \
my-channel "My Channel" \
--runtime-package [email protected] \
--runtime-module some-sdk
It creates channel.json, plugin.mjs, and accounts.example.json. Replace the TODO inbound/outbound implementation with the real SDK calls.
MessageChannel silently feels broken if plugin.messageActions is missing. Every plugin that should reply needs describeMessageTool() and handleAction().approve replies.node_modules. Runtime modules should resolve from explicit runtime dirs only.letta channels pair --channel <id> --code <code> --agent <agent-id> --conversation <conversation-id>.pairing.yaml and routing.yaml on the next inbound miss; restart only when adapter/account config itself changed.tools
Test any GUI app or change on a Daytona Windows remote desktop sandbox. Use to launch a GUI program, sync a local project, take a screenshot, record a video, or share a clickable live-desktop link with a teammate. Generic — the only dependency is Daytona. For Linux, use remote-desktop-testing-linux.
tools
Test any GUI app or change on a Daytona Linux (Ubuntu xfce4 + noVNC) remote desktop sandbox. Use to launch a GUI program, sync a local project, take a screenshot, record a video, or share a clickable live-desktop link with a teammate. Generic — the only dependency is Daytona. For Windows, use remote-desktop-testing-windows.
testing
Configures Letta agents' own runtime behavior, including model, context window, system prompt, reasoning, conversation overrides, compaction settings, and compaction prompts. Use when an agent or user asks to self-modify, tune summarization/compaction, change identity/system instructions, adjust model settings, or test conversation-scoped overrides.
development
Sets Letta Desktop and Letta Code agent profile images by writing profile.png into an agent MemFS repository. Use when the user asks to add, change, generate, or fix an agent avatar, profile picture, profile image, or Desktop agent photo.