[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-en-github-actions":3,"technology-projects-en-github-actions":29,"mdc--342l8v-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_en\u002Fen\u002Ftechnologies\u002Fgithub-actions.yml","GitHub Actions","infrastructure","GitHub Actions runs automated workflows from a GitHub repository. I use it to check code changes and support deployments, keeping the workflow configuration next to the application code.\n\n## What this portfolio checks\n\nThe repository's push workflow runs ESLint, TypeScript checks, unit tests, a production build and Playwright browser tests. Each step checks a different concern: code consistency, type errors, application behavior or the built website.\n\n## CI and deployment are separate\n\nThis portfolio deploys through Vercel's Git integration. A failed Actions workflow does not automatically block that deployment or a merge: required status checks and deployment conditions must be configured separately. Keeping this distinction clear avoids claiming a release gate that the workflow alone does not provide.\n\n## My approach to automation\n\nFor Laravel projects such as DigiSpace, automated tests help check changes before release. I put quick checks early in a workflow so failures are easier to diagnose. Deployment automation also needs controlled credentials, useful logs and a recovery plan; running a command on push is only part of the process.\n","GitHub Actions for CI\u002FCD: automated linting, type checks, tests and builds, with examples from this portfolio and my Laravel projects.","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","en\u002Ftechnologies\u002Fgithub-actions","2026-09-20","xQNM_ukSGF_FZFgnYD3JqogN8RlRrF0mhvC2R7kHhDc",[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_en\u002Fen\u002Fprojects\u002Fdigispace.yml","DigiSpace","The production website behind digispace.pro — the agency's public site, admin panel and custom CMS in a single Laravel app, now fully multilingual (EN\u002FUK\u002FPL) with a Filament admin panel running alongside the legacy Inertia + Vue one. The same code that runs the live site is available on GitHub.\n\n## Key Features\n\n- **Filament admin panel** - a parallel `\u002Fcontrol` panel (24 resources) with a TipTap rich editor, straight-to-MinIO image uploads and content-first navigation, rolled out resource-by-resource next to the existing Inertia admin\n- **Multilingual by design** - both content and structural UI strings (menus, footer, buttons) are translated per locale, not just page text, with hreflang-aware localized routing\n- **SEO built in** - JSON-LD structured data, localized sitemaps and proper 404 handling across every locale\n- **Monolith done right** - public site and two admin surfaces live in one Laravel app, no separate API to maintain\n- **Self-managed content** - pages, services and portfolio entries are edited in the CMS — no deploy needed for a text or translation change\n- **Quality gates** - PHPUnit tests and PHPStan static analysis run in CI\n- **Source available** - the exact code serving digispace.pro is public on GitHub\n\n## Tech Stack\n\n- **Backend**: Laravel\n- **Admin**: Filament 5 (`\u002Fcontrol`) + legacy Inertia.js + Vue admin\n- **Frontend**: Vue.js, Vite\n- **Localization**: EN\u002FUK\u002FPL content and structure translations\n- **Architecture**: Custom CMS\n","2022-10-05","The agency's multilingual (EN\u002FUK\u002FPL) production site with a custom CMS — a Filament admin panel with a rich content editor, content translations, JSON-LD and localized sitemaps built in, alongside the legacy Inertia + Vue admin",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","en\u002Fprojects\u002Fdigispace",[50,68,53,56,75,76],"i18n","SEO","dtWB-9st6fApdLs4qomkqmMQVq9PBqeHoPzR0Ywgu0I",{"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_en\u002Fen\u002Fprojects\u002Fvetspace.yml","VetSpace","A two-sided veterinary platform — an SEO clinic catalog and a subscription-based CRM with appointments and patient records. A public clinic catalog built for SEO-first customer acquisition, and a subscription-based CRM (appointments, visits, patient records) as separate Vue\u002FNuxt apps on top of a single Laravel API. Database-per-tenant architecture, Stripe subscriptions via Cashier, GraphQL + REST, and AI-assisted visit analysis through a dedicated Go microservice.\n\n## Key Features\n\n- **Two-sided funnel** - an SEO-first public catalog acquires clinics; the subscription CRM (appointments, patient records) retains them\n- **True tenant isolation** - database-per-tenant keeps every clinic's data separate and makes GDPR export\u002Fdelete a per-database operation\n- **Dual API surface** - GraphQL for complex catalog queries, REST for the CRM — one Laravel codebase\n- **Billing built-in** - Stripe subscriptions via Cashier: trials, plan changes, dunning\n- **AI where it helps** - visit analysis runs in a dedicated Go microservice, keeping the main API unburdened\n\n## Tech Stack\n\n- **Backend**: Laravel (API)\n- **Frontend**: Vue\u002FNuxt (separate apps)\n- **Architecture**: Database-per-tenant multi-tenancy\n- **Payments**: Stripe via Cashier\n- **API**: GraphQL + REST\n- **AI**: Go microservice for visit analysis\n","2026-09-19","A two-sided veterinary platform — an SEO clinic catalog and a subscription-based CRM with appointments and patient records","\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},"API Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api",{"label":92,"to":93,"color":16,"icon":46},"Frontend Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":95,"to":96,"color":16,"icon":46},"VetCard Overview","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","en\u002Fprojects\u002Fvetspace",[115,50,56,116,105,111],"SaaS","Multi-tenant","NDJ-cDU24m4uCf7HzSeTbCgbh0MGVh5P5HASDymy0wA",{"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_en\u002Fen\u002Fprojects\u002Fdigipulse.yml","DigiPulse","Uptime monitoring SaaS — 60-second checks, SSL expiry tracking, Telegram and email notifications. The admin panel and core backend are built with Laravel (Octane, Reverb websockets) and Filament, while the monitoring engine is a separate Go service. Includes Google OAuth sign-in and Cloudflare Turnstile integration, plus an MCP server that exposes monitoring data directly to AI assistants. Self-hosted on Proxmox.\n\n## Key Features\n\n- **Dedicated Go engine** - availability checks run in a separate Go service, so constant 60-second polling never slows down the Laravel app\n- **Real-time dashboard** - Reverb websockets push status changes to the UI live, no manual refresh\n- **Octane + Filament** - resident-memory Laravel with a full admin panel for monitors, contacts and alert rules\n- **MCP server** - monitors and incidents are queryable from AI assistants (Claude, Cursor) via the Model Context Protocol\n- **Google OAuth + Turnstile** - passwordless sign-in and bot protection on public forms\n- **Self-hosted** - deployed on a Proxmox homelab I manage end-to-end\n\n## Tech Stack\n\n- **Backend**: Laravel (Octane, Reverb websockets)\n- **Admin Panel**: Filament\n- **Monitoring Engine**: Go (separate service)\n- **Database**: PostgreSQL\n- **AI Integration**: MCP server\n- **Infrastructure**: Self-hosted on Proxmox\n","2026-04-17","Uptime monitoring SaaS: event-driven architecture — Laravel (Octane, Reverb) + Filament dispatch checks through Redis to a lightweight Go worker; an MCP server exposes monitoring data to AI assistants; Telegram\u002Femail alerts","\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","en\u002Fprojects\u002Fdigipulse",[115,50,135,149,145,141,150],"Monitoring","Event-driven","b7hu-_otqukg-JY_hPBvmlUYk5jVOx42XpCotH6Cvqo",{"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_en\u002Fen\u002Fprojects\u002Fnetpostpanel.yml","NetPostPanel","An internal AI content-operations platform that turns topic research into publishable content: a full RAG pipeline (Google Custom Search + RSS → scraping → multi-provider generation → vectorization), plus a versioned external API that powers content workflows in other projects, including the DigiSpace blog pipeline.\n\n## Key Features\n\n- **External API** - a versioned `POST \u002Fapi\u002Fv1\u002Fgenerate` + `\u002Ftranslate` API with per-client keys and rate limits exposes the whole pipeline to other apps, sync or async with callbacks\n- **Auto Pilot** - scheduled daily runs generate content from new inspiration items or custom topics, fully unattended\n- **Provider-agnostic AI** - Gemini and OpenAI sit behind a driver abstraction, so swapping models is config, not refactoring\n- **Semantic pipeline** - Qdrant vector search deduplicates and clusters incoming stories before they reach generation\n- **Autonomous aggregation** - RSS auto-discovery and Google Custom Search plus scraping turn a bare topic into a self-feeding content source\n- **Observable LLM calls** - every generation is traced in Langfuse: tokens, latency, cost\n- **Role-based access** - admin\u002Fcontent manager\u002Feditor roles, with every query scoped to its owner unless admin\n\n## Tech Stack\n\n- **Backend**: Laravel, `laravel\u002Fai` agents\n- **Frontend**: Inertia.js + Vue 3 (Search & Creation SPA, TipTap editor)\n- **AI**: Multi-provider (Gemini\u002FOpenAI) behind a driver abstraction\n- **Research**: Google Custom Search + RSS aggregation, page scraping\n- **Vector DB**: Qdrant for semantic search\n- **Observability**: Langfuse for LLM tracing\n- **Queue**: Laravel Horizon\n- **Tests**: PHPUnit\u002FPest + Cypress E2E\n","2024-11-10","AI content-operations platform — a RAG pipeline (research → scrape → generate → vectorize), an external API other apps call, and Auto Pilot for unattended scheduled generation","\u002Fhero\u002Fnetpostpanel.avif",[160],{"label":161,"to":162,"color":16,"icon":46},"Overview","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","en\u002Fprojects\u002Fnetpostpanel",[111,50,178,179,168,174],"RAG","External API","https:\u002F\u002Fnet-post-panel.digispace.pro","9F27sKWiICL9ugPIbYmr3dQH8lYynDHYMUcKPSIVVGQ",{"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_en\u002Fen\u002Fprojects\u002Fvetcard.yml","VetCard","The public-facing side of VetSpace — a multi-tenant catalog of veterinary clinics. A single Nuxt SSR deployment serves every clinic: SEO-first clinic card pages, online appointment booking proxied to each clinic's own tenant backend, per-clinic theming, and multi-branch support.\n\n## Key Features\n\n- **One deployment, many clinics** — a single app routes by clinic slug; booking and slot requests are proxied to each clinic's own tenant backend\n- **SEO-first catalog** — 590+ clinics with SSR pages, structured data and localized routes built to be indexed\n- **Per-clinic branding** — every clinic page is themed by its own brand color, with a \"Powered by VetSpace\" badge\n- **Real booking UX** — available slots show free-doctor counts with scarcity color-coding\n- **Fully localized** — Ukrainian, English and Polish with prefix-based routing\n\n## Tech Stack\n\n- **Frontend**: Nuxt 4 \u002F Vue 3, Tailwind CSS v4\n- **Backend**: Laravel catalog API + per-tenant appointment endpoints\n- **Rendering**: SSR for SEO pages, CSR for booking flows\n- **Testing**: Vitest unit tests + Cypress E2E against a real backend\n","Multi-tenant catalog of veterinary clinics: SEO clinic pages, online appointment booking, per-clinic branding — one Nuxt app serves every clinic","\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","en\u002Fprojects\u002Fvetcard",[102,56,116,76,204],"SSR","E8OJJw44yMkVkIiATLwF2krirApHUeRnAApzpvv7c10",{"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 runs automated workflows from a GitHub repository. I use it to check code changes and support deployments, keeping the workflow configuration next to the application code.",{"type":212,"tag":220,"props":221,"children":223},"h2",{"id":222},"what-this-portfolio-checks",[224],{"type":217,"value":225},"What this portfolio checks",{"type":212,"tag":213,"props":227,"children":228},{},[229],{"type":217,"value":230},"The repository's push workflow runs ESLint, TypeScript checks, unit tests, a production build and Playwright browser tests. Each step checks a different concern: code consistency, type errors, application behavior or the built website.",{"type":212,"tag":220,"props":232,"children":234},{"id":233},"ci-and-deployment-are-separate",[235],{"type":217,"value":236},"CI and deployment are separate",{"type":212,"tag":213,"props":238,"children":239},{},[240],{"type":217,"value":241},"This portfolio deploys through Vercel's Git integration. A failed Actions workflow does not automatically block that deployment or a merge: required status checks and deployment conditions must be configured separately. Keeping this distinction clear avoids claiming a release gate that the workflow alone does not provide.",{"type":212,"tag":220,"props":243,"children":245},{"id":244},"my-approach-to-automation",[246],{"type":217,"value":247},"My approach to automation",{"type":212,"tag":213,"props":249,"children":250},{},[251],{"type":217,"value":252},"For Laravel projects such as DigiSpace, automated tests help check changes before release. I put quick checks early in a workflow so failures are easier to diagnose. Deployment automation also needs controlled credentials, useful logs and a recovery plan; running a command on push is only part of the process."]