Mateusz Śliwa

Inżynier danych i AI, który dowozi aplikacje mobilne.

Zielona Góra. Otwarty na pracę zdalną lub hybrydową i na przeprowadzkę. Dostępny od zaraz.

Magister inżynierii danych, Uniwersytet Zielonogórski, 2026. Angielski C1, Cambridge C1 Advanced (2025).

Pracuję z agentami do kodowania: Claude Code, Codex i Cursor.

To jest mój telefon. Każda aplikacja otwiera działające demo projektu. Przeciągnij kreskę na dole w górę, żeby przeglądać je jak karty.

Pobierz CVGitHub[email protected]

W App Store: EcoSort i TrueSky. Strona EcoSort to ecosort.pl.

Jutro

Wystaw dziś: Odpady bio, Papier
Odpady bioPapier

Projekty

Każda karta otwiera całą historię: co robi projekt, co było trudne i co zbudowałem.

EcoSort, w App Store

Zdjęcie wydrukowanego kalendarza wywozów, czytane miesiąc po miesiącu

EcoSortTerminy wywozu śmieci dla twojej ulicy

EcoSort pokazuje, które pojemniki wystawić na twojej ulicy i kiedy. Przypomina wieczorem dzień wcześniej, a widżet i ekran blokady pokazują, co dalej.

Najtrudniejsze są dane

Każda gmina publikuje harmonogram inaczej. Wiele z nich wrzuca skan albo zdjęcie wydrukowanego kalendarza: dwanaście miesięcy na jednej stronie, kolorowe dni i legenda w rogu.

Najprostszy pomysł to dać modelowi całą stronę i poprosić o daty. Na sześciu trudnych skanach najlepsza wersja takiego promptu pomyliła 24,5% komórek. Na stronie są setki podobnych liczb, a tam, gdzie model nie widzi wyraźnie każdego dnia, dopowiada regularny wzór. W Wiśniewie worki bio jeżdżą raz w miesiącu, a prompt z całą stroną dał wywóz co tydzień.

Jak czyta to pipeline

  1. Tnie stronę na miesiąceModel wskazuje ramki miesięcy, kod przesuwa granice do pustego pasa między nimi, a wycinek odpada, jeśli ostatni widoczny dzień się nie zgadza.
  2. Czyta każdy kawałek dwa razyKażdy miesiąc czytają dwa prompty, z dołączoną legendą. Tabele dostają drugi obraz z rozsuniętymi kolumnami.
  3. Remis rozstrzyga większośćGdy dwa odczyty się różnią, decyduje trzeci.
  4. Kod sprawdza to, co pewneNiedziele, święta, dziury w rytmie, liczbę wierszy i to, czy każdy adres z państwowego rejestru trafia do dokładnie jednej strefy.
  5. Lepiej wstrzymać niż zgadywaćWątpliwość, której odczyty nie rozstrzygnęły, wstrzymuje strefę. Brak harmonogramu jest bezpieczniejszy niż zła data.

Wyniki

Sześć skanów i zdjęć z 2190 komórkami. Pipeline przeczytał każdy z nich w trzech pełnych przebiegach, razem 6570 wyników. Komórka to jedna miejscowość, jeden rodzaj odpadów i jeden miesiąc. Jest dobra tylko wtedy, gdy każdy dzień zgadza się z dokumentem.

Jeden prompt75,5% dobrze, 24,5% źle
Pipeline82,2% dobrze, 17,8% wstrzymanych, 0% źle

Zielone są dobre, czerwone złe, szare wstrzymane. Wzorzec to 966 decyzji, które podjąłem ręcznie w panelu. Pipeline był dostrajany na tych dokumentach, więc zero złych dat to jego najlepszy wynik, na dokumentach, które już zna. Następny test to dokumenty, których nie widział.

DokumentKomórkiBłędy promptuBłędy pipeline'uWstrzymane
Gierałtów, zdjęcie12057,2%00%
Czerna, zdjęcie11286,9%00%
Wykroty, zdjęcie12076,7%00%
Wiśniew, skan14777,8%033,3%
Szprotawa, skan bokiem2641,0%074,2%
Klimontów, trzystronicowy skan tabel142711,3%010,1%
Wszystkie sześć219024,5%017,8%

