Skip to main content

Hello. I'm Bart.

Full-stack developer. Front-end expert.

Sometimes tech lead, sometimes deep in the code.

I build things that work well for the people using them.

BUILDING PRODUCTS THAT MATTER
BUILDING PRODUCTS THAT MATTER

Selected Work

2026

Leveret: Precision Tools for Trail Runners

A running app for serious outdoor athletes. High-fidelity topography meets training science.

I'm building everything: product vision, design, front-end, back-end, infrastructure.

Leveret treats trail running like the technical discipline it is — not a road run with hills.
leveret.run
Leveret.run homepage showing dramatic typography and trail running focus
Landing page — precision tools for the modern alpinist
lib/trpc-client.ts
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from '@/server/trpc/routers';
import superjson from 'superjson';

export const trpc = createTRPCClient<AppRouter>({
  links: [
    httpBatchLink({
      url: '/api/trpc',
      transformer: superjson,
    }),
  ],
});

// Usage in components
const workouts = await trpc.workouts.getAll.query();
const route = await trpc.routes.getById.query({ id });
Type-safe API with tRPC — end-to-end TypeScript
package.json
{
  "dependencies": {
    "next": "^16.0.10",
    "react": "^19.2.3",
    "@trpc/client": "^11.7.2",
    "@trpc/react-query": "^11.7.2",
    "@trpc/server": "^11.7.2",
    "@tanstack/react-query": "^5.90.12",
    "drizzle-orm": "^0.45.1",
    "@neondatabase/serverless": "^1.0.2",
    "next-auth": "5.0.0-beta.30",
    "@maptiler/sdk": "^3.9.0",
    "zod": "^4.1.13"
  }
}
Modern stack — Next.js 16, React 19, tRPC, Drizzle ORM
2025

ICTU: Immigration & Identity Systems

Building critical digital infrastructure for the Dutch government.

Working through ICTU on systems for IND (Immigration & Naturalisation Service) and RViG (National Office for Identity Data).

Not public, but the kind of work where reliability and security aren't optional.
Internal tooling that saves caseworkers hours every day. Complex forms made simple through smart validation and auto-save.
Efficiency tools for government employees
DynamicForm.vue
<script setup lang="ts">
import { JsonForms } from '@jsonforms/vue';
import { vanillaRenderers } from '@jsonforms/vue-vanilla';
import { useFormStore } from '@/stores/form';

const props = defineProps<{
  schema: JsonSchema;
  uischema: UISchemaElement;
}>();

const store = useFormStore();
const data = ref(store.formData);

const handleChange = ({ data }) => {
  store.updateForm(data);
  store.autoSave();
};
</script>

<template>
  <JsonForms
    :data="data"
    :schema="props.schema"
    :uischema="props.uischema"
    :renderers="vanillaRenderers"
    @change="handleChange"
  />
</template>
Dynamic forms with JSON Forms and Vue 3
The best internal tools are invisible. Caseworkers focus on people, not software.

Product principle

Tools that get out of the way
2025

Zeeuws Museum: Digital Experience

Website for the museum in Middelburg's medieval abbey.

30,000+ objects of Zeeland history. Built with Norday. Headless CMS architecture.

Where centuries of Zeeland history meet modern web performance.
zeeuwsmuseum.nl
Zeeuws Museum homepage featuring the DARN exhibition
Homepage — showcasing current exhibitions and collections
components/CollectionSearch.tsx
import algoliasearch from 'algoliasearch';
import { InstantSearch, SearchBox, Hits } from 'react-instantsearch';

const client = algoliasearch(APP_ID, SEARCH_KEY);

export const CollectionSearch = () => (
  <InstantSearch searchClient={client} indexName="collection">
    <SearchBox placeholder="Zoek in de collectie..." />
    <Hits hitComponent={CollectionItem} />
  </InstantSearch>
);

