dkodr.pl

Busek

Rozkład jazdy komunikacji miejskiej jako progresywna aplikacja webowa: obsługa jedną ręką, praca bez sieci, pozycje pojazdów z otwartego feedu.

Najbliższe odjazdy, autobusy na żywo, wyszukiwarka połączeń z adresu na adres, tryb offline i trzy języki. Pierwsze wdrożenie działa w Kościanie. Poniżej: co dokładnie robi i jak jest zbudowana.

Rola
Pomysł, projekt, kod, wdrożenie, utrzymanie
Miasto
Kościan, woj. wielkopolskie
Od
kwiecień 2026
Adres
busek.pl/koscian
Status
Działa i jest utrzymywana
kontekst

Skąd się wzięła

1 kwietnia 2026

Kościańska Komunikacja Publiczna ruszyła 1 kwietnia 2026 roku. Rozkłady istniały od pierwszego dnia — w plikach PDF na stronie urzędu i na słupkach przystankowych. Nie istniało natomiast nic, co odpowiadałoby na pytanie, o której konkretny autobus podjedzie na konkretny przystanek.

Busek zaczął się od tego jednego pytania i rozrósł do pełnej aplikacji miejskiej. Powstał obok urzędu, nie na jego zlecenie, i działa dziś pod adresem busek.pl/koscian.

Wszystkie zrzuty na tej stronie pochodzą z działającej produkcji, nie z projektu graficznego.

Linia 1 · zielona Linia 2 · różowa Linia 5 · błękitna, sezonowa
Słupek przystankowy z tabliczką rozkładu — punkt wyjścia: godziny dostępne wyłącznie na przystanku i w PDF-ie ROZKŁAD JAZDY 532 617 702 47 847 932 1017

Punkt wyjścia: godziny dostępne wyłącznie na słupku i w PDF-ie.

/pl

Najbliższe odjazdy

ekran startowy

Pierwsze, co widać po otwarciu: trzy kolejne odjazdy z przystanku, przy którym mieszkaniec stoi, z odliczaniem „za 14 min” i podziałem na kierunki. Nad nimi wyszukiwarka i skróty do linii; nic nie wymaga logowania ani wchodzenia w podstrony.

Wybrany przystanek i zestaw linii zostają zapamiętane w przeglądarce, więc przy kolejnej wizycie nie trzeba klikać niczego. Gdy przewoźnik zmieni nazwę przystanku, stary zapis jest tłumaczony na aktualny, więc zakładka nigdy nie prowadzi w pustkę.

Pamięć
Przystanek i linie zapisane lokalnie, bez zakładania konta
Instalacja
Baner „dodaj do ekranu” z osobną instrukcją dla iPhone’a
Odporność
Automatyczne mapowanie starych identyfikatorów przystanków
Ekran główny aplikacji Busek: wyszukiwarka połączeń, kafle linii i lista najbliższych odjazdów. Ekran główny aplikacji Busek w trybie ciemnym.
/pl/rozklad

Rozkład jazdy

3 linie · 50 przystanków

Cała trasa linii w kolejności przejazdu, z mapą i z przystankami odwiedzanymi w pętli dwukrotnie, oznaczonymi ① i ②. Po wybraniu przystanku widać trzy najbliższe kursy, a pod przyciskiem pełną tabelę godzin, tę samą co na słupku.

Wybór linii i przystanku ląduje w adresie strony, więc rozkład da się komuś wysłać linkiem, a przycisk „wstecz” działa zgodnie z oczekiwaniem. Gdy linia danego dnia nie kursuje, rozkład nadal jest widoczny, z wyraźną adnotacją zamiast udawanych godzin.

Linie
Dwie całoroczne i sezonowa weekendowa na plażę nad Jeziorem Wonieść
Mapa
Prawdziwe przebiegi tras po sieci drogowej, nie linie proste
Tabela
Klasyczna siatka godzina × minuty z podświetlonym najbliższym kursem
Rozkład Linii 1: mapa z przebiegiem trasy, najbliższy odjazd 11:22 i lista przystanków. Tabela godzin odjazdów z przystanku ul. Śmigielska, z podziałem na dni robocze i soboty.
/pl/live

Autobusy na żywo

odświeżanie co 20 s

Zamiast planowej godziny mieszkaniec dostaje realny czas dojazdu, liczony z pozycji konkretnego pojazdu: „za 39 min”, „na czas”, „spóźniony o 4 minuty”, „autobus na przystanku”. Pod spodem pozycja na mapie i oś całego kursu z kolejnymi przystankami.

Pozycje pochodzą z publicznego feedu GTFS-Realtime serwisu zbiorkom.live i są odświeżane co dwadzieścia sekund. Przy każdej informacji na żywo interfejs podaje źródło i czas ostatniego odczytu.

