<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mateusz Muszarski: blog</title>
    <link>https://muszarski.com/pl/blog/</link>
    <atom:link href="https://muszarski.com/pl/rss.xml" rel="self" type="application/rss+xml"/>
    <description>Notatki z budowania produktów: AI w programowaniu, Lingui, wydajność i dostępność.</description>
    <language>pl</language>
    <item>
      <title>yws.lu: w jeden dzień przeniosłem stronę luksemburskiej organizacji non-profit z Next.js na Astro</title>
      <link>https://muszarski.com/pl/blog/yws-lu-case-study/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/yws-lu-case-study/</guid>
      <description>Case study: migracja strony w Next.js z 3D na statyczne Astro w jeden dzień z Claude Code. Lighthouse na telefonie w laboratorium: z 23-28 na 99-100.</description>
      <pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate>
      <category>case-study</category>
      <category>astro</category>
      <category>performance</category>
      <category>ai</category>
    </item>
    <item>
      <title>Psychologia w UX i na frontendzie: perswazja, której możesz bronić</title>
      <link>https://muszarski.com/pl/blog/psychologia-w-ux-i-frontendzie/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/psychologia-w-ux-i-frontendzie/</guid>
      <description>Niedobór, dowód społeczny, kotwice, ustawienia domyślne i paski postępu w kodzie, uczciwie. I gdzie prawo UE i UOKiK stawiają granicę dark patterns.</description>
      <pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
      <category>design</category>
    </item>
    <item>
      <title>Aplikacja mobilna w pojedynkę: Linkoglot od jednej bazy kodu do dwóch sklepów</title>
      <link>https://muszarski.com/pl/blog/aplikacja-mobilna-w-pojedynke/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/aplikacja-mobilna-w-pojedynke/</guid>
      <description>Jak sam zbudowałem i wydałem Linkoglot, aplikację AI do nauki języków: Expo, Supabase, RevenueCat, Lingui w 30 językach i wymagania obu sklepów.</description>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <category>react</category>
      <category>i18n</category>
      <category>ai</category>
    </item>
    <item>
      <title>Dlaczego moje portfolio w three.js było wolne na telefonie i czego potrzebuje strona 3D</title>
      <link>https://muszarski.com/pl/blog/dlaczego-moje-portfolio-threejs-bylo-wolne/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/dlaczego-moje-portfolio-threejs-bylo-wolne/</guid>
      <description>Moje stare portfolio w three.js miało 34 punkty w mobilnym Lighthouse. Co je spowalniało i lista kontrolna dla strony 3D, która działa szybko na telefonie.</description>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <category>performance</category>
      <category>react</category>
      <category>accessibility</category>
    </item>
    <item>
      <title>Efekty hover na telefonach: każdy ma odpowiednik dla palca, klawiatury lub przewijania</title>
      <link>https://muszarski.com/pl/blog/efekty-hover-na-telefonach/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/efekty-hover-na-telefonach/</guid>
      <description>Telefon nie ma kursora. Jak ta strona zamyka hover w (hover: hover) and (pointer: fine) i daje każdemu efektowi odpowiednik dla dotyku i fokusu.</description>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <category>accessibility</category>
      <category>design</category>
    </item>
    <item>
      <title>Formularz kontaktowy na statycznej stronie: jedna funkcja, wysyłka z serwera i jeden błąd 500</title>
      <link>https://muszarski.com/pl/blog/formularz-kontaktowy-na-statycznej-stronie/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/formularz-kontaktowy-na-statycznej-stronie/</guid>
      <description>Jedna funkcja Vercel obok statycznego Astro: formularz od treści, trzy zabezpieczenia przed botami, EmailJS z serwera, działanie bez JS i jeden błąd ESM.</description>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <category>astro</category>
      <category>accessibility</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Jak sprawić, żeby CV na stronie i CV w PDF-ie nigdy się nie rozjechały?</title>
      <link>https://muszarski.com/pl/blog/cv-strona-i-pdf-z-jednego-zrodla/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/cv-strona-i-pdf-z-jednego-zrodla/</guid>
      <description>CV na stronie i trzy pliki PDF (en, pl, es) powstają z jednego pliku TypeScript. Playwright drukuje zaprojektowany arkusz A4, a test łapie każdy rozjazd.</description>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <category>astro</category>
      <category>i18n</category>
      <category>accessibility</category>
    </item>
    <item>
      <title>Lighthouse na 16 portfolio programistów: immersyjne kontra minimalistyczne</title>
      <link>https://muszarski.com/pl/blog/lighthouse-16-portfolio-programistow/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/lighthouse-16-portfolio-programistow/</guid>
      <description>Mobilny Lighthouse, po 3 pomiary, na 16 portfolio programistów: mediana stron 3D 35,5, minimalistycznych 74,5. Metoda, wyniki i czego wynik nie widzi.</description>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <category>performance</category>
      <category>accessibility</category>
    </item>
    <item>
      <title>Wielojęzyczna strona w Astro z Lingui: adresy, hreflang i przełącznik języka, który nie gubi miejsca</title>
      <link>https://muszarski.com/pl/blog/wielojezyczna-strona-astro-z-lingui/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/wielojezyczna-strona-astro-z-lingui/</guid>
      <description>Jak ta strona działa po angielsku, polsku i hiszpańsku z jednego statycznego builda Astro: adresy z językiem, slugi, hreflang i przełącznik języka.</description>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <category>i18n</category>
      <category>astro</category>
    </item>
    <item>
      <title>Próbuję zbudować brutalistyczne portfolio na miarę Awwwards: proces, sposób myślenia i narzędzia</title>
      <link>https://muszarski.com/pl/blog/case-study/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/case-study/</guid>
      <description>Case study: dlaczego zamieniłem portfolio 3D na plakat. Research, strony, od których się uczyłem, każda wersja i shadery, które nie przeszkadzają.</description>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>case-study</category>
      <category>ai</category>
      <category>astro</category>
      <category>performance</category>
    </item>
    <item>
      <title>Analityka bez cookies w Polsce: Umami, RODO i art. 399 Prawa komunikacji elektronicznej</title>
      <link>https://muszarski.com/pl/blog/analityka-bez-cookies-w-polsce/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/analityka-bez-cookies-w-polsce/</guid>
      <description>Brak cookies nie oznacza automatycznie braku zgody. Co mówią RODO i art. 399 Prawa komunikacji elektronicznej oraz trzy stanowiska, których da się bronić.</description>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>privacy</category>
    </item>
    <item>
      <title>Astro czy Next.js na portfolio albo landing page</title>
      <link>https://muszarski.com/pl/blog/astro-czy-nextjs-na-portfolio/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/astro-czy-nextjs-na-portfolio/</guid>
      <description>Kiedy Astro pasuje do portfolio i landing page'a, a kiedy lepszy jest Next.js: dane Core Web Vitals z HTTP Archive i pomiary tej strony.</description>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>astro</category>
      <category>performance</category>
      <category>react</category>
    </item>
    <item>
      <title>Claude Code po polsku: jak zacząć i pracować z nim na co dzień</title>
      <link>https://muszarski.com/pl/blog/claude-code-po-polsku/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/claude-code-po-polsku/</guid>
      <description>Przewodnik dla polskich programistów: instalacja Claude Code, pierwsza sesja, CLAUDE.md, plan, uprawnienia, weryfikacja i uczciwie o kosztach.</description>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>ai</category>
      <category>claude-code</category>
    </item>
    <item>
      <title>Lingui czy i18next w 2026: która biblioteka i18n do React i React Native</title>
      <link>https://muszarski.com/pl/blog/lingui-czy-i18next/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/lingui-czy-i18next/</guid>
      <description>Lingui i i18next porównane na podstawie dokumentacji i danych z npm: format komunikatów, makra, kompilacja, rozmiar, liczba mnoga i React Native.</description>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>i18n</category>
      <category>react</category>
    </item>
    <item>
      <title>LLM wiki: pamięć projektu dla Claude Code, która przetrwa kompaktowanie</title>
      <link>https://muszarski.com/pl/blog/llm-wiki-pamiec-projektu-dla-claude-code/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/llm-wiki-pamiec-projektu-dla-claude-code/</guid>
      <description>Jak sprawiam, że Claude Code nie zapomina: wiki z plików markdown, tabela routingu, plik lekcji i trzy hooki, które wczytują je po kompaktowaniu.</description>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>ai</category>
      <category>claude-code</category>
    </item>
    <item>
      <title>Ruch, który szanuje ludzi: prefers-reduced-motion i przycisk pauzy</title>
      <link>https://muszarski.com/pl/blog/reduced-motion-i-przycisk-pauzy/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/reduced-motion-i-przycisk-pauzy/</guid>
      <description>Jak ta strona obchodzi się z ruchem: pauza zgodna z WCAG 2.2.2, prefers-reduced-motion, pętle stające poza ekranem i wejścia, które nie ukrywają treści.</description>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>accessibility</category>
      <category>design</category>
    </item>
    <item>
      <title>Skille, hooki, serwery MCP i subagenty w Claude Code: co wybrać i kiedy</title>
      <link>https://muszarski.com/pl/blog/claude-code-skille-hooki-mcp-subagenty/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/claude-code-skille-hooki-mcp-subagenty/</guid>
      <description>Kiedy w Claude Code sięgnąć po CLAUDE.md, skill, hook, serwer MCP albo subagenta: oficjalna dokumentacja i prawdziwy zestaw, na którym powstała ta strona.</description>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>ai</category>
      <category>claude-code</category>
    </item>
    <item>
      <title>Tekst dopasowany do szerokości kontenera w czasie builda, dzięki fontowi zmiennemu</title>
      <link>https://muszarski.com/pl/blog/dopasowanie-tekstu-do-szerokosci/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/dopasowanie-tekstu-do-szerokosci/</guid>
      <description>Jak moje imię i nazwisko wypełniają szerokość strony bez JavaScriptu: metryki fontu liczone w buildzie, oś wdth, jednostki cqi i font-stretch.</description>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>typography</category>
      <category>performance</category>
      <category>design</category>
    </item>
    <item>
      <title>Tłumaczenie katalogów Lingui przez LLM</title>
      <link>https://muszarski.com/pl/blog/tlumaczenie-katalogow-lingui-przez-llm/</link>
      <guid isPermaLink="true">https://muszarski.com/pl/blog/tlumaczenie-katalogow-lingui-przez-llm/</guid>
      <description>Jak tłumaczyć katalogi .po z Lingui modelem językowym, co się psuje (zmienne, liczba mnoga, ton) i jakie testy puścić, zanim katalog trafi na produkcję.</description>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>i18n</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
