Service · Web development

Custom Vue website development.

Custom websites and web applications built on Vue 3 with the Composition API, Nuxt for SSR and SSG, and Pinia for state. Ideal for product teams who want to iterate quickly, for customer portals, dashboards and e-commerce, and for Dutch stacks that pair Vue with Laravel via Inertia.js.

Vue 3 & Composition APINuxt 3PiniaInertia.js

Vue as the pragmatic default for Dutch teams.

Vue is surprisingly dominant in the Netherlands. Many agency teams coming from a PHP and jQuery tradition pick up Vue faster than React: the template syntax looks like HTML with directives, single-file components keep markup, logic and styling visually together, and the learning curve is gentler for a back-end developer than with a JSX-based framework. Vue feels familiar to people who have worked with Blade, Twig or Smarty templates, which explains why you see it so often in education, government and SME portfolios.

A Vue stack is therefore not an exotic choice but a solid standard. The ecosystem is mature, the release cycle is predictable, and the tooling around Vite, Nuxt, Pinia and VueUse shares the same philosophy: small API surfaces, explicit defaults, and as little magic as possible. For product teams who want to sustain iteration speed without switching paradigms every two years, that is a pleasant foundation. We build Vue projects as part of our broader web development offering, alongside Astro, React and Laravel projects.

The question that always comes up in our first conversations is not whether Vue is technically suitable, which it almost always is, but whether it is the right choice for your team and your product. Sometimes Vue is indeed the pragmatic default. Sometimes React fits better, where Next.js or the broader React ecosystem is decisive. Sometimes Svelte is more interesting, and very occasionally Angular remains the right answer for an existing Angular base. We have that honest conversation before a single line of code is written.

Three typical Vue projects.

The Vue requests we receive usually fall into one of three patterns. Which one fits depends on whether you want an interactive web application, a marketing or content site that runs as a static export, or a hybrid product with server-side rendering and routing. We advise on the right shape during the scoping phase.

Compact project · fixed sprint budget

Vue web application or customer portal

A logged-in Vue app for a defined audience: a customer portal, a dashboard, a planning tool or an internal workspace. Vue 3 with the Composition API as the front end, a REST or GraphQL API behind it, Pinia for state, Vue Router 4 for navigation and a component library such as PrimeVue, Naive UI or Vuetify for the building blocks. Suited to B2B portals, vendor dashboards and internal tooling.

Vue 3 + VitePiniaVue RouterPrimeVue / Naive UI
Mid-sized project · fixed sprint budget

Nuxt website with SSR or SSG

A marketing site, product catalogue or content platform built on Nuxt 3. Server-side rendering for SEO and first-paint performance, static generation for pages that rarely change, and hybrid rendering for combinations: static for the homepage, server-rendered for search results, client-side for the logged-in dashboard. Edge deployment via Cloudflare Pages, Vercel or Netlify keeps TTFB low.

Nuxt 3Hybrid renderingNitro server routesEdge deploy
Larger project · fixed sprint budget

Laravel + Vue via Inertia.js

The combination that is in great demand in the Netherlands: a Laravel back end for data, authentication and business rules, with Vue as the front end, without you needing to write a separate API layer. Inertia.js sends props directly from the controller to Vue pages, preserving the SPA experience and keeping the mental model close to a classic server-rendered app. Ideal for SaaS products, e-commerce and business applications where Laravel is already the choice.

LaravelInertia.jsVue 3Eloquent + Pinia

The technology choices we make.

A Vue project is more than just the framework. Each of the choices below affects build speed, maintainability and how well your team can keep the codebase going in a few years' time. A brief tour of what we typically use and why.

Framework

Vue 3 with Composition API

Vue 3 is the current major version and the standard for new projects. We consistently work with the Composition API and <script setup>syntax: less boilerplate, better TypeScript inference and composables you can reuse across projects. We support the Options API in legacy projects where migration is not a priority, but we never start new codebases that way.

Meta-framework

Nuxt 3 for SSR and SSG

Nuxt 3 is to Vue what Next.js is to React: file-based routing, built-in server routes via Nitro, auto-imports, hybrid rendering and data-fetching utilities that standardise what would otherwise be custom-built. For sites that need SEO or a server-rendered first paint, Nuxt is the default. For purely authenticated SPAs we use Vue 3 with Vite without Nuxt, to keep the architecture simpler.

State management

Pinia as the successor to Vuex

Since 2022, Pinia has been the officially recommended state library of the Vue team and the de facto standard. Its API is type-safe, its devtools integration is excellent, and its stores are composables under the hood, which fits seamlessly with the Composition API. We no longer use Vuex for new projects; existing Vuex codebases we migrate incrementally to Pinia where that makes sense.

UI components

Vuetify, PrimeVue, Naive UI or Vueform

