I build production software with AI coding agents, and I run it myself. Claude Code writes the code, Codex audits it independently, and I write the specs, set the guardrails, make the decisions and do every deploy. In 2026 this process put five systems into production, from a real-time crypto trading platform to a loyalty program used by a salon’s customers.
Before this I spent eight years in business roles: B2B sales for a corporate e-learning company, market research for clients around the world, digital marketing, and hotel online sales. I hold an MBA in International Business. That is why my AI work starts from a real business problem and ends with something people can use every day.
5systems live in production
1,000+commits across 7 product repos
6,500+automated test functions
200+independent AI audit verdicts
Selected work
Six systems, five of them live
Search memory for AI coding agents (RAG)
Working, measuredOct 2026720 documents · 55 test questions · 458 tests
A private search engine over 720 of my own documents, so Claude Code and Codex find past decisions before they build. Five search methods, measured on 55 questions frozen before the engine’s search code.
- Measured on held-out questions. On 9 English in-scope questions held out from tuning, the chosen method matched the answer key in its top 5 section groups for 7 of them (77.8%). The target was 8.
- Five search methods compared: meaning search, keyword search (BM25), the two merged by rank, a router that uses the merged list when a question names an ID, and a cross-encoder reranker, chosen by a rule written before the first run.
- Local and private. PostgreSQL with pgvector on my own PC; no cloud database and no outside embedding API. Before storage, pattern-based rules leave out files that look like credentials or customer records and blank out recognised secrets; they can miss things.
- Audited at every step. Codex audited each of the six build cards: 13 rounds, 11 FAIL and 2 PASS. Each FAIL ended in a fix or a decision I recorded.
Hardest problem
Tuning on the questions I report on made search look better than it is. Improving search raised the top-5 score on the 29 open questions from 79.3% to 86.2%, with more text in each result. On 9 questions held out from tuning it scored 77.8%: close to the untuned run, but on different questions, and one short of my target. Without the sealed set, I would have reported 86.2%.
Tech: Python, PostgreSQL + pgvector, bge-m3, BM25, bge-reranker-v2-m3, pytest
Read the case study →
Live, real moneyMar–Sep 2026480 commits · ~111k lines · ~4,000 tests
Three services that stream live order data from four crypto exchanges (Binance, Bybit, OKX, Hyperliquid), score it with a rule engine, and place real trades on Bybit. A demo copy runs the same code, so every change is tested on demo before it goes live.
- Data collector for 7 live exchange feeds and 6 coins, updated every 5 seconds and served over a signed private API.
- Signal engine that checks every trade idea against a chain of rules. Restructured from one 3,858-line file into six packages, with parity tests checking that its decisions stayed identical.
- Trade executor with safety first: every entry is followed straight away by its stop-loss, with a market close as the planned response if the stop is rejected, plus a kill switch and checks against the exchange every 30 seconds.
- A/B test harness that pairs demo and live trades and compares them with a proper statistical test.
Hardest problem
The data collectors were silently dropping trades. Five of seven feeds kept only the last trade in each batch from the exchange. I had counters added first to measure it: 65–81% of trading volume on two exchanges was being lost. After the fix, all older data was marked as pre-fix and kept out of any recalibration.
Tech: Python (asyncio), WebSockets, FastAPI, SQLite, pandas, Bybit API, PM2, cron, Telegram alerts
Read the case study →
LinkedIn content agent
Live, weeklySep 2026, 10 days to launch44 commits · 100 tests
An AI agent that drafts LinkedIn posts teaching Cambodian business leaders how to use AI in real work. It writes each post and its image, checks them, and sends them to me in Telegram. Nothing is published until I approve it. My LinkedIn posts about AI at work are drafted by this agent.
- Structured output. The model must return a strict JSON format, and every answer is validated before use.
- Automatic quality checks. Rules catch made-up stories, promised results and sales language. A failed draft goes back to the model with the exact problems, up to three tries.
- Facts with sources. Every number in a post is matched against a list of sourced facts and shown to me before I approve.
- Contained AI. The model runs locked down, with no internet tools and no access to publishing passwords.
Tech: Python, Pydantic, Codex CLI (first version on the Claude API), Telegram Bot API, SQLite, Typefully
Read the case study →
Salon loyalty bot
ខ្មែរ · ENLive with customersAug–Sep 2026, live within six weeks303 commits · 4,124 tests
A Telegram loyalty program that replaced paper stamp cards for a salon in Cambodia. Staff give points at the counter. Customers check their points, rewards and a personal QR code in Khmer or English.
- A points record that can’t be edited. The database itself blocks changes and deletions, and corrections are added as new entries, like accounting.
- A simple staff flow: enter the amount, preview, confirm.
- Khmer first. All Khmer text is written and approved by the owner.
- Tested hard. Deliberate bugs are planted after each change to prove the tests catch them. The last two changes caught 77 of 77 and 34 of 34.
Tech: Python, aiogram, PostgreSQL, SQLAlchemy, Alembic, pytest, GitHub Actions
Read the case study →
Ball Khmer football bot
ខ្មែរ · ENLiveFeb–Aug 2026201 commits · 845 tests
A Telegram bot for Cambodian football fans with live scores, fixtures, a prediction game, match alerts and a paid VIP tier, in Khmer and English.
- Prediction game with points, streaks, badges, a monthly leaderboard and referral codes.
- Live alerts checked every 60 seconds during matches and sent when a score changes, and a morning preview in each user’s language.
- Prediction tracking. Match predictions come from an outside ML service. The bot saves them before kickoff and records results after, so accuracy can be measured honestly over time.
Hardest problem
When the data provider failed, the bot kept the empty answer, so a busy day could show “No matches today” and the 8 AM preview could reach every user without its predictions. Now it says the data is unavailable instead of guessing, and the audit caught two more timing bugs before release.
Tech: Python, python-telegram-bot, SQLAlchemy, SQLite, Redis, APScheduler
Read the case study →
Crypto news brief
LiveSep–Oct 202637 commits · 283 tests
A private Telegram news service: two daily digests plus 24/7 alerts on hacks, exchange outages and US regulation, collected from 11 free sources with a source attached to every item.
- No AI where it isn’t needed. Simple rules handle selection today. An AI model will be added only when a test shows it improves the result enough to justify the cost.
- Tested on real output. When a review of live digests failed on quality, version 3 fixed it by merging duplicate reports of the same incident into one story.
Tech: Python, SQLite, systemd timers, Telegram
- AI coding agents
- Claude Code, Codex CLI, project instructions (CLAUDE.md, AGENTS.md), custom skills, sandbox and permission setup, builder–auditor review loops
- LLM applications
- Structured JSON output, automatic validation and retry, human approval steps, prompt caching, running models safely
- Backend
- Python, FastAPI, Telegram bots (aiogram, python-telegram-bot), PostgreSQL, SQLite, Redis, SQLAlchemy, REST and WebSocket APIs
- Operations
- Linux servers, PM2, systemd, cron, GitHub Actions, backups, monitoring and alerts
- Testing and data
- pytest, mutation testing, A/B testing, statistics, pandas, Excel, market research
- Business
- B2B sales and negotiation, digital marketing, customer relationships, staff training