Projekt własny 1436 miejsc 415 miast 1691 stron 9 dni od zera 0 zł serwera

Szachowa Mapa,
1436 miejsc w dziewięć dni

23 sierpnia 2026 wystartowała warszawska mapa z 54 punktami. Dziewięć dni później szachowamapa.pl miała 1436 zweryfikowanych miejsc do gry w szachy w 415 miastach, 1691 statycznych podstron, ponad 50 tysięcy linków wewnętrznych i zero martwych odnośników. Bez kont, bez logowania i bez złotówki za serwer aplikacji.

Opisujemy ten projekt najdokładniej ze wszystkich, bo w jednym miejscu pokazuje to, co przy zleceniach robimy osobno: pozyskiwanie i czyszczenie dużego zbioru danych geograficznych, architekturę bez abonamentów, wydajność mierzoną na słabym telefonie, pozycjonowanie w skali tysiąca stron oraz rozkręcenie społeczności, która sama dosypuje treść.

Typ projektu

Ogólnopolska baza danych i mapa

Rola

Dane, kod, treść, kampania

Czas

9 dni od pomysłu do 1436 rekordów

Baza

1436 miejsc, 415 miast, 16 województw

Frontend

Next.js (eksport statyczny), Leaflet, MapLibre

Backend

Supabase (RLS, RPC, Edge Functions, Realtime)

Źródła danych

OpenStreetMap, Google Places, Nominatim, ludzie

Hosting

Zwykły FTP, 0 zł za serwer aplikacji

Adres

szachowamapa.pl ↗

Podgląd

Tak wygląda szachowamapa.pl

Mapa całej Polski z klastrowaniem, wyszukiwarką miejsc i adresów, filtrem sprzętu oraz pinezkami „szukam gry teraz”, które znikają samoczynnie. Pod mapą indeks wszystkich punktów, nad nią struktura miast i dzielnic. Każde miejsce ma własną podstronę z opisem, dojściem i nawigacją.

Podgląd strony szachowamapa.pl na komputerze i telefonie, z możliwością przewinięcia całej strony

Złap i przewiń, albo przełącz urządzenie
Na żywo · szachowamapa.pl Otwórz na żywo
Strona główna szachowamapa.pl na komputerze: interaktywna mapa z klastrowaniem punktów i katalogiem miejsc według miast
Szachowa Mapa na telefonie, mobilna nawigacja i lista miejsc
góra strony
Next.jsSupabaseLeafletSuperclusterMapLibreOpenStreetMap
1436 miejsc 415 miast 1691 stron 1,9 s do pierwszej pinezki

Kalendarium

Dziewięć dni, dzień po dniu

