MorselHub

MorselHub

Your AI Message Hub

Connect iMessage, RetroCode, and webhooks to Claude AI. Messages push instantly via Channels. Replies route back to the source. Every morsel counts.

Download for macOS

v1.1.0 · macOS 12+ (Apple Silicon) · Free · Signed & Notarized

MorselHub main screen
RetroCode
Works with RetroCode
Write 8-bit assembly. Program in BASIC. Code in 25 languages. Enable the MorselHub connector in RetroCode and your coding sessions flow through MorselHub to Claude — alongside iMessage and webhooks.
Download RetroCode Learn More

See It In Action

Send an iMessage from your phone. Claude writes BASIC code in RetroCode and renders 8-bit graphics — all automatically.

MorselHub main screen with messages feed, dashboard, and leaderboard

MorselHub v1.1.0 — messages, dashboard, and leaderboard

RetroCode BASIC mode with frog in GFX display and MorselHub chat

Ask Claude to draw a frog via MorselHub — BASIC code + 8-bit graphics

Claude Code terminal calling MCP tools

Claude Code calling RetroCode MCP tools to draw the frog

Phone → iMessage → MorselHub → Claude → RetroCode editor + GFX display. Every morsel counts.

Claude answering Super Mario Bros question via iMessage

Ask Claude anything via iMessage — "How many Super Mario Bros games are there?" → instant detailed reply

MorselHub + RetroCode

RetroCode supports multiple programming modes — all controllable by Claude through MorselHub's MCP bridge.

RetroCode Assembly mode with MorselHub chat

Assembly mode — write 6502-style code with AI assistance

RetroCode Python mode running a system dialog

Python mode — Claude wrote and ran a native macOS dialog

What's New in v1.1.0

Major upgrade to iMessage parsing, security, attachments, and the settings UI.

📝 Proper iMessage Text Parser

Ported from Anthropic's official iMessage plugin. Handles attributed strings, tapbacks, URLs, and edge cases correctly.

🛡️ AppleScript Injection Fix

Switched to argv-based AppleScript execution. User-controlled text never enters the script source. SMS messages are filtered out automatically.

💬 Chat Conversation Threading

Messages now carry chat GUIDs. Claude can reply to a specific conversation thread using chat_guid in morselhub_reply.

🖼️ Image Attachment Support

Receive image attachments from iMessage contacts. Claude can also send files and images back via the new /api/send-imessage-file endpoint.

✍️ Configurable Reply Signatures

Replies include "Sent by Claude" by default. Customize or disable the signature in Settings.

📏 Smart Text Chunking

Long replies are automatically split into properly sized iMessage chunks so nothing gets truncated.

📎 Claude Sends Files

Claude can send files and images back to contacts via iMessage using the files parameter in morselhub_reply.

⚙️ Simplified Settings UI

Redesigned settings with 4 clean tabs. Easier to configure contacts, keywords, signatures, and connections.

Why MorselHub?

Senzall loves working with Agentic AI so much he wanted a way to talk to it anytime — using retro tools and modern gadgets alike. Ever since that first TRS-80 in the 1980s and learning Assembly, Pascal, and many other languages over the years, Senzall has been sharing his love of all things tech with friends, family, and strangers.

MorselHub is a growing set of connectors you can use with Claude — and soon other AI platforms — to have safe and exciting interactions. Every morsel of a message, every small bit of an idea, gets delivered to your AI assistant instantly. Every morsel counts.

How It Works

MorselHub Architecture

Messages arrive from any source. MorselHub displays them in a live feed, pushes actionable ones to Claude via the MCP Channel protocol, and routes Claude's replies back to the original sender — including iMessage replies via AppleScript.

Features

💬 iMessage Bridge

Listen for messages with a keyword trigger from approved contacts. Replies go back as iMessages automatically. Supports image attachments, reply signatures, and SMS filtering.

🔧 RetroCode Connector

Bridge to RetroCode's chat panel. Code in Assembly or BASIC while chatting with Claude.

🔗 Webhook Receiver

POST to /api/message from any app — CI pipelines, monitoring alerts, custom integrations.

⚡ Instant Push

Messages push to Claude instantly via MCP Channels using the official @modelcontextprotocol/sdk.

🛡️ Security First

Strict contact allowlist. Blocked senders never reach Claude. Master contact alerts. Prompt injection protection. Argv-based AppleScript (no injection). SMS filtering.

📊 Dashboard

Stats grid, contact leaderboard, activity log (last 100 entries persisted to JSON).

🎨 6 Themes

Default, Dark, Standard, Light, RPG, and High Contrast — same themes as RetroCode.

🔔 Master Alerts

Designate a master contact who receives iMessage alerts when blocked senders try or non-master contacts message Claude.

Connection Details

💬 iMessage Connection

iMessage Flow

Requires Full Disk Access permission. Only approved contacts with the keyword trigger Claude. Blocked senders are logged but never forwarded.

🔧 RetroCode Connection

