Personal

Matt Botha/Frontend developer/Pretoria

I build withpurposeand precision

48076810241280153619204080120160VIEWPORTH1H2BODY

--text-h1:clamp(2.75rem,0.92rem + 8.15vw,8.25rem);

The h1 on this page, plotted against viewport width. Drag the point.

NO BREAKPOINTS · ONE CLAMP

VIEWPORT
POSITION
−25.7479, 28.2293
SAST

Manifest

Four things I have worked on, and what I actually did on each.

  • TOKENS

    Rebuilding and redesigning the site for a global card product

    I led the redesign, refactor and rebuild of a marketing site for a global multi-currency card product. The goal was to bring the site closer to the product it represented, and make it relevant to a much wider range of customers.

    React · Next.js · Tailwind CSS · Design systems

  • MOBILE

    The mobile app for the same global card product

    A separate React Native application for the same product, with its own codebase and its own platform-specific considerations. It shares the same back-end APIs and much of the same design language as the web app, while being designed around the conventions and constraints of iOS and Android.

    React Native · Expo · TypeScript · iOS · Android

  • PROVISION

    Apple Pay push provisioning in a card issuing app

    I worked on push provisioning in the app, allowing cardholders to add their cards to Apple Wallet in a few taps. I worked with Visa's VDE SDK to handle the provisioning flow into Apple's Wallet APIs, including the eligibility checks, secure card-data handling and the integration back into the app.

    Expo · React Native · TypeScript · iOS · Swift · Visa VDE SDK · Apple PassKit

  • REVIEW

    Code review for an outsourced fintech project

    I was brought in to review the React and TypeScript work coming from an outsourced team on another fintech product. With a focus on keeping the codebase consistent and maintainable, I reviewed pull requests, suggested changes where needed, and helped explain the reasoning behind them.

    Code review · Git · TypeScript · React · Next.js

Spec

What I actually reach for, and how often. Pick a name to see where it turns up on this page.

Interface

  • Daily. Production components, hooks, composition. Server and client boundaries in App Router.
  • Daily. App Router, route handlers, static generation, metadata. This page. Statically generated, one route handler.
  • Daily. Strict mode. Types as a design tool rather than a formality. strict, plus noUncheckedIndexedAccess. Zero errors.
  • Daily. v4, CSS-first. Tokens in @theme, no arbitrary values in components. Six colour tokens. Grep this repo for a square bracket.
  • Daily. The same product, carried in a pocket. Shared logic where it earns its keep, native where it doesn't. See PROVISION.

Craft

  • Regular. One system with a governing logic, not a pile of effects. Four verbs on this page: spin up, measure, bin, commit.
  • Daily. Keyboard operability, focus management, contrast, reduced motion as a design. Tab through this page. Try it with reduced motion on.
  • Regular. Transform and opacity in hot paths, lazy boundaries, honest bundle budgets.
  • Regular. Zod schemas shared between client and server. Errors that say what to do. The form below validates against one schema, twice.

Working

  • Daily. Deliver small, valuable increments. Optimize for feedback over certainty.
  • Daily. Design interfaces that make the right thing obvious. Good design reduces cognitive load.
  • Daily. Small commits with reasons in them. Rebase when it helps the reader, merge when it does not.
  • Daily. Reading other people's code carefully and saying the useful thing rather than the clever one.
  • Regular. Continuously improving and maintaining my own tools and interfaces outside work — because using something well-made is better than using something merely functional.

Reduction pass

The TOKENS refactor, performed rather than described. Scroll.

22/22 arbitrary values remaining

  • p-[13px]p-3
  • text-[#3a3f5c]text-muted
  • gap-[7px]gap-2
  • mt-[22px]mt-6
  • bg-[#11141d]bg-bench
  • rounded-[3px]rounded-xs
  • text-[13px]text-micro
  • px-[19px]px-5
  • leading-[1.62]leading-relaxed
  • border-[#232a3c]border-rail
  • w-[268px]w-64
  • duration-[240ms]duration-quick
  • text-[#63d2e8]text-intake
  • mb-[42px]mb-10
  • tracking-[0.08em]tracking-label
  • pt-[57px]pt-14
  • shadow-[0_1px_0_#232a3c]shadow-plane
  • text-[11px]text-readout
  • gap-[13px]gap-3
  • bg-[#ffa25c]bg-exhaust
  • ease-[cubic-bezier(.16,1,.3,1)]ease-entrance
  • max-w-[1200px]max-w-measure

Less guesswork. More consistency.

Send a message

Freelance work, a role, or a question about something above. All three land in the same inbox.

Or email directly

mattgbothagmail.com

Here about a website?

If you landed on the technical page but what you actually need is someone to build you a fast, tidy site — and you would rather not read about width axes and contrast ratios to find out whether I am pleasant to work with — start over here instead.

Go to the personal side