كل الأعمال
Curio screenshot built by Vector9
Curio app icon

Curio: تطبيق اجتماعي لمشاركة الذوق

مُطلق في الإنتاج

خلاصة من أناس تثق بذوقهم، بترتيب ما نشروه، وبلا عدّاد إعجابات.

الدور
تصميم وتطوير وإطلاق كامل
المدة
8 أسابيع حتى App Store، 2026
النوع
تطبيق اجتماعي لمشاركة الذوق
المنصات
iOS و Android

التقنيات

Expo SDK 57 / React Native 0.86TypeScriptExpo RouterReanimatedSupabase (Postgres 17, Auth, RLS, Realtime)Deno Edge Functionspg_cron + pg_netNext.js 16Sentry + PostHogEAS Build + Update

التوصيات الجيدة تموت في مجموعات الدردشة. يرسل أحدهم أغنية في مارس، وبحلول يونيو لا يجدها أحد، بينما تكافئ التطبيقات المصمَّمة للمشاركة كل ما يجمع أكبر عدد من التفاعلات. يمنح Curio كل شخص ركناً: مكتبة دائمة يمكن تصفحها لما رأى أنه يستحق أن يشاركه مع غيره، يقرؤها من اختاروا متابعته.

المشكلة الهندسية تختبئ خلف حركة واحدة. الرابط المُشارَك من Spotify أو IMDb أو Goodreads أو صحيفة يجب أن يصبح بطاقة غنية محددة النوع، وهذا يعني جلب روابط كتبها غرباء، ومطابقة الأغنية نفسها عبر كتالوجات يستخدم كل منها معرّفاته الخاصة للمقطوعات، والتعامل مع خدمات خارجية بطيئة أو محدودة الطلبات أو متوقفة. وقد أُوقفت واجهة Odesli العامة، الطريقة المعتادة لدى التطبيقات لمطابقة روابط الموسيقى، بعد أسبوعين من بدء المشروع، وكانت الخطة قد استعدت لذلك مسبقاً.

رابط يدخل، وبطاقة جاهزة تخرج

قائمة المشاركة هي المدخل الرئيسي. كل رابط، من أي تطبيق، يمر عبر باب واحد على الخادم يوجّهه حسب المضيف: خدمات الموسيقى، والفيديو، و IMDb و Letterboxd، وصفحات الكتب، وقارئ مقالات عام لكل ما تبقى. روابط TikTok و Instagram و X تُرفض عند الباب. والاستعلام الفاشل، أو الذي يستغرق أكثر من 20 ثانية، لا يوقف النشر أبداً: تُنشر بطاقة بسيطة بدلاً من ذلك، ويضع مشغّل في قاعدة البيانات مهمة في الطابور، ثم يرقّي عامل مجدول البطاقة في مكانها، مع إعادة المحاولة والتراجع التدريجي. ولأن الخادم يجلب روابط كتبها غرباء، يمر كل طلب يرسله إلى رابط مستخدم عبر حارس SSRF يُجري استعلام DNS قبيل الاتصال مباشرة، ويحجب العناوين الخاصة وعناوين البيانات الوصفية السحابية، ويعيد التحقق عند كل إعادة توجيه، ويضع حداً للحجم والوقت. ووجدت مجموعة اختبارات هجومية حية على الدالة المنشورة تسرّباً حقيقياً واحداً، إذ كانت أداة استخراج احتياطية تمرر روابط مرفوضة إلى خدمة خارجية، فقُسّم الحارس كي يتحقق ذلك المسار من وجهته أيضاً.

شاشة المشاركة: مدخل واحد للأفلام والمسلسلات والكتب والموسيقى والفيديو والمقالات
شاشة المشاركة: مدخل واحد للأفلام والمسلسلات والكتب والموسيقى والفيديو والمقالات

أغنية واحدة، وكتالوجات كثيرة

