[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies-en":3},[4,31,49,67,88,110,124,141,157,174,201,219,243,264,280,296,312,336,357,373,389,405,421],{"id":5,"title":6,"category":7,"content":8,"description":9,"extension":10,"faq":11,"icon":12,"links":13,"meta":22,"projects":23,"since":27,"stem":28,"updated":29,"__hash__":30},"technologies_en\u002Fen\u002Ftechnologies\u002Fcaddy.yml","Caddy","infrastructure","Caddy is a web server and reverse proxy that I use to route requests to my SaaS applications. It sits in front of services such as VetSpace and DigiPulse, connecting public domains to applications running in Docker.\n\n## How I use Caddy\n\n- **Request routing** — forward traffic to the application or container responsible for a domain.\n- **HTTPS** — automate certificate issuance and renewal for configured domains.\n- **Readable configuration** — keep proxy rules in a Caddyfile so I can review changes alongside application deployments.\n\n## HTTPS and tenant routing\n\nAutomatic HTTPS depends on correct DNS, certificate validation and persistent certificate storage. Certificate failures still need monitoring. The application must also identify the clinic and enforce access permissions; a reverse proxy does not provide tenant isolation on its own.\n\n## Where Caddy fits\n\nFor my Docker deployments, Caddy provides a manageable entry point without a large proxy configuration. I still plan timeouts, forwarded headers and access logging around the needs of each service. Those details matter when tracing a failed booking request across the proxy and Laravel API.\n","Caddy reverse proxy for SaaS applications: automatic HTTPS, domain routing and container access in my self-managed infrastructure.","yml",null,"i-simple-icons-caddy",[14,19],{"label":15,"to":16,"color":17,"icon":18},"caddyserver.com","https:\u002F\u002Fcaddyserver.com","neutral","i-heroicons-arrow-top-right-on-square",{"label":20,"to":21,"color":17,"icon":18},"Technical reference","https:\u002F\u002Fcaddyserver.com\u002Fdocs\u002Fautomatic-https",{},[24,25,26],"vetspace","digipulse","netpostpanel","2022","en\u002Ftechnologies\u002Fcaddy","2026-09-20","pUkuJTmyWQIPOUTTPXOGpDXt0QWkpbPBED9DI8SLlLo",{"id":32,"title":33,"category":7,"content":34,"description":35,"extension":10,"faq":11,"icon":36,"links":37,"meta":43,"projects":44,"since":46,"stem":47,"updated":29,"__hash__":48},"technologies_en\u002Fen\u002Ftechnologies\u002Fcloudflare.yml","Cloudflare","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.","i-simple-icons-cloudflare",[38,41],{"label":39,"to":40,"color":17,"icon":18},"cloudflare.com","https:\u002F\u002Fwww.cloudflare.com",{"label":20,"to":42,"color":17,"icon":18},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fturnstile\u002Fget-started\u002Fserver-side-validation\u002F",{},[45,24,25],"vetcard","2021","en\u002Ftechnologies\u002Fcloudflare","Mw5OTfYBlBUHFrN_9kwlzPiH4tVSNqfgrUe9h2yLtOA",{"id":50,"title":51,"category":7,"content":52,"description":53,"extension":10,"faq":11,"icon":54,"links":55,"meta":61,"projects":62,"since":64,"stem":65,"updated":29,"__hash__":66},"technologies_en\u002Fen\u002Ftechnologies\u002Fdigitalocean.yml","DigitalOcean","DigitalOcean is a cloud infrastructure provider. I used its Droplet virtual machines for early DigiSpace projects, managing the Linux environment and deploying the applications myself.\n\n## Working with Droplets\n\nRunning separate virtual machines gave each service its own configuration and release cycle. The work included web servers, database setup, firewall rules, operating system updates and backups. A Droplet is an unmanaged server: creating it is quick, but keeping its software running remains the operator's responsibility.\n\n## Moving to dedicated hosting\n\nAs my hosting setup grew, I moved workloads to a rented Hetzner dedicated server with Proxmox. Docker made the application environments easier to transfer. Persistent data, DNS changes and recovery planning still needed separate attention.\n\n## How I compare hosting options\n\nI consider resource use, maintenance time, backup storage and availability requirements together. Cloud virtual machines are useful when environments need to be created or resized independently. A dedicated server can suit steady workloads, but it also concentrates services on one physical machine. Neither option is automatically cheaper for every project.\n","DigitalOcean hosting experience: Linux Droplets, application deployments and the move to a dedicated server for ongoing SaaS workloads.","i-simple-icons-digitalocean",[56,59],{"label":57,"to":58,"color":17,"icon":18},"digitalocean.com","https:\u002F\u002Fwww.digitalocean.com",{"label":20,"to":60,"color":17,"icon":18},"https:\u002F\u002Fdocs.digitalocean.com\u002Fproducts\u002Fdroplets\u002Fdetails\u002Fpolicies\u002F",{},[63],"digispace","2020","en\u002Ftechnologies\u002Fdigitalocean","Zr41-b59GxzuyZY1nrISaZYPmAv0udTW4opUm2x3pBM",{"id":68,"title":69,"category":7,"content":70,"description":71,"extension":10,"faq":72,"icon":76,"links":77,"meta":83,"projects":84,"since":85,"stem":86,"updated":29,"__hash__":87},"technologies_en\u002Fen\u002Ftechnologies\u002Fdocker.yml","Docker","Docker packages applications and their dependencies into container images. I use it for Laravel and Node.js services in projects such as DigiPulse, VetSpace and NetPostPanel, from local development to deployment on virtual machines.\n\n## How I structure containers\n\n- **Docker Compose** — describe the application, background workers and supporting services together.\n- **Multi-stage builds** — separate build tools from the final runtime image.\n- **Persistent storage** — keep database files and uploads outside replaceable containers.\n\n## What portability means in practice\n\nContainers helped me move workloads between hosting providers without rebuilding the application environment from scratch. They reduce differences between machines, but configuration, CPU architecture, network access and data still affect behavior. A production problem does not automatically reproduce locally just because both environments use Docker.\n\n## Health checks and recovery\n\nA health check reports container health. Docker restart policies react to container exits; an unhealthy status alone does not trigger a restart. Deployment checks and recovery procedures need to account for that distinction, particularly for workers and databases that must preserve work across releases.\n","Docker for Laravel and Node.js applications: reproducible environments, Compose services and container deployments for my SaaS projects.",[73],{"label":74,"content":75},"When do you use Docker Compose instead of Kubernetes?","I use Compose for services managed on individual virtual machines. Kubernetes becomes an option when the project needs cluster scheduling and has the operational capacity to support it.","i-simple-icons-docker",[78,81],{"label":79,"to":80,"color":17,"icon":18},"docker.com","https:\u002F\u002Fwww.docker.com",{"label":20,"to":82,"color":17,"icon":18},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fcontainers\u002Fstart-containers-automatically\u002F",{},[25,24,26,63],"2019","en\u002Ftechnologies\u002Fdocker","F76lNXh4wJaFmVmhoLA0F0BjoARVI7o_hKm-K7KEhnI",{"id":89,"title":90,"category":91,"content":92,"description":93,"extension":10,"faq":94,"icon":98,"links":99,"meta":105,"projects":106,"since":107,"stem":108,"updated":29,"__hash__":109},"technologies_en\u002Fen\u002Ftechnologies\u002Ffilament.yml","Filament","backend","Filament is a Laravel toolkit for building administration panels and application interfaces. I use it to create forms, tables and dashboards while keeping business rules in the Laravel backend.\n\n## Examples from my projects\n\nIn DigiPulse, Filament supports the monitoring administration interface. In DigiSpace, it powers a content management panel alongside an older Inertia and Vue interface. This allows the administration tools to evolve without replacing the public website at the same time.\n\n## What I build with Filament\n\n- **Resources** — screens for creating, editing and searching records.\n- **Forms and tables** — validation, filters and actions tailored to the workflow.\n- **Custom pages** — Livewire components for tasks that do not fit a standard record editor.\n\n## Permissions and maintainability\n\nAn admin panel still needs authorization rules and tests for sensitive actions. Hiding a button is not enough to restrict access to data. I use Filament where its components match the workflow, then add custom behavior where it makes the interface easier to use. Delivery time depends on the permissions, integrations and business rules involved.\n","Filament development for Laravel: admin panels, forms, dashboards and content management in DigiPulse and DigiSpace.",[95],{"label":96,"content":97},"When does Filament fit an admin panel?","It works well for forms, tables and record management in Laravel. More specialized workflows can use custom pages and Livewire components within the panel.","i-simple-icons-filament",[100,103],{"label":101,"to":102,"color":17,"icon":18},"filamentphp.com","https:\u002F\u002Ffilamentphp.com",{"label":20,"to":104,"color":17,"icon":18},"https:\u002F\u002Ffilamentphp.com\u002Fdocs\u002F5.x\u002Fintroduction\u002Foverview",{},[25,63],"2023","en\u002Ftechnologies\u002Ffilament","-tojDnXfXKEznGsB1VED9YlDON8Wdpkd0KLDUneZksM",{"id":111,"title":112,"category":7,"content":113,"description":114,"extension":10,"faq":11,"icon":115,"links":116,"meta":120,"projects":121,"since":64,"stem":122,"updated":29,"__hash__":123},"technologies_en\u002Fen\u002Ftechnologies\u002Fgithub-actions.yml","GitHub Actions","GitHub Actions runs automated workflows from a GitHub repository. I use it to check code changes and support deployments, keeping the workflow configuration next to the application code.\n\n## What this portfolio checks\n\nThe repository's push workflow runs ESLint, TypeScript checks, unit tests, a production build and Playwright browser tests. Each step checks a different concern: code consistency, type errors, application behavior or the built website.\n\n## CI and deployment are separate\n\nThis portfolio deploys through Vercel's Git integration. A failed Actions workflow does not automatically block that deployment or a merge: required status checks and deployment conditions must be configured separately. Keeping this distinction clear avoids claiming a release gate that the workflow alone does not provide.\n\n## My approach to automation\n\nFor Laravel projects such as DigiSpace, automated tests help check changes before release. I put quick checks early in a workflow so failures are easier to diagnose. Deployment automation also needs controlled credentials, useful logs and a recovery plan; running a command on push is only part of the process.\n","GitHub Actions for CI\u002FCD: automated linting, type checks, tests and builds, with examples from this portfolio and my Laravel projects.","i-simple-icons-githubactions",[117],{"label":118,"to":119,"color":17,"icon":18},"github.com\u002Ffeatures\u002Factions","https:\u002F\u002Fgithub.com\u002Ffeatures\u002Factions",{},[63,24,25,26,45],"en\u002Ftechnologies\u002Fgithub-actions","xQNM_ukSGF_FZFgnYD3JqogN8RlRrF0mhvC2R7kHhDc",{"id":125,"title":126,"category":91,"content":127,"description":128,"extension":10,"faq":11,"icon":129,"links":130,"meta":136,"projects":137,"since":138,"stem":139,"updated":29,"__hash__":140},"technologies_en\u002Fen\u002Ftechnologies\u002Fgo.yml","Go","Go is a compiled programming language that I use for services running alongside Laravel applications. In my projects, it handles focused tasks that benefit from an independent process and deployment cycle.\n\n## Go in DigiPulse and VetSpace\n\nDigiPulse uses a separate Go service for website availability checks. Laravel handles the application and administration interface, while the monitoring service makes HTTP requests and reports results. VetSpace uses a dedicated Go service for AI-assisted visit analysis.\n\n## Designing a background service\n\nGoroutines make concurrent work convenient, but concurrency still needs limits. Timeouts, cancellation and bounded work queues help a monitoring service cope with slow or unavailable websites. The useful measure is whether it completes checks reliably within its resource budget, rather than a blanket performance comparison with PHP.\n\n## Deployment and language choice\n\nGo applications can be deployed as compiled binaries. Whether a binary is fully self-contained depends on its build settings and native dependencies. I keep ordinary application workflows in Laravel and use Go when separating a service makes its operation and maintenance clearer.\n","Go services for SaaS applications: uptime monitoring in DigiPulse and a separate service for AI-assisted visit analysis in VetSpace.","i-simple-icons-go",[131,134],{"label":132,"to":133,"color":17,"icon":18},"go.dev","https:\u002F\u002Fgo.dev",{"label":20,"to":135,"color":17,"icon":18},"https:\u002F\u002Fgo.dev\u002Fdoc\u002Ffaq",{},[25,24],"2024","en\u002Ftechnologies\u002Fgo","jZk4YOiJq83b4X13aWobPW13bW0sjwTA7-ehhykp7fU",{"id":142,"title":143,"category":7,"content":144,"description":145,"extension":10,"faq":11,"icon":146,"links":147,"meta":153,"projects":154,"since":107,"stem":155,"updated":29,"__hash__":156},"technologies_en\u002Fen\u002Ftechnologies\u002Fhetzner.yml","Hetzner","Hetzner provides the dedicated server I rent for SaaS workloads including DigiPulse, VetSpace and NetPostPanel. I manage the software stack, with Proxmox separating application environments into virtual machines.\n\n## What I manage\n\nMy responsibilities include the operating system, virtual machines, container deployments, network configuration and application recovery. Renting a dedicated server gives me control over how resources are allocated without making the hardware my property. Hardware faults and replacements are handled with the hosting provider.\n\n## Why this setup fits my projects\n\nSeveral continuously running services can share the available capacity. That gives me a predictable base hosting cost and room to choose my own deployment tools. The full cost also includes storage, backups, administration time and any additional infrastructure.\n\n## Availability is a separate decision\n\nMultiple virtual machines on one server still share a physical point of failure. Proxmox isolation does not make that host highly available. When a project's availability requirements increase, backup recovery time and redundancy need their own design rather than simply adding another VM on the same machine.\n","Hetzner dedicated hosting for my SaaS projects: a rented server, Proxmox virtual machines and responsibility for application operations.","i-simple-icons-hetzner",[148,151],{"label":149,"to":150,"color":17,"icon":18},"hetzner.com","https:\u002F\u002Fwww.hetzner.com",{"label":20,"to":152,"color":17,"icon":18},"https:\u002F\u002Fdocs.hetzner.com\u002Frobot\u002Fdedicated-server\u002Fdedicated-server-hardware\u002Fdedicated-server-hardware-overview\u002F",{},[25,24,26],"en\u002Ftechnologies\u002Fhetzner","vkeE6kfqqdt_vcBkglQdMgn-9v7Ol0N4tq78xjgDyIE",{"id":158,"title":159,"category":7,"content":160,"description":161,"extension":10,"faq":11,"icon":162,"links":163,"meta":169,"projects":170,"since":64,"stem":172,"updated":29,"__hash__":173},"technologies_en\u002Fen\u002Ftechnologies\u002Fhostinger.yml","Hostinger","Hostinger is a hosting provider I use for WordPress and smaller client websites, including DigiSpace Studio. For these projects, a hosting control panel can make everyday administration and handover easier.\n\n## What matters for a client website\n\nA company website needs straightforward content editing, reliable access to the hosting account and a clear maintenance arrangement. I consider supported PHP versions, database access, backup options and domain configuration when setting up the environment. Included services vary by plan.\n\n## Managed hosting and VPS hosting\n\nA managed website hosting plan and a self-managed VPS involve different responsibilities. A control panel does not, by itself, mean that the provider maintains the application, plugins or server software. I check the scope of the selected service before agreeing who handles updates and recovery.\n\n## Handover and ongoing support\n\nFor a WordPress project, hosting should fit the client's ability to manage the site after delivery. Account ownership, renewal payments and backup access need to be clear. More specialized SaaS services may instead need the control offered by a separately administered server.\n","Hostinger for WordPress and client websites: practical hosting setup, project handover and the difference between managed hosting and a VPS.","i-simple-icons-hostinger",[164,167],{"label":165,"to":166,"color":17,"icon":18},"hostinger.com","https:\u002F\u002Fwww.hostinger.com",{"label":20,"to":168,"color":17,"icon":18},"https:\u002F\u002Fwww.hostinger.com\u002Fsupport\u002F8311982-what-is-managed-hosting-in-hostinger\u002F",{},[171],"digispace-studio","en\u002Ftechnologies\u002Fhostinger","v2kNexc74q6ZzmXejV6J8DSGzeyiLniv-L3DUHa1Rzs",{"id":175,"title":176,"category":91,"content":177,"description":178,"extension":10,"faq":179,"icon":189,"links":190,"meta":196,"projects":197,"since":198,"stem":199,"updated":29,"__hash__":200},"technologies_en\u002Fen\u002Ftechnologies\u002Flaravel.yml","Laravel","Laravel is the PHP framework I use for SaaS products, APIs and administration tools. My projects include VetSpace, DigiPulse, NetPostPanel and the DigiSpace website, each with different business rules and integration needs.\n\n## How I use Laravel\n\n- **VetSpace** — a shared API for the clinic catalog and CRM, with tenant-aware access and Stripe subscriptions through Cashier.\n- **DigiPulse** — the monitoring application and Filament administration interface, alongside a separate Go monitoring service.\n- **NetPostPanel** — background content generation workflows managed through queues and Horizon.\n- **DigiSpace** — a multilingual website with a custom CMS and Filament panel.\n\n## The framework and its ecosystem\n\nLaravel provides routing, validation, database access and queue APIs. Filament, Cashier and Horizon are additional tools that I select and configure for the project. Billing, permissions and tenant isolation still require application-specific design and testing.\n\n## Building for ongoing maintenance\n\nI aim to keep business logic separate from HTTP handling and administration screens. This makes it easier to reuse a workflow through an API or background job. Performance work starts with measurement; tools such as Octane can help suitable workloads, but do not replace query optimization or careful state management.\n","Laravel development for SaaS, APIs and admin panels: practical work with VetSpace, DigiPulse, Filament, queues and Stripe subscriptions.",[180,183,186],{"label":181,"content":182},"Do you build new Laravel applications or maintain existing ones?","Both. My work includes new applications, audits, refactoring and extending existing products. The approach depends on the codebase and release requirements.",{"label":184,"content":185},"Which Laravel tools do you work with?","Filament for administration, Cashier for Stripe subscriptions and Horizon for Redis queues. I also work with Octane and FrankenPHP where the application benefits from long-running workers.",{"label":187,"content":188},"Can you handle Laravel deployment and hosting?","Yes. I work with Docker, Caddy, Proxmox and CI\u002FCD, including deployments on a rented Hetzner dedicated server. The setup depends on the project’s availability and maintenance needs.","i-simple-icons-laravel",[191,194],{"label":192,"to":193,"color":17,"icon":18},"laravel.com","https:\u002F\u002Flaravel.com",{"label":20,"to":195,"color":17,"icon":18},"https:\u002F\u002Flaravel.com\u002Fframework\u002Fdocs\u002F12.x\u002Fhorizon",{},[24,25,63,26,45],"2018","en\u002Ftechnologies\u002Flaravel","kT3blozZ7kLJi9lAh6XLFhwaQ5efiIC0VMDz5eHsLXM",{"id":202,"title":203,"category":204,"content":205,"description":206,"extension":10,"faq":11,"icon":207,"links":208,"meta":214,"projects":215,"since":216,"stem":217,"updated":29,"__hash__":218},"technologies_en\u002Fen\u002Ftechnologies\u002Fmysql.yml","MySQL","database","MySQL is a relational database that I use with Laravel applications and WordPress websites. In DigiSpace, it stores the content behind the company website and CMS; DigiSpace Studio also uses it as part of its WordPress stack.\n\n## What database work involves\n\n- **Schema design** — model pages, menus and related records with appropriate keys and constraints.\n- **Query analysis** — inspect slow queries and execution plans before changing indexes or adding resources.\n- **Migrations** — plan schema changes with existing data and deployment order in mind.\n\n## MySQL and WordPress\n\nMySQL is a common WordPress database choice, but it is not the only supported engine: WordPress also supports MariaDB. Hosting compatibility, existing data and operational experience all influence the choice. Changing database engines needs testing rather than an assumption of identical behavior.\n\n## MySQL or PostgreSQL?\n\nI work with both. An established MySQL application may have no reason to migrate, while another project may benefit from PostgreSQL's data types or indexing options. For either engine, sound queries, backups and tested recovery matter more than a general claim that one database is always faster.\n","MySQL for Laravel and WordPress: database design, query optimization and content storage in DigiSpace and DigiSpace Studio.","i-simple-icons-mysql",[209,212],{"label":210,"to":211,"color":17,"icon":18},"mysql.com","https:\u002F\u002Fwww.mysql.com",{"label":20,"to":213,"color":17,"icon":18},"https:\u002F\u002Fwordpress.org\u002Fabout\u002Frequirements\u002F",{},[63,171],"2017","en\u002Ftechnologies\u002Fmysql","ygAvsAwqaxylqZvTTJhhvH6PTMgNKgv5sVsAZIU1puQ",{"id":220,"title":221,"category":222,"content":223,"description":224,"extension":10,"faq":225,"icon":232,"links":233,"meta":239,"projects":240,"since":27,"stem":241,"updated":29,"__hash__":242},"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.",[226,229],{"label":227,"content":228},"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":230,"content":231},"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",[234,237],{"label":235,"to":236,"color":17,"icon":18},"nuxt.com","https:\u002F\u002Fnuxt.com",{"label":20,"to":238,"color":17,"icon":18},"https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fcrawling-indexing\u002Fjavascript\u002Fjavascript-seo-basics",{},[45,24],"en\u002Ftechnologies\u002Fnuxt","ru2ITAZNXBnYZiQxbMbOTXLp7PUU6KqVAmd7Uk6o1Vg",{"id":244,"title":245,"category":91,"content":246,"description":247,"extension":10,"faq":248,"icon":255,"links":256,"meta":260,"projects":261,"since":216,"stem":262,"updated":29,"__hash__":263},"technologies_en\u002Fen\u002Ftechnologies\u002Fphp.yml","PHP","PHP is my main server-side programming language. I have more than eight years of commercial development experience, working with Laravel and Symfony as well as WordPress when it fits the project. My current work uses PHP 8.x; that experience also includes earlier PHP versions.\n\n## Where I use PHP\n\nLaravel powers projects such as VetSpace, DigiPulse and NetPostPanel. My commercial Symfony work includes a ticketing platform for Formula 1, MotoGP, EICMA and EuroLeague events. The tasks span checkout, user accounts, administration tools and external integrations.\n\n## What I focus on\n\n- **Business logic** — understandable workflows for bookings, subscriptions and orders.\n- **APIs and payments** — validation, authorization and reliable handling of external responses.\n- **Maintenance** — automated tests and static analysis to support changes in existing codebases.\n\n## Runtime choices\n\nPHP-FPM remains useful for conventional request handling. Long-running workers, including applications served through Octane and FrankenPHP, introduce different state and memory considerations. I choose the runtime around the application and verify the result under representative load. A language or framework alone does not guarantee performance.\n","PHP development with Laravel and Symfony: SaaS applications, ticketing systems, payment integrations and maintainable backend APIs.",[249,252],{"label":250,"content":251},"Which PHP versions do you work with?","My current work uses PHP 8.x. When upgrading an older application, I check the framework and dependency requirements and test behavior affected by the version change.",{"label":253,"content":254},"How do you choose between Laravel and Symfony?","I consider the existing codebase, team experience, integrations and maintenance needs. Both can support long-lived applications; I use Laravel for my SaaS projects and Symfony in commercial ticketing work.","i-simple-icons-php",[257],{"label":258,"to":259,"color":17,"icon":18},"php.net","https:\u002F\u002Fwww.php.net",{},[24,25,63,26,45,171],"en\u002Ftechnologies\u002Fphp","USr_LGTQcMbvws-iw7vderKqOhli_mtO_Yg_zBdTZpw",{"id":265,"title":266,"category":204,"content":267,"description":268,"extension":10,"faq":11,"icon":269,"links":270,"meta":276,"projects":277,"since":85,"stem":278,"updated":29,"__hash__":279},"technologies_en\u002Fen\u002Ftechnologies\u002Fpostgresql.yml","PostgreSQL","PostgreSQL is a relational database with support for transactions, structured queries and JSON data. I use it in DigiPulse to store monitoring data that the application turns into status views and incident history.\n\n## Working with monitoring records\n\nAvailability checks create data over time. Queries need to find results for a particular monitor and date range without reading unnecessary rows. Index selection, retention and aggregation all affect how that workload grows. Execution plans help show where a query spends its effort.\n\n## Tenant isolation needs a precise design\n\nA database per tenant and a schema per tenant are different architectures. PostgreSQL supports both, but schemas share a database and require appropriate permissions and query scoping. Neither arrangement alone guarantees compliance or prevents every cross-tenant access mistake.\n\n## How I choose a database\n\nPostgreSQL's relational constraints and JSONB type are useful when structured records and flexible payloads belong in the same application. MySQL is also a practical choice for established Laravel and WordPress projects. I compare the actual queries, data model and maintenance requirements before choosing an engine.\n","PostgreSQL for SaaS data: monitoring records in DigiPulse, relational constraints, query planning and options for tenant isolation.","i-simple-icons-postgresql",[271,274],{"label":272,"to":273,"color":17,"icon":18},"postgresql.org","https:\u002F\u002Fwww.postgresql.org",{"label":20,"to":275,"color":17,"icon":18},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-schemas.html",{},[25],"en\u002Ftechnologies\u002Fpostgresql","L5AT9WcKAKk_1FnV6zm2iU3pRc4b4oClbi75BuljXyI",{"id":281,"title":282,"category":7,"content":283,"description":284,"extension":10,"faq":11,"icon":285,"links":286,"meta":292,"projects":293,"since":107,"stem":294,"updated":29,"__hash__":295},"technologies_en\u002Fen\u002Ftechnologies\u002Fproxmox.yml","Proxmox","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.","i-simple-icons-proxmox",[287,290],{"label":288,"to":289,"color":17,"icon":18},"proxmox.com","https:\u002F\u002Fwww.proxmox.com",{"label":20,"to":291,"color":17,"icon":18},"https:\u002F\u002Fpve.proxmox.com\u002Fpve-docs\u002Fpve-admin-guide.pdf",{},[25,24,26],"en\u002Ftechnologies\u002Fproxmox","I0J4j2-hIyDnVg-voUbCKEWQGaa72gJROrPqZ1ap9S0",{"id":297,"title":298,"category":204,"content":299,"description":300,"extension":10,"faq":11,"icon":301,"links":302,"meta":308,"projects":309,"since":85,"stem":310,"updated":29,"__hash__":311},"technologies_en\u002Fen\u002Ftechnologies\u002Fredis.yml","Redis","Redis is an in-memory data store that I use for application caching and background processing. In my Laravel stack, it supports the work that should happen outside a visitor's HTTP request.\n\n## Examples from my projects\n\nNetPostPanel uses Laravel Horizon for queued content generation workflows. DigiPulse uses Redis in its event-driven monitoring architecture. These jobs have different durability requirements from an ordinary page cache: losing pending work can affect the product, even if cached data can be rebuilt.\n\n## Caching and coordination\n\nRedis can hold computed values, request counters and short-lived locks. Cache keys and expiration rules need to match the data they represent. Locks can coordinate workers, but retries and failure handling must still prevent duplicate side effects.\n\n## Persistence matters for queues\n\nRedis offers RDB snapshots and AOF persistence, with different recovery trade-offs. Restarting a node does not necessarily erase its data, and treating every Redis key as disposable is unsafe for queues. Persistence, eviction settings and job retry behavior need to be chosen together. Redis Pub\u002FSub, in contrast, does not retain messages for disconnected subscribers.\n","Redis in Laravel applications: background queues, application caching and coordination in DigiPulse and NetPostPanel.","i-simple-icons-redis",[303,306],{"label":304,"to":305,"color":17,"icon":18},"redis.io","https:\u002F\u002Fredis.io",{"label":20,"to":307,"color":17,"icon":18},"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Foperate\u002Foss_and_stack\u002Fmanagement\u002Fpersistence\u002F",{},[25,26],"en\u002Ftechnologies\u002Fredis","0enle9dzYZbt2S4kQ2xE59_oWWMJ3b4XNxK7uXMHnRQ",{"id":313,"title":314,"category":315,"content":316,"description":317,"extension":10,"faq":318,"icon":325,"links":326,"meta":332,"projects":333,"since":46,"stem":334,"updated":29,"__hash__":335},"technologies_en\u002Fen\u002Ftechnologies\u002Fstripe.yml","Stripe","tools","Stripe provides payment and subscription services. I integrate it into VetSpace through Laravel Cashier and work with card payment flows in a commercial ticketing platform.\n\n## Subscription and checkout workflows\n\nThe work includes trial periods, plan changes, payment confirmation and failed-payment handling. Cashier provides Laravel integration, while Stripe settings and application rules determine the billing behavior. The customer interface also needs clear pending, successful and failed states.\n\n## Handling webhook events\n\nA checkout redirect is not proof of payment. Webhook handlers must verify signatures, tolerate duplicate or out-of-order events and use the Stripe API when reconciliation is needed. An idempotent handler avoids applying the same business action twice.\n\n## Keeping payment logic maintainable\n\nMy experience also includes Dalenys and Revolut integrations. I keep provider-specific behavior separate from order and subscription workflows where practical. Different payment providers have different capabilities, so adding one still requires testing its status transitions and failure cases. The goal is a traceable payment flow that can be investigated when a customer reports a problem.\n","Stripe integration for SaaS and ticketing: Laravel Cashier subscriptions, payment status handling and reliable webhook processing.",[319,322],{"label":320,"content":321},"Can you add Stripe subscriptions to an existing Laravel application?","Yes. The work includes Cashier integration, Stripe products and prices, webhook handling and tests for the subscription lifecycle. Trial periods and failed-payment behavior are configured to match the product.",{"label":323,"content":324},"Do you work with other payment providers?","I also have experience with Dalenys and Revolut. Each integration needs its own checks for payment states, authentication requirements and failure handling.","i-simple-icons-stripe",[327,330],{"label":328,"to":329,"color":17,"icon":18},"stripe.com","https:\u002F\u002Fstripe.com",{"label":20,"to":331,"color":17,"icon":18},"https:\u002F\u002Fdocs.stripe.com\u002Fwebhooks",{},[24],"en\u002Ftechnologies\u002Fstripe","RsSRocVuBw4_bEOvN4fphpbAYdtdZIBI6NYhrTbS2zo",{"id":337,"title":338,"category":91,"content":339,"description":340,"extension":10,"faq":341,"icon":348,"links":349,"meta":353,"projects":354,"since":85,"stem":355,"updated":29,"__hash__":356},"technologies_en\u002Fen\u002Ftechnologies\u002Fsymfony.yml","Symfony","Symfony is a PHP framework I use in my commercial work on a ticketing platform serving Formula 1, MotoGP, EICMA and EuroLeague events. My work covers both customer-facing purchase flows and internal administration tools.\n\n## What I work on\n\n- **Checkout** — cart behavior, seat selection, order confirmation and ticket delivery.\n- **Payments** — integrations with providers such as Stripe and Dalenys.\n- **Accounts and administration** — customer profiles, order history and tools for managing events and orders.\n- **External services** — seat-map solutions and third-party APIs in the purchase flow.\n\n## What ticketing demands\n\nWhen sales open, a platform must handle changes in demand while keeping orders and seat availability consistent. That makes transaction boundaries, payment states and error handling especially important. A fast page is useful only if the customer can complete the correct purchase.\n\n## Symfony and Laravel in my work\n\nI work with both frameworks. Existing architecture, team conventions and integrations influence the choice more than a fixed division between enterprise and smaller products. On an established Symfony application, I focus on changes that can be tested, reviewed and maintained through future releases.\n","Symfony development for ticketing platforms: checkout, payment integrations, user accounts and administration tools for event sales.",[342,345],{"label":343,"content":344},"What kind of Symfony projects have you worked on?","My commercial work includes a ticketing platform for Formula 1, MotoGP, EICMA and EuroLeague events, covering checkout, payment integrations and administration tools.",{"label":346,"content":347},"Can you work on an existing Symfony application?","Yes. I start by understanding the architecture and release process, then identify changes and tests needed to extend the application safely.","i-simple-icons-symfony",[350],{"label":351,"to":352,"color":17,"icon":18},"symfony.com","https:\u002F\u002Fsymfony.com",{},[],"en\u002Ftechnologies\u002Fsymfony","I8IiYbUfTERLBQRwjdgunfHlFSvBRL7HeQOsepcxglY",{"id":358,"title":359,"category":222,"content":360,"description":361,"extension":10,"faq":11,"icon":362,"links":363,"meta":369,"projects":370,"since":46,"stem":371,"updated":29,"__hash__":372},"technologies_en\u002Fen\u002Ftechnologies\u002Ftailwindcss.yml","Tailwind CSS","Tailwind CSS is a CSS framework built around utility classes. I use it for application interfaces and public websites, including VetCard, VetSpace, DigiSpace and this portfolio.\n\n## Styling in practice\n\nIn VetCard, shared components provide the page structure while clinic-specific colors give each page its identity. In this portfolio, Tailwind CSS v4 works with Nuxt UI, and theme values are defined in CSS. DigiSpace also uses Tailwind in its administration interface.\n\n## Keeping the interface consistent\n\n- **Responsive layouts** — adapt navigation, forms and cards to different screen widths.\n- **Design tokens** — share colors and spacing across components.\n- **Reusable components** — extract repeated patterns when they have a clear common purpose.\n\n## What utility classes do not guarantee\n\nKeeping classes near the markup makes styling easier to follow, but shared components and global theme changes can still affect many pages. Generated CSS size depends on detected classes and custom styles. I review mobile layouts, keyboard focus and color contrast alongside the visual design rather than assuming the framework handles them automatically.\n","Tailwind CSS for responsive Vue and Nuxt interfaces: reusable components, clinic branding and styling across my web projects.","i-simple-icons-tailwindcss",[364,367],{"label":365,"to":366,"color":17,"icon":18},"tailwindcss.com","https:\u002F\u002Ftailwindcss.com",{"label":20,"to":368,"color":17,"icon":18},"https:\u002F\u002Ftailwindcss.com\u002Fdocs\u002Fdetecting-classes-in-source-files",{},[63,45,24],"en\u002Ftechnologies\u002Ftailwindcss","MR8bqzsvGi3OtMVzwx__dw6ulSQjtYx1Bjlf9dAlK6M",{"id":374,"title":375,"category":7,"content":376,"description":377,"extension":10,"faq":11,"icon":378,"links":379,"meta":385,"projects":386,"since":138,"stem":387,"updated":29,"__hash__":388},"technologies_en\u002Fen\u002Ftechnologies\u002Fterraform.yml","Terraform","Terraform describes infrastructure resources in configuration files and uses providers to manage them. I use it in the DigiPulse infrastructure to make service configuration easier to review and reproduce.\n\n## Configuration and plans\n\nThe Docker provider connects Terraform to Docker resources. Shared configuration can describe similar environments with different input variables. Each environment needs its own plan based on its current state; a saved plan is not a reusable template for another environment.\n\n## Workspaces and sensitive data\n\nCLI workspaces separate state, but are not an access-control boundary. State and plan files can contain secrets even when values are marked sensitive. Separate credentials, protected state storage and appropriate access controls are needed where environments require stronger isolation.\n\n## Infrastructure and application releases\n\nI use infrastructure configuration to document resources and their relationships. Application releases can then follow their own CI\u002FCD process. Terraform helps detect differences between declared and actual resources when a plan runs; it does not continuously prevent manual changes. Reviewing the plan is essential before applying changes that may replace or remove a resource.\n","Terraform infrastructure as code: Docker resources, environment configuration and reviewed provisioning changes for my SaaS infrastructure.","i-simple-icons-terraform",[380,383],{"label":381,"to":382,"color":17,"icon":18},"terraform.io","https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform",{"label":20,"to":384,"color":17,"icon":18},"https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Flanguage\u002Fstate\u002Fworkspaces",{},[25],"en\u002Ftechnologies\u002Fterraform","YfeVeQyfeV2b3xWLlWRqQd0j-vEWz4a9t5rnM_SUfyM",{"id":390,"title":391,"category":222,"content":392,"description":393,"extension":10,"faq":11,"icon":394,"links":395,"meta":401,"projects":402,"since":64,"stem":403,"updated":29,"__hash__":404},"technologies_en\u002Fen\u002Ftechnologies\u002Ftypescript.yml","TypeScript","TypeScript adds static type checking to JavaScript. I use it in Vue and Nuxt applications, including VetCard and this portfolio, to make component interfaces and data models easier to understand and change.\n\n## What I type\n\n- **Components** — props, emitted events and shared state.\n- **API models** — the clinic and appointment data expected by the frontend.\n- **Reusable logic** — composable inputs and return values.\n\nThis repository also runs a type check in CI and defines schemas for its translated content. Those are complementary checks with different responsibilities.\n\n## Where static checking stops\n\nTypeScript types are removed from the generated JavaScript. An API response is not validated simply because it has a TypeScript annotation. Unexpected external data needs runtime validation; an unannounced backend change will not automatically appear as a compiler error.\n\n## Safer maintenance\n\nWhen a declared model changes, type checking can identify incompatible uses in the codebase. That makes refactoring more deliberate, especially across forms and templates. It complements tests and input validation rather than replacing them.\n","TypeScript for Vue and Nuxt: typed components, API models and safer refactoring, with runtime validation where external data enters the app.","i-simple-icons-typescript",[396,399],{"label":397,"to":398,"color":17,"icon":18},"typescriptlang.org","https:\u002F\u002Fwww.typescriptlang.org",{"label":20,"to":400,"color":17,"icon":18},"https:\u002F\u002Fwww.typescriptlang.org\u002Fdocs\u002Fhandbook\u002F2\u002Fbasic-types.html",{},[45,24],"en\u002Ftechnologies\u002Ftypescript","eM8MBdB16rknzkr1XB68jtG-uh4mdyPHZvOSGX_ciRQ",{"id":406,"title":407,"category":222,"content":408,"description":409,"extension":10,"faq":11,"icon":410,"links":411,"meta":417,"projects":418,"since":46,"stem":419,"updated":29,"__hash__":420},"technologies_en\u002Fen\u002Ftechnologies\u002Fvite.yml","Vite","Vite is a frontend development and build tool. I use it through Nuxt in VetCard and this portfolio, and with Laravel's frontend integration in DigiSpace.\n\n## During development\n\nThe development server updates supported modules through hot module replacement, so many edits can be reviewed without a full page reload. The actual feedback time depends on the project, plugins and machine; it is not an unconditional promise of instant updates.\n\n## For production\n\nThe build prepares frontend assets for deployment, including hashed filenames and code splitting where configured. Nuxt and Laravel supply their own integration around that output. The production bundler depends on the Vite version, so I check the installed toolchain when changing build configuration.\n\n## What I verify after a build\n\nA successful build does not prove that every route works. Asset URLs, environment variables, server rendering and browser behavior need checks in the target setup. I treat Vite as one part of the application's delivery process, with browser tests and runtime checks covering behavior beyond compilation.\n","Vite for Vue, Nuxt and Laravel frontends: development feedback, production assets and integration with application build workflows.","i-simple-icons-vite",[412,415],{"label":413,"to":414,"color":17,"icon":18},"vite.dev","https:\u002F\u002Fvite.dev",{"label":20,"to":416,"color":17,"icon":18},"https:\u002F\u002Fvite.dev\u002Fguide\u002F",{},[63],"en\u002Ftechnologies\u002Fvite","pNzaecLvTAFL6UjS3RELeoyF06WN2W2qg9Hq648bYKc",{"id":422,"title":423,"category":222,"content":424,"description":425,"extension":10,"faq":426,"icon":433,"links":434,"meta":438,"projects":439,"since":85,"stem":440,"updated":29,"__hash__":441},"technologies_en\u002Fen\u002Ftechnologies\u002Fvue.yml","Vue.js","Vue.js is a JavaScript framework for building user interfaces. I use it for the VetSpace clinic panel, VetCard's public website and the administration interfaces in projects such as DigiSpace.\n\n## Different interfaces, shared tools\n\n- **Application panels** — forms, lists and interactive workflows for signed-in users.\n- **Public websites** — Vue components within Nuxt pages rendered on the server.\n- **Laravel integration** — Inertia connects server-side routes with Vue pages without requiring a separate public API for those screens.\n\n## A clinic page as an example\n\nVetCard needs both readable clinic information and an interactive booking interface. Nuxt handles the page's server rendering, while Vue manages user interactions. This lets the same site serve visitors reading about a clinic and those choosing an appointment.\n\n## Keeping components maintainable\n\nThe Composition API helps group related behavior, and TypeScript makes component contracts explicit. I separate data loading, reusable logic and presentation where that improves readability. Framework choice still depends on the existing codebase and team: Vue is my main tool, not a guarantee that every frontend problem needs the same architecture.\n","Vue.js development for SaaS dashboards and public websites: reusable components, Laravel integration and server rendering through Nuxt.",[427,430],{"label":428,"content":429},"Do you use Vue with Nuxt or Laravel?","Both. I use Nuxt for public websites such as VetCard, and Vue with Laravel or Inertia for application interfaces. The choice depends on routing, data access and rendering needs.",{"label":431,"content":432},"How would you approach a Vue 2 to Vue 3 migration?","I would first review dependencies and incompatible APIs, then plan changes around components or routes where the architecture allows it. Tests and staged releases help manage the transition.","i-simple-icons-vuedotjs",[435],{"label":436,"to":437,"color":17,"icon":18},"vuejs.org","https:\u002F\u002Fvuejs.org",{},[24,45,25,63],"en\u002Ftechnologies\u002Fvue","uELJkGMM88g8lJPBk8YvzSCFaEB518320xAr9QS1_OM"]