العودة إلى المشاريع




Tell Me More
تطبيق بالعربية والإنجليزية يحوّل أي موضوع إلى تقرير منسّق يكتبه الذكاء الاصطناعي، مع ذاكرة مؤقتة تجيب عن الأسئلة المكررة دون استدعاء جديد للنموذج.
- السنة
- 2026
- النوع
- تطبيق ويب
- الحالة
- متاح
دراسة الحالة الكاملة متوفرة بالإنجليزية.
The problem. Learning a new topic usually means a wall of search results or a chat reply that disappears into the scroll. I wanted something in between: type a topic in Arabic or English and get back a designed, readable report you can keep and share. Tell Me More does that for signed-in users, and the same codebase is also the backend API for Qarar, my native iPhone app.
The hard part. Every report is a paid model call, so cost had to be designed in from the start. Before any call, a keyword-coverage lookup checks the cache: the query needs at least three tokens, a candidate must share at least three keywords and cover 60 percent of them, and a hit costs none of the user's daily budget. The other half was trusting the output. Generation is a forced tool call validated with Zod, with one retry, so a malformed report never reaches the page.
The approach. It is a Turborepo with a Next.js 15 app and five shared packages, Prisma on Neon Postgres, and next-intl for Arabic RTL and English. Upstash Redis enforces daily limits per tier, with tier limits (3, 50, unlimited) defined ahead of billing. A separate mobile API inside the same app handles Sign in with Apple, streamed generation, photo uploads and price memory for the iPhone client. Billing through Tap Payments, with a webhook and a renewal sweep, is built behind a feature flag.
The outcome. The app is live with open sign-up, backed by more than 100 test files and Playwright specs that run in Chromium and Firefox in CI. The most useful lesson came from a mistake. In September 2026 a Prisma command given a shadow-database URL wiped every production table. I restored the data from Neon's point-in-time history, then rewrote the migration procedure so the production URL is never handed to a command that treats its database as disposable.
The hard part. Every report is a paid model call, so cost had to be designed in from the start. Before any call, a keyword-coverage lookup checks the cache: the query needs at least three tokens, a candidate must share at least three keywords and cover 60 percent of them, and a hit costs none of the user's daily budget. The other half was trusting the output. Generation is a forced tool call validated with Zod, with one retry, so a malformed report never reaches the page.
The approach. It is a Turborepo with a Next.js 15 app and five shared packages, Prisma on Neon Postgres, and next-intl for Arabic RTL and English. Upstash Redis enforces daily limits per tier, with tier limits (3, 50, unlimited) defined ahead of billing. A separate mobile API inside the same app handles Sign in with Apple, streamed generation, photo uploads and price memory for the iPhone client. Billing through Tap Payments, with a webhook and a renewal sweep, is built behind a feature flag.
The outcome. The app is live with open sign-up, backed by more than 100 test files and Playwright specs that run in Chromium and Firefox in CI. The most useful lesson came from a mistake. In September 2026 a Prisma command given a shadow-database URL wiped every production table. I restored the data from Neon's point-in-time history, then rewrote the migration procedure so the production URL is never handed to a command that treats its database as disposable.
دوري
Solo Full-Stack Developer — designed and built the whole product: the generation pipeline and its cache, the bilingual Next.js front end, the mobile API that Qarar depends on, the rate limits, the billing groundwork and the test suite.
- Next.js 15
- React 19
- TypeScript
- Tailwind CSS 4
- Prisma 6
- Neon Postgres
- next-intl
- Anthropic SDK
- Zod
- Upstash Redis
- Resend
- Sentry
- Vitest
- Playwright
- Turborepo




