Przejdź do treści
Wszystkie projekty

Projekt · 01

Status: Rozwijany

Czy 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.

Planer wędkarski z oceną, rozbiciem na czynniki i trendem z 3 dni

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

  1. 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.

  2. 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ę.

  3. 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

Planer wędkarski: ocena 95/100 dla szczupaka, rozbicie na czynniki i trend z 3 dni
Zakładka „Teraz”: ocena, rozbicie na czynniki i trend z 3 dniOtwórz obraz w pełnym rozmiarze ↗

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.

terminal
$ cp .env.example .env
# uzupełnij POSTGRES_PASSWORD i SESSION_SECRET
$ docker compose up -d --build
$ curl http://localhost:8090/api/health