Przemysław Zalewski #
Kocham issues na GitHubie w starych bibliotekach. 6 lat dyskusji, 140 komentarzy "+1", zero PR-ów. Open source jako sport widowiskowy
Rzeczy techniczne. Bez slopu.
crypto.randomUUID() działa natywnie w przeglądarce i w Node. Paczka uuid ma 100 mln pobrań tygodniowo. Ludzkość pobiera bibliotekę do czegoś, co ma za darmo, 100 mln razy w tygodniu 📦console.log("tu jestem 2"). Za pół roku, o 3 w nocy, będziesz szukał po polach, a nie po "tu jestem 2" w 400 tysiącach liniiCache-Control: stale-while-revalidate=60. User dostaje starą wersję od razu, a w tle leci odświeżenie. Szybkość jak z cache, świeżość prawie jak bez. Najlepszy kompromis od czasu pizzy hawajskiejfbclid i utm_* w linkach to śledzenie. Usuwaj przed wysłaniem dalej. Albo nie, niech Zuckerberg wie, że oglądasz przepisy na pierogi o 3 w nocygrep -r znajdzie mi plik w repo. Szacunek i lekka depresjaemail-bugs na GitHubie to moja ulubiona lektura do poduszki. Każdy klient pocztowy psuje HTML inaczej. Outlook renderuje maile silnikiem Worda. Słownie: Worda. W 2025. Maile to frontend na poziomie hardgap działa w flexboxie od 2021. Jeśli dalej robisz margin-right na wszystkich dzieciach poza ostatnim, to masz kod starszy niż TikTokgit bisect znajdzie commit, który zepsuł buga, w log2(n) krokach. 1000 commitów to 10 sprawdzeń. Najlepsze narzędzie, którego nikt nie używastructuredClone kopiuje Mapy, Sety, Daty i cykliczne referencje. JSON.parse(JSON.stringify()) zgubi Datę, wywali się na cyklu i zje undefined. Czas pożegnać hacki z 2015select-from-users where-id-eq-1. Klasy w SQL-u. Brakowało tylko dark: dla zapytań po 22:00structuredClone(obj) robi deep copy z datami, mapami i cyklami. JSON.parse(JSON.stringify(x)) możecie pochować obok Reduxa 🪦ssh terminal.shop, wybierasz strzałkami, płacisz, kawa przychodzi. Zero cookie bannera, zero React, zero "zaakceptuj 300 partnerów". Przyszłość e-commerce wygląda jak 1995 ☕AbortSignal.timeout(5000) zamiast ręcznego setTimeout + controller.abort(). Jedna linijka, zero wycieków. Kto dalej pisze własny fetchWithTimeout, ten pierwszy rzuca kamieniem 🪨Intl.PluralRules('pl') zwraca one / few / many. Nie róbcie count === 1 ? 'plik' : 'pliki', bo potem "5 pliki" i wstyd na pół internetu.Intl.Segmenter liczy znaki tak, jak widzi je człowiek. '👨👩👧'.length === 8, a segmenter mówi 1. Walidacja "max 280 znaków" na .length to bug, który czeka na rodzinę z emoji 👪Sec-Fetch-Site: same-origin - darmowa ochrona przed CSRF w każdej nowoczesnej przeglądarce. Sprawdzacie jeden nagłówek i połowa tokenów CSRF idzie do kosza.
PRAGMA journal_mode=WAL; i nagle czytanie nie blokuje pisania. SQLite to nie zabawka, to najczęściej wdrożona baza danych na świecie. Jest w Twoim telefonie, w Twoim samochodzie i pewnie w Twojej lodówce.
ctx.waitUntil() na rzeczy po odpowiedzi (logi, analityka, cache). User dostaje odpowiedź od razu, a Ty dalej robisz swoje. Jak kelner, który najpierw podaje, a potem liczy napiwkiEXPLAIN ANALYZE przed każdą dyskusją "baza jest wolna". Pomiar przed opinią. W 9 na 10 przypadków brakuje indeksu, w 1 na 10 ktoś robi N+1 w pętli w ORM-ie 🤦:has() działa wszędzie. form:has(:invalid) button { opacity: .5 } - zero JS-a. Natywny nesting też jest. Sass, dziękujemy za współpracę 👋content-visibility: auto na długich listach i przeglądarka nie renderuje tego, czego nie widać. Darmowe 60 FPS bez wirtualizacji i bez paczki z npm 🚀

