Skip to main content

Home Infrastructure: A Family Operating System

Three Workspaces, Twenty Services, One Family

30 sessions2941 prompts~53h over 3 weeks human~58h AI
homelabself-hostedrustkotlintypescriptandroidproxmoxoidcinfrastructuresub-agents
View Live Project →
Project screenshot
Human: ~53h (48%)AI: ~58h (52%)
530
Sub-agents launched
111
Parallel waves
~55–70
Commits
60 000+
Lines of code
378+
Tests
4
Languages (Rust, TypeScript, Kotlin, Bash)

The Setup​

I had a Proxmox homelab running about twenty self-hosted services: Immich for family photos, Nextcloud, Vaultwarden, Open WebUI, Tandoor recipes, Baby Buddy, Ghostfolio for portfolio tracking, and a dozen more. The front door was Dashy, a link dashboard that showed a grid of bookmarks and a few basic widgets. It worked, technically.

The problem with Dashy is that it's too spread out and hard to build secure integrations around. Everything is frontend code, which means secrets are effectively public. It's hard to extend with complex features, and honestly kind of slow. But the real issue was simpler: everyone forgot it was there. People just went directly to the one or two services they used, and the rest was forgotten. Our extended family contains citizens of four countries. We speak multiple languages at home. And the digital side of our household was a collection of disconnected services behind a patchwork auth stack that I'd grown organically. I'm still the only one who understands this stuff, but it's much less complicated now and more secure than hiding everything behind SSO.

I didn't want a better dashboard. I wanted a family operating system. Here's what that means:

The network: Every device on a private Tailnet mesh VPN via Headscale. Internal traffic never leaves the mesh. Everything is VPN-only — the only public-facing endpoint is a tiny onboarding invite link. Behind the VPN, a custom Caddy build handles routing with caddy-security for OIDC and replace-response for injecting the StataBar sidebar into every authenticated page. One login for everything, powered by Zitadel.

The services: Nextcloud for file sync, Immich for photos, Vaultwarden for passwords, Tandoor for recipes, BookLore for ebooks, Open WebUI for a private family AI chat (MCP server connecting all data — every query stays in the family), Baby Buddy for infant tracking, Ghostfolio for portfolio management, Forgejo for git and CI/CD — fifteen services total, each on its own subdomain, each with SSO.

The data feeds: Nine plugins feeding real data from official sources. DWD weather with 240-hour forecast and live radar. BVG transit departures with geolocation. BSR garbage collection schedule. ECB exchange rates. German public holidays merged with family birthdays. Ghostfolio portfolio with alpha/beta against benchmark. Baby Buddy with circadian-aware feeding predictions. World clock with timezone overlap planner. DHL postal tracking.

The apps: A native Android app (StataApp) with Glance homescreen widgets — transit, weather, baby, portfolio, garbage, holidays, timezone. A TypeScript web component (StataBar) injected via Caddy into every authenticated service as a navigation sidebar. A Rust API backend (StataAPI) hosting all nine plugins with a shared cache layer. And a four-language onboarding wizard (EN/DE/PL/HU) that walks new family members through VPN setup, app install, account creation, and service discovery — complete with annotated video recordings.

Zero cloud dependencies. All data sourced from official authorities. Family photos behind encrypted VPN. No Google, no Meta, no third-party intermediaries.

Activity During the Build​

02:0003:0004:0005:0006:0007:0008:0009:0010:0011:0012:0013:0014:0015:0016:0017:0018:0019:0020:0021:0022:0023:00
Mar 030.7h
Mar 042.9h
Mar 102.3h
Mar 117.8h
Mar 128.5h
Mar 138.8h
Mar 141.8h
Mar 156.3h
Mar 166.4h
Mar 176.2h
Mar 185.9h
Mar 197.7h
Mar 2013.3h
Mar 216.4h
Mar 227.5h
Mar 239.5h
Mar 240.2h
home-app
homelab
private-ecosystem

