[{"data":1,"prerenderedAt":1822},["ShallowReactive",2],{"post:\u002Fblog\u002Fmniej-szumu-wiecej-wnioskow-czyli-jak-ai-przeglada-mi-zgloszenia-z-sentry":3,"surround:\u002Fblog\u002Fmniej-szumu-wiecej-wnioskow-czyli-jak-ai-przeglada-mi-zgloszenia-z-sentry":943,"related:\u002Fblog\u002Fmniej-szumu-wiecej-wnioskow-czyli-jak-ai-przeglada-mi-zgloszenia-z-sentry":949,"categories":979,"tags":1049,"post-author:maciej-walczak":1808},{"id":4,"title":5,"author":6,"body":7,"categories":918,"comments":920,"cover":15,"coverAlt":13,"date":921,"description":922,"draft":923,"extension":924,"hidden":923,"meta":925,"navigation":920,"path":926,"readingTime":927,"redirectFrom":928,"seo":929,"sitemap":930,"slug":931,"stem":932,"tags":933,"updated":941,"wpId":941,"__hash__":942},"blog\u002Fblog\u002F2026-10-14-mniej-szumu-wiecej-wnioskow-czyli-jak-ai-przeglada-mi-zgloszenia-z-sentry.md","Mniej szumu, więcej wniosków – czyli jak AI przegląda mi zgłoszenia z Sentry","maciej-walczak",{"type":8,"value":9,"toc":898},"minimark",[10,17,44,47,50,55,66,69,77,84,88,93,112,213,216,219,226,298,301,312,315,333,337,354,358,365,372,376,379,409,413,416,419,423,426,436,440,443,487,490,548,551,607,614,618,625,628,641,661,665,672,740,743,747,750,776,783,787,790,797,810,814,821,828,835,838,870,874,881,884,887,891,894],[11,12],"figure",{"alt":13,"height":14,"src":15,"width":16},"Robot AI przy laptopie analizuje listę zgłoszeń z Sentry – grupuje podobne błędy, wykrywa przyczyny, wskazuje priorytety i proponuje rozwiązania",1086,"https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002F2026\u002F10\u002Fsentry-claude-code-okladka.png",1448,[18,19,20,21,29,30,36,37,43],"p",{},"W jednym z ostatnich wpisów ",[22,23,24],"strong",{},[25,26,28],"a",{"href":27},"\u002Fblog\u002Fga4-i-claude-code-analityka-www-wsparta-przez-ai","GA4 i Claude Code – analityka www wsparta przez AI"," wspomniałem jednym zdaniem, że sklep ",[25,31,35],{"href":32,"rel":33},"https:\u002F\u002Fflora-art.pl",[34],"nofollow","flora-art.pl"," korzysta jeszcze z kilku innych narzędzi, w tym z Sentry. Z kolei we wpisie ",[22,38,39],{},[25,40,42],{"href":41},"\u002Fblog\u002Fprogramista-w-czasach-ai","Programista w czasach AI"," napisałem, że zgłoszenia z Sentry analizuję razem z AI. Obie te wzmianki aż się prosiły o rozwinięcie, więc dziś biorę ten temat na warsztat.",[18,45,46],{},"Kiedy pierwszy raz porządnie przejrzałem z Claude Code wszystkie zdarzenia z ostatnich 30 dni, okazało się, że ok. dwie trzecie „błędów” wygenerowałem sam – z własnego laptopa, podczas pracy. Z tego, co przychodziło od prawdziwych klientów, większość zresztą stanowiły raporty bezpieczeństwa z przeglądarek. Błędy samego sklepu z produkcji? Około 4% wszystkich zdarzeń…",[18,48,49],{},"Instrukcji instalacji SDK tu nie będzie – oficjalna dokumentacja modułu dla Nuxta zrobi to lepiej niż ja. Opiszę za to, jak z Sentry pracuję: co wysyłam świadomie, co Sentry zbiera sam, jak agent AI czyta zgłoszenia przez MCP, co z tego wynika i jak gaszę szum. No to lecimy…",[51,52,54],"h2",{"id":53},"po-co-mi-sentry-w-małym-sklepie","Po co mi Sentry w małym sklepie?",[18,56,57,58,61,62,65],{},"Krótko o kontekście. Serwis flora-art.pl to strona mojej żony – jej wizytówka, realizacje, a także sklep online – wszystko w 3 wersjach językowych. Pod spodem ",[22,59,60],{},"Nuxt 4"," (SSR, ISR, część stron prerenderowana), funkcje serverless na ",[22,63,64],{},"Vercelu",", PostgreSQL w Neonie (przez Prismę), kolejka zadań po zamówieniu w Upstash QStash oraz cała gromada integracji: BaseLinker, bramki płatnicze Autopay i Revolut, SMS-y, maile, GA4.",[18,67,68],{},"A zespół? Jeden programista (czyli ja) i Claude Code, który pisze większość kodu, a od kilku miesięcy prowadzi też przegląd błędów. Nie ma dyżurów, nie ma działu ops, nie ma nikogo, kto o 3 w nocy patrzy w wykresy. Na wielu ścieżkach Sentry jest jedynym alarmem – np. zadania kolejki, które odpalają się po złożeniu zamówienia, poza Sentry zostawiają ślad tylko w dzienniku zamówienia w bazie.",[18,70,71,72,76],{},"Do tego dochodzą 2 ograniczenia. Pierwsze to darmowy plan – miesięcznie 5 tys. błędów, 50 nagrań sesji i 5 GB logów. Szału nie ma, więc tracing i nagrania trzeba próbkować, a resztę świadomie wybierać. Drugie – jedynym kanałem powiadomień są maile o nowych zgłoszeniach. Wszystko obsługuje jeden projekt w Sentry, wspólny dla przeglądarki i serwera (oficjalny moduł ",[73,74,75],"code",{},"@sentry\u002Fnuxt",", SDK 10.x).",[18,78,79,80,83],{},"Przy takim układzie Sentry nie jest dla mnie „monitoringiem dla zespołu ops”. To raczej ",[22,81,82],{},"skrzynka odbiorcza, którą czyta agent AI"," – i to zmienia sposób, w jaki trzeba go skonfigurować.",[51,85,87],{"id":86},"co-wysyłam-świadomie","Co wysyłam świadomie",[89,90,92],"h3",{"id":91},"wyjątki-złapane-w-kodzie","Wyjątki złapane w kodzie",[18,94,95,96,99,100,103,104,107,108,111],{},"W instrukcjach projektu (",[73,97,98],{},"CLAUDE.md",") jest prosta konwencja: w każdym ",[73,101,102],{},"catch"," dla błędu, którego się nie spodziewamy, ląduje para ",[73,105,106],{},"console.error"," + ",[73,109,110],{},"Sentry.captureException",", a klient dostaje ogólny komunikat – treść błędu nigdy nie wraca w odpowiedzi HTTP. W uproszczeniu:",[113,114,119],"pre",{"className":115,"code":116,"language":117,"meta":118,"style":118},"language-ts shiki shiki-themes github-light-default github-light-default github-dark-default","try {\n  await createPayment(order)\n} catch (error) {\n  console.error(error)\n  Sentry.captureException(error)\n  throw createError({ statusCode: 500, message: 'Nie udało się utworzyć płatności' })\n}\n","ts","",[73,120,121,134,147,158,170,181,207],{"__ignoreMap":118},[122,123,126,130],"span",{"class":124,"line":125},"line",1,[122,127,129],{"class":128},"s5nWI","try",[122,131,133],{"class":132},"s_bOF"," {\n",[122,135,137,140,144],{"class":124,"line":136},2,[122,138,139],{"class":128},"  await",[122,141,143],{"class":142},"sd69k"," createPayment",[122,145,146],{"class":132},"(order)\n",[122,148,150,153,155],{"class":124,"line":149},3,[122,151,152],{"class":132},"} ",[122,154,102],{"class":128},[122,156,157],{"class":132}," (error) {\n",[122,159,161,164,167],{"class":124,"line":160},4,[122,162,163],{"class":132},"  console.",[122,165,166],{"class":142},"error",[122,168,169],{"class":132},"(error)\n",[122,171,173,176,179],{"class":124,"line":172},5,[122,174,175],{"class":132},"  Sentry.",[122,177,178],{"class":142},"captureException",[122,180,169],{"class":132},[122,182,184,187,190,193,197,200,204],{"class":124,"line":183},6,[122,185,186],{"class":128},"  throw",[122,188,189],{"class":142}," createError",[122,191,192],{"class":132},"({ statusCode: ",[122,194,196],{"class":195},"sDkKp","500",[122,198,199],{"class":132},", message: ",[122,201,203],{"class":202},"s-BGO","'Nie udało się utworzyć płatności'",[122,205,206],{"class":132}," })\n",[122,208,210],{"class":124,"line":209},7,[122,211,212],{"class":132},"}\n",[18,214,215],{},"Dotyczy to przede wszystkim ścieżki zakupu i płatności, zadań kolejki (magazyn, PDF, maile, SMS-y, GA4), klientów API integracji oraz zadań cronowych.",[18,217,218],{},"Ciekawsze od samej konwencji są jednak 2 wzorce, które z niej wyrosły.",[18,220,221,222,225],{},"Pierwszy to ",[22,223,224],{},"Sentry jako alarm biznesowy",". Gdy kwota w powiadomieniu z bramki płatniczej nie zgadza się z kwotą zamówienia, kod nie rzuca wyjątku – zapisuje status, dodaje wpis w dzienniku zamówienia i sam tworzy błąd, który wysyła do Sentry:",[113,227,229],{"className":115,"code":228,"language":117,"meta":118,"style":118},"if (paidAmount !== order.total) {\n  await markOrderForManualCheck(order)\n  await addOrderLogEntry(order, \u002F* co się nie zgadza *\u002F)\n  Sentry.captureException(new Error(\u002F* opis niezgodności *\u002F))\n}\n",[73,230,231,245,254,271,294],{"__ignoreMap":118},[122,232,233,236,239,242],{"class":124,"line":125},[122,234,235],{"class":128},"if",[122,237,238],{"class":132}," (paidAmount ",[122,240,241],{"class":128},"!==",[122,243,244],{"class":132}," order.total) {\n",[122,246,247,249,252],{"class":124,"line":136},[122,248,139],{"class":128},[122,250,251],{"class":142}," markOrderForManualCheck",[122,253,146],{"class":132},[122,255,256,258,261,264,268],{"class":124,"line":149},[122,257,139],{"class":128},[122,259,260],{"class":142}," addOrderLogEntry",[122,262,263],{"class":132},"(order, ",[122,265,267],{"class":266},"s9BHP","\u002F* co się nie zgadza *\u002F",[122,269,270],{"class":132},")\n",[122,272,273,275,277,280,283,286,288,291],{"class":124,"line":160},[122,274,175],{"class":132},[122,276,178],{"class":142},[122,278,279],{"class":132},"(",[122,281,282],{"class":128},"new",[122,284,285],{"class":142}," Error",[122,287,279],{"class":132},[122,289,290],{"class":266},"\u002F* opis niezgodności *\u002F",[122,292,293],{"class":132},"))\n",[122,295,296],{"class":124,"line":172},[122,297,212],{"class":132},[18,299,300],{},"Takie zgłoszenie znaczy po prostu „sprawdź tę płatność ręcznie”. Z perspektywy sklepu to jest ważniejsze niż niejeden stack trace. Podobnie z idempotencją: bramki potrafią wysłać to samo powiadomienie 2 razy i właśnie w Sentry widać, czy zabezpieczenie przed podwójnym przetworzeniem zadziałało i czy zadania kolejki dobrze zniosły powtórkę.",[18,302,303,304,307,308,311],{},"Drugi wzorzec: ",[22,305,306],{},"awaria kolejki nie blokuje odpowiedzi",". Wysyłka zadań do kolejki siedzi we własnym ",[73,309,310],{},"try\u002Fcatch"," – bramka płatnicza dostaje potwierdzenie, a błąd idzie do Sentry i do dziennika zamówienia. W Sentry lądują więc też rzeczy, które procesu nie przerwały, ale zostawiły go niedomkniętym. Bez tego zamówienie mogłoby po cichu nie dotrzeć do magazynu.",[18,313,314],{},"Do tego 2 drobiazgi, które spisałem w instrukcjach dla agenta, bo AI lubi o nich zapominać:",[316,317,318,326],"ul",{},[319,320,321,322,325],"li",{},"przy opakowywaniu błędu zachowujemy oryginał jako ",[73,323,324],{},"cause"," – wtedy w Sentry widać cały łańcuch przyczyn, a nie tylko ogólny komunikat warstwy wyżej",[319,327,328,329,332],{},"nigdy ",[73,330,331],{},"JSON.stringify(error)"," – to gubi stack trace i w Sentry zostaje pusty obiekt",[89,334,336],{"id":335},"logi","Logi",[18,338,339,342,343,345,346,349,350,353],{},[73,340,341],{},"console.warn"," i ",[73,344,106],{}," trafiają do Sentry Logs – i po stronie przeglądarki, i po stronie serwera. ",[73,347,348],{},"console.log"," – świadomie nie. Zadania kolejki zrzucają nim całe odpowiedzi z systemu magazynowego, a tam są dane osobowe z zamówień. Do tego każdy wpis liczy się do limitu planu, a w przeglądarce ",[73,351,352],{},"log"," to głównie szum ze skryptów zewnętrznych. Logi idą tylko z produkcji – na stagingu i lokalnie konsolę mam pod ręką.",[89,355,357],{"id":356},"raporty-csp","Raporty CSP",[18,359,360,361,364],{},"Nagłówek Content-Security-Policy w buildzie produkcyjnym ma dyrektywę ",[73,362,363],{},"report-uri"," wskazującą na Sentry. Każde naruszenie polityki w przeglądarce odwiedzającego staje się zdarzeniem.",[18,366,367,368,371],{},"CSP wdrażałem 2-etapowo: najpierw w trybie ",[73,369,370],{},"Report-Only"," (przeglądarka nic nie blokuje, tylko raportuje), uzupełniając listę dozwolonych hostów na podstawie tego, co przyszło do Sentry – a dopiero potem włączyłem egzekwowanie. Kto wdrażał CSP w sklepie z kilkoma integracjami, ten wie, że to dobry pomysł 🙂 Sentry posłużył mi tu za narzędzie do strojenia polityki bezpieczeństwa, a nie tylko do łapania błędów.",[51,373,375],{"id":374},"co-sentry-daje-gratis","Co Sentry daje „gratis”",[18,377,378],{},"Reszta danych przychodzi bez ani jednej linijki kodu po mojej stronie – albo prawie bez:",[316,380,381,387,393,399],{},[319,382,383,386],{},[22,384,385],{},"błędy niezłapane"," po obu stronach – moduł Nuxta podpina się sam, nie trzeba owijać każdego handlera",[319,388,389,392],{},[22,390,391],{},"kontekst zdarzenia"," – przeglądarka, system, trasa, wydanie, środowisko i breadcrumbs (kliknięcia, nawigacja i żądania tuż przed błędem)",[319,394,395,398],{},[22,396,397],{},"wydania powiązane z commitami"," przez integrację z Vercelem – przy zgłoszeniu widać, od którego wdrożenia błąd występuje",[319,400,401,404,405,408],{},[22,402,403],{},"source mapy, ale tylko dla przeglądarki"," – build generuje je jako ",[73,406,407],{},"hidden",", moduł wysyła je do Sentry, więc stack trace pokazuje kod źródłowy (map serwera nie wysyłam – agent i tak trafia do źródeł po nazwach tras i funkcji)",[89,410,412],{"id":411},"web-vitals-z-prawdziwych-telefonów","Web Vitals z prawdziwych telefonów",[18,414,415],{},"Efekt uboczny tracingu, z którego cieszę się najbardziej: Web Vitals. Każde zmierzone wczytanie strony przynosi dane o LCP, FCP, CLS i TTFB, a INP przychodzi osobno ze spanów interakcji. Zero dodatkowego kodu – i to są dane od prawdziwych odwiedzających.",[18,417,418],{},"Wcześniejsze optymalizacje strony głównej (zdjęcia, LCP) mierzyłem w Lighthouse, który mówi tylko, jak strona wypada w teście – Sentry pokazuje, czy ten wynik trzyma się na telefonach klientów. Stan z ostatnich 30 dni (p75): wszystkie 5 metryk w zielonym zakresie Google. LCP i FCP z umiarkowanym zapasem, TTFB, CLS i INP z dużym. Czyli wydajność frontu nie jest dziś tematem do poprawek – i to też jest wniosek, tylko przyjemniejszy 🙂",[89,420,422],{"id":421},"session-replay-ale-leniwie","Session Replay – ale leniwie",[18,424,425],{},"Nagrania sesji zbieram przede wszystkim dla zgłoszeń z błędem. Tu jednak był haczyk – integracja Replay waży ok. 190 KB przed kompresją. Po kompresji robi się z tego dużo mniej, ale i tak dorzucanie całej integracji do bundla każdej strony sklepu z kwiatami to średni pomysł, zwłaszcza przy tak ładnych Web Vitals.",[18,427,428,429,107,432,435],{},"Dlatego Replay nie siedzi w bundlu – doładowuje się leniwie z CDN Sentry, kiedy przeglądarka po wczytaniu strony nie ma nic lepszego do roboty (",[73,430,431],{},"lazyLoadIntegration",[73,433,434],{},"requestIdleCallback",").",[51,437,439],{"id":438},"dwie-trzecie-błędów-zrobiłem-sobie-sam","Dwie trzecie błędów zrobiłem sobie sam",[18,441,442],{},"Wróćmy do liczb z początku. Wszystkie zdarzenia błędów z ostatnich 30 dni:",[444,445,446,459],"table",{},[447,448,449],"thead",{},[450,451,452,456],"tr",{},[453,454,455],"th",{},"Źródło",[453,457,458],{},"Udział",[460,461,462,471,479],"tbody",{},[450,463,464,468],{},[465,466,467],"td",{},"lokalne maszyny (zanim wyłączyłem raportowanie z dev)",[465,469,470],{},"ok. 66%",[450,472,473,476],{},[465,474,475],{},"raporty CSP z przeglądarek odwiedzających",[465,477,478],{},"ok. 30%",[450,480,481,484],{},[465,482,483],{},"błędy aplikacji z produkcji",[465,485,486],{},"ok. 4%",[18,488,489],{},"Najwięcej szumu nie przyszło więc z internetu, tylko z mojego biurka. Poprawki szły po kolei, każda wynikła z przeglądu listy zgłoszeń:",[491,492,493,503,513,539],"ol",{},[319,494,495,502],{},[22,496,497,498,501],{},"Lokalny ",[73,499,500],{},"nuxt dev"," przestał raportować."," Błędy z HMR, z restartów serwera i z testowych danych zjadały limit i zasypywały listę.",[319,504,505,508,509,512],{},[22,506,507],{},"Lokalnie zbudowana wersja produkcyjna też przestała."," Okazało się, że build odpalony na laptopie zgłaszał się w Sentry jako… produkcja. Teraz Sentry jest włączony tylko wtedy, gdy aplikacja działa na Vercelu (zmienna ",[73,510,511],{},"VERCEL=1",", którą ustawia platforma), a przeglądarka dostaje flagę wyliczoną w czasie budowania.",[319,514,515,518,519,522,523,526,527,530,531,534,535,538],{},[22,516,517],{},"Poprawne środowisko."," Serwer brał nazwę środowiska z ",[73,520,521],{},"NODE_ENV",". Tyle że każdy build produkcyjny ma ",[73,524,525],{},"NODE_ENV=production"," – więc staging udawał produkcję. Teraz źródłem jest ",[73,528,529],{},"VERCEL_ENV"," (",[73,532,533],{},"production"," \u002F ",[73,536,537],{},"preview","), a przeglądarka dostaje to samo przez runtime config.",[319,540,541,544,545,547],{},[22,542,543],{},"Logi tylko z produkcji"," i bez poziomu ",[73,546,352],{}," (o czym wyżej).",[18,549,550],{},"W uproszczeniu wygląda to mniej więcej tak:",[113,552,554],{"className":115,"code":553,"language":117,"meta":118,"style":118},"Sentry.init({\n  enabled: process.env.VERCEL === '1',\n  environment: process.env.VERCEL_ENV, \u002F\u002F production \u002F preview\n  \u002F\u002F …reszta konfiguracji\n})\n",[73,555,556,567,584,597,602],{"__ignoreMap":118},[122,557,558,561,564],{"class":124,"line":125},[122,559,560],{"class":132},"Sentry.",[122,562,563],{"class":142},"init",[122,565,566],{"class":132},"({\n",[122,568,569,572,575,578,581],{"class":124,"line":136},[122,570,571],{"class":132},"  enabled: process.env.",[122,573,574],{"class":195},"VERCEL",[122,576,577],{"class":128}," ===",[122,579,580],{"class":202}," '1'",[122,582,583],{"class":132},",\n",[122,585,586,589,591,594],{"class":124,"line":149},[122,587,588],{"class":132},"  environment: process.env.",[122,590,529],{"class":195},[122,592,593],{"class":132},", ",[122,595,596],{"class":266},"\u002F\u002F production \u002F preview\n",[122,598,599],{"class":124,"line":160},[122,600,601],{"class":266},"  \u002F\u002F …reszta konfiguracji\n",[122,603,604],{"class":124,"line":172},[122,605,606],{"class":132},"})\n",[18,608,609,610,613],{},"Lekcja z tego jest prosta: ",[22,611,612],{},"środowisko w Sentry jest warte tyle, ile zmienna, z której je bierzesz."," Najpierw napraw etykiety, potem filtruj. Na błąd z punktu 3 zresztą nie wpadłbym sam z siebie – wyszedł dopiero z tego, że w „produkcji” pojawiały się zdarzenia, których produkcja nie miała prawa wygenerować.",[51,615,617],{"id":616},"claude-code-i-mcp-czyli-agent-widzi-wszystko-naraz","Claude Code i MCP – czyli agent widzi wszystko naraz",[18,619,620,621,624],{},"Claude Code łączy się z hostowanym serwerem MCP Sentry (",[73,622,623],{},"mcp.sentry.dev",") – transport HTTP, autoryzacja OAuth moim kontem. Konfiguracja siedzi po mojej stronie, a nie w repozytorium, więc w kodzie projektu nie ma żadnego tokenu.",[18,626,627],{},"Jedna pułapka: moja organizacja w Sentry jest w regionie UE, który trzeba przekazywać w każdym wywołaniu – bez tego część zapytań trafia pod zły adres. Niby banał, ale jeśli się tego nigdzie nie zapisze, agent odkrywa to od nowa w każdej sesji.",[18,629,630,631,593,634,593,637,640],{},"Agent przegląda listę zgłoszeń z filtrami w składni Sentry (",[73,632,633],{},"is:unresolved",[73,635,636],{},"is:regressed",[73,638,639],{},"logger:csp"," i tak dalej), liczy agregaty – ile błędów na środowisko, wydanie, godzinę – zagląda w szczegóły zgłoszeń, logi i trace’y, a na moje polecenie zmienia statusy. Sentry ma też własną analizę AI (Seer), ale z niej jeszcze nie korzystam – całą robotę wykonuje Claude.",[18,642,643,644,648,649,652,653,656,657,660],{},"Ktoś zapyta: po co agent, skoro w panelu Sentry wszystko widać? Ano po to, że panel pokazuje, ",[645,646,647],"em",{},"co"," się stało – a agent widzi jednocześnie zgłoszenie, kod, historię gita i dokumentację projektu. Może od razu sprawdzić, ",[645,650,651],{},"czy"," to już naprawiono, ",[645,654,655],{},"który"," commit to wprowadził i ",[645,658,659],{},"gdzie"," jest reguła, która powinna była temu zapobiec. Tak samo jak przy GA4 – liczy się zestawienie kilku źródeł naraz.",[51,662,664],{"id":663},"skill-zamiast-promptu","Skill zamiast promptu",[18,666,667,668,671],{},"Sposób pracy z Sentry spisałem jako skill dla agenta – zwykły plik Markdown w repozytorium (",[73,669,670],{},".claude\u002Fskills\u002Fsentry\u002FSKILL.md","). Odpala się, gdy pytam o błędy albo proszę o przegląd po wdrożeniu czy sprzątanie zgłoszeń. W skrócie, co jest w środku:",[491,673,674,680,686,692,698,704,714,734],{},[319,675,676,679],{},[22,677,678],{},"Stałe namiary"," – organizacja, region, projekt, środowiska – żeby agent nie szukał ich od zera.",[319,681,682,685],{},[22,683,684],{},"Tryb tylko do odczytu."," Przegląd niczego w Sentry nie zmienia – zamykanie dopiero po mojej akceptacji, zawsze z powodem zapisanym w komentarzu.",[319,687,688,691],{},[22,689,690],{},"Kolejność zapytań"," – najpierw błędy produkcyjne bez raportów CSP (inaczej to one zdominują listę), potem CSP osobno, potem wszystko, co nowe, wróciło albo przyspiesza.",[319,693,694,697],{},[22,695,696],{},"Tabela szumu i tabela rzeczy ważnych"," – co u nas jest szumem (i dlaczego) oraz czego nigdy nie wolno zbyć jedną linijką. Reguły z obu tabel opisuję niżej.",[319,699,700,703],{},[22,701,702],{},"Weryfikacja kandydatów"," – czy stack ma ramki z kodu aplikacji, czy błąd był złapany, z którego wydania pochodzi.",[319,705,706,709,710,713],{},[22,707,708],{},"Sprawdzenie „już naprawione”"," – zgłoszenia nie zamykają się same po commicie, więc agent porównuje datę ostatniego wystąpienia z datą commita (",[73,711,712],{},"git log -S",") i proponuje zamknięcie z dowodem.",[319,715,716,719,720,723,724,723,727,723,730,733],{},[22,717,718],{},"Format raportu"," – od najważniejszego: ",[645,721,722],{},"Wymaga reakcji"," → ",[645,725,726],{},"Do sprawdzenia",[645,728,729],{},"Do zamknięcia",[645,731,732],{},"Szum"," → liczby.",[319,735,736,739],{},[22,737,738],{},"Pułapki"," – np. zarchiwizowane zgłoszenia nie wchodzą do listy nierozwiązanych, a zgłoszenia mogą zawierać dane osobowe, więc raport tych danych nie cytuje.",[18,741,742],{},"Takich ogólnych „promptów do analizy błędów” jest w sieci pełno. Mój skill to po prostu wiedza o tym projekcie, spisana raz: co u nas jest szumem i dlaczego. Każdy wiersz tabeli szumu ma uzasadnienie powiązane z konkretną decyzją w kodzie – np. ze świadomie wąską listą domen w CSP.",[51,744,746],{"id":745},"co-z-tego-wyszło","Co z tego wyszło?",[18,748,749],{},"Bez wchodzenia w szczegóły – kilka kategorii wniosków z przeglądów:",[316,751,752,761,770],{},[319,753,754,757,758,760],{},[22,755,756],{},"Problem infrastruktury, nie kodu."," Seria błędów puli połączeń z bazą okazała się skutkiem splotu 3 czynników: zasypiającej bazy serverless, odświeżania ISR strony głównej napędzanego przez zewnętrzny monitor dostępności i cache’u, który przy wygaśnięciu sięgał do bazy w tle. Sentry pokazał ",[645,759,659],{}," – prawie wyłącznie przy rewalidacji jednej trasy. Skończyło się zmianami w cache’u, ISR i regionie funkcji.",[319,762,763,766,767,769],{},[22,764,765],{},"Cudza biblioteka na konkretnych urządzeniach."," Wyjątek w kalendarzu do wyboru daty dostawy – tylko na mobilnych przeglądarkach, u pojedynczych klientów, a zamówienia i tak przechodziły. Biblioteka nie jest już rozwijana, więc zamiast owijać w ",[73,768,310],{},", wymieniliśmy ją na komponent z frameworka UI, którego sklep i tak używa.",[319,771,772,775],{},[22,773,774],{},"„Nasz” błąd wywołany cudzym kodem."," Rozszerzenia przeglądarki czytały dane strukturalne strony (JSON-LD), zakładając, że to obiekt – a u nas była tablica. Więcej o tym za chwilę.",[18,777,778,779,782],{},"Jak się tak patrzy na tę listę, to mam wrażenie, że w projekcie tej skali Sentry najwięcej daje, ",[22,780,781],{},"ujawniając złe założenia"," – o środowiskach, o cudzych skryptach, o tym, kto tak naprawdę generuje ruch na serwerze.",[51,784,786],{"id":785},"jak-powstaje-poprawka","Jak powstaje poprawka",[18,788,789],{},"Zwykle przegląd skillem kończy się raportem, a ja wybieram z niego, co naprawiamy. Przy JSON-LD było inaczej – do skrzynki wpadł mi mail z Sentry o wyjątku przypisanym naszej stronie i to zgłoszenie przykuło moją uwagę. Zleciłem agentowi śledztwo. Agent otworzył zdarzenie, przejrzał stack z kodem źródłowym (dzięki source mapom) i znalazł winowajcę: skrypt rozszerzenia przeglądarki, który czyta nasze dane strukturalne i zakłada, że dostanie obiekt. A dostawał tablicę.",[18,791,792,793,796],{},"Najprościej byłoby dodać filtr i zapomnieć o sprawie. Tyle że w instrukcjach projektu mam zasadę „żadnych rozwiązań tymczasowych” – więc zmieniliśmy kształt danych na równoważny i zgodny ze specyfikacją (obiekt z ",[73,794,795],{},"@graph","). Szum zniknął u źródła, a wyszukiwarki dostają dokładnie te same dane.",[18,798,799,800,803,804,807,808,435],{},"Potem już rutyna: test przed poprawką, tam, gdzie się da. Następnie weryfikacja w buildzie produkcyjnym i na serwerze deweloperskim, bo w tym projekcie łapią ",[645,801,802],{},"różne"," klasy błędów – plus jedno prawdziwe wczytanie strony. Commit dostaje identyfikator zgłoszenia i opis przyczyny, więc historia gita staje się drugim indeksem zgłoszeń Sentry. W tym samym kroku aktualizujemy ",[73,805,806],{},"docs\u002F",", a to, czego jeszcze nie potwierdziłem w Sentry, ląduje w roadmapie jako „niezweryfikowane”. Następny przegląd sprawdza, czy zgłoszenie nie wróciło (",[73,809,636],{},[51,811,813],{"id":812},"jak-gaszę-szum","Jak gaszę szum",[18,815,816,817,820],{},"Mam 3 poziomy. Najlepiej gasić szum ",[22,818,819],{},"u źródła"," – konfiguracją SDK (kto raportuje, z jakim środowiskiem, jakie poziomy logów) albo zmianą w kodzie, po której błąd przestaje powstawać, jak przy JSON-LD.",[18,822,823,824,827],{},"Jeśli się nie da, zostaje ",[22,825,826],{},"klasyfikacja w procedurze",": skill zna klasy szumu i raportuje je zbiorczo, jedną linią. U mnie to m.in. raporty CSP od piksela Google z zagranicznych domen (lista domen w CSP jest świadomie bez wildcardu na TLD, a pomiar i tak działa), tłumaczenie strony w przeglądarce, rozszerzenia, pasek narzędzi Vercela, przeglądarki wbudowane w aplikacje społecznościowe i stare chunki JS po wdrożeniu.",[18,829,830,831,834],{},"Ostatni poziom to ",[22,832,833],{},"status w Sentry"," – i to dopiero po mojej akceptacji. Szum, który może urosnąć, archiwizuję „do eskalacji”, a na zawsze – tylko wzorce stałe. Realne problemy śledzone w roadmapie też archiwizuję, żeby nie zaśmiecały listy.",[18,836,837],{},"Przy okazji spisałem kilka reguł, które moim zdaniem przydadzą się w każdym projekcie:",[316,839,840,846,852,858,864],{},[319,841,842,845],{},[22,843,844],{},"Szum liczy się, gdy rośnie."," Jeden użytkownik, jedno zdarzenie – można odpuścić. Ten sam wzorzec nagle w dużej skali to sygnał (nowy skrypt zewnętrzny, zmieniony CSP) i trzeba go sprawdzić.",[319,847,848,851],{},[22,849,850],{},"Klasa szumu ma wyjątki."," Błąd ładowania chunków to zwykle stara karta po wdrożeniu. Ale wielu różnych użytkowników w ciągu kilku minut po wydaniu to już rozjechany deploy.",[319,853,854,857],{},[22,855,856],{},"Raport CSP od hosta z naszej listy to błąd konfiguracji"," – coś, co ma działać, jest po cichu obcinane.",[319,859,860,863],{},[22,861,862],{},"„Naprawione” to nie to samo co „zamknięte”."," Bez okresowego sprzątania lista nierozwiązanych przestaje cokolwiek znaczyć.",[319,865,866,869],{},[22,867,868],{},"Ścieżka zakupu ma wagę niezależnie od liczby zdarzeń."," Jeden błąd w płatności znaczy więcej niż setki raportów z przeglądarek.",[51,871,873],{"id":872},"czy-warto","Czy warto?",[18,875,876,877,880],{},"Jak zwykle odpowiedź brzmi: ",[22,878,879],{},"to zależy",". Jeśli ktoś podłączy Sentry „bo wypada” i będzie dostawał maila o każdym nowym zgłoszeniu – to po kilku tygodniach przestanie je otwierać, bo utonie w szumie. Sam bym przestał.",[18,882,883],{},"U mnie przełom przyszedł dopiero ze zmianą podejścia. O ile panel Sentry jest dobry do zaglądania w pojedyncze zgłoszenie, o tyle regularny przegląd – z sięganiem do kodu, gita i dokumentacji – to robota, którą agent wykonuje cierpliwiej niż ja. A ja zostaję przy decyzjach: co naprawiamy, co zamykamy, co uznajemy za szum. Sentry przestał być zbiornikiem alertów i stał się skrzynką odbiorczą, z której coś faktycznie wynika.",[18,885,886],{},"No i ta lekcja z dwiema trzecimi… Zanim zaczniesz filtrować szum z internetu, sprawdź, ile go robisz sobie sam.",[51,888,890],{"id":889},"co-dalej","Co dalej?",[18,892,893],{},"Porównanie Seera z Claude’em na tych samych zgłoszeniach to temat na osobny wpis – może następnym razem… A jeśli macie własne sposoby na szum w Sentry albo uważacie, że coś tu przekombinowałem – dajcie znać w komentarzach, chętnie skonfrontuję swoje podejście z Waszym 🙂",[895,896,897],"style",{},"html pre.shiki code .s5nWI, html code.shiki .s5nWI{--shiki-light:#CF222E;--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s_bOF, html code.shiki .s_bOF{--shiki-light:#1F2328;--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sd69k, html code.shiki .sd69k{--shiki-light:#8250DF;--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sDkKp, html code.shiki .sDkKp{--shiki-light:#0550AE;--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s-BGO, html code.shiki .s-BGO{--shiki-light:#0A3069;--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9BHP, html code.shiki .s9BHP{--shiki-light:#6E7781;--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":118,"searchDepth":136,"depth":136,"links":899},[900,901,906,910,911,912,913,914,915,916,917],{"id":53,"depth":136,"text":54},{"id":86,"depth":136,"text":87,"children":902},[903,904,905],{"id":91,"depth":149,"text":92},{"id":335,"depth":149,"text":336},{"id":356,"depth":149,"text":357},{"id":374,"depth":136,"text":375,"children":907},[908,909],{"id":411,"depth":149,"text":412},{"id":421,"depth":149,"text":422},{"id":438,"depth":136,"text":439},{"id":616,"depth":136,"text":617},{"id":663,"depth":136,"text":664},{"id":745,"depth":136,"text":746},{"id":785,"depth":136,"text":786},{"id":812,"depth":136,"text":813},{"id":872,"depth":136,"text":873},{"id":889,"depth":136,"text":890},[919],"artykuly",true,"2026-10-15","Sentry w małym sklepie to nie monitoring dla działu ops, tylko skrzynka odbiorcza, którą czyta AI. Jak to działa na flora-art.pl – i skąd ten cały szum…",false,"md",{},"\u002Fblog\u002Fmniej-szumu-wiecej-wnioskow-czyli-jak-ai-przeglada-mi-zgloszenia-z-sentry",13,[],{"title":5,"description":922},{"loc":926},"mniej-szumu-wiecej-wnioskow-czyli-jak-ai-przeglada-mi-zgloszenia-z-sentry","blog\u002F2026-10-14-mniej-szumu-wiecej-wnioskow-czyli-jak-ai-przeglada-mi-zgloszenia-z-sentry",[934,935,936,937,938,939,940],"claude-code","ai","mcp","automatyzacja","programowanie","flora-art","sentry",null,"NH1QIsNIM51wx2tfWzqqyTavL1X7ET6j21l2NhTpxMQ",[944,941],{"title":945,"path":946,"stem":947,"description":948,"children":-1},"FigCraft – czyli Figma od nowa, w Ruście i za darmo","\u002Fblog\u002Ffigcraft-czyli-figma-od-nowa-w-ruscie-i-za-darmo","blog\u002F2026-10-14-figcraft-czyli-figma-od-nowa-w-ruscie-i-za-darmo","Darmowa, open source’owa Figma, bez konta i bez chmury, z serwerem MCP na dokładkę? Brzmi jak bajka, więc postanowiłem sprawdzić, ile w tym prawdy…",[950,960,969],{"path":27,"title":28,"description":951,"date":952,"categories":953,"tags":954,"readingTime":958,"draft":923,"cover":959},"Statystyki sklepu potrafią pokazywać liczby, które nie mają nic wspólnego z rzeczywistością. Jak AI pomaga mi to sprawdzać – na przykładzie flora-art.pl.","2026-10-10",[919],[934,935,937,938,955,956,957,936,939],"ga4","google-analytics","analityka",12,"https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002F2026\u002F10\u002Fga4-claude-code-analityka-okladka.png",{"path":41,"title":42,"description":961,"date":962,"categories":963,"tags":964,"readingTime":927,"draft":923,"cover":968},"Czy AI zabierze nam robotę? Nie sądzę. Ale zmieni ją tak, że za kilka lat sami jej nie poznamy – i mam na to dowód w postaci 543 commitów…","2026-10-01",[919],[938,965,937,966,935,934,967],"kariera-w-it","front-end-developer","saas","https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002F2026\u002F10\u002Fprogramista-w-czasach-ai-okladka.png",{"path":946,"title":945,"description":948,"date":970,"categories":971,"tags":973,"readingTime":977,"draft":923,"cover":978},"2026-10-14",[919,972],"polecane",[974,975,976,936,935,934],"figcraft","figma","front-end",17,"https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002F2026\u002F10\u002Ffigcraft-okladka.png",[980,987,994,1001,1008,1015,1022,1028,1035,1042],{"id":981,"description":941,"extension":982,"meta":983,"name":984,"slug":919,"stem":985,"__hash__":986},"categories\u002Fcategories\u002Fartykuly.yml","yml",{},"Artykuły","categories\u002Fartykuly","aw37OCuccDz54Q07CDyESiid8VqHzN1nGf8cMOk_mI0",{"id":988,"description":941,"extension":982,"meta":989,"name":990,"slug":991,"stem":992,"__hash__":993},"categories\u002Fcategories\u002Fdostepnosc-cyfrowa.yml",{},"Dostępność cyfrowa","dostepnosc-cyfrowa","categories\u002Fdostepnosc-cyfrowa","6m7Ag8ZZ1EzfdgLuQnAUAMmRcjkgb2tpFM9n1qxANOM",{"id":995,"description":941,"extension":982,"meta":996,"name":997,"slug":998,"stem":999,"__hash__":1000},"categories\u002Fcategories\u002Fkonferencje.yml",{},"Konferencje","konferencje","categories\u002Fkonferencje","dQl4MW7163iEG-b7Cv6FJ2gUxLqnpaiMOLixCXvhHTw",{"id":1002,"description":941,"extension":982,"meta":1003,"name":1004,"slug":1005,"stem":1006,"__hash__":1007},"categories\u002Fcategories\u002Fkonfiguracja.yml",{},"Konfiguracja","konfiguracja","categories\u002Fkonfiguracja","ESTOPlJnBPnwuuqgOm7yqGAwgllsRJfSPVk22K_nQe0",{"id":1009,"description":941,"extension":982,"meta":1010,"name":1011,"slug":1012,"stem":1013,"__hash__":1014},"categories\u002Fcategories\u002Fnauka.yml",{},"Nauka","nauka","categories\u002Fnauka","3hQRPpuXqoNblW09Gj46arWFgH-3YfsMcgDyd4xLkN4",{"id":1016,"description":941,"extension":982,"meta":1017,"name":1018,"slug":1019,"stem":1020,"__hash__":1021},"categories\u002Fcategories\u002Fosx.yml",{},"OSX","osx","categories\u002Fosx","WW8-0hUIqcivgAUl8WQuAvJ3-xVLRLjLkmP00PP4eXY",{"id":1023,"description":941,"extension":982,"meta":1024,"name":1025,"slug":972,"stem":1026,"__hash__":1027},"categories\u002Fcategories\u002Fpolecane.yml",{},"Polecane","categories\u002Fpolecane","ckLXqMEBUHLxZavR7FGvpQjhxc7ycP_sQ7myEw64R9I",{"id":1029,"description":941,"extension":982,"meta":1030,"name":1031,"slug":1032,"stem":1033,"__hash__":1034},"categories\u002Fcategories\u002Fpomoce.yml",{},"Pomoce","pomoce","categories\u002Fpomoce","3oKSrG-VgrihP1nofQwuUItxUsyzVfgEfTMF2vq7EIw",{"id":1036,"description":941,"extension":982,"meta":1037,"name":1038,"slug":1039,"stem":1040,"__hash__":1041},"categories\u002Fcategories\u002Fprezentacje.yml",{},"Prezentacje","prezentacje","categories\u002Fprezentacje","4L5LUH8zxl0qXRvdymYTwtrkuj1tQun8R7yYz_OfndE",{"id":1043,"description":941,"extension":982,"meta":1044,"name":1045,"slug":1046,"stem":1047,"__hash__":1048},"categories\u002Fcategories\u002Fvue-js.yml",{},"Vue.js","vue-js","categories\u002Fvue-js","wOIuiF3jWQ-Zph8v7hYGNuLdJbCx0VguVg0loyh-Mwk",[1050,1056,1061,1066,1073,1080,1087,1094,1099,1106,1113,1120,1126,1133,1140,1147,1154,1161,1168,1174,1181,1188,1194,1200,1206,1212,1218,1224,1229,1234,1239,1244,1250,1256,1261,1267,1273,1278,1284,1291,1297,1303,1310,1317,1323,1329,1336,1342,1347,1352,1358,1365,1372,1377,1383,1390,1397,1402,1409,1416,1423,1429,1436,1441,1448,1455,1461,1468,1474,1480,1487,1493,1500,1506,1512,1517,1523,1530,1536,1543,1549,1555,1562,1569,1576,1581,1588,1594,1600,1605,1612,1619,1626,1632,1638,1645,1652,1659,1665,1672,1678,1685,1692,1698,1704,1710,1717,1723,1729,1736,1743,1750,1756,1762,1768,1774,1780,1787,1794,1801],{"id":1051,"extension":982,"meta":1052,"name":1053,"slug":1053,"stem":1054,"__hash__":1055},"tags\u002Ftags\u002Faccessibility.yml",{},"accessibility","tags\u002Faccessibility","luflFOwd8bzxVK2qeBv80Pzxhje6x-hbJYaDUihuwOk",{"id":1057,"extension":982,"meta":1058,"name":935,"slug":935,"stem":1059,"__hash__":1060},"tags\u002Ftags\u002Fai.yml",{},"tags\u002Fai","dps1QD2_kN7ri7PVTP0uaeL-lYhL69nCwndkqEqLLhU",{"id":1062,"extension":982,"meta":1063,"name":957,"slug":957,"stem":1064,"__hash__":1065},"tags\u002Ftags\u002Fanalityka.yml",{},"tags\u002Fanalityka","OazPvU9cHqo-nX1NPUamjhpZH7roEImTsqB55m-1Ewg",{"id":1067,"extension":982,"meta":1068,"name":1069,"slug":1070,"stem":1071,"__hash__":1072},"tags\u002Ftags\u002Fangular.yml",{},"Angular","angular","tags\u002Fangular","z6SH0xA8FvB2X9kVmW-gtOdfx__mVrgIuA7HVCzfLjo",{"id":1074,"extension":982,"meta":1075,"name":1076,"slug":1077,"stem":1078,"__hash__":1079},"tags\u002Ftags\u002Fapache2.yml",{},"Apache2","apache2","tags\u002Fapache2","unCvGoDYof2-UiVE0lnN8eq5ru5roRg5_2mAo4TdEHk",{"id":1081,"extension":982,"meta":1082,"name":1083,"slug":1084,"stem":1085,"__hash__":1086},"tags\u002Ftags\u002Faplikacje-i-uslugi-internetowe.yml",{},"aplikacje i usługi internetowe","aplikacje-i-uslugi-internetowe","tags\u002Faplikacje-i-uslugi-internetowe","G2Vojqp3Zd7QgL3zFleglcNCFkjzkAAeDQCScU6P8bc",{"id":1088,"extension":982,"meta":1089,"name":1090,"slug":1091,"stem":1092,"__hash__":1093},"tags\u002Ftags\u002Fasynchronicznosc.yml",{},"asynchroniczność","asynchronicznosc","tags\u002Fasynchronicznosc","9RMRbHed9wQxDzVpEjO6Ay9zxWDCI0e4hE8F4zqGgj0",{"id":1095,"extension":982,"meta":1096,"name":937,"slug":937,"stem":1097,"__hash__":1098},"tags\u002Ftags\u002Fautomatyzacja.yml",{},"tags\u002Fautomatyzacja","vfUpLN8opVGvKUQgjGwEYxKfsZsLo3jxneMF9YMMVD0",{"id":1100,"extension":982,"meta":1101,"name":1102,"slug":1103,"stem":1104,"__hash__":1105},"tags\u002Ftags\u002Fblokowanie-reklam.yml",{},"blokowanie reklam","blokowanie-reklam","tags\u002Fblokowanie-reklam","lq-tfiZ_uB_SerIlaIQFMOXvGIF3QoVVVyPxjwrEsR4",{"id":1107,"extension":982,"meta":1108,"name":1109,"slug":1110,"stem":1111,"__hash__":1112},"tags\u002Ftags\u002Fblue-media.yml",{},"Blue Media","blue-media","tags\u002Fblue-media","z8G577CxZ7uSy-oNOkWtn3XgbsbjeKhuNby5Q6BCRuM",{"id":1114,"extension":982,"meta":1115,"name":1116,"slug":1117,"stem":1118,"__hash__":1119},"tags\u002Ftags\u002Fchrome-extensions.yml",{},"chrome extensions","chrome-extensions","tags\u002Fchrome-extensions","Ip0fOTD9TMJiHcbXwgvAB2mFf_D1rlP5ZfkJG3GbCL0",{"id":1121,"extension":982,"meta":1122,"name":1123,"slug":934,"stem":1124,"__hash__":1125},"tags\u002Ftags\u002Fclaude-code.yml",{},"claude code","tags\u002Fclaude-code","wJZCEyRD6Cq9w7YKW0WDw94B_K-Y-nbkt1sLGN2RgEw",{"id":1127,"extension":982,"meta":1128,"name":1129,"slug":1130,"stem":1131,"__hash__":1132},"tags\u002Ftags\u002Fcmr.yml",{},"CMR","cmr","tags\u002Fcmr","eNv_ncSDXVsAFBCM8A4uJqAJItqSOP29I1Kabpm-l3Y",{"id":1134,"extension":982,"meta":1135,"name":1136,"slug":1137,"stem":1138,"__hash__":1139},"tags\u002Ftags\u002Fcodersday.yml",{},"CodersDay","codersday","tags\u002Fcodersday","jLWUVGvGvi2irKFpFs0Ea6hkW71mLoiroOaGDcv1KWw",{"id":1141,"extension":982,"meta":1142,"name":1143,"slug":1144,"stem":1145,"__hash__":1146},"tags\u002Ftags\u002Fcoderslab.yml",{},"CodersLab","coderslab","tags\u002Fcoderslab","NQEy1mD_tk9h71yZtjSoC4LhXGE54DGYaYgj3JOoUqY",{"id":1148,"extension":982,"meta":1149,"name":1150,"slug":1151,"stem":1152,"__hash__":1153},"tags\u002Ftags\u002Fcolor-contrast-analyzer.yml",{},"Color Contrast Analyzer","color-contrast-analyzer","tags\u002Fcolor-contrast-analyzer","hGu3gO_owf9Tn4p5-FssJGVt4ToSsRfgjMjWdX2YgEI",{"id":1155,"extension":982,"meta":1156,"name":1157,"slug":1158,"stem":1159,"__hash__":1160},"tags\u002Ftags\u002Fcolor-contrast-checker.yml",{},"Color Contrast Checker","color-contrast-checker","tags\u002Fcolor-contrast-checker","w8QKUWUH691wTFtUWDJMjbCvC6zlFZo6j4UDDSg1NDY",{"id":1162,"extension":982,"meta":1163,"name":1164,"slug":1165,"stem":1166,"__hash__":1167},"tags\u002Ftags\u002Fconfrontjs.yml",{},"ConFrontJS","confrontjs","tags\u002Fconfrontjs","G4ePmrCbuLVA_ccxs7rcKSveQ3Kvn7y6-Ie9-H_5gpc",{"id":1169,"extension":982,"meta":1170,"name":1171,"slug":1171,"stem":1172,"__hash__":1173},"tags\u002Ftags\u002Fcss3.yml",{},"css3","tags\u002Fcss3","f5Gtp9yzvmyMSZ-IN--19c7OR-v5LXzdvhNaEmiOsuw",{"id":1175,"extension":982,"meta":1176,"name":1177,"slug":1178,"stem":1179,"__hash__":1180},"tags\u002Ftags\u002Fdesi-2020.yml",{},"DESI 2020","desi-2020","tags\u002Fdesi-2020","KeSFSj6VcXN0OciAUSTR8C1kiGUE3nLzGR1Pi5h_USE",{"id":1182,"extension":982,"meta":1183,"name":1184,"slug":1185,"stem":1186,"__hash__":1187},"tags\u002Ftags\u002Fdns.yml",{},"DNS","dns","tags\u002Fdns","_TzsfpRL_ROm8MT5opDE1gg4GnuukbCyKY87W-IFl68",{"id":1189,"extension":982,"meta":1190,"name":1191,"slug":991,"stem":1192,"__hash__":1193},"tags\u002Ftags\u002Fdostepnosc-cyfrowa.yml",{},"dostępność cyfrowa","tags\u002Fdostepnosc-cyfrowa","8xZ6WRsys1qnr-vWH_Y4Ne8ac2RBONWyLrrm31u00xI",{"id":1195,"extension":982,"meta":1196,"name":1197,"slug":1197,"stem":1198,"__hash__":1199},"tags\u002Ftags\u002Febook.yml",{},"ebook","tags\u002Febook","2Eqjl28-mK0fxpryAfGFMCel8MSByJVuQRsvy_S_cgY",{"id":1201,"extension":982,"meta":1202,"name":1203,"slug":1203,"stem":1204,"__hash__":1205},"tags\u002Ftags\u002Felgato.yml",{},"elgato","tags\u002Felgato","ys3dC5VhSFe1JP_z6vIBB8W8WSJmrbB2C3gwTjSkINM",{"id":1207,"extension":982,"meta":1208,"name":1209,"slug":1209,"stem":1210,"__hash__":1211},"tags\u002Ftags\u002Fevent.yml",{},"event","tags\u002Fevent","xcUCN7zoFrW8LCakRgx4s2r8YTGvycTdYQEyx_Yg7Fk",{"id":1213,"extension":982,"meta":1214,"name":1215,"slug":1215,"stem":1216,"__hash__":1217},"tags\u002Ftags\u002Ffacebook.yml",{},"facebook","tags\u002Ffacebook","xk1FSKdOP155PdsTUy6lbefdoi6pOrwzZtVO8B52vMo",{"id":1219,"extension":982,"meta":1220,"name":1221,"slug":1221,"stem":1222,"__hash__":1223},"tags\u002Ftags\u002Ffanpage.yml",{},"fanpage","tags\u002Ffanpage","RoMU1ceix1opnNG2LPoGzfOjVZE128Gmk12ZtDAQxrM",{"id":1225,"extension":982,"meta":1226,"name":974,"slug":974,"stem":1227,"__hash__":1228},"tags\u002Ftags\u002Ffigcraft.yml",{},"tags\u002Ffigcraft","WTLpMjDrY2RSAriKP_PIhPFrUfRbSjesfrpRp5_eTQ4",{"id":1230,"extension":982,"meta":1231,"name":975,"slug":975,"stem":1232,"__hash__":1233},"tags\u002Ftags\u002Ffigma.yml",{},"tags\u002Ffigma","HqDjUE96DWwR7A2TOHbGrBJgtOm0WhFG5odvyZ2Sd30",{"id":1235,"extension":982,"meta":1236,"name":939,"slug":939,"stem":1237,"__hash__":1238},"tags\u002Ftags\u002Fflora-art.yml",{},"tags\u002Fflora-art","EZJoljjwcgycvXhzhoZltu8jVe2P_rSd_t7-DmugrCs",{"id":1240,"extension":982,"meta":1241,"name":976,"slug":976,"stem":1242,"__hash__":1243},"tags\u002Ftags\u002Ffront-end.yml",{},"tags\u002Ffront-end","xKzeWb2B7yr2l4WBGtpyUzD1T_sBK5i-sb21-MEDOWw",{"id":1245,"extension":982,"meta":1246,"name":1247,"slug":966,"stem":1248,"__hash__":1249},"tags\u002Ftags\u002Ffront-end-developer.yml",{},"front-end developer","tags\u002Ffront-end-developer","rHwMfWcbpd8wXqIVD1HzPWxBheHq8V_9TdHCHkz4Sp8",{"id":1251,"extension":982,"meta":1252,"name":1253,"slug":1253,"stem":1254,"__hash__":1255},"tags\u002Ftags\u002Ffrontend.yml",{},"frontend","tags\u002Ffrontend","CxnBlT8roa7DydGYGxgRVXKKTvJrkjMMQrvHZQMxukA",{"id":1257,"extension":982,"meta":1258,"name":955,"slug":955,"stem":1259,"__hash__":1260},"tags\u002Ftags\u002Fga4.yml",{},"tags\u002Fga4","rRvTzxNn5DJ4Sf5NYfC7bdlPytNph9v_BV9e-9z8mng",{"id":1262,"extension":982,"meta":1263,"name":1264,"slug":1264,"stem":1265,"__hash__":1266},"tags\u002Ftags\u002Fgamepad.yml",{},"gamepad","tags\u002Fgamepad","Gsi3HzAfw68AJR6qCt8qeuS7Euw22ZMSpnaKNw0QV-A",{"id":1268,"extension":982,"meta":1269,"name":1270,"slug":1270,"stem":1271,"__hash__":1272},"tags\u002Ftags\u002Fgoalkicker.yml",{},"goalkicker","tags\u002Fgoalkicker","L_zNfxJfO6lZOUiLaE5m_ggQUX0komBXXth0SrszFUk",{"id":1274,"extension":982,"meta":1275,"name":956,"slug":956,"stem":1276,"__hash__":1277},"tags\u002Ftags\u002Fgoogle-analytics.yml",{},"tags\u002Fgoogle-analytics","04tt2kepradezfP_kRSWsq1w1BDQ6kJaoVd5RB3wCT4",{"id":1279,"extension":982,"meta":1280,"name":1281,"slug":1281,"stem":1282,"__hash__":1283},"tags\u002Ftags\u002Fhandbook.yml",{},"handbook","tags\u002Fhandbook","D0-VmrV-_WQQnlVvaePXWciWrJ8zuWNJoJULW_rOpmI",{"id":1285,"extension":982,"meta":1286,"name":1287,"slug":1288,"stem":1289,"__hash__":1290},"tags\u002Ftags\u002Fhtml-api.yml",{},"HTML API","html-api","tags\u002Fhtml-api","DBZv8DJ2hZR64GhJALF_-YzUG4mZWG9m2VZE76eM_wY",{"id":1292,"extension":982,"meta":1293,"name":1294,"slug":1294,"stem":1295,"__hash__":1296},"tags\u002Ftags\u002Fhtml5.yml",{},"html5","tags\u002Fhtml5","fcqPnoul30jPoEk6tO8K9WWwU8XyFz3N7-GAse2uwsQ",{"id":1298,"extension":982,"meta":1299,"name":1300,"slug":1300,"stem":1301,"__hash__":1302},"tags\u002Ftags\u002Fimmich.yml",{},"immich","tags\u002Fimmich","yRqxfTgoJptMOBpcKUS-JAmsUYKQZe4N5gyGFXSxoyU",{"id":1304,"extension":982,"meta":1305,"name":1306,"slug":1307,"stem":1308,"__hash__":1309},"tags\u002Ftags\u002Finteligentny-dom.yml",{},"inteligentny dom","inteligentny-dom","tags\u002Finteligentny-dom","LwWCH_MYDfKSgfl9wyRWrWegvCgb2hAnXMlON3OQ0dk",{"id":1311,"extension":982,"meta":1312,"name":1313,"slug":1314,"stem":1315,"__hash__":1316},"tags\u002Ftags\u002Fjaws.yml",{},"Jaws","jaws","tags\u002Fjaws","aklZIj6z2_fzRQ_h9RtAfvXgDhHH9v02f224m6u8B7s",{"id":1318,"extension":982,"meta":1319,"name":1320,"slug":1320,"stem":1321,"__hash__":1322},"tags\u002Ftags\u002Fjunior.yml",{},"junior","tags\u002Fjunior","ega8Cjq-Z5swNxexQG-ROW8hvi0eaDCJj-l4ILDW-4U",{"id":1324,"extension":982,"meta":1325,"name":1326,"slug":965,"stem":1327,"__hash__":1328},"tags\u002Ftags\u002Fkariera-w-it.yml",{},"kariera w IT","tags\u002Fkariera-w-it","tyqsMUw9eQaVgTnsZy9DZAHFQXZNe0sDZavdgJ0KTcA",{"id":1330,"extension":982,"meta":1331,"name":1332,"slug":1333,"stem":1334,"__hash__":1335},"tags\u002Ftags\u002Fkobiety-w-it.yml",{},"kobiety w IT","kobiety-w-it","tags\u002Fkobiety-w-it","Gm0D6QX7IUT1CDThH6LuhQtWOOWFop09QiDZwX_Tm7c",{"id":1337,"extension":982,"meta":1338,"name":1339,"slug":1339,"stem":1340,"__hash__":1341},"tags\u002Ftags\u002Fkonferencja.yml",{},"konferencja","tags\u002Fkonferencja","-n95F1XvVC7rR9O9sOxyxnKIJBm4i5o3Md_Q-Z72occ",{"id":1343,"extension":982,"meta":1344,"name":998,"slug":998,"stem":1345,"__hash__":1346},"tags\u002Ftags\u002Fkonferencje.yml",{},"tags\u002Fkonferencje","Qf_9S1xyR0mqWi1CzdU_iGIwcU8Z0ET_3JBEIOWhaxA",{"id":1348,"extension":982,"meta":1349,"name":1005,"slug":1005,"stem":1350,"__hash__":1351},"tags\u002Ftags\u002Fkonfiguracja.yml",{},"tags\u002Fkonfiguracja","r2NNwL_ZY7xvPy0pUN2IPK8U6qBXSfay_MZbt1FpC2I",{"id":1353,"extension":982,"meta":1354,"name":1355,"slug":1355,"stem":1356,"__hash__":1357},"tags\u002Ftags\u002Fkoronawirus.yml",{},"koronawirus","tags\u002Fkoronawirus","8DgCLCZ1uSF_kl0dmgiEVVM-KkZFxGpXJus3fmMH4sE",{"id":1359,"extension":982,"meta":1360,"name":1361,"slug":1362,"stem":1363,"__hash__":1364},"tags\u002Ftags\u002Fksiazki-programistyczne.yml",{},"książki programistyczne","ksiazki-programistyczne","tags\u002Fksiazki-programistyczne","DF1l0MrjODlaeQ0evw8JedIJJb3v4MpesV0Fi6HpViQ",{"id":1366,"extension":982,"meta":1367,"name":1368,"slug":1369,"stem":1370,"__hash__":1371},"tags\u002Ftags\u002Flenovo-m710q.yml",{},"lenovo m710q","lenovo-m710q","tags\u002Flenovo-m710q","H2DSlpm_FUSkpZXj5AZxrXjTzdGXcfWhIFXE8MAjoJw",{"id":1373,"extension":982,"meta":1374,"name":936,"slug":936,"stem":1375,"__hash__":1376},"tags\u002Ftags\u002Fmcp.yml",{},"tags\u002Fmcp","3PkWXTczUl4idUlqZVtwyAQ2kQ3-wsGGRK8B5IciLZI",{"id":1378,"extension":982,"meta":1379,"name":1380,"slug":1380,"stem":1381,"__hash__":1382},"tags\u002Ftags\u002Fmid.yml",{},"mid","tags\u002Fmid","61US_hzDYC5fw5yPUWya7ZNjc9fOddRUJyOJU3oVKaM",{"id":1384,"extension":982,"meta":1385,"name":1386,"slug":1387,"stem":1388,"__hash__":1389},"tags\u002Ftags\u002Fmini-pc.yml",{},"mini pc","mini-pc","tags\u002Fmini-pc","zCEZkcdMTwLbaNGmGiT8qGCtnECxEafkiJ-glDrozw0",{"id":1391,"extension":982,"meta":1392,"name":1393,"slug":1394,"stem":1395,"__hash__":1396},"tags\u002Ftags\u002Fnas.yml",{},"NAS","nas","tags\u002Fnas","RsN64SVV6BmbaR7e4pVVvGgbxQ0q8ihj5J4b_1oPH2k",{"id":1398,"extension":982,"meta":1399,"name":1012,"slug":1012,"stem":1400,"__hash__":1401},"tags\u002Ftags\u002Fnauka.yml",{},"tags\u002Fnauka","bMIyGRMcT5SRj0bxdrER6sibTNLAHr1enmElQI67jTo",{"id":1403,"extension":982,"meta":1404,"name":1405,"slug":1406,"stem":1407,"__hash__":1408},"tags\u002Ftags\u002Fnauka-programowania.yml",{},"nauka programowania","nauka-programowania","tags\u002Fnauka-programowania","M04c5RtH0Fu4ikOuW9fLy2-g2YBIAX0Yj9SHKEwOuUg",{"id":1410,"extension":982,"meta":1411,"name":1412,"slug":1413,"stem":1414,"__hash__":1415},"tags\u002Ftags\u002Fnvda.yml",{},"NVDA","nvda","tags\u002Fnvda","AS3XsW73sA9-MAI4JVv4y7luo2oGkpXrGptc51MKLQY",{"id":1417,"extension":982,"meta":1418,"name":1419,"slug":1420,"stem":1421,"__hash__":1422},"tags\u002Ftags\u002Fochrona-rodzicielska.yml",{},"ochrona rodzicielska","ochrona-rodzicielska","tags\u002Fochrona-rodzicielska","DZHsS1aBzb6OmeQFhCXy3Qu3QUMHsrbbN62bXmyBB0Q",{"id":1424,"extension":982,"meta":1425,"name":1426,"slug":1426,"stem":1427,"__hash__":1428},"tags\u002Ftags\u002Foptimization.yml",{},"optimization","tags\u002Foptimization","fJedkuv-GIoYXYs-z7AFgjvCxunavWHOWZDesN1EgFU",{"id":1430,"extension":982,"meta":1431,"name":1432,"slug":1433,"stem":1434,"__hash__":1435},"tags\u002Ftags\u002Forganizacja-pracy.yml",{},"organizacja pracy","organizacja-pracy","tags\u002Forganizacja-pracy","IJWHAuqRIlzOIgQbp6B0dYJLpApXOyvDii-k8n_CUCQ",{"id":1437,"extension":982,"meta":1438,"name":1018,"slug":1019,"stem":1439,"__hash__":1440},"tags\u002Ftags\u002Fosx.yml",{},"tags\u002Fosx","QymfouNjzTcNrsPkrZeaPTZdKpMsdYilpn7HRI1FxQQ",{"id":1442,"extension":982,"meta":1443,"name":1444,"slug":1445,"stem":1446,"__hash__":1447},"tags\u002Ftags\u002Fpanel-macro.yml",{},"panel macro","panel-macro","tags\u002Fpanel-macro","WrhWywY5PTfhm7n_TuxTZEWwebeWKfYiQf6n6nh19t4",{"id":1449,"extension":982,"meta":1450,"name":1451,"slug":1452,"stem":1453,"__hash__":1454},"tags\u002Ftags\u002Fpassword-manager.yml",{},"password manager","password-manager","tags\u002Fpassword-manager","viAfKlsGbzjczJJrb8pwaB4tInjCfLzynbSm-GRQz4Y",{"id":1456,"extension":982,"meta":1457,"name":1458,"slug":1458,"stem":1459,"__hash__":1460},"tags\u002Ftags\u002Fpdf.yml",{},"pdf","tags\u002Fpdf","UTB02hK82S5LzDB9kqZWrDRFb8SYzHfFRgCsqFwdBcE",{"id":1462,"extension":982,"meta":1463,"name":1464,"slug":1465,"stem":1466,"__hash__":1467},"tags\u002Ftags\u002Fphp.yml",{},"PHP","php","tags\u002Fphp","Id59psmnOEw6xZ04LGSXqaCSXElgAZVfZdIWk4TTMmU",{"id":1469,"extension":982,"meta":1470,"name":1471,"slug":1471,"stem":1472,"__hash__":1473},"tags\u002Ftags\u002Fpi-hole.yml",{},"pi-hole","tags\u002Fpi-hole","1YJ1tr1Tr23ItFg6rYXw6iKjvPJCdYb2MB_5W1FdZNw",{"id":1475,"extension":982,"meta":1476,"name":1477,"slug":1477,"stem":1478,"__hash__":1479},"tags\u002Ftags\u002Fpixel-mania.yml",{},"pixel-mania","tags\u002Fpixel-mania","N9WX_K8mFmAndjRdRzZX1PonLHyneP4XCJe9kQlGOpY",{"id":1481,"extension":982,"meta":1482,"name":1483,"slug":1484,"stem":1485,"__hash__":1486},"tags\u002Ftags\u002Fplaywright.yml",{},"PlayWright","playwright","tags\u002Fplaywright","fZAbd5k3k85yeGire7iJzvnRk00Wfww8OTu1h6rEuZM",{"id":1488,"extension":982,"meta":1489,"name":1490,"slug":1490,"stem":1491,"__hash__":1492},"tags\u002Ftags\u002Fpraca.yml",{},"praca","tags\u002Fpraca","ra3_bHnZqDrux1PiJ_pW6eqfX7l-uIFUPUhPqaq5cf4",{"id":1494,"extension":982,"meta":1495,"name":1496,"slug":1497,"stem":1498,"__hash__":1499},"tags\u002Ftags\u002Fpraca-zdalna.yml",{},"praca zdalna","praca-zdalna","tags\u002Fpraca-zdalna","HD5EOgzs-b3t5KIBRxlWQr0FuQVJ4N7eLQJV77YWcqc",{"id":1501,"extension":982,"meta":1502,"name":1503,"slug":1503,"stem":1504,"__hash__":1505},"tags\u002Ftags\u002Fprezentacja.yml",{},"prezentacja","tags\u002Fprezentacja","eiP5x-l400TtOy-gxO3TyOqYwcD4LP65jJ--7H-jyng",{"id":1507,"extension":982,"meta":1508,"name":1509,"slug":1509,"stem":1510,"__hash__":1511},"tags\u002Ftags\u002Fprivacy.yml",{},"privacy","tags\u002Fprivacy","Ln1AAZQ3fPOzuMJB0BWwUsjwaWTI7cFtzI6TaPrvKXc",{"id":1513,"extension":982,"meta":1514,"name":938,"slug":938,"stem":1515,"__hash__":1516},"tags\u002Ftags\u002Fprogramowanie.yml",{},"tags\u002Fprogramowanie","EUO8owu6V8cJivzRtVvD12KgW4ojOCp-N7aI4euHEa0",{"id":1518,"extension":982,"meta":1519,"name":1520,"slug":1520,"stem":1521,"__hash__":1522},"tags\u002Ftags\u002Fproxmox.yml",{},"proxmox","tags\u002Fproxmox","2AZfZmPZffxT3YuTVGHbsGvqKzpNRfot-OjFS6kkSYs",{"id":1524,"extension":982,"meta":1525,"name":1526,"slug":1527,"stem":1528,"__hash__":1529},"tags\u002Ftags\u002Fprywatny-dns.yml",{},"prywatny DNS","prywatny-dns","tags\u002Fprywatny-dns","kq-27-SNzP2YitFANg5iLgu0kdzyufoiOCLYApAehUc",{"id":1531,"extension":982,"meta":1532,"name":1533,"slug":1533,"stem":1534,"__hash__":1535},"tags\u002Ftags\u002Fprzekwalifikowanie.yml",{},"przekwalifikowanie","tags\u002Fprzekwalifikowanie","TqQNM6H8dfkRMTjNT8ZWyzynSMGeFjxseCt7-fZq0nA",{"id":1537,"extension":982,"meta":1538,"name":1539,"slug":1540,"stem":1541,"__hash__":1542},"tags\u002Ftags\u002Freact.yml",{},"React","react","tags\u002Freact","nXIcvF19iFz3UIXk2jbbJKRrr1_S9NLNYH3PUX_a2C4",{"id":1544,"extension":982,"meta":1545,"name":1546,"slug":1546,"stem":1547,"__hash__":1548},"tags\u002Ftags\u002Fredux.yml",{},"redux","tags\u002Fredux","CYtiFQKJae6MZE4Z_2qWwt7OGctPAutMzfD9f35a6-A",{"id":1550,"extension":982,"meta":1551,"name":1552,"slug":1552,"stem":1553,"__hash__":1554},"tags\u002Ftags\u002Fretro.yml",{},"retro","tags\u002Fretro","5AjMkMU44tDn8TV2FSTzbrvxoE7rplMmkLej7E-RIYM",{"id":1556,"extension":982,"meta":1557,"name":1558,"slug":1559,"stem":1560,"__hash__":1561},"tags\u002Ftags\u002Fretropi.yml",{},"RetroPi","retropi","tags\u002Fretropi","v_z0VjrAHiqYkzENB2DRMmo-V9VwE-8D2V_pRT-EBxw",{"id":1563,"extension":982,"meta":1564,"name":1565,"slug":1566,"stem":1567,"__hash__":1568},"tags\u002Ftags\u002Frozwoj.yml",{},"rozwój","rozwoj","tags\u002Frozwoj","RkL4It2FQnfcyHt1gNPjQ7cLqxrpgMy9ewFnPkF5sms",{"id":1570,"extension":982,"meta":1571,"name":1572,"slug":1573,"stem":1574,"__hash__":1575},"tags\u002Ftags\u002Frzemieslnik.yml",{},"rzemieślnik","rzemieslnik","tags\u002Frzemieslnik","fLVgsq47mga12X6gNKQ6QM5tpWdwICnLJwfSDwk1xEE",{"id":1577,"extension":982,"meta":1578,"name":967,"slug":967,"stem":1579,"__hash__":1580},"tags\u002Ftags\u002Fsaas.yml",{},"tags\u002Fsaas","IJK35nx0P9hIm-I-szhYuII4LVixyUi2zgQINNh0irc",{"id":1582,"extension":982,"meta":1583,"name":1584,"slug":1585,"stem":1586,"__hash__":1587},"tags\u002Ftags\u002Fsamodzielnosc.yml",{},"samodzielność","samodzielnosc","tags\u002Fsamodzielnosc","mu6DqJVN-dhRiXCnV4A5ewTRx_ndkWH_pu7Fdf7n6XI",{"id":1589,"extension":982,"meta":1590,"name":1591,"slug":1591,"stem":1592,"__hash__":1593},"tags\u002Ftags\u002Fselfhosting.yml",{},"selfhosting","tags\u002Fselfhosting","ScAMu2i5h-QpOOGEuIvBN9fQn0ZmfyYfvD-561cUzKs",{"id":1595,"extension":982,"meta":1596,"name":1597,"slug":1597,"stem":1598,"__hash__":1599},"tags\u002Ftags\u002Fsenior.yml",{},"senior","tags\u002Fsenior","DFUFihqxLSI2g34_DFYLVSXQnP79966itG8NnBs44TE",{"id":1601,"extension":982,"meta":1602,"name":940,"slug":940,"stem":1603,"__hash__":1604},"tags\u002Ftags\u002Fsentry.yml",{},"tags\u002Fsentry","1GB1pnjVg6ZwTqvwK7ZE529QpP-274G7z278-psv9U8",{"id":1606,"extension":982,"meta":1607,"name":1608,"slug":1609,"stem":1610,"__hash__":1611},"tags\u002Ftags\u002Fsieci-komputerowe.yml",{},"sieci komputerowe","sieci-komputerowe","tags\u002Fsieci-komputerowe","lziU51DXijHvzSYVgbK5r_aRCBS9KLdgU5FWjE3pD4s",{"id":1613,"extension":982,"meta":1614,"name":1615,"slug":1616,"stem":1617,"__hash__":1618},"tags\u002Ftags\u002Fsmart-home.yml",{},"smart home","smart-home","tags\u002Fsmart-home","wjGS16vdTWjBvPIfyZ7Jjv2rSAUfgKxYQTfVmfE_oNc",{"id":1620,"extension":982,"meta":1621,"name":1622,"slug":1623,"stem":1624,"__hash__":1625},"tags\u002Ftags\u002Fsmr.yml",{},"SMR","smr","tags\u002Fsmr","hd_86HRNRQ5vp9GFDgvFR3iXcRs57XNvESz05e-vh-o",{"id":1627,"extension":982,"meta":1628,"name":1629,"slug":1629,"stem":1630,"__hash__":1631},"tags\u002Ftags\u002Fspotkanie.yml",{},"spotkanie","tags\u002Fspotkanie","G-4xZsmDWDaZnA1t7fWrsGY0CvA2PWBRch_ISxgV3eY",{"id":1633,"extension":982,"meta":1634,"name":1635,"slug":1635,"stem":1636,"__hash__":1637},"tags\u002Ftags\u002Fstash.yml",{},"stash","tags\u002Fstash","x-cfxrcr_me1q-Ea4BqtRl041a1CjwZbFM76VlobkVE",{"id":1639,"extension":982,"meta":1640,"name":1641,"slug":1642,"stem":1643,"__hash__":1644},"tags\u002Ftags\u002Fstore-management.yml",{},"store management","store-management","tags\u002Fstore-management","BDlb8jliEvzP4ByR_nwh5YcPAphegyjsvxnwheppvwM",{"id":1646,"extension":982,"meta":1647,"name":1648,"slug":1649,"stem":1650,"__hash__":1651},"tags\u002Ftags\u002Fstream-deck.yml",{},"stream deck","stream-deck","tags\u002Fstream-deck","ETKaTcPMSGRXiF8fX9HaCChrkWvjK1Qhc8DCtKNRLFo",{"id":1653,"extension":982,"meta":1654,"name":1655,"slug":1656,"stem":1657,"__hash__":1658},"tags\u002Ftags\u002Fstudia-podyplomowe.yml",{},"studia podyplomowe","studia-podyplomowe","tags\u002Fstudia-podyplomowe","CllbIMrpHwk7nHpdgNS5EJlfoY37AYtu6D28xcL7B8Y",{"id":1660,"extension":982,"meta":1661,"name":1662,"slug":1662,"stem":1663,"__hash__":1664},"tags\u002Ftags\u002Fswitch.yml",{},"switch","tags\u002Fswitch","PqeuQm8ai89DcVFTdIBBYnrs6IVq0oystkF3JdV2cbQ",{"id":1666,"extension":982,"meta":1667,"name":1668,"slug":1669,"stem":1670,"__hash__":1671},"tags\u002Ftags\u002Fszafa-rack.yml",{},"szafa rack","szafa-rack","tags\u002Fszafa-rack","Tdq-0TqjtHfOvyhnHIwrDsPzQYMI6Rkb3iJBoqgudAc",{"id":1673,"extension":982,"meta":1674,"name":1675,"slug":1675,"stem":1676,"__hash__":1677},"tags\u002Ftags\u002Fszkolenia.yml",{},"szkolenia","tags\u002Fszkolenia","Ty9KLofCdboQngGvYkJOH1YZpBX-E3_Y1SLrdGucptY",{"id":1679,"extension":982,"meta":1680,"name":1681,"slug":1682,"stem":1683,"__hash__":1684},"tags\u002Ftags\u002Fszkolenie-front-end.yml",{},"szkolenie front-end","szkolenie-front-end","tags\u002Fszkolenie-front-end","yv2XwBbhwF8m1vceHXglBt_lax32HDj4iqYS8ymfIpM",{"id":1686,"extension":982,"meta":1687,"name":1688,"slug":1689,"stem":1690,"__hash__":1691},"tags\u002Ftags\u002Fszkolnictwo-zawodowe.yml",{},"szkolnictwo zawodowe","szkolnictwo-zawodowe","tags\u002Fszkolnictwo-zawodowe","wHy70cvPzW-iXNTesa8dnmsUN3GZ6RQ_08rvp2jcr-o",{"id":1693,"extension":982,"meta":1694,"name":1695,"slug":1695,"stem":1696,"__hash__":1697},"tags\u002Ftags\u002Ftech3camp.yml",{},"tech3camp","tags\u002Ftech3camp","2xN4prsqldeVcTsCibyLj-T84k_q27SekfsQ9H3ml6w",{"id":1699,"extension":982,"meta":1700,"name":1701,"slug":1701,"stem":1702,"__hash__":1703},"tags\u002Ftags\u002Ftestowanie.yml",{},"testowanie","tags\u002Ftestowanie","bQ7J7HLrZe6c9Me3bn_3VCbshav5tsqNTBIwd0xkRaQ",{"id":1705,"extension":982,"meta":1706,"name":1707,"slug":1707,"stem":1708,"__hash__":1709},"tags\u002Ftags\u002Ftesty.yml",{},"testy","tags\u002Ftesty","JDNtVkIDLY5e-th779qHOQFRrQ6Ywoq8us2HXlBz9PY",{"id":1711,"extension":982,"meta":1712,"name":1713,"slug":1714,"stem":1715,"__hash__":1716},"tags\u002Ftags\u002Ftruenas.yml",{},"TrueNas","truenas","tags\u002Ftruenas","jGviBDrcOLcc4LIDAMUINs_clt6cqQIbnmCsGjlBoEU",{"id":1718,"extension":982,"meta":1719,"name":1720,"slug":1720,"stem":1721,"__hash__":1722},"tags\u002Ftags\u002Ftuya.yml",{},"tuya","tags\u002Ftuya","MwpPoYlxeAiebaRVNdxytmFq9k0BpiTEbiEvwh4pfq4",{"id":1724,"extension":982,"meta":1725,"name":1726,"slug":1726,"stem":1727,"__hash__":1728},"tags\u002Ftags\u002Fublock.yml",{},"ublock","tags\u002Fublock","EPnKEvKkfWB2hbpkolTIytNQ9c12jSrnctf8CWEVbUM",{"id":1730,"extension":982,"meta":1731,"name":1732,"slug":1733,"stem":1734,"__hash__":1735},"tags\u002Ftags\u002Fvirtual-host.yml",{},"virtual host","virtual-host","tags\u002Fvirtual-host","Ru2r4wU7txKcWDbL3hq2QGx7v8gKwTJE25BItrzjqCQ",{"id":1737,"extension":982,"meta":1738,"name":1739,"slug":1740,"stem":1741,"__hash__":1742},"tags\u002Ftags\u002Fvoiceover.yml",{},"VoiceOver","voiceover","tags\u002Fvoiceover","7_jZqkfOk163vezQCATCpkIhdxmxfXe5dsLjgORGRWc",{"id":1744,"extension":982,"meta":1745,"name":1746,"slug":1747,"stem":1748,"__hash__":1749},"tags\u002Ftags\u002Fvue.yml",{},"Vue","vue","tags\u002Fvue","9ztytvQnoFLSGIXCwVz0HDl1yEBgdxBtwfIb4xxED8w",{"id":1751,"extension":982,"meta":1752,"name":1753,"slug":1046,"stem":1754,"__hash__":1755},"tags\u002Ftags\u002Fvue-js.yml",{},"vue.js","tags\u002Fvue-js","ZEglZJ4b32MxGRUCWg3ij0_Sz-YkJDI60yOFUG3Dip8",{"id":1757,"extension":982,"meta":1758,"name":1759,"slug":1759,"stem":1760,"__hash__":1761},"tags\u002Ftags\u002Fvuejs.yml",{},"vuejs","tags\u002Fvuejs","Qz3030ujqXE_33tL5hbF8n1MGIh1jpRtdzXVrQT79jA",{"id":1763,"extension":982,"meta":1764,"name":1765,"slug":1765,"stem":1766,"__hash__":1767},"tags\u002Ftags\u002Fvuenews.yml",{},"vuenews","tags\u002Fvuenews","5I7T-cG9aZzeR62I-tWYDruQvjkSbRxtAeDI9otWrR8",{"id":1769,"extension":982,"meta":1770,"name":1771,"slug":1771,"stem":1772,"__hash__":1773},"tags\u002Ftags\u002Fvuetoolbox.yml",{},"vuetoolbox","tags\u002Fvuetoolbox","y5NXiZfQviI16DIkNjTxSwnLQIyrXs7OBZjVY1IyNmk",{"id":1775,"extension":982,"meta":1776,"name":1777,"slug":1777,"stem":1778,"__hash__":1779},"tags\u002Ftags\u002Fvuex.yml",{},"vuex","tags\u002Fvuex","ksF82HLoN49mJn2cJ0DhYz_Dt6mlrJDT82Ufu6QKmKQ",{"id":1781,"extension":982,"meta":1782,"name":1783,"slug":1784,"stem":1785,"__hash__":1786},"tags\u002Ftags\u002Fweb-development.yml",{},"web development","web-development","tags\u002Fweb-development","144N0DLmtEIX98zdSuOWIsCZYMHyxStp8_ZksWK2M7E",{"id":1788,"extension":982,"meta":1789,"name":1790,"slug":1791,"stem":1792,"__hash__":1793},"tags\u002Ftags\u002Fwladyslawowo.yml",{},"Władysławowo","wladyslawowo","tags\u002Fwladyslawowo","LgrtfAzosbyNoEeZ6_GWMrueP29fN7fPL3N5Kp5Wm4w",{"id":1795,"extension":982,"meta":1796,"name":1797,"slug":1798,"stem":1799,"__hash__":1800},"tags\u002Ftags\u002Fwork-life-balance.yml",{},"work-life balance","work-life-balance","tags\u002Fwork-life-balance","hXw9EMtMUVm71LSUBz1o6Ttz7xlyrsnMo-VOEfMJwr0",{"id":1802,"extension":982,"meta":1803,"name":1804,"slug":1805,"stem":1806,"__hash__":1807},"tags\u002Ftags\u002Fxbox.yml",{},"XBOX","xbox","tags\u002Fxbox","tDsqBFEx88ZSQxV8Q78dFlkSdjNdQOwFU4jn0D2wcYQ",{"id":1809,"avatar":1810,"bio":1811,"extension":982,"intro":1812,"links":1813,"meta":1818,"name":1819,"slug":6,"stem":1820,"__hash__":1821},"authors\u002Fauthors\u002Fmaciej-walczak.yml","\u002Fmaciej.png","Senior Front-End Developer, właściciel MacWebcoder.","Cześć! Nazywam się Maciej i programuję zawodowo od ponad 20 lat – zaczynałem od PHP, a od wielu lat specjalizuję się we frontendzie. Prowadzę własną działalność MacWebcoder i na co dzień współpracuję z Grupą Autopay jako Senior Front-End Developer. Przez kilka lat uczyłem też programowania – na kursach dla początkujących i na studiach podyplomowych. Na blogu piszę o frontendzie, moim homelabie i o tym, co myślę o pracy programisty.",[1814],{"label":1815,"url":1816,"icon":1817},"YouTube","https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCMG_PvHPcSe0TCmnIXvzB1Q","i-lucide-youtube",{},"Maciej Walczak","authors\u002Fmaciej-walczak","H6ocdci2dcMuReMxMUAmRigqeWsj129ukqYgxQoEthU",1792036840975]