Demitre Mender Applied AI Engineer

Sheet 01The brief Available for work

AI can write the code now.
Shipping it is still
the hard part.

I’m Demitre Mender. I build software that reaches actual people — native Windows applications, Cloudflare backends, licensing that holds, and update channels that check their own work and roll back when they are wrong.

Five products in production. Real installers, real payments, and real users telling me when I got it wrong. Every drawing on this page assembles as you scroll, because that is the whole argument.

Sheet 02 Specification General arrangement

Three things, and they are all the same thing.

Getting a model to answer is free now. Getting it into something a stranger can install, pay for, trust and update — that is the job, and that is where projects die.

01

AI-native delivery

I run coding agents as a real part of the pipeline — specify, build, audit, verify, release. The generation is not the valuable part. The harness around it is: audits that fail the build before a wrong name reaches a user, tests that run with no window open, and a standing rule that nothing ships on a green test alone.

  • Agentic workflows
  • Spec to ship
  • Automated audits
  • Release gates

02

AI inside the product

On-device inference where privacy and latency matter: screen text read aloud by local voice models, one-press dictation, and metadata chains that fail over between three providers and always name which one answered. A feature that silently degrades is a bug wearing a hat.

  • Local models
  • Failover chains
  • Streaming UX
  • Privacy-first

03

The unglamorous half

Licensing on Cloudflare Workers and D1. Stripe checkout that does not lock out a paying customer at two in the morning. Update feeds with size and hash checks, a health check after activation, and automatic rollback. Per-user installers that need no administrator. This is the part that decides whether a product survives.

  • Workers + D1
  • Stripe
  • Verified updates
  • Rollback

Sheets 03–07 The work Assemblies

Five products. Every one of them installs.

The source repositories are private — some of this is commercial, and some of it holds other people’s data. The products themselves are public. I will walk you through any of the code on a call.

Sheet 03 — Assembly A

VRChat Auto Invite

Commercial Windows product · solo · design, application, backend, billing, releases

The problem

Community managers were inviting hundreds of players by hand. The tools that existed were black boxes: they either got you rate-limited, or they did nothing and never said why.

What I built

A native control centre in C++20 and Qt 6. It reads the game’s own output log rather than scraping credentials, runs group invites and friend-instance invites as two independent queues, and puts every decision on screen in plain English — queued, sent, skipped, failed, rate-limited, already handled. Overlays stay locked inside the game window while it moves and resizes. Licensing and entitlements run on Cloudflare Workers with D1 and Stripe checkout.

The hard part

Living inside somebody else’s rate limits without becoming the reason a user gets banned. It honours Retry-After, keeps sender cooldowns separate so one workflow cannot starve the other, and holds queued work through an official outage instead of dropping it. When the game changed engine, I diffed real logs from both branches rather than guessing, and could say with evidence that nothing broke.

Visit the product site
Stack
C++20, Qt 6 / QML, Cloudflare Workers, D1, Stripe
Status
Shipping at V2.2.44, self-updating from a checksum-verified feed
Privacy
Credentials, cookies and activity logs never touch the licensing service

Sheet 04 — Assembly B

Anime Solution

Native desktop client · solo · C++20, Qt 6, libtorrent

What I built

A Windows client that finds a show, checks it out of your own library and plays it — discovery shelves, account sign-in with two-way progress sync, strict season, episode, audio and quality matching, an embedded player, and rich presence. Metadata falls over across three providers, and the interface always names which one answered, because a silent downgrade is how you lose trust.

The hard part — and the honest version

Five releases in a row failed to fix one paging bug. Every one of them passed its tests. The tests were exercising a component; the bug lived in the assembled application. The fix that finally worked moved the guarantee out of the view layer into a place that can be proven with no window open at all — and I now read the program’s own log before I tell anybody something is fixed.

Then I rewrote the application from the ground up around that rule. Same stack, same release pipeline, new core: no decisions in the view, nothing that cannot be tested headlessly, and no silent early returns. Full feature parity is the release gate.

Stack
C++20, Qt 6 Quick, libtorrent, Qt Multimedia, OAuth
Safety
Tokens held in the operating system vault; the update feed lives in its own repository so publishing source cannot overwrite trust metadata
Kept
A green harness test is not evidence the shipped application works

Sheet 05 — Assembly C

Auto Overseer

