$ whoami

Igor Mitkovski

backend engineer · node.js / typescript

I build the parts of software you don't see — and can't live without.

I design APIs, wire up relational and non-relational databases, and ship infrastructure on Kubernetes and AWS with Terraform. Currently keeping a sustainability data platform fast, stable, and reliable.

~/img/igor.jpg
Igor Mitkovski
request lifecycle — how a call moves through my systems
client
HTTPS
api-gateway
auth · rate-limit
svc-api
svc-worker
redis cache
postgres rdbms
elasticsearch search

// case studies

Systems I've built and kept running

Current engagement anonymized; earlier work named. Ask me about any of these — I'm happy to go deep.

Search that stays in sync with a document store

Context. A sustainability data platform where customers query assessment data across thousands of facilities. Documents live in CouchDB; search runs on Elasticsearch, with relational projections in PostgreSQL.

My part. Designing and optimizing the customer-facing APIs and keeping three stores consistent — including the unglamorous paths: when an entity is destroyed in the document store, its search index entries and relational rows have to go with it, and the change feed has to survive retries without double-indexing.

Outcome. A reliable indexing pipeline, predictable API latency as data volume grows, and no orphaned records quietly haunting the search results.

Node.js TypeScript CouchDB Elasticsearch PostgreSQL REST
couchdb indexer change feed elasticsearch upsert · delete postgres api query

A sync bot you can actually operate

Context. The same platform exchanges facility records with an external industry registry through its public API. Records go out, moderation decisions come back, and the whole exchange has to be auditable and safe to re-run.

My part. Built the scheduled sync bot end to end: every run writes a job record with status and per-run metrics, manual runs return a job ID you can poll, the registry's moderation IDs are captured from responses for follow-up, an admin endpoint exposes the full run history, and a retention job purges it after 60 days.

Outcome. An integration that isn't a black box — when a record doesn't show up on the other side, the run history says exactly what was sent, when, and what the registry answered.

Node.js TypeScript job scheduling 3rd-party APIs REST
scheduler sync-bot nightly registry submit jobs db job log GET /admin/sync-runs

One GraphQL API in front of four third-party platforms

Context. markero.ai, an AI-powered marketing tool that publishes campaigns to Facebook, Instagram, LinkedIn, and GetResponse email campaigns. Every provider has its own auth, rate limits, and failure modes.

My part. Built the GraphQL layer that hides that mess: normalized provider models in MongoDB, webhook ingestion, retry queues, and per-provider rate limiting so one slow API never blocked another.

Outcome. Frontend teams integrate once. Provider outages degrade gracefully instead of cascading.

Node.js GraphQL MongoDB Webhooks Meta · LinkedIn · GetResponse APIs
client graphql meta adapter linkedin adapter email adapter retry queue

E-commerce infrastructure that survives peak season

Context. The Very Group's online shop — one of the UK's largest online retailers, where traffic spikes are measured in multiples, not percentages. I worked on it as a Full Stack Engineer at Valtech.

My part. Traffic routing at the edge with Akamai EdgeWorkers and EdgeKV, sending each request to the right backend service per product. Services in Node.js/TypeScript on AWS Lambda with S3, DynamoDB, and MongoDB behind — all of it defined in Terraform, reviewable and repeatable.

Outcome. Infrastructure changes shipped through pull requests like any other code, and peak events became routine instead of all-hands emergencies.

Akamai EdgeWorkers AWS Lambda Terraform DynamoDB Node.js TypeScript
akamai edge workers + kv lambda ×N services route s3 dynamodb mongodb

Leading the backend of an automated tax-retrieval platform

Context. BlueDot's large-scale automated tax retrieval and data analytics platform, built at Sourcico — mass data collection and analytics with a full back-office on top.

My part. Technical lead and architect for a team of four. Owned the authentication service securing the platform, the document signing service for digital signature workflows, and the file storage and allocation service — plus the back-office frontend in Angular. Shipped on Kubernetes with Docker and Terraform on AWS.

Outcome. Core microservices the rest of the platform built on, delivered by a team I got to both lead and code in.

team lead · architect Node.js TypeScript Kubernetes Terraform Angular
back-office angular auth access signing documents storage files team of 4 · lead & architect

swipe to browse →

// api design

How I design an endpoint

A worked example covering the full lifecycle — create a resource, survive a retry, fail usefully, notify the caller. Every API I ship comes with an OpenAPI spec: if it isn't documented, it doesn't exist.

POST /api/v1/shipments Creates a shipment — retry-safe, evented, documented

REQUEST

curl -X POST "https://api.example.com\
/api/v1/shipments" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: idk_7f3a91c2" \
  -d '{
    "reference": "ord_2481",
    "to": { "city": "Skopje", "country": "MK" },
    "parcels": [{ "weightKg": 1.2 }]
  }'
Idempotency-Keysame key + same body → the original result, never a duplicate shipment
referenceyour order id, echoed back everywhere
parcels[]unknown fields are rejected, not ignored

RESPONSE — 201 CREATED