const CollectionItem = ({ hit }) => (
  <article className="collection-item">
    <img src={hit.imageUrl} alt={hit.title} />
    <h3>{hit.title}</h3>
    <p>{hit.period}</p>
  </article>
);
Instant search across 30,000+ museum objects with Algolia
package.json
{
  "dependencies": {
    "next": "15.3.8",
    "react": "^19.1.0",
    "styled-components": "^6.1.17",
    "framer-motion": "^12.7.5",
    "algoliasearch": "^5.46.0",
    "react-instantsearch": "^7.21.0",
    "next-intl": "^4.0.3",
    "jotai": "^2.12.3",
    "swiper": "^11.0.7"
  }
}
Next.js 15, React 19, Algolia search, Styled Components
2025

Amictus.ai: Custom AI Solutions

Building AI-powered solutions for businesses and government organizations.

From knowledge systems to process automation. Cloud and on-premises deployments.

AI as powerful support for people and processes — not technology for its own sake.
amictus.ai
Amictus.ai homepage with gradient background and AI solutions tagline
Landing page — breakthrough AI solutions for tomorrow
api/chat/route.ts
// Server-side AI streaming with Vercel AI SDK
import { streamText } from 'ai';
import { anthropic } from '@ai-sdk/anthropic';

export async function POST(request: Request) {
  const { messages, systemPrompt } = await request.json();

  const result = streamText({
    model: anthropic('claude-sonnet-4-20250514'),
    system: systemPrompt,
    messages,
    maxTokens: 4096,
  });

  return result.toDataStreamResponse();
}
Streaming AI responses with React Server Components
package.json
{
  "dependencies": {
    "next": "15.1.7",
    "react": "19.0.0",
    "tailwind-merge": "2.6.0",
    "motion": "12.4.7",
    "react-hook-form": "7.54.2",
    "@hookform/resolvers": "4.1.1",
    "zod": "3.24.2",
    "resend": "4.1.2",
    "next-themes": "0.4.4"
  }
}
Next.js 15, React 19, Tailwind, Motion, Zod validation
2021

SDU: Legal Publishing Platform

Senior Full Stack Developer building complex search and discovery interfaces.

React, Next.js, Apollo GraphQL. Working on the design system used across all products.

Complex information architecture for professionals who need precision.
sdu.nl
Lefebvre SDU homepage showing legal publishing platform
Homepage — making legal information accessible
lib/contentful.ts
import { gql } from '@apollo/client';

export const GET_ARTICLE = gql`
  query GetArticle($slug: String!) {
    articleCollection(where: { slug: $slug }, limit: 1) {
      items {
        title
        slug
        publicationDate
        content {
          json
          links {
            assets { block { url title } }
          }
        }
        relatedArticlesCollection {
          items { title slug }
        }
      }
    }
  }
`;

// Usage with Apollo Client
const { data } = useQuery(GET_ARTICLE, {
  variables: { slug: 'arbeidsrecht-2024' },
});
GraphQL queries for legal content from Contentful CMS
package.json
{
  "dependencies": {
    "@apollo/client": "^3.8.0",
    "graphql": "^16.8.0",
    "contentful": "^10.6.0",
    "@contentful/rich-text-react-renderer": "^15.19.0",
    "styled-components": "^5.3.6",
    "framer-motion": "^10.12.16",
    "zustand": "^4.3.6"
  }
}
React 18, Apollo GraphQL, Styled Components, Contentful
2020

Ministerie van VWS: Covid Response Platforms

Tech Lead for Team Quarantine & Vaccination.

Built 5 public-facing websites for rapid information delivery — live within weeks of starting development.

When the whole country needed information fast, we shipped it. Accessible to everyone.
Quarantainecheck.rijksoverheid.nl - Covid quarantine check tool
Quarantainecheck.rijksoverheid.nl — one of 5 platforms we delivered
pages/[lang]/quarantine.astro
---
import { sanityClient } from '@/lib/sanity';
import Layout from '@/layouts/Layout.astro';
import RichText from '@/components/RichText.astro';

const { lang } = Astro.params;

const page = await sanityClient.fetch(`
  *[_type == "quarantinePage" && language == $lang][0] {
    title,
    content,
    lastUpdated,
    "countries": *[_type == "country"] | order(name)
  }
`, { lang });
---

<Layout title={page.title}>
  <main>
    <h1>{page.title}</h1>
    <RichText content={page.content} />
    <CountrySelector countries={page.countries} client:load />
  </main>
