portfolio · 2026 moscow / remote · DESIGN RU/EN

ilya
doronkin.

AI Automation Engineer. I design agent-driven AI systems that cover the work of a whole team on their own: finance, analytics, CRM, websites and content production for one non-profit.

ilyadoronkin1914@gmail.com · @dojdikkkkkk every image is a real screenshot of a running system; sensitive data is hidden
about

The problem I solve

«Our data and processes are spread across a dozen systems, and there is no headcount or budget for a team. We need all of it to work, to run by itself, and to be visible in one place.»


skills
agent systemsAPI integrationdashboards and analyticsprocess automationn8nweb and deploymentCI/CDapplication securitydesign productionIT infrastructure
honest framing

Most of this work I do together with AI agents (Claude Code, Pi, and Hermes, my own harness). What I bring is designing the system, wiring unrelated services together, setting the task and checking the result. Every number in this portfolio is verified against a real artefact.


A note for an English-speaking reader. The client is a Moscow foundation that helps people living with HIV and runs prevention programmes, so every interface, document and screenshot here is in Russian; the captions explain what you are looking at. A few local terms that come up below: an information line is the foundation's helpline, the pharmacy is a programme that hands out medication, outreach means testing done off-site rather than in the office, and clients are identified by a pseudonymous code, not by name, which is why questionnaire data can be analysed at all.

case 01 · a live finance dashboard for a non-profit

All of the money
on one screen

The foundation's money lived in eight systems: two banks, a payment provider, the CRM, web analytics. Management could not answer the two questions that matter, how much money is there right now and how long will it last.

I designed a single data layer and pulled everything into a live dashboard: turnover, balance, runway (how many months the money covers), a 30, 60 and 90 day forecast, and risk flags. Strictly read-only.

8
external sources
0
incidents involving the accounts
Overview screen of the foundation's finance dashboard
real screenshot · the foundation's live dashboard · 2026-07 · amounts hidden

python · rest api · alfa-bank · t-bank · cloudpayments · yandex metrica · google search console

case 01 · in depth
finance: five income sources, spending by category · amounts hidden
donor cohorts and retention, benchmarked against the sector · emails hidden
the funnel from website to donation, traffic and UTM campaigns
reach of the foundation's services, pulled from the CRM: testing, helpline, medication

the dashboard answers both «where did the money come from» and «what did it do»

case 02 · telegram bot for tasks and shifts

Day-to-day operations
moved into Telegram

Tasks, volunteer shifts and the weekly helpline rota lived in group chats and Google Sheets. I built a bot that became the single entry point: a forwarded message turns into a task, shifts are booked with buttons, and the rota is calculated automatically.

The bot writes into the same database as the web board, so there is one source of truth. Onboarding is invite-only, with three cohorts of volunteers and staff.

Privacy: nothing about the people the foundation helps, and no HIV status, ever reaches the bot. That data stays in the CRM.

what it does
  • 01One inbox for tasks — forward a message, get a card with an assignee and a due date
  • 02Shifts and swaps — «I can't make it» sends a request to colleagues and waits for someone to confirm
  • 03Helpline rota — a weekly rotation of counsellors from Saturday to Friday, with a search for cover
  • 04Cron reminders — deadlines, overdue items, a weekly digest for the coordinator

node.js · telegram bot api · long-poll · sequelize · no third-party libraries

Knowledge graph built from the foundation's material
case 03 · knowledge graph

The whole organisation
as one graph

The website's code, the documents and the services are collected into a navigable knowledge graph: communities are detected automatically, links between documents and code are visible, and the graph can be queried in plain language.

The graph is a working tool: the site audit and the redesign planning were both built on it. A second graph indexes the archive itself, 4.6 GB of documents, so an agent finds the right file through the graph instead of walking folders. It is rebuilt every night; over the summer it grew from 1,303 nodes to 1,681.

2 638
nodes in the graph of site code and documents
479
communities detected automatically
1 681
nodes and 3,950 links in the second graph, over the archive

real screenshot · interactive graphify viewer · 2026-07-21

case 04 · the foundation's CRM v2, in production

I sorted the CRM
into what lives
and what is dead

The CRM had grown: testing, the helpline, support groups, medication. There were many variants of the intake questionnaire, but only one was alive. Since March 2024 counsellors had been filling in a single form of 27 questions; the other forty fields had been empty since April of that year, while the documentation still described them as current.

I checked the questionnaire against production data, removed four dead form variants and 25 dead questions from the reference table, fixed a duplicated question about education, and reworked the live form on the counsellors' notes. Then I split the scenarios by where the work happens: off-site testing got its own short questionnaire, its own table and its own report. The form that is called «universal» stayed what it actually is, the office one, even though its name does not say so.