Nie wszędzie jest lepszy: w Szprotawie prompt był prawie bezbłędny, a pipeline wstrzymał trzy czwarte komórek. Jest też droższy: jedno zapytanie i około 25 sekund na dokument dla promptu, wobec mediany 33 zapytań i 4,5 minuty.

Otwórz demo raportu

Co zbudowałem

  • Aplikację na iPhone'a w SwiftUI, z widżetami, Live Activity, przypomnieniami, które można odłożyć albo oznaczyć jako zrobione, i harmonogramem działającym offline.
  • Aplikację na Androida w Kotlinie i Jetpack Compose. Jest gotowa, ale jeszcze nie ma jej w Google Play.
  • Backend w FastAPI i PostgreSQL: wyszukiwanie adresów w państwowym rejestrze TERYT, harmonogramy serwowane jako statyczny JSON.
  • Pipeline czytający harmonogramy w Pythonie z OpenCV, Tesseractem, PyMuPDF i Gemini oraz panel administracyjny w React i TypeScripcie.
  • Sortusia, asystenta, który odpowiada na pytania na podstawie harmonogramu mieszkańca.

W aplikacji jest sześć opublikowanych gmin. EcoSort w App Store. Strona aplikacji to ecosort.pl.

Zrzut z App Store: twój harmonogram wywozuZrzut z App Store: odliczanie do każdego wywozuZrzut z App Store: przypomnienie wieczorem dzień wcześniejZrzut z App Store: kalendarz miesiącaZrzut z App Store: widżetyZrzut z App Store: asystent Sortuś

Każdy projekt ma też własną stronę: mateuszsliwa.dev/pl/ecosort.

Keenwit, w budowie

Gra na mózg, w której wynik liczy serwer

KeenwitDwie gry do wypróbowania: Equinox i Star Sectors

Keenwit to codzienny trening mózgu: 43 krótkie gry na pamięć, matematykę, język i skupienie, z seriami, pojedynkami i rankingami. Trudność dopasowuje się do gracza. Nazwa jest robocza.

Dlaczego wynik liczy serwer

Można grać offline, więc telefon nie może być sędzią. Skończona gra czeka w kolejce na telefonie i nie zmienia XP, serii ani rankingu, dopóki serwer jej nie sprawdzi.

  1. Jednorazowy seedGry z losowaniem dostają seed od serwera. Powtórzony, przeterminowany albo niepasujący seed jest odrzucany.
  2. Okno czasoweWynik może być najwyżej 5 minut w przyszłości i 30 dni wstecz, więc gry offline nadal się liczą.
  3. Limit zapytańOsobno dla każdego klienta.
  4. Wynik normalizowany na serwerzeBardzo wysokie wyniki wymagają dodatkowego dowodu.
  5. WerdyktPrzyjęty, wstrzymany do sprawdzenia albo odrzucony. XP dają tylko przyjęte wyniki.

Prime Check: odpowiedzi trzyma serwer

W tej grze serwer idzie krok dalej. Generuje pytania, zachowuje odpowiedzi i wysyła telefonowi same liczby. Telefon rozgrywa je offline i odsyła to, co kliknąłeś. Serwer przelicza wynik ze swojej kopii i ignoruje wynik podany przez telefon. Na razie tylko ta gra ma taką kontrolę.

Demo: dwie gry

W telefonie są dwie z 43 gier. W Equinox wypełniasz planszę planetami i kometami: nigdy trzy takie same w linii, po połowie każdego rodzaju, a połączenia = i × muszą się zgadzać. Star Sectors to łamigłówka w stylu Queens: jedna gwiazda w każdym wierszu, kolumnie i kolorowym sektorze, a gwiazdy nigdy się nie stykają. Obie korzystają z zasad, plansz i punktacji z aplikacji. Każdy samouczek zaczyna się od kroków z aplikacji, a potem przechodzi na większą planszę z technikami, które ją rozwiązują: sektor zamknięty w jednym wierszu, luka między dwoma takimi samymi, pełne liczenie.

Zagraj w nie w telefonie

Jak jest zbudowany