</Layout>
Multi-language pages with Astro and Sanity CMS
package.json
{
  "dependencies": {
    "astro": "^3.0.0",
    "@astrojs/react": "^3.0.0",
    "@sanity/client": "^6.4.0",
    "@sanity/image-url": "^1.0.2",
    "date-fns": "^2.30.0"
  },
  "devDependencies": {
    "@astrojs/sitemap": "^3.0.0",
    "astro-i18n-aut": "^0.5.0"
  }
}
Astro 3, Sanity CMS, i18n, Islands Architecture
2013

ANWB: 7 Years, Multiple Roles

From front-end developer to Chapter Lead for 35+ developers over 7 years.

Built the award-winning route planner (300,000 daily visits). Created the design system.

Where I grew from developer to tech lead. 3.5 million members. High-volume traffic apps.
300,000 daily users planning their routes. When the system goes down, people notice.

Route Planner

Award-winning application

High-traffic, high-stakes development
design-system/Button.tsx
// Shared component library used across all ANWB products
import { styled } from 'preact-emotion';
import { tokens } from '@anwb/design-tokens';

export const Button = styled.button<ButtonProps>`
  font-family: ${tokens.fontFamily.brand};
  font-weight: ${tokens.fontWeight.semibold};
  border-radius: ${tokens.borderRadius.md};
  padding: ${tokens.spacing.sm} ${tokens.spacing.lg};

  ${({ variant }) => variants[variant]}

  &:focus-visible {
    outline: 2px solid ${tokens.color.focus};
    outline-offset: 2px;
  }
`;
Design system components — consistency across 35+ developers
A design system is a product, not a project. It needs ownership, roadmap, and continuous investment.

React Amsterdam

Conference talk

Lessons from building at scale
FROM CODE TO LEADERSHIP
FROM CODE TO LEADERSHIP

What I do

01

Tech Lead

ArchitectureMentoringScale

Leading teams, architecture decisions, code reviews, mentoring. Have scaled engineering teams up to 40 developers across multiple squads.

Good leadership is about making yourself unnecessary.
02

Full-Stack Development

ReactTypeScriptNode

React, Next.js, TypeScript on the front. Node, APIs and headless CMS on the back. Whatever fits the problem.

The stack should serve the product, not the other way around.
03

Design Systems

ComponentsTokensScale

Component libraries that scale. Documentation that developers actually read. Keeping things consistent across teams.

A good design system is invisible until you need it.
04

Consulting

AuditsStrategyGrowth

Technical audits. Stack decisions. Team assessments. Helping organizations understand where they are and where they could be.

Sometimes the best code is the code you decide not to write.
01
04
SHARING WHAT I'VE LEARNED
SHARING WHAT I'VE LEARNED

Talks

What does Poncho include - documentation, sketch symbols, and Preact components
Presenting at React Amsterdam
Design system learnings and best practices
Slide highlights

React Amsterdam

Building a Design System

How we built ANWB's design system with (P)React.

Sharing code across teams, consistency, component architecture.

A design system is a product, not a project.
Watch on YouTube
Introduction to the three layers of testing
Presenting at React Amsterdam
Testing strategy conclusions and takeaways
Slide highlights

React Amsterdam

The Three Layers of Testing

Static analysis, type checking, and testing strategies for shipping quality code regularly.

How to structure your testing pyramid and when to use each layer.

Tests should give you confidence, not false security.
Watch on YouTube
The challenge of working with 200 front-end applications and 30 developers
Presenting at Rotterdam The Hague Frontend Group
Component framework architecture and patterns
Slide highlights

Rotterdam The Hague Frontend Group

Building a Component Framework

Deep dive into component library architecture.

Patterns for building flexible, composable components that scale.

Good components disappear into the background.
LET'S BUILD SOMETHING TOGETHER
LET'S BUILD SOMETHING TOGETHER

Let's chat.

Whether it's a project, a question, or just talking front-end.

Drop me a line bart@waardenburg.dev

Find me on GitHub and LinkedIn.

Bart Waardenburg
The Hague, Netherlands
© 2026