iMessage processing pipeline — auto-classifies texts, saves memories, handles reminders/calendar events, monitors chat responses, detects tapback reactions, and handles group chat join requests.
Install
npx skillscat add evansking/openclaw-shared/text-processor Install via the SkillsCat registry.
Text Processor & iMessage Pipeline
Automated processing of incoming iMessages using local LLM (DeepSeek) with Claude verification.
How It Works
- Polls incoming messages via
imsgCLI - Classifies each message through DeepSeek-R1:8b locally via Ollama
- Verifies with Claude (via OpenClaw) before taking action
- Takes action: saves memory, sends reminder/calendar confirmation, or ignores
Script: text-processor
Logs: ~/.openclaw/logs/text-processor.log
Classifications
Each message is classified as: memory, calendar, reminder, or none.
Memory actions
Saves facts about people to markdown files organized by person. Each saved fact includes a source hash linking back to the original message for traceability.
Categories: family, work, health, preference, life_event, relationship, contact_info, address, birthday, pet.
Calendar actions
Detects events the user will attend — sends a confirmation text asking to add to calendar.
Reminder actions
- Sends a confirmation text asking if user wants to set a reminder
- User can reply: "yes", "no", or "yes but at [different time]"
- The OpenClaw agent handles the response and creates the reminder via cron
Chat Watcher
When the assistant sends a message from the user's account (via theo-send), replies from that chat get forwarded to the main agent session for 1 hour (refreshed on each new message).
Active watchers are stored in the watched_chats_file path from config. Expired entries auto-clean.
Group Chat Join Detection
When the assistant's name is mentioned in an unwatched group chat:
- DeepSeek classifies whether the message is directed at the assistant
- Claude verifies and composes a notification
- The owner gets a DM asking if the assistant should join the conversation
- If approved, the assistant reads context and responds, auto-registering the chat for continued watching
Pending join requests are tracked and have a 1-hour cooldown per chat.
Configuration
All settings live in ~/.config/text-processor/config.json:
{
"my_number": "+1XXXXXXXXXX",
"bot_identifiers": ["your-bot@email.com"],
"contacts_file": "~/contacts.txt",
"memory_dir": "~/memory/friends",
"prompt_file": "~/.config/text-processor/classifier-prompt.txt",
"watched_chats_file": "~/.config/text-processor/watched-chats.json",
"decisions_file": "~/.openclaw/text-processor-decisions.json",
"state_file": "~/.openclaw/text-processor-state.json",
"sources_file": "~/memory/sources.jsonl",
"pending_joins_file": "~/.config/text-processor/pending-group-joins.json",
"signature": "- Assistant",
"assistant_name": "assistant",
"channel": "imessage",
"send_script": "theo-send",
"ssh_target": "user@localhost",
"imsg_path": "/opt/homebrew/bin/imsg"
}Service Management
# Start as service (create your own plist)
launchctl load ~/Library/LaunchAgents/text-processor.plist
# View logs
tail -f ~/.openclaw/logs/text-processor.log
# Start manually
text-processorFriends Memory Structure
Each friend has a folder in the configured memory_dir:
Two types of files:
index.md— Core/permanent facts (always true)- Family info, work/career, preferences, contact info, birthdays, pets
YYYY-MM.md(e.g.,2026-01.md) — Monthly updates (time-sensitive)- Life events, health updates, relationship changes, recent news
Source Tracking
Each saved memory fact gets a source hash. The sources.jsonl file links every fact back to the original message, sender, and chat for auditability.
theo-send
Send messages as the assistant with automatic chat watching:
theo-send --chat-id 5 --text "Your message here"This:
- Appends the configured signature (skips if already present)
- Sends via
imsg - Registers the chat for reply forwarding (1 hour)