Nie było tu etapu zbierania wymagań przez miesiąc. Pierwsza wersja stanęła na produkcji w dobę, a każdy kolejny dzień dokładał albo dane, albo mechanizm, który te dane porządkuje. Daty są prawdziwe, liczby pochodzą z historii repozytorium.

  1. 23.08

    Prototyp warszawski, 54 miejsca

    Import stołów plenerowych z OpenStreetMap przez Overpass, pięć miejsc dopisanych ręcznie, cztery kawiarnie potwierdzone w sieci. Zdjęcia parków z Wikimedia Commons z podpisem licencji w dymku. Do tego zegar szachowy pod osobnym adresem i pinezki „szukam gry teraz” z automatycznym wygasaniem.

  2. 24.08

    Wejście na produkcję i pierwsza fala zgłoszeń

    Serwis staje na własnej domenie, rusza grupa na Facebooku i kampania w grupach lokalnych. Tego samego dnia z komentarzy dochodzi kilka miejsc, w tym pierwsze lokale z szachami na miejscu. Powstaje hybrydowy formularz zgłoszeń: osobna ścieżka dla stołu w parku, osobna dla lokalu.

  3. 25.08

    Pierwsze zgłoszenia z formularza w bazie

    Publikacja dwóch punktów przysłanych przez mieszkańców, w tym parku, którego nie było w żadnym źródle. Telefony do lokali rozstrzygają to, czego nie wie ani OpenStreetMap, ani strona lokalu. Sieć pięciu kawiarni obdzwoniona, do bazy wchodzi jedna, ta z realnym miejscem do gry.

  4. 26.08

    Z 77 na 104 miejsca w jeden dzień

    Posty w kilkunastu grupach dzielnicowych. Wszystkie nowe punkty pochodzą z komentarzy i telefonów, żaden z gotowej bazy. Wniosek operacyjny, który został na stałe: dzielnice o słabym pokryciu w OpenStreetMap dają najwięcej zgłoszeń, bo dane publiczne systematycznie je pomijają.

  5. 27.08

    Wejście na całą Polskę i warstwa SEO

    Ograniczenie do Warszawy zamienia się na obszar całego kraju w trzech warstwach naraz: w przeglądarce, w funkcji brzegowej i w regule bazy danych. Powstaje struktura adresów miasto najpierw, huby miast i dzielnic, próg własnej strony od trzech miejsc oraz strona zbiorcza dla okolic. Z 184 miejsc robi się 222 strony i 6059 linków wewnętrznych, bez jednego martwego.

  6. 28.08

    1217 miejsc i przebudowa wydajności

    Import ogólnopolski wywraca skalę. Mapa zawiesza się nawet na mocnym telefonie, więc idzie pomiar i przebudowa: czas do pierwszej pinezki z 15,6 na 7,7 sekundy w kodzie i na 1,9 sekundy na produkcji. Tego samego dnia odwrotne geokodowanie nadaje sensowne nazwy 825 punktom, które nazywały się „punkt 5”.

  7. 29 i 30.08

    Zgłoszenia użytkowników i warstwa partnerska

    Skarga „formularz zamyka się po spacji” okazuje się błędem dostępności, nie awarią przeglądarki. Zarzut o złe liczenie głosów okazuje się problemem kolorów, nie arytmetyki. Powstaje oferta dla lokali z jawnie oznaczoną pinezką partnerską.

  8. 31.08

    Pełny audyt i 1436 miejsc

    Audyt całego serwisu: zgodność oferty partnerskiej z tym, co serwis naprawdę potrafi dostarczyć, czytelność znaczników na mapie mierzona w skali 1:1, kolory pinezek rozdzielone według obietnicy dla użytkownika, kontrola każdego nowego rekordu podwójnym geokodowaniem. Stan na koniec: 1436 miejsc w 415 miastach i 1691 adresów w mapie strony.

● Co z tego wynika dla zleceń

Tempo bierze się z decyzji, nie z pośpiechu

Każdy z tych dni kończył się czymś działającym na produkcji. Ta sama metoda obowiązuje przy pracy komercyjnej: wdrażamy etapami, które można obejrzeć, zamiast pokazywać efekt po miesiącu.

Wzrost bazy

Licznik na żywo: 54, 187, 1420

Licznik w rogu mapy pokazuje liczbę stałych miejsc w bazie. To zrzuty z kolejnych dni pracy, robione przy okazji kampanii w grupach lokalnych. Widać na nich nie tylko przyrost liczby, ale też zmianę zasięgu: z jednego miasta na cały kraj i z pojedynczych pinezek na klastry.

Szachowa Mapa pierwszego dnia: licznik pokazuje 54 stałe miejsca w Warszawie
Dzień 1. 54 stałe miejsca, jedno miasto, marka „Szachowa Warszawa”.
Szachowa Mapa czwartego dnia: licznik pokazuje 187 stałych miejsc, widok na całą Polskę z jednym klastrem
Dzień 4. 187 miejsc po kampanii w grupach dzielnicowych, ale zasięg wciąż warszawski: cała Polska mieści się w jednym klastrze.
Szachowa Mapa dziewiątego dnia: licznik pokazuje 1420 stałych miejsc rozłożonych po całej Polsce
Dzień 9. 1420 miejsc, klastry w każdym województwie i skróty do największych miast nad mapą.
Widok Krakowa na Szachowej Mapie: pinezki stołów plenerowych, kawiarni i bibliotek
Przekrój miasta. Kraków po imporcie ogólnopolskim: stoły plenerowe w zieleni, lokale i instytucje w kolorze bursztynowym.