Time Investment by Topic Human AI
Widgets & Features (13 widgets)
20h 2m / 18h 52m
Infrastructure (Auth+Caddy+CI/CD)
17h 43m / 7h 30m
Android App (StataApp)
4h 59m / 9h 41m
Onboarding Wizard
4h 35m / 6h 10m
Web Component (StataBar)
2h 19m / 3h 29m
Backend API (StataAPI)
1h 32m / 4h 57m
Architecture & Planning
1h 46m / 6h 47m
Time investment by category. Infrastructure is human-heavy (air-gapped relay). API and planning are AI-heavy (spec-driven autonomy).

Multiple Workspaces
🔒
Proxmox host terminal
homelab
air-gapped
I specifically do not want Claude on this host. Claude writes scripts, I review them and press enter, paste output back.
  • High ceremony per action
  • 453 auth msgs / 427 Caddy msgs despite low error rates
  • Infrastructure ops only
●
Proxmox CT (tmux server)
private-ecosystem
slow-burn
Prompt something and go make dinner. Long-running autonomous work while I'm away from the desk.
  • Blue/green deploys via Forgejo CI
  • 316 consecutive AI messages (config)
  • 267 consecutive AI messages (holidays)
●
WSL2 (powerful desktop)
home-app
horsepower
Rapid work that needs CPU. Parallel agent spawning, Playwright screenshots, Android emulator, multi-agent coordination.
  • Architect's desk: specs drive implementation
  • Sub-agent dispatch hub
  • Playwright + ADB for visual verification
Three workspaces, three different needs. The homelab is high-ceremony because I don't want Claude on the hypervisor. The tmux server is for slow-burn work I can walk away from. The desktop is where rapid parallel work happens.

Phase 1: Vision Day | Mar 3-4 | Sessions 1-2 | The entire feature set specified before a line of implementation code

Interview-Driven Design​

I started the way I usually do when I have a vague idea and too many possibilities: I told Claude to interview me.

Session
Opening design session: Brian drives the architecture through structured self-interview
>this is pretty cool. yeah, init this repo. but before we start let's also think about: 1. interfaces 2. design of widgets/app 3. design of menu bar 4. anything else critical. interview me to think this through.

What followed was the full system design: a Rust API backend (StataAPI) with a host-driven plugin architecture, a TypeScript web component (StataBar) injected into every authenticated page via Caddy's HTML rewriting, an Android app (StataApp) with Kotlin/Compose and Glance homescreen widgets, and an onboarding wizard for non-technical family members.

I pasted my entire Dashy config: every service, every widget, every exchange rate pair. Then I started making decisions: plugins are passive data adapters, not autonomous actors. The host owns caching, HTTP, error handling. Plugins declare routes and transform data. I wanted this specifically because it makes testing straightforward: mock the host, not HTTP.

The plugin interface is small by design:

/// A data plugin declares its routes and how to parse upstream responses.
/// Plugins are passive — they never make HTTP calls directly.
pub trait DataPlugin<F: Fetcher>: Send + Sync {
fn name(&self) -> &str;
fn prefix(&self) -> &str;
fn routes(&self, state: AppState<F>) -> Router;
}

And the Fetcher trait that makes it all testable — object-safe via boxed futures so we can use Arc<dyn Fetcher> in AppState:

pub trait Fetcher: Send + Sync {
fn get(&self, url: &str)
-> Pin<Box<dyn Future<Output = Result<FetchResponse>> + Send + '_>>;
}

The monorepo structure reflected these boundaries:

stataapi/      — Rust/Axum backend (plugin host + 17 plugins)
statabar/ — TypeScript web component (Shadow DOM, zero npm deps)
stataapp/ — Kotlin/Compose + Glance widgets
gvl-onboard/ — Rust/Axum onboarding wizard
specs/ — Design specs that drive everything above
features/ — Per-widget feature specs
agentic.md — How Claude agent teams should operate

