PM patryk malinowski

Three of the four.
And the edge between them.

nina · luna · aria · cloudflare workers · d1 · durable objects

Multimedia understanding, and the unglamorous layer underneath it: the part that has to survive a closed tab, a paused Space and a user who refreshes mid-answer.

01 What I work on

NINATwo-pass ASR with a confidence gate, semantic segmentation, bi-encoder then cross-encoder retrieval, VLM synthesis that keeps its timestamps
LUNAMap-reduce over mixed media with explicit character budgets at every stage, so nothing truncates silently
ARIADurable Object per conversation, append-only event log, turn clustering, idle alarm, structured bubble contract
EdgeThe Pages Worker: auth, page authorisation before HTML is served, signed use tokens, server-driven model turns

02 Problems I spent the most time on

Not the model choices. These.

Answers that outlive the tab

A model turn takes minutes and a browser can close at any second. Runs are driven from the Worker and written to the database as they complete, so the stream is lost but the answer is not.

ctx.waitUntil · partial answers persisted · pending state reconciled on read

Paying only for what worked

Quota used to be charged on the attempt. A paused Space could burn a user's whole daily allowance on error messages. It now moves when a model delivers, and where a token must be minted first, the use is refunded, guarded by the token id.

one refund per token · signature and freshness checked

Trusting the client with nothing

The Space is public, so anyone with the URL could use the model. Every use mints a short-lived HMAC token, and page access is checked at the edge rather than by a redirect the browser can ignore.

HMAC-SHA256 · TTL 120 s · edge check before HTML

One session, honestly

Two tabs on one account should not quietly spend the same budget twice. A claim plus a heartbeat, newest wins, and the loser is told rather than left guessing.

heartbeat 20 s · stale 45 s

03 Stack

ModelsWhisper, Qwen2.5, Qwen3-VL, CLIP, pyannote, gemma. Open checkpoints, no single vendor in the critical path.
ServingGradio on Hugging Face Spaces, driven over the queue API rather than the client library
EdgeCloudflare Workers, Pages advanced mode, D1, Durable Objects, R2
FrontNo framework. Plain modules, because the thing it has to do is stream text and not break on a phone.