Najwięcej pracy kosztowały sytuacje, w których danych nie ma. Aplikacja rozróżnia „dziś nie kursuje”, „autobus już minął ten przystanek”, „chwilowy brak pozycji” i „jesteś offline” zamiast jednego ogólnego komunikatu o błędzie. Dane planowe i dane z GPS są w interfejsie rozdzielone, żeby prognoza nigdy nie wyglądała na potwierdzoną pozycję pojazdu.

Źródło
Publiczny feed GTFS-Realtime (zbiorkom.live), atrybucja widoczna w aplikacji
Świeżość
Pojazd bez odczytu dłużej niż 5 minut znika z mapy
Przypomnienie
Powiadomienie 5 minut przed przyjazdem, liczone z realnej pozycji
Śledzenie Linii 2 na żywo: licznik „za 39 min”, status „na czas” i mapa z pozycją autobusu. Oś czasu kursu: lista kolejnych przystanków z godzinami i zaznaczoną pozycją „tu jesteś”.
/pl/szukaj

Wyszukiwarka połączeń

z adresu na adres

Skąd–dokąd nie tylko z przystanku na przystanek: podpowiedzi adresów i miejsc pochodzą z OpenStreetMap i są ograniczone do Kościana z okolicą. Wynik zawiera dojście pieszo z policzonym dystansem i czasem, ewentualną przesiadkę i podgląd trasy na mapie.

Algorytm nie wybiera przystanku najbliższego, tylko najlepszy: porównuje kilku kandydatów i karze nadmierny spacer, więc czasem podpowie przystanek dalszy, za to z szybszym połączeniem. Warianty gorsze pod każdym względem są z wyników usuwane.

Pieszo
83 m/min, z poprawką na rzeczywisty przebieg ulic
Przesiadki
Do jednej, z oczekiwaniem nie dłuższym niż 60 minut
Tryb
„Wyjazd o” albo „przyjazd na”, z wyborem daty i godziny
Link
Całe zapytanie zapisane w adresie — wynik da się przesłać
Formularz wyszukiwania połączeń z wybranym punktem startowym, celem i otwartym wyborem daty. Wyniki wyszukiwania: sześć tras z godzinami odjazdu i przyjazdu oraz kolorowymi paskami linii. Rozwinięte połączenie: mapa trasy z punktami A i B oraz lista przystanków pośrednich.
PWA

PWA: offline i instalacja

bez sklepu z aplikacjami

Busek instaluje się na ekranie telefonu jak zwykła aplikacja, ale nie przechodzi przez żaden sklep. To PWA — progresywna aplikacja webowa. Przeglądarka czyta manifest z kompletem ikon, własnym kolorem motywu i trybem pełnoekranowym, a service worker zapisuje w pamięci urządzenia to, co ma działać bez sieci.

Rozkład i wyszukiwarka są zapisywane od razu przy instalacji, w trzech językach naraz. Dane rozkładowe są wkompilowane w aplikację, więc połączenie z adresu na adres liczy się lokalnie na telefonie — bez ani jednego zapytania do serwera.

Po utracie sieci pojawia się ekran Buska z drogą powrotu, a nie komunikat przeglądarki. Nie wszystko jest jednak zapisywane: mapa offline nie zadziała, bo kafelki OpenStreetMap zostały wykluczone z pamięci podręcznej ze względu na objętość.

Manifest
Tryb pełnoekranowy, własny kolor motywu, komplet ikon łącznie z maskowalną
Zapisane
Rozkład i wyszukiwarka w trzech językach; zasoby statyczne trzymane 30 dni
Nigdy z pamięci
Pozycje pojazdów — każde zapytanie idzie do serwera
Poza zapisem
Kafelki mapy i pliki reklam
Instrukcja
Kroki instalacji per przeglądarka i system opisane w samej aplikacji, w sekcji Info

§Pliki reklam są celowo wyłączone z pamięci podręcznej, żeby blokery reklam nie psuły instalacji aplikacji.

Ekran offline aplikacji Busek z komunikatem „Brak połączenia” i przyciskiem powrotu. Sekcja „Jak zainstalować aplikację” w Busku: kroki instalacji PWA dla Androida, iPhone’a i komputera.
/pl · /en · /uk

Języki i dostępność

592 klucze × 3

Polski, angielski i ukraiński: pełny interfejs w każdej wersji, łącznie z polityką prywatności, formularzami i komunikatami błędów. Nazwy przystanków zostają po polsku niezależnie od języka: mają brzmieć tak, żeby dało się o nie zapytać kierowcy.

Warstwa dostępności obejmuje link „przejdź do treści”, widoczny focus na każdym elemencie interaktywnym, komunikaty ogłaszane czytnikom ekranu przez aria-live, cele dotykowe w dolnej nawigacji nie mniejsze niż 44 piksele, honorowanie prefers-reduced-motion oraz motyw ustawiany przed pierwszym renderem, bez mignięcia bieli.