React Native z Expo, TypeScriptem i Skią, na backendzie Fastify i PostgreSQL z logowaniem JWT i specyfikacją OpenAPI.

Ekran główny KeenwitGra logiczna w KeenwitPojedynki w KeenwitKatalog gier

Każdy projekt ma też własną stronę: mateuszsliwa.dev/pl/keenwit.

TrueSky, w App Store

Pogoda, którą czytasz z obrazu

TrueSkyMalowana pogoda, za darmo, z planem Pro

TrueSky rysuje pogodę jako malowany krajobraz. Godzinowa prognoza z Open-Meteo ustawia światło, chmury, wiatr i deszcz, a scena gra pasujący do nich dźwięk.

Jak działa scena

Każdy krajobraz to stos malowanych warstw: góry, woda, brzeg, chata, brzoza i łódka. Shadery Skia oświetlają je zależnie od godziny, od pierwszego światła po spokojną noc z zapalonymi oknami, przesuwają chmury z wiatrem i dodają deszcz, śnieg, mgłę albo burzę. Utrzymałem 120 Hz, ograniczając pracę wykonywaną w każdej klatce.

Wypróbuj fiord w telefonie

Strona biznesowa

Aplikacja jest darmowa. TrueSky Pro dodaje krajobrazy i szczegóły za 21,99 zł miesięcznie albo 55 zł jednorazowo, przez RevenueCat. Jest przetłumaczona na 32 języki i wysyła alerty pogodowe w tle. Od 9 października 2026 jest w App Store.

Expo, React Native, Skia, Reanimated, RevenueCat, Playwright dla wersji webowej.

TrueSky, łąkaTrueSky, fiord nocąTrueSky, dachy ParyżaTrueSky, szczegóły prognozy

Każdy projekt ma też własną stronę: mateuszsliwa.dev/pl/truesky.

wwxd, open source

Co zrobiłby X? Odpowiedzi słowami tej osoby

wwxd odpowiada na pytanie „co zrobiłby X?” słowami jednej konkretnej osoby. Pobiera jej publiczne napisy, transkrypcje podcastów i artykuły, robi z nich wiki jej poglądów, a agent odpowiada cytatami z tych źródeł ze znacznikami czasu.

Każdy cytat jest sprawdzany

Model potrafi przekręcić czyjeś słowa, więc skrypt szuka każdego cytatu w transkrypcji, z której pochodzi. W benchmarku znalazł co do słowa 158 ze 160 cytatów. Dwa brakujące to tytuły filmów.

Czy jest lepszy od samego Claude'a?

Na 40 pytaniach do dwóch wiki ślepy sędzia porównywał każdą odpowiedź wwxd z odpowiedzią samego Claude'a. Sędzia pochodził z innego laboratorium, z Google, i nie miał dostępu do transkrypcji. Wybrał wwxd w 34 z 40 pytań. Sędziowie z trzech kolejnych laboratoriów, w tym z Anthropic, ocenili te same pary i wybierali wwxd co najmniej tak samo często. Claude z wyszukiwaniem w sieci nie wypadł lepiej: sędzia z Google znów wybrał wwxd w 34 z 40 pytań.

W 24 pytaniach o opinię prompt, który kazał modelowi odpowiadać jako ta osoba, przeczył jej 8 razy. Odpowiedzi wwxd nie przeczyły jej ani razu.

Zapytaj panel

Tryb panelu pyta kilka osób naraz. Każda odpowiada ze swojej wiki. Potem wwxd pokazuje, w czym się zgadzają, w czym się różnią i dlaczego, prowadzi rundę debaty oznaczoną jako wniosek i kończy syntezą. Odpowiedzi są pisane prozą, a źródła są wypisane pod spodem.

Czego nie umie

Nie przewiduje poglądów, których ktoś jeszcze nie wyraził. Odłożyłem na bok stanowiska zajęte w 2026 roku i wwxd odgadywał je nie lepiej niż sam Claude. Wie, co ktoś powiedział, a nie co powie za chwilę.

wwxd na GitHubieOtwórz demo

Jak jest zbudowany

