Hi! I’m ZanderStylised (pixellated) picture of Zander, I make web things

Reps preview

Reps

A daily JavaScript coding puzzle. Solve one function a day in your browser.

➤ reps.zander.wtf
ZUI preview

ZUI

A CSS-first UI library with design tokens, layered architecture, and optional React, Astro, Solid, Svelte & Vue components. No build step required.

➤ zui.zander.wtf
Simmer preview

Simmer

Your recipes, finally at home.

➤ simmer.zander.wtf
Otter preview

Otter

A self-hosted bookmark manager and media tracker built for people who value privacy and ownership.

➤ otter.zander.wtf

About me

Product engineer with 18 years of experience, specialising in front-end and design systems - building products that work well for the people who use them.

Current
Dare
Staff Software Engineer and web team lead. I maintained and evolved Dare's core ETRM (Energy Trading and Risk Management) platform — a complex, data-intensive system — and built a new component library from the ground up, bringing visual and functional consistency across the product suite.

For more details on my work experience, check out my CV →

Blog

What should actually go in your CLAUDE.md?

The guidance contradicts itself and almost none of it is dated, so here's a map of who says what, what the research supports, and how AGENTS.md fits in.

article
astro-d1-search: site search for Astro in one integration

I extracted the search implementation I built for this site into an npm package, so you can add full-text search to your own Astro site

article
A native iOS app for Otter

Otter now has a proper native iOS app, written in SwiftUI. No web views anywhere: browsing bookmarks and saving new ones both go through Otter’s REST API directly, with the first page of bookmarks cached to disk so the list renders instantly at launch and refreshes in the background. The difference in performance over loading the web app is enormous.

Sign-in is OAuth 2.1 with PKCE, using RFC 7591 dynamic client registration — you type your instance address and that’s it, no client ID to configure. Tokens live in a keychain group shared with the extensions.

Saving works from wherever you happen to be: the system share sheet, the + button, an otter://save?url=… deep link, or a “Save Bookmark” Shortcuts action. The Xcode project also ships a Safari web extension for saving the current page, on both iOS and macOS.

worklog
Building site search with Astro and Cloudflare D1

Replacing Algolia on this very website with a self-owned, full-text search API built on Cloudflare D1 and SQLite FTS5, searchable from the site itself and from Raycast

article
View all articles →

Links

Hand-picked hyperlinks, all saved in my Otter bookmarking app

View all links →