Full-stack engineer. Backends in Node.js, frontends in React, infrastructure on Google Cloud.
My contribution graph starts in 2006, which deserves an asterisk: the account is from 2013, but an enterprise Java codebase I worked on back then was imported here later with its history intact, and GitHub happily backdated me. Twenty years either way, and the stack has turned over a few times since — Java and JBoss first, then App Engine and Python, then JS all the way down.
What hasn't changed is the kind of work I like: integration. Talking to someone else's API, parsing someone else's file format, gluing together systems that were never designed to meet.
Currently freelance / consulting — open to interesting projects.
Crafted Stays (2023 – present) — a property-rental platform: custom websites for rental properties, booking management, and PMS integrations, multi-tenant for both individual landlords and agencies.
Fifteen services in one monorepo — a GraphQL API on Apollo Server, React/Vite dashboards, a template-rendering pipeline split into an orchestrator and gRPC render workers, Cloud Run Jobs for batch work, Firebase Functions for webhooks, Playwright E2E, and Terraform covering the whole footprint. Includes an LLM-backed property search: a two-stage agent pipeline that pulls structured criteria out of a natural-language query, filters candidates against the catalogue, then ranks what survives and writes a tagline for each result.
I work on it as part of a team.
MifKit — my open-source one. A MapInfo data toolkit: MIF/MID to Excel, KML/KMZ to MapInfo, with GeoJSON and Shapefile in progress. One engine ships two ways: a CLI, and the same core wrapped in Electron so the GIS folks who actually need this get a desktop app instead of a terminal. Converters live in a pluggable registry, so each one's options form renders from its own schema and shows up in the GUI automatically. Node.js, ExcelJS, cross-platform builds, tests on GitHub Actions. MIT.
A Knack-based product (2014 – present) — a custom Node.js API and integration layer wrapped around a no-code platform, holding the business logic that outgrew it. Twelve years of small, steady changes for a client still happily running on it. Long-lived software teaches you things that greenfield never will.
ViewN (2019 – 2023, Bimotics) — an analytics product, and five years of my life. React dashboards built on MUI and MUI X Data Grid Pro with DevExpress charts, talking to a Python backend on Google App Engine. Around 290 commits split across the frontend and the backend. The mui-x issue below came straight out of it.
Evee (2023, iPoint) — Firebase Cloud Functions and an App Engine service in JS/TypeScript.
If there's a through-line across all of it, this is it: PDF, PDF forms, DOCX, PPTX, XLSX, MIF/MID, KML, GeoJSON. Reading a format someone else designed and writing it back out correctly, usually because a business process quietly depends on getting it right.
The trail is public, in issues filed upstream when a library and I disagreed about what a spec meant:
- HummusJS — garbled field-name decoding, and appending pages to an existing PDF (2015, 2016)
- fill-pdf — unescaped parentheses breaking form fills (2016)
- docxtemplater — template variables with nested fields (2018)
- pptx-automizer —
modify.replaceTextleaving text behind (2024)
Plus the usual assortment against mui-x and shadcn/ui. MifKit is that same instinct, finally packaged into something with a UI.
I use AI tooling heavily and on purpose — Claude Code and Codex for routine work, refactors, and getting up to speed in unfamiliar code fast.
Not as autocomplete, though. The Crafted Stays repo carries its own CLAUDE.md, a set of project-specific Claude Code skills (PR review, GitHub Projects board management, a two-phase template design-and-conversion workflow), a custom subagent, and an MCP server wired up to Playwright. The agent workflow is part of the codebase and gets maintained like everything else in it. MifKit was built this way end to end.
The architecture and the judgement calls are still mine. The keystrokes are negotiable.
| Working in now | Node.js · React · GraphQL / Apollo · gRPC · Express · TypeScript · Google Cloud (Cloud Run, Firestore, Firebase, Cloud Build) · Terraform · Playwright |
| Also comfortable | Python · Docker (containerising Node services for Cloud Run) · REST & SOAP integrations · TailwindCSS · MUI · EJS · data wrangling across XLSX / CSV / XML / GeoJSON |
| Earlier stacks | Java · App Engine & Cloud Endpoints · Objectify · Salesforce API · QuickBooks Web Connector |
TypeScript is in that list because I write it daily. I'd still rather not, and it's a working position rather than a grudge: types are one way to buy confidence in a program, and small modules with narrow interfaces and real tests are another. Where the types genuinely are the interface — fifteen services over a shared protobuf contract — TypeScript pays for itself. Where a codebase fits in one head, you end up maintaining a description of the code alongside the code.
MifKit is that argument in practice: plain Node.js, three runtime dependencies, no build step, tests on the native node --test runner. It declares types in exactly one place — a JSDoc @typedef for the converter contract, because that one really is a public interface. Six files out of twenty-seven carry JSDoc; the rest read fine without. Write it cleanly, keep the seams tight, and most of the scaffolding turns out to be optional.
| 2015 – 2018 | Document tooling — PDF generation and form filling, DOCX templating; a Java editor product; a detour through face recognition (OpenFace, FaceNet) |
| 2013 – 2014 | Java and Python: App Engine services, API clients, integration proofs of concept |
| 2006 – 2007 | iLogos — a small part in building a distance-learning system on Java/JBoss that ran at two Russian universities. Parked on GitHub in 2020, which is why its history turns up on my graph |
The repositories marked Archived are from 2013–2014. They still work; they're just finished. I keep them public because they're an honest record of where I started — and because qbwcpoc apparently still helps people wire up the QuickBooks Web Connector.



