Real-time team messaging with Claude Code integration.
- GUI Window: Floating always-on-top window for sending/receiving messages
- Claude Code integration: Message
@claudeto delegate AI tasks to your personal Claude - Namespaced agents:
@tex-claude,@gregor-claude- each user has their own Claude - Whitelist control: Choose who can message your Claude (others get auto-reply)
- WebSocket relay: Real-time delivery via
datacore-messaging-relay.datafund.ai - Local storage: Messages saved as org-mode entries for offline access
cd ~/Data/.datacore/modules
git clone https://github.com/datafund/datacore-messaging.git messaging
cd messaging
./install.shThe installer will:
- Install Python dependencies (PyQt6, websockets, pyyaml, aiohttp)
- Create
settings.local.yamlfrom template - Add Claude Code hook to
~/.claude/settings.json
Edit settings.local.yaml:
identity:
name: yourname # Your username (required)
messaging:
default_space: 1-datafund # Space for message inboxes
claude_whitelist: # Who can message @yourname-claude
- gregor
- crt
relay:
secret: "your-team-secret" # Same for all team members
url: "wss://datacore-messaging-relay.datafund.ai/ws"./start.sh
# Or directly:
python3 datacore-msg.pyIn the GUI input field:
@gregor Hey, can you review the PR?- Message a teammate@claude Research competitor pricing- Message your Claude agent@gregor-claude Help with code review- Message someone else's Claude (if whitelisted)@gregor >msg-id Follow-up here- Reply to a message (creates thread)@claude [github:42] Fix this bug- Route response to GitHub issue@claude [file:research/report.md] Analyze this- Route to file@claude [@gregor] Help with code- CC response to another user
Type in the input field:
| Command | Description |
|---|---|
/mine |
Show my unread messages |
/todos |
Show my TODO messages |
/tasks |
Show Claude task queue (working/pending/done) |
/context <id> |
Show thread context for a message |
/online |
Show online users with status |
/status |
Show your current status |
/status <val> |
Set status: online, busy, away, focusing |
/relay |
Show relay connection info |
/clear |
Clear display |
/help |
Show available commands |
Presence Status:
- π’ online - Available
- π΄ busy - Do not disturb
- π‘ away - Stepped away
- π£ focusing - Deep work mode
Clickable messages:
- Click on a message to cycle: unread β todo β done β clear
- Use the checkbox to mark as done
- Messages show status: β unread, β todo, β done
- Always-on-top floating window
- Dark theme
- Real-time message updates
- Online users count
- System notifications (macOS)
@claudeautomatically routes to your personal@yourname-claude
ββ Messages @tex ββββββββββββ β relay ββ
β 2 online β
β β @gregor 14:30 β
β Need OAuth keys - see issue #25 β
β β
β β @tex-claude 14:35 β
β Research complete. See research/ β
β β
β @youβgregor 14:40 β
β Keys are in the vault β
β β
βββββββββββββββββββββββββββββββββββββββββ€
β @gregor message here... β
βββββββββββββββββββββββββββββββββββββββββ€
β Space: 1-datafund β
βββββββββββββββββββββββββββββββββββββββββ
Important: Claude Code doesn't have a persistent connection to the relay. Messages are checked via a hook that runs when you submit a prompt to Claude.
Flow:
- Someone sends
@tex-claude do somethingin GUI - Message is stored in
tex-claude.orgwith:unread:tag - When you next interact with Claude Code, the hook checks the inbox
- Unread messages are shown to Claude and marked as read
- Claude can reply using
send-reply.py
The installer adds a hook that shows new messages when you interact with Claude:
π¬ New messages for @tex-claude:
From @gregor (14:30):
Can you help debug the auth flow?
[msg-id: msg-20251212-143000-gregor]
---
To reply: use hooks/send-reply.py <user> <message>
Messages above are now marked as read.
After displaying, messages are marked as read (:unread: tag removed from org file).
# Claude can reply via the send-reply script
python3 hooks/send-reply.py gregor "Fixed! Check the PR."
# Reply to a specific message (creates thread)
python3 hooks/send-reply.py --reply-to msg-20251212-143000-gregor gregor "Here's the follow-up"
# Mark task as complete and reply (updates TASK_STATUS to done)
python3 hooks/send-reply.py --complete msg-20251212-143000-gregor gregor "Task complete! See results."Task Status Tracking:
- When Claude reads a message, it's marked as
TASK_STATUS: working - Using
--completemarks the original task asTASK_STATUS: done - Use
/tasksin GUI to see task queue status
Rate Limiting:
- Claude processes one task at a time (FIFO queue)
- High priority tasks jump the queue
- If Claude is already working on a task, new tasks stay queued
- Complete current task before next one is loaded
Response Routing:
github:123- Post to GitHub issue #123 (requiresghCLI)file:path/to.md- Append to file (relative to space)@user- CC to another user
The reply is:
- Saved to the recipient's inbox (
gregor.org) - Sent via relay for real-time delivery (if connected)
# Mark a message as TODO
python3 hooks/mark-message.py 151230 todo
# Mark as done
python3 hooks/mark-message.py 151230 done
# Mark as read (clear status)
python3 hooks/mark-message.py 151230 readThe ID is shown in the hook output [msg-id: msg-20251212-151230-tex] - use any unique part.
- You type
@gregor helloin GUI - Message saved to
~/Data/1-datafund/org/inboxes/gregor.org - Message sent via WebSocket relay (if online)
- Gregor's GUI shows notification instantly
@claude do thisβ routes to@yourname-claude- Each user's Claude is separate
- Whitelist controls who can message your Claude
- Non-whitelisted users get: "Auto-reply: @tex-claude is not accepting messages from @bob"
* MESSAGE [2025-12-12 Fri 14:30] :unread:
:PROPERTIES:
:ID: msg-20251212-143000-gregor
:FROM: gregor
:TO: tex
:THREAD: thread-msg-20251212-142500-tex
:REPLY_TO: msg-20251212-142500-tex
:END:
Can you review PR #24?
Threading properties:
THREAD- Thread ID (shared by all messages in conversation)REPLY_TO- Parent message ID (direct reply target)
The relay enables real-time messaging between team members.
Default relay: wss://datacore-messaging-relay.datafund.ai/ws
See relay/README.md for Docker deployment instructions.
cd relay/
echo "RELAY_SECRET=your-secret" > .env
docker-compose up -d --builddatacore-msg.py # Unified GUI app
install.sh # Interactive installer
settings.local.yaml # Your settings (gitignored)
hooks/
βββ inbox-watcher.py # Claude Code hook
βββ send-reply.py # Reply helper for Claude
relay/
βββ Dockerfile
βββ docker-compose.yml
βββ datacore-msg-relay.py
βββ README.md
lib/
βββ datacore-msg-relay.py # Relay server
βββ datacore-msg-window.py # Legacy GUI (PyQt6)
- Python 3.8+
- PyQt6:
pip install PyQt6 - websockets:
pip install websockets - pyyaml:
pip install pyyaml
MIT