chore: baseline of the live help4bis.com docroot as of 2026-10-23 (cockpit #168)
Excludes analytics/data, vendor, support, .env, ACME tokens. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,518 @@
|
||||
<!DOCTYPE html>
|
||||
<!-- Version: 1.2.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>LocalBuddy Case Study | HELP4BIS</title>
|
||||
<meta name="description" content="How I built LocalBuddy.au: a community SaaS platform for Australian councils, community groups, and neighbourhoods. Events, directories, marketplace, and Matrix messaging, multi tenant, from $0 to $249/month.">
|
||||
<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/localbuddy-au.html">
|
||||
<meta name="robots" content="index, follow">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://help4bis.com/work/localbuddy-au.html">
|
||||
<meta property="og:site_name" content="HELP4BIS">
|
||||
<meta property="og:title" content="LocalBuddy Case Study | HELP4BIS">
|
||||
<meta property="og:description" content="A community SaaS platform built in Brisbane for Australian councils and community groups: events, directories, marketplace, and secure messaging in one package.">
|
||||
<meta property="og:image" content="https://help4bis.com/assets/images/port-localbuddy.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/localbuddy-au.html#webpage",
|
||||
"url": "https://help4bis.com/work/localbuddy-au.html",
|
||||
"name": "LocalBuddy Case Study, HELP4BIS",
|
||||
"description": "Community SaaS platform for Australian councils and community groups: events, business directory, marketplace, and Matrix messaging.",
|
||||
"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": "LocalBuddy", "item": "https://help4bis.com/work/localbuddy-au.html"}
|
||||
]
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.cs-hero {
|
||||
background: linear-gradient(160deg, var(--ink) 0%, var(--ink-mid) 60%, #1a1500 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(245,158,11,.06) 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-amber {
|
||||
background: linear-gradient(135deg, #F59E0B, #d97706);
|
||||
color: #1a1200; border-color: transparent;
|
||||
box-shadow: 0 4px 14px rgba(245,158,11,.35);
|
||||
font-weight: 700;
|
||||
}
|
||||
.btn-amber:hover {
|
||||
background: linear-gradient(135deg, #d97706, #b45309);
|
||||
color: #1a1200; 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: #F59E0B; 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-pricing-grid {
|
||||
display: grid; grid-template-columns: 1fr; gap: 20px; margin-top: var(--sp-6);
|
||||
}
|
||||
@media (min-width: 640px) { .cs-pricing-grid { grid-template-columns: repeat(2, 1fr); } }
|
||||
@media (min-width: 900px) { .cs-pricing-grid { grid-template-columns: repeat(4, 1fr); } }
|
||||
.cs-tier {
|
||||
background: var(--white); border: 1px solid var(--grey-100);
|
||||
border-radius: var(--r-lg); padding: 20px; box-shadow: var(--shadow-sm);
|
||||
}
|
||||
.cs-tier--featured {
|
||||
border-color: #F59E0B; box-shadow: 0 0 0 1px #F59E0B, var(--shadow-card);
|
||||
}
|
||||
.cs-tier-price {
|
||||
font-family: var(--font-head); font-size: 28px; font-weight: 800;
|
||||
color: var(--ink); letter-spacing: -0.03em; margin: 8px 0 4px;
|
||||
}
|
||||
.cs-tier-price span { font-size: 14px; font-weight: 400; color: var(--grey-600); }
|
||||
.cs-tier h5 { font-size: 14px; font-weight: 700; color: var(--grey-600); text-transform: uppercase; letter-spacing: .08em; margin: 0; }
|
||||
.cs-tier-target { font-size: 13px; color: var(--grey-600); margin: 0 0 12px; }
|
||||
.cs-tier-features { list-style: none; padding: 0; margin: 12px 0 0; }
|
||||
.cs-tier-features li { font-size: 13px; color: var(--grey-700); padding: 4px 0; border-top: 1px solid var(--grey-50); }
|
||||
.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 #F59E0B;
|
||||
padding: var(--sp-4) var(--sp-5); background: rgba(245,158,11,.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);">LocalBuddy</span>
|
||||
</div>
|
||||
<p class="eyebrow" style="color:rgba(245,158,11,.9);">Case Study: Community SaaS Platform</p>
|
||||
<h1 id="cs-heading">LocalBuddy.<br>Community infrastructure<br>for Australian neighbourhoods.</h1>
|
||||
<p class="cs-hero-sub">A multi tenant community platform I built in Brisbane for local councils, community groups, and neighbourhood associations. Events and RSVPs, a business directory, a buy, sell and swap marketplace, and secure messaging on Matrix, all in one package, running under their own branding.</p>
|
||||
<div class="cs-hero-actions">
|
||||
<a href="https://localbuddy.au" target="_blank" rel="noopener" class="btn btn-amber">Visit localbuddy.au →</a>
|
||||
<a href="../contact.html" class="btn btn-secondary">Ask about this for your community</a>
|
||||
</div>
|
||||
<div class="cs-kpis">
|
||||
<div class="cs-kpi">
|
||||
<div class="cs-kpi-value">AU</div>
|
||||
<div class="cs-kpi-label">Built for Australia</div>
|
||||
</div>
|
||||
<div class="cs-kpi">
|
||||
<div class="cs-kpi-value">$0</div>
|
||||
<div class="cs-kpi-label">Free Tier Exists</div>
|
||||
</div>
|
||||
<div class="cs-kpi">
|
||||
<div class="cs-kpi-value">4</div>
|
||||
<div class="cs-kpi-label">Core Modules</div>
|
||||
</div>
|
||||
<div class="cs-kpi">
|
||||
<div class="cs-kpi-value">Multi</div>
|
||||
<div class="cs-kpi-label">Tenant Architecture</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">Most community groups I deal with (Lions clubs, P&C associations, neighbourhood watch groups, rural fire brigades) run their communication across three or four different platforms that don't talk to each other. Facebook for announcements, a separate spreadsheet for the directory, email chains for RSVPs, and WhatsApp for the daily chat that nobody outside can see.</p>
|
||||
<p>I built LocalBuddy to consolidate those into a single platform that runs under the community's own branding. The council or group gets their own subdomain, their own colour scheme, and their own data. The underlying infrastructure is shared across tenants, which is where the (re)-usability of the platform keeps the cost down. They look independent even though they aren't running their own server.</p>
|
||||
<p>The four modules cover the four things communities actually need: knowing what's on this weekend, finding a local tradie, selling a second hand lawnmower, and talking to each other without the feed algorithm deciding who sees what.</p>
|
||||
<div class="cs-quote">
|
||||
<p>"Nextdoor exists. Facebook Groups exist. Neither is owned by the community, neither runs on Australian servers, and neither lets the group admin control what data is collected and where it goes. That is the gap."</p>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<img src="../assets/images/port-localbuddy.png" alt="LocalBuddy community 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">Static HTML</span>
|
||||
<span class="cs-stack-tag">Matrix Protocol</span>
|
||||
<span class="cs-stack-tag">Multi-Tenant SaaS</span>
|
||||
<span class="cs-stack-tag">REST API</span>
|
||||
<span class="cs-stack-tag">Custom Branding</span>
|
||||
<span class="cs-stack-tag">Australian Hosted</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- FOUR MODULES -->
|
||||
<section class="section section--alt" aria-labelledby="modules-heading">
|
||||
<div class="container">
|
||||
<p class="eyebrow">Core Modules</p>
|
||||
<h2 id="modules-heading">Four things communities actually need</h2>
|
||||
<p style="max-width:640px;color:var(--grey-600);font-size:17px;line-height:1.7;margin-bottom:0;">I designed each module for how a community group actually works. No feature chasing, no "engagement metrics", just the tools that reduce the admin burden of running a local organisation.</p>
|
||||
|
||||
<div class="cs-feature-grid">
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">📅</div>
|
||||
<h4>Events + RSVP + Calendar</h4>
|
||||
<p>Post events, collect RSVPs, send reminders. The calendar view shows what's on this week and this month. RSVP confirmation emails go out automatically. The admin sees a live headcount. No spreadsheet required.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">🏪</div>
|
||||
<h4>Business Directory with Reviews</h4>
|
||||
<p>The local business directory with categories, search, contact details, and community reviews. Businesses can claim their listing. The directory admin approves new listings and removes stale ones. Replaces the printed community guide.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">🔄</div>
|
||||
<h4>Buy, Sell, Swap Marketplace</h4>
|
||||
<p>A neighbourhood marketplace for second hand goods, free items, and services. Listings expire automatically. Photo uploads supported. Not Facebook Marketplace, but it's yours: no algorithm, no data mining, no ads.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">💬</div>
|
||||
<h4>Secure Messaging on Matrix</h4>
|
||||
<p>Group and private messaging runs on the Matrix protocol. Open standard, federated, encrypted end to end. The community's messages are stored on Australian infrastructure I manage. No vendor lock in; the protocol is publicly documented.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">🎨</div>
|
||||
<h4>Custom Branding Per Tenant</h4>
|
||||
<p>Each community gets their own subdomain and their own colour scheme. The Dayboro Lions Club looks like the Dayboro Lions Club, not "powered by LocalBuddy with a logo in the corner." Branding is configurable from the tenant admin panel.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">📊</div>
|
||||
<h4>Analytics Dashboard</h4>
|
||||
<p>Tenant admins can see how the platform is being used: active members, event attendance trends, directory search terms, marketplace listing activity. The data belongs to the tenant and stays in Australia, on infrastructure I run.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- PRICING -->
|
||||
<section class="section" aria-labelledby="pricing-heading">
|
||||
<div class="container">
|
||||
<p class="eyebrow">Pricing</p>
|
||||
<h2 id="pricing-heading">Tiers built for community budgets</h2>
|
||||
<p style="max-width:640px;color:var(--grey-600);font-size:17px;line-height:1.7;margin-bottom:0;">Community groups don't have IT budgets, so I priced the tiers around that. The free tier costs nothing and does the real job. Councils and larger organisations that need SLAs, custom domains, and support have a path to paid tiers that reflects the value, whilst the free tier stays functional rather than a crippled demo.</p>
|
||||
|
||||
<div class="cs-pricing-grid">
|
||||
<div class="cs-tier">
|
||||
<h5>Community</h5>
|
||||
<div class="cs-tier-price">$0 <span>/month</span></div>
|
||||
<p class="cs-tier-target">Clubs, sporting groups, neighbourhood associations</p>
|
||||
<ul class="cs-tier-features">
|
||||
<li>All four modules</li>
|
||||
<li>Up to 200 members</li>
|
||||
<li>LocalBuddy subdomain</li>
|
||||
<li>Standard support</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="cs-tier">
|
||||
<h5>Group</h5>
|
||||
<div class="cs-tier-price">$49 <span>/month</span></div>
|
||||
<p class="cs-tier-target">Active community groups, RSLs, Lions clubs</p>
|
||||
<ul class="cs-tier-features">
|
||||
<li>Everything in Community</li>
|
||||
<li>Up to 1,000 members</li>
|
||||
<li>Custom domain</li>
|
||||
<li>Custom branding</li>
|
||||
<li>Priority support</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="cs-tier cs-tier--featured">
|
||||
<h5>Organisation</h5>
|
||||
<div class="cs-tier-price">$149 <span>/month</span></div>
|
||||
<p class="cs-tier-target">Business chambers, regional groups, large associations</p>
|
||||
<ul class="cs-tier-features">
|
||||
<li>Everything in Group</li>
|
||||
<li>Unlimited members</li>
|
||||
<li>Analytics dashboard</li>
|
||||
<li>API access</li>
|
||||
<li>SLA guarantee</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="cs-tier">
|
||||
<h5>Council</h5>
|
||||
<div class="cs-tier-price">$249 <span>/month</span></div>
|
||||
<p class="cs-tier-target">Local councils, regional development boards</p>
|
||||
<ul class="cs-tier-features">
|
||||
<li>Everything in Organisation</li>
|
||||
<li>Multi suburb deployment</li>
|
||||
<li>White label (no LocalBuddy branding)</li>
|
||||
<li>Dedicated support contact</li>
|
||||
<li>Custom feature development</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ARCHITECTURE -->
|
||||
<section class="section section--alt" aria-labelledby="arch-heading">
|
||||
<div class="container">
|
||||
<p class="eyebrow">Under the Hood</p>
|
||||
<h2 id="arch-heading">Multi tenant architecture</h2>
|
||||
<div class="cs-two-col">
|
||||
<div>
|
||||
<p>LocalBuddy runs on a multi tenant architecture where all tenants share the same underlying infrastructure but are isolated at the data layer. A community in Dayboro can't see the data of a community in Toowoomba. As the platform admin, I can see all tenants for operational purposes.</p>
|
||||
<p>The landing page at localbuddy.au is a static HTML site I wrote. No WordPress, no framework. It loads fast, it doesn't break, and it doesn't need updating every time a WordPress plugin releases a security patch. I keep the platform application on separate infrastructure behind the scenes.</p>
|
||||
<p>Matrix for messaging was my deliberate choice. The Matrix protocol is open, federated, and well documented. If LocalBuddy ever shut down or a community wanted to host their messaging themselves, they could export their room history and move to any Matrix compatible server. That isn't possible with WhatsApp or Facebook Messenger.</p>
|
||||
</div>
|
||||
<div>
|
||||
<div class="cs-feature-card" style="margin-bottom:16px;">
|
||||
<div class="cs-feature-icon">🏗️</div>
|
||||
<h4>Tenant isolation</h4>
|
||||
<p>Each tenant has their own database schema prefix. Events, directory listings, marketplace items, and member records are scoped per tenant. Cross-tenant queries are not possible from tenant-level code.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card" style="margin-bottom:16px;">
|
||||
<div class="cs-feature-icon">🌐</div>
|
||||
<h4>Custom domains</h4>
|
||||
<p>Paid tiers get their own subdomain or custom domain. The platform provisions SSL automatically. From the community's perspective, it's their website.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">🔐</div>
|
||||
<h4>Australian data sovereignty</h4>
|
||||
<p>I store all data in Australia. No content moderation AI, no advertising targeting, no data sharing with third parties. The community owns their member data.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="cs-honest">
|
||||
<div class="cs-honest-label">Current status</div>
|
||||
<p>LocalBuddy is in active development. The platform architecture and landing page are built. The deployment model and tenant provisioning system are functional. The first community tenants are the Dayboro Lions Club directory (which runs on the same infrastructure as dayboro.au) and a pilot group in the Moreton Bay region. I haven't opened public sign up for new communities without prior contact. That's deliberate while I refine the onboarding process.</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);">Landing page</h4>
|
||||
<div class="cs-stack" style="margin-top:0;">
|
||||
<span class="cs-stack-tag">Static HTML</span>
|
||||
<span class="cs-stack-tag">Vanilla CSS</span>
|
||||
<span class="cs-stack-tag">No framework dependency</span>
|
||||
<span class="cs-stack-tag">Australian hosted</span>
|
||||
</div>
|
||||
<h4 style="font-size:15px;margin-bottom:12px;margin-top:24px;color:var(--ink);">Platform application</h4>
|
||||
<div class="cs-stack" style="margin-top:0;">
|
||||
<span class="cs-stack-tag">REST API backend</span>
|
||||
<span class="cs-stack-tag">Multi-tenant database</span>
|
||||
<span class="cs-stack-tag">Matrix protocol (messaging)</span>
|
||||
<span class="cs-stack-tag">Platform API layer</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h4 style="font-size:15px;margin-bottom:12px;color:var(--ink);">Infrastructure</h4>
|
||||
<div class="cs-stack" style="margin-top:0;">
|
||||
<span class="cs-stack-tag">DirectAdmin, brisbane01</span>
|
||||
<span class="cs-stack-tag">Let's Encrypt SSL</span>
|
||||
<span class="cs-stack-tag">Australian data centre</span>
|
||||
<span class="cs-stack-tag">Automatic subdomain provisioning</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA -->
|
||||
<section class="section section--alt">
|
||||
<div class="container">
|
||||
<div class="cs-cta">
|
||||
<h2>Running a community group or local council?</h2>
|
||||
<p>If you're managing a community organisation on a mix of Facebook, email chains, and shared Google Docs, I built LocalBuddy for exactly that situation. Get in touch and I'll talk you through whether it fits.</p>
|
||||
<div class="cs-hero-actions" style="justify-content:center;">
|
||||
<a href="https://localbuddy.au" target="_blank" rel="noopener" class="btn btn-primary btn-lg">See the platform</a>
|
||||
<a href="../contact.html" class="btn btn-secondary btn-lg">Talk to us</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>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user