Tłumaczenia
Komplet 1 : 1, po 592 klucze w każdym z trzech języków
Adresy
Wszystkie z prefiksem języka, ścieżki po polsku
Motyw
Jasny i ciemny, z zapamiętaniem wyboru i domyślnym ustawieniem systemu
Ekran główny aplikacji Busek po angielsku: Find connection, Schedule, Next departures. Ekran główny aplikacji Busek po ukraińsku: Пошук з'єднання, Розклад руху.
pozostałe

Pozostałe funkcje

6 pozycji
Powiadomienia „Przypomnij 5 minut przed” — powiadomienie wyliczane z realnej pozycji autobusu, nie z rozkładu. Działa przy zamkniętej aplikacji i wygasa samo po sześciu godzinach.
Co nowego Dziennik zmian opisujący zmiany od strony użytkownika, nie commitów — 28 wpisów od kwietnia do lipca 2026. Nieprzeczytane oznacza kropka przy ikonie w nawigacji.
Informacje i bilety Ceny, zasady Kościańskiej Karty Mieszkańca, sposób zakupu biletu i najczęstsze pytania w aplikacji, a nie w załączniku na stronie urzędu.
Widżet dla urzędu Sam rozkład, bez mapy i banerów, do wklejenia w ramce na stronie miasta, z wyborem języka, motywu i linii startowej. Osadzenie ograniczone listą dozwolonych domen.
Reklamy lokalne Pasek na dole ekranu z rotacją kampanii lokalnych firm, osobnymi kreacjami na telefon i desktop oraz datami startu i końca. Rotacja losowana wagowo, bez powtórzenia tej samej kreacji na styku cykli.
Kontakt i prywatność Formularz z ochroną przed spamem, analityka bez ciasteczek i pełna polityka RODO z tabelą podstaw prawnych dla każdego celu osobno.
Strona „Co nowego”: wpis o busie na plażę, z podziałem na nowości, zmiany i poprawki. Strona Informacje: ceny biletów, zasady Kościańskiej Karty Mieszkańca i sposób zakupu. Rozkład jazdy z banerem reklamowym lokalnej firmy przypiętym na dole ekranu. Strona „Reklamuj się w Busek” ze specyfikacją formatów kreacji reklamowych.
pod maską

Jak jest zbudowana

Next.js 16 · React 19

Next.js 16 na App Routerze, React 19, TypeScript, Tailwind CSS 4, Leaflet do map, next-intl do trzech języków, Serwist do trybu offline. Całość działa w kontenerze Dockera za reverse proxy Caddy na własnym VPS-ie.

Rozkłady
Dane GTFS przewoźnika
Geometria tras
OSRM, przebiegi po rzeczywistej sieci drogowej
Adresy
Photon (OpenStreetMap), zawężony do Kościana z okolicą
Pozycje pojazdów
Publiczny feed GTFS-Realtime zbiorkom.live
Monitoring
Publiczny endpoint zdrowia: awarię źródła danych wykrywa automat, nie zgłoszenie mieszkańca

§Aplikacja nie odpytuje bezpośrednio systemów przewoźnika; warstwa live opiera się wyłącznie na publicznie udostępnianym feedzie danych otwartych.

Przepływ danych: GTFS przewoźnika, OSRM, Photon i feed zbiorkom.live zasilają aplikację Busek, a ta serwuje rozkład na telefon mieszkańca GTFS PRZEWOŹNIKA OSRM · TRASY PHOTON · ADRESY ZBIORKOM.LIVE BUSEK Next.js · Docker · Caddy TELEFON MIESZKAŃCA

Cztery źródła danych otwartych, jedna aplikacja, żadnego zapytania do systemów przewoźnika.

Następne miasto

Wdrożenie w kolejnym mieście

Kościan jest pierwszym wdrożeniem. Kod od początku traktuje miasto jako warstwę wymienną: linie, kolory, przystanki, rozkłady i zakres funkcji opisuje konfiguracja, a nie osobna aplikacja pisana od zera.

Dla urzędu

Zakres usługi: instancja aplikacji pod adresem miasta, widżet rozkładu do osadzenia w ramce na stronie urzędu, miesięczny raport z działania. Aplikacja działa w przeglądarce, więc po stronie urzędu nie ma instalacji, wdrożenia ani utrzymania infrastruktury.

Czego potrzeba na start

Aktualnych rozkładów i listy przystanków. Geometria tras, dane przystanków i konfiguracja miasta powstają po mojej stronie. Mogę pokazać działające wdrożenie w Kościanie i oszacować zakres pracy dla Państwa gminy.