RetroCode Flow

Claude has both MorselHub tools AND RetroCode's 23 MCP tools. It can write code, run programs, manage files, and control the terminal — all from a chat message.

🔗 Webhook Connection

Webhook Flow

Works with any system that can send an HTTP POST — CI pipelines, monitoring tools, Slack, Teams, Discord, or your own apps.

Webhook Guide

Webhooks let any application send messages to Claude through MorselHub. Send a POST request, Claude processes it, and optionally sends the reply back to your callback URL.

How It Works

  1. Your app sends a POST to http://localhost:21590/api/message
  2. MorselHub adds it to the message feed and writes to push.jsonl
  3. The MCP server detects the new message and pushes it to Claude
  4. Claude processes the message and calls morselhub_reply
  5. If you included a callback URL, MorselHub POSTs Claude's reply back to your app

Message Format

POST a JSON body to /api/message with these fields:

sourcerequiredSet to "webhook" so MorselHub knows the origin senderrequiredName of your app or service (shown in the feed) textrequiredThe message for Claude reply_tooptionalSet to "webhook:https://your-app.com/callback" to receive Claude's reply

Example: Basic Message (No Reply)

Send a message to Claude. The response appears in MorselHub's feed but isn't sent back to your app.

curl -X POST http://localhost:21590/api/message \
  -H "Content-Type: application/json" \
  -d '{"source":"webhook","sender":"My App","text":"Hello Claude!"}'

Example: With Callback URL

Include reply_to with your callback URL. Claude's reply is POSTed back as {"text":"..."}.

curl -X POST http://localhost:21590/api/message \
  -H "Content-Type: application/json" \
  -d '{"source":"webhook","sender":"Deploy Bot",\
       "text":"Build failed on main. Here are the errors: ...",\
       "reply_to":"webhook:https://my-app.com/claude-callback"}'

Callback Response Format

When Claude replies, MorselHub POSTs to your callback URL:

POST https://your-app.com/callback
Content-Type: application/json

{"text":"Claude's response here..."}

Use Cases

CI/CD Alerts

Send build failures to Claude for analysis. "Build failed with error X — what's wrong and how do I fix it?"

Monitoring

Forward server alerts to Claude. "CPU at 95% on prod-web-3. What should I check?" Get intelligent triage suggestions.

Slack / Teams / Discord

Set up an outgoing webhook in your chat platform that POSTs to MorselHub. Claude responds via the callback URL back into your channel.

Custom Apps

Any app that can make HTTP requests can talk to Claude through MorselHub. Add AI to your internal tools with a single POST.

Exposing Webhooks to the Internet

MorselHub's API runs on localhost. To receive webhooks from external services, use a tunnel:

# Cloudflare Tunnel (free, no account needed)
cloudflared tunnel --url http://localhost:21590

# ngrok
ngrok http 21590

This gives you a public URL like https://abc123.trycloudflare.com. Use it as your webhook endpoint: https://abc123.trycloudflare.com/api/message

Security note: Exposing MorselHub to the internet means anyone with the URL can send messages to Claude. Consider adding authentication in your tunnel or app, and monitor the MorselHub feed for unexpected messages.

Example: GitHub Webhooks

GitHub can't POST directly to MorselHub's format, but a small middleware can bridge them. Here's a complete setup:

Step 1: Start a tunnel

cloudflared tunnel --url http://localhost:3001

Step 2: Run a small bridge script

Save as github-bridge.mjs and run with node github-bridge.mjs:

import http from 'http';

http.createServer((req, res) => {
  let body = '';
  req.on('data', c => body += c);
  req.on('end', () => {
    const event = req.headers['x-github-event'];
    const payload = JSON.parse(body);
    let text = '';

    if (event === 'push') {
      const commits = payload.commits?.map(c => c.message).join(', ');
      text = `Push to ${payload.ref}: ${commits}`;
    } else if (event === 'issues') {
      text = `Issue ${payload.action}: "${payload.issue.title}"`;
    } else if (event === 'pull_request') {
      text = `PR ${payload.action}: "${payload.pull_request.title}"`;
    } else {
      text = `GitHub ${event}: ${JSON.stringify(payload).slice(0, 200)}`;
    }

    const msg = JSON.stringify({
      source: 'webhook', sender: 'GitHub',
      text, reply_to: 'webhook:'
    });
    const r = http.request('http://localhost:21590/api/message', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' }
    });
    r.write(msg); r.end();
    res.writeHead(200); res.end('ok');
  });
}).listen(3001, () => console.log('GitHub bridge on :3001'));

