Realizacja · Portal miejski / silnik wieloinstancyjny
Wirtualny Otwock 2.0 — jeden plik konfiguracyjny rządzi całym powiatem
Dziewiątego portalu z newsami w Otwocku nikt nie potrzebował. Powiat liczy 125 tysięcy mieszkańców i ma osiem serwisów walczących o te same kliknięcia. Weszliśmy tam z marką z 2007 roku, ale zamiast pisać kolejne teksty o tym samym, zrzuciliśmy bombę technologiczną. Wirtualny Otwock to nie strona. To silnik, dla którego portal miejski jest produktem ubocznym.
wirtualnyotwock.pl →
Osiem portali, jeden czerwony ocean
Z dawnego Wirtualnego Otwocka została domena, logo, komplet kolorów i zrzut ekranu z 2007 roku. Kodu nie było, bazy nie było, sentyment był. Wejście z dziewiątym serwisem newsowym oznaczałoby walkę o resztki uwagi w regionie, w którym o tym samym remoncie drogi pisze już ośmiu graczy. Postawiliśmy inaczej: newsów nie piszemy, tylko przejmujemy ich dopływy, a budujemy to, czego żaden z tamtych nie ma — katalog firm, dane ligowe i przewodniki po powiecie.
To nie strona. To silnik.
Zasada nr 1: nic „otwockiego” w kodzie
- Nazwa, domena, kolory, gminy, kategorie, źródła danych, cennik i włączone moduły — wszystko w jednym pliku konfiguracji instancji
- 23 przełączniki modułów sterują nawigacją, stroną główną i trasami; wyłączony moduł znika z portalu razem ze swoimi adresami
- Paleta marki wstrzykiwana jako zmienne CSS — jeden skompilowany arkusz obsługuje dowolną liczbę instancji
- Test jest brutalnie prosty: druga instancja to nowy plik konfiguracji i logo. Jeśli trzeba tknąć kod silnika, coś otwockiego wyciekło i wraca do poprawki
Katalog, który zbudował się sam
20 kategorii, 153 specjalności, dziewięć gmin
- 1 656 wizytówek firm z dziewięciu gmin powiatu — zebranych, opisanych i gotowych do przejęcia przez właścicieli
- Publikujemy partiami, dopiero po sprawdzeniu opisu, adresu i zdjęć. Jakość przed licznikiem na stronie głównej
- Zamiast drzewa podkategorii — 137 specjalności z własnymi stronami, w rodzaju „stomatolodzy w Otwocku”. Cechy typu parking zostają filtrem, bo kombinatoryka to filtr, nie treść
- Zdjęcia pozyskujemy własnymi narzędziami, a firma bez strony dostaje kadr z banku obrazów przygotowanego pod ten region

Trzy ligi, trzy kapryśne API, jeden bezwzględny moduł
Adapter zamiast integracji na sztywno
- Każdy organizator trzyma dane inaczej — i każdy w swoim cyfrowym średniowieczu
- Rozwiązała to architektura adapterów — trzy źródła, trzy adaptery, reszta systemu nic o nich nie wie
- Efekt: 12 rozgrywek pod jednym adresem — te z powiatu i te mazowieckie, w których grają miejscowe kluby. Razem 144 drużyny, 797 meczów i 1 236 zawodników, odświeżanych bez udziału człowieka
- Gdy źródło padnie, kibic nie widzi błędu, tylko ostatnią bezpieczną kopię. Nowa liga w powiecie to wpis w konfiguracji, nie przebudowa modułu

Przejęliśmy dopływy zamiast walczyć o ocean
Konkurencja jako źródło, ruch wraca do autorów
- Skanujemy 36 źródeł nagłówków i 16 baz wydarzeń: portale, urzędy ośmiu gmin, starostwo, biblioteki, domy kultury, policję i kluby
- System wyłapuje duplikaty imprez z różnych urzędów i scala je w jedno wydarzenie, rozpoznając te same miejsca pod różnymi nazwami
- Pokazujemy tytuł i źródło, a kliknięcie oddaje ruch oryginalnemu autorowi. Zero skopiowanych tekstów, zero wrogów
- Nagłówki z regionu zasilają plan redakcji, która pisze przewodniki i kontekst — newsów nie dotyka

Praca i wpisy firm za darmo, bo tak brzmi obietnica
Lokalny rynek pracy w jednym miejscu
- Oferty pracy firm z powiatu są bezpłatne i nie są płatnym dodatkiem do żadnego pakietu
- Adapter Centralnej Bazy Ofert Pracy dokłada ogłoszenia z powiatowego urzędu pracy
- Firma prowadzi własny kanał aktualności i promocji, z osobnym RSS-em i limitem dobowym przeciw spamowi
- Radar pracodawców pokazuje, kto zatrudnia, kto zaczyna i kto przyspiesza — sygnał handlowy wyciągnięty z własnych danych

