
4
4
Kyrgyzstan
2+ years of experience
Independent Android and Python developer working under the KHLab label from Bishkek, Kyrgyzstan. Seven apps live on the Amazon Appstore - Kotlin, Jetpack Compose, Room, Hilt, product flavors and in-app purchases for both Amazon and Google Play. Lately I build developer tools and agents that refuse to guess: StoreGreen, a preflight that tells you why a store will reject your Android build before you upload it, and Red First, which deletes a function's body to see whether any test notices. Nebius Certified Agentic AI Builder. I like problems where the answer can be checked instead of argued about.
.png&w=828&q=75)
Match 3 entry: a document question-answering container that only answers what it can prove. It runs on the mandated ROCm PyTorch base image with Qwen3-VL-8B shipped inside the image, so nothing is downloaded at evaluation. Index pass: every file is parsed on its own (PDF, DOCX, XLSX, CSV, TXT), and one unreadable, encrypted or unknown file never stops the walk; empty folders are fine. Text is indexed with BM25 in two passes, the second one keyed on product and part identifiers so two-hop questions can bridge between files. Revised documents supersede the withdrawn revision. Query pass: the model stays resident behind a unix socket, so each of the ten questions is a thin client call well inside the 30 second budget. The model may only answer with a value that appears in the passage it cites, and a number taken from the question must appear in that same passage; otherwise the container refuses with an empty answer and no citations. Citations are the minimal set of files the answer needs, not the retrieval list. On the sample corpus the pipeline scores 200/200 in a CPU smoke run with the 2B model; 45 unit tests cover parsers, trap files, two-hop bridging and refusals.
1 Dec 2026

Problem: about one in four online clothing orders comes back, and size and fit is the top reason (Coresight Research, 2023). The reasons are already in the reviews, but nobody reads 300 reviews per product. User: fashion sellers and rental shops who need to know which items to fix first and what to change on the listing. What it does: Gemma 3 12B runs on an AMD Radeon PRO W7900D with ROCm and PyTorch. Pass one reads every review and returns the fit direction (runs small, runs large, true to size), other causes (length, fabric, colour vs photo, comfort, zipper), the exact customer quote and a one-line fix. Code counts the shares per product. Pass two sees only those counts and quotes and writes the size note, the description sentence and the photo to add. The seller gets items ranked by fit-return risk, a report per item, copy-ready text and a money estimate. A live notebook runs it on the AMD GPU: 30 reviews of a new item in 27.8 s. Proof: Rent the Runway renters label every review fit, small or large. We hid the label and compared with the keyword rules a seller would write. 900 reviews: macro-F1 0.737 vs 0.606; Gemma finds 64% of "runs large" reviews, rules 40%. 40 products drawn after the prompt was fixed, run once: Gemma ranks items that run large at Spearman 0.87 vs 0.72; on items that run small rules are level (0.84 vs 0.88). The README shows the full history, including a prompt that over-counted and how it was fixed. Why AMD and open weights: one 48 GB Radeon card holds the model in bf16 and the customer text never leaves the seller's GPU. Next: vLLM on AMD Instinct, Shopify imports, A/B test of the size note against return rate.
18 Oct 2026

On 10 September I uploaded an Android app to the Amazon Appstore. On 11 September it was rejected: "IAP displays error." On my test phone the purchase worked. The build was missing one file — the app's own AppstoreAuthenticationKey.pem — which no emulator can reveal, because an emulator has no Appstore on it. The fix took four minutes. Getting back to a published app took 73 hours and two more uploads. That is the workflow StoreGreen improves: release and deployment. The reviewer is the first thing in the pipeline that checks whether a build satisfies the store, and it runs after you upload. Between writing the code and learning it is wrong there is a queue measured in days, and everything that goes wrong in that gap is knowable from the repository in advance. Nothing looks. StoreGreen is a preflight for Android releases. It reads a project the way a reviewer would: merges the manifests in Gradle's own order, resolves versions out of libs.versions.toml, build.gradle or buildSrc, and reads the bundle you are about to ship: the Amazon purchase key, the declared receiver, the alignment of every native library, whether one store's billing leaked into another's. Each finding names the rule, the file, the line and the fix. Exit code 1 means a store would reject this. --fix applies the deterministic repairs and re-scans; --explain-rejection maps a rejection e-mail back to rules and lines. Three things make it worth a judge's attention. It covers ground nothing else does. The closest tools — rejectproof, app-store-preflight-skills, store-preflight-mcp — are iOS, or Play policy only. None checks Amazon Appstore in-app purchasing, and none maps a rejection e-mail to a line of code. It is measurably right on real software. I measured the expected answers on four of my own shipping bundles before a line of it existed, so the acceptance test had a known result. Then it ran over 210 public Android repositories found by searching GitHub. 44 of them contain no Android module at all, and it says so rather than reporting them clean. Of the remaining 166, 88 carry a BLOCK finding — more than half of real Android projects would be refused by Google Play today — and in 50 it named a line it could not resolve. Zero crashes. It also found two defects in my own published apps I did not know about: a native library not aligned for 16 KB pages, so that app cannot be updated on Play after 1 February 2027, and another shipping Play's billing library inside its Amazon build. It refuses to guess. A Wear OS app at targetSdk 35 is correct, not a violation — the required level depends on form factor, and the report names the one it decided for. A key absent from a public repository is a secret kept properly. A value that comes from an environment variable is reported as cannot be determined, with the line it gave up on. Every run prints how many rules were decided, undecidable, not applicable and not implemented, so a report can never imply coverage it does not have. The deadline is real: every Play extension for API 36 and Billing 8 expires on 1 November 2026.
27 Sep 2026

At the end of a shift a construction foreman reports hours out loud, and weeks later a worker disputes the number on his paycheck. The only record is the foreman's memory. CrewVoice keeps the habit - talking - and adds a record that can be checked. The foreman presses Start and says 'Jose worked nine hours today'. The agent runs on the AssemblyAI Voice Agent API (speech in, speech out, tool calls in the middle) and calls record_hours, which only ever creates a PENDING row. The agent reads the name and hours back; the row is confirmed only after the foreman says yes. Pending rows never reach payroll. The rules live in the tools, not in the prompt, so the model cannot talk its way past them: hours outside 0-16 for one day are refused and re-asked; a name that is not on the crew list comes back as a question with candidates, never a guess; a second entry that pushes someone past a full day asks whether it replaces the first. Names are folded before matching (accents, first names, surnames, short forms), so 'Jose' from speech recognition and 'Jose Ramirez' on the crew list are the same person, and English and Spanish reports land on the same sheet. At the end of the day the agent lists who was never mentioned. /export.csv contains confirmed rows only, each with heard_as (what recognition produced) and source_utterance (the sentence it came from), so a disputed hour is settled by the record. Stack: FastAPI bridge that keeps the API key on the server, WebSocket to AssemblyAI with PCM16 24 kHz audio, AudioWorklets in the browser. Deployed on Render, MIT licensed.
30 Sep 2026