Vuetify is the familiar choice with Material Design, suitable when brand consistency is not a hard requirement. PrimeVue offers a broad range and is strong for enterprise dashboards. Naive UI is light and flexible for projects that want to feed their own design system. We reserve Vueform for form-heavy applications such as quote flows, long registration forms and configurators. For fully custom work we start with Headless UI Vue plus Tailwind.

Forms and validation

VeeValidate or Formkit

Forms are where many web applications get stuck: validation that falls out of sync with the back end, poor error states, inaccessible labels. We work with VeeValidate combined with Zod or Yup schemas that we share between client and server. In Vueform or Formkit projects we use their own schema layer, following the same rule: one source of truth, used for both client-side and server-side validation.

Testing

Vitest plus Playwright

Vitest is the Vite-native test runner, fast and sharing the same configuration as your build. For unit tests of composables and utilities, it is the right tool. For components we use Vue Test Utils on top of Vitest. End-to-end tests run on Playwright, sometimes supplemented with Cypress where a team already has experience with it. CI runs both suites on every pull request, so we catch regressions there rather than at the demo.

Utilities

VueUse as the Swiss Army knife

VueUse is a collection of hundreds of composables for browser APIs, sensors, clipboard, geolocation and network detection. Almost every project we do leans on it. The composables are tree-shakeable, so only what you use ends up in the bundle. For utilities VueUse does not provide, we write our own composables following the same conventions.

Styling and hosting

Tailwind plus Vercel, Netlify or Cloudflare Pages

Tailwind is our default for styling on most projects: it allows for fast iteration and sits well alongside the template. For Nuxt 3, Vercel and Netlify are the most obvious deployment targets, with first-class support and preview URLs for each pull request. We choose Cloudflare Pages when edge distribution or low TTFB in Europe matters. Self-hosting is also an option: Nuxt behind a Node server in Docker, alongside your existing infrastructure.

What you get at the end.

A production-ready Vue application, plus everything around it so you can manage it yourself, extend it, or hand it over to another development partner. No black box.

  • The Vue application in production + stagingTwo environments, running in your cloud (GCP, AWS, Azure, Cloudflare) or with us. CI/CD pipeline ready for further development, with preview builds for each pull request.
  • TypeScript codebase plus design systemFull source in TypeScript from start to finish, documented single-file components, a Histoire or Storybook catalogue, and design tokens that capture your brand in code.
  • Server or API layerNuxt server routes, a separate REST or GraphQL API, or a Laravel backend if we opt for Inertia.js. An OpenAPI or GraphQL schema, with a typed client so the front end and back end never drift out of sync.
  • Test suite and performance budgetVitest unit tests, Playwright end-to-end tests, accessibility checks against WCAG 2.2 AA, and clear Core Web Vitals targets that we verify with each release using Lighthouse and WebPageTest.
  • Documentation and runbookAn architecture overview, deployment instructions, an incident runbook, and a short developer onboarding guide that shows how someone can be productive in the codebase on day one.
  • Maintenance contract (optional)Monitoring, dependency updates, security patches, and further development. A fixed monthly fee, different response-time tiers, and the assurance that the codebase won't stagnate over time.

When Vue is the right choice.

Four patterns where a Vue stack genuinely adds value. If you recognise your situation in any of these, we're happy to continue the conversation, and if Vue isn't a good fit, we'll tell you that in the first conversation too.

Dutch team context

From PHP and jQuery to SPA

Your own team comes from a PHP or Laravel background and has worked with server-rendered templates for years. The move to an SPA feels like a big step. Vue's template syntax, single-file components and gentler learning curve make that transition smoother. For this reason, many Dutch agency teams choose Vue over React.

Product development

Keeping a fast iteration pace

You have a product that evolves continuously: new features every sprint, A/B tests, copy changes. The Composition API and Vite's hot module replacement keep the feedback loop short, and Vue's reactivity avoids much of the boilerplate you'd write in other frameworks. You'll notice the difference in how quickly you can iterate.

Customer portals and dashboards

Logged-in tooling with state

You're building an environment where users spend long sessions: a customer portal, a dashboard, a planning tool. Vue 3 with Pinia handles complex client-side state elegantly, and enterprise component libraries (PrimeVue, Vuetify) provide the tables, forms and widgets you typically need.

Laravel + Vue via Inertia

No separate API layer

Your backend is Laravel and you want a rich front end without writing a separate REST or GraphQL layer. Inertia.js gives you an SPA experience where the Laravel controller passes props directly to Vue pages. You keep the mental simplicity of a classic server-rendered app while getting the UX of an SPA. It's popular in the Netherlands, and rightly so.

And when Vue isn't the best choice.

Vue is not a universal solution. In these situations we more often recommend something else. We'd rather give you honest advice than automatically push our preferred framework.

Enterprise context