Zbudowaliśmy portal dla ludzi i dla maszyn
Prawdopodobnie pierwszy portal miejski w Polsce z własnym serwerem MCP
Coraz więcej ludzi nie wpisuje już haseł w wyszukiwarkę — pytają swoje modele językowe. Zwykła strona karmi taki model tekstem do zgadywania. My wystawiliśmy natywny serwer MCP: 44 narzędzia, z czego 15 pozwala czytać katalog, wydarzenia i oferty pracy bez żadnego klucza. Dalej jest ciekawiej. Właściciel otwockiej firmy generuje token w swoim panelu i oddaje wizytówkę swojemu asystentowi AI — ten publikuje w jego imieniu ofertę pracy, poprawia opis, aktualizuje godziny otwarcia, wszystko prosto przez API. Reguły zapisu są te same, co w formularzach, każda zmiana wraca jako różnica pole po polu, usuwanie jest miękkie i wymaga potwierdzenia, a samej wizytówki przez API skasować się nie da. Jak zrobić to u siebie, opisaliśmy osobno.

Mierzymy, nie deklarujemy
Audyt przed premierą, nie po awarii
- Każdą stronę mierzymy na telefonie w słabym zasięgu — liczy się moment, w którym czytelnik widzi treść, nie wynik w laboratorium
- Układ nie skacze pod palcem: obrazy, kroje i miejsca na reklamę mają zarezerwowaną przestrzeń, zanim się wczytają
- Kod przechodzi audyt bezpieczeństwa przed premierą i po każdym nowym module — znaleziska naprawiamy i spisujemy, zanim cokolwiek trafi na produkcję
- Reklama kontekstowa bez ciasteczek: do dostawcy idzie sam identyfikator kampanii, dopasowanie zostaje w przeglądarce czytelnika
- Konto pobiera własne dane i kasuje się samo, z anonimizacją zamiast pustego rekordu w bazie
Z czego to powstało
Pięć naszych projektów złożonych w jeden silnik
Nic tu nie powstało od zera i to jest cały sens. Katalog, płatności, obróbka zdjęć i deploy przyszły z portalu Slub24, budowanego przez lata pod ten sam typ katalogu. Dyscyplinę redakcyjną wzięliśmy z ChceBycPiekna: warstwowy model językowy z dostawcą zapasowym, własne zdjęcie do każdego tekstu, autor i kategoria przy każdym materiale. Układ strony artykułu przyjechał z portalu miejskiego City24. Reklamę obsługuje nasz własny ContentLink, ten sam, który stoi na pozostałych portalach sieci. Zdjęcia przechodzą przez pipeline wspólny ze ScaleTry, a lokalnym firmom oferujemy w tym samym miejscu agenta FlashAI. Klocki na następny etap — konta osób, znajomi, wiadomości, wydarzenia z zapisami i lokalny marketplace — czekają gotowe w LoveMerci, zbudowanym na tym samym stosie. Portal miejski jest produktem ubocznym. Produktem głównym jest silnik, który postawi następny.
Oddomenowaliśmy przeszłość. Nie zbudowaliśmy dziewiątego portalu z newsami, tylko silnik portali miejskich — a Otwock jest jego pierwszą instancją. Kolejne miasto to plik konfiguracyjny, nie kolejny projekt.
Najczęstsze pytania
Czym ten portal różni się od lokalnego serwisu z newsami?
Nie publikuje własnych newsów. Agreguje nagłówki z 36 lokalnych źródeł i odsyła ruch do oryginałów, a sam buduje to, czego w regionie brakowało: katalog firm z dziewięciu gmin, dane z dwunastu rozgrywek ligowych, kalendarz wydarzeń, ogłoszenia o pracy i przewodniki po powiecie.
Co daje portalowi własny serwer MCP?
Asystent AI czyta katalog, wydarzenia i oferty pracy bez klucza, a właściciel firmy po wygenerowaniu tokenu w panelu może kazać swojemu asystentowi opublikować ofertę albo poprawić opis wizytówki. Reguły zapisu są wspólne z formularzami, każda zmiana wraca jako różnica pole po polu, a usuwanie jest miękkie i wymaga potwierdzenia.
Czy ten sam silnik uruchomi portal dla innego miasta?
Po to powstał. Nazwa, domena, kolory, gminy, kategorie, źródła danych i zestaw modułów są konfiguracją, nie kodem, a paleta marki wchodzi jako zmienne CSS. Kolejna instancja to nowy plik konfiguracyjny, logo i favicony. Jeśli wymaga czegoś więcej, traktujemy to jak błąd projektowy do naprawienia.
Ile trwała budowa?
Pięć dni od startu prac do premiery, zgranej ze startem sezonu lokalnej ligi. W tym czasie powstały moduły katalogu, ligi, agregatora, wydarzeń, pracy, kont, reklamy i serwera MCP, a całość przeszła audyt wydajności i bezpieczeństwa, zanim weszła na produkcję.
Masz lokalną markę albo katalog do ożywienia?
Postawimy portal na gotowym silniku: katalog firm, dane z zewnętrznych API przez adaptery, konta, reklama bez ciasteczek i serwer MCP dla asystentów AI. Konfiguracja zamiast pisania wszystkiego od nowa.