The Agentic Spec​

Before any implementation, I wrote specs/agentic.md, a document defining how Claude agent teams should operate. Model selection rules: Sonnet for routine tasks and log parsing, Opus for architecture. Coordination protocols. What not to do. When to stop and ask.

Session
Brian's approach to AI team management
>Don't spawn a sub-agent to read one file -- just read it. why not? I would have thought it was still cheaper. is the overhead that bad?

I have management experience and it probably helps me think about how to break up work and context-window overflow — which is oddly similar to managing teams with limited bandwidth. But the techniques get different parameters with agents. I give agents less training and more supervision, more guard rails about what to do. I can't evolve an agent to one day become a manager, but I can create a manager that handles some slice of complexity for me. It's different, but some skills overlap.

The Massive Build Session​

Session 2 was 324 messages. I launched agentic teams in waves: framework agents first (one per system: API, sidebar, app), then feature agents cross-system (weather, transit, baby, portfolio, holidays, garbage, timezone), with an architect agent reviewing plans before approval. The monorepo scaffolded in a day: Rust API with 17 passing tests, TypeScript sidebar with Shadow DOM isolation, Android app with 7 Glance widgets, and a marketing page with Playwright-generated screenshots.

Session
Brian rejecting premature implementation
>no, first examine all your specs. let's think about what's missing across various topics that make a spec good quality. design, software, concept, experience, the nuanced tricky decisions

Seeing all the screenshots and the flow just working was genuinely exciting. The defaults seemed to land, which was really cool — the system looked like a real product without me fiddling with every pixel.

Phase 2: Infrastructure Sprint | Mar 11-13 | Sessions 3-10 | The air-gapped relay, Zitadel OIDC, domain migration

The Relay Tax​

The homelab workspace is where this project diverges from every other case study I've written. I specifically do not want Claude on my Proxmox host. There's no tmux session, no direct file access. I am the relay.

Claude generates pct exec commands. I review them, run them on the host terminal, and paste the output back. Every action has ceremony: read the command, evaluate whether it's safe, execute, copy output, paste, wait for analysis, repeat. This is why Auth (453 messages) and Caddy (427 messages) were the two biggest message-count topics despite having among the lowest error rates (0.1 errors per message). The messages weren't fixing problems. They were the cost of operating through a human relay.

Session
Brian acting as the operations relay for infrastructure work
>pct exec xxx -- caddy validate --config /etc/caddy/Caddyfile pct exec xxx -- systemctl restart caddy 2026/03/11 11:22:09.623 INFO using config from file {"file": "/etc/caddy/Caddyfile"}

I considered giving Claude direct access, but Claude made some mistakes I would not want to go chase after cleaning up in my production hypervisor. I think infrastructure-as-code with an ephemeral environment would have let me unlock Claude to just run in a loop and deploy cleanly, saving hours. But I don't have it, and setting that up costs time itself. Any business that regularly changes infrastructure should invest in that. My needs aren't big enough to justify it — so I stayed the relay.

Zitadel: Doing It Right​

The old auth stack was worse than a layer cake: Internet → Caddy (host) → Nginx (host) → BunkerWeb (its own container) + Authelia (its own container) → destination service. For the new system I chose Zitadel, a proper OIDC identity provider, and Caddy with the caddy-security plugin, collapsing all those layers.

The .home TLD caused real problems. It's a reserved TLD, but not all software handles it correctly, especially on tailnet where DNS resolution has its own opinions. Claude kept suggesting header workarounds and database modifications.

Session
Brian rejecting shortcuts during Zitadel setup
>stop pushing me there, I want to fix this the right way

In the end I bought a .com domain and ran everything from that. I automated OIDC app creation for all apps with a shell script (create-oidc-app.sh) rather than clicking through the UI for each of the 8+ services: Immich, Ghostfolio, Vaultwarden, Baby Buddy, Open WebUI, Tandoor, BookLore, and more.

The Domain Migration​