Zrzuty z kolejnych dni sierpnia 2026, z produkcyjnej wersji serwisu.

Miasto po mieście

Ten sam mechanizm w kolejnych miastach

Struktura jest wszędzie taka sama: import z danych otwartych daje szkielet, zgłoszenia mieszkańców go zagęszczają, a hub miasta zbiera wszystko w jeden adres. Różni się tylko gęstość, i to jest najuczciwsza rzecz, jaką ta mapa pokazuje: w dużych miastach siatka jest już gęsta, w mniejszych stoi po kilka punktów i widać, gdzie brakuje wiedzy.

Poznań na Szachowej Mapie: pinezki stołów plenerowych na Ratajach, Winogradach i Grunwaldzie oraz lokale w ścisłym centrum
Poznań. Stoły rozłożone po osiedlach, lokale skupione wokół Starego Rynku. Miasto weszło do bazy razem z importem ogólnopolskim i zostało uzupełnione zgłoszeniami z grup lokalnych.
Wrocław na Szachowej Mapie: gęsta siatka pinezek od Leśnicy po Sępolno
Wrocław. Jedno z najgęstszych pokryć poza Warszawą, od Leśnicy po Biskupin, z bibliotekami i kawiarniami w centrum.
Trójmiasto na Szachowej Mapie: pinezki i klastry liczbowe od Sopotu po Gdańsk Południe
Trójmiasto. Przy tym przybliżeniu część punktów wciąż siedzi w klastrach z liczbą. Kliknięcie w bąbelek rozsypuje go na pojedyncze pinezki.
Łódź na Szachowej Mapie: pinezki od Bałut po Górną, lokale i biblioteki w Śródmieściu
Łódź. Pas punktów wzdłuż całego miasta plus skupisko lokali i bibliotek w Śródmieściu, przy Piotrkowskiej.
Szczecin na Szachowej Mapie z wpisaną frazą w wyszukiwarce nad mapą
Szczecin. Widok po skorzystaniu z wyszukiwarki: szuka jednocześnie w bazie mapy i w adresach, więc działa też dla ulicy, której na mapie jeszcze nie ma.
Głogów na Szachowej Mapie: dwa punkty w całym mieście
Głogów. Dwa punkty na całe miasto. Tak wygląda uczciwy stan wiedzy poza dużymi ośrodkami i dokładnie tu najbardziej opłaca się jedno zgłoszenie mieszkańca.

Zrzuty z produkcji, koniec sierpnia 2026. Liczba w liczniku różni się między kadrami, bo baza rosła między jednym a drugim zrzutem.

Zaangażowanie użytkowników

Bazy nie da się kupić, ale można ją wywołać

Najcenniejsza część zbioru nie pochodzi z żadnego API. Pochodzi od ludzi, którzy w komentarzu napisali „u nas na osiedlu też stoi stół”. Żeby to się wydarzyło, trzeba było dać im powód do odpowiedzi i skrócić ją do jednego zdania.

Co zadziałało:

  • Grupy dzielnicowe zamiast największych ogłoszeniowych. Post w grupie dzielnicy przynosił kilkanaście punktów, bo pytanie dotyczyło miejsca, które ludzie mijają codziennie. Duże grupy dają zasięg, ale nie dają wiedzy lokalnej.
  • Wezwanie do komentarza, nie do wiadomości prywatnej. Komentarz widzą inni i dopisują kolejne miejsca. Jedna odpowiedź uruchamiała wątek na kilkanaście punktów.
  • Odpowiedź na każde zgłoszenie. Powstał rejestr gotowych odpowiedzi, żeby żaden komentarz nie został bez reakcji, także ten sceptyczny.
  • Zgłoszenie mieszkańca wystarczy, jeśli da się ustalić lokalizację. To była świadoma zmiana progu wiarygodności. Pytamy wyłącznie o to, gdzie dokładnie stoi stół, nigdy o to, czy ktoś na pewno widział szachownicę.
  • Telefon rozstrzyga. Trzy razy jednego dnia informacji nie było ani w OpenStreetMap, ani na stronie lokalu. Wystarczyła rozmowa.

