Projekty

Wszystko, co tu jest, działa albo działało naprawdę. Linki prowadzą do żywych stron, a szczegóły techniczne są o jedno kliknięcie dalej.

Działa. Kliknij i sprawdź.

  • pixelarena.pro
    Strona główna PixelArena

    PixelArena i Playergency

    Platforma dla graczy, którą rozwijam od 2017 roku: dziś dwa serwisy, sklep, minigry multiplayer i serwery gier.

    Zaczęła się od bota i strony dla Playergency – społeczności graczy na Discordzie (wcześniej eRPe, działa od 2016), która nie jest moja. Dziś jedna baza kodu obsługuje playergency.com i pixelarena.pro.

    Moja rola: aplikacja, bot, serwery gier i infrastruktura

    • minigry przeglądarkowe multiplayer w czasie rzeczywistym – warcaby, wisielec, wspólne oglądanie, matchmaking (Colyseus, WebSocket)
    • serwery gier CS2 i CS:GO na Kubernetesie z panelem: konsola na żywo, aktualizacje gry i restarty, gdy nikt nie gra; Minecraft w przygotowaniu
    • jedno konto dla obu serwisów i forum, z logowaniem dwuskładnikowym (Better Auth, SSO do Discourse)
    • sklep z integracją płatności i bot Discord (discord.js)
    • typowane API na Hono i oRPC z MariaDB przez Drizzle, monorepo na Bunie i Turborepo, dwa frontendy SvelteKit po polsku i angielsku

    rozwijane, 2026

    TypeScript · SvelteKit · Discord · .NET · Kubernetes

  • ghost-pizza.pl
    Strona główna GhostPizza z menu

    GhostPizza

    Strona pizzerii przepisana od nowa: 100 punktów w Lighthouse i zero JavaScriptu na publicznych stronach.

    Właściciel sam zmienia menu w prostym panelu.

    Moja rola: wygląd, kod i wdrożenie

    2026 – nowa wersja; wygląd z pierwszej wersji, którą zrobiłem w technikum

    Bun · Hono · Svelte

Infrastruktura pod tym wszystkim

Dwa klastry Kubernetes, produkcyjny i domowy, w całości opisane w gicie, z monitoringiem, alertami i kopiami zapasowymi.

Moja rola: projekt, budowa i utrzymanie

  • Talos
  • Cilium
  • Argo CD
  • Prometheus
  • Gitea CI

Dla organizacji

  • ludzkigestoborniki.pl
    Strona główna organizacji

    Strona organizacji pozarządowej

    Nowa strona zbudowana z myślą o dostępności, tak żeby dało się z niej korzystać także z czytnikiem ekranu.

    Moja rola: nowa strona, dostępność, wdrożenie

    • deklaracja dostępności
    • opisy alternatywne wszystkich zdjęć
    • tekst ze skanów dokumentów odczytany, więc czytnik ekranu go przeczyta
    • automatyczny test dostępności (axe) bez błędów
    • panel z logowaniem dwuskładnikowym

    2026

    WordPress · WCAG

Intranet dla ~1000 stanowisk

2026

Autorski intranet dla organizacji z dwiema lokalizacjami i około 1000 stanowisk. Działa w całości w sieci LAN, bez zewnętrznych zależności w czasie działania: SvelteKit i Hono na serwerze z Linuksem, dane w MariaDB.

Moja rola: projekt, kod i wdrożenie

System wewnętrzny – kod należy do organizacji, więc go nie pokazuję. O tym, jak działa, chętnie opowiem na rozmowie.

  1. Czytanie bez logowania, edycja po zalogowaniu

    Każdy pracownik w sieci widzi strony, aktualności, dokumenty i menu stołówki bez logowania. Zalogowanie jest potrzebne tylko do edycji – a uprawnienia można nadać do pojedynczej strony albo jednego kanału aktualności.

  2. Dokumenty zostają na udziałach

    Intranet nie kopiuje folderów z dokumentami. Czyta istniejące udziały SMB w trybie tylko do odczytu, listę plików trzyma w cache w bazie (odświeżanym w tle), a PDF otwiera się we wbudowanym podglądzie przeglądarki.

  3. Posiłki dla drugiej lokalizacji

    Pracownicy drugiej lokalizacji zamawiają posiłki na bieżący tydzień, potwierdzając tożsamość kontem firmowym (LDAP z ograniczeniem do jednostki). Menu ustawia zalogowany administrator, zamówienie przychodzi mailem, a kuchnia dostaje dzienne zestawienie w Excelu.

  4. Anonimowe zgłoszenia z prywatnością w projekcie

    Formularz nie zapisuje IP ani przeglądarki. Pierwotna treść zgłoszenia jest zamrożona, a dane osobowe są kasowane automatycznie przy zamknięciu sprawy. Dostęp ma tylko jedna wskazana rola – nawet administrator systemu go nie ma.

  5. Samowystarczalny

    Fonty, ikony i podgląd PDF są serwowane z tego samego serwera – bez CDN, nic nie jest ładowane z internetu. Potwierdzenia i powiadomienia o zgłoszeniach wychodzą przez wewnętrzny serwer poczty.

