الفرضية
تجيب معظم أدوات التحليلات عن سؤال «كم شخصًا جاء؟» بينما سؤال المؤسس الحقيقي هو «هل حدث شيء جيد، وما سببه؟» وهذان منتجان مختلفان. يجعل DataLook العميل يسمّي حدث نجاحه أثناء التهيئة ثم يقدّم تقاريره وفق ذلك التعريف، فتفتح اللوحة على الرقم الذي يهم المؤسس بدل جدول مشاهدات عليه تفسيره.
ويمكن تعريف حدث النجاح بثلاث طرق، اثنتان منها بلا شيفرة إطلاقًا: بنمط الرابط (زيارة `/welcome` تُحتسب تسجيلًا)، أو بنقرة زر (وسم عنصر بـ `data-track` وربطه في اللوحة)، أو باستدعاء صريح لـ `analytics.success()` لمسارات الخادم.
خط أنابيب الأحداث
مسار الحدث قصير عمدًا، ومفصول عند نقطة واحدة بالضبط:
- تجمّع الحزمة الأحداث وترسلها عبر `navigator.sendBeacon` مع بديل `fetch({keepalive:true})`
- تتحقق `/collect` وتكتب في Redis Stream — فلا تنتظر النقطة قاعدة بيانات التحليلات أبدًا
- يفرّغ مستهلك يعمل تحت pm2 المجرى ويُدرج دفعات في ClickHouse
- تحافظ العروض المادية والتدرّج الساخن/البارد على سرعة استعلامات اللوحة مع نمو الجدول
- تقرأ `/api/stats` التجميعات، وتعرضها اللوحة على رسوم visx مبنية يدويًا
وRedis Streams هي الخيار الحامل هنا. فبدونها تتحول عثرة في ClickHouse إلى إشارة ضائعة على موقع شخص آخر، ولا يعلم العميل أنه فقد بيانات — فالفشل صامت بطبيعته، وهو تحديدًا نوع الفشل الجدير بأن يُصمَّم بعيدًا.
قاعدتا بيانات، عن قصد
تحتفظ Postgres 18 بالمستخدمين والمواقع والأدوار والاشتراكات وقواعد النجاح — بيانات علائقية تريد معاملات ومفاتيح أجنبية. وتحتفظ ClickHouse 24.10 بالأحداث، وهي إضافية فقط ومتعددة المستأجرين وتُستعلم كسلاسل زمنية عبر الأفواج. وكانت Postgres وحدها ستكفي أحجام الإصدار الأول بارتياح، فهذا رهان لا ضرورة: الميزة المميزة المخططة مقارنة أفواج — ما الذي فعله المحوَّلون بشكل مختلف؟ — وهو شكل استعلام بُنيت ClickHouse له. والتقاط الأحداث فيها منذ اليوم الأول يحوّل ترحيلًا مستقبليًا تحت ضغط الإنتاج إلى فرع ميزة.
الإطلاق على خادم واحد
الإنتاج خادم EC2 واحد خلف Cloudflare. ينهي nginx التشفير؛ ويعمل Next.js ومستهلك الأحداث تحت pm2؛ وتجلس Postgres وRedis وClickHouse إلى جانبهم. ولا شيء داخل حاويات في الإنتاج — فـ Docker Compose موجود للتطوير المحلي فقط. والنشر أمر واحد على الخادم: سحب، تثبيت، ترحيل Postgres، ترحيل ClickHouse، بناء، إعادة تحميل.
ولبانيَين بدوام جزئي يأخذان منتجًا إلى إطلاق تجريبي صغير مختار، كان تشغيل أربع خدمات مُدارة سيعني أربع لوحات وأربع فواتير وأربعة أنماط فشل قبل خدمة أول عميل. المقايضة صريحة وموثّقة: سرعة الآن، ومشكلة تعدد المناطق معروفة لاحقًا.
التصميم بوصفه تموضعًا
كل منافس في هذه الفئة يبدو متشابهًا — أزرق مخضر ونيلي على رمادي مزرق. ويغادر DataLook هذا النطاق عمدًا: مساحة كريمية دافئة، وذهبي عسلي عميق كلون الإشارة الوحيد، وكوبالت محجوز وزنًا باردًا داخل الرسوم. والرموز اللونية محددة بنظام OKLCH مع تسجيل نسب التباين المقاسة مقابل كل منها، فلا يكلّف الدفء وضوح القراءة، والرسوم مبنية يدويًا على visx تحديدًا لترث اللوحة بدل مصارعة إعدادات مكتبة.
والانضباط نفسه يحكم عناصر اللعب. التهيئة الأولى سجل مهام غير خطي مع احتفال عند الإتمام، لأن الوصول إلى أول رؤية يستحق أن يبدو كفوز — لكن هذه الآلية تتوقف عند حدود التهيئة ولا تتسرب إلى الأسطح اليومية.
أين يقف الآن
يعمل DataLook في الإنتاج بخط الأنابيب موصولًا من طرف لطرف، واشتراكات ذاتية على Lemon Squeezy، ومساعد بـ Gemini ينقّي البيانات الشخصية قبل مغادرة أي طلب للخادم، وبوابة إدارة بالصلاحيات تغطي المستخدمين والأدوار والاشتراكات والمالية والعملاء والتدقيق وصحة النظام. نحو ١١٠ آلاف سطر TypeScript عبر ١٣٥٧ ملفًا، و٣٩ شاشة، و٦٣ معالج مسار، و٢٢٩ مكوّنًا — مع التعامل مع اللاأهداف الصريحة (بلا إعادة تشغيل جلسات، بلا خرائط حرارية، بلا اختبار A/B) كجزء من المنتج لا كنقص فيه.