Skala odzewu przełożyła się na dane wprost: dwie doby postów w grupach warszawskich dały wzrost z 62 do 104 miejsc, a wszystkie te punkty pochodziły od ludzi, nie z importu. Zgłoszenia przyszły też z formularza na stronie, z Reddita, z wiadomości od właścicieli lokali oraz z urzędu dzielnicy, który pod postem podał trzy filie biblioteki z bezpłatnymi zajęciami. Jeden z mieszkańców pojechał na miejsce i naliczył sześć szachownic tam, gdzie dane publiczne widziały zwykłe stoły piknikowe.

Ważny szczegół, który mówi więcej o jakości niż o zasięgu: zgłoszenie miejsca, które już jest w bazie, też bywa cenne. Mieszkaniec Wrocławia przysłał link do parku obecnego w bazie, ale pinezka na mapie stała 428 metrów od jego wskazania. Dlatego duplikaty się sprawdza, a nie odrzuca.

● Zasada projektu

Zero kont, zero formularzy logowania, zero zbierania danych

Autor pinezki na żywo dostaje losowy token usuwania trzymany wyłącznie w jego przeglądarce. Głosowanie na miejsca opiera się na anonimowym skrócie HMAC bez ciasteczek śledzących. Im mniej progów, tym więcej zgłoszeń.

Praca z danymi

Trzy źródła, jeden zbiór, który się broni

Zbiór 1436 rekordów powstał ze źródeł, które się nie pokrywają i każde z nich myli się inaczej:

  • OpenStreetMap przez Overpass API. Trzon zbioru, czyli 1202 punkty plenerowe. Dane otwarte, ale nierówne: w niektórych dzielnicach nie ma praktycznie nic, mimo że stoły stoją.
  • Google Places. Skan wyszukiwania tekstowego dał punkty nieobecne w OpenStreetMap i przy okazji zweryfikował istniejące pinezki co do kilku metrów. Zależność działa w obie strony, więc oba źródła zostają w obiegu.
  • Ludzie. Komentarze, formularz, wiadomości, telefony. Jedyne źródło, które wie o stole postawionym w zeszłym roku i o tym, że w lokalu naprawdę leży komplet.

Samo pobranie danych to najprostsza część. Robota zaczyna się tam, gdzie zbiór ma się nadawać do publikacji:

  • 825 rekordów, czyli 68 procent bazy, nazywało się „Kraków: stoliki szachowe · punkt 5” i żaden z tych opisów nie mówił, gdzie punkt się znajduje. Odwrotne geokodowanie zamieniło je na „Podgórze Duchackie, ul. Edwarda Heila”. Rekordów bez wskazówki dojścia zostało 38 zamiast 533.
  • Odsiewanie duplikatów według nazw jest tak dobre, jak nazwy. Po nadaniu nazw z ulic dwa osobne stoły oddalone o 103 metry dostały prawie identyczne nazwy i jeden zniknął z mapy. Reguła jest dziś jawna: dwa różne obiekty w OpenStreetMap to dwa różne miejsca, scalanie tylko poniżej 30 metrów. Poprawka odzyskała sześć realnych stołów.
  • Weryfikacja w obie strony. Każdy nowy rekord przechodzi odwrotne geokodowanie współrzędnych, geokodowanie adresu z opisu i pomiar odległości od pinezki, plus dystans do najbliższego sąsiada. Ta procedura złapała lokal stojący 339 metrów od adresu z własnej nazwy i szkołę opisaną nie tą ulicą, przy której stoi.
  • Bezpiecznik geokodera. Bibliotekę z Krosna na Podkarpaciu geokoder wskazał w Krośnie Odrzańskim, 536 kilometrów dalej. Generator ma teraz zapadkę na rozmiar obszaru, bo zły geokod potrafi wyglądać wiarygodnie.
  • Puste pole zamiast zgadywania. Województwo w danych strukturalnych powstaje z rejestru zbudowanego odwrotnym geokodowaniem, a przy nieznanym obszarze pole po prostu nie powstaje. Lepiej nie powiedzieć nic, niż powiedzieć Google nieprawdę.
  • Kontrola importu wobec źródła. 849 rekordów pochodzących z OpenStreetMap zostało porównanych z surowym zrzutem, zero fałszywych trafień, mimo że zrzut zawierał śmieci z wyszukiwania słownego.

