~/gvl ❯ cat README.md

G-VL
HOME

Your homelab. One dashboard. Every device.
Fifteen services. Nine data feeds. Zero cloud dependencies.

0
SERVICES
0
DATA FEEDS
0
SYSTEMS
0
CLOUD DEPS

+ Family AI — private MCP server connects all data to OpenWebUI. Every query stays in the family.

G-vL Home Dashboard

How this was built

One developer. Three workspaces. 53 hours.

530
SUB-AGENTS LAUNCHED
53h
HUMAN TIME
58h
AI TIME
60 000+
LINES OF CODE
378+
TESTS
EN, DE, PL, HU
LANGUAGES
3
WORKSPACES
111
PARALLEL WAVES
Activity Timeline: 3 Workspaces, 17 Days
home-app homelab private-ecosystem
02 05 08 11 14 17 20 23
Mar 3
Mar 4
Mar 10
Mar 11
Mar 12
Mar 13
Mar 14
Mar 15
Mar 16
Mar 17
Mar 18
Mar 19
Mar 20
Mar 21
Mar 22
Mar 23
Mar 24
Traditional Build
Line Item Hours Rate Cost
Research & Discovery 100 blended €11 500
Rust Developer 375 €125/h €46 900
Android Developer 280 €115/h €32 200
Frontend Developer 165 €105/h €17 300
DevOps Engineer 140 €115/h €16 100
PM / Architect 70 €125/h €8 750
Total
€132 750
1 130h · 14 weeks · 5 people
AI-Augmented Build
Line Item Hours Rate Cost
Widgets & Features (13) 20 €120/h €2 400
Infrastructure (Auth + Caddy + CI/CD) 18 €120/h €2 160
Android App (zero prior exp.) 5 €120/h €600
Onboarding Wizard 4.5 €120/h €540
StataBar + StataAPI 4 €120/h €480
Architecture & Planning 1.75 €120/h €210
Total
€6 390
53h · 1 person
All rates based on 2026 Western European freelancer market.
Read the full case study →

Nine data feeds. One host.

Each plugin fetches, caches, and serves one data source. The host handles failover.

DWD

Wetter

/weather

DWD open data. 240-hour forecast with Canvas weathergraph. Temperature gradient line, precipitation, night bands, gust markers, condition icons. Nowcast radar sparkline. 7 condition categories.

Temp11°C gef. 8°
Wind9 km/h SW
Chart10-day weathergraph
Weather detail with Canvas weathergraph
BVG

Nahverkehr

/transit

Real-time BVG departures for nearby stops. Geolocation-aware with colored line badges.

U7 Spandau3m
U8 Wittenau5m
M41 Südkreuz14m
Transit detail screen
BSR

Abholung

/garbage

BSR pickup schedule with waste type colors and urgency indicators. 6h cache.

Biogutmorgen
RestabfallMo 17.
WertstoffeDo 20.
Garbage detail screen
FX

Wechselkurse

/exchange

Exchange rates via ECB (European Central Bank). EUR and CAD base pairs. Dual-currency view for family across countries.

EUR/USD1.0834
EUR/GBP0.8621
EUR/CAD1.4832
Exchange detail screen
DE

Feiertage

/holidays

German public holidays from Nager.Date merged with family birthdays. Regional filtering for Berlin. 24h cache.

Karfreitagin 13 Tagen
Ostermontagin 16 Tagen
🎂 Claudiain 31 Tagen
Holidays detail screen
GF

Portfolio

/portfolio

Ghostfolio integration. Per-user access tokens, each user sees their own portfolio. 5m cache.

Total€12,340.18
Today▲ 2.31%
Absolute+€278.41
Portfolio detail screen
BB

Baby

/baby

Baby Buddy integration with circadian-aware predictions. Gaussian probability curves for next feed, sleep, diaper. Quick-log with undo. Analytics timeline on Glance widgets.

Flasche170ml · vor 47m
Schlafseit 2h 10m
Vorhersage~14:30 Flasche
Baby detail screen
TZ

Zeitzonen

/timezones

World clock with overlap planner. Computed per-request, no upstream API, no cache.

Berlin15:14 ●
New York09:14 ●
Overlap15–17 Uhr (2h)
Timezone detail screen

18 services. One network. Zero cloud.

Mesh VPN

CONNECTIVITY

All devices on the same Tailnet. Internal traffic resolves via *.example.net MagicDNS. Traffic never leaves the mesh.

powered by Headscale

Single Sign-On

IDENTITY

One login for every service. OIDC identity provider with Caddy handling auth across all *.example.net subdomains. Per-user, config-driven feature access.

powered by Zitadel + Caddy Security

The ecosystem

Every service behind *.example.net. Single sign-on. One Tailnet.

■ public + VPN    ■ VPN-only

FS

Office Suite

Cloud storage, file sharing, and document collaboration for the family.

powered by Nextcloud
PH

Photo Library

Self-hosted photo and video backup with face recognition and map view.

powered by Immich
BK

Book Library

E-book catalog and reader with metadata management.

powered by Booklore
RC

Recipe Collection

Family recipes with meal planning, shopping lists, and ingredient scaling.

powered by Tandoor
AI

AI Chat

Private LLM interface with model switching and conversation history.

powered by Open WebUI
VO

Voice Synthesis

Voice clone text-to-speech for custom audio generation.

powered by custom TTS
DC

Document Archive