HTTP/1.1 201 Created
Location: /api/v1/shipments/shp_01hq8
RateLimit-Remaining: 58

{
  "id": "shp_01hq8",
  "status": "label_created",
  "reference": "ord_2481",
  "tracking": {
    "number": "MK4410882731",
    "url": "https://track.example.com/MK44…"
  },
  "createdAt": "2026-08-11T09:14:00Z"
}

RESPONSE — 422 UNPROCESSABLE ENTITY

{
  "type": "https://api.example.com/errors\
/validation",
  "title": "Request failed validation",
  "status": 422,
  "errors": [{
    "field": "parcels[0].weightKg",
    "message": "must be greater than 0"
  }, {
    "field": "to.country",
    "message": "not a supported destination"
  }]
}

WEBHOOK — shipment.delivered

POST https://your-app.example.com/hooks
X-Webhook-Signature: sha256=9f2c41ab…

{
  "id": "evt_9k2m",
  "type": "shipment.delivered",
  "occurredAt": "2026-08-14T16:02:11Z",
  "data": {
    "shipmentId": "shp_01hq8",
    "deliveredTo": "reception"
  }
}

IDEMPOTENCY

Timed-out POST? Retry it blindly. Same key returns the stored response — no duplicate side effects.

ERRORS

problem+json (RFC 9457) with field-level detail. Machines can parse it; humans can read it.

PAGINATION

Opaque cursors on every list endpoint. Offsets lie the moment the data underneath moves.

VERSIONING

/v1 in the path. Changes are additive only — anything breaking waits for /v2.

RATE LIMITS

RateLimit-* headers on every response, so clients back off before the 429, not after it.

WEBHOOKS

HMAC-signed, delivered at-least-once with backoff, and replayable from the event log.

// stack

Tools I reach for

RUNTIME

Node.js TypeScript JavaScript

DATA

PostgreSQL MySQL MongoDB CouchDB Elasticsearch Redis

INFRA

Kubernetes Docker AWS Terraform Linux

APIS & PRACTICES

REST GraphQL OpenAPI DDD CI/CD

// experience

Nine years of shipping backends

2025 — now

Backend Software Engineer · Worldly

Building and maintaining a leading sustainability measurement platform for the apparel and footwear industry. Platform architecture and infrastructure improvements for reliability and scalability; access management and data-privacy solutions for compliance; backend services, APIs, and database operations across CouchDB, Elasticsearch, and PostgreSQL in Node.js/TypeScript — with steady tech-debt reduction and type-safety improvements along the way. Continuously exploring modern frameworks and leveraging AI-assisted development tools to boost productivity and quality.

2024

Software Developer · markero.ai, via Connect Macedonia

GraphQL and REST APIs on MongoDB; integrated Meta (Facebook & Instagram), LinkedIn, and GetResponse APIs into one coherent backend for AI-assisted campaign publishing.

2022 — 2024

Full Stack Engineer · Valtech

Backend for The Very Group's online shop: Akamai EdgeWorkers/EdgeKV traffic routing, Node.js services on AWS Lambda with Terraform, DynamoDB, and MongoDB. Also built an internal events platform in Next.js and Contentstack.

2021 — 2022

Software Engineer · Symphony Solutions

Node.js services on AWS for an online casino platform.

2017 — 2021

Full-stack JavaScript Developer · Sourcico

From intern to team lead & architect of four engineers. Client projects: a real-time online auction platform, a multi-channel ad management platform, a satellite-phone emulator for testing without live satellite hardware, and BlueDot's automated tax-retrieval platform.

2017 — 2020

Lecturer & Trainer · SEDC Academy

Taught JavaScript, Web API & REST, DDD, and MEAN stack courses in parallel with engineering work.

2010 — 2016

Accountant · Lenbil, first career

Payroll, taxes, company registrations. Where the precision habit comes from.

EDUCATION

IT Engineering — St. Clement of Ohrid University of Bitola
Web Development — Seavus Academy, Skopje

BASED IN

Bitola, North Macedonia · remote-friendly

// teaching

I also taught this stuff

For two years I lectured at the SEDC Academy's web development branch. Explaining REST to a room of career-changers teaches you more about API design than any production incident. If your team needs someone who can mentor as well as ship, that's me.

01JavaScript, basic & advanced
02Web APIs & REST
03Domain-Driven Design
04MEAN stack & C# basics

// about

From debits and credits to distributed systems

I started my career as an accountant. Six years of payroll and tax filings taught me that precision isn't optional and that good systems beat good intentions — lessons that transfer surprisingly well to backend engineering.

Since switching to software in 2017 I've worked across e-commerce, iGaming, marketing tech, and sustainability platforms. I'm a DRY-principle supporter and a man of few words — I'd rather show you a clean diff than a long explanation. Lately DevOps has become a genuine passion: I like owning code all the way to production.

"Nothing is hard to do — it's either easy, or you haven't learned how to do it yet."

$ ping igor

Let's build something reliable

Open to backend and platform engineering work. The fastest way to reach me is email; I actually reply.