Do tego dochodzi zarządzanie tym, co w ogóle ma prawo być na mapie. Reguła nie brzmi „komercyjne kontra darmowe”, tylko: czy miejsce sprzedaje naukę, czy wpuszcza do gry. Kluby, biblioteki, domy kultury i lokale z kompletem zostają, komercyjne szkoły szachowe wchodzą wyłącznie jako oznaczony partner. Rozważana była twarda bramka „komplet na miejscu albo nie ma wpisu”, ale policzenie zbioru pokazało, że na dworze nikt nie zostawia bierek, więc reguła skasowałaby większość mapy. Zamiast kasować cudze zgłoszenia wszedł filtr nad mapą, który pokazuje tę samą informację.

Cały czas obowiązuje tu jedna zasada, którą przenosimy na zlecenia: liczby w komunikacji muszą wynikać z danych. Post o „ponad 200 miejscach w Warszawie” został po fakcie skorygowany, bo samo miasto miało 131, a 214 dopiero z okolicami.

825

rekordów bez wskazówki dojścia, naprawionych odwrotnym geokodowaniem

849

importów sprawdzonych wobec surowego zrzutu, zero fałszywych trafień

30 m

próg scalania duplikatów, poniżej którego to zwykle ten sam obiekt

Wydajność

Z 15,6 sekundy na 1,9 sekundy

Przy 1217 punktach mapa zawiesiła się nawet na najnowszym iPhonie. Pomiar na emulowanym telefonie klasy iPhone 8 Plus pokazał pierwszą pinezkę po 15,6 sekundy. Przyczyna nie była jedna:

  • Baza wchodziła do przeglądarki pięcioma drogami naraz. Usunięcie jednego importu nic nie dawało, bo zostawały cztery inne, w tym rejestr obszarów budowany z całej kolekcji już przy wczytaniu modułu. Dwie z tych dróg istniały tylko dlatego, że scalanie danych podmieniało cały rekord i gubiło pola.
  • Dane wyszły z paczki JavaScript do osobnego pliku ze stemplem treści w adresie. Dzięki temu można go cache’ować bezterminowo, a adres zmienia się dopiero przy zmianie danych. Kompresja Brotli: 812 kilobajtów do 101.
  • Znaczniki w drzewie dokumentu z 1217 na 63. Klastrowanie to nie tylko wydajność. Bąbelek z liczbą 205 niesie więcej informacji niż 205 nachodzących na siebie ikon.
  • HTML strony głównej z 502 na 34 kilobajty, bo pełny spis miejsc przeniósł się na osobny adres.

Osobny rozdział to interfejs na małych telefonach. Pomiar na ekranie 375 na 667 pikseli pokazał, że paski interfejsu zjadały 340 pikseli, a mapa dostawała 49 procent ekranu. Po zmianach dostaje 63 procent. Najdroższy pojedynczy błąd: filtr łamał się na dwa wiersze, bo pełne etykiety z licznikami nie mieściły się w jednym. Sprawdzone na ośmiu szerokościach ekranu, od 320 do 768 pikseli.