Narzędzie wiersza poleceń w Pythonie i plugin do Claude Code, zbudowane w październiku 2026 na licencji MIT. Projekt opiera się na pomyśle „LLM wiki” Andreja Karpathy'ego. Potrafi lokalnie transkrybować nagrania przez faster-whisper i sprawdzić po głosie, kto mówi. 12 października 2026 miał 135 testów, które działają w CI na Linuksie, macOS i Windowsie.

Python, Typer, yt-dlp, trafilatura, rapidfuzz, faster-whisper, Claude Code.

Każdy projekt ma też własną stronę: mateuszsliwa.dev/pl/wwxd.

unslop, w budowie

Plakaty dla małych firm bez generowania obrazów

unslop (nazwa robocza) robi plakaty i grafiki do mediów społecznościowych dla małych firm bez generowania obrazów. Każda litera jest złożona prawdziwym fontem, a każde zdjęcie jest prawdziwe: własne zdjęcie właściciela albo licencjonowane zdjęcie stockowe. Projekt jest w budowie, a kod jest prywatny.

Przed i po

Każde „przed” poniżej to ulotka, którą opublikowała mała firma, zrobiona generatorem obrazów. Generator rysuje litery jako piksele i jeden z nagłówków wyszedł jako „AMAZINIG”. Każde „po” to ta sama treść zrobiona narzędziem, w którym tekst jest wpisany i złożony fontem.

Route 88 Grill and Bar, ulotka na otwarcie: oryginał wygenerowany przez AI i post na Instagram zrobiony narzędziemImprezowe weekendy Blackpool Rocks: oryginał wygenerowany przez AI i post na Instagram zrobiony narzędziemLetni festyn w wiejskiej świetlicy: oryginał wygenerowany przez AI i post na Instagram zrobiony narzędziemProgram koncertów Summer Vibes w The Kings Head: oryginał wygenerowany przez AI i post na Instagram zrobiony narzędziemInfografika o kompromisach między dziećmi: oryginał wygenerowany przez AI i karuzela z sześciu slajdów zrobiona narzędziem

Plakaty „przed” to prawdziwe ulotki wygenerowane przez AI, które opublikowały małe firmy. Należą do swoich właścicieli i na prośbę usunę każdą z nich.

Porównaj je w telefonie

Jak to działa

  1. Agent pisze specyfikacjęMały plik JSON z układem, kolorami marki, tekstem i prawdziwym zdjęciem, własnym zdjęciem klienta albo licencjonowanym ze stocku.
  2. Renderer ją rysujeHTML i CSS w Chromium przez Playwright. Ta sama specyfikacja zawsze daje ten sam obraz.
  3. Linter sprawdza pikseleMierzy wyrenderowany obraz: tekst, który się nie mieści, nakładanie się elementów, kontrast z prawdziwym tłem, tekst schowany za głównym motywem, cenę, której nie widać, miejsca w relacji zasłonięte przyciskami Instagrama, powiększone zdjęcia i brakujące znaki w foncie.
  4. Agent poprawia to, co zgłosi linterZmienia specyfikację, a renderer rysuje ją od nowa.

Co robi

W październiku 2026 ma 20 układów i 15 kierunków wizualnych. Eksportuje posty na Instagram w 4:5 i 1:1, relacje w 9:16 oraz PDF-y do druku w A4, A3 i B2 ze spadami i osadzonymi fontami. Wyszukiwarka zdjęć przeszukuje Unsplash, Pexels, Pixabay i Openverse i zachowuje podpisy autorów. Usuwanie tła działa lokalnie, na procesorze.

Edytor dla właściciela

Właściciel sklepu klika dowolny tekst, żeby go zmienić. Cztery duże przyciski zmieniają układ, kolory, zdjęcie i tekst, a jedno kliknięcie pobiera wszystkie formaty. Opcjonalny asystent działa na Anthropic API ze streamingiem i cache'owanym promptem systemowym, a każda odpowiedź pokazuje, ile kosztowała.

Jak pracuję

Buduję z agentami do kodowania i wiem, jak ich ustawić

Claude CodeCodexCursorMCPskillesubagenciprompt caching

