Setup
What I use.
The tools, languages, frameworks and gear I reach for every day. Curated over nine years of frontend engineering.
01 — Editor & Terminal
Cursor
Primary IDE. AI-native development with Claude as a pair programmer — the same LLM I use for my agentic delivery framework. The jump to Cursor from VS Code was immediate and irreversible.
Primary
VS Code
For quick file edits, remote SSH sessions and team configurations. The ecosystem and extension library remain unmatched. Still essential as a secondary tool.
Secondary
iTerm2 + Zsh
Terminal of choice on macOS. Oh My Zsh with a lean config — mostly aliases for git, npm scripts and k8s commands. Fast, reliable, no drama.
Terminal
Raycast
Launcher and workflow tool. Window management, clipboard history, GitHub search and custom scripts. Replaced Spotlight permanently.
Productivity
02 — Languages
TypeScript
The only language for large-scale frontend systems. Type contracts are the closest thing to self-documenting cross-MFE boundaries. Strict mode, always.
Primary
JavaScript (ES6+)
Still the runtime. Deep knowledge of the prototype chain, closures, async/await, module system and performance characteristics is non-negotiable.
Foundation
CSS3 / SCSS
Modern CSS first — custom properties, grid, container queries. SCSS for the occasions where nesting and mixins genuinely earn their place. No CSS-in-JS for shared systems.
Styling
Node.js
For tooling, build scripts, proxy servers and micro-service layers. Not the main event, but always in the picture.
Backend / tooling
03 — Frameworks & Libraries
React 18
The component model I know most deeply. Concurrent features, Suspense, server components — I track the evolution closely because it changes how micro-frontend boundaries should be drawn.
UI
Next.js
The shell framework for MFE hosts at Maersk. App router, server components and the custom Module Federation integration I built on top of it. SSR when it matters, static when it doesn't.
Framework
Webpack Module Federation
The architecture primitive that makes micro-frontends practical at scale. I've written about the cross-MFE data layer that makes it humane to work with.
Architecture
Redux Toolkit
For shared global state in large apps. RTK Query for data fetching. The opinion is right: slices + immer + devtools is the right amount of structure.
State
04 — Testing & DevOps
Cypress
The tool that runs our centralised E2E suite across all Maersk pricing MFEs. Cross-MFE flows, shared fixtures, CI integration. Confidence at scale.
E2E testing
Jest + React Testing Library
Unit and integration testing. Testing behaviour over implementation — the RTL philosophy aligns with how MFEs should be tested: at the boundary, not the internals.
Unit testing
GitHub Actions
CI/CD for most projects. Fast feedback loops, matrix builds, deployment pipelines. Integrated with the agentic delivery framework for automated PR checks.
CI/CD
Kubernetes + Docker
Container orchestration for production deployments. K8s on GCP at Lowe's (Spinnaker, Istio, Envoy) and at Maersk. Docker for local dev environments.
Infrastructure
05 — AI & Design
Claude (Anthropic)
The AI I trust most for code and architecture reasoning. I've built a production delivery framework on Claude Code with MCP integrations for Jira, Confluence and Figma.
AI / Agent
Figma
Design collaboration and design system work. The MCP Figma connector in my agent framework lets Claude read component specs and token values directly.
Design
Grafana
Observability for frontend systems. Custom dashboards tracking Core Web Vitals, error rates and deployment health across the MFE platform.
Observability
Linear + Jira
Linear for personal and team projects (fast, opinionated, excellent). Jira where the org mandates it — and now with an MCP connector, Claude can read tickets directly.
Tracking