§ 01 Problem
Exam-prep students don't fail for lack of content — they fail on pacing and consistency. Prexamy's bet was an AI coach that analyzes answering tempo, assigns daily tasks and builds personalized study plans. Technically, the hard part wasn't calling an LLM; it was deciding when not to: routing every chat message through a model is slow and expensive, so the backend needed a layer that resolves cheap intents deterministically and delegates only genuinely ambiguous ones.
§ 02 Approach
- We split the product into a 4-app monorepo: a NestJS API on Bun (13 feature modules — exam, study-plan, lesson-content, leaderboard, badges, chat — all on the same Prisma + JWT-guard module pattern), a Flutter mobile app (BLoC + auto_route + get_it, clean core/data/domain/presentation layering), a Next.js 16 landing and a Next.js 14 admin panel.
- The AI layer (api-backend/src/ai-orchestration/) is a proper orchestration pipeline, not a chat passthrough: an AiRouterService talks to OpenRouter with function/tool calling (tool-registry, tool-executor), a prompt-composer builds context, and an audit-logger records every AI decision.
- My main backend contribution was the NLP gatekeeper in front of that pipeline: strict dominance thresholds in intent recognition and a dedicated llm_delegation intent, so unambiguous messages resolve deterministically and only mixed-intent ones pay the LLM round-trip.
- On mobile I built the gamified profile with mascot UI and its interaction cubit, and optimized the BLoC fetch lifecycle with an app-shell cache and load-more pagination.
- The landing page shipped production-complete for the Turkish market: Tolgee i18n, sitemap/robots/OG image generation, and KVKK, privacy and purchase-terms legal pages.
§ 03 Outcome
A working MVP across all four apps — mobile at v1.0.3, real-time chat over Socket.IO, and an AI orchestration layer where routing decisions are auditable instead of implicit. My 121 commits over two months centered on the backend NLP routing and the mobile experience.



