Building Better Teams - Brian Graham
Mühlenstraße 8a
14167 Berlin, Germany
brian@buildingbetterteams.de
+491783212891
Your homelab. One dashboard. Every device.
Fifteen services. Nine data feeds. Zero cloud dependencies.
+ Family AI — private MCP server connects all data to OpenWebUI. Every query stays in the family.
One developer. Three workspaces. 53 hours.
| 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 |
| 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 |
Each plugin fetches, caches, and serves one data source. The host handles failover.
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.
Real-time BVG departures for nearby stops. Geolocation-aware with colored line badges.
BSR pickup schedule with waste type colors and urgency indicators. 6h cache.
Exchange rates via ECB (European Central Bank). EUR and CAD base pairs. Dual-currency view for family across countries.
German public holidays from Nager.Date merged with family birthdays. Regional filtering for Berlin. 24h cache.
Ghostfolio integration. Per-user access tokens, each user sees their own portfolio. 5m cache.
Baby Buddy integration with circadian-aware predictions. Gaussian probability curves for next feed, sleep, diaper. Quick-log with undo. Analytics timeline on Glance widgets.
World clock with overlap planner. Computed per-request, no upstream API, no cache.
All devices on the same Tailnet. Internal traffic resolves via *.example.net MagicDNS. Traffic never leaves the mesh.
One login for every service. OIDC identity provider with Caddy handling auth across all *.example.net subdomains. Per-user, config-driven feature access.
Every service behind *.example.net. Single sign-on. One Tailnet.
■ public + VPN ■ VPN-only
Cloud storage, file sharing, and document collaboration for the family.
Self-hosted photo and video backup with face recognition and map view.
E-book catalog and reader with metadata management.
Family recipes with meal planning, shopping lists, and ingredient scaling.
Private LLM interface with model switching and conversation history.
Voice clone text-to-speech for custom audio generation.
OCR-indexed document management with tagging and full-text search.
Family password manager with browser extension and mobile apps.
Deduplicated, encrypted backups with retention policies and restore UI.
Invite-based enrollment wizard with QR codes for new family members and devices.
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".
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.
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.
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).
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.
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.
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.
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.
Not vibe coding. Architecture decisions first, implementation second. Claude handles the breadth while the human steers the depth.
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.
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.
One script runs fmt, clippy, test, and build across all three systems. Nothing ships without green across Rust, TypeScript, and Kotlin simultaneously.
Opus handles architecture and cross-system decisions. Sonnet sub-agents handle implementation, test output interpretation, and file exploration. Cost hierarchy respected.
No Docker. No cloud. Proxmox LXC with blue/green symlink deploys.