Senior Full-Stack Engineer
Information
Languages
About
Main technologies
Additional skills
- SaaS6 yrs.
- REST API6 yrs.
- HTML6 yrs.
- SCSS6 yrs.
- Technical Documentation5 yrs.
- Design Patterns4 yrs.
- Mongoose4 yrs.
- JWT4 yrs.
- Code Refactoring4 yrs.
- CI/CD4 yrs.
- Docker Compose4 yrs.
- Agile Methodology4 yrs.
- Docker4 yrs.
- Express.js4 yrs.
- MongoDB4 yrs.
- Payment Processing4 yrs.
- Software Architecture4 yrs.
- Unit Testing3 yrs.
- Microservices3 yrs.
- SQL3 yrs.
- Jest3 yrs.
- Nuxt.js3 yrs.
- Vite3 yrs.
- Retool3 yrs.
- Webpack3 yrs.
- Google Cloud (GCP)3 yrs.
- PostgreSQL3 yrs.
- Redux.js2 yrs.
- React Storybook2 yrs.
- Playwright2 yrs.
- LLM2 yrs.
- Billing2 yrs.
- Payment Gateway Integration2 yrs.
- React.js2 yrs.
- Tailwind CSS2 yrs.
- RAG1 yrs.
- Cursor1 yrs.
- Claude Code1 yrs.
- LangGraph1 yrs.
- LlamaIndex1 yrs.
Experience
B2B Core Banking Platform
About the Project
Omega is a B2B fintech platform providing multi-currency business accounts for companies that send, receive and convert money across borders. The core banking web application is what customers use day to day: multi-currency accounts, payments and payees, transaction history, FX conversions, statements and accounting exports, team access with roles, and a task-based KYC/KYB onboarding journey. Payment schemes are selected automatically by country and currency, with validation against local rails. The product serves business customers across the UK and EU. It started as a small internal tool and grew through several pivots into a profitable, bootstrapped core banking platform, with the web application rebuilt from scratch in Vue 3 and TypeScript as the foundation the whole company builds on today.
- Fintech
- Banking
Responsibilities
I built the core banking web application from scratch in Vue 3 and TypeScript, starting with the first version of payments, transactions and FX operations, and have owned its frontend architecture ever since as it grew into the platform used across the company. Over six years I delivered the full mobile responsive adaptation, led the Webpack to Vite migration including build config and CI pipeline, set up a Playwright integration test suite covering critical user flows in CI, and wrote backend endpoints and business logic in Go across the core API. I mentor a frontend engineer through onboarding and code reviews. Since 2025 I work spec-driven with coding agents, Cursor and Claude Code: a concept first, then a schema with contracts and the exact surfaces to touch, then atomic tasks small enough to stay reviewable. Full features ship this way end to end, with review effort going into the spec instead of the diff.
Skills & technologies
- Vue.js
- TypeScript
- JavaScript
- Golang
- Node.js
- SCSS
- Vite
- Playwright
- PostgreSQL
- Docker
- Docker Compose
- Google Cloud (GCP)
- REST API
- Software Architecture
- Payment Processing
- Cursor
- Claude Code
Payee Creation and Payment Validation Flows
About the Project
Omega customers pay suppliers, contractors and partners across multiple countries and currencies, and every destination has its own payment scheme with its own required details: an IBAN in one place, a sort code and account number in another, extra routing data in a third. Payees are the saved recipients a customer pays against, and whether their details are correct decides if a payment settles or bounces back days later. The original flow asked customers to pick the scheme themselves and fill in a generic set of fields, which produced malformed requisites, failed payments and a steady stream of support tickets. This project rebuilt payee creation into a guided flow: the scheme is resolved automatically from country and currency, only the fields that scheme actually needs are requested, each is validated against its format rules, and UK payees go through Confirmation of Payee so the account name is checked against the bank's records before anything is saved.
- Fintech
- Banking
Responsibilities
I delivered the rebuild end to end: the scheme resolution rules by country and currency, the per-scheme field schemas and their validation, the Confirmation of Payee integration, the backend logic in Go, and the full interface in Vue 3 and TypeScript. Malformed payment requisites dropped by around 90%, which removed a recurring burden on both support and engineering: fewer failed payments to investigate, fewer manual corrections, fewer tickets reaching the team. I ran this spec-driven with coding agents, Cursor and Claude Code. The scheme rules and validation cases went into a spec first, with contracts and the exact surfaces to touch, then were cut into atomic tasks. That kept a rules-heavy feature reviewable in small pieces instead of arriving as one large diff nobody can check properly.
Skills & technologies
- Vue.js
- TypeScript
- Golang
- PostgreSQL
- REST API
- Payment Processing
- Software Architecture
- Code Refactoring
- Cursor
- Claude Code
Internal Compliance and Operations Platform
About the Project
Omega's operations and compliance team works with customer accounts every day: reviewing onboarding applications and KYC/KYB documents, checking account state, and handling the cases automated flows cannot close on their own. The internal platform is where that work happens. It gives the team one place to look up a business customer, see their documents and history, and take the actions their role allows, instead of asking engineers to run queries or scripts for them. It started as a Retool build, chosen because it put a working tool in the team's hands in days and became the primary daily tool for an operations team of 12 to 15 people. As the number of daily workflows and the demands on them outgrew what the no-code layer could support, it was rebuilt as a standalone frontend on top of the company's own API.
- Fintech
- Banking
Responsibilities
I built the first version on Retool and owned it as the operations team's workload grew, adding the screens and actions compliance asked for as their process changed. When the no-code layer started limiting what the team could do, I made the case for replacing it and delivered the standalone frontend in Vue 3 and TypeScript, together with backend endpoints and business logic in Go on the internal admin API. The sequencing was the decision that mattered here: starting on no-code put a usable tool in front of the team in days, and rebuilding only once its limits were real meant the team kept working through the whole period instead of waiting months for a proper interface.
Skills & technologies
- Retool
- Vue.js
- TypeScript
- Golang
- PostgreSQL
- REST API
- Software Architecture
Company-wide UI Kit and Design System
About the Project
Omega runs several production web applications built by different people at different times: the customer-facing core banking app, the internal operations platform, and supporting products. Each had grown its own buttons, inputs, modals and spacing rules, so the same element looked and behaved differently depending on which app a user was in, and every new screen meant rebuilding components that already existed somewhere else. The UI kit is the shared foundation that replaced that. It is a versioned package of Vue 3 components with a single source of truth for design tokens: colours, typography, spacing and breakpoints are defined once in JSON, and an automated pipeline generates the SCSS for every theme, including light and dark. Components are developed and documented in Storybook and covered with Vitest, so a change can be reviewed in isolation before it reaches three production applications at once.
- Fintech
- Banking
Responsibilities
I designed and built the kit and shipped it as an npm package, including the token pipeline that parses design tokens from JSON and generates SCSS for all themes and breakpoints, the Storybook-driven development workflow, and the Vitest coverage for components. It is now adopted across three production applications, and I run the gradual migration of components out of the main app into the kit. I also mentor a frontend engineer on it through onboarding and code reviews. This is also what makes agent-assisted work reliable here. When components, tokens and patterns are defined in one place and enforced by linters, a coding agent has one correct way to build a screen instead of inventing a new variant each time. Shared foundations turned out to matter more for output quality than prompting technique.
Skills & technologies
- Vue.js
- TypeScript
- SCSS
- Tailwind CSS
- React Storybook
- Software Architecture
- Design Patterns
Customer Onboarding and KYC/KYB
About the Project
Before a business can use Omega, it has to be verified: identity checks on the people behind the company (KYC), checks on the company itself and its ownership structure (KYB), supporting documents, and sign-off from every director when there is more than one. That process used to live in a separate application, disconnected from the product the customer had just signed up for, and more than half of the users who started it never finished. The rebuild turned onboarding into a task-based system inside the core banking application itself. The customer sees exactly what is still required, completes items in any order, can leave and come back without losing progress, and invites co-directors to complete their own parts in parallel instead of the whole application waiting on one person. Verification state is visible to the operations team in the same place they handle everything else.
- Fintech
- Banking
Responsibilities
I rebuilt the flow end to end: the task model behind each verification requirement, multi-director invitations and their parallel completion, document handling, the interface in Vue 3 and TypeScript, and backend logic in Go. It also meant folding a standalone onboarding application into the core banking product. The rebuild was triggered by a drop-off above 50% on the old linear form, so the task model was built around the reasons people stalled: progress is saved and resumable at any point, a customer is never blocked by a document they do not have at hand, and a single unresponsive director no longer holds up the whole application. I worked this spec-driven with coding agents, Cursor and Claude Code. The task states, their transitions and the rules for each verification type were written as a spec before any code, then cut into atomic tasks. On a flow with this many states, the spec is what keeps behaviour consistent: agents implement well from one and badly without it.
Skills & technologies
- Vue.js
- TypeScript
- Golang
- PostgreSQL
- REST API
- Software Architecture
- Code Refactoring
- Cursor
- Claude Code
Voice AI Interview Simulator
About the Project
Saynest Lab is a voice-based interview simulator for people preparing for technical and HR interviews in English. A user uploads their CV and describes their background, and the system analyses it to generate scenarios matched to their actual role, seniority and technologies instead of offering a fixed list of generic questions. A session is a spoken conversation with no chat interface: the user speaks, the system transcribes, evaluates the answer against the criteria for the current question, decides whether to ask for clarification, hold on the topic, give the expected answer and move on, or close the scenario, and replies out loud. Afterwards the user gets a report graded per question: how much of what was asked actually got covered, factual accuracy, and delivery metrics such as speaking pace, filler words and pauses.
- AI
- Job and Career Services
- EdTech
Responsibilities
I built the product solo, from concept to production: backend in Node.js and TypeScript on MongoDB, frontend in Vue 3, marketing site in Nuxt, all deployed on Google Cloud Run, with subscriptions and billing through Paddle including free-tier limits and webhook sync. The core is a conversation engine on LangGraph. Each scenario is a set of anchors with acceptance criteria, and every turn runs transcription with Whisper, retrieval over a per-scenario index built with LlamaIndex, an LLM evaluation of the answer, a graph decision on what to do next, and a reply streamed as text and speech over NDJSON with Google Cloud TTS. Most of the work was production hardening: staged retries across evaluation, graph and generation, and a graceful terminal state when a session cannot recover, so a failed model call ends in a sentence the user understands instead of a dead screen.
Skills & technologies
- Node.js
- TypeScript
- Vue.js
- Nuxt.js
- MongoDB
- LangGraph
- LlamaIndex
- RAG
- LLM
- Google Cloud (GCP)
- Docker
- Docker Compose
- Payment Gateway Integration
- Billing