Surf Life Saving
Nano Solutions
Technical Report

Platform Architecture

Infrastructure, deployment pipeline, codebase statistics, and the engineering systems behind Australia's beach safety platform.

1,909 Commits 67 Releases 63K Lines of Code 9,448 App Builds March 2026
SLSNano Solutions
01 — Overview

Platform at a Glance

A full-stack web and mobile platform built on Laravel 11, Vue 2, and backed by MySQL, Redis, and Azure cloud storage.

1,909
Git Commits
Since Mar 2021
67
Releases
v3.0.0RC0 → v3.9.14
62,973
Lines of Code
PHP, Vue, JS
14.1 GB
Database Size
62 tables

457
PHP Files
82
Vue Components
101
Migrations
55
Test Files
48
Blade Views
Source: GitLab, Production DB · Data: Mar 2021 – Mar 2026
SLSNano Solutions
02 — Tech Stack

Technology Stack

Modern PHP/Laravel backend with Vue.js SPA frontend, deployed via Deployer to Google Cloud infrastructure.

Backend

PHP 8.2 / Laravel 11

42 Composer packages
Laravel Horizon (queues)
Laravel Pulse (monitoring)
Spatie Media Library
Bugsnag error tracking
Firebase (FCM push)
GeoIP2 geolocation

Frontend

Vue 2 SPA + Blade

82 Vue components
30 NPM dependencies
Webpack (Laravel Mix)
Mapbox GL (map rendering)
48 Blade server-side views
Bootstrap 4 CSS framework
Bugsnag JS error tracking

Infrastructure

Google Cloud + Azure

MySQL 8.0 database
Redis (cache + sessions)
Azure Blob Storage (media)
DigitalOcean Spaces (logs)
BOM FTP (weather data)
Deployer PHP (CI/CD)
GitLab CI pipelines

Dependency Profile
42 production + 13 dev Composer packages. 30 production + 17 dev NPM packages. Key integrations: SLSA API (v2.sls.com.au), Google Analytics 4, App Store Connect, Google Play, Firebase Cloud Messaging, BOM weather FTP.
Source: composer.json, package.json · Data: Current
SLSNano Solutions
03 — Architecture

Production Architecture

Multi-server deployment with dedicated backend for queue processing and scheduled tasks.

Users
beachsafe.org.au
128K monthly active users
79.5% mobile, 19.6% desktop
Web Servers (x2)
Frontend / API
Laravel 11 + Vue 2 SPA
Nginx, PHP 8.2-FPM
Load balanced, 2 instances
Database
MySQL 8.0
14.1 GB across 62 tables
14.9M rows, Redis cache
Backend Server
Queue & Scheduler
Laravel Horizon
Scheduled tasks
~4,000 API calls/day
Azure Blob Storage
Media Files
nanoslsa / beachsafe
37.4 GB, 224,911 blobs
Beach images, posts, algal
External APIs
Data Sources
SLSA API (v2.sls.com.au)
Operations App (patrols/attendance)
BOM FTP, Firebase, GA4
3-server production topology: Two web servers (beachsafe.org.au + 35.213.218.252) handle user traffic with load balancing. A dedicated backend server (backend.beachsafe.org.au) runs Horizon queues, scheduled tasks, and data synchronisation — isolated from user-facing requests.
Source: deploy.php, production config · Data: Current
SLSNano Solutions
04 — Data Flow

Request & Data Flow

How data moves from government sensors and SLSA operations through to the end user.

Inbound Data Pipeline

1BOM FTP → Weather obs, UV, tides, forecasts, radar (902 stations) 2SLSA API → Hazards, patrols, beach data, attendance (~4K calls/day) 3Algal Bloom → Automated reports from 52 SA beaches (~1K/day) 4GA4 + ASC → Web analytics, app downloads, search console 5Mezmo → Server log archive (DO Spaces, SGP1 region)

User Request Path