When the React ecosystem is decisive

For enterprise projects where deep integration with Next.js, the React ecosystem or a React monorepo strategy is central, React is often the more pragmatic choice. You'll find it easier to recruit talent, third-party libraries target React first and Vue later, and your team can move to React Native for mobile without starting over.

Legacy stack

Existing Angular codebase

Do you already have a production Angular app that your team works in productively? Migrating to Vue is rarely the right investment. Angular is a mature framework with an active roadmap, and the migration pain almost never outweighs the gains. We're happy to help you modernise within Angular itself — a newer Angular version, signals, standalone components — rather than switching frameworks.

Bleeding edge

React Server Components patterns

Do you want to work explicitly with React Server Components, Server Actions or a Next.js App Router pattern at the cutting edge? That ecosystem lives in React. Vue has its own strong server rendering via Nuxt and Nitro, but if you specifically need the RSC approach, choose React. We're honest about that.

Pure content site

A marketing site with little interaction

For a purely content-driven site — blog, brochure, knowledge base without a logged-in flow — Astro or a classic server-rendered stack is often a better fit than Nuxt. Vue-based tooling on top of a public Astro site is a workable combination we deliver regularly, and it's usually cheaper than building everything in Nuxt.

Not yet sure about a large project?

Test your idea first: a working prototype in 1 day

With OneDayBuild, we turn your idea into something tangible in one day for €1,150, so you can see whether further development is worth the investment. Decide to go ahead with the full build? Then we credit the full cost.

Explore OneDayBuild →

Vue versus React and Svelte.

The three frameworks you realistically consider for a new web project are Vue, React and Svelte. Each has genuine strengths and honest drawbacks. None of the three is universally better — the context determines which fits. Here they are at a glance.

Strong in · readability and adoption in the Netherlands

Vue 3

Strong in: readability of the template syntax, a gentler learning curve for back-end developers, a smaller bundle than React by default, seamless integration with Laravel via Inertia, and a strong presence in Dutch education and agency circles. Less strong in: its enterprise market share in the Netherlands is smaller than React's, and the English-language ecosystem is thinner.

Composition APINuxt 3Inertia.jsPinia
Strong in · ecosystem and talent pool

React

Strong in: the largest ecosystem of the three, the most third-party libraries, the biggest talent pool and therefore the lowest capacity risk, plus a direct route to React Native for mobile via shared components. Less strong in: JSX and a more complex mental model for people without front-end background, and a larger baseline bundle than Vue or Svelte.

Next.jsReact NativeLargest ecosystemTanStack Query
Strong in · compile-time efficiency

Svelte

Strong in: the compile-time approach means a smaller runtime, cleaner syntax than Vue and React, and SvelteKit as a complete meta-framework feels very productive. Less strong in: the ecosystem is clearly thinner, third-party component libraries are more limited, and the talent pool in the Netherlands is smaller. A sound choice for performance-critical projects or teams that deliberately want to keep things small.

SvelteKitCompile-timeSmall ecosystemPerformance focus

How a Vue project runs with us.

1

Introduction and scoping

A no-obligation conversation in which we understand which flows the Vue application must support, how it fits into your existing landscape, and whether an SPA, an SSR site or a hybrid approach is the best answer. We often compare Vue with React here too — and if React is the honest choice, we'll say so.

2

Technology choice and UX workshop

Together we decide on the framework (Vue 3 with or without Nuxt), the state approach (Pinia or not), the UI component library (PrimeVue, Naive UI, Vueform or headless), and the backend strategy. In parallel, we work out the first screen flow in Figma with you and a few end users, so the build starts from a design everyone supports. For stacks involving Laravel, we make the choice here between Inertia.js and a separate API layer.

3

Building in sprints

A working build you can test every two weeks. We build horizontally: first a working end-to-end flow with one role, then deeper functionality, then additional roles or modules. Performance budgets, accessibility checks and TypeScript strictness are part of the process from sprint one. Pull requests are reviewed, preview builds deploy automatically, and you can steer the project at any point.

4

Hardening, rollout and handover

In the final sprints, we run an accessibility audit (WCAG 2.2 AA), a Lighthouse report and a penetration test. After that, we roll out in phases to your users and hand over formally with documentation. We can manage the system on your behalf, or hand over cleanly to your own team with a runbook, a handover session and optional support for the first few months.

Fabian van Dijk Business Developer · Appfront

The first point of contact for Vue projects at Appfront. Reach him at fabian.vandijk@appfront.nl for a no-obligation introduction on when Vue suits your stack, and when React, Svelte or a Laravel and Inertia combination is the honest answer.

Frequently asked questions about Vue.

The questions clients ask before we start a Vue project.

