Two real finalists. Everything on "All options" is a side channel or a niche pick.
The working stack is Matrix on Tuwunel: Element X on iPhone, Element Web on the Mac, E2EE human rooms, an invite-only unencrypted #ops room for alerts, and agents through MCP. One app ecosystem, no second chat client. Hosting is a separate ladder ordered biggest to smallest in the Hosting tab; the jurisdiction rule is one line - the CLOUD Act follows the company, not the region.
Tools and MCP: see the Tools & MCP tab. Setup: seven steps in the Setup plan tab. Nothing in this project touches the kaz GitHub repos.
| Mattermost | Matrix | |
|---|---|---|
| Feels like | Slack, exactly. Channels, threads, search. | Close to Slack. Slightly less polished. |
| Mac app | Official, updated last week. | No official one. Use it in the browser, or a third-party app (Nheko). |
| iPhone app | Official, updated last week. | Element X. Genuinely good, built actively. |
| Alerts from CI / Devin / Vercel | Easy. One webhook. | Easy - and you already wrote it (shotgunpicks PR #73). |
| Who can read your messages | Anyone who gets the server disk. Stored readable, like Slack - but on your machine. | Only the two of you. Encrypted rooms - the server itself only holds scrambled text. |
| Vendor risk | They keep moving free features to paid. Fine today, drifting. | No vendor owns it. Nobody can pull features from you. |
| Setup effort | Small. | Small, plus a one-time "verify each other's devices" ritual. |
| Pick it if... | ...app polish on Mac and iPhone matters most, and "our server, readable" is OK. | ..."nobody but us can read it" matters most. The Mac app is the trade-off. |
Matrix is the network, not an app. It works like email: many providers, all compatible.
Session lost for exactly one reason: there is no way for bots or alerts to post into it. No API at all. The apps are nice and it needs zero hosting, so as a second, private, humans-only channel it's a fine pick. As the company chat it fails: no alerts, no search, no export, and the network is run by token stakers with no independent security audit.
Element X (the new iPhone app, rewritten on a modern engine), FluffyChat (every platform, but no official Mac build), Nheko (a proper native Mac app), Cinny (web, pretty, mid-rebuild). Beeper got bought and went closed - skip it.
Three honest picks for a 2-person team on a small EU box.
The box is tiny, so you are not choosing horsepower. You are choosing a jurisdiction and an ops model. The pattern: the biggest clouds are US-owned and reachable by US legal process wherever the region sits; jurisdiction improves as you work down the list. Google Cloud in Europe sits at #3 for exactly that reason - an EU region is a data-residency promise, not a jurisdiction change.
| # | Provider | Jurisdiction | Price/mo | The difference for this box |
|---|---|---|---|---|
| 1 | AWS (Amazon) | US | $3.50-12 (Lightsail) or EC2 | The biggest catalog and the most managed services. CLOUD Act and FISA 702 apply in every region, eu-* included. For one container this is pure overhead. |
| 2 | Microsoft Azure | US | ~$9-13 (B-series) | Same US jurisdiction. The EU Data Boundary is a contract, not a legal shield. |
| 3 | Google Cloud | US | ~$13 + egress | EU regions are real; the jurisdiction is not. Google is a named FISA 702 provider, and the CLOUD Act reaches the company, not the rack. Fails the stated concern and costs the most of the practical options. |
| 4 | Oracle Cloud | US | $0 (Always Free ARM) / ~$10+ | The most generous free tier in the industry (4 ARM cores, 24 GB). Still US-owned, so the free box carries the same warrant exposure. |
| 5 | IBM Cloud / Alibaba Cloud | US / China | varies | Enterprise catalogs; neither jurisdiction helps here, and Alibaba adds Chinese state-access rules. |
| 6 | OVHcloud | France (EU) | ~€4-8 (VPS) | The largest EU-owned cloud. Good anti-DDoS and object storage; support is variable. First row where the CLOUD Act does not reach the provider. |
| 7 | IONOS | Germany (EU) | ~€3-10 | Large EU hoster with S3-compatible storage and a simple console; less developer polish than Hetzner. |
| 8 | Scaleway | France (EU) | ~€3-6 | EU-owned, clean console, object storage. Good cloud-stack feel at small scale. |
| 9 | T-Systems / Open Telekom Cloud | Germany (EU) | enterprise quote | German sovereign cloud, enterprise pricing; overkill for one VM. |
| 10 | Hetzner | Germany / Finland (EU) | ~€4.50-6.50 (CAX11) | The safe default: best price/performance, best docs, ARM images for Tuwunel. A German judge, not a US one, is the legal path. |
| 11 | UpCloud | Finland (EU) | ~$9-10 (2 GB) | Reliable EU alternative; pricier than Hetzner, similar posture. |
| 12 | Netcup / Contabo / Hostinger | Germany / Lithuania (EU) | ~€2.50-8 | Cheapest EU capacity; less polished support and more oversubscription risk. Fine for chat, not for your only backup. |
| 13 | Exoscale | Switzerland (EU-owned parent, A1 Austria) | ~CHF 5-15 | Swiss data centers with a managed-cloud surface (Kubernetes, object storage). The middle path if you want Swiss metal and a console. |
| 14 | Infomaniak | Switzerland (non-EU, non-US) | CHF 2.70 (annual prepay) | The privacy-per-dollar pick: Swiss company, Swiss datacenters, outside both US and EU legal reach. Smallest tier is plenty for Tuwunel. |
| 15 | ungleich | Switzerland | from CHF 2.50 (VM) | Swiss co-op, renewable datacenter, operates Swiss-government Matrix. Hosted Matrix price still needs a five-minute check. |
| 16 | etke.cc (managed Matrix) | Germany / Finland (EU), they run it | ~€12 base, ~€30 with push | Zero ops: they run the server and backups. You hand metadata to a vendor and pay 5-10x - a valid trade only if you never want to SSH. |
| 17 | Njalla / 1984 / FlokiNET | Sweden / Iceland / Iceland-Romania-Finland | €5-15+ | Privacy hosts with crypto payment and no-logging posture. Niche; root-only or thin support. Use only if anonymous payment is part of the threat model. |
Prices approximate and point-in-time (Oct 2026); confirm at purchase. Jurisdiction means whose courts and intelligence services can compel the provider - not where the metal sits. The ladder is ordered by provider size, not by recommendation.
| Stack | Server / self-host | iOS + macOS clients | Bots, webhooks, API |
|---|---|---|---|
| Matrix (Tuwunel) | Tuwunel, matrix.org docs | Element X iOS / Element apps, Element Web (self-hostable), Nheko (native mac) | bot SDK, hookshot (generic webhooks), rust SDK (DIY) |
| Mattermost | releases/ARM tarballs, docs | macOS desktop, iOS mobile (both official, open source) | Incoming/outgoing webhooks, REST API v4 |
| SimpleX | simplex-chat repo (relay) | official iOS + macOS | Bot SDKs (TS/Haskell), no webhooks |
| Managed Matrix | etke.cc, ungleich (CH) | same Element apps | same Matrix API surface |
You wanted tools and MCP, not a chat app that needs a human in the loop. Matrix has all three layers today; none of the agent-side pieces are first-party polish, so treat them as a separate, unencrypted workspace.
| Layer | Tool | What it does / status |
|---|---|---|
| MCP - agents read and post | @sagelabs/matrix-mcp-server | v1.0.2 (Oct 2026). 15 MCP tools: send_message, send_html_message, send_dm, send_reaction, get_room_messages, get_joined_rooms, join/leave room, invite, kick, presence, room/user aliases. Access-token auth, Node 22+, HTTP endpoint. Claims E2EE support - treat that part as experimental. |
| MCP alternative | mjknowles/matrix-mcp-server | 56 stars, active Oct 2026; chat plus room administration. Pick one MCP server, do not run both. |
| Agent bridge (opencode) | ominiverdi/opencode-chat-bridge | 110 stars, Oct 2026; bridges OpenCode, Ferrum and other ACP agents into chat with permission-based security. The closest match to your agent roster. |
| Bot / alerts | matrix-bot-sdk 0.8.x | Dedicated bot account; the pattern shotgunpicks PR #73 already uses. One token, one room. |
| Webhooks | matrix-hookshot 7.5.x | GitHub, Vercel, uptime and Sentry webhooks into a room. No code changes in any repository - configure it on the box. |
| Comparison point | Mattermost MCP (cloud-ru-tech, pvev) | MCP exists for Mattermost too (48 and 44 stars, both active). Tooling is not what separates the two stacks; E2EE and vendor independence are. |
One VM (compute) + Cloudflare DNS + optional S3-compatible object storage (Tuwunel has native S3 support) + nightly age-encrypted backups off the box + one uptime check. That is the whole cloud footprint. You do not need managed Kubernetes, a managed database, or a hyperscaler account to run this for two people.
Deliberately plain. No Matrix documentation reading required. Pick a host from the ladder in the Hosting tab; the steps are identical on Infomaniak or Hetzner.
chat.kaz.markets in Cloudflare. Open only ports 22, 80 and 443./.well-known/matrix/client so Element X finds the server when you type the domain.This project never touches the kaz GitHub repositories - no code, no docs, no alert wiring, no chat references. Alert integration stays in shotgunpicks PR #73 and in webhooks configured on the box. This review site is a personal Cloudflare Pages project, outside GitHub.
Not included: buying the server or deploying it for you. When you pick a host, the deployment can be walked through live - these steps are the runbook.
Assumes the Hetzner CAX11 (ARM, ~$6) or Hostinger KVM1 ($6.49, 4GB) box. The one decision that matters up front: official Docker images are amd64-only, so on ARM you run the ARM64 tarball + systemd, or use Cloudron which ships an arm64 build.
chat.kaz.markets AAAA/A to the box in Cloudflare (you already run the zone), TLS cert issued by Cloudron/Let's Encrypt. Do not expose 8065; Cloudron proxies.kaz-alerts, copy its PAT, create an incoming webhook for ops-alerts. Wire the same helper pattern as shotgunpicks PR #73 - a postMattermostAlert() that POSTs {"text","channel"} to the webhook URL, throttled. Devin/CI get their own bot accounts so you can tell them apart.mattermost-mobile is Apache-2.0 (clean license, unlike Element X's AGPL), iOS 18.0+ supported, server 11.7+. You and Jacob are developers, so the path is real:
com.kaz.markets.chat..node-version / .ruby-version, pod install, set MattermostServerUrl (or leave it prompt-based) and the app display name/icon.APNS_KEY* env vars), so you have the key type on hand. Apple's APNs still sits in the path; that part is inescapable.Honest caveats: a fork you compile is a fork you maintain - every monthly mobile release is now a task, and a signing mistake means silent push loss until someone notices. The store app against your own server gets you 95% of it. And if "we compile everything ourselves" is the actual goal, the same argument favors Element X iOS over anything else on this page, since it's also open source.