Michał "DualFroz" Fox

Michał "DualFroz" Fox

Full-stack developer znany jako dualfroz

Jestem full-stackowym deweloperem z Krakowa. Buduję produkty od początku do końca - infrastruktura, backend i interfejs na wierzchu - w większości pod szyldem VulCode, studia deweloperskiego, które ma zbudować silną polską markę w IT. Zależy mi na systemach, które są uczciwe co do tego, co naprawdę robią.

Jak myślę

Krótkie odpowiedzi, bez lania wody - najszybszy sposób, żeby poznać, jak ktoś pracuje.

Co cię napędza?

Zdrowy strach przed wypuszczeniem złego kodu. Dzięki niemu czytam własne zmiany tak, jakby napisał je ktoś obcy.

Droga tutaj

Jak z pierwszej strony internetowej zrobił się stos produktów.

Początki

Pierwsze linijki kodu

Pierwsze linijki kodu napisałem w 2020 roku. Zaczynałem od prostych stron statycznych, nic poważnego, ale każda następna uczyła czegoś, czego nie było w poprzedniej. Wszystko później to gonienie za tym samym uczuciem, kiedy coś, co napisałem, zadziałało pierwszy raz.

SCP:SL

Serwery i społeczność

Prowadziłem serwery SCP:SL i pisałem do nich własne dodatki w C#. Z tych dodatków wyrosła Nebula, zestaw pluginów, w którym flagowe narzędzie zajmuje się moderacją i analityką serwera. Pierwsi realni użytkownicy i pierwszy smak wypuszczania czegoś ludziom, którzy narzekają, gdy się psuje.

MatHost

Support i marketing

W MatHoście ogarniałem support techniczny przez setki zgłoszeń: serwery gier, boty Discord, Pterodactyl, a z czasem także marketing. Każde zgłoszenie pokazywało inny sposób, w jaki hosting potrafi się zepsuć, i tam nauczyłem się, jak to wygląda od środka.

Freelance

Projekty dla klientów

W 2024 roku zacząłem mocno freelance'ować. Budowałem projekty dla ludzi od początku do końca, ze skupieniem na architekturze i infrastrukturze, a nie pojedynczych funkcjach.

VulCode

Mój software house

VulCode to prowadzony przeze mnie polski software house: strony, panele i dashboardy, aplikacje oraz skalowalne platformy. Liczby niżej lecą na żywo z moich repozytoriów.

21 659 commitów
138 repozytoriów
5 247 604 napisanych linii
Aphrodi

Branding i marketing

Aphrodi to studio brandingu, digitalu i marketingu. Odpowiada za język wizualny i strategię, które dopełniają to, co w VulCode powstaje w kodzie.

Open source

Kontrybucje do open source

Dokładam się do projektów open source, z których korzystają miliony ludzi, od narzędzi deweloperskich po biblioteki. Część własnych narzędzi, jak vulp, też jest otwarta.

30 projektów OSS z wkładem
150 000+ gwiazdek OSS
200+ repozytoriów
SaaS

Własne platformy

Buduję własne SaaS-y: Flaem, platformę do hostingu z rdzeniem w Rust i Elixir, Atrium dla hoteli i obiektów noclegowych oraz Lokal dla gastronomii.

Warsztat

Zmierzone w linijkach na wszystkich repozytoriach - nie samoocena w gwiazdkach.

26języków
Język LinieProjekty %
TypeScript 1 949 95350 45,4
Rust 791 37811 18,4
Go 213 41413 5
Kotlin 206 1886 4,8
C# 162 8728 3,8
JavaScript 137 21338 3,2
Pozostałe (20) 833 751- 19,4

Policzone przez mój własny ghstats na wszystkich repozytoriach, 27.09.2026.

Czego używam i do czego

Nie przywiązuję się do jednego języka, narzędzie ma pasować do roboty. Najczęściej to TypeScript, a gdy coś ma wytrzymać obciążenie, Rust i Go.

Na co dzień

