منصوبے کے بارے میں

OpenAnalytics ایک اوپن سورس ویب اینالیٹکس پروڈکٹ ہے جو pnpm مونو ریپو کے طور پر شائع ہوتی ہے، AGPL-3.0 لائسنس کے تحت جاری اور اپنے ہی ہارڈویئر پر خود میزبان کرنے کے لیے بنائی گئی ہے۔ اس کا مقصد پرائیویسی-فِسٹ، کوکی-لیس میजरمنٹ ہے جس میں صرف ایگریگیٹ ریڈز شامل ہیں: کوئی کوکی نہیں، کوئی فنگر پرنٹنگ نہیں، کوئی کراس سائٹ شناخت کنندہ نہیں، اور خام IP ایڈریس کبھی محفوظ نہیں کیے جاتے۔ وزیٹر کی شناخت ایک سالٹ شدہ ہیش ہے جو رات بھر تبدیل ہوتا ہے، اس لیے وزیٹر کی ٹریل اتنی ہی لمبی ہوتی ہے جتنی ایک وزٹ کی اور کبھی شخص جتنی لمبی نہیں۔ Do Not Track اور Global Privacy Control کو کलेکٹر پر لکھنے سے پہلے ہی قبول کیا جاتا ہے، اور شہر کی سطح کی جغرافیائی مقامیات ہر سائٹ کے لیے آپشنل ہوتی ہیں، میشن پر موجود ڈیٹا بیس کے خلاف حل ہوتی ہیں تاکہ کوئی بھی لوک اپ مشین سے باہر نہ جائے۔ مصنفین کے ذریعے چلائی جانے والی ہوسٹڈ انسٹنس getopen.so پر اسی کوڈ کو چلا رہی ہے۔ مونو ریپو پروڈکٹ کو الگ الگ ایپلیکیشنز میں تقسیم کرتی ہے: ایک چھوٹا براؤزر ٹریکر اسنیپٹ جس کے بائيٹ بجٹ کو CI نافذ کرتی ہے؛ ایک کलेکٹر جو درستگی، حفظانِ صحت، ریٹ لمٹنگ اور کतار میں لگانے کا کام کرتا ہے؛ ایک ورکر جو کتار کو ClickHouse میں ڈریئن کرتا ہے اور سیشنز، رولپس، ایکسپورٹس، میل اور حذف کرنے کو ہینڈل کرتا ہے؛ ایک API کंटول پلین جس میں auth، سائٹس، کیز، شیئرنگ، ایونٹ ڈیفینیشنز، فنلز، وِیجٹس، ریونیو، AI اسسٹنٹ اور MCP سرور شامل ہیں؛ ایک کوئری گیٹ وے جو صرف ClickHouse تک پڑھنے کی اجازت رکھتا ہے اور Ed25519 سے دستخط شدہ کوئری لفافوں کی تصدیق کرتا ہے؛ ایک ریئل ٹائم ایپ جو لائیو ڈیش بورڈ کے پیچھے SSE اسٹریم فراہم کرتی ہے؛ ایک Next.js ڈیش بورڈ؛ اور `oa` CLI جو سائٹ سیٹ اپ، شمار اور ڈیوائس-فلو لاگ ان کے لیے ہے۔ شیئرڈ پیکیجز میں ڈومین لاجک، Postgres اور ClickHouse اسکیما مائگریشنز، Redis/Valkey، auth، OpenAPI کنٹریکٹس،observability اور انٹیگریشنز شامل ہیں۔ ذخیرہ کاری تین حصوں میں تقسیم ہے: کंटول پلین کے لیے Postgres، ایونٹس اور رولپس کے لیے ClickHouse، اور دو Valkey انسٹنسز — ایک durable event queue اور ایک disposable ریئل ٹائم کیچ۔ رپورٹ شدہ فنکشنلٹی میں پیج وز، کسٹم اور خصوصیات سے چلنے والے ایونٹس، سیشنز، ویب وِیٹلز، فنلز، per-site ریٹینشن، embeddable وِیجٹس، عوامی شیئر لنکس، اپنے Stripe اکاؤنٹ سے ریونیو اینالیٹکس، CSV/JSON انپورٹ اور ایکسپورٹ، MCP سرور اور CLI شامل ہیں۔ ڈیش بورڈ میں presence کیچ سے لی گئی ریئل ٹائم وزیٹر کی فہرست، per-وزیٹر journey trails، اور شہر کی سطح کے مقامیات کا ایک آپشنل لائیو گلوب بھی دکھایا جاتا ہے۔ کئی آرکیٹیکچرل اصول CI کے ذریعے نافذ کیے جاتے ہیں: ویب ایپ صرف shared contracts پیکیج ایمپورٹ کر سکتی ہے، اور OpenAPI دستاویز frontend اور backend کے درمیان واحد سیّم ہے؛ ClickHouse صرف کوئری گیٹ وے کے ذریعے قابل رسائی ہے؛ ایسا تبدیلی جو ٹریکر سائز بجٹ سے زیادہ ہو جائے بغیر پوری ہوتا ہے؛ اور ایک CI job Postgres اسکیما میں billing tables نہ ہونے کا دعویٰ کرتی ہے۔ خود میزبانی SELF-HOSTING.md میں دستاویزی ہے، جس میں ایک جنریٹر اسکرپٹ اور واحد `docker compose up -d` خودکار TLS کے ساتھ استعمال ہوتا ہے۔ اس کے لیے Docker کے ساتھ ایک Linux میزن کی ضرورت ہوتی ہے، چار DNS ریکارڈز (app، api، c اور rt subdomains)، تقریباً 4 GB RAM اور 25 GB خالی ڈسک۔ ریلیزز ghcr.io پر دس images شائع کرتی ہیں، اس لیے انسٹالیشن ایک pull ہے نہ کہ build؛ arm64 hosts یا branch builds مقامی طور پر images compile کرتے ہیں۔ `upgrade.sh` ریلیزز کے درمیان منتقل ہوتا ہے اور snapshot `rollback.sh` کو درکار لیتا ہے، کیونکہ migrations reversible نہیں ہیں اور دستاویزی واپسی طریقہ restore ہے۔ source سے چلانے کے لیے compiled migration runners سے پہلے builds درکار ہیں۔ صرف AI اسسٹنٹ اور object storage اختیاری ہیں؛ unset ہونے پر وہ surfaces خود کو غیر فعال کر دیتے ہیں۔ ایک CI-style test اور verification suite بغیر infrastructure کے چلتی ہے۔ جغرافیائی مقامیات کا ڈیٹا bundl نہیں کیا گیا (README نوٹ کرتی ہے کہ یہ 60 MB ڈاؤنلوڈ ہے جو ایک ماہ میں purane ہو جاتا ہے)؛ ایک helper script DB-IP ڈیٹا بیس لاتا ہے، CC BY 4.0 کے تحت استعمال ہوتا ہے۔ Contributing pull requests کے ذریعے ہوتی ہے جو اس ریپو میں direct merged ہوتی ہیں، ایک ایک بار CLA کے ساتھ جس میں copyright contributor کے پاس رہتا ہے۔ کوڈ AGPL-3.0 ہے، جسے README نوٹ کرتی ہے کہ کسی بھی modified version کو network service کے طور پر چلانے والے کو users کو modified source پیش کرنا لازمی ہے؛ project name اور hosted service کا domain license grant کا حصہ نہیں ہے۔