المقطوعة المُشارَكة من Spotify يجب أن تعرض أيضاً Apple Music و YouTube Music و Deezer، وأن تشغّل مقطعاً تجريبياً وتحمل الغلاف الصحيح، مع أن لكل خدمة معرّفاتها الخاصة للمقطوعات. ومع توقف واجهة Odesli، يتولى Curio مطابقة الموسيقى بنفسه: يحلل الرابط، ويجد رمز ISRC للتسجيل، أو رمز UPC للأغنية المنفردة، ثم يستعلم من Apple Music و Deezer و Spotify بالتوازي، بينما يملأ MusicBrainz و YouTube Music الفجوات بعدها. تُخزَّن النتائج مؤقتاً لكل تسجيل، ويُعاد الاستعلام عنها حين يمر عليها شهر. وتُرتَّب صور الأغلفة حسب ما طابقه كل مصدر فعلاً لا حسب ترتيب ثابت يضع Apple أولاً دائماً، بعد أن ظهر منشور بغلاف أسطوانة مختلفة ملأ 38% من إطاره، بينما يملؤه الغلاف الصحيح بنسبة 99%. واكتشافان أقل لفتاً للانتباه: واجهة iTunes Search API تتجاهل معامل الإزاحة، فكانت الصفحة الثانية هي الأولى من جديد، وشروط Spotify تمنع خلط نصوصها بمحتوى صوتي من خدمات أخرى، لذا يقتصر دور Spotify على قراءة الروابط وفتحها.

الخلاصة: مقطوعة على شكل أسطوانة مع زر تشغيل لمقطعها التجريبي
الخلاصة: مقطوعة على شكل أسطوانة مع زر تشغيل لمقطعها التجريبي

تقييمات يمكن وزنها، ومشاهدة حيث أنت

تحمل منشورات الأفلام والمسلسلات ما يتوفر لدى OMDb من تقييمات IMDb و Rotten Tomatoes و Metacritic، إضافة إلى متوسط Letterboxd حين يأتي المنشور من Letterboxd، وتقييم TMDB نفسه كملاذ أخير حين لا يتوفر غيره. يحتفظ كل تقييم بمقياسه ويُسمّي مصدره، ولا يُحسب أي متوسط، لأن 8.8/10 و 79% جمهوران مختلفان على مقياسين مختلفين. تتيح الخطة المجانية في OMDb 1,000 طلب يومياً، لذا تُجلب التقييمات مرة واحدة عند إنشاء المنشور ثم تُحفظ، أما المنشورات المضافة عبر البحث داخل التطبيق فتُستكمل تقييماتها عبر مسح مجدول. ويُحفظ الاستعلام الفاشل بشكل مختلف عن الإجابة الفارغة، فلا يُسجَّل انقطاع الخدمة أبداً على أنه غياب للتقييمات. أما أماكن المشاهدة فتعمل بالعكس: تُجلب في كل مرة يفتح فيها أحدهم المنشور، وللبلد المضبوط في هاتفه، لأن كتالوجات البث تتغير أسبوعياً ومن منطقة لأخرى. وإن لم يحدد الهاتف منطقة يبقى القسم مخفياً بدل افتراض الولايات المتحدة، فإخبار شخص في القاهرة بأن فيلماً متاح على Hulu أسوأ من ألا تقول شيئاً.

شاشة تفاصيل مسلسل: تأتي التقييمات وأماكن المشاهدة أسفل الملصق وملاحظة من شاركه
شاشة تفاصيل مسلسل: تأتي التقييمات وأماكن المشاهدة أسفل الملصق وملاحظة من شاركه

قاعدة البيانات هي خط الدفاع الأخير

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

صفحة الاستكشاف: البحث عن الأشخاص، ثم The Commons، الخلاصة المنتقاة يدوياً
صفحة الاستكشاف: البحث عن الأشخاص، ثم The Commons، الخلاصة المنتقاة يدوياً

انطلق Curio على App Store في 14 سبتمبر 2026، بعد 58 يوماً من أول التزام برمجي، وعلى Google Play في 3 أكتوبر، بعد اختبار مغلق مدته 14 يوماً تشترطه Google على حسابات المطورين الشخصية. ووصل الإصدار 1.0.6 إلى Google Play في 21 أكتوبر وإلى App Store في 23 أكتوبر، مضيفاً رسائل بين شخصين وصندوقاً صادراً (outbox) للإشعارات يُكتب في المعاملة نفسها التي تتم فيها العملية المسببة لكل إشعار.

وقبل إطلاق ذلك الإصدار، أثارت مراجعة هجومية متعددة الجولات 32 ملاحظة، تأكدت 30 منها وأُصلحت الـ 30 جميعها، ومنها ثغرة تزوير المتابعة المذكورة أعلاه. ويحمل موقع المنتج على curiocc.app ملفات ربط التطبيق الخاصة بـ Apple و Android، فيمكن لرابط ملف شخصي مُشارَك أن يُفتح مباشرة في التطبيق بدءاً من الإصدار 1.0.6.

تريد شيئاً مشابهاً؟

أخبرنا بما تبنيه وسنعطيك تقييماً صادقاً للنطاق والجدول الزمني والتكلفة.

احجز مكالمة