[{"data":1,"prerenderedAt":1498},["ShallowReactive",2],{"post:\u002Fblog\u002Ftinyjs-natywna-aplikacja-w-kilka-godzin-i-ponizej-10-mb":3,"surround:\u002Fblog\u002Ftinyjs-natywna-aplikacja-w-kilka-godzin-i-ponizej-10-mb":657,"related:\u002Fblog\u002Ftinyjs-natywna-aplikacja-w-kilka-godzin-i-ponizej-10-mb":667,"categories":701,"tags":770,"post-author:maciek-walczak":1484},{"id":4,"title":5,"author":6,"body":7,"categories":632,"comments":635,"cover":15,"coverAlt":636,"date":637,"description":638,"draft":639,"extension":640,"hidden":639,"meta":641,"navigation":635,"path":642,"readingTime":643,"redirectFrom":644,"seo":645,"sitemap":646,"slug":647,"stem":648,"tags":649,"updated":655,"wpId":655,"__hash__":656},"blog\u002Fblog\u002F2026-10-03-tinyjs-natywna-aplikacja-w-kilka-godzin-i-ponizej-10-mb.md","TinyJS – natywna aplikacja w kilka godzin i poniżej 10 MB","maciek-walczak",{"type":8,"value":9,"toc":613},"minimark",[10,17,38,48,51,73,80,85,88,120,123,127,130,156,163,170,174,177,185,224,231,235,246,249,260,263,267,270,273,332,339,343,346,355,359,362,369,372,381,385,388,395,398,402,405,412,444,455,462,465,469,472,478,487,496,502,522,525,562,566,569,580,583,587,590,593,596,600,603,606,609],[11,12],"figure",{"alt":13,"height":14,"src":15,"width":16},"Grafika: laptop z ciemnym dashboardem aplikacji, obok fragment kodu i napis „Natywna aplikacja macOS w JavaScript – TinyJS”",1086,"https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002F2026\u002F10\u002Ftinyjs-okladka.png",1448,[18,19,20,21,28,29,37],"p",{},"Jest taki rodzaj newsletterów, po których przeczytaniu człowiek ma ochotę rzucić wszystko i coś sprawdzić. Dziś trafiło na ",[22,23,27],"a",{"href":24,"rel":25},"https:\u002F\u002Fsendy.uw-team.org\u002Fw\u002F1ku746892GJrk892892SgKdZylHg\u002F39qJ1eGZjg5ebtupYGIFhQ\u002F7639YlXQZfj86tPKa3TqB6qg",[26],"nofollow","newsletter Kuby Mrugalskiego",", a konkretnie na jedną pozycję – ",[22,30,33],{"href":31,"rel":32},"https:\u002F\u002Ftinyjs.app",[26],[34,35,36],"strong",{},"TinyJS",", czyli framework do małych aplikacji desktopowych pisanych w JavaScripcie.",[18,39,40,41,47],{},"Od razu w głowie zapaliła mi się lampka. W ",[22,42,44],{"href":43},"\u002Fblog\u002Fprogramista-w-czasach-ai",[34,45,46],{},"poprzednim wpisie"," pisałem o Florino – SaaS-ie dla kwiaciarni i dekoratorów, który zbudowałem z Claude Code. Florino ma panel administracyjny w przeglądarce i API, które ten panel obsługuje. A skoro jest API, to czemu by nie spróbować zrobić do niego natywnej aplikacji na Maca? Nie „strony w okienku”, tylko prawdziwej aplikacji – z własnym interfejsem, menu, skrótami klawiszowymi, sesją trzymaną w systemowym pęku kluczy i ikoną w Docku.",[18,49,50],{},"Założenia na start były proste. Florino.app ma pozwolić zalogować się na swoje konto i obsłużyć 3 podstawowe widoki:",[52,53,54,61,67],"ul",{},[55,56,57,60],"li",{},[34,58,59],{},"dashboard"," – najważniejsze liczby i ostatnie wyceny",[55,62,63,66],{},[34,64,65],{},"listę wycen"," – razem z pełną edycją każdej z nich",[55,68,69,72],{},[34,70,71],{},"katalog usług"," – też z edycją",[18,74,75,76,79],{},"Spoiler: udało się. Wieczorem zbudowałem lokalnie aplikację, która się uruchamia i działa zgodnie z założeniami. A w obecnej formie – z własnymi ekranami wszystkich widoków – ",[34,77,78],{},"waży poniżej 10 MB",". Jak do tego doszło – o tym jest ten wpis. No to lecimy…",[81,82,84],"h2",{"id":83},"aplikacja-natywna-w-javascripcie-przecież-to-już-było","Aplikacja natywna w JavaScripcie? Przecież to już było…",[18,86,87],{},"Było, i to nie raz. Pomysł, żeby pisać aplikacje desktopowe technologiami webowymi, ma już swoje lata, a frameworków do tego wyrosło jak grzybów po deszczu:",[52,89,90,96,102,108,114],{},[55,91,92,95],{},[34,93,94],{},"Electron"," – król tej kategorii, na nim stoją m.in. VS Code, Slack czy Discord. Każda aplikacja wozi ze sobą własnego Chromium i własnego Node’a",[55,97,98,101],{},[34,99,100],{},"NW.js"," – starszy kuzyn Electrona, podobna idea i podobna waga",[55,103,104,107],{},[34,105,106],{},"Tauri"," – korzysta z systemowego WebView, więc jest dużo lżejszy, ale backend pisze się w Ruście",[55,109,110,113],{},[34,111,112],{},"Wails"," – to samo podejście, tylko backend w Go",[55,115,116,119],{},[34,117,118],{},"Neutralinojs"," – lekki, z systemowym WebView, ale z dość ograniczonym API",[18,121,122],{},"Kto robił kiedyś coś w Electronie, ten wie, że „Hello World” potrafi ważyć tyle, co niejedna gra sprzed 20 lat – typowa aplikacja to ok. 150 MB. Wygodne, ale ciężkie. Tauri czy Wails rozwiązują problem wagi, ale za cenę drugiego języka po stronie backendu – a front-endowiec niekoniecznie ma ochotę uczyć się Rusta tylko po to, żeby zapisać token w pęku kluczy.",[81,124,126],{"id":125},"tinyjs-a-co-to-za-zwierz","TinyJS – a co to za zwierz?",[18,128,129],{},"I tu wchodzi TinyJS, który łączy oba światy:",[52,131,132,138,150],{},[55,133,134,137],{},[34,135,136],{},"interfejs"," renderuje systemowy WebKit – ten sam, który napędza Safari, więc nie trzeba go dołączać do paczki",[55,139,140,143,144,149],{},[34,141,142],{},"backend"," to nadal JavaScript, tyle że uruchamiany w ",[22,145,148],{"href":146,"rel":147},"https:\u002F\u002Fgithub.com\u002Fsaghul\u002Ftxiki.js",[26],"txiki.js"," – małym runtime JS zamiast pełnego Node’a",[55,151,152,155],{},[34,153,154],{},"komunikacja"," między oknem a backendem idzie przez gniazdo Unix – bez serwera HTTP i bez otwierania portów",[18,157,158,159,162],{},"Efekt? Wszystko zostaje w JavaScripcie, w środku mogę używać tego, co znam na co dzień – w moim przypadku Vue 3 i TypeScriptu – a gotowa aplikacja zajmuje na dysku tyle, co kilka zdjęć z telefonu. Moja Florino.app, z logowaniem, dashboardem, pełną edycją wycen i katalogiem, waży ",[34,160,161],{},"poniżej 10 MB",". Dla porównania – sam Electron w wersji „Hello World” jest kilkanaście razy większy.",[18,164,165,166,169],{},"I to jest moim zdaniem największy wyróżnik TinyJS. Frameworków do aplikacji natywnych z webowym interfejsem jest sporo, ale mało który pozwala zachować jeden język w całym projekcie ",[34,167,168],{},"i"," zmieścić gotową aplikację w kilku MB.",[81,171,173],{"id":172},"kto-tu-właściwie-programował","Kto tu właściwie programował?",[18,175,176],{},"Uczciwie powiem od razu: kodu nie napisałem ani linijki. Całość stworzył Claude w trybie Cowork, a ja byłem w tym procesie tym, kim byłem przy samym Florino – określiłem wymagania i narzędzia, odpowiadałem na pytania, podejmowałem decyzje i testowałem kolejne etapy na Macu, aż do zbudowania gotowej aplikacji.",[18,178,179,180,184],{},"Zaczęło się koło 17:45 od prośby: przeanalizuj TinyJS, przejrzyj kod Florino i zaplanuj aplikację. Po kilku minutach dostałem plan (w pliku ",[181,182,183],"code",{},"PLAN.md",") i 4 pytania doprecyzowujące. Moje odpowiedzi ustawiły cały dalszy kierunek:",[186,187,188,202,208,218],"ol",{},[55,189,190,193,194,197,198,201],{},[34,191,192],{},"Logowanie"," – zamiast podrabiać ciasteczka przeglądarki, robimy małą, czystą zmianę po stronie serwera Florino: plugin ",[181,195,196],{},"bearer"," w Better Auth. Aplikacja dostaje token i wysyła go w nagłówku ",[181,199,200],{},"Authorization",".",[55,203,204,207],{},[34,205,206],{},"Frontend"," – Vue 3 + TypeScript, czyli ten sam ekosystem co Florino.",[55,209,210,213,214,217],{},[34,211,212],{},"Kliknięcie w wycenę"," otwiera ją ",[34,215,216],{},"w aplikacji",", a nie w przeglądarce. Firma ma móc w pełni obsłużyć wyceny bez wychodzenia z Florino.app.",[55,219,220,223],{},[34,221,222],{},"Zakres"," – tylko produkcja (florino.io), logowanie na swoją firmę, bez przełączania między firmami.",[18,225,226,227,230],{},"Przy okazji wyszedł pierwszy ciekawy problem. Panel webowy loguje się ciasteczkiem domeny ",[181,228,229],{},".florino.io"," – którego natywna aplikacja po prostu nie ma. Stąd decyzja o tokenie Bearer. Zanim jednak zlecono jakąkolwiek zmianę, Claude przeczytał kod źródłowy Better Auth i sprawdził, czy ochrona CSRF (sprawdzanie nagłówka origin) nie zablokuje logowania bez ciasteczek. Nie zablokuje – co potem zostało potwierdzone testem.",[81,232,234],{"id":233},"dwóch-agentów-jeden-kontrakt","Dwóch agentów, jeden kontrakt",[18,236,237,238,241,242,245],{},"I tu zaczyna się część, która mnie samego najbardziej zaskoczyła. Zmiana w Florino to inne repozytorium, inny projekt, inne zasady. Zamiast mieszać, Claude przygotował samodzielny „wsad” – dokument z zakresem zmiany, listą rzeczy, których ",[34,239,240],{},"nie"," robić, wymaganymi testami i kryteriami akceptacji. Ten wsad zleciłem ",[34,243,244],{},"Claude Code",", który pracował bezpośrednio w projekcie Florino.",[18,247,248],{},"Po mniej więcej pół godzinie wróciła odpowiedź – „wsad zwrotny”. Zmiana wdrożona na produkcję (Florino 0.14.2), z testem E2E, a do tego dokładny kontrakt API, na którym dalej oparto aplikację. Cała zmiana po stronie serwera to jedna linia konfiguracji, bez ruszania endpointów.",[18,250,251,252,255,256,259],{},"Co więcej – Claude Code po stronie Florino wyłapał pułapkę, której nikt się nie spodziewał. Odpowiedź z logowania zawiera pole ",[181,253,254],{},"token",", ale to jest niepodpisane ID sesji, które serwer… odrzuca. Prawdziwy token przychodzi wyłącznie w nagłówku ",[181,257,258],{},"set-auth-token",". Gdyby nie kontrakt, ktoś straciłby na tym dobrą godzinę 🙂",[18,261,262],{},"W praktyce wyglądało to trochę jak współpraca dwóch zespołów w firmie – jeden robi aplikację, drugi backend, a pomiędzy nimi jest dokument, który obie strony traktują jak umowę. A ja w roli kogoś, kto ten dokument przenosi z biurka na biurko i pilnuje, żeby nikt nie wyszedł poza ustalenia. Tylko że „spotkanie” trwało 30 minut, a nie 2 tygodnie.",[81,264,266],{"id":265},"etap-po-etapie","Etap po etapie",[18,268,269],{},"Dalej poszło już według rytmu, który bardzo szybko się wyklarował: etap → build → test na Macu → kolejny etap. Ten ostatni krok był niezbędny, bo – o czym za chwilę – Claude nie miał jak zobaczyć swojej aplikacji.",[18,271,272],{},"Mniej więcej tak to wyglądało w czasie:",[52,274,275,281,290,296,302,308,314,320,326],{},[55,276,277,280],{},[34,278,279],{},"~18:50"," – szkielet aplikacji i połączenie z API. Pierwszy ekran pokazywał tylko diagnostykę „API odpowiada (401)”, ale to wystarczyło, żeby wiedzieć, że cała rura działa",[55,282,283,286,287,289],{},[34,284,285],{},"~19:05"," – logowanie: e-mail i hasło, reset hasła, token w Keychainie, automatyczne logowanie po restarcie, ekran „brak połączenia” (który ",[34,288,240],{}," wylogowuje) i potwierdzenie wylogowania natywnym oknem macOS",[55,291,292,295],{},[34,293,294],{},"~19:11"," – powłoka aplikacji: sidebar z przezroczystością w stylu macOS, natywne menu Plik \u002F Edycja \u002F Widok, skróty ⌘1\u002F⌘2\u002F⌘3, ⌘N, ⌘R, ⌘F, ⌘S, ⌘P i tryb ciemny",[55,297,298,301],{},[34,299,300],{},"~19:18"," – dashboard",[55,303,304,307],{},[34,305,306],{},"~19:24"," – lista wycen",[55,309,310,313],{},[34,311,312],{},"~19:37"," – szczegóły wyceny z pełną edycją – największy etap z całego dnia",[55,315,316,319],{},[34,317,318],{},"~19:59"," – nowa wycena",[55,321,322,325],{},[34,323,324],{},"~20:14"," – wykończenie i katalog usług",[55,327,328,331],{},[34,329,330],{},"~20:28"," – pierwszy commit: 102 pliki",[18,333,334,335,338],{},"Od pierwszego pytania do commita z kompletną aplikacją – ok. ",[34,336,337],{},"4,5 godziny",". Wliczając w to czekanie na Claude Code po stronie Florino.",[340,341,342],"h3",{"id":59},"Dashboard",[18,344,345],{},"Dashboard to 5 kafli z najważniejszymi liczbami (nowe zapytania z trendem z ostatnich 7 dni, wyceny w trakcie, zamówienia, łączna wartość i dostępne kredyty), roczny wykres wycen z dymkami, podział na statusy i lista ostatnich wycen. Czyli to samo, co w panelu webowym – tylko w oknie, które otwiera się z Docka.",[11,347,352],{"alt":348,"height":349,"src":350,"width":351},"Dashboard aplikacji Florino na macOS w trybie ciemnym: 5 kafli z liczbami, wykres wycen w 2026 roku, podział aktywnych wycen na statusy i tabela ostatnich wycen",932,"https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002F2026\u002F10\u002Ftinyjs-florino-01-dashboard.png",1392,[18,353,354],{},"Dashboard – na koncie demo, w trybie ciemnym",[340,356,358],{"id":357},"lista-i-edycja-wycen","Lista i edycja wycen",[18,360,361],{},"Lista wycen ma podział na aktywne i archiwum, wyszukiwanie po ID, filtry statusu, typu i dat (z gotowymi presetami), sortowanie, paginację i nawigację strzałkami. Filtry są zapamiętywane, więc po ponownym otwarciu aplikacji wszystko jest tak, jak było.",[11,363,366],{"alt":364,"height":349,"src":365,"width":351},"Lista wycen w aplikacji Florino: zakładki Aktywne i Archiwum, wyszukiwarka, filtry statusu, typu i dat z presetami Tydzień, Miesiąc, Rok oraz tabela wycen","https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002F2026\u002F10\u002Ftinyjs-florino-02-wyceny.png",[18,367,368],{},"Lista wycen z filtrami",[18,370,371],{},"Szczegóły wyceny to już pełnoprawne narzędzie do pracy: zmiana statusu i nazwy, edycja cen, ilości i komentarzy przy każdej pozycji, dodawanie pozycji z katalogu albo własnych, notatki, dane klienta i wydarzenia, wysyłka e-mailem, historia wersji, archiwizacja, usuwanie, druk i PDF. Jak coś zmienię, na dole pojawia się pasek „Niezapisane zmiany”, a ⌘S zapisuje – dokładnie tak, jak w każdej innej aplikacji na Maca.",[11,373,378],{"alt":374,"height":375,"src":376,"width":377},"Szczegóły wyceny w aplikacji Florino: lista usług z polami ceny i ilości, komentarz dla klienta, suma, notatki prywatne, historia zmian oraz panele klienta, wydarzenia i widoku klienta",1437,"https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002F2026\u002F10\u002Ftinyjs-florino-03-wycena.png",1385,[18,379,380],{},"Edycja wyceny",[340,382,384],{"id":383},"katalog-usług-czyli-zmiana-planów-w-trakcie","Katalog usług – czyli zmiana planów w trakcie",[18,386,387],{},"Katalogu w pierwotnym planie… nie było. Miał być tylko link „otwórz w przeglądarce”. Ale koło 20:00, mając już działające wyceny, stwierdziłem, że skoro idzie tak dobrze, to dorzucamy. Kwadrans później był gotowy: grupy, usługi z wariantami cenowymi i typami wydarzeń, typy wydarzeń z ikonami i zmiana kolejności przeciąganiem.",[11,389,392],{"alt":390,"height":375,"src":391,"width":377},"Katalog usług w aplikacji Florino: grupy Dekoracje i Usługi dodatkowe, usługi z opisami, typami wydarzeń i cenami wariantów Basic, Standard, Premium","https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002F2026\u002F10\u002Ftinyjs-florino-04-katalog.png",[18,393,394],{},"Katalog usług – kolejność ustawia się przeciąganiem",[18,396,397],{},"Przy okazji wykończenia doszły rzeczy, które sprawiają, że to faktycznie „czuje się” jak aplikacja na Maca: liczba nowych wycen na ikonie w Docku, systemowe powiadomienie „Nowe zapytanie ofertowe”, menu pod prawym przyciskiem na wierszu wyceny, odświeżanie danych po powrocie do okna i własna ikona.",[81,399,401],{"id":400},"jak-to-działa-pod-spodem","Jak to działa pod spodem?",[18,403,404],{},"Dla tych, którzy lubią zajrzeć pod maskę – w kilku zdaniach.",[18,406,407,408,411],{},"Okno to systemowy WebKit z aplikacją Vue. Ale – i to jest kluczowe – strona ",[34,409,410],{},"sama nie łączy się z internetem",". Każde zapytanie idzie do backendu TinyJS:",[413,414,419],"pre",{"className":415,"code":416,"language":417,"meta":418,"style":418},"language-ts shiki shiki-themes github-light-default github-light-default github-dark-default","tiny.api.call('apiRequest', …)\n","ts","",[181,420,421],{"__ignoreMap":418},[422,423,426,430,434,437,441],"span",{"class":424,"line":425},"line",1,[422,427,429],{"class":428},"s_bOF","tiny.api.",[422,431,433],{"class":432},"sd69k","call",[422,435,436],{"class":428},"(",[422,438,440],{"class":439},"s-BGO","'apiRequest'",[422,442,443],{"class":428},", …)\n",[18,445,446,447,450,451,454],{},"Backend dokleja token wyjęty z ",[34,448,449],{},"Keychaina macOS"," i dopiero on woła ",[181,452,453],{},"https:\u002F\u002Fflorino.io\u002Fapi\u002Fadmin\u002F*",". Pilnuje przy tym listy dozwolonych ścieżek, rozpoznaje typowe błędy (wygasła sesja, zablokowane konto, brak sieci) i sam „wylogowuje” użytkownika, gdy token przestaje działać.",[18,456,457,458,461],{},"Co to daje? Po pierwsze – zero problemów z CORS, bo z punktu widzenia serwera to zwykły klient HTTP, a nie przeglądarka. Po drugie – token nie krąży po kodzie strony, tylko siedzi w systemowym pęku kluczy i jest używany wyłącznie w backendzie. Kto kiedyś trzymał tokeny w ",[181,459,460],{},"localStorage",", ten wie, o czym mówię…",[18,463,464],{},"Kilka liczb na dzień commita: ok. 5,3 tys. linii własnego kodu (TS + Vue), 77 testów jednostkowych w Vitest, ok. 25 endpointów API Florino w użyciu i 1 zmiana po stronie serwera.",[81,466,468],{"id":467},"problemy","Problemy…",[18,470,471],{},"Żeby nie było tak różowo – po drodze było kilka „ciekawostek”.",[18,473,474,477],{},[34,475,476],{},"Claude nie widział aplikacji, którą budował."," Jego powłoka działała w linuksowej maszynie wirtualnej bez ekranu, a do tego florino.io było z niej niedostępne. Jak więc sprawdzić, czy aplikacja na Maca działa, nie mając Maca? Każdy etap przechodził typecheck, testy, build i bundlowanie backendu tak, jak robi to TinyJS. Do tego zrzuty ekranu w Chromium z podstawionym, atrapowym backendem. A ostatnim testem byłem ja – z aplikacją uruchomioną na Macu. Trochę jak praca zdalna z bardzo sumiennym kolegą, któremu nie działa udostępnianie ekranu…",[18,479,480,486],{},[34,481,482,483],{},"Chromium nie ładuje modułów JS z ",[181,484,485],{},"file:\u002F\u002F",", a TinyJS ładuje stronę właśnie w ten sposób. Do zrzutów ekranu trzeba było postawić lokalny serwer HTTP.",[18,488,489,495],{},[34,490,491,494],{},[181,492,493],{},"tinyjs new"," nie działa w niepustym katalogu"," – a w katalogu był już plan i wsady. Szablon projektu został więc odtworzony ręcznie na podstawie źródeł CLI TinyJS.",[18,497,498,501],{},[34,499,500],{},"Zerwane połączenie z komputerem w środku etapu 6"," – czyli tego największego. Praca poszła dalej na kopii w chmurze, a przed nadpisaniem plików na Macu Claude porównał sumy kontrolne, żeby nie skasować żadnej zmiany. Przyznam, że tego się nie spodziewałem – sam pewnie bym po prostu skopiował i miał nadzieję, że będzie dobrze…",[18,503,504,507,508,511,512,515,516,519,520,201],{},[34,505,506],{},"API potrafi zaskoczyć."," Parametr ",[181,509,510],{},"?archived=false"," w liście wycen zwraca… archiwum. Winowajcą jest ",[181,513,514],{},"z.coerce.boolean(\"false\")",", który zwraca ",[181,517,518],{},"true"," – bo niepusty string to w JS prawda. Klasyka. Aplikacja wysyła ten parametr tylko jako ",[181,521,518],{},[18,523,524],{},"Do tego garść drobniejszych pułapek:",[52,526,527,530,536,539,546,549,552],{},[55,528,529],{},"skrót ⇧⌘Q, który miał być „Wyloguj”, w macOS wylogowuje… z całego systemu",[55,531,532,535],{},[181,533,534],{},"printToPDF"," w TinyJS daje jedną długą stronę, więc drukowanie idzie przez natywne okno drukowania",[55,537,538],{},"TinyJS ma jedno menu kontekstowe na całą stronę – aplikacja podmienia je, gdy kursor najedzie na wiersz wyceny",[55,540,541,542,545],{},"zapomniane ",[181,543,544],{},"npm install"," po dodaniu biblioteki ikon i błąd Vite „Failed to resolve import”",[55,547,548],{},"w Heroicons v2 nie ma ikony „liść”, której używa panel webowy",[55,550,551],{},"w trybie ciemnym ciemne logo znikało na ciemnym tle, a biały tekst na jasnozielonym przycisku był nieczytelny – kolory słupków wykresu dobrano w końcu walidatorem kontrastu",[55,553,554,557,558,561],{},[181,555,556],{},"4500 zł",", ale ",[181,559,560],{},"12 450 zł"," – polska lokalizacja grupuje tysiące dopiero od 5 cyfr. Wygląda jak błąd, ale panel webowy robi to samo, więc zostało – a test to dokumentuje",[340,563,565],{"id":564},"błędy-w-webie-znalezione-przy-okazji","Błędy w webie znalezione przy okazji",[18,567,568],{},"I tu ciekawostka. Przenoszenie funkcji z panelu webowego do aplikacji to świetny sposób na code review – bo trzeba dokładnie zrozumieć, jak coś działa. Przy okazji wyszły 3 błędy w samym panelu Florino:",[52,570,571,574,577],{},[55,572,573],{},"zarchiwizowana wycena nie pokazuje pozycji",[55,575,576],{},"zmiana statusu kasuje niezapisane zmiany w cenach",[55,578,579],{},"brak ostrzeżenia przy wyjściu z niezapisanymi zmianami",[18,581,582],{},"Aplikacja na Maca ich nie ma, a dla panelu webowego powstała osobna lista do poprawy. Czyli eksperyment, który miał być tylko zabawą, przy okazji poprawi właściwy produkt 🙂",[81,584,586],{"id":585},"czy-było-warto","Czy było warto?",[18,588,589],{},"Jak dla mnie – zdecydowanie tak. Po południu przeczytałem o nowym narzędziu, wieczorem miałem działającą aplikację natywną z logowaniem, dashboardem, pełną obsługą wycen i katalogiem. Nie prototyp z 2 ekranami, tylko coś, czego faktycznie da się używać na co dzień.",[18,591,592],{},"Na sam TinyJS patrzę z dużą sympatią. O ile nie zastąpi Electrona w dużych aplikacjach, o tyle do małych narzędzi – nakładek na własne API, paneli, „klientów” do SaaS-a – wydaje się strzałem w dziesiątkę. Poniżej 10 MB, systemowy WebKit, JavaScript na backendzie i Vue na froncie. Miał kilka ograniczeń (jedno menu kontekstowe, PDF jako jedna długa strona), ale żadne nie zablokowało pracy.",[18,594,595],{},"Ale chyba ciekawsza lekcja z tego dnia jest inna. Najwięcej dała nie sama szybkość pisania kodu, tylko proces: plan, pytania na starcie, wsad dla drugiego agenta z jasnym kontraktem, małe etapy i człowiek jako ostatni test po każdym z nich. Dokładnie to, o czym pisałem w poprzednim wpisie – rola programisty przesuwa się w stronę kogoś, kto wyznacza ramy i pilnuje, żeby z nich nie wychodzić.",[81,597,599],{"id":598},"co-dalej","Co dalej?",[18,601,602],{},"Na tym na pewno się nie skończy. Aplikacja będzie dalej rozwijana – docelowo chcę przenieść do niej wszystkie widoki z panelu administracyjnego Florino.io, tak żeby sekcja „Na florino.io” w sidebarze w końcu zniknęła.",[18,604,605],{},"Jest tylko jeden haczyk. Ostatni krok – opublikowanie aplikacji, czyli podpis Developer ID, notaryzacja przez Apple i instalator DMG – póki co nie jest możliwy, bo nie mam konta deweloperskiego w Apple. Czy Florino.app trafi kiedyś do App Store? Jeszcze nie wiem. Na razie działa u mnie lokalnie i to mi w zupełności wystarcza. TinyJS pozwala też budować aplikacje na Windowsa i Linuksa, ale tego nie testowałem.",[18,607,608],{},"A Wy – próbowaliście już TinyJS albo innych lżejszych alternatyw dla Electrona? Dajcie znać w komentarzach, chętnie porównam wrażenia 🙂",[610,611,612],"style",{},"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 .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);}",{"title":418,"searchDepth":614,"depth":614,"links":615},2,[616,617,618,619,620,626,627,630,631],{"id":83,"depth":614,"text":84},{"id":125,"depth":614,"text":126},{"id":172,"depth":614,"text":173},{"id":233,"depth":614,"text":234},{"id":265,"depth":614,"text":266,"children":621},[622,624,625],{"id":59,"depth":623,"text":342},3,{"id":357,"depth":623,"text":358},{"id":383,"depth":623,"text":384},{"id":400,"depth":614,"text":401},{"id":467,"depth":614,"text":468,"children":628},[629],{"id":564,"depth":623,"text":565},{"id":585,"depth":614,"text":586},{"id":598,"depth":614,"text":599},[633,634],"artykuly","osx",true,"Laptop z ciemnym dashboardem aplikacji, obok fragment kodu i napis „Natywna aplikacja macOS w JavaScript – TinyJS”","2026-10-03","Po południu przeczytałem o TinyJS, wieczorem miałem na Macu natywną aplikację do Florino. Z własnymi widokami, z logowaniem – i poniżej 10 MB…",false,"md",{},"\u002Fblog\u002Ftinyjs-natywna-aplikacja-w-kilka-godzin-i-ponizej-10-mb",12,[],{"title":5,"description":638},{"loc":642},"tinyjs-natywna-aplikacja-w-kilka-godzin-i-ponizej-10-mb","blog\u002F2026-10-03-tinyjs-natywna-aplikacja-w-kilka-godzin-i-ponizej-10-mb",[634,650,651,652,653,654],"ai","claude-code","saas","vue-js","programowanie",null,"wVT21L8tkHos2XV74KgI1iooY5_gicLX0XvI_zRyQK0",[658,662],{"title":659,"path":43,"stem":660,"description":661,"children":-1},"Programista w czasach AI","blog\u002F2026-10-01-programista-w-czasach-ai","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…",{"title":663,"path":664,"stem":665,"description":666,"children":-1},"Tysiące zdjęć i filmów – jak to ogarnąć na własnym serwerze?","\u002Fblog\u002Ftysiace-zdjec-i-filmow-jak-to-ogarnac-na-wlasnym-serwerze","blog\u002F2026-10-03-tysiace-zdjec-i-filmow-jak-to-ogarnac-na-wlasnym-serwerze","Backup zdjęć z telefonów na NAS to dopiero połowa sukcesu. Druga połowa to znaleźć potem cokolwiek w tysiącach plików… U mnie robią to Immich i Stash.",[668,677,690],{"path":43,"title":659,"description":661,"date":669,"categories":670,"tags":671,"readingTime":675,"draft":639,"cover":676},"2026-10-01",[633],[654,672,673,674,650,651,652],"kariera-w-it","automatyzacja","front-end-developer",13,"https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002F2026\u002F10\u002Fprogramista-w-czasach-ai-okladka.png",{"path":678,"title":679,"description":680,"date":681,"categories":682,"tags":683,"readingTime":688,"draft":639,"cover":689},"\u002Fblog\u002Fraport-desi-2020-za-malo-kobiet-w-it","Raport DESI 2020 – za mało kobiet w IT!","Wkurzyłem się. Zupełnie przypadkiem trafiłem na artykuł Polska branża IT ma się słabo. Brakuje specjalistów, pracuje bardzo mało kobiet. Dotyczy on raportu…","2020-07-21",[633],[684,685,686,654,687],"desi-2020","kobiety-w-it","praca","rozwoj",4,"https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002Fwp\u002F2020\u002F07\u002FZrzut-ekranu-2020-07-20-o-23.23.40.png",{"path":691,"title":692,"description":693,"date":694,"categories":695,"tags":696,"readingTime":699,"draft":639,"cover":700},"\u002Fblog\u002Fvuex-kilka-przemyslen-po-roku-kodowania","VUEX – kilka przemyśleń po roku kodowania","Co to jest Vue i Vuex? Jeśli nie wiesz co to jest Vue lub Vuex – to zapraszam najpierw do obejrzenia nagrania z mojej prezentacji…","2019-08-28",[633,653],[697,653,698],"store-management","vuex",11,"https:\u002F\u002F5icqmonbzxnrw2bn.public.blob.vercel-storage.com\u002Fwp\u002F2019\u002F08\u002Fvuex.png",[702,709,716,723,730,737,743,750,757,764],{"id":703,"description":655,"extension":704,"meta":705,"name":706,"slug":633,"stem":707,"__hash__":708},"categories\u002Fcategories\u002Fartykuly.yml","yml",{},"Artykuły","categories\u002Fartykuly","aw37OCuccDz54Q07CDyESiid8VqHzN1nGf8cMOk_mI0",{"id":710,"description":655,"extension":704,"meta":711,"name":712,"slug":713,"stem":714,"__hash__":715},"categories\u002Fcategories\u002Fdostepnosc-cyfrowa.yml",{},"Dostępność cyfrowa","dostepnosc-cyfrowa","categories\u002Fdostepnosc-cyfrowa","6m7Ag8ZZ1EzfdgLuQnAUAMmRcjkgb2tpFM9n1qxANOM",{"id":717,"description":655,"extension":704,"meta":718,"name":719,"slug":720,"stem":721,"__hash__":722},"categories\u002Fcategories\u002Fkonferencje.yml",{},"Konferencje","konferencje","categories\u002Fkonferencje","dQl4MW7163iEG-b7Cv6FJ2gUxLqnpaiMOLixCXvhHTw",{"id":724,"description":655,"extension":704,"meta":725,"name":726,"slug":727,"stem":728,"__hash__":729},"categories\u002Fcategories\u002Fkonfiguracja.yml",{},"Konfiguracja","konfiguracja","categories\u002Fkonfiguracja","ESTOPlJnBPnwuuqgOm7yqGAwgllsRJfSPVk22K_nQe0",{"id":731,"description":655,"extension":704,"meta":732,"name":733,"slug":734,"stem":735,"__hash__":736},"categories\u002Fcategories\u002Fnauka.yml",{},"Nauka","nauka","categories\u002Fnauka","3hQRPpuXqoNblW09Gj46arWFgH-3YfsMcgDyd4xLkN4",{"id":738,"description":655,"extension":704,"meta":739,"name":740,"slug":634,"stem":741,"__hash__":742},"categories\u002Fcategories\u002Fosx.yml",{},"OSX","categories\u002Fosx","WW8-0hUIqcivgAUl8WQuAvJ3-xVLRLjLkmP00PP4eXY",{"id":744,"description":655,"extension":704,"meta":745,"name":746,"slug":747,"stem":748,"__hash__":749},"categories\u002Fcategories\u002Fpolecane.yml",{},"Polecane","polecane","categories\u002Fpolecane","ckLXqMEBUHLxZavR7FGvpQjhxc7ycP_sQ7myEw64R9I",{"id":751,"description":655,"extension":704,"meta":752,"name":753,"slug":754,"stem":755,"__hash__":756},"categories\u002Fcategories\u002Fpomoce.yml",{},"Pomoce","pomoce","categories\u002Fpomoce","3oKSrG-VgrihP1nofQwuUItxUsyzVfgEfTMF2vq7EIw",{"id":758,"description":655,"extension":704,"meta":759,"name":760,"slug":761,"stem":762,"__hash__":763},"categories\u002Fcategories\u002Fprezentacje.yml",{},"Prezentacje","prezentacje","categories\u002Fprezentacje","4L5LUH8zxl0qXRvdymYTwtrkuj1tQun8R7yYz_OfndE",{"id":765,"description":655,"extension":704,"meta":766,"name":767,"slug":653,"stem":768,"__hash__":769},"categories\u002Fcategories\u002Fvue-js.yml",{},"Vue.js","categories\u002Fvue-js","wOIuiF3jWQ-Zph8v7hYGNuLdJbCx0VguVg0loyh-Mwk",[771,777,782,789,796,803,810,815,822,829,836,842,849,856,863,870,877,884,890,896,903,909,915,921,927,933,939,945,951,957,963,969,975,982,988,994,1001,1008,1014,1020,1026,1032,1037,1042,1048,1055,1062,1068,1075,1082,1087,1094,1101,1108,1114,1121,1126,1133,1140,1146,1153,1159,1165,1172,1177,1184,1190,1196,1201,1207,1214,1220,1227,1233,1239,1246,1252,1259,1264,1271,1277,1283,1290,1297,1304,1310,1316,1322,1329,1336,1342,1349,1355,1362,1369,1375,1381,1387,1394,1400,1406,1413,1420,1427,1433,1439,1445,1451,1456,1463,1470,1477],{"id":772,"extension":704,"meta":773,"name":774,"slug":774,"stem":775,"__hash__":776},"tags\u002Ftags\u002Faccessibility.yml",{},"accessibility","tags\u002Faccessibility","luflFOwd8bzxVK2qeBv80Pzxhje6x-hbJYaDUihuwOk",{"id":778,"extension":704,"meta":779,"name":650,"slug":650,"stem":780,"__hash__":781},"tags\u002Ftags\u002Fai.yml",{},"tags\u002Fai","dps1QD2_kN7ri7PVTP0uaeL-lYhL69nCwndkqEqLLhU",{"id":783,"extension":704,"meta":784,"name":785,"slug":786,"stem":787,"__hash__":788},"tags\u002Ftags\u002Fangular.yml",{},"Angular","angular","tags\u002Fangular","z6SH0xA8FvB2X9kVmW-gtOdfx__mVrgIuA7HVCzfLjo",{"id":790,"extension":704,"meta":791,"name":792,"slug":793,"stem":794,"__hash__":795},"tags\u002Ftags\u002Fapache2.yml",{},"Apache2","apache2","tags\u002Fapache2","unCvGoDYof2-UiVE0lnN8eq5ru5roRg5_2mAo4TdEHk",{"id":797,"extension":704,"meta":798,"name":799,"slug":800,"stem":801,"__hash__":802},"tags\u002Ftags\u002Faplikacje-i-uslugi-internetowe.yml",{},"aplikacje i usługi internetowe","aplikacje-i-uslugi-internetowe","tags\u002Faplikacje-i-uslugi-internetowe","G2Vojqp3Zd7QgL3zFleglcNCFkjzkAAeDQCScU6P8bc",{"id":804,"extension":704,"meta":805,"name":806,"slug":807,"stem":808,"__hash__":809},"tags\u002Ftags\u002Fasynchronicznosc.yml",{},"asynchroniczność","asynchronicznosc","tags\u002Fasynchronicznosc","9RMRbHed9wQxDzVpEjO6Ay9zxWDCI0e4hE8F4zqGgj0",{"id":811,"extension":704,"meta":812,"name":673,"slug":673,"stem":813,"__hash__":814},"tags\u002Ftags\u002Fautomatyzacja.yml",{},"tags\u002Fautomatyzacja","vfUpLN8opVGvKUQgjGwEYxKfsZsLo3jxneMF9YMMVD0",{"id":816,"extension":704,"meta":817,"name":818,"slug":819,"stem":820,"__hash__":821},"tags\u002Ftags\u002Fblokowanie-reklam.yml",{},"blokowanie reklam","blokowanie-reklam","tags\u002Fblokowanie-reklam","lq-tfiZ_uB_SerIlaIQFMOXvGIF3QoVVVyPxjwrEsR4",{"id":823,"extension":704,"meta":824,"name":825,"slug":826,"stem":827,"__hash__":828},"tags\u002Ftags\u002Fblue-media.yml",{},"Blue Media","blue-media","tags\u002Fblue-media","z8G577CxZ7uSy-oNOkWtn3XgbsbjeKhuNby5Q6BCRuM",{"id":830,"extension":704,"meta":831,"name":832,"slug":833,"stem":834,"__hash__":835},"tags\u002Ftags\u002Fchrome-extensions.yml",{},"chrome extensions","chrome-extensions","tags\u002Fchrome-extensions","Ip0fOTD9TMJiHcbXwgvAB2mFf_D1rlP5ZfkJG3GbCL0",{"id":837,"extension":704,"meta":838,"name":839,"slug":651,"stem":840,"__hash__":841},"tags\u002Ftags\u002Fclaude-code.yml",{},"claude code","tags\u002Fclaude-code","wJZCEyRD6Cq9w7YKW0WDw94B_K-Y-nbkt1sLGN2RgEw",{"id":843,"extension":704,"meta":844,"name":845,"slug":846,"stem":847,"__hash__":848},"tags\u002Ftags\u002Fcmr.yml",{},"CMR","cmr","tags\u002Fcmr","eNv_ncSDXVsAFBCM8A4uJqAJItqSOP29I1Kabpm-l3Y",{"id":850,"extension":704,"meta":851,"name":852,"slug":853,"stem":854,"__hash__":855},"tags\u002Ftags\u002Fcodersday.yml",{},"CodersDay","codersday","tags\u002Fcodersday","jLWUVGvGvi2irKFpFs0Ea6hkW71mLoiroOaGDcv1KWw",{"id":857,"extension":704,"meta":858,"name":859,"slug":860,"stem":861,"__hash__":862},"tags\u002Ftags\u002Fcoderslab.yml",{},"CodersLab","coderslab","tags\u002Fcoderslab","NQEy1mD_tk9h71yZtjSoC4LhXGE54DGYaYgj3JOoUqY",{"id":864,"extension":704,"meta":865,"name":866,"slug":867,"stem":868,"__hash__":869},"tags\u002Ftags\u002Fcolor-contrast-analyzer.yml",{},"Color Contrast Analyzer","color-contrast-analyzer","tags\u002Fcolor-contrast-analyzer","hGu3gO_owf9Tn4p5-FssJGVt4ToSsRfgjMjWdX2YgEI",{"id":871,"extension":704,"meta":872,"name":873,"slug":874,"stem":875,"__hash__":876},"tags\u002Ftags\u002Fcolor-contrast-checker.yml",{},"Color Contrast Checker","color-contrast-checker","tags\u002Fcolor-contrast-checker","w8QKUWUH691wTFtUWDJMjbCvC6zlFZo6j4UDDSg1NDY",{"id":878,"extension":704,"meta":879,"name":880,"slug":881,"stem":882,"__hash__":883},"tags\u002Ftags\u002Fconfrontjs.yml",{},"ConFrontJS","confrontjs","tags\u002Fconfrontjs","G4ePmrCbuLVA_ccxs7rcKSveQ3Kvn7y6-Ie9-H_5gpc",{"id":885,"extension":704,"meta":886,"name":887,"slug":887,"stem":888,"__hash__":889},"tags\u002Ftags\u002Fcss3.yml",{},"css3","tags\u002Fcss3","f5Gtp9yzvmyMSZ-IN--19c7OR-v5LXzdvhNaEmiOsuw",{"id":891,"extension":704,"meta":892,"name":893,"slug":684,"stem":894,"__hash__":895},"tags\u002Ftags\u002Fdesi-2020.yml",{},"DESI 2020","tags\u002Fdesi-2020","KeSFSj6VcXN0OciAUSTR8C1kiGUE3nLzGR1Pi5h_USE",{"id":897,"extension":704,"meta":898,"name":899,"slug":900,"stem":901,"__hash__":902},"tags\u002Ftags\u002Fdns.yml",{},"DNS","dns","tags\u002Fdns","_TzsfpRL_ROm8MT5opDE1gg4GnuukbCyKY87W-IFl68",{"id":904,"extension":704,"meta":905,"name":906,"slug":713,"stem":907,"__hash__":908},"tags\u002Ftags\u002Fdostepnosc-cyfrowa.yml",{},"dostępność cyfrowa","tags\u002Fdostepnosc-cyfrowa","8xZ6WRsys1qnr-vWH_Y4Ne8ac2RBONWyLrrm31u00xI",{"id":910,"extension":704,"meta":911,"name":912,"slug":912,"stem":913,"__hash__":914},"tags\u002Ftags\u002Febook.yml",{},"ebook","tags\u002Febook","2Eqjl28-mK0fxpryAfGFMCel8MSByJVuQRsvy_S_cgY",{"id":916,"extension":704,"meta":917,"name":918,"slug":918,"stem":919,"__hash__":920},"tags\u002Ftags\u002Felgato.yml",{},"elgato","tags\u002Felgato","ys3dC5VhSFe1JP_z6vIBB8W8WSJmrbB2C3gwTjSkINM",{"id":922,"extension":704,"meta":923,"name":924,"slug":924,"stem":925,"__hash__":926},"tags\u002Ftags\u002Fevent.yml",{},"event","tags\u002Fevent","xcUCN7zoFrW8LCakRgx4s2r8YTGvycTdYQEyx_Yg7Fk",{"id":928,"extension":704,"meta":929,"name":930,"slug":930,"stem":931,"__hash__":932},"tags\u002Ftags\u002Ffacebook.yml",{},"facebook","tags\u002Ffacebook","xk1FSKdOP155PdsTUy6lbefdoi6pOrwzZtVO8B52vMo",{"id":934,"extension":704,"meta":935,"name":936,"slug":936,"stem":937,"__hash__":938},"tags\u002Ftags\u002Ffanpage.yml",{},"fanpage","tags\u002Ffanpage","RoMU1ceix1opnNG2LPoGzfOjVZE128Gmk12ZtDAQxrM",{"id":940,"extension":704,"meta":941,"name":942,"slug":942,"stem":943,"__hash__":944},"tags\u002Ftags\u002Ffront-end.yml",{},"front-end","tags\u002Ffront-end","xKzeWb2B7yr2l4WBGtpyUzD1T_sBK5i-sb21-MEDOWw",{"id":946,"extension":704,"meta":947,"name":948,"slug":674,"stem":949,"__hash__":950},"tags\u002Ftags\u002Ffront-end-developer.yml",{},"front-end developer","tags\u002Ffront-end-developer","rHwMfWcbpd8wXqIVD1HzPWxBheHq8V_9TdHCHkz4Sp8",{"id":952,"extension":704,"meta":953,"name":954,"slug":954,"stem":955,"__hash__":956},"tags\u002Ftags\u002Ffrontend.yml",{},"frontend","tags\u002Ffrontend","CxnBlT8roa7DydGYGxgRVXKKTvJrkjMMQrvHZQMxukA",{"id":958,"extension":704,"meta":959,"name":960,"slug":960,"stem":961,"__hash__":962},"tags\u002Ftags\u002Fgamepad.yml",{},"gamepad","tags\u002Fgamepad","Gsi3HzAfw68AJR6qCt8qeuS7Euw22ZMSpnaKNw0QV-A",{"id":964,"extension":704,"meta":965,"name":966,"slug":966,"stem":967,"__hash__":968},"tags\u002Ftags\u002Fgoalkicker.yml",{},"goalkicker","tags\u002Fgoalkicker","L_zNfxJfO6lZOUiLaE5m_ggQUX0komBXXth0SrszFUk",{"id":970,"extension":704,"meta":971,"name":972,"slug":972,"stem":973,"__hash__":974},"tags\u002Ftags\u002Fhandbook.yml",{},"handbook","tags\u002Fhandbook","D0-VmrV-_WQQnlVvaePXWciWrJ8zuWNJoJULW_rOpmI",{"id":976,"extension":704,"meta":977,"name":978,"slug":979,"stem":980,"__hash__":981},"tags\u002Ftags\u002Fhtml-api.yml",{},"HTML API","html-api","tags\u002Fhtml-api","DBZv8DJ2hZR64GhJALF_-YzUG4mZWG9m2VZE76eM_wY",{"id":983,"extension":704,"meta":984,"name":985,"slug":985,"stem":986,"__hash__":987},"tags\u002Ftags\u002Fhtml5.yml",{},"html5","tags\u002Fhtml5","fcqPnoul30jPoEk6tO8K9WWwU8XyFz3N7-GAse2uwsQ",{"id":989,"extension":704,"meta":990,"name":991,"slug":991,"stem":992,"__hash__":993},"tags\u002Ftags\u002Fimmich.yml",{},"immich","tags\u002Fimmich","yRqxfTgoJptMOBpcKUS-JAmsUYKQZe4N5gyGFXSxoyU",{"id":995,"extension":704,"meta":996,"name":997,"slug":998,"stem":999,"__hash__":1000},"tags\u002Ftags\u002Finteligentny-dom.yml",{},"inteligentny dom","inteligentny-dom","tags\u002Finteligentny-dom","LwWCH_MYDfKSgfl9wyRWrWegvCgb2hAnXMlON3OQ0dk",{"id":1002,"extension":704,"meta":1003,"name":1004,"slug":1005,"stem":1006,"__hash__":1007},"tags\u002Ftags\u002Fjaws.yml",{},"Jaws","jaws","tags\u002Fjaws","aklZIj6z2_fzRQ_h9RtAfvXgDhHH9v02f224m6u8B7s",{"id":1009,"extension":704,"meta":1010,"name":1011,"slug":1011,"stem":1012,"__hash__":1013},"tags\u002Ftags\u002Fjunior.yml",{},"junior","tags\u002Fjunior","ega8Cjq-Z5swNxexQG-ROW8hvi0eaDCJj-l4ILDW-4U",{"id":1015,"extension":704,"meta":1016,"name":1017,"slug":672,"stem":1018,"__hash__":1019},"tags\u002Ftags\u002Fkariera-w-it.yml",{},"kariera w IT","tags\u002Fkariera-w-it","tyqsMUw9eQaVgTnsZy9DZAHFQXZNe0sDZavdgJ0KTcA",{"id":1021,"extension":704,"meta":1022,"name":1023,"slug":685,"stem":1024,"__hash__":1025},"tags\u002Ftags\u002Fkobiety-w-it.yml",{},"kobiety w IT","tags\u002Fkobiety-w-it","Gm0D6QX7IUT1CDThH6LuhQtWOOWFop09QiDZwX_Tm7c",{"id":1027,"extension":704,"meta":1028,"name":1029,"slug":1029,"stem":1030,"__hash__":1031},"tags\u002Ftags\u002Fkonferencja.yml",{},"konferencja","tags\u002Fkonferencja","-n95F1XvVC7rR9O9sOxyxnKIJBm4i5o3Md_Q-Z72occ",{"id":1033,"extension":704,"meta":1034,"name":720,"slug":720,"stem":1035,"__hash__":1036},"tags\u002Ftags\u002Fkonferencje.yml",{},"tags\u002Fkonferencje","Qf_9S1xyR0mqWi1CzdU_iGIwcU8Z0ET_3JBEIOWhaxA",{"id":1038,"extension":704,"meta":1039,"name":727,"slug":727,"stem":1040,"__hash__":1041},"tags\u002Ftags\u002Fkonfiguracja.yml",{},"tags\u002Fkonfiguracja","r2NNwL_ZY7xvPy0pUN2IPK8U6qBXSfay_MZbt1FpC2I",{"id":1043,"extension":704,"meta":1044,"name":1045,"slug":1045,"stem":1046,"__hash__":1047},"tags\u002Ftags\u002Fkoronawirus.yml",{},"koronawirus","tags\u002Fkoronawirus","8DgCLCZ1uSF_kl0dmgiEVVM-KkZFxGpXJus3fmMH4sE",{"id":1049,"extension":704,"meta":1050,"name":1051,"slug":1052,"stem":1053,"__hash__":1054},"tags\u002Ftags\u002Fksiazki-programistyczne.yml",{},"książki programistyczne","ksiazki-programistyczne","tags\u002Fksiazki-programistyczne","DF1l0MrjODlaeQ0evw8JedIJJb3v4MpesV0Fi6HpViQ",{"id":1056,"extension":704,"meta":1057,"name":1058,"slug":1059,"stem":1060,"__hash__":1061},"tags\u002Ftags\u002Flenovo-m710q.yml",{},"lenovo m710q","lenovo-m710q","tags\u002Flenovo-m710q","H2DSlpm_FUSkpZXj5AZxrXjTzdGXcfWhIFXE8MAjoJw",{"id":1063,"extension":704,"meta":1064,"name":1065,"slug":1065,"stem":1066,"__hash__":1067},"tags\u002Ftags\u002Fmid.yml",{},"mid","tags\u002Fmid","61US_hzDYC5fw5yPUWya7ZNjc9fOddRUJyOJU3oVKaM",{"id":1069,"extension":704,"meta":1070,"name":1071,"slug":1072,"stem":1073,"__hash__":1074},"tags\u002Ftags\u002Fmini-pc.yml",{},"mini pc","mini-pc","tags\u002Fmini-pc","zCEZkcdMTwLbaNGmGiT8qGCtnECxEafkiJ-glDrozw0",{"id":1076,"extension":704,"meta":1077,"name":1078,"slug":1079,"stem":1080,"__hash__":1081},"tags\u002Ftags\u002Fnas.yml",{},"NAS","nas","tags\u002Fnas","RsN64SVV6BmbaR7e4pVVvGgbxQ0q8ihj5J4b_1oPH2k",{"id":1083,"extension":704,"meta":1084,"name":734,"slug":734,"stem":1085,"__hash__":1086},"tags\u002Ftags\u002Fnauka.yml",{},"tags\u002Fnauka","bMIyGRMcT5SRj0bxdrER6sibTNLAHr1enmElQI67jTo",{"id":1088,"extension":704,"meta":1089,"name":1090,"slug":1091,"stem":1092,"__hash__":1093},"tags\u002Ftags\u002Fnauka-programowania.yml",{},"nauka programowania","nauka-programowania","tags\u002Fnauka-programowania","M04c5RtH0Fu4ikOuW9fLy2-g2YBIAX0Yj9SHKEwOuUg",{"id":1095,"extension":704,"meta":1096,"name":1097,"slug":1098,"stem":1099,"__hash__":1100},"tags\u002Ftags\u002Fnvda.yml",{},"NVDA","nvda","tags\u002Fnvda","AS3XsW73sA9-MAI4JVv4y7luo2oGkpXrGptc51MKLQY",{"id":1102,"extension":704,"meta":1103,"name":1104,"slug":1105,"stem":1106,"__hash__":1107},"tags\u002Ftags\u002Fochrona-rodzicielska.yml",{},"ochrona rodzicielska","ochrona-rodzicielska","tags\u002Fochrona-rodzicielska","DZHsS1aBzb6OmeQFhCXy3Qu3QUMHsrbbN62bXmyBB0Q",{"id":1109,"extension":704,"meta":1110,"name":1111,"slug":1111,"stem":1112,"__hash__":1113},"tags\u002Ftags\u002Foptimization.yml",{},"optimization","tags\u002Foptimization","fJedkuv-GIoYXYs-z7AFgjvCxunavWHOWZDesN1EgFU",{"id":1115,"extension":704,"meta":1116,"name":1117,"slug":1118,"stem":1119,"__hash__":1120},"tags\u002Ftags\u002Forganizacja-pracy.yml",{},"organizacja pracy","organizacja-pracy","tags\u002Forganizacja-pracy","IJWHAuqRIlzOIgQbp6B0dYJLpApXOyvDii-k8n_CUCQ",{"id":1122,"extension":704,"meta":1123,"name":740,"slug":634,"stem":1124,"__hash__":1125},"tags\u002Ftags\u002Fosx.yml",{},"tags\u002Fosx","QymfouNjzTcNrsPkrZeaPTZdKpMsdYilpn7HRI1FxQQ",{"id":1127,"extension":704,"meta":1128,"name":1129,"slug":1130,"stem":1131,"__hash__":1132},"tags\u002Ftags\u002Fpanel-macro.yml",{},"panel macro","panel-macro","tags\u002Fpanel-macro","WrhWywY5PTfhm7n_TuxTZEWwebeWKfYiQf6n6nh19t4",{"id":1134,"extension":704,"meta":1135,"name":1136,"slug":1137,"stem":1138,"__hash__":1139},"tags\u002Ftags\u002Fpassword-manager.yml",{},"password manager","password-manager","tags\u002Fpassword-manager","viAfKlsGbzjczJJrb8pwaB4tInjCfLzynbSm-GRQz4Y",{"id":1141,"extension":704,"meta":1142,"name":1143,"slug":1143,"stem":1144,"__hash__":1145},"tags\u002Ftags\u002Fpdf.yml",{},"pdf","tags\u002Fpdf","UTB02hK82S5LzDB9kqZWrDRFb8SYzHfFRgCsqFwdBcE",{"id":1147,"extension":704,"meta":1148,"name":1149,"slug":1150,"stem":1151,"__hash__":1152},"tags\u002Ftags\u002Fphp.yml",{},"PHP","php","tags\u002Fphp","Id59psmnOEw6xZ04LGSXqaCSXElgAZVfZdIWk4TTMmU",{"id":1154,"extension":704,"meta":1155,"name":1156,"slug":1156,"stem":1157,"__hash__":1158},"tags\u002Ftags\u002Fpi-hole.yml",{},"pi-hole","tags\u002Fpi-hole","1YJ1tr1Tr23ItFg6rYXw6iKjvPJCdYb2MB_5W1FdZNw",{"id":1160,"extension":704,"meta":1161,"name":1162,"slug":1162,"stem":1163,"__hash__":1164},"tags\u002Ftags\u002Fpixel-mania.yml",{},"pixel-mania","tags\u002Fpixel-mania","N9WX_K8mFmAndjRdRzZX1PonLHyneP4XCJe9kQlGOpY",{"id":1166,"extension":704,"meta":1167,"name":1168,"slug":1169,"stem":1170,"__hash__":1171},"tags\u002Ftags\u002Fplaywright.yml",{},"PlayWright","playwright","tags\u002Fplaywright","fZAbd5k3k85yeGire7iJzvnRk00Wfww8OTu1h6rEuZM",{"id":1173,"extension":704,"meta":1174,"name":686,"slug":686,"stem":1175,"__hash__":1176},"tags\u002Ftags\u002Fpraca.yml",{},"tags\u002Fpraca","ra3_bHnZqDrux1PiJ_pW6eqfX7l-uIFUPUhPqaq5cf4",{"id":1178,"extension":704,"meta":1179,"name":1180,"slug":1181,"stem":1182,"__hash__":1183},"tags\u002Ftags\u002Fpraca-zdalna.yml",{},"praca zdalna","praca-zdalna","tags\u002Fpraca-zdalna","HD5EOgzs-b3t5KIBRxlWQr0FuQVJ4N7eLQJV77YWcqc",{"id":1185,"extension":704,"meta":1186,"name":1187,"slug":1187,"stem":1188,"__hash__":1189},"tags\u002Ftags\u002Fprezentacja.yml",{},"prezentacja","tags\u002Fprezentacja","eiP5x-l400TtOy-gxO3TyOqYwcD4LP65jJ--7H-jyng",{"id":1191,"extension":704,"meta":1192,"name":1193,"slug":1193,"stem":1194,"__hash__":1195},"tags\u002Ftags\u002Fprivacy.yml",{},"privacy","tags\u002Fprivacy","Ln1AAZQ3fPOzuMJB0BWwUsjwaWTI7cFtzI6TaPrvKXc",{"id":1197,"extension":704,"meta":1198,"name":654,"slug":654,"stem":1199,"__hash__":1200},"tags\u002Ftags\u002Fprogramowanie.yml",{},"tags\u002Fprogramowanie","EUO8owu6V8cJivzRtVvD12KgW4ojOCp-N7aI4euHEa0",{"id":1202,"extension":704,"meta":1203,"name":1204,"slug":1204,"stem":1205,"__hash__":1206},"tags\u002Ftags\u002Fproxmox.yml",{},"proxmox","tags\u002Fproxmox","2AZfZmPZffxT3YuTVGHbsGvqKzpNRfot-OjFS6kkSYs",{"id":1208,"extension":704,"meta":1209,"name":1210,"slug":1211,"stem":1212,"__hash__":1213},"tags\u002Ftags\u002Fprywatny-dns.yml",{},"prywatny DNS","prywatny-dns","tags\u002Fprywatny-dns","kq-27-SNzP2YitFANg5iLgu0kdzyufoiOCLYApAehUc",{"id":1215,"extension":704,"meta":1216,"name":1217,"slug":1217,"stem":1218,"__hash__":1219},"tags\u002Ftags\u002Fprzekwalifikowanie.yml",{},"przekwalifikowanie","tags\u002Fprzekwalifikowanie","TqQNM6H8dfkRMTjNT8ZWyzynSMGeFjxseCt7-fZq0nA",{"id":1221,"extension":704,"meta":1222,"name":1223,"slug":1224,"stem":1225,"__hash__":1226},"tags\u002Ftags\u002Freact.yml",{},"React","react","tags\u002Freact","nXIcvF19iFz3UIXk2jbbJKRrr1_S9NLNYH3PUX_a2C4",{"id":1228,"extension":704,"meta":1229,"name":1230,"slug":1230,"stem":1231,"__hash__":1232},"tags\u002Ftags\u002Fredux.yml",{},"redux","tags\u002Fredux","CYtiFQKJae6MZE4Z_2qWwt7OGctPAutMzfD9f35a6-A",{"id":1234,"extension":704,"meta":1235,"name":1236,"slug":1236,"stem":1237,"__hash__":1238},"tags\u002Ftags\u002Fretro.yml",{},"retro","tags\u002Fretro","5AjMkMU44tDn8TV2FSTzbrvxoE7rplMmkLej7E-RIYM",{"id":1240,"extension":704,"meta":1241,"name":1242,"slug":1243,"stem":1244,"__hash__":1245},"tags\u002Ftags\u002Fretropi.yml",{},"RetroPi","retropi","tags\u002Fretropi","v_z0VjrAHiqYkzENB2DRMmo-V9VwE-8D2V_pRT-EBxw",{"id":1247,"extension":704,"meta":1248,"name":1249,"slug":687,"stem":1250,"__hash__":1251},"tags\u002Ftags\u002Frozwoj.yml",{},"rozwój","tags\u002Frozwoj","RkL4It2FQnfcyHt1gNPjQ7cLqxrpgMy9ewFnPkF5sms",{"id":1253,"extension":704,"meta":1254,"name":1255,"slug":1256,"stem":1257,"__hash__":1258},"tags\u002Ftags\u002Frzemieslnik.yml",{},"rzemieślnik","rzemieslnik","tags\u002Frzemieslnik","fLVgsq47mga12X6gNKQ6QM5tpWdwICnLJwfSDwk1xEE",{"id":1260,"extension":704,"meta":1261,"name":652,"slug":652,"stem":1262,"__hash__":1263},"tags\u002Ftags\u002Fsaas.yml",{},"tags\u002Fsaas","IJK35nx0P9hIm-I-szhYuII4LVixyUi2zgQINNh0irc",{"id":1265,"extension":704,"meta":1266,"name":1267,"slug":1268,"stem":1269,"__hash__":1270},"tags\u002Ftags\u002Fsamodzielnosc.yml",{},"samodzielność","samodzielnosc","tags\u002Fsamodzielnosc","mu6DqJVN-dhRiXCnV4A5ewTRx_ndkWH_pu7Fdf7n6XI",{"id":1272,"extension":704,"meta":1273,"name":1274,"slug":1274,"stem":1275,"__hash__":1276},"tags\u002Ftags\u002Fselfhosting.yml",{},"selfhosting","tags\u002Fselfhosting","ScAMu2i5h-QpOOGEuIvBN9fQn0ZmfyYfvD-561cUzKs",{"id":1278,"extension":704,"meta":1279,"name":1280,"slug":1280,"stem":1281,"__hash__":1282},"tags\u002Ftags\u002Fsenior.yml",{},"senior","tags\u002Fsenior","DFUFihqxLSI2g34_DFYLVSXQnP79966itG8NnBs44TE",{"id":1284,"extension":704,"meta":1285,"name":1286,"slug":1287,"stem":1288,"__hash__":1289},"tags\u002Ftags\u002Fsieci-komputerowe.yml",{},"sieci komputerowe","sieci-komputerowe","tags\u002Fsieci-komputerowe","lziU51DXijHvzSYVgbK5r_aRCBS9KLdgU5FWjE3pD4s",{"id":1291,"extension":704,"meta":1292,"name":1293,"slug":1294,"stem":1295,"__hash__":1296},"tags\u002Ftags\u002Fsmart-home.yml",{},"smart home","smart-home","tags\u002Fsmart-home","wjGS16vdTWjBvPIfyZ7Jjv2rSAUfgKxYQTfVmfE_oNc",{"id":1298,"extension":704,"meta":1299,"name":1300,"slug":1301,"stem":1302,"__hash__":1303},"tags\u002Ftags\u002Fsmr.yml",{},"SMR","smr","tags\u002Fsmr","hd_86HRNRQ5vp9GFDgvFR3iXcRs57XNvESz05e-vh-o",{"id":1305,"extension":704,"meta":1306,"name":1307,"slug":1307,"stem":1308,"__hash__":1309},"tags\u002Ftags\u002Fspotkanie.yml",{},"spotkanie","tags\u002Fspotkanie","G-4xZsmDWDaZnA1t7fWrsGY0CvA2PWBRch_ISxgV3eY",{"id":1311,"extension":704,"meta":1312,"name":1313,"slug":1313,"stem":1314,"__hash__":1315},"tags\u002Ftags\u002Fstash.yml",{},"stash","tags\u002Fstash","x-cfxrcr_me1q-Ea4BqtRl041a1CjwZbFM76VlobkVE",{"id":1317,"extension":704,"meta":1318,"name":1319,"slug":697,"stem":1320,"__hash__":1321},"tags\u002Ftags\u002Fstore-management.yml",{},"store management","tags\u002Fstore-management","BDlb8jliEvzP4ByR_nwh5YcPAphegyjsvxnwheppvwM",{"id":1323,"extension":704,"meta":1324,"name":1325,"slug":1326,"stem":1327,"__hash__":1328},"tags\u002Ftags\u002Fstream-deck.yml",{},"stream deck","stream-deck","tags\u002Fstream-deck","ETKaTcPMSGRXiF8fX9HaCChrkWvjK1Qhc8DCtKNRLFo",{"id":1330,"extension":704,"meta":1331,"name":1332,"slug":1333,"stem":1334,"__hash__":1335},"tags\u002Ftags\u002Fstudia-podyplomowe.yml",{},"studia podyplomowe","studia-podyplomowe","tags\u002Fstudia-podyplomowe","CllbIMrpHwk7nHpdgNS5EJlfoY37AYtu6D28xcL7B8Y",{"id":1337,"extension":704,"meta":1338,"name":1339,"slug":1339,"stem":1340,"__hash__":1341},"tags\u002Ftags\u002Fswitch.yml",{},"switch","tags\u002Fswitch","PqeuQm8ai89DcVFTdIBBYnrs6IVq0oystkF3JdV2cbQ",{"id":1343,"extension":704,"meta":1344,"name":1345,"slug":1346,"stem":1347,"__hash__":1348},"tags\u002Ftags\u002Fszafa-rack.yml",{},"szafa rack","szafa-rack","tags\u002Fszafa-rack","Tdq-0TqjtHfOvyhnHIwrDsPzQYMI6Rkb3iJBoqgudAc",{"id":1350,"extension":704,"meta":1351,"name":1352,"slug":1352,"stem":1353,"__hash__":1354},"tags\u002Ftags\u002Fszkolenia.yml",{},"szkolenia","tags\u002Fszkolenia","Ty9KLofCdboQngGvYkJOH1YZpBX-E3_Y1SLrdGucptY",{"id":1356,"extension":704,"meta":1357,"name":1358,"slug":1359,"stem":1360,"__hash__":1361},"tags\u002Ftags\u002Fszkolenie-front-end.yml",{},"szkolenie front-end","szkolenie-front-end","tags\u002Fszkolenie-front-end","yv2XwBbhwF8m1vceHXglBt_lax32HDj4iqYS8ymfIpM",{"id":1363,"extension":704,"meta":1364,"name":1365,"slug":1366,"stem":1367,"__hash__":1368},"tags\u002Ftags\u002Fszkolnictwo-zawodowe.yml",{},"szkolnictwo zawodowe","szkolnictwo-zawodowe","tags\u002Fszkolnictwo-zawodowe","wHy70cvPzW-iXNTesa8dnmsUN3GZ6RQ_08rvp2jcr-o",{"id":1370,"extension":704,"meta":1371,"name":1372,"slug":1372,"stem":1373,"__hash__":1374},"tags\u002Ftags\u002Ftech3camp.yml",{},"tech3camp","tags\u002Ftech3camp","2xN4prsqldeVcTsCibyLj-T84k_q27SekfsQ9H3ml6w",{"id":1376,"extension":704,"meta":1377,"name":1378,"slug":1378,"stem":1379,"__hash__":1380},"tags\u002Ftags\u002Ftestowanie.yml",{},"testowanie","tags\u002Ftestowanie","bQ7J7HLrZe6c9Me3bn_3VCbshav5tsqNTBIwd0xkRaQ",{"id":1382,"extension":704,"meta":1383,"name":1384,"slug":1384,"stem":1385,"__hash__":1386},"tags\u002Ftags\u002Ftesty.yml",{},"testy","tags\u002Ftesty","JDNtVkIDLY5e-th779qHOQFRrQ6Ywoq8us2HXlBz9PY",{"id":1388,"extension":704,"meta":1389,"name":1390,"slug":1391,"stem":1392,"__hash__":1393},"tags\u002Ftags\u002Ftruenas.yml",{},"TrueNas","truenas","tags\u002Ftruenas","jGviBDrcOLcc4LIDAMUINs_clt6cqQIbnmCsGjlBoEU",{"id":1395,"extension":704,"meta":1396,"name":1397,"slug":1397,"stem":1398,"__hash__":1399},"tags\u002Ftags\u002Ftuya.yml",{},"tuya","tags\u002Ftuya","MwpPoYlxeAiebaRVNdxytmFq9k0BpiTEbiEvwh4pfq4",{"id":1401,"extension":704,"meta":1402,"name":1403,"slug":1403,"stem":1404,"__hash__":1405},"tags\u002Ftags\u002Fublock.yml",{},"ublock","tags\u002Fublock","EPnKEvKkfWB2hbpkolTIytNQ9c12jSrnctf8CWEVbUM",{"id":1407,"extension":704,"meta":1408,"name":1409,"slug":1410,"stem":1411,"__hash__":1412},"tags\u002Ftags\u002Fvirtual-host.yml",{},"virtual host","virtual-host","tags\u002Fvirtual-host","Ru2r4wU7txKcWDbL3hq2QGx7v8gKwTJE25BItrzjqCQ",{"id":1414,"extension":704,"meta":1415,"name":1416,"slug":1417,"stem":1418,"__hash__":1419},"tags\u002Ftags\u002Fvoiceover.yml",{},"VoiceOver","voiceover","tags\u002Fvoiceover","7_jZqkfOk163vezQCATCpkIhdxmxfXe5dsLjgORGRWc",{"id":1421,"extension":704,"meta":1422,"name":1423,"slug":1424,"stem":1425,"__hash__":1426},"tags\u002Ftags\u002Fvue.yml",{},"Vue","vue","tags\u002Fvue","9ztytvQnoFLSGIXCwVz0HDl1yEBgdxBtwfIb4xxED8w",{"id":1428,"extension":704,"meta":1429,"name":1430,"slug":653,"stem":1431,"__hash__":1432},"tags\u002Ftags\u002Fvue-js.yml",{},"vue.js","tags\u002Fvue-js","ZEglZJ4b32MxGRUCWg3ij0_Sz-YkJDI60yOFUG3Dip8",{"id":1434,"extension":704,"meta":1435,"name":1436,"slug":1436,"stem":1437,"__hash__":1438},"tags\u002Ftags\u002Fvuejs.yml",{},"vuejs","tags\u002Fvuejs","Qz3030ujqXE_33tL5hbF8n1MGIh1jpRtdzXVrQT79jA",{"id":1440,"extension":704,"meta":1441,"name":1442,"slug":1442,"stem":1443,"__hash__":1444},"tags\u002Ftags\u002Fvuenews.yml",{},"vuenews","tags\u002Fvuenews","5I7T-cG9aZzeR62I-tWYDruQvjkSbRxtAeDI9otWrR8",{"id":1446,"extension":704,"meta":1447,"name":1448,"slug":1448,"stem":1449,"__hash__":1450},"tags\u002Ftags\u002Fvuetoolbox.yml",{},"vuetoolbox","tags\u002Fvuetoolbox","y5NXiZfQviI16DIkNjTxSwnLQIyrXs7OBZjVY1IyNmk",{"id":1452,"extension":704,"meta":1453,"name":698,"slug":698,"stem":1454,"__hash__":1455},"tags\u002Ftags\u002Fvuex.yml",{},"tags\u002Fvuex","ksF82HLoN49mJn2cJ0DhYz_Dt6mlrJDT82Ufu6QKmKQ",{"id":1457,"extension":704,"meta":1458,"name":1459,"slug":1460,"stem":1461,"__hash__":1462},"tags\u002Ftags\u002Fweb-development.yml",{},"web development","web-development","tags\u002Fweb-development","144N0DLmtEIX98zdSuOWIsCZYMHyxStp8_ZksWK2M7E",{"id":1464,"extension":704,"meta":1465,"name":1466,"slug":1467,"stem":1468,"__hash__":1469},"tags\u002Ftags\u002Fwladyslawowo.yml",{},"Władysławowo","wladyslawowo","tags\u002Fwladyslawowo","LgrtfAzosbyNoEeZ6_GWMrueP29fN7fPL3N5Kp5Wm4w",{"id":1471,"extension":704,"meta":1472,"name":1473,"slug":1474,"stem":1475,"__hash__":1476},"tags\u002Ftags\u002Fwork-life-balance.yml",{},"work-life balance","work-life-balance","tags\u002Fwork-life-balance","hXw9EMtMUVm71LSUBz1o6Ttz7xlyrsnMo-VOEfMJwr0",{"id":1478,"extension":704,"meta":1479,"name":1480,"slug":1481,"stem":1482,"__hash__":1483},"tags\u002Ftags\u002Fxbox.yml",{},"XBOX","xbox","tags\u002Fxbox","tDsqBFEx88ZSQxV8Q78dFlkSdjNdQOwFU4jn0D2wcYQ",{"id":1485,"avatar":1486,"bio":1487,"extension":704,"intro":1488,"links":1489,"meta":1494,"name":1495,"slug":6,"stem":1496,"__hash__":1497},"authors\u002Fauthors\u002Fmaciek-walczak.yml","\u002Fmaciek.png","Front-End Developer, Team Leader, trener i wykładowca na kursach programowania.","Cześć! Nazywam się Maciek i od 2005 roku pracuję jako programista – najpierw Full Stack, a obecnie jako Front-End Developer i Team Leader. Udzielam się też jako trener – prowadzę zajęcia w ramach kursów dla osób, które chcą rozpocząć swoją przygodę z programowaniem. Miałem też okazję występować jako prelegent na spotkaniach z serii tech3camp. Zapraszam do lektury mojego bloga, gdzie staram się publikować swoje przemyślenia w tematach mniej lub bardziej związanych z front-endem.",[1490],{"label":1491,"url":1492,"icon":1493},"YouTube","https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCMG_PvHPcSe0TCmnIXvzB1Q","i-lucide-youtube",{},"Maciej Walczak","authors\u002Fmaciek-walczak","6aJnd9c5TZ6nsZd_ycEjnlIJ4stHJREQCAgigfsc_Hk",1791055618243]