519 lines
29 KiB
HTML
519 lines
29 KiB
HTML
<!DOCTYPE html>
|
||
<!-- Version: 1.3.0 | Created: 2026-05-05 | Updated: 2026-08-16 -->
|
||
<html lang="en-AU">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>M8Chat Case Study | HELP4BIS</title>
|
||
<meta name="description" content="How I built M8Chat: a self hosted Matrix and Element chat server with Jitsi video conferencing and a Flutter mobile app, all running on private Australian infrastructure. No US big tech required.">
|
||
<meta name="author" content="HELP4BIS">
|
||
<meta name="publisher" content="Dutch Digital Dynamics Pty Ltd">
|
||
<meta name="language" content="en-AU">
|
||
<meta name="geo.region" content="AU-QLD">
|
||
<link rel="canonical" href="https://help4bis.com/work/m8chat-au.html">
|
||
<meta name="robots" content="index, follow">
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:url" content="https://help4bis.com/work/m8chat-au.html">
|
||
<meta property="og:site_name" content="HELP4BIS">
|
||
<meta property="og:title" content="M8Chat Case Study | HELP4BIS">
|
||
<meta property="og:description" content="Self hosted Matrix chat, Jitsi video conferencing and a Flutter mobile app, all running on private Australian servers. No Zoom, no Slack, no data in the US.">
|
||
<meta property="og:image" content="https://help4bis.com/assets/images/port-m8chat.png">
|
||
<meta property="og:locale" content="en_AU">
|
||
<link rel="icon" type="image/jpeg" href="../assets/images/logo-favicon.jpg"> <link rel="stylesheet" href="../assets/css/style.css">
|
||
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "WebPage",
|
||
"@id": "https://help4bis.com/work/m8chat-au.html#webpage",
|
||
"url": "https://help4bis.com/work/m8chat-au.html",
|
||
"name": "M8Chat Case Study, HELP4BIS",
|
||
"description": "Self hosted Matrix chat, Jitsi video conferencing and a Flutter mobile app on private Australian infrastructure.",
|
||
"isPartOf": {"@id": "https://help4bis.com/#website"},
|
||
"breadcrumb": {
|
||
"@type": "BreadcrumbList",
|
||
"itemListElement": [
|
||
{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://help4bis.com/"},
|
||
{"@type": "ListItem", "position": 2, "name": "Our Work", "item": "https://help4bis.com/#portfolio"},
|
||
{"@type": "ListItem", "position": 3, "name": "M8Chat", "item": "https://help4bis.com/work/m8chat-au.html"}
|
||
]
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style>
|
||
.cs-hero {
|
||
background: linear-gradient(160deg, var(--ink) 0%, #0f1a2e 60%, #0a0f1a 100%);
|
||
padding: var(--sp-16) 0 var(--sp-12);
|
||
position: relative; overflow: hidden;
|
||
}
|
||
.cs-hero::before {
|
||
content: ''; position: absolute; top: -30%; right: -15%;
|
||
width: 60%; height: 200%;
|
||
background: radial-gradient(circle, rgba(99,102,241,.07) 0%, transparent 65%);
|
||
pointer-events: none;
|
||
}
|
||
.cs-breadcrumb {
|
||
font-size: 13px; color: rgba(255,255,255,.45);
|
||
margin-bottom: var(--sp-5); display: flex; align-items: center; gap: 8px;
|
||
}
|
||
.cs-breadcrumb a { color: rgba(255,255,255,.45); }
|
||
.cs-breadcrumb a:hover { color: var(--white); }
|
||
.cs-breadcrumb span { color: rgba(255,255,255,.25); }
|
||
.cs-hero h1 { color: var(--white); max-width: 820px; margin-bottom: var(--sp-4); }
|
||
.cs-hero-sub {
|
||
font-size: clamp(16px, 2vw, 20px); color: rgba(255,255,255,.65);
|
||
max-width: 680px; line-height: 1.65; margin-bottom: var(--sp-6);
|
||
}
|
||
.cs-hero-actions { display: flex; gap: 12px; flex-wrap: wrap; }
|
||
.btn-indigo {
|
||
background: linear-gradient(135deg, #6366f1, #4f46e5);
|
||
color: var(--white); border-color: transparent;
|
||
box-shadow: 0 4px 14px rgba(99,102,241,.35);
|
||
}
|
||
.btn-indigo:hover {
|
||
background: linear-gradient(135deg, #4f46e5, #4338ca);
|
||
color: var(--white); transform: translateY(-2px);
|
||
}
|
||
.cs-kpis {
|
||
display: grid; grid-template-columns: repeat(2, 1fr);
|
||
gap: 16px; margin-top: var(--sp-8); padding-top: var(--sp-8);
|
||
border-top: 1px solid rgba(255,255,255,.08);
|
||
}
|
||
@media (min-width: 640px) { .cs-kpis { grid-template-columns: repeat(4, 1fr); } }
|
||
.cs-kpi { text-align: center; }
|
||
.cs-kpi-value {
|
||
font-family: var(--font-head); font-size: clamp(32px, 4vw, 52px);
|
||
font-weight: 900; color: #818cf8; line-height: 1; letter-spacing: -0.04em;
|
||
}
|
||
.cs-kpi-label {
|
||
font-size: 12px; font-weight: 600; text-transform: uppercase;
|
||
letter-spacing: .12em; color: rgba(255,255,255,.45); margin-top: 6px;
|
||
}
|
||
.cs-feature-grid {
|
||
display: grid; grid-template-columns: 1fr; gap: 24px; margin-top: var(--sp-6);
|
||
}
|
||
@media (min-width: 640px) { .cs-feature-grid { grid-template-columns: repeat(2, 1fr); } }
|
||
@media (min-width: 900px) { .cs-feature-grid { grid-template-columns: repeat(3, 1fr); } }
|
||
.cs-feature-card {
|
||
background: var(--white); border: 1px solid var(--grey-100);
|
||
border-radius: var(--r-lg); padding: 24px; box-shadow: var(--shadow-card);
|
||
}
|
||
.cs-feature-card h4 { font-size: 15px; margin-bottom: 8px; color: var(--ink); }
|
||
.cs-feature-card p { font-size: 14px; color: var(--grey-600); line-height: 1.6; margin: 0; }
|
||
.cs-feature-icon {
|
||
width: 36px; height: 36px; background: var(--grey-50); border-radius: var(--r-md);
|
||
display: flex; align-items: center; justify-content: center;
|
||
margin-bottom: 14px; font-size: 18px;
|
||
}
|
||
.cs-server-grid {
|
||
display: grid; grid-template-columns: 1fr; gap: 16px; margin-top: var(--sp-5);
|
||
}
|
||
@media (min-width: 640px) { .cs-server-grid { grid-template-columns: repeat(2, 1fr); } }
|
||
.cs-server-card {
|
||
background: var(--white); border: 1px solid var(--grey-100);
|
||
border-radius: var(--r-lg); padding: 20px; box-shadow: var(--shadow-sm);
|
||
}
|
||
.cs-server-card h5 { font-size: 14px; font-weight: 700; color: var(--ink); margin-bottom: 4px; }
|
||
.cs-server-domain { font-size: 13px; color: #6366f1; font-weight: 600; margin-bottom: 8px; font-family: monospace; }
|
||
.cs-server-card p { font-size: 13px; color: var(--grey-600); line-height: 1.55; margin: 0; }
|
||
.cs-stack { display: flex; flex-wrap: wrap; gap: 8px; margin-top: var(--sp-4); }
|
||
.cs-stack-tag {
|
||
background: var(--grey-50); border: 1px solid var(--grey-100);
|
||
border-radius: var(--r-full); padding: 6px 14px; font-size: 13px; font-weight: 500; color: var(--grey-600);
|
||
}
|
||
.cs-two-col {
|
||
display: grid; grid-template-columns: 1fr; gap: var(--sp-8); align-items: start;
|
||
}
|
||
@media (min-width: 768px) {
|
||
.cs-two-col { grid-template-columns: 1fr 1fr; }
|
||
.cs-two-col--wide { grid-template-columns: 3fr 2fr; }
|
||
}
|
||
.cs-quote {
|
||
border-left: 3px solid #6366f1;
|
||
padding: var(--sp-4) var(--sp-5); background: rgba(99,102,241,.04);
|
||
border-radius: 0 var(--r-md) var(--r-md) 0; margin: var(--sp-5) 0;
|
||
}
|
||
.cs-quote p { font-size: 17px; line-height: 1.7; color: var(--grey-800); font-style: italic; margin: 0; }
|
||
.cs-honest {
|
||
background: var(--grey-50); border: 1px solid var(--grey-100);
|
||
border-radius: var(--r-lg); padding: var(--sp-4) var(--sp-5); margin: var(--sp-5) 0;
|
||
}
|
||
.cs-honest-label {
|
||
font-size: 11px; font-weight: 700; text-transform: uppercase;
|
||
letter-spacing: .12em; color: var(--grey-400); margin-bottom: 8px;
|
||
}
|
||
.cs-honest p { font-size: 14px; color: var(--grey-600); line-height: 1.65; margin: 0; }
|
||
.cs-cta {
|
||
background: linear-gradient(135deg, var(--ink-mid), var(--ink));
|
||
border-radius: var(--r-2xl); padding: var(--sp-10) var(--sp-8); text-align: center;
|
||
}
|
||
.cs-cta h2 { color: var(--white); margin-bottom: var(--sp-4); }
|
||
.cs-cta p { color: rgba(255,255,255,.65); max-width: 560px; margin: 0 auto var(--sp-6); font-size: 17px; line-height: 1.7; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<!-- NAV -->
|
||
<nav class="nav" role="navigation" aria-label="Main navigation">
|
||
<div class="nav__inner">
|
||
<a class="nav__logo" href="../index.html" aria-label="HELP4BIS home">
|
||
<img src="../assets/images/logo-cropped.jpg" alt="HELP4BIS" width="140" height="38">
|
||
</a>
|
||
<ul class="nav__links" id="nav-links" role="list">
|
||
<li class="nav__dropdown">
|
||
<button class="nav__trigger" aria-haspopup="true" aria-expanded="false">Services <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"/></svg></button>
|
||
<ul class="nav__dropdown-menu" role="menu">
|
||
<li class="nav__menu-group">WordPress</li>
|
||
<li><a href="../managed-wordpress.html" role="menuitem">Tailored Website Management</a></li>
|
||
<li><a href="../care-plans.html" role="menuitem">WP Care Plans <span class="menu-price">from $49/mo</span></a></li>
|
||
<li><a href="../sos-fix.html" role="menuitem">WP SOS Fix <span class="menu-price">$97 flat</span></a></li>
|
||
<li><a href="../ai-integration.html" role="menuitem">AI Integration</a></li>
|
||
<li><a href="../plugin-development.html" role="menuitem">Custom Plugin Development</a></li> </ul>
|
||
</li>
|
||
<li><a href="../about.html">About</a></li>
|
||
<li><a href="../index.html#portfolio">Our Work</a></li>
|
||
<li><a href="../index.html#pricing">Pricing</a></li>
|
||
<li><a href="../blog/index.html">Blog</a></li>
|
||
<li><a href="../your-first-week-with-ai.html">AI Guide</a></li>
|
||
<li><a href="../contact.html">Contact</a></li>
|
||
<li class="nav__cta-mobile" aria-hidden="true">
|
||
<a href="../contact.html" class="btn btn-primary">Get Started</a>
|
||
<a href="../sos-fix.html" class="btn btn-secondary">SOS Fix, $97</a>
|
||
</li>
|
||
</ul>
|
||
<div class="nav__cta">
|
||
<a href="../sos-fix.html" class="btn btn-secondary btn-sm">SOS Fix, $97</a>
|
||
<a href="../contact.html" class="btn btn-primary btn-sm">Get Started</a>
|
||
</div>
|
||
<button class="nav__burger" id="nav-burger" aria-label="Open menu" aria-expanded="false" aria-controls="nav-links">
|
||
<span></span><span></span><span></span>
|
||
</button>
|
||
</div>
|
||
</nav>
|
||
|
||
<!-- HERO -->
|
||
<section class="cs-hero" aria-labelledby="cs-heading">
|
||
<div class="container">
|
||
<div class="cs-breadcrumb">
|
||
<a href="../index.html">Home</a>
|
||
<span>›</span>
|
||
<a href="../index.html#portfolio">Our Work</a>
|
||
<span>›</span>
|
||
<span style="color:rgba(255,255,255,.7);">M8Chat</span>
|
||
</div>
|
||
<p class="eyebrow" style="color:rgba(129,140,248,.9);">Case Study: Secure Communications Platform</p>
|
||
<h1 id="cs-heading">M8Chat.<br>Chat, video, and mobile,<br>without giving it all to US big tech.</h1>
|
||
<p class="cs-hero-sub">A self hosted Matrix messaging server, Jitsi video conferencing and a Flutter mobile app, all running on private Australian VPS infrastructure. No Zoom account, no Slack subscription, no message history sitting in someone else's US data centre.</p>
|
||
<div class="cs-hero-actions">
|
||
<a href="https://m8chat.au" target="_blank" rel="noopener" class="btn btn-indigo">Visit m8chat.au →</a>
|
||
<a href="https://app.m8chat.au" target="_blank" rel="noopener" class="btn btn-secondary">Open the app</a>
|
||
</div>
|
||
<div class="cs-kpis">
|
||
<div class="cs-kpi">
|
||
<div class="cs-kpi-value">E2E</div>
|
||
<div class="cs-kpi-label">Encrypted</div>
|
||
</div>
|
||
<div class="cs-kpi">
|
||
<div class="cs-kpi-value">AU</div>
|
||
<div class="cs-kpi-label">Data Sovereign</div>
|
||
</div>
|
||
<div class="cs-kpi">
|
||
<div class="cs-kpi-value">VPS</div>
|
||
<div class="cs-kpi-label">Private Infrastructure</div>
|
||
</div>
|
||
<div class="cs-kpi">
|
||
<div class="cs-kpi-value">Open</div>
|
||
<div class="cs-kpi-label">Source Stack</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- OVERVIEW -->
|
||
<section class="section" aria-labelledby="overview-heading">
|
||
<div class="container">
|
||
<div class="cs-two-col cs-two-col--wide">
|
||
<div>
|
||
<p class="eyebrow">Overview</p>
|
||
<h2 id="overview-heading">What it actually is</h2>
|
||
<p class="large">Zoom is fine until it isn't. At some point you start wondering where the recordings go, whether Zoom keeps the chat logs for their own purposes, and whether "HIPAA compliant" on a US platform means the same thing it would mean on Australian infrastructure. I hear those questions more from health workers, legal services and community organisations than most vendors admit.</p>
|
||
<p>M8Chat is the answer I built for myself and for community use. It runs on the Matrix protocol (open, federated, end to end encrypted) on my own Matrix Homeserver infrastructure in Australia. Video conferencing runs on a separate dedicated VPS. The mobile and web app is my own Flutter Matrix client, deployed as a PWA at app.m8chat.au and available as an APK for Android.</p>
|
||
<p>The entire stack is open source. If M8Chat shut down tomorrow, every user could take their conversation history and move to any other Matrix server. The data belongs to the users, not to the platform. That matters to me more than any feature list.</p>
|
||
<div class="cs-quote">
|
||
<p>"Matrix is a properly decentralised protocol. Your chat history isn't locked to M8Chat the way it's locked to WhatsApp or Slack. That's the design, not a marketing claim."</p>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<img src="../assets/images/port-m8chat.png" alt="M8Chat secure communications platform" style="width:100%;border-radius:var(--r-xl);box-shadow:var(--shadow-lg);" loading="lazy">
|
||
<div class="cs-stack" style="margin-top:20px;">
|
||
<span class="cs-stack-tag">Matrix Protocol</span>
|
||
<span class="cs-stack-tag">Jitsi Video Conferencing</span>
|
||
<span class="cs-stack-tag">Flutter (custom client)</span>
|
||
<span class="cs-stack-tag">Docker</span>
|
||
<span class="cs-stack-tag">Australian VPS</span>
|
||
<span class="cs-stack-tag">E2E Encryption</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- SERVER ARCHITECTURE -->
|
||
<section class="section section--alt" aria-labelledby="servers-heading">
|
||
<div class="container">
|
||
<p class="eyebrow">Infrastructure</p>
|
||
<h2 id="servers-heading">What runs where</h2>
|
||
<p style="max-width:640px;color:var(--grey-600);font-size:17px;line-height:1.7;margin-bottom:0;">Three separate servers. Each one doing one thing. Chat and video on dedicated VPS instances keeps them from competing for resources, and it means a Jitsi call dropping doesn't take the chat server with it.</p>
|
||
|
||
<div class="cs-server-grid">
|
||
<div class="cs-server-card">
|
||
<h5>Matrix homeserver</h5>
|
||
<div class="cs-server-domain">chat.m8chat.au</div>
|
||
<p>My Matrix homeserver handles all protocol operations: room management, message storage, federation with the broader Matrix network, and push notifications. Containerised, with a solid database backend. This is the core of the platform.</p>
|
||
</div>
|
||
<div class="cs-server-card">
|
||
<h5>Video conferencing</h5>
|
||
<div class="cs-server-domain">conf.m8chat.au</div>
|
||
<p>A full video conferencing stack on a dedicated VPS, with media bridging, conference management, and session recording. Separate from the chat server, so a heavy video call doesn't affect message delivery.</p>
|
||
</div>
|
||
<div class="cs-server-card">
|
||
<h5>Landing page + app</h5>
|
||
<div class="cs-server-domain">m8chat.au · app.m8chat.au</div>
|
||
<p>The WordPress landing page and the Flutter PWA run on the Brisbane shared server alongside the rest of the HELP4BIS portfolio. The app connects to the Matrix homeserver via the standard Matrix client API.</p>
|
||
</div>
|
||
<div class="cs-server-card">
|
||
<h5>app2.m8chat.au</h5>
|
||
<div class="cs-server-domain">app2.m8chat.au</div>
|
||
<p>A staging and alternate deployment of the Flutter app. I use it for testing new builds before they go to the main app subdomain, and it doubles as a fallback endpoint during major app updates.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- FLUTTER APP -->
|
||
<section class="section" aria-labelledby="app-heading">
|
||
<div class="container">
|
||
<p class="eyebrow">Mobile App</p>
|
||
<h2 id="app-heading">The Flutter app</h2>
|
||
<div class="cs-two-col">
|
||
<div>
|
||
<p>The M8Chat app is my own Flutter Matrix client. I build it specifically for this platform, and it has grown with every release since. I control the full codebase: branding, features, release schedule, and what data the app collects (which is nothing beyond what the Matrix protocol requires).</p>
|
||
<p>The app is available three ways: as a Flutter PWA at <code>app.m8chat.au</code> (works in any modern browser, and you can add it to the home screen on Android and iOS), as a direct APK download for Android (sideload, no Google Play required), and via the Google Play store.</p>
|
||
<p>Core features: text messaging, file sharing, voice messages, end to end encrypted rooms, communities, and video calls that launch with one tap. Video calls open in my conferencing infrastructure without leaving the app.</p>
|
||
</div>
|
||
<div>
|
||
<div class="cs-feature-card" style="margin-bottom:16px;">
|
||
<div class="cs-feature-icon">📱</div>
|
||
<h4>Three deployment targets</h4>
|
||
<p>PWA at app.m8chat.au, APK sideload, and Google Play. Users pick the delivery method that suits their situation. Enterprise users who can't install from the Play Store can use the APK or the browser app.</p>
|
||
</div>
|
||
<div class="cs-feature-card" style="margin-bottom:16px;">
|
||
<div class="cs-feature-icon">🔗</div>
|
||
<h4>Jitsi integration</h4>
|
||
<p>One tap from a Matrix room starts a video call at conf.m8chat.au. The conference runs on private infrastructure. There's no Zoom account required and no third party call relay involved.</p>
|
||
</div>
|
||
<div class="cs-feature-card">
|
||
<div class="cs-feature-icon">🔄</div>
|
||
<h4>Full control of the codebase</h4>
|
||
<p>I own the app code. New features get added when they make sense for the users, not on someone else's roadmap. Security patches go on quickly because there's no external upstream to wait on.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- MATRIX PROTOCOL -->
|
||
<section class="section section--alt" aria-labelledby="matrix-heading">
|
||
<div class="container">
|
||
<p class="eyebrow">Why Matrix</p>
|
||
<h2 id="matrix-heading">The protocol choice</h2>
|
||
<div class="cs-two-col">
|
||
<div>
|
||
<p>Matrix is an open communication protocol, not a product. The spec is publicly documented, multiple open server implementations exist, and any Matrix client can connect to any Matrix server. There's no vendor lock in at the protocol level.</p>
|
||
<p>Federation means M8Chat users can communicate with users on any other Matrix server in the world (matrix.org, a company's self hosted instance, a government Matrix deployment) without those users needing an M8Chat account. It works the same way email does: you don't need a Gmail account to email someone at Gmail.</p>
|
||
<p>End to end encryption is available for private rooms and direct messages. Keys are stored on the user's devices. The server operator, and that includes me, can't read encrypted messages. That's the whole point.</p>
|
||
</div>
|
||
<div>
|
||
<div class="cs-feature-grid" style="margin-top:0;grid-template-columns:1fr;">
|
||
<div class="cs-feature-card">
|
||
<div class="cs-feature-icon">🌐</div>
|
||
<h4>Federation with the Matrix network</h4>
|
||
<p>M8Chat users can join rooms on other Matrix servers, communicate with users on matrix.org, and take part in the broader decentralised network. This isn't a walled garden.</p>
|
||
</div>
|
||
<div class="cs-feature-card">
|
||
<div class="cs-feature-icon">🔑</div>
|
||
<h4>E2E encryption</h4>
|
||
<p>Private rooms and direct messages support end to end encryption using the Olm and Megolm cryptographic protocols. Messages are encrypted on the sender's device and decrypted on the receiver's. The server stores ciphertext, not plaintext.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="cs-honest" style="margin-top:var(--sp-5);">
|
||
<div class="cs-honest-label">Honest note: operational complexity</div>
|
||
<p>Running a Matrix Homeserver is not trivial. The server is resource hungry, federation can create unexpected load from large public rooms, and the database grows faster than most people expect because Matrix stores the full event graph of every room. I monitor the server load, prune old data on a schedule, and I've had to tune the configuration several times since the initial deployment. It's more like running a mail server than running a WordPress site. Anyone considering self hosted Matrix should factor in that operational overhead, not just the initial setup cost.</p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TECH STACK -->
|
||
<section class="section" aria-labelledby="stack-heading">
|
||
<div class="container">
|
||
<p class="eyebrow">Technical Details</p>
|
||
<h2 id="stack-heading">Full stack</h2>
|
||
<div class="cs-two-col">
|
||
<div>
|
||
<h4 style="font-size:15px;margin-bottom:12px;color:var(--ink);">Chat infrastructure (chat.m8chat.au)</h4>
|
||
<div class="cs-stack" style="margin-top:0;">
|
||
<span class="cs-stack-tag">Matrix homeserver</span>
|
||
<span class="cs-stack-tag">Containerised stack</span>
|
||
<span class="cs-stack-tag">Nginx reverse proxy</span>
|
||
<span class="cs-stack-tag">Let's Encrypt SSL</span>
|
||
<span class="cs-stack-tag">Media relay</span>
|
||
</div>
|
||
<h4 style="font-size:15px;margin-bottom:12px;margin-top:24px;color:var(--ink);">Video conferencing (conf.m8chat.au)</h4>
|
||
<div class="cs-stack" style="margin-top:0;">
|
||
<span class="cs-stack-tag">Jitsi conferencing stack</span>
|
||
<span class="cs-stack-tag">Media bridge</span>
|
||
<span class="cs-stack-tag">Session recording</span>
|
||
<span class="cs-stack-tag">Containerised stack</span>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<h4 style="font-size:15px;margin-bottom:12px;color:var(--ink);">Mobile app</h4>
|
||
<div class="cs-stack" style="margin-top:0;">
|
||
<span class="cs-stack-tag">Flutter 3.x (custom client)</span>
|
||
<span class="cs-stack-tag">Dart</span>
|
||
<span class="cs-stack-tag">Service Worker PWA</span>
|
||
<span class="cs-stack-tag">Android APK</span>
|
||
<span class="cs-stack-tag">Google Play</span>
|
||
</div>
|
||
<h4 style="font-size:15px;margin-bottom:12px;margin-top:24px;color:var(--ink);">Web + landing</h4>
|
||
<div class="cs-stack" style="margin-top:0;">
|
||
<span class="cs-stack-tag">WordPress (m8chat.au)</span>
|
||
<span class="cs-stack-tag">Flutter PWA (app.m8chat.au)</span>
|
||
<span class="cs-stack-tag">DirectAdmin, brisbane01</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- USE CASES -->
|
||
<section class="section section--alt" aria-labelledby="use-cases-heading">
|
||
<div class="container">
|
||
<p class="eyebrow">Who Is It For</p>
|
||
<h2 id="use-cases-heading">When self hosted messaging makes sense</h2>
|
||
<p style="max-width:640px;color:var(--grey-600);font-size:17px;line-height:1.7;margin-bottom:0;">This isn't for everyone. Most small businesses don't need to self host their communications. But for some situations the data sovereignty argument is real.</p>
|
||
|
||
<div class="cs-feature-grid">
|
||
<div class="cs-feature-card">
|
||
<div class="cs-feature-icon">🏥</div>
|
||
<h4>Health practitioners</h4>
|
||
<p>GPs, psychologists and allied health workers who send patient information via messaging and want that data to stay in Australia on infrastructure they control, rather than on US servers under US law.</p>
|
||
</div>
|
||
<div class="cs-feature-card">
|
||
<div class="cs-feature-icon">⚖️</div>
|
||
<h4>Legal and financial services</h4>
|
||
<p>Firms with client confidentiality obligations who need to show where communications are stored and under whose jurisdiction. Australian hosted messaging with documented retention policies.</p>
|
||
</div>
|
||
<div class="cs-feature-card">
|
||
<div class="cs-feature-icon">🏛️</div>
|
||
<h4>Community organisations</h4>
|
||
<p>Councils, volunteer emergency services, community groups who want member communications on infrastructure they control rather than dependent on Facebook Groups or WhatsApp staying free and functional.</p>
|
||
</div>
|
||
<div class="cs-feature-card">
|
||
<div class="cs-feature-icon">🏢</div>
|
||
<h4>Small businesses leaving Slack</h4>
|
||
<p>Teams who have outgrown free Slack tiers and want a permanent self hosted alternative. The Slack pricing cliff at the free tier limit makes Matrix a cost effective option for teams of five to thirty people.</p>
|
||
</div>
|
||
<div class="cs-feature-card">
|
||
<div class="cs-feature-icon">🔬</div>
|
||
<h4>Research and academic</h4>
|
||
<p>Research groups handling sensitive data, unpublished material, or material subject to research ethics approvals who need a documented chain of custody for communications.</p>
|
||
</div>
|
||
<div class="cs-feature-card">
|
||
<div class="cs-feature-icon">👥</div>
|
||
<h4>M8Chat direct community use</h4>
|
||
<p>M8Chat runs as a community service for individuals and small groups who simply want a free, private, Australian alternative to WhatsApp or Telegram. No surveillance capitalism, no ads, no algorithm deciding what you see.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- CTA -->
|
||
<section class="section">
|
||
<div class="container">
|
||
<div class="cs-cta">
|
||
<h2>Want your own self-hosted Matrix instance?</h2>
|
||
<p>I can deploy, configure and maintain a Matrix homeserver for your organisation on Australian infrastructure. I handle the operational complexity. You get the sovereignty.</p>
|
||
<div class="cs-hero-actions" style="justify-content:center;">
|
||
<a href="https://m8chat.au" target="_blank" rel="noopener" class="btn btn-primary btn-lg">Try M8Chat free</a>
|
||
<a href="../contact.html" class="btn btn-secondary btn-lg">Ask about private deployment</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div style="margin-top:var(--sp-8);text-align:center;">
|
||
<a href="../index.html#portfolio" style="font-size:14px;color:var(--grey-400);">← Back to all work</a>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- FOOTER -->
|
||
<footer class="footer" aria-label="Site footer">
|
||
<div class="container">
|
||
<div class="footer__grid">
|
||
<div class="footer__brand">
|
||
<img src="../assets/images/logo-cropped.jpg" alt="HELP4BIS" width="140" height="38">
|
||
<p>Managed WordPress hosting and maintenance for Australian small businesses. Brisbane based, personal service, WordPress specialist.</p>
|
||
<p style="margin-top:8px; font-size:12px; color:rgba(255,255,255,.25);">Dutch Digital Dynamics Pty Ltd · ABN 86 081 237 087</p>
|
||
</div>
|
||
<div class="footer__col">
|
||
<h4>Services</h4>
|
||
<ul class="footer__links">
|
||
<li><a href="../managed-wordpress.html">Tailored Website Management</a></li>
|
||
<li><a href="../care-plans.html">WP Care Plans</a></li>
|
||
<li><a href="../sos-fix.html">WP SOS Fix</a></li>
|
||
<li><a href="../ai-integration.html">AI Integration</a></li>
|
||
<li><a href="../plugin-development.html">Plugin Development</a></li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer__col">
|
||
<h4>Our Work</h4>
|
||
<ul class="footer__links">
|
||
<li><a href="dayboro-au.html">Dayboro.au</a></li>
|
||
<li><a href="gardenbuddy-au.html">GardenBuddy.au</a></li>
|
||
<li><a href="tawnytrails.html">Tawny Trails</a></li>
|
||
<li><a href="rds-ink.html">Running Duck Studio</a></li>
|
||
<li><a href="localbuddy-au.html">LocalBuddy</a></li>
|
||
<li><a href="m8chat-au.html">M8Chat</a></li>
|
||
<li><a href="nightcap-nm.html">Nightcap Natural Medicine</a></li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer__col">
|
||
<h4>Contact</h4>
|
||
<ul class="footer__links">
|
||
<li><a href="mailto:project@help4bis.com">project@help4bis.com</a></li>
|
||
<li><a href="../contact.html">Submit a Brief</a></li>
|
||
<li><a href="../sos-fix.html">Emergency Fix</a></li>
|
||
</ul>
|
||
<p style="margin-top:16px; font-size:12px; color:rgba(255,255,255,.3);">Brisbane, Queensland<br>Response within 24 business hours</p>
|
||
</div>
|
||
</div>
|
||
<div class="footer__bottom">
|
||
<span>© 2026 HELP4BIS, a trading name of Dutch Digital Dynamics Pty Ltd · ABN 86 081 237 087</span>
|
||
<span><a href="../privacy.html">Privacy</a> · <a href="../terms.html">Terms</a></span>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
<button id="back-to-top" aria-label="Back to top">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="18 15 12 9 6 15"/></svg>
|
||
</button>
|
||
|
||
<script src="../assets/js/main.js"></script>
|
||
<script src="/analytics/tracker.js" defer></script>
|
||
</body>
|
||
</html>
|