Dmytro Galko

Business automation — Python, Rust, TypeScript. Bulgaria, working with clients across the EU, UK and US.

I build the unglamorous tools businesses run every day: data reconciliation, catalogue and deliverability audits, webhook-to-CRM integrations, and the monitoring that tells you an automation stopped working before a customer does.

Everything below is open source and runs on a clean machine with one command. Each repository has its own tests in CI, documents what it deliberately does not do, and where a README claims a number, the script that produced it is in the repository.

Command-line tools — Rust

csvdiff

Diffs two CSV exports by key and reports what actually changed. Two million rows in 2.8 seconds, a per-column breakdown with counted transitions, and number/null normalisation — so a migration report reads as 9 809 real changes instead of 995 000 rows of timestamp noise.

Rust13 testsbenchmark in repoprebuilt binaries

leakscan

Offline check of what leaves with a file before you send it: tracked changes with the deleted text still readable, review comments, hidden worksheets, PDF attachments, GPS coordinates in photos, validated card and IBAN numbers.

Rust38 testsno network at any point

imgdupe

Perceptual-hash duplicate finder. Complete-linkage grouping, so unrelated pictures never chain together through a path of small steps — and it writes a delete script for you to read instead of deleting anything itself.

Rust19 testsbenchmark in repo

linkscan

Crawls a site and reports the links that are genuinely broken, keeping bot protection and slow third parties out of the "broken" column — which is why the report still gets read after the second run.

Rust15 testsexit code for CI

Integration tooling — TypeScript

webhook-rewind

Record the webhooks a provider sends you once, then replay them at your own code as often as you need — re-signed for Meta, GitHub, Shopify or Stripe, so the receiver runs its real verification instead of having it switched off for the debugging session.

TypeScript30 testsno runtime dependencies

cra-report

Since 11 September 2026 a manufacturer placing a product on the EU market has 24 hours to notify ENISA of an actively exploited vulnerability in it. Finding vulnerabilities is not the hard part — any scanner hands you a hundred. This says which of them starts the statutory clock, and drafts the Article 14 notification for the ones that do.

TypeScript28 testsOSV + CISA KEVno API key

api-drift

Records the shape of a JSON API and reports when it changes: removed fields, changed types, values that can now be null. Exits non-zero in CI, so a partner's silent rename stops being something you find out about two weeks later.

TypeScript25 testsruns in cron or CI

Business automation — Python

invoice-reconciler

Matches a bank statement against open invoices in five passes — references, part payments, batch transfers, instalments — and reports only what does not add up. Standard library only.

Python24 checksno dependencies

whatsapp-crm-connector

WhatsApp Business Cloud webhooks into a CRM: signature verification, instant acknowledgement plus queue, de-duplication, conversations logged against both the contact and the company, the 24-hour window, token refresh.

PythonFastAPI42 tests

email-deliverability-check

Finds why a domain's mail lands in spam: SPF lookup limit, duplicated records, revoked DKIM keys, DMARC stuck at p=none, missing MTA-STS. DNS only — no access to the mailbox needed, batch mode for client lists.

Python17 checksbatch mode

lead-responder

Answers a web enquiry in under a second: scores it, writes a personal reply, offers real call slots, escalates the hot ones and files the spam. Rules live in YAML, no API keys.

Python19 checksrules in YAML

Try one in thirty seconds

curl -sSL https://github.com/dkautomation23/csvdiff/releases/latest/download/csvdiff-v1.0.0-x86_64-unknown-linux-gnu.tar.gz | tar xz
./csvdiff-v1.0.0-x86_64-unknown-linux-gnu/csvdiff before.csv after.csv --key customer_id --ignore updated_at

Every release carries a binary for Linux, macOS (Apple silicon) and Windows, each built and tested on the platform it targets rather than cross-compiled.

How I work

Work with me

Something breaks and nobody notices

A workflow that stopped running, an API that changed shape, a feed half-empty for a fortnight. Monitoring that names the failure, not a dashboard nobody opens.

Two systems that will not agree

Webhooks into a CRM, a bank statement against invoices, a catalogue against a supplier feed. Signature verification, de-duplication, retries and the 3am cases.

Data that has to be right

Migration checks, reconciliation, audits of a catalogue, a domain's mail or a site's crawlability — with the numbers reproducible rather than asserted.

Rescue work

An automation someone else built and left. I will read it and tell you honestly whether it is worth repairing or worth replacing.

Tell me what breaks today and what it costs you: hello@dkautomation.dev. You get back an approach and a number, or an honest “this is not my job” and who to ask instead.