SnapShot
دراسة حالة
متاح على snapshot.ritmodev.com

SnapShot: يجد كل ضيف صوره بصورة سيلفي واحدة

SnapShot منصة لصور الفعاليات صمّمتها وطوّرتها بالكامل. يرفع المنظّم صور حفل زفاف أو مؤتمر أو مباراة دفعة واحدة، ويلتقط كل ضيف صورة سيلفي ليحصل على ألبوم شخصي يضم كل الصور التي يظهر فيها — دون تصفّح ألفي صورة.

المشكلة

بعد أي فعالية، تنتهي الصور في مجلد مشترك ضخم. يقضي الضيوف وقتًا طويلًا في البحث عن أنفسهم، ويظل المنظّم يتلقى الرسالة نفسها لأسابيع: «هل يمكنك إرسال صوري؟»

ما قمت ببنائه

  • للمنظّم — فعاليات برمز دخول ورابط مشاركة ورمز QR؛ رفع جماعي بالسحب والإفلات مع متابعة المعالجة مباشرة؛ ألبوم مميّز؛ إحصاءات؛ رصيد صور مع علامة مائية في الباقة المجانية.
  • للضيوف، دون حساب — فتح رابط الفعالية والتقاط صورة سيلفي من المتصفح والحصول على ألبوم شخصي يمكن العودة إليه. يصلك بريد إلكتروني عند رفع صور جديدة تظهر فيها — مجمّعًا، حتى لا يرسل الرفع الجماعي إلا رسالة واحدة.
  • على مستوى المنصة — الإنجليزية والفرنسية والعربية (من اليمين إلى اليسار)، ووضع فاتح وداكن، ولوحة إدارة للمنصة كلها.

القرارات التقنية

مطابقة الوجوه داخل PostgreSQL. تُخزَّن بصمات الوجوه باستخدام pgvector إلى جانب بقية البيانات، وتُطابَق باستعلام المسافة الجيبية (cosine) على فهرس HNSW — دون قاعدة بيانات متجهات منفصلة يجب تشغيلها ومزامنتها.

خدمة الذكاء الاصطناعي عديمة الحالة. خدمة FastAPI (كشف YuNet وبصمات SFace) تستقبل الصور وتعيد متجهات. الخادم الخلفي Spring Boot يتولى كل عمليات الكتابة، فلا تحتفظ خدمة الذكاء الاصطناعي بأي بيانات اعتماد.

الرفع لا ينتظر النموذج أبدًا. يستجيب الرفع فورًا، وتُعالَج الوجوه في الخلفية، وتُسجَّل الصورة التي تفشل مع سبب فشلها بدل أن تختفي بصمت.

نماذج مختارة حسب ترخيصها. YuNet وSFace مرخّصتان بـ Apache-2.0، لذا يمكن بيع المنتج تجاريًا — على عكس النماذج غير التجارية في النموذج الأولي.

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

التقنيات المستخدمة

  • Java 25
  • Spring Boot 4.1
  • PostgreSQL 16 + pgvector
  • Python · FastAPI
  • OpenCV YuNet + SFace
  • Angular 22
  • MinIO (S3)
  • Docker
  • GitHub Actions

يعمل كل شيء في حاويات Docker خلف Caddy، ويُنشر تلقائيًا عند دمج أي تغيير.

شاهد المشروع

هل تبني منتجًا يعالج الصور أو يعتمد على البحث أو يخدم عملاء كثيرين من منصة واحدة؟ أخبرني بما تفكر فيه.