Projekt · 01
Status: RozwijanyCzy warto iść na ryby?
Planer wędkarski dla Koszalina i okolic, postawiony na moim serwerze. Dla wybranego łowiska i gatunku ocenia warunki od 0 do 100, tłumaczy każdy czynnik, wskazuje najlepsze godziny w ciągu dnia i daje prognozę na 7 dni. Łowiska morskie mają dodatkowy tryb z falą i oceną bezpieczeństwa.

01 · Problem
Co trzeba było rozwiązać
Aplikacje pogodowe pokazują liczby, a nie odpowiedź. Pytanie jest prostsze: czy warto iść dziś, o której dokładnie i dlaczego. Do tego odpowiedź musi być taka sama na telefonie i na komputerze.
02 · Rozwiązanie
Jak to działa
API na Fastify z PostgreSQL trzyma konta, łowiska i ustawienia. Tylko serwer rozmawia z Open-Meteo i przez 15 minut trzyma prognozę każdego łowiska w cache'u. Aplikacja w React (PWA) pokazuje wynik deterministycznego, opisanego algorytmu: osiem czynników z wagami, reguły gatunkowe ograniczone do ±12 punktów i okna czasowe cięte do najwyżej czterech godzin.
03 · Funkcje
Co potrafi
- Konta z hasłami w bcrypt i sesją w ciasteczku httpOnly; tokeny sesji zapisane jako HMAC
- Łowiska i ustawienia zapisane przy koncie i dostępne na każdym urządzeniu
- Ocena z 8 czynników z wagami, a dla morza także z fali, jeśli są dane
- Najlepsze okna czasowe na dziś i prognoza na 7 dni z rozwijanymi szczegółami
- PWA do zainstalowania na telefonie, z cache'em interfejsu i trybem tylko do odczytu offline
04 · Technologie
Zbudowane z
- TypeScript
- Fastify
- PostgreSQL
- React
- Vitest
- Docker
- Status
- Rozwijany
- Kod
- github.com/KacperBlok1/fishing-forecast-koszalin
- Demo
- Nie ma wersji online · uruchom lokalnie
05 · Wyzwania
Co było trudne
Gdy Open-Meteo nie działa
Prognozy są trzymane w PostgreSQL: świeże przez 15 minut, awaryjne przez 24 godziny. Jeśli Open-Meteo nie odpowiada, serwer oddaje ostatnią poprawną odpowiedź, a aplikacja pokazuje, sprzed ilu godzin pochodzą dane. Brak danych o fali jest pokazywany wprost, a nie zgadywany.
Strefy czasowe
Open-Meteo zwraca czas lokalny łowiska bez strefy. Aplikacja pracuje na tych napisach zamiast przeliczać je zegarem przeglądarki, więc świt wypada o dobrej godzinie nawet wtedy, gdy telefon ma ustawioną inną strefę.
Ocena całego dnia
Prawie każdy dzień ma jedną dobrą godzinę o świcie, więc sama najlepsza godzina sprawiała, że wszystkie dni wyglądały podobnie. Ocena dnia to 65% najlepszego okna i 35% średniej z godzin dziennych.
06 · Zrzuty ekranu
Jak to wygląda
Wypróbuj
Uruchom lokalnie
Nie ma jeszcze wersji online. Kod i README są na GitHubie, a te polecenia uruchamiają projekt z głównego katalogu repozytorium.
$ cp .env.example .env
# uzupełnij POSTGRES_PASSWORD i SESSION_SECRET
$ docker compose up -d --build
$ curl http://localhost:8090/api/health