[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-en-cloudflare":3,"technology-projects-en-cloudflare":30,"mdc--jtes17-key":144},{"id":4,"title":5,"category":6,"content":7,"description":8,"extension":9,"faq":10,"icon":11,"links":12,"meta":21,"projects":22,"since":26,"stem":27,"updated":28,"__hash__":29},"technologies_en\u002Fen\u002Ftechnologies\u002Fcloudflare.yml","Cloudflare","infrastructure","Cloudflare provides DNS, a content delivery network and security services for websites. I use it around my public SaaS products to manage domains, cache static files and help protect forms from automated submissions.\n\n## Where I use Cloudflare\n\nVetCard, VetSpace and DigiPulse combine public pages with application features. These need different caching rules: an image can be shared between visitors, while appointment details and account responses must remain private. DigiPulse also uses Turnstile on public forms.\n\n## Caching and form protection\n\n- **Static assets** — cache suitable images, styles and scripts closer to visitors.\n- **Dynamic responses** — exclude personalized data from shared caches.\n- **Turnstile** — validate the submitted token on the server; the browser widget alone is insufficient.\n\n## What still belongs to the application\n\nCloudflare complements input validation, authorization and request limits. It does not replace them. I treat cache rules and the connection to the origin server as part of the deployment configuration. Available security features and limits depend on the selected services and plan.\n","Cloudflare for SaaS websites: DNS, CDN caching and Turnstile bot protection, with practical examples from my web projects.","yml",null,"i-simple-icons-cloudflare",[13,18],{"label":14,"to":15,"color":16,"icon":17},"cloudflare.com","https:\u002F\u002Fwww.cloudflare.com","neutral","i-heroicons-arrow-top-right-on-square",{"label":19,"to":20,"color":16,"icon":17},"Technical reference","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fturnstile\u002Fget-started\u002Fserver-side-validation\u002F",{},[23,24,25],"vetcard","vetspace","digipulse","2021","en\u002Ftechnologies\u002Fcloudflare","2026-09-20","Mw5OTfYBlBUHFrN_9kwlzPiH4tVSNqfgrUe9h2yLtOA",[31,70,107],{"id":32,"title":33,"content":34,"date":28,"description":35,"extension":9,"featured":36,"image":37,"links":38,"meta":47,"stack":48,"stem":64,"tags":65,"url":41,"__hash__":69},"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",true,"\u002Fhero\u002Fvetcard.avif",[39,43],{"label":40,"to":41,"color":42,"icon":17},"Live Demo","https:\u002F\u002Fvetcard.pro","primary",{"label":44,"to":45,"color":16,"icon":46},"Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-vetcard","i-simple-icons-github",{},[49,52,55,58,61],{"name":50,"icon":51},"Nuxt","i-simple-icons-nuxtdotjs",{"name":53,"icon":54},"Vue","i-simple-icons-vuedotjs",{"name":56,"icon":57},"TypeScript","i-simple-icons-typescript",{"name":59,"icon":60},"Tailwind CSS","i-simple-icons-tailwindcss",{"name":62,"icon":63},"Laravel API","i-simple-icons-laravel","en\u002Fprojects\u002Fvetcard",[50,53,66,67,68],"Multi-tenant","SEO","SSR","E8OJJw44yMkVkIiATLwF2krirApHUeRnAApzpvv7c10",{"id":71,"title":72,"content":73,"date":74,"description":75,"extension":9,"featured":36,"image":76,"links":77,"meta":88,"stack":89,"stem":103,"tags":104,"url":79,"__hash__":106},"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",[78,80,83,86],{"label":40,"to":79,"color":42,"icon":17},"https:\u002F\u002Fvetspace.pro",{"label":81,"to":82,"color":16,"icon":46},"API Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api",{"label":84,"to":85,"color":16,"icon":46},"Frontend Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":87,"to":45,"color":16,"icon":46},"VetCard Overview",{},[90,92,93,94,97,100],{"name":91,"icon":63},"Laravel",{"name":53,"icon":54},{"name":50,"icon":51},{"name":95,"icon":96},"Stripe","i-simple-icons-stripe",{"name":98,"icon":99},"GraphQL","i-simple-icons-graphql",{"name":101,"icon":102},"AI","i-heroicons-sparkles","en\u002Fprojects\u002Fvetspace",[105,91,53,66,95,101],"SaaS","NDJ-cDU24m4uCf7HzSeTbCgbh0MGVh5P5HASDymy0wA",{"id":108,"title":109,"content":110,"date":111,"description":112,"extension":9,"featured":36,"image":113,"links":114,"meta":120,"stack":121,"stem":139,"tags":140,"url":116,"__hash__":143},"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",[115,117],{"label":40,"to":116,"color":42,"icon":17},"https:\u002F\u002Fdigipulse.cloud",{"label":118,"to":119,"color":16,"icon":46},"GitHub","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fdigipulse-backend",{},[122,123,126,129,132,135,136],{"name":91,"icon":63},{"name":124,"icon":125},"Filament","i-simple-icons-filament",{"name":127,"icon":128},"Go","i-simple-icons-go",{"name":130,"icon":131},"PostgreSQL","i-simple-icons-postgresql",{"name":133,"icon":134},"Redis","i-simple-icons-redis",{"name":53,"icon":54},{"name":137,"icon":138},"MCP","i-heroicons-cpu-chip","en\u002Fprojects\u002Fdigipulse",[105,91,127,141,137,133,142],"Monitoring","Event-driven","b7hu-_otqukg-JY_hPBvmlUYk5jVOx42XpCotH6Cvqo",{"data":145,"body":146},{},{"type":147,"children":148},"root",[149,157,164,169,175,211,217],{"type":150,"tag":151,"props":152,"children":153},"element","p",{},[154],{"type":155,"value":156},"text","Cloudflare provides DNS, a content delivery network and security services for websites. I use it around my public SaaS products to manage domains, cache static files and help protect forms from automated submissions.",{"type":150,"tag":158,"props":159,"children":161},"h2",{"id":160},"where-i-use-cloudflare",[162],{"type":155,"value":163},"Where I use Cloudflare",{"type":150,"tag":151,"props":165,"children":166},{},[167],{"type":155,"value":168},"VetCard, VetSpace and DigiPulse combine public pages with application features. These need different caching rules: an image can be shared between visitors, while appointment details and account responses must remain private. DigiPulse also uses Turnstile on public forms.",{"type":150,"tag":158,"props":170,"children":172},{"id":171},"caching-and-form-protection",[173],{"type":155,"value":174},"Caching and form protection",{"type":150,"tag":176,"props":177,"children":178},"ul",{},[179,191,201],{"type":150,"tag":180,"props":181,"children":182},"li",{},[183,189],{"type":150,"tag":184,"props":185,"children":186},"strong",{},[187],{"type":155,"value":188},"Static assets",{"type":155,"value":190}," — cache suitable images, styles and scripts closer to visitors.",{"type":150,"tag":180,"props":192,"children":193},{},[194,199],{"type":150,"tag":184,"props":195,"children":196},{},[197],{"type":155,"value":198},"Dynamic responses",{"type":155,"value":200}," — exclude personalized data from shared caches.",{"type":150,"tag":180,"props":202,"children":203},{},[204,209],{"type":150,"tag":184,"props":205,"children":206},{},[207],{"type":155,"value":208},"Turnstile",{"type":155,"value":210}," — validate the submitted token on the server; the browser widget alone is insufficient.",{"type":150,"tag":158,"props":212,"children":214},{"id":213},"what-still-belongs-to-the-application",[215],{"type":155,"value":216},"What still belongs to the application",{"type":150,"tag":151,"props":218,"children":219},{},[220],{"type":155,"value":221},"Cloudflare complements input validation, authorization and request limits. It does not replace them. I treat cache rules and the connection to the origin server as part of the deployment configuration. Available security features and limits depend on the selected services and plan."]