Mid-project, I decided to migrate everything from *.gvl.home (internal step-CA, only works on the tailnet) to the family domain with real Let's Encrypt certificates. The internal CA had been causing trust headaches on Android and new devices, and I was maintaining split identity across two domains.

Session
Strategic timing for the migration
>Nobody is actively using the services yet, so now is the time.

I wrote six migration scripts (phase0-prep.sh through phase5-cleanup.sh) and executed them while simultaneously debugging breakage: BunkerWeb 403s, Headscale crashes, SSL cert spam from Caddy. Every service's config had to change. It was a single intense day on the homelab, all through the relay pattern.

I had to review everything. There were elements of blind trust if I knew the error was easily reversible. Having 3-2-1 backups helps — you can be bolder when you know you can roll back.

Phase 3: The Parallel Grind | Mar 16-21 | Sessions 11-25 | Peak multiplexing, feature development, trust profiles in action

69 Switches in a Day​

March 20 was the peak: 69 context switches between home-app and private-ecosystem in a single day. This wasn't project-to-project multiplexing like my other work. This was switching between workspaces within the same system. Different projects going on with different context setups per host. Slow-burn stuff on tmux, rapid stuff that needed horsepower on the big desktop.

Trust Profiles in Action​

This is where the three workspaces revealed their true characters:

The tmux server (private-ecosystem) was fire-and-forget. Config/preferences: 316 consecutive AI messages without my input. Holidays widget: 267. StataAPI: 159. Baby monitoring: 120. I'd prompt something, go make dinner, come back to a completed feature with tests passing and a CI deploy queued.

The desktop (home-app) was the coordination hub. I launched parallel sub-agents for CPU-intensive work: Playwright capturing screenshots, the Android emulator running widget tests, multiple feature agents working simultaneously. This is where the agentic spec paid off. Agents knew their roles, their model selection, their boundaries.

The homelab stayed high-ceremony. Every Caddy config change, every Zitadel tweak, every DNS record. All through the relay. Slow but controlled.

The "sleep 5 minutes" pattern was more of a hack to stop Claude from stomping over CD jobs that I wanted to complete, or working around the 5-hour session limit. It wasn't really about autonomous repair — it was about pacing.

The Features​

Honestly, I could release several of these as stand-alone apps. Each widget is its own product. Here's what made them interesting:

Transit: The old Dashy setup proxied BVG transit data through Node.js. The new version hits the BVG API directly with a background cache heater that keeps data not just cached but fresh. It's aware of where I was and what bus stations are near me, refreshing those stops continuously. 50ms loads vs. the laggy experience you're used to with usual travel apps. Location-aware, always warm.

Weather: Not just temperature and rain. UV index, sunglasses advisory, asthma triggers, live radar. Information-dense by design. I wanted to glance at my phone and know whether to pack an umbrella, wear sunscreen, or warn my wife about high pollen. All data from DWD (German Weather Service), no third-party intermediaries.

Baby monitoring: Probabilistic curves for feeding and sleep predictions. Trend detection. I looked into using a dataset of 300+ infants to improve the model, but the agency who provides it wanted proof of HIPAA training, and I decided the paperwork wasn't worth it.

Session
Brian iterating on baby prediction visualization
>predictions need some kind of +/- probability thing, can we do that? does it make sense to do it?
>big improvement. Am I missing anything key? regarding prediction boxes: can we make them more like a probability curve instead of a box? ramp up towards the predicted time?

Portfolio: Alpha and beta against benchmark index, sparkline charts, holdings breakdown. Data pulled directly from Ghostfolio's API.

Exchange rates: ECB official rates with smart cache warming: starts polling at 16:00 CET on weekdays, retries every 5 minutes until the daily rate publishes.

Baby, weather, portfolio, transit. All awesome. The weather widget gets the most daily use — it's on the homescreen.

The Asymmetric Bets​

The time data reveals something about how I use AI for unfamiliar territory:

AreaBrian's TimeClaude's TimeRatio
StataAPI (Rust, familiar)1h 32m4h 57m1:3.2
StataApp (Android, zero experience)4h 59m9h 41m1:1.9
Architecture & Planning1h 46m6h 47m1:3.8
Onboarding Wizard4h 35m6h 10m1:1.3

The things I knew least about got disproportionate AI investment. Android development (Kotlin, Compose, Glance widgets) was entirely new to me. I'd never built a mobile app. The 5h/10h split means I spent about one hour per widget concept, and Claude handled the Kotlin implementation, the Gradle configuration, the Glance layout constraints, all of it.

Planning shows the inverse pattern: 1h 46m of my time produced 6h 47m of AI execution. The specs were force multipliers.

I have no idea how to program Android or Kotlin. I gave a general look at the code and it was "good code" — but I'm not experienced enough to tell if it's "good Android code." I can leverage my deep programming experience on backend and frontend to tell if code is generally well-structured. It seemed fine.

There were, however, regular issues where Claude wasn't adopting community best practices — which led to a lot of annoying bugs: data refresh not working, Glance widgets not rendering, things hidden from view, auth token issues. It felt like Claude was trying to write code instead of write correct code. I had to redirect it to research and adopt best practices, and after that things moved much smoother.

Phase 4: Polish and Onboarding | Mar 22-23 | Sessions 26-30 | The luxury onboarding wizard, wife onboards, bug blitz

The Luxury Nobody Asked For​

At some point I decided the onboarding experience should be absurdly good. Four languages: English, German, Polish, Hungarian, because my family spans four countries. A step-by-step wizard: join the VPN, install F-Droid, create your Zitadel account, discover your apps. Video recordings with click annotations showing exactly where to tap.

Session
Brian's rationale for over-engineering the onboarding
>Why not make a luxury onboarding process?

Claude recorded the onboarding videos autonomously, driving Playwright to capture screen recordings of each step, overlaying click annotations, converting with ffmpeg. I reviewed the output and picked the good takes.

Session
Brian reviewing onboarding video captures
>http://localhost:8890/fdroid-overlaid2.mp4 http://localhost:8890/tailscale-setup.mp4 these are the good ones. I installed ffmpeg for you to do some kind of conversion before putting them in onboarding.

I replaced the generated emoji icons with 2-char monograms. Emojis are AI-kitsch at this point — everyone sees them and thinks "ugh, more AI slop." It was annoying to me even before AI, honestly.

The Real Test​

I ran the full onboarding flow through the Android emulator end-to-end, then had my wife go through it on real hardware.

Session
Brian setting up the real-world test
>you will test my onboarding workflow inside adb for real, and verify it works by telling me what you can see on the app. if you need to show an image to me, you can take a screenshot and run a local webserver on localhost:10001 and give me the full http url to view it on.

Eight bugs surfaced during install. Claude fixed them with minimal oversight. The tmux server at work. For the public-facing case study and marketing page, I made sure screenshots used example.com instead of the real family domain, and fake names instead of real family members.

Session
Privacy awareness during screenshot generation
>dashboard screenshot, just have 1 category for the cards called services. More interested in seeing the part where we scroll a bit below the fold too, because it has all the apps in it. On onboarding, don't use [real family names] anywhere, make up a fake name like max mustermann or something.

She likes it. She needs to get used to all the new UI, but she uses it daily — and I know she's using it because if she gets logged out unexpectedly when I change something in Zitadel, she tells me.


