Skip to main content
BVDNET
Arnhem · websites & automationBVDNET
← moodboard
Curriculum Vitae

Berend van Dijk,
Who does the building.

Full-stack developer · TypeScript, Python & AI agents

Arnhem · berend@bvdnet.nl

Profile

Developer since mid-2025; before that a CNC machinist and an Apple repair technician at Coolblue. Since then I have built three websites for two clients and three products of my own, all live, in TypeScript/Next.js and Python/FastAPI.

I start with what something needs to do and for whom, and keep at it until it is right. My favourite part is the step from an idea to something people actually use.

Working with AI agents
  • Context in the repo. Instructions, skills and checks live in the repos. AGENTS.md routes each agent to only the context for its task, and a separate repo divides the work across the five sites.
  • In parallel. Each task gets its own git worktree and branch, so several agents work side by side on one site, or roll out the same improvement on four sites at once.
  • Pull request. An agent delivers its work as a pull request, with the outcome of the checks in it. I follow along while it works. If it ran unsupervised, if I don't recognise the work or if many are running at once, I review the pull request line by line.
  • Harness-agnostic. I set things up so the harness doesn't matter: Claude Code, Codex, Gemini or any other agent that can load a repo can work in it per repo, locally or in the cloud.
  • Also tried: fully autonomous. In June 2026 I built ten agents (Google ADK, Gemini) that found problems on four sites by themselves, directed a coding agent and merged the result: 120 of 152 pull requests in two weeks. The merge rules proved too loose and the system needed more upkeep than the sites; now I merge myself.
Projects

For clients

FinancieelSlimleven.nl

financieelslimleven.nl →

Client project · Dec 2025 – present

Website for an independent mortgage adviser, with calculators, e‑books and a learning section that lead visitors to a free introductory call.

Next.js 16TypeScriptSanityResend@react-pdfVitestVercel
  • Four calculators, from Dutch wealth tax (box 3) to asset growth, that hand over the result as a PDF. After a download the follow-up emails go out on their own; the adviser edits the copy in the CMS.
  • Regional pages with figures from Statistics Netherlands (CBS). If CBS is down, only that block disappears; the page and the build stay up.
  • When the client's CRM took over invoicing, I removed our own payment integration again: over 8,000 fewer lines to maintain.

MDV Capital

mdvcapital.nl →

Client project · Jul 2026

Website for an entrepreneur who acquires profitable Dutch SMEs facing a succession question. From first meeting to launch within a week.

Next.js 16TypeScriptTailwind 4React Three FiberSanityAttioVercel
  • A spinning 3D globe that never renders on the server, does not load under the ‘reduce motion’ setting and pauses as soon as it is off-screen.
  • The contact form only reports success once the email has actually been accepted, and files the inquiry in the CRM as a contact with a follow-up task at the same time.

Max Styling

maxstyling.nl →

Client project · Sep 2026

Website for a made-to-measure clothing service, with calculators for cost per wear and wardrobe budget. Second project for the same client as MDV Capital.

Next.js 16TypeScriptSanityAttioResendVercel
  • One inquiry form where each part lands in the CRM as its own record: contact, deal with budget, call-back task and note. A test fails if any part has no destination.
  • All 34 pages static; layout shift measured and brought down to virtually zero, and a font preload that gained nothing when measured was rolled back.

Own products

MaviCats.com

mavicats.com/gearbase →

Own project · 2026

Site for Sony Mavica camera enthusiasts, with a database of 38 models to compare side by side. Small community; technically my largest backend project.

PythonFastAPISQLAlchemyAlembicPostgreSQLNext.jsCloudflare
  • Python backend with 89 tables, running as a container on Cloudflare in five roles: API, cron and three queue workers, including AI moderation of images and text.
  • Every pull request gets its own database branch for the migrations. Since a migration silently dropped five indexes in production, a drift check runs as well.

BVDART.nl

bvdart.nl →

Own label · 2025 – present

Bilingual web shop for signed, numbered prints of my own code-generated art, with a 3D gallery you walk through yourself and a lab with 14 image tools.

Next.js 16TypeScriptSanityStripeResendVitestPlaywright
  • The gallery runs on my own 3D engine in plain CSS, without a 3D library: wall collision, mouse-and-keyboard controls, and drawing only what is in view.
  • Stripe payments where the webhook processes each payment exactly once, updates the edition count and emails the invoice as a PDF.

BVDNET.nl

bvdnet.nl →

Own company · 2025 – present

Bilingual site of my web and AI automation business, with a price estimator, a blog and an AI glossary of 171 terms with sources.

Next.js 16TypeScriptnext-intlSanityResendVitest
  • Price estimator where visitors put together what they need and see roughly what it costs, derived from the package prices.
  • Own A/B testing setup: the server assigns variants and only pages with a running test set a cookie, so the rest of the site stays static.

In development

MaviCats Game

closed betaopen the CSS-3D gallery →

Own project · 2026

First-person photography game in the browser. You photograph hidden creatures with recreated Sony Mavica cameras; the model decides the zoom, the viewfinder and how many photos fit on the floppy. Ten areas, co-op for two to four players.

TypeScriptReactThree.jsViteDurable ObjectsWebRTC
  • Started on my own 3D engine in CSS. Measurements showed that 84% of the frame time was spent in the browser itself, not in the game; so I moved to Three.js, with 88% of the code carried over unchanged.

Mazeshift.com

betamazeshift.com →

Own project · Sep 2026

A classic maze game with shifting corridors in the browser, in seven variants: against the computer, two players on one device or against others via the server, with ratings, tournaments and a daily puzzle.

TypeScriptHonoCloudflare WorkersDurable ObjectsPostgreSQLThree.js
  • A public agent arena: Claude and GPT models play each other through the API, with an Elo leaderboard and the notes each agent made on its moves.
  • One rules engine with no dependencies and randomness only through a seed, shared by the server, the computer opponents and the agents, which play without a browser.
Skills
Languages
TypeScriptJavaScriptPythonSQLBash
Frontend
HTMLCSSReactNext.jsTailwind CSSThree.js
Backend
Node.jsFastAPIHonoREST APIsWebSockets
Data
PostgreSQLSQLAlchemyAlembicBigQuerySanity CMS
Cloud
CloudflareVercelGoogle Cloud
DevOps
LinuxGitGitHub ActionsDockerTerraform
Testing
VitestpytestPlaywrightaxe
AI
Claude CodeCodexGeminiMCPGoogle ADK
Experience
  • Independent developerBVDNET, Arnhem2025 – heden
  • Apprentice CNC machinistGoorsenberg, Nijmegen2023 – 2024
  • Apple repair technicianCoolblue, Arnhem2019 – 2022
  • Earlier rolesVarious employers, Arnhem2008 – 2019
Education
  • Communication & Multimedia DesignHAN University of Applied Sciences, Arnhem2019 – 2021
  • Music Composition & ProductionUtrecht School of the Arts (HKU)2013 – 2014
  • VWO (pre-university), Economics & SocietyStedelijk Gymnasium Arnhem and Arentheem Thomas a Kempis2006 – 2013