Step 3: Configure GitHub

  1. Go to your repo → Settings → Webhooks → Add webhook
  2. Payload URL: your tunnel URL (e.g. https://abc123.trycloudflare.com)
  3. Content type: application/json
  4. Select events: Pushes, Pull requests, Issues, or "Send me everything"

Now every push, PR, or issue appears in MorselHub's feed and Claude can analyze it — "Why did this build fail?" or "Review this PR."

Reading the Feed

You can also read all messages (from any source) via the feed endpoint:

curl http://localhost:21590/api/feed | jq

Returns a JSON array of all messages with id, source, sender, text, timestamp, and reply_to.

Tech Stack

Tauri v2

Desktop app framework. Rust backend for performance and security. Vue 3 frontend. Small binary, native menus, system tray.

Rust

HTTP API server (tiny_http), iMessage SQLite reader (rusqlite), PTY terminal, argv-based AppleScript iMessage sender. All on port 21590.

Vue 3 + TypeScript

Reactive UI with message feed, source filters, dashboard stats, contact management, setup wizard, 6 themes.

MCP SDK

Official @modelcontextprotocol/sdk for Claude Code Channels. StdioServerTransport for subprocess communication.

Push via File Watch

Messages write to ~/.morselhub/push.jsonl. MCP server watches with fs.watchFile() and pushes to Claude instantly. No HTTP polling.

Security

Contact allowlist with exact match. Keyword filtering. Blocked sender logging. Master contact iMessage alerts. Localhost-only API. Argv-based AppleScript execution. SMS filtering.

MCP Tools

MorselHub exposes 5 tools to Claude via the MCP protocol. When used with RetroCode, Claude also gets 23 additional tools for code editing, file management, and terminal control.

morselhub_replyReply to a message. Routes to iMessage (AppleScript), webhook (HTTP POST), or feed. Accepts chat_guid for threading and files for attachments. morselhub_get_feedRead all messages in the feed from all sources. morselhub_send_imessageProactively send an iMessage to any contact. morselhub_get_settingsRead MorselHub configuration — contacts, keywords, ports. morselhub_healthCheck if MorselHub is running and the API is available.

RetroCode Tools (when connected)

retrocode_chatSend a message to RetroCode's chat panel retrocode_set_editorWrite code to the editor (25 languages) retrocode_get_editorRead current editor content + workspace retrocode_runRun the program (ASM/BASIC/terminal) retrocode_terminalSend commands to the embedded terminal retrocode_save_fileSave files to disk + 17 moreTabs, modes, references, file browser, etc.

HTTP API

MorselHub runs a local HTTP API on port 21590. All endpoints are localhost-only.

GET/api/healthHealth check — returns app name and version GET/api/feedGet all messages in the feed POST/api/messagePost a message from any source (webhook entry point) POST/api/send-imessageSend an iMessage via AppleScript POST/api/send-imessage-fileSend a file or image attachment via iMessage GET/api/settingsRead current settings POST/api/heartbeatConnection keepalive

Quick Start

  1. Download and open MorselHub
  2. Grant Full Disk Access for iMessage reading
  3. Configure your iMessage address and approved contacts
  4. Click Install MCP Server in the Sources tab
  5. In Terminal: claude mcp add morselhub node ~/morselhub-mcp-server.mjs
  6. Start Claude: claude --allowedTools "mcp__morselhub__*" --dangerously-load-development-channels server:morselhub
  7. Send yourself an iMessage starting with "Claude:" — it arrives in MorselHub, pushes to Claude, and Claude replies via iMessage

Permissions & Security

Full Disk Access (macOS)

MorselHub reads your iMessage database (~/Library/Messages/chat.db) to detect incoming messages. macOS requires Full Disk Access for this.

  1. Open System Settings > Privacy & Security > Full Disk Access
  2. Click + and add MorselHub.app (from your Applications folder)
  3. Toggle it on
  4. Restart MorselHub

During development, add Terminal.app instead (the dev binary inherits its permissions).

Contact Allowlist

Only messages from people you explicitly approve will ever reach Claude. Unknown senders are blocked and logged. You can designate a master contact to receive iMessage alerts about security events.

⚠️ Important Warnings

Be very careful who you add to your contact list. Anyone on the list can send messages that Claude will act on — including running commands, editing files, and accessing your computer via Claude Code's tools.

Token usage: Every message forwarded to Claude consumes tokens from your Claude subscription. Frequent or large messages will increase your token usage.

Computer access: Claude Code has access to your local files, terminal, and development tools. Messages from approved contacts can trigger Claude to take actions on your machine.

Use at your own risk. MorselHub is provided as-is, without warranty. The developers are not responsible for any actions taken by Claude in response to forwarded messages, any unauthorized access, data loss, or token charges. You are solely responsible for managing your contact list and monitoring Claude's activity.

Resources

Senzall's Clowder of Applications

A clowder is a group of cats. These are ours.

MorselHub

MorselHub

Your AI Message Hub

Connect iMessage, RetroCode, and webhooks to Claude. Messages push instantly via Channels. Replies route back to the source.

Download · Website
RetroCode

RetroCode

1980s Meets AI

Write 8-bit assembly. Program in BASIC. Code in 25 languages. Chat with Claude or GitHub Copilot. Inspired by the TRS-80 and Apple II.

Download · Website