Wynik z żywej produkcji: pierwsza pinezka po 1,9 sekundy, 63 znaczniki w drzewie, zero błędów JavaScriptu.

Wyniki przebudowy wydajności Szachowej Mapy
ParametrPrzedPo
Czas do pierwszej pinezki (telefon)15,6 s1,9 s
Praca głównego wątku15,6 s7,3 s
Znaczniki w drzewie dokumentu121763
HTML strony głównej502 kB34 kB
Transfer danych mapy812 kB101 kB (Brotli)
Udział mapy w ekranie 375 px49 %63 %

Pozycjonowanie w skali

1691 adresów, zero martwych linków

Zbiór danych bez struktury adresów jest w wyszukiwarce niewidoczny. Każde z 1436 miejsc ma własną statyczną podstronę, a nad nimi stoją huby: miasta, dzielnice Warszawy, województwa i strona okolic dla mniejszych miejscowości. Adresy układają się tak, jak brzmi zapytanie, czyli miasto najpierw.

  • Próg własnej strony od trzech miejsc. Mniejsze obszary trafiają na stronę zbiorczą, żeby nie robić dwudziestu stron z jedną pozycją.
  • Linkowanie policzone, nie zadeklarowane. Audyt paczki: 1691 adresów, ponad 50 tysięcy linków wewnętrznych, zero martwych. Do tego okruszki z danymi strukturalnymi, sekcja „najbliżej stąd” liczona ze współrzędnych w poprzek dzielnic i siatki sąsiadów.
  • Dane strukturalne bez ściemy. Wszystkie strony miejsc podawały wcześniej jedno miasto, więc Otwock przedstawiał się Google jako Warszawa. Naprawione, podobnie jak pole regionu.
  • Decyzje o tym, czego nie robić. Zmiana nazw punktów zmienia adresy podstron, więc kolejna taka operacja wymaga przekierowań 301. To jest zapisane, żeby nikt nie zrobił tego bezmyślnie.

Warto powiedzieć uczciwie, co pokazało badanie zapytań: poza Warszawą praktycznie nie ma dziś gotowego popytu na frazy typu „gdzie grać w szachy” w największych miastach. Ogólnopolskość to gra o podaż i długi ogon, nie o przechwycenie istniejącego ruchu. Struktura jest zbudowana pod to, co będzie za rok, nie pod dzisiejsze wykresy.

Architektura i koszty

Tysiące punktów przy zerowym koszcie serwera

Cały serwis to statyczny eksport Next.js: 1691 gotowych plików HTML na zwykłym hostingu FTP, bez procesu Node.js i bez panelu, który trzeba aktualizować. Warstwa dynamiczna rozmawia bezpośrednio z Supabase:

  • Pinezki na żywo z ochroną antyspamową. Dodanie stolika przechodzi przez funkcję brzegową z weryfikacją Cloudflare Turnstile, usunięcie autoryzuje token, którego skrót trzyma baza. Wszyscy widzą nową pinezkę natychmiast, bez odpytywania serwera.
  • Czat przy stoliku w jedną stronę. Można napisać do autora pinezki „będę za dziesięć minut w czarnej bluzie”, autor odczytuje wiadomości funkcją bazodanową.
  • Głosowanie na miejsca chronione skrótem HMAC, z listą dozwolonych identyfikatorów w funkcji brzegowej, odświeżaną przy każdej zmianie bazy. Wcześniejsza wersja przyjmowała głos na dowolny identyfikator i wyszło to w audycie.
  • Panel moderacji z logowaniem przez link w mailu i uprawnieniami w bazie, do zatwierdzania zgłoszeń.
  • Podkład mapy bez kosztu i bez klucza. Dotychczasowy dostawca kafelków wprowadził w sierpniu wymóg klucza, więc podkład przeszedł na OpenFreeMap przez MapLibre, z automatycznym powrotem na zwykły OpenStreetMap przy awarii.
