
عن المشروع
تطبيق تعارف يضع القيم أولًا، تبقى فيه الصور مخفية وتنكشف مربّعًا تلو الآخر بقدر ما يتحاور الطرفان فعلًا، مبني بـReact Native فوق خلفية بحث شعاعي.
دوري: تصميم المنتج والتقنية، ثم التطوير الكامل للتطبيق المحمول والواجهة البرمجية ونموذج بيانات التوافق.
بنيت Soulsinq حول قلب متعمّد لطريقة عمل تطبيقات التعارف. ففي كل مكان آخر تكون الصورة هي المدخل وما عداها ثانوي، وهو ما يدرّب الناس على الحكم في ربع ثانية. أما هنا فتبدأ الصورة مخفية تمامًا خلف شبكة من خمسة وعشرين مربّعًا، ولا تُرفع المربّعات إلا بقدر التفاعل الحقيقي بين طرفين متوافقين. لم يُحذف الانجذاب من المعادلة، بل نُقل إلى ما بعد المحادثة بدل ما قبلها.
هذا الاختيار يفرض نموذج البيانات. فما دام التوافق لا يستطيع الاعتماد على الصور، فهو يقوم على القيم والتفضيلات المعلنة والقرب الجغرافي. استعملت PostgreSQL مع امتدادين يتوليان العبء الأكبر: PostGIS للتصفية الجغرافية، وpgvector للبحث بالتشابه في ملفات القيم، ويجري الوصول إليهما عبر Drizzle بمخطّطات مكتوبة الأنواع. وتحمل حزمة مشتركة مخطّطات zod والثوابت التي يستخدمها العميل والخادم معًا، فأي تغيير في شكل الملف الشخصي يكسر الترجمة على الجانبين بدل أن يظهر خطأ تشغيليًا في الإنتاج.
التطبيق المحمول مبني بـReact Native على Expo مع expo-router، والواجهة البرمجية تطبيق Express يعمل على الجيل الثاني من Firebase Functions. وإبقاء الواجهة تطبيق Express عاديًا بدل معالجات منفصلة أتاح تشغيلها محليًا مقابل Postgres في Docker واختبارها عبر محاكيات Firebase، ما أبقى حلقة التغذية الراجعة قصيرة بينما كان تصميم المنتج لا يزال يتغيّر.
أهم الميزات
- 🧩 كشف تدريجي للصورة: تقبع صورة الملف خلف خمسة وعشرين مربّعًا لا تُرفع إلا بقدر التفاعل الحقيقي بين الطرفين.
- 🎯 توافق قائم على القيم: يُحسب التوافق من القيم والتفضيلات المعلنة لا من المظهر.
- 🧠 بحث بالتشابه الشعاعي: يقارن pgvector ملفات القيم داخل PostgreSQL، فيبقى التوافق استعلام قاعدة بيانات لا خدمة منفصلة.
- 📍 تصفية جغرافية: يضيّق PostGIS دائرة المرشحين بالمسافة الفعلية قبل أي حساب تشابه، فتبقى الاستعلامات سريعة مع نمو القاعدة.
- 📱 قاعدة كود واحدة لـiOS وأندرويد: يطلق React Native على Expo مع expo-router المنصتين من شجرة تنقّل واحدة.
- 🔗 عقد مشترك بين التطبيق والواجهة: تعيش مخطّطات zod في حزمة مشتركة، فيكسر أي تغيير في الملف الشخصي الترجمة بدل الإنتاج.
- 🧪 تطوير محلي بالكامل: يعيد Postgres في Docker مع PostGIS وpgvector، إلى جانب محاكيات Firebase، إنتاج المنظومة كاملة دون اتصال.
- ⚙️ Express على الدوال السحابية: أبقى الاحتفاظ بتطبيق Express تقليدي بدل معالجات منفصلة الواجهةَ قابلة للاختبار كاملة في عملية واحدة.
مشكلات وحلول
المشكلة: تضع تطبيقات التعارف الصورة أولًا، فتدرّب الناس على الحسم في جزء من الثانية وتدفن كل ما يقوله الملف الشخصي فعلًا. ومجرد إخفاء الصور لا ينجح أيضًا، لأن المستخدم يهجر تطبيقًا يبدو أنه يخفي عنه شيئًا.
الحل: الصورة حاضرة منذ البداية لكن يغطيها شبكة من خمسة وعشرين مربّعًا تُرفع مع تقدّم المحادثة. لا شيء محجوب، بل الكشف يُكتسب، ويقوم التوافق في هذه الأثناء على قيم تُقارن بالتشابه الشعاعي لا على المظهر.

