Technology
Technology I Work With
Organised by what each one does in a product, with the real work each was used on. No self-assigned percentages: a score I award myself would not be evidence.
Frontend
- Next.js
- This site: App Router, server components, static generation for every public route, and a Server Action for its one public form. The travel platform's web app on Next.js 16. Also mostore, an e-commerce store on Prisma and Neon, and a job board with NextAuth and file uploads.
- React
- The travel platform's web app and every client build since 2023, from dashboards to landing pages, plus 38 public repositories.
- TypeScript
- Strict mode on both projects here. On the travel platform it runs the full depth, from Drizzle schema to API response to the web app.
- JavaScript
- The language underneath, and still what most of my public repositories are written in.
- Tailwind CSS
- v4 on both projects here, CSS-first, with the design tokens defined once and the contrast between them enforced by a test.
- shadcn/ui
- Radix primitives retuned to the brand palette on both projects, rather than shipped as stock components.
- Redux
- Redux Toolkit on eight public React builds, and the cart on the e-commerce ones, including Comfy Store, where it has to stay consistent across routes and reloads.
- TanStack Query
- Server state on the travel platform's web app, with a fresh client per server request, and on Comfy Store, an Unsplash image search and a React Native laundry app.
- React Hook Form
- This site's enquiry form and the travel platform's forms, each paired with a Zod schema, and the forms on a Next.js job board and a shop management build.
- Motion
- This site's staged entrances, code-split through LazyMotion and collapsed under reduced motion, and three earlier Next.js and React builds.
- Sass
- Six public builds, from the asset pipeline on four Rails apps to two React clothing stores.
- styled-components
- Component styling on five public builds, including a car rental front end, a GitHub user search and MealTime, an Expo app.
- Bootstrap
- Six public builds, including a car rental front end, a MERN authentication app and several Rails apps.
- Accessibility
- This site scores 100 on Lighthouse accessibility with zero axe violations in both themes, and contrast is a test that fails the suite.
Backend
- Node.js
- The travel platform's API, and the backend of the inventory and dashboard work delivered to clients.
- Express.js
- Express 5 on the travel platform: route modules with middleware wiring, validation and thin controllers.
- Ruby on Rails
- Seventeen public Rails apps, most on PostgreSQL, including budget and recipe apps deployed to Heroku, an e-commerce build, and an API-only app authenticated with JWT.
- REST APIs
- The travel platform's versioned API, covering search, bookings, payments, wallet, organisations and an admin surface. In public repositories, store and task-manager APIs on Express and MongoDB, and an API-only Rails app.
- Ruby
- The language under those Rails apps, and the primary language of 20 public repositories.
- Hotwire
- Turbo and Stimulus across thirteen Rails apps, including a single-page quote editor with one line of custom JavaScript.
- Server Actions
- This site's contact form: the only server work on an otherwise fully static site.
- Zod
- One schema shared by browser and server on this site, and validation at every request boundary on the travel platform.
Database
- PostgreSQL
- The travel platform's whole domain, including row-level security proved from a non-superuser connection, and the database under thirteen public Rails apps.
- PostgreSQL Row-Level Security
- The travel platform's tenant isolation, proved by a test that connects as a dedicated non-superuser role and still cannot read another tenant's rows. The API refuses to boot in production if its role would bypass the policies.
- Neon
- Serverless Postgres behind mostore, a Next.js e-commerce build, connected through Prisma's Neon adapter.
- Supabase
- An e-commerce store built on Next.js, with Supabase behind it and Clerk for auth.
- MongoDB
- The MERN builds in my public repositories, through Mongoose, including a notes board and two REST APIs.
- Firebase
- Authentication and messaging on ChitChat, an Expo messaging app, and the backend of four other public builds, including two React clothing stores.
- Redis
- Rate limiting through Upstash on a MERN notes board, and on a real-time search app built in Rails.
Data & ORM
- Drizzle
- The travel platform, including the conditional updates that make an inventory decrement and a wallet debit atomic, and its drizzle-kit migrations.
- Prisma
- The ORM on four Next.js builds, including mostore, an e-commerce store, and a job board.
- Audit logging
- The travel platform's append-only ledger, with database constraints as the backstop rather than the plan.
Authentication
- Better Auth
- The travel platform: a revocable session in an httpOnly, SameSite=Lax cookie, optional Google sign-in, email verification and password reset, with no credential in localStorage.
- Clerk
- Sign-in on an e-commerce store built on Next.js and Supabase, and on other Next.js builds in my public repositories.
- Session-based authentication
- The travel platform's Better Auth sessions, Devise across seven public Rails apps, and JWT in an httpOnly cookie on a MERN build.
- Role-based access control
- The travel platform: organisation owners and members who see different bookings and commissions, and two admin roles where only one may change platform data.
Payments & Integrations
- Stripe
- Payment gateway work on platform builds, alongside Paystack on the travel platform, where webhooks are verified by HMAC before anything is trusted.
- Paystack
- The travel platform's checkout, with payment initialisation, verification and a webhook proved unable to double-credit when replayed.
- Webhooks
- Paystack webhooks on the travel platform, verified by HMAC-SHA512 before anything is trusted, with a replay queue in the admin console.
Deployment & Infrastructure
- Vercel
- This site's deployment target, configured with its environment contract and a build that refuses to ship seeded example content.
- Railway
- Where the travel platform runs, as two stateless services built from their own Docker images.
- Docker
- The travel platform ships as two images, an API and a web app, so the same builds run on Railway, Fly, Cloud Run or a plain VPS.
- GitHub Actions
- The travel platform's CI: lint, typecheck, test and build for both packages, with the API's suites against a real Postgres service. A lint workflow also runs on 36 of my public repositories.
Mobile
- React Native
- Seven Expo apps in my public repositories, from a task app to ChitChat, a messaging app with Firebase authentication and messaging.
- Expo
- Expo Router for navigation on five of those apps, with NativeWind carrying Tailwind's styling over to native on four.
Testing & Tooling
- Vitest
- 336 tests on this site, and the travel platform's 357 server and 739 frontend tests.
- Playwright
- Browser verification on this site: the keyboard walk, the axe sweep in both themes, and the reduced-motion pass.
- Jest
- Test suites on six public builds, with React Testing Library on the four React ones: a car rental front end, a calculator, a space travel app and a metrics app.
- RSpec
- Four Rails apps, including 20 spec files on the blog app with rswag documenting its API. Most of the other Rails apps are tested with Minitest, with Capybara for system tests.
- Figma
- The starting point for agency and design-to-code builds: reading the file first and listing every screen, state and breakpoint it implies but does not draw.
- Git
- Every project here and more than 130 public repositories.
- Vite
- Ten public React builds, including Comfy Store and a MERN notes board.
- Webpack
- A hand-written config on eight public builds, including a leaderboard and a TV show browser.
Practices
- Performance budgets
- This site records its transferred weight per route with a ceiling on each, measured in the browser because the build reports no sizes.
- Design fidelity
- Matching the file at every breakpoint, and saying so when a part of it should change: the reference for this site carried invented statistics, and they were removed rather than built.
- Written handover
- The codebase is handed over on delivery. Every client engagement I have taken has ended that way.