TypeScript to mój domyślny wybór. Stoją na nim moje frontendy, backendy i panele, bo w większości projektów to nie język jest trudną częścią.

TypeScript

frontendy, backendy i panele

1 949 953 linie

45% całego mojego kodu
  • React frontendy, panele, React Native
  • Node.js backendy z Expressem i Prismą
  • TailwindCSS style we wszystkich frontendach
  • JavaScript interakcje w przeglądarce, ta strona

Gdy ma wytrzymać

Tam, gdzie liczy się wydajność i kontrola nad pamięcią. W Ruście jest rdzeń Flaema, serwer Gyred i vulp, w Go backend Plazera i serwer Lunatic Chess, a węzłów Flaema pilnuje Elixir.

  1. Rust rdzeń Flaema, serwery, narzędzia CLI 791 378 linii11 projektów
  2. Go wydajne backendy i serwery gier 213 414 linii13 projektów
  3. Elixir nadzór węzłów we Flaemie 80 963 linie2 projekty

Pod spodem

Prawie każda usługa stoi w kontenerze Dockera za Nginxem. Dane trzymam w PostgreSQL, w mniejszych projektach w SQLite, a Redis robi za cache.

Przeglądarka

React, TailwindCSS

Dockerkontener pod prawie każdą usługą

Reverse proxy

Nginx

Backend

Node.js, Go, PHP, Python

Dane

PostgreSQL, SQLite, Redis

Na telefony

Na Androida piszę w Kotlinie, na iOS w Swifcie. Przy okazji powstał w Kotlinie własny silnik bazy danych, a w Swifcie interpreter Scheme.

Android

Kotlin

206 188 linii

6 projektów

iOS

Swift

116 812 linii

4 projekty

Od gier się zaczęło

Pierwsze były wtyczki w C# do serwerów SCP:SL, z których wyrosła Nebula. Dziś to skrypty w Lua, silnik wokselowy w C++ i grafika do tego, co robię.

C#

Od niego wszystko się zaczęło. Prowadziłem serwery SCP:SL i pisałem do nich własne dodatki, z których wyrosła Nebula, zestaw wtyczek z flagowym narzędziem do moderacji i analityki serwera. Później powstały w nim też emulatory starych konsol napisane od zera i dashboard do homelabu w Avalonii.

162 872 linie8 projektów

Lua

W Lua i TOML opisane są figury ze zdolnościami, mapy i efekty obszarowe w Lunatic Chess, czyli szachach online z modyfikowalnymi zasadami, pod którymi pracuje silnik w Go. Napisałem w niej też grę roguelike z bestiariuszem i ekwipunkiem.

32 053 linie2 projekty

C++

W C++ jest mój silnik gry wokselowej z własnym renderowaniem. Własną grę chciałem zrobić od dziecka, a tu powstaje ona od najniższej warstwy, bez gotowego silnika pod spodem.

57 275 linii2 projekty

Blender

W Blenderze modeluję i renderuję 3D do tego, co sam buduję. Modele 3D robię też w Aphrodi: produkt z dowolnego kąta w fotorealistycznych renderach, gotowy do sklepu i do reklamy.

Photoshop

W Photoshopie robię grafikę rastrową do swoich projektów. Grafika to też osobna część mojej pracy: w Aphrodi robię identyfikację wizualną, ilustracje i grafiki do social mediów.

DaVinci Resolve

W DaVinci Resolve montuję wideo do tego, co robię. W Aphrodi montuję też materiał klientów: tempo, kolor, dźwięk i napisy, w formatach pod każdą platformę.

Z ciekawości

W każdym z tych języków zbudowałem jedną konkretną rzecz, żeby zrozumieć, jak działa od środka.

  • Zig Wbudowana baza klucz-wartość z logiem zapisu.
  • Haskell Solver SAT z parserem formuł i narzędziami do logiki zdań.
  • Solidity Zdecentralizowana giełda z pulami płynności, stakingiem i timelockiem.
  • F# Mały, statycznie typowany język programowania z rodziny ML napisany od zera.
  • Scala Prosty silnik szachowy.
  • Ruby Własny framework webowy oparty wyłącznie na bibliotece standardowej, z obsługą WebSocketów.
  • Dart Silnik arkusza kalkulacyjnego z własnym językiem formuł.
  • C Hobbystyczny system operacyjny na x86_64, który bootuje w QEMU, z własnym planistą i trybem użytkownika.
  • Assembly Kod startowy mojego systemu operacyjnego, który przełącza procesor w tryb 64-bitowy.

