dbit.one© 2026
000
booting_
Loading experience0%
dbit.one
Who is accountable

Doniyor
Botirov.

Founder · Writes the architecture himself

You get the engineer who wrote the code, not an account manager with a deck.

Tashkent · UTC+5Fifth year in engineeringAnswers personally
Doniyor Botirov
Hover — the light follows your cursor

Position

Software is sold by hours and headcount. It is bought for outcomes and peace of mind. So instead of team résumés I show measurable things: what it was, what it became, and how it was measured.

I am a team lead by nature: I build the team around the problem and stay with it until release, rather than handing the project down a conveyor. In five years of engineering I have never seen a change of hands after signing do a project any good.

Any system is easier to make fast up front than to explain later why it is slow. I took the first paint of this site from 6.4 to 2.2 seconds — on my own site, not a client’s: someone else’s numbers cannot be checked, mine can, right now.

I publish failures too. The blog carries a breakdown of the bug that showed part of our visitors a blank screen instead of the site. A company that writes only about wins is not telling you everything.

What that means on a project

01

I write the architecture myself

The project does not change hands once the contract is signed. Whoever sold it, builds it.

02

You get me on calls, not a manager

Technical questions are settled in the conversation, not in a “let me check with the team”.

03

The warranty does not end with the invoice

Defects in code we wrote are fixed free of charge, with no expiry date.

04

I decline what I cannot carry

A “no” on the call is cheaper for you than a missed deadline three months in.

Check it on this site

Client systems are under NDA, and you should not take them on trust. This site, however, was built by the same hands, and everything in it is measurable — including what was done badly and later fixed.

6.4 → 2.2 s
First paint on mobile. Cause and measurement method are in the blog.
−79 %
Photo payload on phones after rebuilding the image pipeline.
0 → 60
Blocks readable without JavaScript. It used to be zero out of sixty.
42
Technical articles in three languages. Including a breakdown of our own mistake.

Systems I have built

Heavy equipment fleet managementGlobal manufacturer
National healthcare systemGovernment scale
AI assistant for physiciansUniversity hospital
Analytics layer for a retail bankFintech
CRM for a network of schoolsCentral Asia

Client names are under NDA. Names, contracts and reference contacts are shown on a call under a mutual agreement.

Open source

Client systems are under NDA. These four repositories are fully open — you can read them, install them and check them without asking me. The first is the method. The next two are where it is easiest to be wrong and hardest to notice: agreement between machines, and agreement inside one. The fourth closes the first one’s admitted limit: sampling finds bugs, it never rules them out.

The method
unflakeView on GitHub

Async bugs are not random. What is random is the interleaving the operating system happens to pick — which is why the failure shows up once in three hundred runs and never reproduces. unflake takes that choice away from the OS: time, timers and the order of ready callbacks all become values drawn from a seed. The same seed produces the same run, byte for byte. A found bug is shrunk to a minimal schedule and repeats on any machine.

TypeScriptMITZero dependenciesPublished on npm
The method: agreement between machines
bulwarkView on GitHub

Anyone can write leader election that works on a good day. The hard day is the one where the network splits, two nodes think they are in charge, a message from four seconds ago arrives twice, and a machine back from the dead brings a stale log. bulwark is Raft in TypeScript, held up by deterministic simulation: partitions, crashes and message reordering are drawn from a seed, the paper’s five safety properties are checked after every state transition, and every client history is verified linearizable. The centrepiece is the bug museum: each of its seven exhibits switches off exactly one rule of Raft and requires the harness to catch it — with a seed, and with a named property. One exhibit is a bug the harness found in the implementation itself.

TypeScriptMIT5 safety propertiesBug museum: 7 exhibitsnpm: @botiroff/bulwark
The method: agreement inside one
adyaView on GitHub

Every database advertises isolation levels. Almost nobody can show you what theirs actually admits. “We provide snapshot isolation” is two claims at once: that nothing weaker ever happens, and that it is genuinely SI rather than something stricter wearing the name. Neither is checkable by reading code — they are properties of executions, not of text. adya catches executions and interrogates them: on one side an MVCC engine with four isolation levels, where serializable is Cahill’s algorithm, the one PostgreSQL implements; on the other a checker that builds a dependency graph from the observed history, hunts for cycles in it, and names what it finds by the names in Adya’s thesis — G0, G1a, G1b, G1c, G-single, G2-item. Every level is held to both directions: it never produces what it must prevent, and it does produce what the next level prevents. Neither side is trusted alone — each convicts the other.

TypeScriptMIT4 isolation levels6 phenomena from Adyanpm: @botiroff/adya
Proof instead of sampling
pnueliView on GitHub

This repository exists because of one sentence in unflake’s limits section: hundreds of seeds is a very good fuzz run, not a theorem. Sampling schedules finds bugs and can never prove their absence; proving absence means visiting every reachable state, which is exponential. So the interesting part of a model checker is not the search but everything done to avoid searching: symmetry (six interchangeable processes give 15,625 assignments but only 210 multisets) and partial-order reduction. The core problem is that a broken reduction answers exactly what a working one answers — “no violation found”. So the exhaustive search is kept alongside, slow and unable to be wrong, and every specification must produce a matching verdict in both. Liveness is checked under weak fairness: a spinlock is caught by a counterexample, Peterson’s algorithm passes.

TypeScriptMITExhaustive search kept as ground truthnpm: @botiroff/pnueli

Direct line

Email
[email protected]
Phone
+1 (929) 435-5537
Telegram
@dbitone
GitHub
BOTIROFF-D
Reply
within one business day