{"slug": "i-had-qwen-build-a-qwen-powered-app-and-sat-in-the-reviewer-s-chair", "title": "I had Qwen build a Qwen-powered app — and sat in the reviewer's chair", "summary": "A developer built QuotePilot, an AI-powered app that automates cross-border B2B price quotes, using Qwen models for both runtime and development. The entire app was written by Qwen models for under $1 in API costs, with the developer reviewing and accepting or rejecting each piece of code. The project highlights the effectiveness of precise interface descriptions for code generation and the importance of human oversight in AI-assisted development.", "body_md": "Most hackathon posts are about what the AI *does*. This one is also about who\n\n*wrote it*. **QuotePilot** — an autopilot that turns a cross-border B2B inquiry\n\nemail into an approved, bilingual (EN/中文) price quote — is powered by Qwen at\n\nruntime. But the app itself was also largely *written* by Qwen models, dispatched\n\nthrough a tiny harness while I sat in the reviewer's chair and accepted or\n\nrejected each piece. Total model spend for the whole build: **under $1 of the\n$40 hackathon credit.**\n\nHere's what that actually felt like, where it was magic, and where I had to keep\n\nboth hands on the wheel.\n\n`judge`\n\n/ `qwen2026`\n\n)A US software company selling into China answers every inquiry email by hand:\n\nread the ask (often in Chinese), look up pricing, apply volume discounts,\n\nconvert USD⇄CNY at today's rate, and draft a bilingual quote with the *right*\n\ncross-border legal and tax terms (HKIAC arbitration, Chinese text controlling,\n\n\"we can't issue a fapiao\" note). It's 1–2 hours per inquiry, and the mistakes —\n\na wrong rate, a missing tax clause — are the expensive kind.\n\nThat's a real workflow with a real brake pedal built in: someone always reviews\n\nthe quote before it goes out. So the design wrote itself — an agent that does\n\nthe whole run in under a minute and **pauses for exactly one human decision.**\n\nQuotePilot runs a six-stage pipeline — intake → live FX → pricing → rule risk →\n\nAI risk sweep → bilingual drafting — then stops at a human gate. Three Qwen\n\nmodels split the work:\n\n| Role | Model |\n|---|---|\n| Planner / bilingual drafting | `qwen-max` |\n| Extraction + risk-sweep workers | `qwen-flash` |\n| Strict structured output (catalog mapping) | `qwen3-coder-plus` |\n\nThe single most important line I drew: **the LLM never does arithmetic and never\nwrites legal terms.** Every price is Python\n\n`Decimal`\n\n, computed in code. Every\n\n```\n# The model maps \"we want CitizenReady for 150 seats\" → SKU CR-ENT.\n# The code does the money — always.\nnet = (unit_price * qty * (100 - discount_pct) / 100).quantize(CENT, ROUND_HALF_UP)\n```\n\nI built a ~150-line dispatcher (`scripts/qwen_dev.py`\n\n): hand it a task spec, it\n\nsends the spec to a chosen Qwen model, parses the returned files into a staging\n\narea, and appends token usage to a ledger. Nothing lands in the repo until I\n\nreview it. Over the build, Qwen wrote the FastAPI backend, the approval\n\ndashboard, the settings UI, the runs index, and more — fourteen dispatches,\n\n**$0.81 total**, a few cents each. Even the demo video's voiceover is Qwen\n\n(`qwen3-tts-flash`\n\n).\n\nThe pattern that emerged: **describe the interfaces precisely, and a code model\nfills them in impressively well.** When my task spec pinned down exact function\n\n`qwen3-coder-plus`\n\nproduced code**Alibaba Cloud's fcapp.run domain force-downloads HTML.** My first deploy\n\n`curl`\n\nbut the browser downloaded the page instead of rendering it —`Content-Disposition: attachment`\n\nand forbids 3xx`fetch()`\n\ndoesn't care about the download header, and now the** custom.debian10 ships Python 3.7, not 3.10.** The docs promised 3.10. An\n\n`custom.debian12`\n\n**Don't ask a code model to re-emit a 70 KB file.** For one big frontend change\n\nI asked Qwen to return the whole updated `index.html`\n\n. It gave me back a file\n\n*23 KB smaller* — it had silently dropped an entire settings module and never\n\nimplemented the feature I asked for. Lesson learned: give a code model the\n\n**changed functions**, not the whole file, and diff the result. I hand-wrote\n\nthat feature instead.\n\n**An adversarial review round caught 11 real bugs.** Before shipping the\n\nmulti-company refactor, I ran a small multi-agent review — finders proposing\n\nbugs, independent verifiers trying to *refute* each one. It surfaced a\n\ndiscount-field name mismatch that would have 422'd every settings save, and a\n\nstored-XSS in a free-text config field. Both would have shipped. Verified\n\nfindings only; the skeptics killed the noise.\n\n**Filming the demo caught the best bug of all.** The demo video is recorded\n\nprogrammatically (Playwright drives the real app; ffmpeg cuts each scene to the\n\nvoiceover). While reviewing the edit-then-approve scene frame by frame, I\n\nnoticed the issued quote document still showed the *pre-edit* numbers — the\n\norchestrator was rendering the quote object it held before the human gate,\n\nwhile the edit endpoint had replaced the gate's copy. On-screen: totals said\n\n$32,550, the artifact said $21,930. One-line fix, a regression test, redeploy —\n\nand a new rule: **watch your own demo like a judge would.**\n\nIt would have been easy to make QuotePilot fully autonomous and call it a day.\n\nThe interesting product decision was the opposite: make the pause *good*. The\n\noperator sees the drafted quote, the risk flags, and a plain-language summary,\n\nand can **approve, reject, or edit** — adjust quantities, prices, discounts,\n\nadd or remove line items. When they edit, the server re-prices in `Decimal`\n\nand\n\nre-renders the document; approve then issues exactly what they saw. A `block`\n\n-severity risk flag disables approval outright.\n\nAutonomy with a brake. For a document that becomes a contract, that's the whole\n\nballgame — and it's what I'd want a judge to remember.\n\nIt's genuinely great at **mechanical breadth** — CRUD endpoints, form UIs,\n\nwiring, tests-to-spec — and it's fast and cheap at it. It is *not* the place to\n\nhand over **money math, security-sensitive parsing, or large-file surgery**;\n\nthose are exactly where a confident-but-wrong output costs you. The reviewer's\n\njob isn't ceremony. It's knowing which outputs to trust on sight and which to\n\nread line by line — and never letting the model near the ledger.\n\nQwen built most of QuotePilot. I made sure it never did the math.\n\n**Try it:** [https://mark24680617.github.io/quotepilot/](https://mark24680617.github.io/quotepilot/) (demo login:\n\n`judge`\n\n/ `qwen2026`\n\n) · **Code:** [https://github.com/mark24680617/quotepilot](https://github.com/mark24680617/quotepilot)", "url": "https://wpnews.pro/news/i-had-qwen-build-a-qwen-powered-app-and-sat-in-the-reviewer-s-chair", "canonical_source": "https://dev.to/markgege/i-had-qwen-build-a-qwen-powered-app-and-sat-in-the-reviewers-chair-4phe", "published_at": "2026-07-14 19:51:25+00:00", "updated_at": "2026-07-14 20:30:00.015000+00:00", "lang": "en", "topics": ["artificial-intelligence", "large-language-models", "ai-agents", "developer-tools", "ai-products"], "entities": ["Qwen", "QuotePilot", "Alibaba Cloud", "FastAPI", "Python"], "alternates": {"html": "https://wpnews.pro/news/i-had-qwen-build-a-qwen-powered-app-and-sat-in-the-reviewer-s-chair", "markdown": "https://wpnews.pro/news/i-had-qwen-build-a-qwen-powered-app-and-sat-in-the-reviewer-s-chair.md", "text": "https://wpnews.pro/news/i-had-qwen-build-a-qwen-powered-app-and-sat-in-the-reviewer-s-chair.txt", "jsonld": "https://wpnews.pro/news/i-had-qwen-build-a-qwen-powered-app-and-sat-in-the-reviewer-s-chair.jsonld"}}