30+ years in Education IT

I started on a 386.
I ended up running EMIS for 4.2 million children.

My first machine was a 386 with Windows 3.1. Thirty years later I am Head of IT at the Ministry of Preschool Education of Uzbekistan, responsible for EMIS infrastructure at national scale — and still writing the migration files, the service classes, and the Angular components that keep it running.

— Dr Khindol Madraimov, Tashkent

Dr Khindol Madraimov at Sagalassos, Turkey
Career Snapshot Currently shipping
4.2M
Students on EMIS
30+
Years in Education IT
28
Years in ministry IT
Dr Khindol Madraimov
Head of IT · Ministry of Preschool Education — Uzbekistan
Last deployment successful
Async Alert Queue · POCOR-9509 · production

Activity · live feed

Recent posts
on LinkedIn

Short-form writing — mostly about AI tooling, agentic workflows, and things I figure out while running EMIS at the ministry. Follow on LinkedIn →


What I do

End to end,
not over the fence

I write the migration, the service class, the Angular component, the feature tests, and the release note — then defend the scope in the ticket thread.

Async Infrastructure

Alert queues, webhook processors, scheduled workers. Things that used to block the UI now run on their own clock, with retries, structured logging, and supervisor-managed workers.

Role & Security Model

Security role functions, homeroom vs teacher hierarchy, excluded-roles bypass, per-module visibility. Rules expressed in data, not scattered across templates.

Deployment Hygiene

Log-file ownership races between cron and Apache users. Swagger regeneration steps forgotten on deploy. The recurring bugs that masquerade as code — fixed with documentation and process, not more code.

Honest Re-estimates

If a one-day ticket turns into a week of cross-cutting work, I say so clearly and break down why. Unflagged scope creep always becomes somebody else's problem later.

Mentoring Juniors

My instinct is to teach the agent-assisted workflow — read the Swagger, write a reference file, ask the assistant for the function with debounced search — rather than hand down finished code. Goal: the junior ships the next feature without me.


How I work

Read the code first,
write the code second

Four habits that have survived thirty years of changing stacks.

01

Read the code

Before writing any fix I read the Table class, the Trait, the migration, and the last three commits on the file. Most bugs are already described somewhere in the code — in a comment, a TODO, or a test.

02

Estimate honestly

If a one-day ticket has grown into a week of cross-cutting work, I re-estimate in the ticket with a line-by-line breakdown. Dev subtotal. QA allowance. Full cycle. Scope creep flagged out loud becomes tomorrow's resource, not tomorrow's crisis.

03

Ship end-to-end

One branch covers migration (with backup tables), API, frontend, feature tests, and release doc. Nothing is thrown over a fence. The tester gets a "what to click" section in plain language.

04

Own the deployment story

Cron user vs Apache user. Swagger regeneration step. Permissions on storage/logs/. Migration order on remote. The tedious things that always come back if nobody writes them down — I write them down.


Writing & Code

Work in the open

A public trail of code, writing, and technical arguments going back years. Including one phrase I still defend: "Crash and Quit Driven Development."

"

Crash and Quit Driven Development: if the feature can survive an unexpected kill -9 and a restart, it's a feature. If it needs a clean shutdown to preserve state, it's a liability. Written in about it on the blog since I first ran OpenEMIS in production.

drhindol.wordpress.com
Technical blog — PHP, Docker, MySQL, Python
"

Tooling I've extracted from the day job and published: openemis-ai-assistant · openemis_docker_dev · claude-code-agents · playwright-record-mp4. When a solution turns out to be useful outside the domain, I rewrite it for a general audience and push it up.

github.com/tixuz
28 public repositories since 2016
"

Personal projects that belong here too: edusys (this very site you are reading), caffecito (a small café ordering tool), gws-sheets (a Claude Code skill), soulmate, namozimbot. Not everything I build is enterprise-scale. Some of it is just for me and my family.

Dr Khindol on a trip in Korea, wearing the Uzbekistan national team jacket
On the road in Korea, in the Uzbekistan jacket. The best engineering is done by people who also remember to walk away from the keyboard.
Side projects
Because "only production code" is a sad life
Personal repos at tixuz

Case Studies

Real systems.
Real results.

Temple of Apollo, Side, Turkey
Temple of Apollo, Side. Structures that stayed standing for two thousand years are worth taking notes from.
All Case Studies
OpenEMIS Core
OpenEMIS Core — Async Platform

From Blocking Alerts to an Async Queue

Migrated the alert system from synchronous CakePHP sends — which were blocking the UI during attendance marking — to an asynchronous Laravel queue. Shipped alert_queue table, polling worker, Email and SMS senders with Twilio credentials in the database, a reusable QueueableAlerts Eloquent trait, and a deployment guide covering cron, nohup, and supervisor.

POCOR-9509 Laravel Queue Async Infrastructure
Discuss a similar migration
New Feature
OpenEMIS Core — Institutions

Registrations & Accreditations, End to End

Two new institution-level features designed and delivered across the full stack: database tables with the backup-tables migration pattern, Laravel v5 API with Swagger regeneration, three feature test files, two new CakePHP ControllerActionTable classes, security-role seed data, and a mini client that writes to the v5 endpoints for ministry-of-education sync flows.

POCOR-9610 Laravel v5 API CakePHP 5
Discuss a similar feature
Shared Trait
OpenEMIS Core — Profiles

One Trait, Four Profile Tables

Built StaleProfileBannerTrait — a shared Trait integrated across four profile index tables (Student, Staff, Institution, Classes). Unified date-math, threshold colours, hover tooltips, and banner copy into one place. Three lines of integration per table, zero duplicated logic.

POCOR-9593 Cross-cutting Refactor
Discuss a similar refactor
Publications

Another life,
in print.

Before and alongside the EMIS work, I've been an editor and translator with Издательство Диля in Saint Petersburg — roughly a decade of books on Islamic studies, plus one I wrote myself. Nobody expects a published Arabic-language workbook from an EMIS engineer. That is rather the point.

Greek inscription: ΟΣΙΩ ΚΑΙ ΔΙΚΑΙΩ — piously and justly
ΟΣΙΩ ΚΑΙ ΔΙΚΑΙΩ — "piously and justly". A stone I stopped for on the road. It is still how I try to write code.
Author: Арабский язык. Пропись. Алфавит, чтение, письмо — co-authored with Ибн Мирзакарим ал-Карнаки, Диля 2020, ISBN 978-5-88503-930-7
Editor & translator of 10+ works on Islamic studies, published 2006–2022
Distributed across 83 physical bookstores in Russia