Wszystko, czego używam, według warstw

Frontend

Interfejsy piszę w TypeScripcie na Reakcie, a style w Tailwindzie, od stron po panele. Czysty JavaScript zostaje tam, gdzie przeglądarka wystarczy sama, jak na tej stronie, która nie ma żadnego kroku budowania.

TypeScript 1 949 953 linie
Mój główny język: frontendy w React, backendy w Node.js i Express, panele i aplikacje. Prawie połowa kodu w moich repozytoriach to TypeScript.
JavaScript 137 213 linii
Interakcje i animacje w przeglądarce, jak na tej stronie napisanej w czystym JS. W większych projektach zastępuje go TypeScript.
TailwindCSS
Standard w moich frontendach, od stron po panele.
React
Podstawa moich frontendów i paneli, a w React Native także aplikacji Plazera.

Poza codziennym zestawem: Bootstrap (responsywny UI, dziś zastąpiony Tailwindem), Vue (framework do interfejsów), Angular (framework frontendowy).

Backend i API

Większość backendów to Node.js z Expressem i Prismą. Go wchodzi tam, gdzie liczy się wydajność i prostota, jak w Plazerze i serwerze Lunatic Chess. PHP trzyma backend tej strony, a Python robi skrypty, boty i monitoring.

Go 213 414 linii
Backend komunikatora Plazer, serwer gry Lunatic Chess i mniejsze gry sieciowe. Sięgam po niego tam, gdzie liczy się wydajność i prostota.
PHP 130 914 linii
Backend tej strony, sklep internetowy na własnym mikroframeworku i kustomizacja panelu Pterodactyl.
Python 83 484 linie
Skrypty i automatyzacje do pracy z serwerami, boty Discord i backend monitoringu usług.
Java 9 922 linie
Serwer statystyk, z którego biorą się liczby na tej stronie, i platforma rezerwacji w Spring Boot.
Node.js
Backendy na Node.js i Express z Prisma, obecne w większości moich paneli i stron.
FastAPI
Backend monitoringu usług VulCode.
Laravel
Kustomizacja panelu Pterodactyl, który jest zbudowany na Laravelu.
Symfony
Komponenty Symfony, na których opiera się Laravel w panelu Pterodactyl.

Poza codziennym zestawem: ASP.NET Core (API w .NET), Flask (mniejsze usługi w Pythonie), Django (duże aplikacje w Pythonie).

Systemy i niski poziom

Rust dostaje rzeczy, które muszą być szybkie i pod pełną kontrolą pamięci: rdzeń Flaema, serwer Gyred i terminalowy vulp. Węzłów Flaema pilnuje Elixir na OTP. Najniżej jest hobbystyczny system operacyjny w C, z kodem startowym w asemblerze, który bootuje w QEMU.

Rust 791 378 linii
Rdzeń platformy hostingowej Flaem, serwer Gyred i terminalowy vulp. Wybieram go tam, gdzie potrzebuję pełnej kontroli nad pamięcią i wydajnością.
Elixir 80 963 linie
Nadzór węzłów we Flaemie oparty na OTP i serwer klucz-wartość w pamięci mówiący protokołem Redisa.
C 49 346 linii
Hobbystyczny system operacyjny na x86_64, który bootuje w QEMU, z własnym planistą i trybem użytkownika.
Assembly 397 linii
Kod startowy mojego systemu operacyjnego, który przełącza procesor w tryb 64-bitowy.
Aplikacje mobilne

Na telefony piszę natywnie: Kotlin na Androida, Swift na iOS. W Kotlinie powstał też własny silnik relacyjnej bazy danych, a w Swifcie interpreter Scheme.