1Web → beachsafe.org.au → Nginx → Laravel (Blade + Vue SPA) 2App → /api/v4/* endpoints → JSON responses (53% of traffic) 3Beach page → 2 API calls: beach detail + weather bundle 4Patrols → Lazy-loaded on user interaction (3rd API call) 5Push → Firebase FCM → iOS/Android (744K notifications sent)
Cache hit rate: 58.1% (1.2M hits vs 864K misses via Laravel Pulse)
Storage architecture: Production media (beach images) on Azure Blob Storage (nanoslsa/beachsafe container). Staging mirror on DigitalOcean Spaces (cloud-public disk). Server logs archived to DO Spaces SGP1 (nano-logdna-archive). BOM weather data via FTP (registered + anonymous).
Source: Production config, SLSA API · Data: Current
SLSNano Solutions
05 — Database

Database Architecture

14.1 GB MySQL database across 62 tables — dominated by SLSA API logs (11.6 GB) and weather data.

Top 10 Tables by Size

slsa_api_logs11.6G
pulse_entries531M
notifications364M
adfd_temperature204M
adfd_wind_dir204M
adfd_wind_speed204M
pulse_aggregates194M
analytics_snapshots137M
attendances132M
observations69M
slsa_api_logs alone is 82% of the total database. 1.26M rows of API call history since Jul 2024.

Table Categories

Core Business (12 tables)
beaches, users, devices, beach_user, notifications, attendances, beaches_posts, beaches_patrols, algal_bloom_metrics, entities, media, articles
Weather & Environment (14 tables)
observations, adfd_* (3), water_temperatures, uv, tides, marine_rss, marine_forecasts, marine_zones, point_places, point_place_forecasts, radars, radar_images
Monitoring & Logs (5 tables)
slsa_api_logs, pulse_entries, pulse_aggregates, pulse_values, commands
Infrastructure (31 tables)
Analytics, auth, jobs, migrations, Nova, roles, facilities, postcodes, backup_imports, and more
101 database migrations track the full schema evolution since v3.0.0.
Source: MySQL information_schema · Data: Snapshot Jan 2026
SLSNano Solutions
06 — Repository

GitLab Repository

5 years of continuous development on git.nano.rocks — private repository under the SLS namespace.

1,909
Total Commits
master branch
384
Merge Commits
Fast-forward merge
114
Branches
Remote tracking
21
Open Issues
Active backlog

Contributors (last 100 commits)

Petr Cervenka
81 Jacopo Sarti
19
MR authors: Petr Cervenka (49), Jacopo Sarti (47), NanoChief (4)

Branching Strategy

master — production releases (1,909 commits)
develop — integration branch (1,975 commits)
feature/* — individual features branch from develop
Merge method: Fast-forward (clean linear history)
Auto-delete: Source branches removed after merge
Source: GitLab API · Data: Mar 2021 – Mar 2026
SLSNano Solutions
07 — Releases

Release History

67 releases over 4.3 years — from v3.0.0RC0 (Dec 2021) to v3.9.14 (Mar 2026). One release every 3.4 weeks.

Releases per Year — Consistent delivery cadence across the project lifetime
20213
202217
202312
202410
202522
20263
2022 peak reflects rapid post-launch iteration. 2025 was the highest release year driven by BluebottleWatch features.

Platform Evolution Eras

Nov 2021v3.0.0 — Platform launch + v2 migration 2022Stabilisation era: bug fixes, Facebook login, security 2023Foundation: iOS fixes, code quality, Laravel 10 H1 2024Infrastructure: Laravel 10 → 11, Firebase APIs H2 2024Growth setup: API v2, beach patrols H2 2025Breakout: Push fix + Algal Bloom (+94% users) 2026Refinement: Predictions, dashboards, tooling

Milestone Releases

v3.8.0 (Sep 2025) — iOS push notification fix. Device adoption 15% → 95%
v3.9.0 (Oct 2025) — Algal Bloom launch. SA registrations +6,615%
v3.0.17 (Dec 2022) — Facebook signup. +153% registrations
v3.3.0 (Dec 2024) — Beach patrols fix. +136% growth
v3.5.0 (May 2025) — Laravel 11 upgrade
v3.9.14 (Mar 2026) — Latest release
Source: GitLab releases · Data: Dec 2021 – Mar 2026
SLSNano Solutions
08 — CI/CD

Deployment Pipeline

GitLab CI/CD with Deployer PHP — automated testing, building, and zero-downtime deployments.

Pipeline Stages

1 Preparation Composer install, secure file download, GeoIP DB setup 2 Testing PHPUnit (55 test files), Dusk browser tests 3 Build NPM build, Webpack/Mix asset compilation 4 Deploy Deployer PHP → rsync to 3 production hosts 5 Post-deploy Bugsnag release + source maps, Horizon restart, Pulse restart

Deployer Tasks

deploy:prepare — create release directory deploy:rsync:vendors — sync Composer deps artisan:storage:link — symlink storage artisan:config/route/view/event:cache artisan:migrate — run database migrations deploy:publish — activate new release horizon:terminate + queue:restart
Keeps 5 releases on disk for instant rollback. Uses archive strategy for code update. SSH multiplexing enabled for fast multi-host deploys.
Environments: Production (beachsafe.org.au, 3 hosts), Staging (beachsafe.nano.rocks, lab runner). Dusk browser tests run on all browser jobs. Container registry at hub.nano.rocks with daily cleanup (keep 1, older than 7d).
Source: .gitlab-ci.yml, deploy.php · Data: Current
SLSNano Solutions
09 — Storage

Cloud Storage Architecture

Multi-cloud storage strategy spanning Azure, DigitalOcean, and BOM government FTP servers.

Primary Storage

Azure Blob Storage

Account: nanoslsa
Container: beachsafe
Total: 37.4 GB across 224,911 blobs
Beach posts: 30,839 files (17.9 GB)
Beach images: 102,408 files (9.9 GB)
Algal bloom: 24,352 files (8.4 GB)
Radar images: 66,327 files (229 MB)

Log Archive

DigitalOcean Spaces

Bucket: nano-logdna-archive
Region: SGP1 (Singapore)
Total: 436.4 GB across 46,864 objects
2023: 131.8 GB (10,847 objects)
2024: 102.6 GB (12,758 objects)
2022: 85.3 GB • 2025: 83.2 GB
2026 YTD: 21.4 GB (2,149 objects)

Government Data

BOM FTP Servers

Registered FTP: Authenticated access for premium data
Anonymous FTP: ftp.bom.gov.au (public weather data)
Data: Weather observations, UV, tides, forecasts, radar
Stations: 902 BOM observation points
Ports: 709 tide prediction locations
Cache: 1-hour (registered), 5-minute (anonymous)

Total cloud storage: 473.8 GB across Azure (37.4 GB media) + DigitalOcean (436.4 GB logs). Media pipeline uses Spatie Media Library with automatic optimisation (jpegoptim, pngquant, optipng, cwebp). Max file size: 2 GB. Image conversions processed via queue. BluebottleWatch forecasts: 619 MB (116 files).
Source: Azure Blob Storage, DO Spaces · Data: Mar 2021 – Mar 2026
SLSNano Solutions
10 — Integrations

External Service Integrations

10+ external APIs and services connected to the platform — from government weather data to app store analytics.

Core

SLSA API

v2.sls.com.au — hazards, patrols, beach data, attendance. 99.95% success rate across 1.16M calls. ~4,000 calls/day.

Core

Firebase (FCM)

Push notifications to iOS/Android. 744K notifications delivered. Project: beachsafe-218403.

Core

Operations App

Nano's SLS Operations platform. Patrol observations, beach attendance, swimmer counts. 474K attendance records, 133K posts across 315 beaches.

Core

Bureau of Meteorology

FTP-based weather data. 902 stations, 709 tide ports, 40 radars, 1,475 forecast locations, 64 marine zones.

Analytics

Google Analytics 4

Property 291994651. Web analytics, active users, sessions, page views. Collected every 4-6 hours.

Analytics

App Store Connect

iOS download stats, ratings, revenue data. Google Play for Android metrics.

Monitoring

Bugsnag

Real-time error tracking for PHP backend and JS frontend. Source maps uploaded on every deploy. Release tracking tied to git commits.

Monitoring

Mezmo (LogDNA)

Server log aggregation and archive. 436 GB across 46,864 objects on DO Spaces (SGP1). Nginx, PHP-FPM, and scheduler logs.

Source: Production config, external APIs · Data: Current
SLSNano Solutions
11 — Mobile App

Native Mobile App

Capacitor 6 shell loading the Laravel SPA dynamically — native access to GPS, push, camera, and offline storage.

5,073
iOS Builds
4,375
Android Builds
326
Git Commits
5
Releases
v5.0.0 → v5.0.3
20
Branches

Architecture

Capacitor 6.0 native shell
App ID: com.slsa.beachsafe
Web Dir: dist (loaded dynamically)
Approach: Native shell loads Laravel SPA from beachsafe.org.au at runtime — no bundled web assets
iOS: min iOS 13.0, 36 Swift files
Android: min SDK 24 (7.0), target SDK 35 (15), 3 Java files
Build: Vite 2.9, 15 NPM deps
App launch → Capacitor bridge → Dynamic web loader → Laravel Vue SPA

Native Plugins (10)

Push Notifications — Firebase FCM Geolocation — GPS beach proximity Apple Sign-In — native OAuth Facebook Login — native OAuth Firebase Analytics — usage tracking SQLite — offline beach database Splash Screen — branded launch Device — hardware identification App — lifecycle management Preferences — local key-value storage
CI/CD pipeline: GitLab CI with Fastlane templates. 7 build jobs: android_beta, android_release, android_firebase_debug, ios_testflight_only, ios_release, ios_firebase_debug, ios_internal. Release jobs: release_store, android/ios_promote_to_production. Contributors: Petr Cervenka (114), Jacopo Sarti (31).
Source: GitLab, App Store Connect, Google Play · Data: Mar 2021 – Mar 2026
SLSNano Solutions
12 — Monitoring

Observability & Monitoring

Multi-layer monitoring from application errors to server logs to API reliability tracking.

Error Tracking

Bugsnag

Real-time error monitoring for PHP backend and JavaScript frontend. Source maps uploaded on every deploy. Release tracking tied to git commits. Crash-free session rate and stability trends.

Application

Laravel Pulse

2.1M entries, 650K aggregates. Tracks request performance, slow queries, cache hit rates (58.1%), job throughput, and queue health. Dashboard at /pulse.

Infrastructure

Mezmo (LogDNA)

Server-level log aggregation. 620 daily snapshots over 6 months. Archived to DigitalOcean Spaces (SGP1). Nginx access + error logs, PHP-FPM, scheduler output.

Nanolytics
Custom analytics collection system (nanolytics package). 156 collection jobs per full run across 10 data services. Collects from GA4, Search Console, App Store, Google Play, Firebase, Bugsnag, Mezmo, SLSA API, GitLab, and command logs. Runs every 4–6 hours with twice-daily historical snapshots.
Source: Bugsnag, Laravel Pulse, Mezmo · Data: Current
SLSNano Solutions
13 — Reliability

SLSA API Reliability

299x improvement in error rate over 14 months — from 2.99% to 0.01%. 1.16M calls logged.

99.95%
Success Rate
1,156,705 successful calls
299x
Error Improvement
2.99% → 0.01%
530
Total Errors
502, 401, 503, 524

Error Rate Over Time

PeriodError RateStatus
Oct 20242.99%Early integration
Nov 20240.96%Rapid improvement
Dec 20240.12%10x better
Jan 20250.10%Stabilised
Mar–Dec 20250.01–0.03%Rock solid

Top API Endpoints

SurfGuard patrol profiles103K Surfcom hazards87K Beach data15K Attendance records12K
Peak API load: 10am (487K calls). Hazard checks continuous at ~12,500/day. Patrol profiles batch-fetched on Mondays (72K calls).
Source: slsa_api_logs · Data: Jul 2024 – Jan 2026
SLSNano Solutions
Technical Report

Built to Scale

5 years of continuous engineering — 3 production servers, 62 database tables, 10+ external integrations, and 99.95% API reliability.

1,909
Commits
67
Releases
14.1 GB
Database
99.95%
API Uptime
Built by Nano Solutions • March 2026 • Data as of March 19, 2026
← Back to Main Report
1 / 15