Porównanie architektury Szachowej Mapy z tradycyjnym stosem SaaS
CechaTypowy stos SaaS lub VPSArchitektura Szachowej Mapy
Koszt serwera aplikacji150 do 400 zł miesięcznie0 zł (statyczny FTP i Supabase)
Konta użytkownikówWymagane logowanie i hasłaZero kont (token w przeglądarce, HMAC)
Wydajność mapyZacinanie powyżej 500 znaczników1,9 s do pierwszej pinezki przy 1436
Aktualizacja na żywoOdpytywanie serwera co kilka sekundNatychmiast (Supabase Realtime)
Widoczność podstronAplikacja jednostronicowa bez treści w HTML1436 statycznych podstron miejsc
Zależność od dostawcyAbonament i migracja przy zmianiePliki statyczne, przenoszalne na dowolny hosting

Wiarygodność i moderacja

Serwis, który żyje z zaufania

Mapa oparta na zgłoszeniach jest warta tyle, ile jej wiarygodność. Zasady, które trzymają ją w ryzach, są napisane wprost na stronie projektu:

  • Wsparcie indywidualne nie dotyka mapy. Osoby wspierające projekt trafiają do sekcji „kto utrzymuje mapę”, nie na pinezkę.
  • Partner komercyjny jest oznaczony. Osobny kolor pinezki i oznaczenie linku jako sponsorowanego, bez udawania organicznego wpisu. Płatny link bez oznaczenia to ryzyko kary od Google także dla partnera.
  • Nikogo nie kasujemy po rezygnacji. Wpis przenosi się do sekcji „wspierali wcześniej”, a prośba o usunięcie jest honorowana także po zakończeniu wsparcia.

Osobna sprawa to zgodność obietnic z rzeczywistością. Audyt oferty partnerskiej porównał każdy próg wsparcia z tym, co serwis naprawdę potrafi dostarczyć, i wyciął to, czego dostarczyć nie umie: logo w nagłówku wszystkich widoków, naklejki na cudzej infrastrukturze w parkach, wyłączność branżową. Jeden próg był na stronie wyceniony dwunastokrotnie za nisko względem regulaminu zbiórki. Opis progu to umowa, nie tekst reklamowy, i tak samo traktujemy zapisy na stronach klientów.

Podobnie działa reakcja na zgłoszenia od użytkowników. Skarga „formularz zamyka się po naciśnięciu spacji” wyglądała na awarię przeglądarki, a była błędem dostępności: kursor po otwarciu okna lądował na przycisku zamykania, więc spacja go aktywowała razem z wpisaną treścią. Poprawka objęła też pułapkę klawisza Tab, która pozwalała wyjść poza okno zgłoszenia.

Projekt w liczbach

Stan na 31 sierpnia 2026

1436

zweryfikowanych miejsc do gry w szachy

415

miast i miejscowości w 16 województwach

1691

statycznych adresów w mapie strony

1202 i 234

punkty plenerowe oraz miejsca pod dachem

50 000+

linków wewnętrznych, zero martwych

1,9 s

do pierwszej pinezki na telefonie

9 dni

od pierwszego commita do pełnej bazy

0 zł

kosztu serwera aplikacji i API map

0

wymaganych kont, haseł i formularzy logowania

Wdrożone komponenty i moduły

Import z OpenStreetMap (Overpass) Skan Google Places Odwrotne geokodowanie nazw i adresów Odsiewanie duplikatów z regułą odległości Mapa Leaflet z klastrowaniem Supercluster Podkład MapLibre z awaryjnym powrotem Dane poza paczką JS ze stemplem wersji 1436 podstron miejsc plus huby miast i dzielnic Wyszukiwarka miejsc i adresów Filtr sprzętu (komplet na miejscu, swój sprzęt) Pinezki „szukam gry teraz” z wygasaniem Czat przy stoliku przez funkcję brzegową Głosowanie na miejsca z HMAC Formularz zgłoszeń ze wskazaniem punktu na mapie Panel moderacji z logowaniem przez link Cloudflare Turnstile i limity w bazie Zegar szachowy online Sekcja wspierających i warstwa partnerska Statystyki z trybem zgody