Większość tych projektów powstała z agentami do kodowania. Używam Claude Code, Codexa i Cursora obok siebie, śledzę nowe modele i funkcje na bieżąco i sprawdzam je na własnych projektach, zanim na nich polegam. Większość moich commitów od września 2026 ma Claude'a jako współautora.

Kontekst, który agent czyta najpierw

  • Globalne zasady dla każdego agenta: znajdź istniejący wzorzec, zanim dodasz kod, trzymaj jedno źródło prawdy, naprawiaj przyczyny, raportuj tylko testy, które naprawdę się wykonały. Karta wyżej je cytuje.
  • Instrukcje w repozytoriach, w AGENTS.md i CLAUDE.md, z komendami i pułapkami projektu, w Keenwit i pipelinie EcoSort.
  • Skille do powtarzalnej pracy, w jednym folderze wspólnym dla Claude Code i Codexa. Dwa są moje: mac-ios do budowania i testowania aplikacji iOS z Linuksa oraz store-screenshots do storeshots.
  • Subagenci do pracy, która dobrze się dzieli: równoległe przeszukiwanie, implementacja, niezależny przegląd i końcowe sprawdzenie.

Koszty, cache i limity

Stałe instrukcje idą na początek i się nie zmieniają, żeby prompt caching mógł je wykorzystać ponownie, a zmienne części idą na koniec. Pilnuję zużycia tokenów i limitów zapytań. Sortuś, asystent EcoSort, działa na puli kluczy API z dziennymi limitami, limitami na użytkownika i Gemmą jako zapasem.

Narzędzia, które buduję dla agentów

  • storeshots zwraca JSON z każdej komendy, a jego błędy mówią, co się zepsuło, jak to naprawić i jaką komendę uruchomić dalej. Oba narzędzia mają dołączony skill dla agentów.
  • macsim daje agentowi na moim linuksowym PC prawdziwy symulator iOS na Macu: buduje aplikację, przeklikuje ją i robi zrzuty ekranu. Open source, tak jak storeshots.

Sprawdzanie tego, co wraca

Odpowiedź modelu jest szkicem, dopóki nic jej nie sprawdziło. W EcoSort to dwa odczyty, trzeci przy niezgodności, kontrole w kodzie i ewaluacja na 966 decyzjach podjętych ręcznie. W Keenwit serwer sprawdza każdy wynik, zanim się policzy. Kod od agenta przechodzi to samo: testy i przegląd przed wydaniem.

Modele w moich aplikacjach

  • Pipeline EcoSort czyta harmonogramy małym modelem Gemini, po jednym miesiącu albo jednej sekcji tabeli naraz. Dokładność daje pipeline wokół niego.
  • Sortuś odpowiada na podstawie harmonogramu mieszkańca, na Gemini, z danymi osobowymi usuwanymi z rozmowy.

Claude Code, Codex, Cursor, MCP, skille, subagenci, Gemini, Gemma.

Uniwersytet Zielonogórski

Kto wygra tę rundę? Moja praca magisterska i klasyfikator zmian skórnych

Magisterka z inżynierii danych, specjalność systemy eksploracji danych (2025–2026), po licencjacie z ekonomii (2021–2024), oba na Uniwersytecie Zielonogórskim.

Praca magisterska: szansa na wygranie rundy w Counter-Strike 2

Model, który podaje prawdopodobieństwo wygrania rundy sekunda po sekundzie. Pobrałem zapisy profesjonalnych meczów Selenium, sparsowałem je demoparser2 i zbudowałem cechy w pandas: 9196 map, 187 361 rund i 16,8 mln stanów gry.

Porównałem dziewięć modeli z walidacją grupowaną po meczach i walk-forward po kwartałach, z testami bootstrap, ablacjami, kalibracją i SHAP. Najlepszy okazał się gradient boosting: LightGBM z log loss 0,527, ROC-AUC około 0,81–0,82 w kwartalnych testach walk-forward i oczekiwany błąd kalibracji (ECE) 0,0086 dla produkcyjnego modelu XGBoost. Predykcje serwuje FastAPI do aplikacji w React.

