[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-en-vetspace":3,"technology-slugs-en":54,"mdc-jnldz8-key":78},{"id":4,"title":5,"content":6,"date":7,"description":8,"extension":9,"featured":10,"image":11,"links":12,"meta":29,"stack":30,"stem":49,"tags":50,"url":15,"__hash__":53},"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","yml",true,"\u002Fhero\u002Fvetspace.avif",[13,18,23,26],{"label":14,"to":15,"color":16,"icon":17},"Live Demo","https:\u002F\u002Fvetspace.pro","primary","i-heroicons-arrow-top-right-on-square",{"label":19,"to":20,"color":21,"icon":22},"API Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api","neutral","i-simple-icons-github",{"label":24,"to":25,"color":21,"icon":22},"Frontend Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":27,"to":28,"color":21,"icon":22},"VetCard Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-vetcard",{},[31,34,37,40,43,46],{"name":32,"icon":33},"Laravel","i-simple-icons-laravel",{"name":35,"icon":36},"Vue","i-simple-icons-vuedotjs",{"name":38,"icon":39},"Nuxt","i-simple-icons-nuxtdotjs",{"name":41,"icon":42},"Stripe","i-simple-icons-stripe",{"name":44,"icon":45},"GraphQL","i-simple-icons-graphql",{"name":47,"icon":48},"AI","i-heroicons-sparkles","en\u002Fprojects\u002Fvetspace",[51,32,35,52,41,47],"SaaS","Multi-tenant","NDJ-cDU24m4uCf7HzSeTbCgbh0MGVh5P5HASDymy0wA",[55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77],"caddy","cloudflare","digitalocean","docker","filament","github-actions","go","hetzner","hostinger","laravel","mysql","nuxt","php","postgresql","proxmox","redis","stripe","symfony","tailwindcss","terraform","typescript","vite","vue",{"data":79,"body":80},{},{"type":81,"children":82},"root",[83,91,98,154,160],{"type":84,"tag":85,"props":86,"children":87},"element","p",{},[88],{"type":89,"value":90},"text","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.",{"type":84,"tag":92,"props":93,"children":95},"h2",{"id":94},"key-features",[96],{"type":89,"value":97},"Key Features",{"type":84,"tag":99,"props":100,"children":101},"ul",{},[102,114,124,134,144],{"type":84,"tag":103,"props":104,"children":105},"li",{},[106,112],{"type":84,"tag":107,"props":108,"children":109},"strong",{},[110],{"type":89,"value":111},"Two-sided funnel",{"type":89,"value":113}," - an SEO-first public catalog acquires clinics; the subscription CRM (appointments, patient records) retains them",{"type":84,"tag":103,"props":115,"children":116},{},[117,122],{"type":84,"tag":107,"props":118,"children":119},{},[120],{"type":89,"value":121},"True tenant isolation",{"type":89,"value":123}," - database-per-tenant keeps every clinic's data separate and makes GDPR export\u002Fdelete a per-database operation",{"type":84,"tag":103,"props":125,"children":126},{},[127,132],{"type":84,"tag":107,"props":128,"children":129},{},[130],{"type":89,"value":131},"Dual API surface",{"type":89,"value":133}," - GraphQL for complex catalog queries, REST for the CRM — one Laravel codebase",{"type":84,"tag":103,"props":135,"children":136},{},[137,142],{"type":84,"tag":107,"props":138,"children":139},{},[140],{"type":89,"value":141},"Billing built-in",{"type":89,"value":143}," - Stripe subscriptions via Cashier: trials, plan changes, dunning",{"type":84,"tag":103,"props":145,"children":146},{},[147,152],{"type":84,"tag":107,"props":148,"children":149},{},[150],{"type":89,"value":151},"AI where it helps",{"type":89,"value":153}," - visit analysis runs in a dedicated Go microservice, keeping the main API unburdened",{"type":84,"tag":92,"props":155,"children":157},{"id":156},"tech-stack",[158],{"type":89,"value":159},"Tech Stack",{"type":84,"tag":99,"props":161,"children":162},{},[163,173,183,193,203,213],{"type":84,"tag":103,"props":164,"children":165},{},[166,171],{"type":84,"tag":107,"props":167,"children":168},{},[169],{"type":89,"value":170},"Backend",{"type":89,"value":172},": Laravel (API)",{"type":84,"tag":103,"props":174,"children":175},{},[176,181],{"type":84,"tag":107,"props":177,"children":178},{},[179],{"type":89,"value":180},"Frontend",{"type":89,"value":182},": Vue\u002FNuxt (separate apps)",{"type":84,"tag":103,"props":184,"children":185},{},[186,191],{"type":84,"tag":107,"props":187,"children":188},{},[189],{"type":89,"value":190},"Architecture",{"type":89,"value":192},": Database-per-tenant multi-tenancy",{"type":84,"tag":103,"props":194,"children":195},{},[196,201],{"type":84,"tag":107,"props":197,"children":198},{},[199],{"type":89,"value":200},"Payments",{"type":89,"value":202},": Stripe via Cashier",{"type":84,"tag":103,"props":204,"children":205},{},[206,211],{"type":84,"tag":107,"props":207,"children":208},{},[209],{"type":89,"value":210},"API",{"type":89,"value":212},": GraphQL + REST",{"type":84,"tag":103,"props":214,"children":215},{},[216,220],{"type":84,"tag":107,"props":217,"children":218},{},[219],{"type":89,"value":47},{"type":89,"value":221},": Go microservice for visit analysis"]