Pytania techniczne

Najczęstsze pytania o ten projekt

Skąd wzięło się 1436 miejsc w bazie?

Z trzech źródeł, które się uzupełniają: importu z OpenStreetMap, skanu Google Places i zgłoszeń od ludzi. Żadne z nich nie wystarcza samo. Dane otwarte pomijają całe dzielnice, Google zna inne miejsca niż OpenStreetMap, a mieszkańcy wiedzą o stołach, których nie ma nigdzie.

Jak weryfikowana jest poprawność współrzędnych?

Każdy nowy punkt przechodzi trzy kontrole: odwrotne geokodowanie i porównanie miasta oraz ulicy z opisem, geokodowanie adresu z opisu w drugą stronę z pomiarem odległości od pinezki, oraz dystans do najbliższego istniejącego punktu. Sam fakt, że współrzędne są w Polsce, nie mówi nic o tym, czy punkt stoi tam, gdzie obiecuje opis.

W jaki sposób mapa osiąga 1,9 sekundy przy 1436 punktach?

Dane leżą poza paczką JavaScript, w pliku ze stemplem treści w adresie, więc można je cache’ować bezterminowo, a Brotli ściska je z 812 do 101 kilobajtów. Punkty nie trafiają pojedynczo do drzewa dokumentu, tylko przechodzą przez klastrowanie, dzięki czemu widocznych znaczników jest około 63.

Dlaczego bez płatnego serwera i bez płatnego API map?

Bo nie były potrzebne. Frontend to statyczne pliki z dowolnego hostingu, warstwa dynamiczna mieści się w darmowym poziomie Supabase, a podkład mapy pochodzi z OpenFreeMap. Taka architektura ma jeszcze jedną zaletę: nie ma dostawcy, który jednostronnie podniesie abonament albo zamknie usługę.

Zastosowanie biznesowe

Co z tego wynika dla Twojej firmy

Zamiast stołów szachowych podstaw sieć oddziałów, punkty odbioru, obiekty noclegowe, punkty serwisowe, bazę nieruchomości albo katalog dostawców. Mechanizm jest ten sam i sprawdzony na 1436 rekordach:

  • Dane, które trzeba dopiero zbudować. Zebranie z rozproszonych źródeł, ujednolicenie, geokodowanie, odsiewanie duplikatów i kontrola jakości rekord po rekordzie.
  • Mapa, która nie zacina się przy tysiącach punktów, także na starszym telefonie i przy słabym łączu.
  • Osobna strona dla każdej lokalizacji plus strony miast, które łapią długi ogon zapytań lokalnych.
  • Zgłoszenia i moderacja bez zmuszania ludzi do zakładania kont, z ochroną antyspamową i panelem do zatwierdzania.
  • Architektura bez abonamentów, przenoszalna między hostingami, bez uzależnienia od jednego dostawcy.

To dowód na to, że potrafimy poprowadzić projekt danych od pustego katalogu do publicznego serwisu z tysiącem stron, i że umiemy powiedzieć, których obietnic nie da się dotrzymać. Zobacz też własne systemy biznesowe, widoczność lokalną oraz drugi projekt własny, aplikację Szachmaty.pl.

IB

Potrzebujesz mapy punktów, katalogu albo systemu zgłoszeń?

Zostaw numer, oddzwonimy i porozmawiamy, jak wdrożyć takie rozwiązanie bez drogich abonamentów.

Zostaw numer, oddzwaniamy zwykle w kilka godzin, maksymalnie do 24 h:

Dodaj firmę, miasto, email (opcjonalnie)
Preferowana pora kontaktu (opcjonalnie)

Gwarancja poufności danych. Polityka prywatności