كل الشروحات

Pistochia

الإطلاق قريبًا

تطبيق iPhone لمن لديهم اضطراب فرط الحركة وتشتت الانتباه (ADHD). تقول أو تكتب ما يدور في ذهنك، فيعود إليك على شكل خطوات صغيرة بما يكفي للبدء بها، مرتبة حسب طاقتك في ذلك اليوم.

دوري
التصميم والتطوير، بمفردي
السنة
2026
التقنيات المستخدمة
Expo · React Native · SQLite · Supabase Edge Functions · Claude · Whisper · RevenueCat
EXPO CLIENT: OFFLINE-FIRSTSQLITESUPABASE ANONYMOUS AUTHEDGE PROXY: OPERATIONALLOWLIST, QUOTASREVENUECAT: PAYWALLCLAUDE: TASK BREAKDOWNWHISPER: VOICE INTAKEFIRST OPENOPERATION IDWORKS IN AIRPLANE MODEFAIL-CLOSED LIMITS, AI_PAUSED KILL SWITCHPROMPTS LIVE SERVER-SIDE (ops.ts)

مرّر أفقيًا لرؤية المخطط كاملًا.

البنية المعماريةOFFLINE-FIRST CLIENT → OPERATION ALLOWLIST PROXY → CLAUDE / WHISPER

المشكلة

بالنسبة لمن لديهم ADHD، غالبًا ما تكون الصعوبة في البدء، لا في التذكّر. وتطبيق المهام الذي يخزّن الجبل كله يتحوّل إلى قائمة بأشياء تشعر بالذنب تجاهها. يجب أن تصغر وحدة العمل حتى يصبح البدء سهلًا، ويجب أن يعمل التطبيق في اللحظة التي يُفتح فيها.

كيف بُني

تطبيق Expo يعمل دون اتصال أولًا (offline-first)، على SQLite محلي مع migrations مرقّمة بالإصدارات. والهوية مبنية على auth مجهول من Supabase، فيحدث أول تفريغ للأفكار قبل أي شاشة تسجيل. وكل استدعاء للذكاء الاصطناعي يمر عبر edge function تعمل بنظام العمليات: يرسل التطبيق اسم العملية ومعاملاتها، ولا يرسل أبدًا prompt أو مفتاحًا. وتتحقق الدالة من العملية مقابل allowlist، وتفرض حدودًا لعدد الطلبات لكل IP، وحصصًا يومية لكل تثبيت، ومفتاح إيقاف طارئ (kill switch). يقسّم Claude المهام، ويتولى Whisper الصوت خلف الـ proxy نفسه. ويدير RevenueCat جدار الدفع (paywall)، وتبقى التحليلات معطّلة حتى يوافق المستخدم عليها.

القرارات المهمة

  • التطبيق لا يحمل أي مفاتيح API

    تدخل أسماء العمليات وتخرج نتائج مهيكلة. ومفتاح API موجود في الـ edge function، خلف kill switch وحصص وحدود تُغلق عند الفشل (fail closed).

  • يعمل دون اتصال أولًا

    تُحفظ المهام في SQLite على الهاتف، مع migrations حقيقية. فأداة لـ ADHD تحتاج إلى اتصال بالشبكة لتعرض خطوتك التالية ستخذل الأشخاص الذين صُنعت من أجلهم.

  • لا تسجيل قبل الاستخدام الأول

    ينشئ الـ auth المجهول هوية بصمت. وتأتي شاشة الحساب لاحقًا، بعد أن يكون التطبيق قد أفاد المستخدم.

كود من المستودع

functions/anthropic-proxy/index.tsالـ edge proxy: قائمة عمليات مسموح بها (allowlist) ومفتاح إيقاف (kill switch)
// The legacy free-relay surface: any request still carrying these is either
// an outdated client or an abuse probe — reject outright.
const FORBIDDEN_KEYS = ['system', 'model', 'messages', 'maxTokens'] as const;1
 
// …
const paused = Deno.env.get('AI_PAUSED');2
if (paused === 'true' || paused === '1') {
  return jsonResponse({ error: 'ai_paused' }, 503);
}
 
// …
for (const key of FORBIDDEN_KEYS) {
  if (key in body) {
    return jsonResponse({ error: 'invalid_request' }, 400);
  }
}
 
const op = body.op;
if (typeof op !== 'string' || !(op in OPS)) {3
  return jsonResponse({ error: 'invalid_op' }, 400);
}
const config = OPS[op]!;
  1. السطر 3. لا يستطيع التطبيق إرسال prompt أو نموذج أو حد للـ tokens. فهذه موجودة على الخادم، ولا يستطيع التطبيق إلا تسمية عملية موجودة في الـ allowlist.

  2. السطر 6. AI_PAUSED مفتاح إيقاف طارئ (kill switch): متغير بيئة واحد يوقف كل الإنفاق على الذكاء الاصطناعي دون redeploy.

  3. السطر 19. تُرفض أي عملية غير معروفة. ومفتاح API لا يوجد أبدًا في أي مكان داخل حزمة التطبيق (app bundle).

أين وصل الآن

مواد App Store، وقائمة مراجعة الإطلاق، وbuilds على EAS، وفيديو ترويجي، وموقع pistochia.com مع قائمة انتظار: كلها جاهزة. البداية مع iPhone، والخطوة التالية هي الإطلاق على App Store.

الشرح التاليأطروحة الماجستير: كشف قابل للتفسير لرسائل التصيّد الاحتيالي المكتوبة بالذكاء الاصطناعي