بدأ Simple Photo Gallery قبل نحو ست سنوات لحل مشكلة بسيطة جدًا: أردت طريقة جميلة أشارك بها صور رحلاتنا وصور مولودنا مع العائلة والأصدقاء. لم أرد إلقاء مجموعة من الصور في ألبوم وإرسال رابط فحسب. أردت أن أحكي قصة. أردت إضافة أوصاف، وجمع الصور في أقسام لها معنى، وشرح ما يراه الناس في كل صورة.
كانت أول «قصة مصوّرة» كبيرة حقًا عن رحلتنا إلى أستراليا عام 2017. تعلّمنا أشياء كثيرة مثيرة للاهتمام على الطريق، وأردت أن ينقل المعرض التجربة نفسها إلى جانب عرض الصور. رتّبت الصور حسب المدينة والمكان، وأضفت نصًا لكل قسم، وكتبت تعليقات توضيحية لكثير من الصور. لكن المشكلة أنني لم أجد أداة جيدة تؤدي هذه المهمة.
كنت بحاجة إلى أداة تتيح لي رواية قصة، وتسهل أيضًا مشاركة المعرض مع جدّتي التي كانت تستخدم جهازًا لوحيًا وتطبيق مراسلة في الغالب. كان ينبغي أن تتمكّن من الضغط على الرابط الذي أرسله ورؤية كل شيء. بلا تسجيل دخول أو خدمات إضافية أو تعقيدات. وبالطبع كان لا بد أن يعمل جيدًا على الهاتف والحاسوب والجهاز اللوحي.
وفي النهاية قررت أن أصنع الأداة بنفسي.
النسخة الأولى
كتبت النسخة الأولى من Simple Photo Gallery بلغة Python. كنت قد اكتشفت مكتبة JavaScript رائعة اسمها PhotoSwipe فيها عارض صور جميل وسلس. دمجتها في أداة صغيرة لسطر الأوامر تفحص مجلد صور، وتولّد صورًا مصغّرة، وتجمع كل شيء في معرض ثابت. لم يكن الناتج سوى ملفات HTML وCSS وJavaScript عادية يمكنك استضافتها أينما شئت.
نشرت الأداة مفتوحة المصدر، وواصلت إضافة الميزات كلما أنشأت معارض جديدة لرحلاتنا وحياتنا مع ابننا. وهذه أول نسخة من معرض أستراليا من عام 2017.
لكن الأداة لم تكن سهلة الاستخدام.
كان عليك تثبيت حزمة Python باستخدام pip، وتشغيل أوامر في الطرفية، وتحرير ملفات JSON يدويًا إن أردت ميزات متقدمة مثل الأقسام. عمليًا، لم يكن في وسع استخدامها إلا من لديه بعض الخبرة التقنية. ومع ذلك، ظل عدد مستخدميها يزداد على مرّ السنين.
ومن التفاصيل الطريفة أن كل معرض مُنشأ كان يحمل في أسفله عبارة صغيرة تقول «أُنشئ باستخدام Simple Photo Gallery». سهّل ذلك عليّ العثور على المعارض عبر Google ورؤية ما أنشأه الناس. وطبعًا، بما أن الأداة مفتوحة المصدر، كان بإمكان أي شخص حذف العبارة، فلعلّ هناك معارض أكثر. ومع ذلك، حصد المشروع أكثر من 200 نجمة على GitHub، وهو ما بدا لي أمرًا يكاد لا يُصدّق بالنسبة إلى مشروع صغير أنجزته في عطلة نهاية الأسبوع.
وكلما رأيت المزيد من الناس يستخدمونه، تكرّر في ذهني هذا السؤال: «إذا كان استخدامه صعبًا إلى هذا الحد، ومع ذلك يجد فيه كل هؤلاء فائدة، فربما يجدر بي أن أجعله أسهل.»
التخطيط لنسخة جديدة على مدى سنوات
خطّطت لإصدار v2 منذ البداية تقريبًا. أردت إعادة كتابة كل شيء بلغة JavaScript حديثة، وتجاوز بعض القيود الأساسية في نسخة Python، وإضافة الميزات التي كان الناس يطلبونها، لا سيما إنشاء معارض تلقائيًا من مجموعات كبيرة من المجلدات المتداخلة. تواصل معي عدة أشخاص لديهم أرشيفات صور ضخمة ويحتاجون إلى شيء من هذا القبيل، لكن تنفيذ الفكرة بطريقة سليمة كان صعبًا جدًا في البنية القديمة.
فكّرت في v2 سنوات. وفي وقت سابق من هذا العام قلت أخيرًا: لنبدأ.
أقنعت صديقي Tomasz، وهو مطوّر بارع، بالانضمام إليّ شريكًا على قدم المساواة. أعدنا كتابة الأداة من الصفر باستخدام Astro وتقنيات TypeScript حديثة وسريعة جدًا. وفي سبتمبر 2025 أطلقنا النسخة المفتوحة المصدر Simple Photo Gallery v2 على GitHub وnpm.
هكذا يبدو معرض أستراليا الآن بعد إنشائه بإصدار v2.
الاتجاه الجديد: أداة مفتوحة المصدر وتطبيق مستضاف
إلى جانب أداة سطر الأوامر مفتوحة المصدر، بدأنا تطوير تطبيق ويب جديد. وهو خدمة نديرها بالكامل مبنية على المحرك مفتوح المصدر. يتولّى الاستضافة والتخزين والتحسين، ويتيح لك إنشاء المعارض بمحرّر مرئي بدل تحرير ملفات JSON. ما عليك إلا رفع مجلد صور وإضافة أوصاف والنقر على «حفظ». وهذا يجعل إنشاء المعارض سهلًا حتى لمن ليست لديه خبرة تقنية.
هذا ما نعمل عليه اليوم. المنتج قابل للاستخدام بالفعل، ولدينا قائمة طويلة من الميزات التي ننوي إضافتها. إذا أردت التجربة، تفضّل بزيارة Simple Photo Gallery. ويمكنك أيضًا الاطّلاع على الأمثلة لتجد أفكارًا تلهمك.
ما التالي؟
نخطّط لميزات ذكاء اصطناعي مثيرة للاهتمام تجعل انتقاء صور المعارض وتنظيمها أسهل. سأشارك المستجدات مع تطوير الميزات الجديدة هنا على المدوّنة وعلى @haltakov.
