[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-en-vetcard":3,"technology-slugs-en":46,"mdc-ujbtqc-key":70},{"id":4,"title":5,"content":6,"date":7,"description":8,"extension":9,"featured":10,"image":11,"links":12,"meta":23,"stack":24,"stem":40,"tags":41,"url":15,"__hash__":45},"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","2026-09-20","Multi-tenant catalog of veterinary clinics: SEO clinic pages, online appointment booking, per-clinic branding — one Nuxt app serves every clinic","yml",true,"\u002Fhero\u002Fvetcard.avif",[13,18],{"label":14,"to":15,"color":16,"icon":17},"Live Demo","https:\u002F\u002Fvetcard.pro","primary","i-heroicons-arrow-top-right-on-square",{"label":19,"to":20,"color":21,"icon":22},"Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-vetcard","neutral","i-simple-icons-github",{},[25,28,31,34,37],{"name":26,"icon":27},"Nuxt","i-simple-icons-nuxtdotjs",{"name":29,"icon":30},"Vue","i-simple-icons-vuedotjs",{"name":32,"icon":33},"TypeScript","i-simple-icons-typescript",{"name":35,"icon":36},"Tailwind CSS","i-simple-icons-tailwindcss",{"name":38,"icon":39},"Laravel API","i-simple-icons-laravel","en\u002Fprojects\u002Fvetcard",[26,29,42,43,44],"Multi-tenant","SEO","SSR","E8OJJw44yMkVkIiATLwF2krirApHUeRnAApzpvv7c10",[47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69],"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":71,"body":72},{},{"type":73,"children":74},"root",[75,83,90,146,152],{"type":76,"tag":77,"props":78,"children":79},"element","p",{},[80],{"type":81,"value":82},"text","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.",{"type":76,"tag":84,"props":85,"children":87},"h2",{"id":86},"key-features",[88],{"type":81,"value":89},"Key Features",{"type":76,"tag":91,"props":92,"children":93},"ul",{},[94,106,116,126,136],{"type":76,"tag":95,"props":96,"children":97},"li",{},[98,104],{"type":76,"tag":99,"props":100,"children":101},"strong",{},[102],{"type":81,"value":103},"One deployment, many clinics",{"type":81,"value":105}," — a single app routes by clinic slug; booking and slot requests are proxied to each clinic's own tenant backend",{"type":76,"tag":95,"props":107,"children":108},{},[109,114],{"type":76,"tag":99,"props":110,"children":111},{},[112],{"type":81,"value":113},"SEO-first catalog",{"type":81,"value":115}," — 590+ clinics with SSR pages, structured data and localized routes built to be indexed",{"type":76,"tag":95,"props":117,"children":118},{},[119,124],{"type":76,"tag":99,"props":120,"children":121},{},[122],{"type":81,"value":123},"Per-clinic branding",{"type":81,"value":125}," — every clinic page is themed by its own brand color, with a \"Powered by VetSpace\" badge",{"type":76,"tag":95,"props":127,"children":128},{},[129,134],{"type":76,"tag":99,"props":130,"children":131},{},[132],{"type":81,"value":133},"Real booking UX",{"type":81,"value":135}," — available slots show free-doctor counts with scarcity color-coding",{"type":76,"tag":95,"props":137,"children":138},{},[139,144],{"type":76,"tag":99,"props":140,"children":141},{},[142],{"type":81,"value":143},"Fully localized",{"type":81,"value":145}," — Ukrainian, English and Polish with prefix-based routing",{"type":76,"tag":84,"props":147,"children":149},{"id":148},"tech-stack",[150],{"type":81,"value":151},"Tech Stack",{"type":76,"tag":91,"props":153,"children":154},{},[155,165,175,185],{"type":76,"tag":95,"props":156,"children":157},{},[158,163],{"type":76,"tag":99,"props":159,"children":160},{},[161],{"type":81,"value":162},"Frontend",{"type":81,"value":164},": Nuxt 4 \u002F Vue 3, Tailwind CSS v4",{"type":76,"tag":95,"props":166,"children":167},{},[168,173],{"type":76,"tag":99,"props":169,"children":170},{},[171],{"type":81,"value":172},"Backend",{"type":81,"value":174},": Laravel catalog API + per-tenant appointment endpoints",{"type":76,"tag":95,"props":176,"children":177},{},[178,183],{"type":76,"tag":99,"props":179,"children":180},{},[181],{"type":81,"value":182},"Rendering",{"type":81,"value":184},": SSR for SEO pages, CSR for booking flows",{"type":76,"tag":95,"props":186,"children":187},{},[188,193],{"type":76,"tag":99,"props":189,"children":190},{},[191],{"type":81,"value":192},"Testing",{"type":81,"value":194},": Vitest unit tests + Cypress E2E against a real backend"]