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,810 @@
|
||||
<!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>Dayboro.au Case Study | HELP4BIS</title>
|
||||
<meta name="description" content="How I built dayboro.au: a hyperlocal weather platform, nine interactive calculators, a Flutter PWA on Google Play, and a Lions Club business directory, all running from a single WordPress instance in Dayboro, Queensland.">
|
||||
<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/dayboro-au.html">
|
||||
<meta name="robots" content="index, follow">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://help4bis.com/work/dayboro-au.html">
|
||||
<meta property="og:site_name" content="HELP4BIS">
|
||||
<meta property="og:title" content="Dayboro.au Case Study | HELP4BIS">
|
||||
<meta property="og:description" content="22 years of weather data, nine live data calculators, a Flutter PWA on Google Play, and a community business directory. Here is how I built dayboro.au.">
|
||||
<meta property="og:image" content="https://help4bis.com/assets/images/port-dayboro.jpg">
|
||||
<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/dayboro-au.html#webpage",
|
||||
"url": "https://help4bis.com/work/dayboro-au.html",
|
||||
"name": "Dayboro.au Case Study | HELP4BIS",
|
||||
"description": "A detailed breakdown of how dayboro.au was built: weather station integration, nine interactive calculators, Flutter PWA, Lions Club business directory, and Gann seasonal forecasting.",
|
||||
"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": "Dayboro.au", "item": "https://help4bis.com/work/dayboro-au.html"}
|
||||
]
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/* ── Case study specific styles ── */
|
||||
.cs-hero {
|
||||
background: linear-gradient(160deg, var(--ink) 0%, var(--ink-mid) 60%, #1a2a1a 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(34,197,94,.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-green {
|
||||
background: linear-gradient(135deg, #22C55E, #16a34a);
|
||||
color: var(--white);
|
||||
border-color: transparent;
|
||||
box-shadow: 0 4px 14px rgba(34,197,94,.30);
|
||||
}
|
||||
.btn-green:hover {
|
||||
background: linear-gradient(135deg, #16a34a, #15803d);
|
||||
color: var(--white);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
/* KPI stats */
|
||||
.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: var(--green);
|
||||
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;
|
||||
}
|
||||
|
||||
/* Feature grid */
|
||||
.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;
|
||||
}
|
||||
|
||||
/* Calculator list */
|
||||
.cs-calc-list {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
gap: 12px;
|
||||
margin-top: var(--sp-5);
|
||||
}
|
||||
@media (min-width: 640px) { .cs-calc-list { grid-template-columns: repeat(2, 1fr); } }
|
||||
@media (min-width: 900px) { .cs-calc-list { grid-template-columns: repeat(3, 1fr); } }
|
||||
.cs-calc-item {
|
||||
background: var(--white);
|
||||
border: 1px solid var(--grey-100);
|
||||
border-radius: var(--r-md);
|
||||
padding: 16px 18px;
|
||||
box-shadow: var(--shadow-sm);
|
||||
}
|
||||
.cs-calc-item strong {
|
||||
display: block;
|
||||
font-family: var(--font-head);
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
color: var(--ink);
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.cs-calc-item span {
|
||||
font-size: 13px;
|
||||
color: var(--grey-600);
|
||||
line-height: 1.5;
|
||||
}
|
||||
.cs-calc-tier {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: .08em;
|
||||
padding: 2px 8px;
|
||||
border-radius: var(--r-full);
|
||||
margin-top: 8px;
|
||||
}
|
||||
.cs-calc-tier--free { background: rgba(34,197,94,.12); color: #16a34a; }
|
||||
.cs-calc-tier--premium { background: rgba(245,158,11,.12); color: #b45309; }
|
||||
|
||||
/* Stack tags */
|
||||
.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);
|
||||
}
|
||||
|
||||
/* Section divider */
|
||||
.cs-divider {
|
||||
height: 1px;
|
||||
background: var(--grey-100);
|
||||
margin: var(--sp-8) 0;
|
||||
}
|
||||
|
||||
/* Two-col layout */
|
||||
.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; }
|
||||
}
|
||||
|
||||
/* Pull quote */
|
||||
.cs-quote {
|
||||
border-left: 3px solid var(--green);
|
||||
padding: var(--sp-4) var(--sp-5);
|
||||
background: rgba(34,197,94,.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;
|
||||
}
|
||||
|
||||
/* Honest note */
|
||||
.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;
|
||||
}
|
||||
|
||||
/* CTA block */
|
||||
.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);">Dayboro.au</span>
|
||||
</div>
|
||||
<p class="eyebrow" style="color:rgba(34,197,94,.9);">Case Study: Community Platform</p>
|
||||
<h1 id="cs-heading">Dayboro.au<br>22 years<br>in the making.</h1>
|
||||
<p class="cs-hero-sub">A hyperlocal weather platform, nine interactive calculators connected to my live station data, a Flutter PWA on Google Play, and a Lions Club business directory. I run all of it on a single WordPress instance from a hill in the D'Aguilar Range, Queensland.</p>
|
||||
<div class="cs-hero-actions">
|
||||
<a href="https://dayboro.au" target="_blank" rel="noopener" class="btn btn-green">Visit dayboro.au →</a>
|
||||
<a href="https://app.dayboro.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">2004</div>
|
||||
<div class="cs-kpi-label">Running Since</div>
|
||||
</div>
|
||||
<div class="cs-kpi">
|
||||
<div class="cs-kpi-value">9</div>
|
||||
<div class="cs-kpi-label">Live Data Calculators</div>
|
||||
</div>
|
||||
<div class="cs-kpi">
|
||||
<div class="cs-kpi-value">118+</div>
|
||||
<div class="cs-kpi-label">Businesses Listed</div>
|
||||
</div>
|
||||
<div class="cs-kpi">
|
||||
<div class="cs-kpi-value">5 min</div>
|
||||
<div class="cs-kpi-label">Data Refresh Rate</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
WHAT IT ACTUALLY IS
|
||||
═══════════════════════════════════════════════ -->
|
||||
<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 people in Dayboro know the site for the weather. They check it in the morning to see if the creek is up, or if there's a frost warning overnight. That's the front door.</p>
|
||||
<p>Behind it: nine interactive gardening calculators that pull live data from my weather station every five minutes. A Flutter app on Google Play. A community events calendar. A tiered business directory that our local Lions Club uses to replace the old printed phone book. A custom email plugin I wrote that sends weekly weather digests to subscribers. And a Gann seasonal forecast that I cross reference with Inigo Jones lunar cycle predictions.</p>
|
||||
<p>By any honest measure I've overbuilt it for a town of three thousand people. But it works, and the whole infrastructure costs me roughly the same per month as a decent coffee habit.</p>
|
||||
<div class="cs-quote">
|
||||
<p>"BOM's nearest gauged station is at Samford, 12 km southeast and 150 metres lower in elevation. On a typical summer afternoon the two stations can record rainfall that differs by a factor of four. That's why my station exists."</p>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<img src="../assets/images/port-dayboro.jpg" alt="Dayboro.au weather 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">WordPress</span>
|
||||
<span class="cs-stack-tag">Flutter Web</span>
|
||||
<span class="cs-stack-tag">WeeWX</span>
|
||||
<span class="cs-stack-tag">Python</span>
|
||||
<span class="cs-stack-tag">PMPro Membership</span>
|
||||
<span class="cs-stack-tag">Ecowitt</span>
|
||||
<span class="cs-stack-tag">Service Worker</span>
|
||||
<span class="cs-stack-tag">Custom Plugins</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
THE WEATHER BACKBONE
|
||||
═══════════════════════════════════════════════ -->
|
||||
<section class="section section--alt" aria-labelledby="weather-heading">
|
||||
<div class="container">
|
||||
<p class="eyebrow">Foundation</p>
|
||||
<h2 id="weather-heading">The weather engine</h2>
|
||||
<p class="section-subtitle" style="text-align:left;margin-left:0;max-width:640px;">My Ecowitt station on Lyndhurst Hill feeds a custom Python pipeline I wrote, generating twelve JSON files every five minutes.</p>
|
||||
|
||||
<div class="cs-feature-grid">
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">🌡️</div>
|
||||
<h4>Hardware: Ecowitt sensors</h4>
|
||||
<p>Temperature to 0.1°C resolution, rainfall to 1 mm, wind speed and direction, UV index, solar radiation, soil temperature, lightning strike distance. All the hardware sits on my own site, so I don't depend on anyone else's data.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">⚙️</div>
|
||||
<h4>Processing: WeeWX + Python</h4>
|
||||
<p>WeeWX handles raw sensor ingestion and archive storage. My Python pipeline runs every five minutes: it calculates derived values, builds twelve JSON files, and uploads them to the server automatically. There are no manual steps in the data chain, whilst every step still logs enough that I can trace a bad number back to its sensor.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">📊</div>
|
||||
<h4>Data going back to 2004</h4>
|
||||
<p>22 years of logged temperature and rainfall at Lyndhurst Hill, with varying hardware over the years. The current Ecowitt installation has run continuously since 2023. I publish aggregates and accuracy comparisons against BOM Samford every month.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">🔄</div>
|
||||
<h4>Live API: twelve JSON endpoints</h4>
|
||||
<p>The calculators, the Flutter app, and the WordPress widgets all read from the same live weather data feed. One source of truth, refreshed every five minutes. It costs me nothing in external API fees and there are no rate limits.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">⚡</div>
|
||||
<h4>Push notifications</h4>
|
||||
<p>Subscribers to the Dayboro Buddy app receive push notifications for severe weather events: flash flood watch, frost alerts overnight, and heatwave warnings. Delivered via Service Worker push on Android and iOS.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">🏠</div>
|
||||
<h4>Home automation integration</h4>
|
||||
<p>The same data feeds my Home Assistant instance, with Sigenergy solar battery management and Amber Electric spot prices. Weather station data informs battery charge scheduling. More solar in the forecast means less grid charging overnight.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
NINE CALCULATORS
|
||||
═══════════════════════════════════════════════ -->
|
||||
<section class="section" aria-labelledby="calc-heading">
|
||||
<div class="container">
|
||||
<p class="eyebrow">Gardening Tools</p>
|
||||
<h2 id="calc-heading">Nine calculators, all on live data</h2>
|
||||
<p style="max-width:640px;color:var(--grey-600);font-size:17px;line-height:1.7;margin-bottom:0;">Each one pulls from my live station feed, updated every five minutes. They're standard WordPress pages with Elementor HTML widgets. No external API keys, no third party services. The free tier gets a subset of the tools; premium members get all nine plus extended history views.</p>
|
||||
|
||||
<ul class="cs-calc-list">
|
||||
<li class="cs-calc-item">
|
||||
<strong>Frost Risk</strong>
|
||||
<span>Current temperature vs typical minimum. Overnight frost probability based on current humidity, dew point, and the seasonal average for this valley.</span>
|
||||
<div><span class="cs-calc-tier cs-calc-tier--free">Free</span></div>
|
||||
</li>
|
||||
<li class="cs-calc-item">
|
||||
<strong>Companion Planting</strong>
|
||||
<span>Embedded compatibility matrix covering 30+ vegetable and herb combinations. Helps and hinders, with reasoning for each pairing.</span>
|
||||
<div><span class="cs-calc-tier cs-calc-tier--free">Free</span></div>
|
||||
</li>
|
||||
<li class="cs-calc-item">
|
||||
<strong>Harvest Date</strong>
|
||||
<span>Growing degree day calculation using live minimum and maximum temperatures. Enter planting date and crop, get a realistic days to harvest estimate for your specific conditions.</span>
|
||||
<div><span class="cs-calc-tier cs-calc-tier--free">Free</span></div>
|
||||
</li>
|
||||
<li class="cs-calc-item">
|
||||
<strong>Spray Window</strong>
|
||||
<span>Wind speed, humidity, and temperature from the live station. Outputs a simple safe or not safe right now decision for pesticide and herbicide application.</span>
|
||||
<div><span class="cs-calc-tier cs-calc-tier--premium">Premium</span></div>
|
||||
</li>
|
||||
<li class="cs-calc-item">
|
||||
<strong>Soil pH</strong>
|
||||
<span>Client side only, no data fetch needed. pH ranges per crop, current soil pH input, and a guide with quantities for correcting it.</span>
|
||||
<div><span class="cs-calc-tier cs-calc-tier--free">Free</span></div>
|
||||
</li>
|
||||
<li class="cs-calc-item">
|
||||
<strong>Veggie ROI</strong>
|
||||
<span>Live average vegetable prices from a scraped price dataset versus estimated yield from your plot size. Answers the question: is it actually cheaper to grow this myself?</span>
|
||||
<div><span class="cs-calc-tier cs-calc-tier--premium">Premium</span></div>
|
||||
</li>
|
||||
<li class="cs-calc-item">
|
||||
<strong>Pest Risk</strong>
|
||||
<span>Temperature and humidity threshold model for twelve common garden pests. Current conditions fed live. Risk level: low, moderate, or high, with recommended action.</span>
|
||||
<div><span class="cs-calc-tier cs-calc-tier--premium">Premium</span></div>
|
||||
</li>
|
||||
<li class="cs-calc-item">
|
||||
<strong>Watering Schedule</strong>
|
||||
<span>Evapotranspiration estimate derived from live temperature, humidity, wind, and solar radiation data. Adjusts by soil type and plant category.</span>
|
||||
<div><span class="cs-calc-tier cs-calc-tier--premium">Premium</span></div>
|
||||
</li>
|
||||
<li class="cs-calc-item">
|
||||
<strong>Crop Planner</strong>
|
||||
<span>Calendar based planting windows by month for SE Queensland conditions. Covers 40+ crops with sowing method, spacing, and the typical Dayboro first frost and last frost dates.</span>
|
||||
<div><span class="cs-calc-tier cs-calc-tier--free">Free</span></div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="cs-honest">
|
||||
<div class="cs-honest-label">Design note</div>
|
||||
<p>I kept the calculators deliberately simple on the outside. Each one fits in a single Elementor HTML widget: scoped CSS, vanilla JS, no build tools, no npm. They've been running without maintenance since February 2026, and that's not luck, it's the absence of dependencies. If you want a calculator that breaks six months after launch because an npm package updated, mine aren't that.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
THE MOBILE APP
|
||||
═══════════════════════════════════════════════ -->
|
||||
<section class="section section--alt" aria-labelledby="app-heading">
|
||||
<div class="container">
|
||||
<div class="cs-two-col">
|
||||
<div>
|
||||
<p class="eyebrow">Mobile App</p>
|
||||
<h2 id="app-heading">Dayboro Buddy, on any device</h2>
|
||||
<p class="large">A Flutter Progressive Web App. One codebase, deployed as static files, available on Android via Google Play and on iOS via Safari's Add to Home Screen.</p>
|
||||
<p>The Android APK (package: <code>au.dayboro.app</code>) is on Google Play and installs like a native app. On iPhone, open <a href="https://app.dayboro.au" class="inline-link">app.dayboro.au</a> in Safari, tap the share icon, tap Add to Home Screen. It installs in seconds. No App Store account, no review process, no waiting.</p>
|
||||
<p>The service worker handles offline caching, background sync, and push notifications. Auto update works silently: when I deploy a new version, the service worker detects it on the next load and refreshes. Users are always on the current version without being asked to update anything.</p>
|
||||
|
||||
<div class="cs-feature-grid" style="grid-template-columns:1fr 1fr;margin-top:var(--sp-5);">
|
||||
<div class="cs-feature-card">
|
||||
<h4>App size</h4>
|
||||
<p>3.9 MB. Loads in under 3 seconds on a standard 4G connection.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<h4>Version on Play Store</h4>
|
||||
<p>v2.0.7, live and available at <code>au.dayboro.app</code>.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<h4>Offline mode</h4>
|
||||
<p>Core navigation and cached weather data available without a connection.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<h4>Push notifications</h4>
|
||||
<p>Frost alerts, flood watches, and severe weather warnings delivered to the home screen.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<img src="../assets/images/port-app-dayboro.png" alt="Dayboro Buddy Progressive Web App" style="width:100%;border-radius:var(--r-xl);box-shadow:var(--shadow-lg);" loading="lazy">
|
||||
<div class="cs-honest" style="margin-top:20px;">
|
||||
<div class="cs-honest-label">Why Flutter and not a standard WordPress PWA</div>
|
||||
<p>A standard WordPress PWA gives you a cached version of the site. Flutter gives you a proper application with its own navigation model and a UI that feels native. My weather calculators need to query JSON data, render charts, handle offline state, and update in the background. I tried the WordPress PWA plugins first and they can't do that reliably. Flutter can.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
COMMUNITY LAYER
|
||||
═══════════════════════════════════════════════ -->
|
||||
<section class="section" aria-labelledby="community-heading">
|
||||
<div class="container">
|
||||
<p class="eyebrow">Community</p>
|
||||
<h2 id="community-heading">The community layer</h2>
|
||||
<p style="max-width:640px;color:var(--grey-600);font-size:17px;line-height:1.7;">Business directory, events calendar, weekly email digest, and a membership model. I built all of it into the same WordPress instance, and it's all interconnected.</p>
|
||||
|
||||
<div class="cs-feature-grid" style="margin-top:var(--sp-6);">
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">🏪</div>
|
||||
<h4>Lions Club Business Directory</h4>
|
||||
<p>118 local businesses listed across three tiers: full page, half page, and quarter page. I build the WordPress plugin specifically for this directory, and the Lions Club in Dayboro now uses it as the digital replacement for the annual printed directory. Directory data feeds the Flutter app via a custom REST API.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">📅</div>
|
||||
<h4>Events Calendar</h4>
|
||||
<p>Community events, markets, school dates, and local meetings. Pulled from a custom REST endpoint and displayed on the homepage. The Flutter app reads the same endpoint. One entry point for event data, multiple display surfaces.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">📧</div>
|
||||
<h4>Weekly Weather Digest</h4>
|
||||
<p>A custom email reports plugin (not a third party newsletter service) sends a weekly digest to subscribers. The past seven days of temperature and rainfall, a short summary, and links to the current forecast. The queue runs on WordPress cron. Open rates run consistently above industry average for small community newsletters because every single number in the email is from this valley, not from a regional station 12 km away.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">🔐</div>
|
||||
<h4>Membership: Free and Premium</h4>
|
||||
<p>PMPro handles membership. The free tier gives access to the core weather data and four calculators. Premium unlocks all nine calculators, extended historical data, and the seasonal forecasting tools. There's no trial that asks for a credit card. I made the free tier useful on its own, on purpose.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">📱</div>
|
||||
<h4>Push Notifications</h4>
|
||||
<p>Web push notifications via the Dayboro Buddy service worker. Subscribers opt in to frost alerts, flash flood watches, and heatwave warnings. Notifications go through my own WordPress plugin to a push API endpoint, not through a third party notification service.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<div class="cs-feature-icon">📈</div>
|
||||
<h4>Site Analytics: Custom</h4>
|
||||
<p>My rds-siteanalytics plugin tracks page views and reads Gitea issues as a website task list, displayed in the WordPress admin. No Google Analytics, no third party tracking scripts. Visitor data stays on my server.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
SEASONAL FORECASTING
|
||||
═══════════════════════════════════════════════ -->
|
||||
<section class="section section--alt" aria-labelledby="forecast-heading">
|
||||
<div class="container">
|
||||
<div class="cs-two-col">
|
||||
<div>
|
||||
<p class="eyebrow">Forecasting</p>
|
||||
<h2 id="forecast-heading">Seasonal forecasting: Gann and Inigo Jones</h2>
|
||||
<p class="large">The seasonal forecasting side lives at <a href="https://crohamhurst.app" class="inline-link" target="_blank" rel="noopener">crohamhurst.app</a>, a separate subdomain. It isn't a standard weather forecast.</p>
|
||||
<p>It combines Inigo Jones lunar cycle predictions with a Gann astronomical analysis pipeline I built in Python. The output is a qualitative seasonal outlook: whether the coming month is likely to run wetter or drier than average, based on long cycle positions going back to 1913.</p>
|
||||
<div class="cs-honest">
|
||||
<div class="cs-honest-label">Honest about what it is</div>
|
||||
<p>This is an outlook based on historical cycles, not a deterministic forecast. It doesn't know about La Niña, blocking highs, or the Indian Ocean Dipole. It knows about repeating patterns in the long record that correlate loosely with the positions of the Sun, Moon, and inner planets. Accuracy on wet versus dry calls over a six week window runs around 62 to 65 percent. That's useful for farm planning. It's not useful for scheduling outdoor events, and I say so on the site.</p>
|
||||
</div>
|
||||
<p>The same Gann pipeline also feeds a CFD trading signal system that runs against IG Markets on a demo account, whilst I test whether a methodology W.D. Gann applied to commodity markets in the early 1900s still holds up in modern trading. My results so far are inconclusive, which is the honest answer.</p>
|
||||
</div>
|
||||
<div>
|
||||
<div style="background:var(--ink-mid);border-radius:var(--r-xl);padding:var(--sp-6);color:var(--white);">
|
||||
<p class="eyebrow" style="color:rgba(34,197,94,.9);">How the pipeline works</p>
|
||||
<ol style="list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:16px;">
|
||||
<li style="display:flex;gap:14px;align-items:flex-start;">
|
||||
<span style="flex-shrink:0;width:28px;height:28px;background:var(--green);border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:var(--ink);">1</span>
|
||||
<div><strong style="color:var(--white);font-size:14px;">Astronomical data</strong><p style="font-size:13px;color:rgba(255,255,255,.55);margin:4px 0 0;line-height:1.5;">Sun, Moon, and planet positions calculated from NASA ephemeris data. Declinations, aspects, and angular relationships computed daily.</p></div>
|
||||
</li>
|
||||
<li style="display:flex;gap:14px;align-items:flex-start;">
|
||||
<span style="flex-shrink:0;width:28px;height:28px;background:var(--green);border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:var(--ink);">2</span>
|
||||
<div><strong style="color:var(--white);font-size:14px;">Inigo Jones cycles</strong><p style="font-size:13px;color:rgba(255,255,255,.55);margin:4px 0 0;line-height:1.5;">Lunar cycle positions mapped against the Jones seasonal calendar for SE Queensland. Crohamhurst Observatory data integrated.</p></div>
|
||||
</li>
|
||||
<li style="display:flex;gap:14px;align-items:flex-start;">
|
||||
<span style="flex-shrink:0;width:28px;height:28px;background:var(--green);border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:var(--ink);">3</span>
|
||||
<div><strong style="color:var(--white);font-size:14px;">Gann unified scoring</strong><p style="font-size:13px;color:rgba(255,255,255,.55);margin:4px 0 0;line-height:1.5;">Multiple Gann factors combined into a single directional score. Only scores above 70 are treated as signal grade. Below that, the model abstains.</p></div>
|
||||
</li>
|
||||
<li style="display:flex;gap:14px;align-items:flex-start;">
|
||||
<span style="flex-shrink:0;width:28px;height:28px;background:var(--green);border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:var(--ink);">4</span>
|
||||
<div><strong style="color:var(--white);font-size:14px;">Published outlook</strong><p style="font-size:13px;color:rgba(255,255,255,.55);margin:4px 0 0;line-height:1.5;">Monthly outlook published at crohamhurst.app with the cycle rationale and historical comparison years. Free to read, no account required.</p></div>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
TECH STACK
|
||||
═══════════════════════════════════════════════ -->
|
||||
<section class="section" aria-labelledby="stack-heading">
|
||||
<div class="container">
|
||||
<p class="eyebrow">Under the Hood</p>
|
||||
<h2 id="stack-heading">What it actually runs on</h2>
|
||||
<p style="max-width:600px;color:var(--grey-600);font-size:17px;line-height:1.7;">No managed cloud services, no vendor lock-in, no SaaS subscriptions in the data path. Every component runs on infrastructure I control.</p>
|
||||
|
||||
<div class="cs-feature-grid" style="margin-top:var(--sp-6);">
|
||||
<div class="cs-feature-card">
|
||||
<h4>WordPress + PMPro</h4>
|
||||
<p>Core CMS and membership engine. PMPro handles access control, payment processing, and subscription management. I don't use WooCommerce for memberships. PMPro does it cleaner for this use case.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<h4>Flutter Web</h4>
|
||||
<p>Dart compiled to JavaScript, deployed as static files at app.dayboro.au. Service worker for offline and push. The app itself needs no backend, it reads the same public JSON files as the website.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<h4>WeeWX + Python pipeline</h4>
|
||||
<p>WeeWX handles sensor ingestion. A custom Python module processes the data, runs accuracy calculations, and generates the twelve JSON export files every five minutes via root cron.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<h4>Custom WordPress plugins</h4>
|
||||
<p>Three custom plugins I wrote specifically for this site: dayboro-business-directory (Lions Club listing management + REST API), dayboro-email-reports (queued weekly digest), and rds-siteanalytics (custom analytics + Gitea task integration).</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<h4>DirectAdmin on brisbane01</h4>
|
||||
<p>I host all my sites on a dedicated server in Brisbane. Help4bis.com, dayboro.au, gardenbuddy.au, rds.ink, m8chat.au, and eight other domains all run on the same physical machine. Australian data residency, not US cloud.</p>
|
||||
</div>
|
||||
<div class="cs-feature-card">
|
||||
<h4>Ecowitt hardware</h4>
|
||||
<p>GW2000 gateway with multiple sensor arrays. Direct local API plus cloud sync. WeeWX reads locally, so my data pipeline doesn't depend on Ecowitt's cloud servers staying up.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="cs-divider"></div>
|
||||
|
||||
<div class="cs-two-col">
|
||||
<div>
|
||||
<h3 style="margin-bottom:var(--sp-3);">Full technology list</h3>
|
||||
<div class="cs-stack">
|
||||
<span class="cs-stack-tag">WordPress 6.x</span>
|
||||
<span class="cs-stack-tag">PHP 8.4</span>
|
||||
<span class="cs-stack-tag">MariaDB</span>
|
||||
<span class="cs-stack-tag">PMPro Membership</span>
|
||||
<span class="cs-stack-tag">Elementor Pro</span>
|
||||
<span class="cs-stack-tag">Flutter 3.x</span>
|
||||
<span class="cs-stack-tag">Dart</span>
|
||||
<span class="cs-stack-tag">WeeWX 5.x</span>
|
||||
<span class="cs-stack-tag">Python 3.11</span>
|
||||
<span class="cs-stack-tag">Ecowitt GW2000</span>
|
||||
<span class="cs-stack-tag">Service Worker</span>
|
||||
<span class="cs-stack-tag">Web Push API</span>
|
||||
<span class="cs-stack-tag">REST API</span>
|
||||
<span class="cs-stack-tag">JSON data files</span>
|
||||
<span class="cs-stack-tag">DirectAdmin</span>
|
||||
<span class="cs-stack-tag">Gitea</span>
|
||||
<span class="cs-stack-tag">Home Assistant</span>
|
||||
<span class="cs-stack-tag">Sigenergy</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 style="margin-bottom:var(--sp-3);">What I deliberately left out</h3>
|
||||
<p style="color:var(--grey-600);font-size:14px;line-height:1.65;">No Google Analytics, because privacy matters in a small community where everyone knows each other. No third party notification services, push goes through my own endpoint. No CDN, since the server is in Brisbane and the audience is in SE Queensland; the latency is fine. No React, no Next.js, no build pipeline for the widgets. Vanilla JS in Elementor HTML widgets is fast, maintainable, and doesn't break when npm packages update.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
CTA
|
||||
═══════════════════════════════════════════════ -->
|
||||
<section class="section section--dark" aria-labelledby="cta-heading">
|
||||
<div class="container">
|
||||
<div class="cs-cta">
|
||||
<p class="eyebrow" style="color:rgba(34,197,94,.9);justify-content:center;">What I can build for you</p>
|
||||
<h2 id="cta-heading">Your community, your platform.</h2>
|
||||
<p>Not the whole thing. Something that fits your scale and budget. I bring the tools, the architecture, and over twenty years of building for small communities. What I need from you: a clear description of what problem you're trying to solve and who you're solving it for.</p>
|
||||
<div style="display:flex;gap:12px;justify-content:center;flex-wrap:wrap;">
|
||||
<a href="../contact.html" class="btn btn-primary">Talk to us about your project</a>
|
||||
<a href="../index.html#portfolio" class="btn btn-secondary">See more of our work</a>
|
||||
</div>
|
||||
</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="font-size:13px; color:rgba(255,255,255,.4);">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>Company</h4>
|
||||
<ul class="footer__links">
|
||||
<li><a href="../about.html">About Us</a></li>
|
||||
<li><a href="../index.html#portfolio">Our Work</a></li>
|
||||
<li><a href="../index.html#testimonials">Client Feedback</a></li>
|
||||
<li><a href="../blog/index.html">Blog</a></li>
|
||||
<li><a href="../contact.html">Contact</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:1rem; font-size:13px; color:rgba(255,255,255,.4);">
|
||||
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 Policy</a> ·
|
||||
<a href="../terms.html">Terms</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<button id="back-to-top" aria-label="Back to top" style="position:fixed;bottom:24px;right:24px;width:44px;height:44px;background:var(--red);border:none;border-radius:50%;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .3s ease;box-shadow:var(--shadow-md);">
|
||||
<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>
|
||||
Reference in New Issue
Block a user