Vue or React: which should we choose?
Choose Vue when your team comes from a PHP or Laravel background, you want to use Inertia.js, or you find the template syntax more readable than JSX. Choose React when you want Next.js, need a large React ecosystem, or may later move to React Native for mobile with shared components. Both work well for 90 per cent of projects; the context determines which fits best.
Is Vue future-proof? Is it still maintained?
Yes. Vue 3 is the current major version, with predictable release cycles and LTS versions. Pinia has officially succeeded Vuex, Vue Router is at version 4, and Nuxt 3 is a thorough rewrite. The Vue team works structurally with the maintainers of Vite, Vitest and Nuxt, so the whole ecosystem evolves in the same spirit. In the Netherlands, Vue is dominant among agencies, educational institutions and small and medium-sized businesses, which keeps the talent pool stable.
What exactly is Inertia.js, and when do you choose it?
Inertia.js connects Laravel (or another server-rendered backend) to Vue without you having to write a separate REST or GraphQL API. The Laravel controller passes props directly to Vue pages, Inertia handles navigation client-side like an SPA, and you keep the mental model of a traditional server-rendered application. We choose Inertia.js when one team maintains both front end and back end, and a separate API layer for a single consumer would be over-engineered.
What about SEO for a Vue site?
SEO with Vue is not a problem, provided you choose the right approach. For public pages that need to rank highly, we use Nuxt 3 with server-side rendering or static generation, which delivers full HTML that Google can index directly. We vary the approach per page type: prerendering for pages that rarely change, SSR for pages that change regularly, and client-side rendering for the logged-in dashboard. We advise against a pure client-side SPA for the public site, as first paint and consistency remain better with SSR.
Can you also migrate an existing Vue 2 application?
Yes. Vue 2 has been end-of-life since late 2023 and no longer receives security updates, so migrating is unavoidable at some point. We approach it incrementally: first to Vue 2.7 (which backports the Composition API), then the Vue 3 migration using the official Migration Build, which lets both versions run side by side. Vuex to Pinia and Options API to Composition API happen page by page, in the areas we're already touching anyway. No big-bang rewrite.
Which UI component library do you choose?
It depends on the project. PrimeVue for enterprise dashboards with lots of tables and complex forms. Naive UI or Headless UI for Vue plus Tailwind for projects where your brand look needs to be sharp. Vuetify when Material Design is your target aesthetic. Vueform for form-heavy applications such as quote flows. We almost always pair the chosen library with a custom design system layer, so components stay replaceable without touching the rest of the codebase.
How do you handle state management?
Pinia is the default. For server state we use TanStack Query (Vue version) or Nuxt 3's built-in data fetching, which handle caching, refetching and optimistic updates well. We no longer use Vuex for new projects. The guiding principle: keep global state to a minimum, and whatever state there is belongs in Pinia rather than scattered across composables.
Do you work together with our own developers?
Yes, we do this often. Some clients want us to build the Vue application entirely and then take over maintenance; others want co-development from day one so that their own team can eventually take over the codebase. In both setups we are productive, as long as we agree clearly in advance on code ownership, review protocols and handover. For stacks where we combine Vue with a Laravel backend, we also look at capacity through hiring a full-stack developer, so that one person can cover both Vue and Laravel.
How do we handle authentication in a Vue application?
For client portals we often choose a hosted identity provider such as Auth0 for social logins, SAML and SSO. For privacy-sensitive sectors or on-premise requirements we deploy Keycloak. In Laravel + Inertia stacks we use Laravel Sanctum for session-based auth and Laravel Passport for token-based auth, with a composable on the Vue side that keeps the auth state in Pinia. We only build a custom JWT stack when there is a strong reason to, as authentication mistakes are costly.
What about accessibility and GDPR?
Accessibility is taken into account from day one: semantic HTML, ARIA where needed, focus management in client-side routing, and contrast checks against WCAG 2.2 AA. For B2B applications subject to public procurement or EN 301 549, we also deliver an accessibility report. GDPR compliance is standard: data stays within the EU (Cloudflare EU, Vercel EU regions or a dedicated EU cloud), privacy-by-design architecture, and a DPIA where relevant.
What determines the cost and the lead time?
The number and complexity of the screens, the number of roles and permissions, the depth of the integrations, and whether we also need to build a server layer or API. A bounded Vue portal with a single role is a different conversation from a Nuxt platform with multiple roles, SSR and three integrations. We work with fixed sprint budgets so that you stay in control of spending sprint by sprint, and we commit to a sprint cadence and clear milestones rather than a fixed figure that would do violence to the scope. In the first conversation we outline the scope together and give you an honest estimate.

Talk to us about your Vue project.

A thirty-minute introductory call, with no obligation. We listen to what you want to build, look at how it fits your existing stack and team, and give you honest advice — Vue, React, Svelte or a Laravel + Inertia combination — rather than automatically selling our own preferred framework.

Edit content