Why Skip: Every lead bot requires enterprise console app creation + version publish approval.
Verdict: Higher bot admin friction than Slack with no killer advantage for lead chat.
✕ Disqualified
Telegram · Teams · Element X3.8 / 10
Telegram: Bot API hard-blocks bots from seeing other bots' messages in groups/topics.
MS Teams: 1-level reply chains only + heavy Azure Bot / Entra tenant overhead.
Element X: Weak mobile thread UX + E2EE Megolm key-sharing fragility.
ZULIP "≤10 USERS" FACT CHECK
What it limits: Self-hosted Zulip has no user limit on the server, web/desktop apps, or API. The "10 users" rule applies only to free access to Zulip's hosted Mobile Push Notification Service (push.zulipchat.com) for iOS/Android APNs/FCM relay. How it is counted (verified in zulip/zulipzerver/lib/user_counts.py & zilencer/models.py): Zulip counts only active human users (is_bot=False, is_active=True) via RealmAuditLog.ROLE_COUNT_HUMANS. Bot accounts (is_bot=True) do NOT count toward the 10-user limit. Your setup (1 human + N lead bots) counts as 1 user.
1. Unified Room & Thread Routing (Human ↔ Lead Agents Only)Each lead's internal runtime stays behind its own boundary
Mode A — Room Broadcast: Untagged message from Charles wakes all 4 lead agents; leads with nothing to add return [SILENT] so only relevant leads reply.Zero subagent noise in chat
2. Multi-Axis Surface Comparison (Slack vs. Zulip vs. Mattermost + Others)Click any row to inspect details & overlay on the Radar Chart
6-Axis Chat Surface Radar
Slack (Green) vs. Zulip (Cyan) vs. Selected Row (Amber)
3. Zulip vs. Mattermost vs. Slack Architecture (Mermaid)
A. Threading Model: Slack/Mattermost CRT vs. Zulip Topics
Why Zulip and Mattermost are fundamentally different self-hosted choices
flowchart TD
subgraph SM["Slack & Mattermost: Optional Reply Threads (CRT)"]
C1["#general channel timeline"] --> M1["Top-level msg A (thread_ts / root_id)"]
C1 --> M2["Unthreaded chatter mixes in main view"]
M1 --> R1["Drawer reply from @dot"]
M1 --> R2["Drawer reply from @ghost"]
end
subgraph ZU["Zulip: Mandatory Topic Lanes"]
S1["#ops stream"] --> T1["Topic: deploy-netcup"]
S1 --> T2["Topic: gym-export"]
T1 --> Z1["@nebula + @ghost + Charles"]
T2 --> Z2["Isolated lane (0 main-feed bleed)"]
end
style SM fill:#0f172a,stroke:#38bdf8,color:#f8fafc
style ZU fill:#0f172a,stroke:#22d3ee,color:#f8fafc
B. Surface Selection Decision Tree
Evaluating Native Mobile + Lead-to-Lead Wakes + iOS Push Architecture
flowchart TD
A[Hard Requirements: Native iOS + Threads + Multi-Lead Bots] --> B{Can Lead Bot A wake Lead Bot B?}
B -- "No: Bot API blocks bot->bot" --> TG[Telegram: DISQUALIFIED]
B -- Yes --> C{Managed Cloud or Self-Hosted on netcup?}
C -- Managed Cloud --> D{Bot Setup Friction}
D -- "Socket Mode (low friction)" --> SL[SLACK: #1 Managed Pick]
D -- "Console App + Release Review per Bot" --> LK[Lark / Feishu: High Ceremony]
C -- Self-Hosted on netcup --> E{iOS Push & Thread Model}
E -- "Free E2EE Push (<=10 humans) + Mandatory Topic Lanes" --> ZU[ZULIP: #1 Self-Hosted Pick]
E -- "Slack-clone CRT Drawer (Free TPNS Push = Test-Only)" --> MM[MATTERMOST: #2 Self-Hosted Pick]
style TG fill:#4c0519,stroke:#fb7185,color:#fff
style LK fill:#451a03,stroke:#fbbf24,color:#fff
style SL fill:#064e3b,stroke:#34d399,color:#fff
style ZU fill:#083344,stroke:#22d3ee,color:#fff
style MM fill:#0c4a6e,stroke:#38bdf8,color:#fff
4. Verified Formatting & Mobile Push Reference
SLACK FORMATTING & PUSH
Adapter-Dependent Rich Formatting
Classic mrkdwn is basic, but Slack's current Block Kit markdown block supports Markdown tables and syntax-highlighted code blocks. Direct Apple APNs push with zero self-hosted relay caveats.
ZULIP FORMATTING & PUSH
Native Tables / KaTeX + Free ≤10-Human Push
Documented native Markdown tables, fenced code blocks, and inline/block KaTeX math. Free E2EE mobile push service covers up to 10 active human users (is_bot=False); unlimited lead bots cost $0 and don't count toward the 10.
MATTERMOST FORMATTING & PUSH
Slack CRT + TPNS Push Tradeoff
Documented Markdown tables, code, and LaTeX (math requires admin enablement). However, free self-hosted iOS push uses Mattermost's test-only TPNS proxy (no SLA, cleartext sent to proxy) unless you pay or self-sign the iOS app.
UNVERIFIED ACROSS ALL THREE
Native Mermaid & Phone Parity
Native Mermaid diagram rendering inside chat messages and exact iOS-vs-desktop rendering parity remain unverified until tested on your phone; agents can render diagrams to PNG/HTML links when needed.