Architektura intranetuLAN – bez zewnętrznych zależności w działaniuUżytkownicy w sieci LANBrzeg sieci (serwer)Serwer aplikacji (Linux)DaneUsługi w LANPracownik (bez logowania)HTTPS – odczyt treści, bez logowaniaRedaktor / administrator(zalogowany)HTTPS – logowanie i edycjaPracownik drugiejlokalizacjiHTTPS – zamówienie posiłkówZgłaszający anonimowoHTTPS – formularz anonimowyEkran z menu stołówkiHTTPS – menu dnia (odświeżane)NginxTLS, reverse proxy,pliki statycznezapytania APIstrony HTMLAPI (Hono)Sesje + RBACuprawnienia per zasóbsesja + sprawdzenie uprawnień (tylkozapis)Zadania w tleodświeżanie listingów udziałówAplikacja web (SvelteKit)Baza danych (MariaDB)treści, uprawnienia, audyt,cache listingówSQLzapis cache listingówUdziały plikowe SMBtylko odczytSMB – listing i odczyt plikówodświeżanie listingów w tleKatalog firmowy (LDAP/ AD)LDAP – tylko tożsamośćzamawiającego posiłkiSerwer pocztywewnętrznypotwierdzenia zamówień,powiadomienia o zgłoszeniachżądanie obsługiwane przez APIzadanie w tleArchitektura intranetuLAN – bez zewnętrznych zależności wdziałaniuUżytkownicy w sieci LANBrzeg sieci (serwer)Serwer aplikacji (Linux)DaneUsługi w LANPracownik (bez logowania)HTTPS – odczyt treści, bez logowaniaRedaktor / administrator(zalogowany)HTTPS – logowanie i edycjaPracownik drugiej lokalizacjiHTTPS – zamówienie posiłkówZgłaszający anonimowoHTTPS – formularz anonimowyEkran z menu stołówkiHTTPS – menu dnia (odświeżane)NginxTLS, reverse proxy, pliki statyczneAplikacja web (SvelteKit)strony HTMLAPI (Hono)zapytania APISesje + RBACuprawnienia per zasóbsesja + sprawdzenie uprawnień (tylkozapis)Zadania w tleodświeżanie listingów udziałówBaza danych (MariaDB)treści, uprawnienia, audyt, cachelistingówSQLzapis cache listingówUdziały plikowe SMBtylko odczytSMB – listing i odczyt plikówodświeżanie listingów w tleKatalog firmowy (LDAP / AD)LDAP – tylko tożsamośćzamawiającego posiłkiSerwer pocztywewnętrznypotwierdzenia zamówień,powiadomienia o zgłoszeniachżądanie obsługiwane przez APIzadanie w tle

Intranet działa w całości w sieci LAN, bez zewnętrznych zależności w działaniu. Pięć grup użytkowników łączy się przez HTTPS z serwerem Nginx: pracownik czyta treści bez logowania, redaktor lub administrator loguje się i edytuje, pracownik drugiej lokalizacji zamawia posiłki, zgłaszający wysyła formularz anonimowy, a ekran stołówki pokazuje odświeżane menu dnia. Nginx obsługuje TLS i pliki statyczne, strony HTML przekazuje do aplikacji web w SvelteKit, a zapytania API do API w Hono na serwerze z Linuksem. API sprawdza sesję i uprawnienia tylko przy zapisie, trzyma dane w bazie MariaDB, czyta udziały plikowe SMB tylko do odczytu, w katalogu firmowym (LDAP) potwierdza wyłącznie tożsamość zamawiającego posiłki i przez wewnętrzny serwer poczty wysyła potwierdzenia zamówień i powiadomienia o zgłoszeniach. Zadania w tle odświeżają listingi udziałów w cache bazy.