Scope Expansion Timeline
WidgetsInfrastructureApplicationsBackendWebPlanningCircle size = message count
Mar 315 topics on day 1
Mar 4
Mar 10Docs/marketing page
Mar 12Onboarding + migration + 4 new features
Mar 16Weather widget
Mar 19Postal tracking
Mar 20Lock screen
Claude config
Specs/planning
StataAPI (Rust)
StataBar
StataApp (Android)
Caddy reverse proxy
Transit widget
Garbage collection
Timezone widget
Exchange rates
Holidays widget
Portfolio widget
Baby monitoring
Service status
Auth (Zitadel/OIDC)
CI/CD (Forgejo)
Documentation/demos
Onboarding wizard
AI chat integration
Domain migration
Brian office widget
Config/preferences
Weather widget
Postal/DHL tracking
Lock screen
15 of 25 topics specified on day 1. Scope expanded across 7 distinct dates as each working layer enabled the next ambitious addition.

The Agent Waves​

Agent Spawn Tree — 530 launches across 27 sessions
▶Mar 03 — home-app (a1652bb0)4
▶Mar 04 — home-app (c937febf)68+28
▶Mar 11 — homelab (64ecd861)6
▶Mar 12 — homelab (a85690e2)11
▶Mar 12 — homelab (b2b41e0a)14
▶Mar 12 — homelab (f9f436bc)2
▶Mar 12 — homelab (ffd9ee3d)9
▶Mar 13 — home-app (ed8de299)17
▶Mar 13 — homelab (1a6c19dc)3
▶Mar 13 — private-ecosystem (be32eb24)12
▶Mar 16 — private-ecosystem (930eac70)42
▶Mar 17 — home-app (2ef1d66f)18
▶Mar 17 — home-app (bdc0b6aa)11
▶Mar 18 — home-app (f3b196eb)32
▶Mar 20 — home-app (3ae4ae28)15
▶Mar 20 — home-app (c8b6dadd)39
▶Mar 20 — private-ecosystem (5e439120)4
▶Mar 20 — private-ecosystem (7ac2eccf)8
▶Mar 20 — private-ecosystem (e40fb931)82+13
▶Mar 21 — home-app (bab8e9ee)50+10
▶Mar 21 — private-ecosystem (9482b6e8)12
▶Mar 21 — private-ecosystem (e8103a96)8
▶Mar 22 — private-ecosystem (6900c3c7)16
▶Mar 22 — private-ecosystem (dd2448ff)8
▶Mar 23 — private-ecosystem (1500a64a)1
▶Mar 23 — private-ecosystem (51ff28d7)4
▶Mar 23 — private-ecosystem (f7e26878)34
sonnet (58) opus (471) haiku (1) home-app homelab private-ecosystem
Every agent spawned across the project. Click a session to see its spawn tree. Nested agents = agents that themselves spawned further agents.

What This Shows​

The Relay Tax

Infrastructure work wasn't harder, it was slower. Auth and Caddy had the highest message counts (453 and 427) despite the lowest error rates (0.1 per message). The messages weren't fixing bugs, they were the cost of operating through a human relay: Claude writes the command, I evaluate it, I press enter, I paste the output back. This is a real constraint of AI-assisted operations. Claude can write a perfect Caddyfile, but someone still has to systemctl reload caddy on the production host.

Spec-Driven Autonomy

1 hour 46 minutes of planning produced 6 hours 47 minutes of AI execution. But it's not just the ratio, it's what the specs enabled. The autonomous chains (100-316 consecutive AI messages) happened on the tmux server, where Claude had file access and could run tests. Those chains were only possible because the specs defined the plugin architecture, the data contracts, the error handling patterns, and the testing expectations. Without the specs, autonomy would have been chaos.

Asymmetric Investment

The areas where I had the least experience got the most AI leverage. Android development: zero prior experience, 5 hours of my time, 10 hours of Claude's. StataAPI in Rust: familiar territory, but the plugin architecture meant Claude could implement 17 plugins while I designed the host interface. The pattern isn't "AI does the hard parts." It's "AI does the parts where my time-to-competence would be highest."

Scope Expansion as Confidence

