[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-en-proxmox":3,"technology-projects-en-proxmox":30,"mdc-9zx0hi-key":146},{"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\u002Fproxmox.yml","Proxmox","infrastructure","Proxmox VE is a virtualization platform that I use on my rented Hetzner server. It lets me manage separate environments for SaaS applications and supporting services, including the infrastructure behind DigiPulse.\n\n## How I organize environments\n\nVirtual machines provide separate operating systems and configurable resource allocations. Docker then runs application services inside those environments. This gives me a useful boundary for updates and troubleshooting without installing every service directly on the physical host.\n\n## Snapshots and backups serve different purposes\n\nA snapshot can help roll back a change, depending on the storage setup and application state. It does not replace an independent backup or protect against losing the host's storage. Database consistency and the recovery process still need attention when restoring an environment.\n\n## The limits of a single host\n\nVirtual machines share the server's physical capacity and availability. Limits help manage resource use, but disk or host failures can affect multiple applications. I treat workload separation, backup recovery and high availability as separate concerns when deciding how an environment should be hosted.\n","Proxmox VE for SaaS hosting: virtual machines on a dedicated server, workload separation, snapshots and backup planning.","yml",null,"i-simple-icons-proxmox",[13,18],{"label":14,"to":15,"color":16,"icon":17},"proxmox.com","https:\u002F\u002Fwww.proxmox.com","neutral","i-heroicons-arrow-top-right-on-square",{"label":19,"to":20,"color":16,"icon":17},"Technical reference","https:\u002F\u002Fpve.proxmox.com\u002Fpve-docs\u002Fpve-admin-guide.pdf",{},[23,24,25],"digipulse","vetspace","netpostpanel","2023","en\u002Ftechnologies\u002Fproxmox","2026-09-20","I0J4j2-hIyDnVg-voUbCKEWQGaa72gJROrPqZ1ap9S0",[31,77,116],{"id":32,"title":33,"content":34,"date":35,"description":36,"extension":9,"featured":37,"image":38,"links":39,"meta":48,"stack":49,"stem":71,"tags":72,"url":42,"__hash__":76},"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",true,"\u002Fhero\u002Fdigipulse.avif",[40,44],{"label":41,"to":42,"color":43,"icon":17},"Live Demo","https:\u002F\u002Fdigipulse.cloud","primary",{"label":45,"to":46,"color":16,"icon":47},"GitHub","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fdigipulse-backend","i-simple-icons-github",{},[50,53,56,59,62,65,68],{"name":51,"icon":52},"Laravel","i-simple-icons-laravel",{"name":54,"icon":55},"Filament","i-simple-icons-filament",{"name":57,"icon":58},"Go","i-simple-icons-go",{"name":60,"icon":61},"PostgreSQL","i-simple-icons-postgresql",{"name":63,"icon":64},"Redis","i-simple-icons-redis",{"name":66,"icon":67},"Vue","i-simple-icons-vuedotjs",{"name":69,"icon":70},"MCP","i-heroicons-cpu-chip","en\u002Fprojects\u002Fdigipulse",[73,51,57,74,69,63,75],"SaaS","Monitoring","Event-driven","b7hu-_otqukg-JY_hPBvmlUYk5jVOx42XpCotH6Cvqo",{"id":78,"title":79,"content":80,"date":81,"description":82,"extension":9,"featured":37,"image":83,"links":84,"meta":96,"stack":97,"stem":112,"tags":113,"url":86,"__hash__":115},"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",[85,87,90,93],{"label":41,"to":86,"color":43,"icon":17},"https:\u002F\u002Fvetspace.pro",{"label":88,"to":89,"color":16,"icon":47},"API Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api",{"label":91,"to":92,"color":16,"icon":47},"Frontend Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":94,"to":95,"color":16,"icon":47},"VetCard Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-vetcard",{},[98,99,100,103,106,109],{"name":51,"icon":52},{"name":66,"icon":67},{"name":101,"icon":102},"Nuxt","i-simple-icons-nuxtdotjs",{"name":104,"icon":105},"Stripe","i-simple-icons-stripe",{"name":107,"icon":108},"GraphQL","i-simple-icons-graphql",{"name":110,"icon":111},"AI","i-heroicons-sparkles","en\u002Fprojects\u002Fvetspace",[73,51,66,114,104,110],"Multi-tenant","NDJ-cDU24m4uCf7HzSeTbCgbh0MGVh5P5HASDymy0wA",{"id":117,"title":118,"content":119,"date":120,"description":121,"extension":9,"featured":37,"image":122,"links":123,"meta":127,"stack":128,"stem":140,"tags":141,"url":144,"__hash__":145},"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",[124],{"label":125,"to":126,"color":16,"icon":47},"Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fnet-post-panel-overview",{},[129,130,131,134,137],{"name":51,"icon":52},{"name":110,"icon":111},{"name":132,"icon":133},"Qdrant","i-simple-icons-qdrant",{"name":135,"icon":136},"Langfuse","i-heroicons-chart-bar",{"name":138,"icon":139},"Horizon","i-simple-icons-laravelhorizon","en\u002Fprojects\u002Fnetpostpanel",[110,51,142,143,132,138],"RAG","External API","https:\u002F\u002Fnet-post-panel.digispace.pro","9F27sKWiICL9ugPIbYmr3dQH8lYynDHYMUcKPSIVVGQ",{"data":147,"body":148},{},{"type":149,"children":150},"root",[151,159,166,171,177,182,188],{"type":152,"tag":153,"props":154,"children":155},"element","p",{},[156],{"type":157,"value":158},"text","Proxmox VE is a virtualization platform that I use on my rented Hetzner server. It lets me manage separate environments for SaaS applications and supporting services, including the infrastructure behind DigiPulse.",{"type":152,"tag":160,"props":161,"children":163},"h2",{"id":162},"how-i-organize-environments",[164],{"type":157,"value":165},"How I organize environments",{"type":152,"tag":153,"props":167,"children":168},{},[169],{"type":157,"value":170},"Virtual machines provide separate operating systems and configurable resource allocations. Docker then runs application services inside those environments. This gives me a useful boundary for updates and troubleshooting without installing every service directly on the physical host.",{"type":152,"tag":160,"props":172,"children":174},{"id":173},"snapshots-and-backups-serve-different-purposes",[175],{"type":157,"value":176},"Snapshots and backups serve different purposes",{"type":152,"tag":153,"props":178,"children":179},{},[180],{"type":157,"value":181},"A snapshot can help roll back a change, depending on the storage setup and application state. It does not replace an independent backup or protect against losing the host's storage. Database consistency and the recovery process still need attention when restoring an environment.",{"type":152,"tag":160,"props":183,"children":185},{"id":184},"the-limits-of-a-single-host",[186],{"type":157,"value":187},"The limits of a single host",{"type":152,"tag":153,"props":189,"children":190},{},[191],{"type":157,"value":192},"Virtual machines share the server's physical capacity and availability. Limits help manage resource use, but disk or host failures can affect multiple applications. I treat workload separation, backup recovery and high availability as separate concerns when deciding how an environment should be hosted."]