Skip to content
View fedyunin's full-sized avatar

Block or report fedyunin

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
fedyunin/README.md

Alexey Fedyunin

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.

What I'm working on

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.

Before that

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.

Other people's file formats

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-automizermodify.replaceText leaving 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.

How I work

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.

Stack

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

On types

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.

Further back

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.

Reach me

alexey@cranfan.ru

Pinned Loading

  1. mifkit mifkit Public

    MapInfo data toolkit — convert MIF/MID to Excel, KML/KMZ to MapInfo, and other geo formats. Desktop GUI (Electron) and CLI on one engine.

    JavaScript

  2. qbwcpoc qbwcpoc Public archive

    QuickBooks Desktop Web Connector (SOAP) service — proof of concept. Java, 2013.

    Java 7

  3. appIdSecurity appIdSecurity Public archive

    Python decorator for application-id auth checks on Google App Engine webapp2 handlers. Python, 2013.

    Python 1

  4. wizard-pages-template wizard-pages-template Public

    Multi-step wizard page template — React + MUI stepper with reusable step components. 2023.

    JavaScript

  5. FaceIdDemo FaceIdDemo Public archive

    Forked from skokourov/FaceIdDemo

    Android face-ID demo (2017): on-device face detection via Play Services Vision, plus a Volley client for a self-hosted recognition backend — enrol a person, identify, retrain the model.

    Java