Surflet

Surflet

A communication channel for LLM-powered software — like Telegram, but your LLM sends pages instead of chat messages.

When your agent runs while you sleep, where does it reach you?

Surflet is a communication channel for LLM-powered software. Any app with an AI/agent step can generate a dynamic, structured page and deliver it to a user with a single SDK call — the same integration pattern you already use to push LLM text into Telegram, Discord, Slack, or email, but the payload is a rich interactive page instead of a chat message, and the surface is purpose-built for it.

Like Telegram, but for AI agents. Pages instead of chat.

The symmetry

Traditional channel (Telegram / Discord / Slack / email):
  app ──► LLM generates text ──► channel SDK ──► user reads chat message

Surflet channel:
  app ──► LLM generates structured payload ──► surflet SDK ──► user opens page

The developer's mental model, SDK ergonomics, and integration pattern are the same. Only the shape of the output changes — text vs. page — and with it the surface the user lands on.

Why this matters now

Async and long-running agents are the fastest-growing segment of the AI world: Claude Code background runs, Cursor background agents, Devin-class systems, overnight n8n/CrewAI workflows, Aider-in-loop. These agents magnify a problem chat was never built for:

  • Chat assumes the user is present. Async agents need delivery to users who aren't looking.
  • Chat threads get noisy and unsearchable across many concurrent agent runs.
  • Chat bubbles can't hold structured output — diffs, dashboards, forms, approvals.
  • Chat has no "this is important, go read it" vs. "this is just an update" distinction.

Surflet fills that gap — an agent channel optimized for the way AI agents actually need to talk to humans in 2026.

2-minute quickstart — Claude Code

The fastest way to feel what Surflet does: wire it into Claude Code so you can read what your coding agent just did on your phone.

# From the Surflet repo root
pnpm install
pnpm --filter @surflet/mcp-server build

# Register with Claude Code
claude mcp add surflet node $(pwd)/packages/@surflet/mcp-server/dist/index.js \
  --env SURFLET_API_URL=http://localhost:3001 \
  --env SURFLET_API_KEY=sk_test_surflet123

Then ask Claude Code in any session:

Use the surflet_publish tool to publish a briefing of what you just did, with a markdown summary of the files you changed.

You get back a hai.surf/... link. Open it on your phone.

See Claude Code Quickstart for the full setup, including the optional post-task hook that fires automatically when Claude Code finishes a turn.

What's in the box

Surflet is not just a renderer — it's the full channel:

  • 25+ block types — text, diff, metrics, charts, forms, tables, galleries, code, logs, timelines, approvals, and more. Compose any shape.
  • 11 delivery adaptershai.surf PWA links, Slack, Email, SMS, Push, Webhook, Jira, voice, etc. Fan out automatically.
  • Multi-step approvals — sequential / parallel / conditional chains with delegation and timeout escalation.
  • Access control — 6 modes: public, one-time, rate-limited, time-boxed, password, authenticated.
  • Action callback — user actions flow back to your agent via HMAC-signed webhooks with exponential retry.
  • Audit & compliance — chained-hash immutable audit log, GDPR crypto-shredding.
  • Streaming updates — progressively append blocks, SSE real-time delivery, automatic "new version" banner.
  • 13-tool MCP server — use Surflet directly from Claude Desktop, Claude Code, Cursor, VS Code Copilot, or any MCP-compatible client.
  • Python / TypeScript SDKs + CLI — for code integrations not using MCP.

Where to go next

Status

Surflet is currently in internal development and testing. The MCP server, hook, and SDKs work, but are installed by building from source until the public npm release. Production hosting at api.surflet.app and hai.surf is live for internal testing. A public launch with the @surflet/mcp-server npm package and an MIT license is planned once internal validation is complete.

Follow along or peek at the source: github.com/surflet/surflet