An autonomous agent inside a shipped game · C# · no mod loader

What I built

Twenty independent jobs that play the game the way a careful person would, with their own button inside the game’s real interface and every action explained in a log. No framework required: one library, registered through two plain configuration files the engine already reads at startup.

The hard part — six deciders is fifteen arguments

Six of those jobs could move the same character, each deciding alone. That is fifteen pairs which can disagree, and they did — five characters spent a night walking between two rooms while every job’s log line looked correct. Patching pairs is a losing game; a seventh mover makes it twenty-one.

So every move now comes from one plan, rebuilt each tick as a priority list, and a character can be claimed at most once per plan. Two jobs cannot contradict each other when only one job decides. If you are building multi-agent anything, this is the failure you are going to meet.

The method that made it possible

I stopped guessing. I wrote a small console tool that loads the game’s compiled assembly offline and prints real signatures, field names and decompiled method bodies. It answered in one minute what fifteen restart-and-hope cycles could not, and it caught four bugs where a name existed, looked right, and meant something else.

Stack
C#, .NET Framework, offline reflection and IL decoding, PowerShell audits
Discipline
Two audit scripts run before every release; they exist because every bug was the same bug
Published
Public release, with none of my own data in the repository

Sheet 06 — Assembly D

Project Zomboid Complete Server Project

Live service · website, backend, desktop control plane, game mod

What I built

Everything a small game community actually needs, in one place: a public website on Cloudflare Pages with a live status Worker and an owner panel, a native .NET Windows service and desktop dashboard for safe server control, and a published Workshop mod written in Lua. Continuous integration verifies the site build and the mod package layout on every change.

The hard part

Making a repository that is safe to share while still being able to restore a live server. Owner keys, remote-console passwords, player databases, world saves and logs are all excluded from history by design; the checked-in configuration carries placeholders instead of secrets. The recoverable state lives in a private, encrypted snapshot that a local watcher refreshes. I check what is actually in the tree after every commit rather than trusting the ignore file.

Visit the live site
Stack
Cloudflare Pages + Workers, .NET 10, WPF, PowerShell, Lua
Live
Public site, owner panel, 16-player server, Workshop item

Sheet 07 — Assembly E

Obsidian UI Starter

Internal design system · C++20, Qt 6, QML

What it is

The interface layer from my desktop products, stripped of every piece of product logic and kept as a clean foundation: a polished application shell, reusable themed controls, and a visual theme editor with a seven-role semantic palette, live preview and contrast feedback against accessibility guidance.

Why a client should care

I do not rebuild the shell for every project, and I do not hand over an interface that only looks right on my own monitor. Colour is semantic rather than hard-coded, so a rebrand is a palette change instead of a rewrite — and the contrast is checked rather than assumed.

Stack
C++20, Qt 6 Quick Controls, QML, CMake, GitHub Actions
Detail
Ships a screenshot mode so documentation images can never go stale

Also on the bench — smaller builds, same discipline

P·01

Local screen-reader pipeline

Anything on screen read aloud with nothing leaving the machine: on-screen character recognition feeding local neural voice models. No cloud key, no upload, no per-minute bill.

Python · OCR · local speech synthesis
P·02

One-press dictation

Hold a key, talk, and the text lands in whatever field has focus. Local speech recognition wired into the desktop as a single shortcut, because a feature you have to go and find does not get used.

Python · local speech recognition · desktop integration
P·03

A four-million-tile map

A community map site went offline for good. I rendered the game’s own world data into deep-zoom tiles — every cell, every floor — and served it from object storage, because a static host with a twenty-thousand-file limit was never going to hold it.

Python · tile rendering · Cloudflare R2

Sheet 08 Field notes Revisions

Six rules. All of them cost me something.