Along the way I closed holes in access control: six routes accepted requests without authentication, and one of them handed the logins and names of every staff member to anyone who knew the address. I merged the medication programme into a single dispensing table, made permission changes apply without re-login, and made it possible to assign a staff member to several locations at once.

237
off-site testing records moved into their own module
6
unauthenticated routes closed
role · architecture, migrations, deployment
stack · node · express · sequelize · react
data · screens show a local instance with a test seed
Office testing questionnaire in the CRM
the office testing questionnaire, the only live variant of the form · local instance · empty form
Permissions and departments
permissions and departments · local instance · test staff from the seed

privacy: real questionnaires and HIV data never appear in a portfolio. That is deliberate, not luck

case 05 · redesign.spid.center

Website redesign:
from prototype
to preview

The foundation's website had aged. I went the whole way: first a UX prototype of the home page built on one idea, one page and three routes (someone who needs help / a donor / a reader), then the design system, then a working build on Astro that lives on the closed preview at redesign.spid.center.

The donation page is designed around the question a donor actually asks, «where does my money go». Articles are carried over from the old CMS by a script.

Home page
home page · local build = the preview
Donation page
donations: «where does your money go» · the split is a mock-up
Articles
articles · content migrated by a script

astro · design system · figma · the «three routes» prototype, then a production preview behind a password

case 06 · vera.school — website and CMS from scratch

A school website
and its own CMS
instead of 2020 code

The site of the foundation's medical school for young doctors ran on Rails 6.0, unsupported since 2023, with a dependency lock from 2018 and a database schema untouched since February 2020. The editor typed into an admin panel that had neither drafts nor preview, so a typo went live the moment it was saved.

I rebuilt the site and the admin panel from scratch as one isolated Node service: Astro with server-side rendering, SQLite, 44 routes. Every item now has a draft and a published version, and the draft opens in a closed preview. The admin and editor roles are separated: an editor prepares and publishes content but does not manage people and does not delete records.

The new service never talks to the old Rails API and writes nothing to production. It lives on a closed preview behind a password and noindex; the live vera.school and its admin panel are untouched, and switching over is the foundation's decision.

44
server-rendered routes
100
Lighthouse accessibility, no axe violations
Home page of the medical school website
real screenshot · closed preview · 2026-08-04
First-run setup screen of the editorial CMS
first-run CMS setup, password of 14 characters or more · this screen exists only until the first account is created

One story worth telling: photo uploads returned 502 with not a single error in the logs. Three image codecs were running in parallel inside the rendering process, memory reached the PM2 limit of 512 MB, the process restarted silently, and nginx answered 502. That is why the error log stayed empty while the draft still managed to save. I moved image processing into a separate short-lived worker and put the codecs in a queue: peak memory of the main process dropped to 122 MB, and a 4885 × 3258 photo now uploads in 7.7 seconds.

astro ssr · node 26 · sqlite · sharp · github actions · pm2 · nginx

case 07 · an agent platform for automation

The work of five specialists, covered by one person

A non-profit of this size has no analyst, no designer, no web developer and no sysadmin on staff, and no budget to hire them. I built a platform of skills for AI agents, where each skill is a separate job with its own access policy. Read-only by default for anything that touches money; secrets live in the system keychain, never in code.

35
skills in day-to-day use
13
external APIs: banks, payments, CRM, analytics
×5
roles covered by a single operator

alfa-bankt-bankcloudpaymentscrmunisender × 2yandex metricayandex directyandex webmastergoogle search consolepagespeedcruxbingkeychain secretsaccess policy registry

claude code · python · rest api · read-only policies

case 08 · site audit and visibility in AI search

I found why the site
was losing traffic

A full audit of UX, SEO, the donation funnel and the technical layer. The main finding: organic traffic from Yandex had collapsed, hidden behind growth in Google, with a diagnosis of the cause and a recovery plan. Separately, an audit of visibility in AI search (ChatGPT, Claude, Yandex) with semantic clusters. Generative engine optimisation is a skill few people have practised yet.

−58%
organic traffic from Yandex over a quarter — found and explained
111
articles analysed
58
tasks in a prioritised backlog

What came out of it is a road map: what to fix first, what will bring donations, what will bring reach. The same analysis repeats on any content-heavy site.

google search console · yandex metrica and webmaster · pagespeed / crux · knowledge graph

also

In progress and in production

details of any project on request, within the limits of the foundation's confidentiality

principles

Read-only by default.
Secrets outside the code.
Never invent anything.

If automation is able to move money, it should not be able to. If the data is not there, say so instead of guessing. Fix the cause, not the symptom. These rules are the reason there has been not a single incident in all the time I have worked with live accounts.

contact

Let's build
your system.

ilyadoronkin1914@gmail.com
telegram — @dojdikkkkkk
github.com/dojdikkkkkk · work projects are private
remote / hybrid · part-time / project / contract ilya doronkin · portfolio 2026