OCR-indexed document management with tagging and full-text search.

powered by Paperless-ngx
PW

Password Vault

Family password manager with browser extension and mobile apps.

powered by Vaultwarden
BU

Backup Manager

Deduplicated, encrypted backups with retention policies and restore UI.

powered by Backrest
OB

Family Onboarding

Invite-based enrollment wizard with QR codes for new family members and devices.

powered by gvl-onboard (custom)

Full-page dashboard, same bundle, different mode.

The StataBar JS bundle doubles as a full-page dashboard at dashboard.example.net. Service launcher with generative tile art, live data widgets, quick-log actions. Same code, data-mode="dashboard".

SERVICE LAUNCHER : GENERATIVE TILE ART
G-vL Dashboard service launcher
LIVE DATA WIDGETS : BELOW THE FOLD
G-vL Dashboard widget cards with live data

StataBar, injected into every service.

A single JS bundle injected via Caddy replace-response into every *.example.net site. Closed Shadow DOM. Zero runtime dependencies. Icon rail on top, Ctrl+K expands the full panel with live data, service navigation, and quick actions.

ICON RAIL : OVERLAID ON PROXMOX
StataBar icon rail overlaid on Proxmox
EXPANDED PANEL : CTRL+K
StataBar expanded panel with weathergraph and transit

Glance widgets on the homescreen.

Jetpack Glance widgets with size-adaptive layouts. Weather, garbage pickup, holidays, transit, baby predictions : all at a glance. QR enrollment, no passwords. Deployed via self-hosted F-Droid repo.

Weather Glance widget with full weathergraph
Portfolio and Baby Glance widgets with charts

Family onboarding : VPN to apps in 5 steps.

A custom Rust/Axum wizard that provisions new family members: Tailscale VPN setup, F-Droid app store, Zitadel account creation, service tour, and bookmarks. Invite-based enrollment with live connectivity checks. 4-language support (EN/DE/PL/HU).

1 : VPN
Onboarding step 1: VPN setup
2 : F-DROID
Onboarding step 2: F-Droid
3 : ACCOUNT
Onboarding step 3: Account creation
4 : TOUR
Onboarding step 4: Service tour
5 : DONE
Onboarding step 5: Complete

Four systems. One data flow.

StataAPI

Rust · Axum · Tokio

Plugin host with circuit breaker and cache warming. Fetches 9 upstream APIs, caches with TTL, serves a unified JSON contract. Baby analytics with circadian prediction engine. Stale fallback on failure.

StataBar

TypeScript · Shadow DOM · esbuild

Injected into every proxied service via Caddy replace-response. Closed Shadow DOM. Zero npm runtime dependencies. Dashboard mode, sidebar mode, admin panel. Same bundle, different modes.

StataApp

Kotlin · Compose · Glance

Android app with 7 homescreen widgets. QR enrollment. Size-adaptive Glance layouts from 2×1 through 4×2. Canvas-rendered weathergraph and baby prediction timelines. Self-hosted F-Droid deploy.

gvl-onboard

Rust · Axum · Tera

5-step family enrollment wizard. Tailscale VPN provisioning, F-Droid setup, Zitadel account creation, service tour. Invite-based with live connectivity checks. 4-language support.

Upstream APIs
→
StataAPI
→
StataBar
 | 
StataApp

Spec-driven agentic development.

Not vibe coding. Architecture decisions first, implementation second. Claude handles the breadth while the human steers the depth.

01

Specs before code

35 markdown specification documents written and interrogated before a single line of code. API contracts, auth flows, cache strategies, widget layouts, all decided up front.

02

Plugin architecture from day 1

A DataPlugin trait defines the contract. Each feature implements it. The host owns HTTP, caching, and circuit breaking. Plugins are passive: they declare, they don't orchestrate.

03

Verify before every commit

One script runs fmt, clippy, test, and build across all three systems. Nothing ships without green across Rust, TypeScript, and Kotlin simultaneously.

04

Sub-agent delegation

Opus handles architecture and cross-system decisions. Sonnet sub-agents handle implementation, test output interpretation, and file exploration. Cost hierarchy respected.

stataapi/src/plugin.rs : THE ONLY TRAIT
/// Every feature implements this. /// The host does everything else. pub trait DataPlugin: Send + Sync { fn name(&self) -> &str; fn prefix(&self) -> &str; fn routes(&self, state: AppState) -> Router; } // AppState is hand-rolled DI: pub struct AppState { pub cache: TtlCache, // DashMap-backed pub client: reqwest::Client, // shared pub config: Arc<AppConfig>, } // 27 plugins. One trait. No macros. // 21 000 lines of Rust across API plugins alone. // // feature api web ui app // weather 1 991 849 742 // baby 1 354 1 624 1 381 // portfolio 1 806 542 958 // transit 1 461 400 693 // timezones 960 321 848 // holidays 707 360 542 // exchange 808 289 - // garbage 656 304 654 // postal 419 321 - // office 413 299 - // system health 642 321 -

Stack

No Docker. No cloud. Proxmox LXC with blue/green symlink deploys.

Rust
Axum
Tokio
reqwest
DashMap
rumqttc
TypeScript
esbuild
Shadow DOM
Kotlin
Jetpack Compose
Jetpack Glance
Ktor
WorkManager
F-Droid
Caddy
Zitadel
Headscale
Proxmox
Tera
Mosquitto
Forgejo