These are not opinions I picked up from a blog post. Each one is the scar from a specific week that went badly, and each one changed how I build.

  1. R·01

    Read the source. Never guess a name.

    I once burned roughly fifteen close-install-launch cycles guessing what a system’s internals were called. Now I read the compiled assembly offline and print the real signatures and method bodies. The same instinct applies to an API, a log format or somebody else’s service: look at what it actually does before writing code that assumes.

  2. R·02

    A green test is not a shipped feature.

    Five releases passed their tests and fixed nothing, because the tests exercised a component and the bug lived in the assembled application. I verify against the running program’s own log before I say something works, and I move guarantees to where they can be proven without a user interface.

  3. R·03

    No silent early returns.

    Three jobs ran for hours doing absolutely nothing and looked healthy the whole time, because the place they gave up said nothing at all. Every give-up point now states its reason, once. Counting lines in a log is the fastest audit there is.

  4. R·04

    One decider, not seven.

    Independent rules that touch the same resource will contradict each other, and the logs will look fine while they do it. Six movers is fifteen pairs that can disagree. Collapse them into a single plan, priority-ordered, each resource claimed once.

  5. R·05

    Ship it, or nobody has it.

    A fix that exists only on the main branch is a fix nobody has. Any user-visible change means bump the version, package it, publish it, and confirm the update channel actually serves it. Half the value of software is the delivery.

  6. R·06

    Your data stays yours.

    Credentials in the operating system’s own vault, never in a source tree. No customer files in a repository, checked after every commit rather than assumed. Local-first wherever it is possible. I would rather do more work than hold data I do not need.

It’s still not working.
Said by a user, correct three times running, while every one of my tests was green. That sentence is worth more than a passing build, and it is why the rules above exist at all.

Sheet 09 The operator Notes on the maker

I got here because something I used every day was broken.

No computer science degree. I started because a thing I relied on stopped working and it was obvious nobody was coming to fix it.

That is still mostly how it goes. A community map site went offline, so I rendered the whole map myself — every cell, every floor, no shortcuts. An automation tool I liked needed a whole framework installed, did three things and told you nothing, so I read the program’s own assembly and wrote one that does twenty and shows its work. A desktop application I wanted did not exist, so I learned Qt, built it, and sold it.

I am not precious about being right. Three separate times a user told me something was still broken while every test I had was green, and three separate times they were right. That gap — between it passed and it works — is the thing I actually think about. Most of what I know is scar tissue from closing it.

What I am good at is the half nobody puts in a demo. Anybody can get something impressive running on their own machine now; that became free. The hard part is still the update channel with checksums and a rollback, the licence check that does not lock out a paying customer at two in the morning, the audit that fails the build before a wrong name ever reaches a user. I would rather ship something small that holds than something large that impresses once and then quietly rots.

I work in the open with whoever hired me. I say what I did, whether it worked, and what I skipped. If a week went badly I would rather tell you on Tuesday than surprise you on Friday.

If that is the kind of person you need, we are going to get along fine.

  • Native Windows · C++20 · Qt 6 · QML
  • C# · .NET · WPF
  • Cloudflare Workers · D1 · Pages · R2
  • Python · PowerShell · Lua
  • Stripe · licensing · entitlements
  • Local model pipelines · on-device inference
  • Agentic development · evaluation harnesses
  • Reverse engineering · release engineering

Sheet 10 Scope of work Schedule

Four ways in. Pick whichever is closest.

If none of these fit, describe the problem anyway. I will tell you honestly whether I am the right person, including when I am not.

RefEngagementWhat it coversGood fit when
A Build it End to end, from a rough idea to something a stranger can install. Desktop application, web backend, or both. You get the interface, the backend, the installer, the update channel and the documentation — not a prototype with a to-do list attached. You have a product idea and no engineering team.
B Rescue it Something works on one machine and nowhere else, or an AI feature demos beautifully and falls over with real users. I find where the truth diverges from the tests, make the failure visible, then fix it and leave the harness behind so it cannot come back silently. It is eighty per cent done, and has been for months.
C Put AI in it Add a model to a product you already have, without a rewrite. Hosted or fully local, depending on what your data allows. Includes the parts people skip: failover when the provider is down, a visible answer to “why did it do that”, cost control, and an evaluation you can actually run. The demo works and production scares you.
D Set up the pipeline A shorter engagement. I set up the delivery half: automated audits, headless tests, versioning, packaging, signed and verified updates with rollback, and a release checklist your team can run without me. Then I hand it over. You can build, but shipping is the bottleneck.

Sheet 11 Sign-off Issue for construction

Got something that needs to actually ship?

One email is enough to start. I read all of them, and I answer within a day.

Signed Email me

A good first message has three lines

  1. What you are trying to build, in plain words.
  2. What is stopping you right now.
  3. Roughly when you need it, and roughly what you can spend.

No brief needed. No non-disclosure agreement needed to say hello. If I am not right for it, I will say so in the reply rather than after an invoice.