I didn't plan the domain migration at the start. I didn't plan the luxury onboarding wizard. I didn't plan canvas-based weathergraphs or probabilistic baby feeding curves. Each of these emerged after a previous layer worked. The domain migration happened because Zitadel was stable. The onboarding happened because the app was ready. The prediction curves happened because the Baby Buddy integration worked. Scope expanded not from feature creep but from earned confidence. Each working layer made the next ambitious thing seem achievable.

Nothing Was Individually Hard

No topic exceeded 1.5 errors per message. Auth: 0.1. Caddy: 0.1. Weather: 0.1. Transit: 0.1. The challenge was never a single hard problem. It was breadth: approximately 20 concurrent feature surfaces, each with their own data source, API contract, caching strategy, widget layout, and deployment path. Managing that breadth, across three workspaces, four languages, and 18 upstream services, is where the agentic approach and the spec-driven architecture paid off. No individual piece was beyond what a competent developer could build manually. The system as a whole, in three weeks, would not have existed without this workflow.

Digital Sovereignty

A thread running through the whole project: every data source is official and direct. Exchange rates from the ECB. Weather from DWD. Transit from BVG. No third-party aggregators, no ad-supported APIs, no data brokers. Family photos behind an encrypted Tailnet VPN on self-hosted Immich, not iCloud or Google Photos.

This is what digital sovereignty looks like. Free to use computers without someone looking to harvest my digital life for power and profit. And I can extend that to my entire family.

Now that I have so much infrastructure in place, extending is even easier. I can add an Element server for cross-family private chats that don't get harvested by Meta. A shared family wiki with private documents that don't sit on a Google-owned server somewhere. The foundation is built. Every new service is just another container behind the same auth, the same VPN, the same family domain.

Build Cost Comparison​

Adjust all rates:1.0x
Traditional Build
4 specialists + PM, no AI assistance, 2026 tooling
1 130 person-hours 14 weeks calendar(4 devs parallel)5 people full-time
▶Research & Discovery100hblended€11 500
▶Rust Developer375h€125/h€46 900
▶Android Developer280h€115/h€32 200
▶Frontend Developer165h€105/h€17 300
▶DevOps Engineer140h€115/h€16 100
▶PM / Architect70h€125/h€8 750
TOTAL1 130h€132 750
Rates: 2026 Western European freelancer rates
Timeline assumes 4 developers working in parallel
Research hours distributed across team but shown separately
AI-Augmented Build
1 agentic developer + Claude Code (Opus + Sonnet)
53 person-hours+ 58h AI execution3 weeks calendar(~2.5h/day avg)1 person part-time+ 530 sub-agents
▶Widgets & Features (13 widgets)20h€120/h€2 400
▶Infrastructure (Auth + Caddy + CI/CD)18h€120/h€2 160
▶Android App (zero prior experience)5h€120/h€600
▶Onboarding Wizard4.5h€120/h€540
▶StataBar + StataAPI4h€120/h€480
▶Architecture & Planning1.75h€120/h€210
TOTAL53h€6 390
Agentic developer rate: €120/h (senior engineer market rate)
53h human time produced 58h of AI execution time
530 sub-agents launched, 111 parallel waves
Research time near-zero: Claude researches APIs, reads docs, prototypes in-context
Click any line to expand. Traditional build assumes competent specialists with 2026 tooling but no AI. AI-augmented build shows Brian's actual measured time per topic.

A friend I showed this to thought I could sell it. I'm not convinced it's a business. It's a desirable product, but perhaps not profitable. Ultra-high-net-worth individuals spend millions to get custom apps developed for their extended families — if you scoped that concept down to my life, this app fits. I think I'm at the lower end of people who could pay a profitable business for this kind of service. I'd have to target people with 8-digit net worth willing to pay over 10k a year once you factor in hosting, around-the-clock support, and business operations. Possible but challenging. The 90% of people who could benefit but not afford 10k/year would need to be a programmer with deep experience who's willing to adopt tech support for their entire family. Not something for many.

This isn't about high engagement or mass market adoption. So much tech is geared towards that. This is about focused life improvement in small ways with high quality for the people closest to me.