[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-pl-github-actions":3,"technology-projects-pl-github-actions":29,"mdc-f0ckc4-key":206},{"id":4,"title":5,"category":6,"content":7,"description":8,"extension":9,"faq":10,"icon":11,"links":12,"meta":18,"projects":19,"since":25,"stem":26,"updated":27,"__hash__":28},"technologies_pl\u002Fpl\u002Ftechnologies\u002Fgithub-actions.yml","GitHub Actions","infrastructure","GitHub Actions uruchamia zautomatyzowane procesy na podstawie konfiguracji w repozytorium GitHub. Używam go do sprawdzania zmian i wspierania wdrożeń, przechowując opis procesu razem z kodem aplikacji.\n\n## Co sprawdza to portfolio\n\nPo wysłaniu zmian do repozytorium uruchamiają się ESLint, sprawdzanie typów TypeScript, testy jednostkowe, budowanie wersji produkcyjnej i testy przeglądarkowe Playwright. Każdy etap dotyczy innego obszaru: spójności kodu, błędów typów, zachowania aplikacji lub gotowej witryny.\n\n## CI i wdrożenie to osobne procesy\n\nTo portfolio jest wdrażane przez integrację Vercel z Git. Nieudany przebieg GitHub Actions sam w sobie nie blokuje wdrożenia ani scalenia zmian: wymagane kontrole i warunki publikacji trzeba skonfigurować osobno. Obecność testów w CI nie oznacza automatycznie, że od ich wyniku zależy wydanie.\n\n## Moje podejście do automatyzacji\n\nW projektach Laravel, takich jak DigiSpace, automatyczne testy pomagają weryfikować zmiany przed publikacją. Szybkie kontrole umieszczam na początku, aby wcześniej otrzymać czytelną informację o błędzie. Automatyzacja wdrożeń wymaga również kontroli dostępu, przydatnych logów i planu przywrócenia działania.\n","GitHub Actions w CI\u002FCD: automatyczna analiza kodu, sprawdzanie typów, testy i budowanie aplikacji na przykładzie moich projektów.","yml",null,"i-simple-icons-githubactions",[13],{"label":14,"to":15,"color":16,"icon":17},"github.com\u002Ffeatures\u002Factions","https:\u002F\u002Fgithub.com\u002Ffeatures\u002Factions","neutral","i-heroicons-arrow-top-right-on-square",{},[20,21,22,23,24],"digispace","vetspace","digipulse","netpostpanel","vetcard","2020","pl\u002Ftechnologies\u002Fgithub-actions","2026-09-20","CXDHAn6swWrwPY0j6hlfr2YSOGlV4IpOjjV6g8qqu1g",[30,78,118,152,182],{"id":31,"title":32,"content":33,"date":34,"description":35,"extension":9,"featured":36,"image":37,"links":38,"meta":47,"stack":48,"stem":73,"tags":74,"url":41,"__hash__":77},"projects_pl\u002Fpl\u002Fprojects\u002Fdigispace.yml","DigiSpace","Produkcyjna strona digispace.pro — publiczny serwis agencji, panel administracyjny i autorski CMS w jednej aplikacji Laravel, teraz w pełni wielojęzyczna (EN\u002FUK\u002FPL), z panelem Filament obok starego panelu na Inertia + Vue. Ten sam kod, który obsługuje żywą stronę, jest dostępny na GitHub.\n\n## Kluczowe funkcje\n\n- **Panel administracyjny Filament** - równoległy panel `\u002Fcontrol` (24 zasoby) z edytorem TipTap, przesyłaniem obrazów bezpośrednio do MinIO i nawigacją zorientowaną na treść, wdrażany zasób po zasobie obok istniejącego panelu Inertia\n- **Wielojęzyczność od podstaw** - tłumaczone są nie tylko strony, ale i strukturalne teksty UI (menu, stopka, przyciski) dla każdej lokalizacji, z routingiem opartym na hreflang\n- **SEO wbudowane** - dane strukturalne JSON-LD, zlokalizowane sitemapy i poprawna obsługa 404 dla każdej lokalizacji\n- **Monolit zrobiony dobrze** - publiczna strona i oba panele administracyjne w jednej aplikacji Laravel, bez osobnego API\n- **Treść pod kontrolą** - strony, usługi i portfolio edytuje się w CMS — bez deploymentu dla zmiany tekstu czy tłumaczenia\n- **Bramy jakości** - testy PHPUnit i analiza statyczna PHPStan w CI\n- **Otwarty kod** - dokładnie ten kod, który obsługuje digispace.pro, jest publiczny na GitHub\n\n## Stos technologiczny\n\n- **Backend**: Laravel\n- **Panel admina**: Filament 5 (`\u002Fcontrol`) + stary panel na Inertia.js + Vue\n- **Frontend**: Vue.js, Vite\n- **Lokalizacja**: tłumaczenia treści i struktury EN\u002FUK\u002FPL\n- **Architektura**: Niestandardowy CMS\n","2022-10-05","Wielojęzyczna (EN\u002FUK\u002FPL) produkcyjna strona agencji z autorskim CMS — panel Filament z rozbudowanym edytorem treści, tłumaczenia, JSON-LD i zlokalizowane sitemapy wbudowane obok starego panelu na Inertia + Vue",true,"\u002Fhero\u002Fdigispace.avif",[39,43],{"label":40,"to":41,"color":42,"icon":17},"Live Demo","https:\u002F\u002Fdigispace.pro","primary",{"label":44,"to":45,"color":16,"icon":46},"GitHub","https:\u002F\u002Fgithub.com\u002FYurij2015\u002FDigiSpace","i-simple-icons-github",{},[49,52,55,58,61,64,67,70],{"name":50,"icon":51},"Laravel","i-simple-icons-laravel",{"name":53,"icon":54},"Inertia","i-simple-icons-inertia",{"name":56,"icon":57},"Vue","i-simple-icons-vuedotjs",{"name":59,"icon":60},"Vite","i-simple-icons-vite",{"name":62,"icon":63},"MySQL","i-simple-icons-mysql",{"name":65,"icon":66},"Tailwind CSS","i-simple-icons-tailwindcss",{"name":68,"icon":69},"Filament","i-simple-icons-filament",{"name":71,"icon":72},"CMS","i-heroicons-document-text","pl\u002Fprojects\u002Fdigispace",[50,68,53,56,75,76],"i18n","SEO","Fk6DSrh4wV9UrvlIWm6anLNeGfF5gl4G-jy8qzYVLUM",{"id":79,"title":80,"content":81,"date":82,"description":83,"extension":9,"featured":36,"image":84,"links":85,"meta":97,"stack":98,"stem":113,"tags":114,"url":87,"__hash__":117},"projects_pl\u002Fpl\u002Fprojects\u002Fvetspace.yml","VetSpace","Dwustronna platforma weterynaryjna — katalog SEO klinik i CRM oparty na subskrypcji z wizytami i rekordami pacjentów. Publiczny katalog klinik zbudowany pod kątem pozyskiwania klientów przez SEO oraz CRM oparty na subskrypcji (wizyty, rekordy pacjentów) jako osobne aplikacje Vue\u002FNuxt na jednym API Laravel. Architektura database-per-tenant, subskrypcje Stripe przez Cashier, GraphQL + REST oraz analiza wizyt wspomagana AI przez dedykowany mikroserwis w Go.\n\n## Kluczowe funkcje\n\n- **Dwustronny lejek** - katalog SEO pozyskuje kliniki, a CRM w subskrypcji (wizyty, rekordy pacjentów) je utrzymuje\n- **Prawdziwa izolacja tenantów** - database-per-tenant trzyma dane każdej kliniki osobno, a eksport\u002Fusuwanie GDPR to operacja na bazie\n- **Dwa interfejsy API** - GraphQL dla złożonych zapytań katalogu, REST dla CRM — jedna baza kodu Laravel\n- **Billing od ręki** - subskrypcje Stripe przez Cashier: triale, zmiany planów, dunning\n- **AI tam, gdzie pomaga** - analizę wizyt wykonuje dedykowany mikroserwis w Go, nie obciążając głównego API\n\n## Stos technologiczny\n\n- **Backend**: Laravel (API)\n- **Frontend**: Vue\u002FNuxt (osobne aplikacje)\n- **Architektura**: Multi-tenancy database-per-tenant\n- **Płatności**: Stripe przez Cashier\n- **API**: GraphQL + REST\n- **AI**: Mikroserwis Go do analizy wizyt\n","2026-09-19","Dwustronna platforma weterynaryjna — katalog SEO klinik i CRM oparty na subskrypcji z wizytami i rekordami pacjentów","\u002Fhero\u002Fvetspace.avif",[86,88,91,94],{"label":40,"to":87,"color":42,"icon":17},"https:\u002F\u002Fvetspace.pro",{"label":89,"to":90,"color":16,"icon":46},"Przegląd API","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api",{"label":92,"to":93,"color":16,"icon":46},"Przegląd frontendu","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":95,"to":96,"color":16,"icon":46},"Przegląd VetCard","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-vetcard",{},[99,100,101,104,107,110],{"name":50,"icon":51},{"name":56,"icon":57},{"name":102,"icon":103},"Nuxt","i-simple-icons-nuxtdotjs",{"name":105,"icon":106},"Stripe","i-simple-icons-stripe",{"name":108,"icon":109},"GraphQL","i-simple-icons-graphql",{"name":111,"icon":112},"AI","i-heroicons-sparkles","pl\u002Fprojects\u002Fvetspace",[115,50,56,116,105,111],"SaaS","Multi-tenant","xvJ2gsG93A4aTrZYPgp4UuQdQsPe-Ae8ups9tasKAD8",{"id":119,"title":120,"content":121,"date":122,"description":123,"extension":9,"featured":36,"image":124,"links":125,"meta":130,"stack":131,"stem":147,"tags":148,"url":127,"__hash__":151},"projects_pl\u002Fpl\u002Fprojects\u002Fdigipulse.yml","DigiPulse","SaaS do monitorowania dostępności — sprawdzanie co 60 sekund, śledzenie wygaśnięcia SSL, powiadomienia przez Telegram i email. Panel administracyjny i podstawowy backend zbudowane na Laravel (Octane, websockety Reverb) i Filament, a silnik monitorujący to osobny serwis w Go. Integracja logowania Google OAuth i Cloudflare Turnstile. Zawiera serwer MCP, który udostępnia dane monitoringu bezpośrednio asystentom AI. Self-hosted na Proxmox.\n\n## Kluczowe funkcje\n\n- **Dedykowany silnik w Go** - sprawdzanie dostępności wykonuje osobny serwis w Go, więc ciągłe odpytywanie co 60 sekund nie spowalnia aplikacji Laravel\n- **Dashboard w czasie rzeczywistym** - websockety Reverb przesyłają zmiany statusu do UI na żywo, bez odświeżania\n- **Octane + Filament** - Laravel rezydentny w pamięci z pełnym panelem administracyjnym dla monitorów, kontaktów i reguł alertów\n- **Serwer MCP** - monitory i incydenty dostępne dla asystentów AI (Claude, Cursor) przez Model Context Protocol\n- **Google OAuth + Turnstile** - logowanie bez hasła i ochrona przed botami na formularzach publicznych\n- **Self-hosted** - wdrożone na własnym homelab Proxmox, którym zarządzam end-to-end\n\n## Stos technologiczny\n\n- **Backend**: Laravel (Octane, websockety Reverb)\n- **Panel administracyjny**: Filament\n- **Silnik monitorujący**: Go (osobny serwis)\n- **Baza danych**: PostgreSQL\n- **Integracja AI**: Serwer MCP\n- **Infrastruktura**: Self-hosted na Proxmox\n","2026-04-17","SaaS do monitorowania dostępności: architektura event-driven — Laravel (Octane, Reverb) i Filament wysyłają zadania przez Redis do lekkiego workera w Go; serwer MCP udostępnia dane monitoringu asystentom AI; powiadomienia Telegram\u002Fe-mail","\u002Fhero\u002Fdigipulse.avif",[126,128],{"label":40,"to":127,"color":42,"icon":17},"https:\u002F\u002Fdigipulse.cloud",{"label":44,"to":129,"color":16,"icon":46},"https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fdigipulse-backend",{},[132,133,134,137,140,143,144],{"name":50,"icon":51},{"name":68,"icon":69},{"name":135,"icon":136},"Go","i-simple-icons-go",{"name":138,"icon":139},"PostgreSQL","i-simple-icons-postgresql",{"name":141,"icon":142},"Redis","i-simple-icons-redis",{"name":56,"icon":57},{"name":145,"icon":146},"MCP","i-heroicons-cpu-chip","pl\u002Fprojects\u002Fdigipulse",[115,50,135,149,145,141,150],"Monitoring","Event-driven","GqA86kRO7Vh1dUrEBwiAh6SARuOescZleItqed4Wz8M",{"id":153,"title":154,"content":155,"date":156,"description":157,"extension":9,"featured":36,"image":158,"links":159,"meta":163,"stack":164,"stem":176,"tags":177,"url":180,"__hash__":181},"projects_pl\u002Fpl\u002Fprojects\u002Fnetpostpanel.yml","NetPostPanel","Wewnętrzna platforma AI do operacji na treści, która zamienia research tematu w gotową treść: pełny pipeline RAG (Google Custom Search + RSS → scraping → generacja multi-provider → wektoryzacja), plus wersjonowane zewnętrzne API zasilające procesy treściowe innych projektów, w tym pipeline bloga DigiSpace.\n\n## Kluczowe funkcje\n\n- **Zewnętrzne API** - wersjonowane `POST \u002Fapi\u002Fv1\u002Fgenerate` + `\u002Ftranslate` z kluczami i limitami per klient udostępnia cały pipeline innym aplikacjom, synchronicznie lub asynchronicznie z callbackami\n- **Auto Pilot** - codzienne zaplanowane uruchomienia generują treść z nowych inspiracji lub własnych tematów, w pełni automatycznie\n- **AI bez przywiązania do dostawcy** - Gemini i OpenAI za abstrakcją driverów, więc zmiana modelu to konfiguracja, nie refaktoryzacja\n- **Pipeline semantyczny** - wyszukiwanie wektorowe na Qdrant deduplikuje i grupuje newsy zanim trafią do generacji\n- **Autonomiczna agregacja** - auto-wykrywanie kanałów RSS oraz Google Custom Search plus scraping zamieniają temat w samozasilające się źródło treści\n- **Widoczne wywołania LLM** - każda generacja jest śledzona w Langfuse: tokeny, opóźnienie, koszt\n- **Dostęp oparty na rolach** - role admin\u002Fcontent manager\u002Feditor, każde zapytanie ograniczone do właściciela poza adminem\n\n## Stos technologiczny\n\n- **Backend**: Laravel, agenci `laravel\u002Fai`\n- **Frontend**: Inertia.js + Vue 3 (SPA Search & Creation, edytor TipTap)\n- **AI**: Multi-provider (Gemini\u002FOpenAI) za abstrakcją driverów\n- **Research**: Google Custom Search + agregacja RSS, scraping stron\n- **Baza wektorowa**: Qdrant do wyszukiwania semantycznego\n- **Obserwowalność**: Langfuse do śledzenia LLM\n- **Kolejka**: Laravel Horizon\n- **Testy**: PHPUnit\u002FPest + Cypress E2E\n","2024-11-10","Platforma AI do operacji na treści — pipeline RAG (research → scraping → generacja → wektoryzacja), zewnętrzne API dla innych aplikacji oraz Auto Pilot do generacji bez udziału człowieka","\u002Fhero\u002Fnetpostpanel.avif",[160],{"label":161,"to":162,"color":16,"icon":46},"Przegląd projektu","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fnet-post-panel-overview",{},[165,166,167,170,173],{"name":50,"icon":51},{"name":111,"icon":112},{"name":168,"icon":169},"Qdrant","i-simple-icons-qdrant",{"name":171,"icon":172},"Langfuse","i-heroicons-chart-bar",{"name":174,"icon":175},"Horizon","i-simple-icons-laravelhorizon","pl\u002Fprojects\u002Fnetpostpanel",[111,50,178,179,168,174],"RAG","External API","https:\u002F\u002Fnet-post-panel.digispace.pro","Gkp9EK0q-C32J7DZ0z0fi4In36IKL9zOIc9U4HbCAxA",{"id":183,"title":184,"content":185,"date":27,"description":186,"extension":9,"featured":36,"image":187,"links":188,"meta":192,"stack":193,"stem":202,"tags":203,"url":190,"__hash__":205},"projects_pl\u002Fpl\u002Fprojects\u002Fvetcard.yml","VetCard","Publiczna część VetSpace — multi-tenant katalog klinik weterynaryjnych. Jeden deployment Nuxt SSR obsługuje wszystkie kliniki: strony klinik zoptymalizowane pod SEO, rezerwację wizyt online z proxy do własnego backendu tenant każdej kliniki, tematyzację pod markę kliniki oraz obsługę wielu oddziałów.\n\n## Kluczowe funkcje\n\n- **Jeden deployment — wiele klinik** — aplikacja routuje po slugu kliniki; żądania rezerwacji i slotów są proxy'owane do backendu tenant danej kliniki\n- **Katalog SEO-first** — 590+ klinik ze stronami SSR, danymi strukturalnymi i zlokalizowanymi trasami\n- **Branding każdej kliniki** — strona kliniki jest tematyzowana jej kolorem, z badge'em \"Powered by VetSpace\"\n- **Realny UX rezerwacji** — wolne sloty pokazują liczbę dostępnych lekarzy z kodowaniem kolorami\n- **Pełna lokalizacja** — ukraiński, angielski i polski z routingiem opartym na prefiksach\n\n## Stack technologiczny\n\n- **Frontend**: Nuxt 4 \u002F Vue 3, Tailwind CSS v4\n- **Backend**: Laravel catalog API + endpointy tenant do rezerwacji\n- **Renderowanie**: SSR dla stron SEO, CSR dla flow rezerwacji\n- **Testowanie**: testy jednostkowe Vitest + Cypress E2E na realnym backendzie\n","Multi-tenant katalog klinik weterynaryjnych: SEO strony klinik, rezerwacja wizyt online, branding każdej kliniki — jedna aplikacja Nuxt obsługuje wszystkie","\u002Fhero\u002Fvetcard.avif",[189,191],{"label":40,"to":190,"color":42,"icon":17},"https:\u002F\u002Fvetcard.pro",{"label":161,"to":96,"color":16,"icon":46},{},[194,195,196,199,200],{"name":102,"icon":103},{"name":56,"icon":57},{"name":197,"icon":198},"TypeScript","i-simple-icons-typescript",{"name":65,"icon":66},{"name":201,"icon":51},"Laravel API","pl\u002Fprojects\u002Fvetcard",[102,56,116,76,204],"SSR","4Q1qMR6jtn2ViojU9Uk8TaztwOrlQBTjLNLBv9AASnE",{"data":207,"body":208},{},{"type":209,"children":210},"root",[211,219,226,231,237,242,248],{"type":212,"tag":213,"props":214,"children":215},"element","p",{},[216],{"type":217,"value":218},"text","GitHub Actions uruchamia zautomatyzowane procesy na podstawie konfiguracji w repozytorium GitHub. Używam go do sprawdzania zmian i wspierania wdrożeń, przechowując opis procesu razem z kodem aplikacji.",{"type":212,"tag":220,"props":221,"children":223},"h2",{"id":222},"co-sprawdza-to-portfolio",[224],{"type":217,"value":225},"Co sprawdza to portfolio",{"type":212,"tag":213,"props":227,"children":228},{},[229],{"type":217,"value":230},"Po wysłaniu zmian do repozytorium uruchamiają się ESLint, sprawdzanie typów TypeScript, testy jednostkowe, budowanie wersji produkcyjnej i testy przeglądarkowe Playwright. Każdy etap dotyczy innego obszaru: spójności kodu, błędów typów, zachowania aplikacji lub gotowej witryny.",{"type":212,"tag":220,"props":232,"children":234},{"id":233},"ci-i-wdrożenie-to-osobne-procesy",[235],{"type":217,"value":236},"CI i wdrożenie to osobne procesy",{"type":212,"tag":213,"props":238,"children":239},{},[240],{"type":217,"value":241},"To portfolio jest wdrażane przez integrację Vercel z Git. Nieudany przebieg GitHub Actions sam w sobie nie blokuje wdrożenia ani scalenia zmian: wymagane kontrole i warunki publikacji trzeba skonfigurować osobno. Obecność testów w CI nie oznacza automatycznie, że od ich wyniku zależy wydanie.",{"type":212,"tag":220,"props":243,"children":245},{"id":244},"moje-podejście-do-automatyzacji",[246],{"type":217,"value":247},"Moje podejście do automatyzacji",{"type":212,"tag":213,"props":249,"children":250},{},[251],{"type":217,"value":252},"W projektach Laravel, takich jak DigiSpace, automatyczne testy pomagają weryfikować zmiany przed publikacją. Szybkie kontrole umieszczam na początku, aby wcześniej otrzymać czytelną informację o błędzie. Automatyzacja wdrożeń wymaga również kontroli dostępu, przydatnych logów i planu przywrócenia działania."]