[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-en-nuxt":3,"technology-projects-en-nuxt":35,"mdc-gxup9a-key":110},{"id":4,"title":5,"category":6,"content":7,"description":8,"extension":9,"faq":10,"icon":17,"links":18,"meta":27,"projects":28,"since":31,"stem":32,"updated":33,"__hash__":34},"technologies_en\u002Fen\u002Ftechnologies\u002Fnuxt.yml","Nuxt","frontend","Nuxt is a framework for building Vue applications with routing and server rendering. I use it for VetCard's public clinic catalog and this portfolio, where visitors and search engines need access to page content at the initial request.\n\n## Examples from my projects\n\nVetCard combines clinic pages with interactive appointment booking. One application serves multiple clinics, with localized routes and clinic-specific branding. This portfolio uses Nuxt Content for translated YAML content and generates social sharing images at runtime.\n\n## What SEO work includes\n\nServer rendering provides HTML content without waiting for client-side JavaScript. I also configure page metadata, canonical URLs, language alternatives and sitemaps. These help discovery and interpretation; they do not guarantee indexing or search positions. Search engines can render JavaScript, but relying on that adds a rendering step.\n\n## Rendering and deployment\n\nNuxt supports different rendering strategies. I choose them around the page's content and interaction needs rather than disabling server rendering for every interactive feature. This portfolio uses server rendering with Vercel ISR caching on configured routes; its production prerendering is disabled.\n","Nuxt development for multilingual websites: server rendering, SEO metadata, clinic catalogs and content-driven pages with Vue.","yml",[11,14],{"label":12,"content":13},"Why use Nuxt for a public website?","Server rendering makes page content available in the initial HTML response. Nuxt also provides routing and metadata tools. JavaScript sites can be indexed, but server rendering reduces reliance on a crawler executing client-side code.",{"label":15,"content":16},"Which Nuxt version do you use?","This portfolio and VetCard use Nuxt 4. This portfolio also uses Nuxt Content, Nuxt Image, localization and runtime social image generation; the module selection differs by project.","i-simple-icons-nuxtdotjs",[19,24],{"label":20,"to":21,"color":22,"icon":23},"nuxt.com","https:\u002F\u002Fnuxt.com","neutral","i-heroicons-arrow-top-right-on-square",{"label":25,"to":26,"color":22,"icon":23},"Technical reference","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fcrawling-indexing\u002Fjavascript\u002Fjavascript-seo-basics",{},[29,30],"vetcard","vetspace","2022","en\u002Ftechnologies\u002Fnuxt","2026-09-20","ru2ITAZNXBnYZiQxbMbOTXLp7PUU6KqVAmd7Uk6o1Vg",[36,73],{"id":37,"title":38,"content":39,"date":33,"description":40,"extension":9,"featured":41,"image":42,"links":43,"meta":52,"stack":53,"stem":67,"tags":68,"url":46,"__hash__":72},"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",[44,48],{"label":45,"to":46,"color":47,"icon":23},"Live Demo","https:\u002F\u002Fvetcard.pro","primary",{"label":49,"to":50,"color":22,"icon":51},"Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-vetcard","i-simple-icons-github",{},[54,55,58,61,64],{"name":5,"icon":17},{"name":56,"icon":57},"Vue","i-simple-icons-vuedotjs",{"name":59,"icon":60},"TypeScript","i-simple-icons-typescript",{"name":62,"icon":63},"Tailwind CSS","i-simple-icons-tailwindcss",{"name":65,"icon":66},"Laravel API","i-simple-icons-laravel","en\u002Fprojects\u002Fvetcard",[5,56,69,70,71],"Multi-tenant","SEO","SSR","E8OJJw44yMkVkIiATLwF2krirApHUeRnAApzpvv7c10",{"id":74,"title":75,"content":76,"date":77,"description":78,"extension":9,"featured":41,"image":79,"links":80,"meta":91,"stack":92,"stem":106,"tags":107,"url":82,"__hash__":109},"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",[81,83,86,89],{"label":45,"to":82,"color":47,"icon":23},"https:\u002F\u002Fvetspace.pro",{"label":84,"to":85,"color":22,"icon":51},"API Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-api",{"label":87,"to":88,"color":22,"icon":51},"Frontend Overview","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fvetspace-frontend",{"label":90,"to":50,"color":22,"icon":51},"VetCard Overview",{},[93,95,96,97,100,103],{"name":94,"icon":66},"Laravel",{"name":56,"icon":57},{"name":5,"icon":17},{"name":98,"icon":99},"Stripe","i-simple-icons-stripe",{"name":101,"icon":102},"GraphQL","i-simple-icons-graphql",{"name":104,"icon":105},"AI","i-heroicons-sparkles","en\u002Fprojects\u002Fvetspace",[108,94,56,69,98,104],"SaaS","NDJ-cDU24m4uCf7HzSeTbCgbh0MGVh5P5HASDymy0wA",{"data":111,"body":112},{},{"type":113,"children":114},"root",[115,123,130,135,141,146,152],{"type":116,"tag":117,"props":118,"children":119},"element","p",{},[120],{"type":121,"value":122},"text","Nuxt is a framework for building Vue applications with routing and server rendering. I use it for VetCard's public clinic catalog and this portfolio, where visitors and search engines need access to page content at the initial request.",{"type":116,"tag":124,"props":125,"children":127},"h2",{"id":126},"examples-from-my-projects",[128],{"type":121,"value":129},"Examples from my projects",{"type":116,"tag":117,"props":131,"children":132},{},[133],{"type":121,"value":134},"VetCard combines clinic pages with interactive appointment booking. One application serves multiple clinics, with localized routes and clinic-specific branding. This portfolio uses Nuxt Content for translated YAML content and generates social sharing images at runtime.",{"type":116,"tag":124,"props":136,"children":138},{"id":137},"what-seo-work-includes",[139],{"type":121,"value":140},"What SEO work includes",{"type":116,"tag":117,"props":142,"children":143},{},[144],{"type":121,"value":145},"Server rendering provides HTML content without waiting for client-side JavaScript. I also configure page metadata, canonical URLs, language alternatives and sitemaps. These help discovery and interpretation; they do not guarantee indexing or search positions. Search engines can render JavaScript, but relying on that adds a rendering step.",{"type":116,"tag":124,"props":147,"children":149},{"id":148},"rendering-and-deployment",[150],{"type":121,"value":151},"Rendering and deployment",{"type":116,"tag":117,"props":153,"children":154},{},[155],{"type":121,"value":156},"Nuxt supports different rendering strategies. I choose them around the page's content and interaction needs rather than disabling server rendering for every interactive feature. This portfolio uses server rendering with Vercel ISR caching on configured routes; its production prerendering is disabled."]