Kotlin 206 188 linii
Natywne aplikacje na Androida, własny silnik relacyjnej bazy danych i mały język skryptowy.
Swift 116 812 linii
Natywne aplikacje na iOS i interpreter języka Scheme.
Gry, modding i grafika

Od gier się zaczęło: wtyczki w C# do serwerów SCP:SL, z których wyrosła Nebula. Dziś to skrypty w Lua do Lunatic Chess, silnik wokselowy w C++ i grafika, modele oraz montaż do tego, co robię.

C# 162 872 linie
Wtyczki do SCP:SL, z których wyrosła Nebula, dashboard do homelabu w Avalonii i emulatory starych konsol napisane od zera.
C++ 57 275 linii
Silnik gry wokselowej z własnym renderowaniem.
Lua 32 053 linie
Gra roguelike z bestiariuszem i ekwipunkiem oraz skrypty figur i map w Lunatic Chess.
Photoshop
Grafika rastrowa.
DaVinci Resolve
Montaż wideo.
Blender
Modelowanie i renderowanie 3D.

Poza codziennym zestawem: Unity (silnik gier), Godot (otwartoźródłowy silnik gier), Unreal Engine (gry 3D).

Bazy danych

Domyślnie SQLite przez Prismę, bo w mniejszym projekcie nic więcej nie trzeba. Kiedy projekt rośnie, jak Plazer i Flaem, wchodzi PostgreSQL, a Redis robi tam za cache. MySQL został z paneli hostingowych i Pterodactyla.

MySQL
Baza pod panelem Pterodactyl i panelami hostingowymi.
SQLite
Domyślna baza w mniejszych projektach i panelach na Prisma.
JSON
Format wymiany danych, między innymi między moim serwerem statystyk a tą stroną.
PostgreSQL
Baza pod Plazerem i Flaemem, gdy projekt potrzebuje więcej niż SQLite.
Redis
Cache w Plazerze i Flaemie.

Poza codziennym zestawem: MongoDB (dokumentowa baza NoSQL), ClickHouse (analityka w czasie rzeczywistym), Cassandra (rozproszona, wysoka dostępność).

Infrastruktura i narzędzia

Prawie każda moja usługa stoi w kontenerze na Docker Compose, za Nginxem jako reverse proxy. Ponad setką repozytoriów zarządzam przez Gita i vulp, a kod piszę w VS Code.

Git
Podstawa pracy nad ponad setką repozytoriów, a do zarządzania nimi naraz używam vulp.
Docker
Prawie każda moja usługa stoi w kontenerze, najczęściej na Docker Compose za Nginxem.
Nginx
Reverse proxy przed wszystkimi usługami na moich serwerach.
VS Code
Główny edytor kodu.
Visual Studio
IDE do C# i .NET.

Poza codziennym zestawem: Kubernetes (orkiestracja na dużą skalę), Grafana (dashboardy z metrykami), JetBrains IDEs (IDE od JetBrains).

Z ciekawości

Języki, w których zbudowałem jedną konkretną rzecz, żeby zrozumieć, jak działa od środka: bazę klucz-wartość w Zigu, solver SAT w Haskellu, giełdę w Solidity, własny język w F#.

Dart 6 013 linii
Silnik arkusza kalkulacyjnego z własnym językiem formuł.
Solidity 4 688 linii
Zdecentralizowana giełda z pulami płynności, stakingiem i timelockiem.
Ruby 37 655 linii
Własny framework webowy oparty wyłącznie na bibliotece standardowej, z obsługą WebSocketów.
Zig 44 583 linie
Wbudowana baza klucz-wartość z logiem zapisu.
Haskell 3 609 linii
Solver SAT z parserem formuł i narzędziami do logiki zdań.
Scala 3 133 linie
Prosty silnik szachowy.
F# 3 017 linii
Mały, statycznie typowany język programowania z rodziny ML napisany od zera.

Linie i projekty przy językach są zmierzone na moich repozytoriach.