Date w JS liczy miesiące od 0, a dni od 1. Ktoś to zaprojektował, zatwierdził i poszedł do domu spokojnie spać 📅<meta name="color-scheme" content="dark light"> + klasa na <html> z SSR-a. Paski przewijania i pola formularzy same się dopasują. Bez czekania na Reacta.AbortController do fetchy w useEffect. Bez tego szybki user klika 5 razy i dostajesz odpowiedzi w losowej kolejności. Race condition jak w MonacoCache-Control: public, max-age=31536000, immutable. HTML → no-cache. Dwie linijki konfiguracji i CDN robi resztę. Kto cache'uje HTML na rok, ten deployuje dwa razy 😄dig TXT _dmarc.twojadomena.pl zanim zapytasz, czemu newsletter nie dochodzi 📧Promise.withResolvers() - koniec z let resolve; new Promise(r => resolve = r). Mała rzecz, a cieszy jak zielone CI.0.1 + 0.2 !== 0.3 w każdym języku z IEEE 754, nie tylko w JS. Pieniądze trzymaj w groszach jako integer. Albo w BigInt, jak masz rachunek z Vercela
Promise.allSettled zamiast Promise.all, jak jeden fail nie powinien ubić reszty. Do maili, webhooków, czegokolwiek z sieci. Jedna linijka, a nie budzisz się o 3 w nocygit commit --fixup + git rebase -i --autosquash. Historia czysta, jakbyś od początku wiedział, co robisz. Iluzja kompetencji w dwóch komendach
URL.canParse(str) zamiast try { new URL(str) } catch {}. A jak walidujecie URL regexem, to macie dwa problemy 😄
WHERE, która jest w 90% zapytań. Zapytanie z 4 s do 4 ms. Najtańsza optymalizacja świata. EXPLAIN ANALYZE to Twój przyjaciel 🔍node_modules dla promptów. Na szczęście jeszcze bez 400 MB zależności 📦p=quarantine albo reject, SVG w profilu Tiny PS i max 32 KB. Zero JS-a w SVG, zero zewnętrznych obrazków. Najbardziej restrykcyjny SVG w internecie.eslintrc, .prettierrc, babel.config, postcss.config, tailwind.config, next.config... Liczyłem. Mniej więcej 😛any, to nie schema. To pamiętnik z wakacji: "coś tam było, nie pamiętam co"new Date("2026-10-11") to północ UTC, czyli w Polsce 2:00. A new Date(2026, 9, 11) to północ lokalnie i październik to 9. Kto to projektował, niech się zgłosi po nagrodę

prefers-reduced-motion szanujcie. Parallax na landingu to dla części ludzi choroba lokomocyjna, nie "wow effect".console.table(dane) zamiast console.log przy tablicach obiektów. Wygląda jak Excel, tylko nie musisz płacić Microsoftowiawait expect(locator).toBeVisible() zamiast waitForTimeout(3000). Każdy sleep w teście to przyszły flaky o 3 w nocy ⏰
fetch nie rzuca wyjątku na 404 ani 500. Rzuca tylko, jak sieć padnie. Sprawdzaj res.ok. Każdy się na tym przejechał raz. Ja dwaArray.prototype.toSorted() zwraca nową tablicę, sort() mutuje oryginał. Jedna litera różnicy i godzina debugowania, czemu lista zmieniła się w innym komponencieNO zamienia się w false. Tak, serio, poczytajcie "Norway problem" 🇳🇴
Link prowadzi prosto do tej wiadomości. Przemek wie, kto klika. Nie wie, ale brzmi groźnie.