Portfolio/Soukromé
Private project logo

Weather InTouch

Full-stack platforma pro předpověď počasí postavená na proaktivních výstrahách a automatizacích, ne na pouhém pasivním zobrazování dat. Weather InTouch kombinuje páteř z otevřených dat zdarma s cachovací vrstvou řízenou náklady, která deduplikuje placená volání weather API napříč všemi uživateli. Běží v produkci jako B2C webová aplikace — živé karty počasí, oficiální výstrahy ze sedmi národních zdrojů, watchdog automatizace, AI asistent počasí a Stripe billing — kterou doplňuje vícejazyčný marketingový web a blog ve 20 jazycích. Vkládatelný white-label widget je hotový a postupně se zavádí; nativní shell pro iOS/Android (Capacitor) čeká na vydání do obchodů.

Architektura produktu a návrh monorepa
Full-stack vývoj (Angular 22 + NestJS 11)
Engine pro kontrolu nákladů (dvouvrstvý single-flight + Redis)
Sdílený DTO balíček jako jediný zdroj pravdy
Autentizace (Apple Sign-in + Google OAuth, token-on-backend)
Stripe billing (tarify Free / Plus / Pro)
Oficiální výstrahy počasí ze sedmi národních zdrojů (NWS, ČHMÚ, DWD, MET Norway, MSC, IMD, Irsko)
Watchdog pravidla s doručováním více kanály (e-mail, Telegram, webhook, push)
AI asistent, plánovač výletů a kompilátor pravidel z přirozeného jazyka (Google Gemini)
Integrace chytré domácnosti Loxone s API klíči pro jednotlivé klienty
Vkládatelný white-label widget (web komponenta Angular Elements + iframe)
Capacitor shell pro iOS/Android (geolokace, push, přihlášení přes sociální sítě)
Vícejazyčný SSG marketingový web a blog (20 jazyků)
CI/CD pipelines (GitHub Actions)
Období: 2026 – současnost
Role: Zakladatel, produktový architekt a full-stack vývojář
Navštívit projekt

Technologie

Angular TypeScript Tailwind NestJS MongoDB Redis RxJS Leaflet Capacitor Stripe Node.js Google Gemini API

Architektura a kontext dodávky

Problém

Většina produktů s počasím končí u hezkých ikonek. Lidé neplatí za to, aby se na počasí dívali — platí za to, aby byli včas varováni nebo aby se za ně něco automaticky vyřešilo. Placená weather API se navíc účtují za každé volání, takže každá služba, která škáluje na mnoho uživatelů a lokalit, riskuje neúnosné náklady, pokud requesty agresivně nededuplikuje.

Přístup

Weather InTouch je TypeScriptové monorepo postavené na dvou myšlenkách: proaktivní hodnota (oficiální výstrahy, watchdog pravidla, automatizace a webhooky) a důsledná kontrola nákladů. Datovou páteř tvoří Open-Meteo zdarma, která pokrývá většinu předpovědi; volitelný placený OpenWeather overlay doplňuje prémiové aktuální podmínky — zapíná se přítomností placeného API klíče a volá se best-effort, takže produkt elegantně degraduje na bezplatnou páteř, když placený zdroj není dostupný.

Architektura produktu

Produkt zahrnuje tři aplikace v jednom npm-workspaces monorepu, které sdílejí jediný zdroj pravdy pro datové tvary:

1. Webová aplikace (app.weatherintouch.com)

Angular 22 SPA se zoneless, OnPush a standalone komponentami. Bezstavové karty počasí (aktuální podmínky, vícedenní předpověď, hodinový multivariační graf, meteoradar) přijímají data jako vstupy; jediná API služba proxuje na backend. Zážitek doplňují data o kvalitě ovzduší a pylech, oficiální výstrahy a uložené oblíbené lokality.

2. Backend API (api.weatherintouch.com)

NestJS 11 + Mongoose služba, která vlastní veškerý přístup k placeným API, autentizaci i billing. Apple Sign-in a Google OAuth využívají token-on-backend vzor; přístupové a refresh JWT tokeny se vydávají na serveru. Tarify Free / Plus / Pro pohání Stripe.

3. Marketingový web a blog (weatherintouch.com)

Vlastní TypeScriptový generátor statického webu, který z Markdownu a frontmatteru vytváří HTML přeložené do 20 jazyků pipeline nad Google Gemini.

Engine pro kontrolu nákladů

Klíčovou inovací je dvouvrstvý single-flight cache. Requesty se klíčují podle souřadnic zaokrouhlených na čtyři desetinná místa (mřížka ~11 m), takže blízcí uživatelé sdílejí jeden záznam v cache. In-process promise mapa sloučí souběžné requesty uvnitř jednoho Node procesu a Redis zámek SET NX (s Lua check-and-delete) je koordinuje napříč replikami. Ten, kdo zámek nezíská, místo volání placeného API počká na čerstvě nacachovaný výsledek. Spolu se stale-while-revalidate se tak placené weather API zavolá zhruba jednou za lokalitu za TTL (výchozí 30 minut), což drží marže blízko nule i při škálování tenant-agnostického widgetu.

Obchodní model

  • B2C předplatné (Free / Plus / Pro) přes Stripe
  • B2B licencování white-label widgetu — vkládatelná bezstavová karta aktuálního počasí pro cizí weby, obsluhovaná ze stejné sdílené cache
  • API pro automatizace a webhooky (developer tarif) — když počasí splní pravidlo, spustí se webhook, např. pro IoT a Home Assistant

Stav

Běží v produkci. Webová aplikace, backend API i vícejazyčný marketingový web jsou nasazené (app / api / weatherintouch.com). Dnes běží: autentizace (Apple/Google) se serverovou rotací JWT, Stripe billing Free/Plus/Pro, dvouvrstvá cache pro kontrolu nákladů, kompletní sada karet počasí (aktuální podmínky, šestidenní i 168hodinová předpověď, hodinový multivariační graf, meteoradar, mapa POI, kvalita ovzduší a pyly), oficiální výstrahy ze sedmi národních zdrojů (NWS, ČHMÚ, DWD, MET Norway, MSC Kanada, IMD Indie, Irsko), watchdog pravidla s doručováním více kanály (e-mail, Telegram, webhook, push), AI asistent, plánovač výletů a kompilátor pravidel z přirozeného jazyka (Gemini), integrace chytré domácnosti Loxone s API klíči pro jednotlivé klienty a uložené oblíbené lokality. Vkládatelná white-label web komponenta (Angular Elements + iframe, klíčovaná per-tenant) je hotová a čeká na nasazení přes CDN; Capacitor shell pro iOS/Android (geolokace, push, přihlášení přes sociální sítě) je připravený a čeká na publikaci do obchodů. Na roadmapě zůstává: kvóty widgetu per-tenant, další cíle chytré domácnosti (Home Assistant, KNX) a administrátorská konzole pro zdraví integrací.

Kontaktní informace

Klidně se mi ozvěte ohledně nového projektu, konzultace nebo dlouhodobější spolupráce. Rád proberu smysluplné produktové zadání i zajímavé frontendové příležitosti.

Napište mi

© 2026 Martin Hubálek. Všechna práva vyhrazena.