Wszystkie dziewięć modeli, pięciokrotna walidacja krzyżowa grupowana po meczach, więc rundy z jednego meczu nigdy nie trafiają po obu stronach podziału. Niższy log loss i Brier są lepsze.
ModelLog lossROC-AUCBrier
LightGBM0,52670,80360,1790
CatBoost0,52720,80590,1786
XGBoost (produkcyjny)0,52890,80170,1800
Las losowy0,52950,80350,1797
MLP0,53230,80160,1807
Extra trees0,53320,80430,1805
Regresja logistyczna0,55180,79180,1858
Regresja liniowa, punkt odniesienia0,59190,78890,1891
Klasyfikator ridge0,60440,78890,2074
Walidacja krocząca po kwartałach: trening na wszystkich wcześniejszych kwartałach, test na następnym. Przy krótkiej historii, w 2024 Q1 i Q2, model jest słabszy; od 2024 Q3 XGBoost trzyma 0,81–0,82. XGBoost ma tu stałe ustawienia (300 drzew).
Kwartał testowyMapy w treninguAUC, logistycznaAUC, XGBoost
2024 Q18440,73020,6498
2024 Q214480,79730,8049
2024 Q335190,80050,8140
2024 Q453150,80320,8183
2025 Q159990,80510,8217
2025 Q264570,80380,8190
2025 Q371720,79800,8119
2025 Q478280,80160,8142
2026 Q187700,79560,8094

Praca magisterska w 5 minut

Aplikacja z pracy odtwarza rundę na Mirage z paskiem szansy na wygraną i jej krzywą w czasie
Aplikacja z pracy odtwarza rundę na radarze mapy z prawdopodobieństwem wygranej w czasie.

Klasyfikator zmian skórnych

Projekt na zajęcia z uczenia maszynowego na zdjęciach HAM10000: zmiana złośliwa czy łagodna. Własna sieć CNN kontra dostrojony EfficientNet-B0 w PyTorchu, z Optuną, focal loss, ważonym samplerem, MixUp i augmentacją przy teście, plus Grad-CAM, który pokazuje, gdzie patrzy model. Na 1002 obrazach testowych EfficientNet osiągnął AUC około 0,93 i czułość 0,95 dla zmian złośliwych, a własna CNN AUC 0,755. Eksperymenty w MLflow, interfejs w Streamlit.

Otwórz demo klasyfikatora

Każdy projekt ma też własną stronę: mateuszsliwa.dev/pl/thesis, mateuszsliwa.dev/pl/skin.

Narzędzia zbudowane do własnych wydań

storeshots i macsim, oba open source

Dwa narzędzia, które powstały przy wydawaniu aplikacji w pojedynkę, z linuksowego PC, z agentami do kodowania, które piszą sporą część kodu.

storeshots

Otwartoźródłowe narzędzie wiersza poleceń, które robi zrzuty do App Store z działającej aplikacji. Uruchamia ją w symulatorze iOS, układa ekrany w slajdy w HTML i CSS, renderuje je w dokładnych rozmiarach, których wymaga Apple, sprawdza je na wyrenderowanych pikselach (rozmiary, kanał alfa, wielkość tekstu, ucięcia, kontrast) i wysyła przez App Store Connect API. Każda komenda zwraca JSON, więc może je obsługiwać agent. Zrzuty EcoSort powyżej i w App Store powstały właśnie nim.

storeshots na GitHubieOtwórz demo

macsim

Piszę kod na linuksowym PC, a buildy iOS wymagają Maca. macsim zamienia Maca w sieci w zdalny serwer buildów i symulator iPhone'a. Jedna komenda synchronizuje projekt przez SSH, buduje go xcodebuildem albo Expo, instaluje i uruchamia, a Metro dalej działa na PC z hot reloadem. Agent na PC może klikać, pisać i robić zrzuty ekranu w symulatorze, a ja mogę oglądać go na żywo w przeglądarce. Ma dołączony skill dla Claude Code i Codexa, a używałem go przy buildach TrueSky i Keenwit.

macsim na GitHubieOtwórz demo

Każdy projekt ma też własną stronę: mateuszsliwa.dev/pl/storeshots, mateuszsliwa.dev/pl/macsim.

Napisz do mnie

[email protected]. CV po angielsku albo po polsku.