المنصة
منصة واحدة للأعلام،والاختبار، والإصدار الآمن.
استهدف المستخدمين، واختبر القواعد، وراجع التغيير، ثم سلّمه حزمةً موقّعة إلى كل SDK متصل في نحو 0.2 ثانية. وكل خطوة تترك سجلًا يمكنك التحقق منه.
- Rule 01Internal staffcontextin segmentinternal-staff serve true
- Rule 02EU rollout25% → 50%regionin[EU]ANDsignedIneqtrueRollout by key50%true inside · false otherwise
- Default
- falseenabled, no rule matched
- Off
- falseflag disabled
rules[1].serve.percentage
- 25
+ 50
Draft differs from r184. SDKs keep r184 until you publish.
Open change requestقواعد مرتبة
أول قاعدة تنطبق هي التي تحسم النتيجة، وكل نتيجة تحمل القاعدة التي طابقتها وسببها.
طرح تدريجي حتمي
تجزئة MurmurHash3 لمفتاح العلم ومفتاح المستخدم. رفع النسبة من 25% إلى 50% يُبقي كل من كان داخلها.
مسودة ثم نشر
التعديلات تغيّر المسودة فقط، ولا يصل شيء إلى أي SDK قبل نشر نسخة جديدة.
الأعلام
قيم بأنواع محددة، لا مجرد تشغيل وإيقاف.
أعلام من نوع boolean وstring وnumber وJSON، لكل منها غرض ومدة صلاحية. مفتاح العلم ونوعه لا يتغيران أبدًا، فلا تنكسر الشيفرة التي تقرؤه.
- أربعة أنواع: boolean وstring وnumber وJSON، وتُتحقَّق القيم من النوع (ومن JSON schema اختياري) قبل أن يُسمح بحفظها.
- غرض لكل علم (إصدار، تجربة، تشغيلي، صلاحيات)، وأعلام دائمة لمفاتيح الإيقاف الطارئ.
- إتاحة لكل علم على حدة لجهة العميل: مفاتيح المتصفح لا تستقبل إلا الأعلام المتاحة للعميل.
- الأعلام تُؤرشف ولا تُحذف، والعلم المؤرشف يُرجع القيمة الاحتياطية التي تمررها.
الطرح التدريجي بالنسبة المئوية حتمي
اكتب أي مفتاح مستخدم. تُحسب الخانة (bucket) في متصفحك بشيفرة MurmurHash3 نفسها التي يستخدمها الـ edge والـ SDK والـ CLI وCI، فتقع في العمود نفسه في كل صف.
hash("checkout-v2", "user_1") → 40.61 < 50 ✓ · rollout 50%
الاستهداف
قواعد تقرؤها، ونتائج تستطيع تفسيرها.
القواعد بيانات تُقيَّم بالترتيب. تقارن الشروط سمات السياق أو تعيد استخدام الشرائح، وكل تقييم يذكر القاعدة التي حسمت النتيجة وسبب ذلك.
- 15 عاملًا للمقارنة: التساوي، والقوائم، والنصوص، والأرقام، والوجود، والشرائح.
- تُعرَّف الشرائح مرة واحدة لكل مشروع، ويمكن أن تشير إحداها إلى أخرى حتى أربعة مستويات.
- لا تُنفَّذ أي شيفرة للمستخدم أثناء التقييم، والتقييم لا يرمي استثناءً أبدًا.
جرّب سياقًا
checkout-v2 · r184قواعد توضيحية للعلم checkout-v2
- 01 segment internal-staff → true
- 02 region in ["EU"] AND signedIn = true → 50% true
- default → false
القيمة
false
السبب
rule_match
القاعدة
02
الخانة
56.82
يُقيّمها @nanoflags/engine داخل متصفحك · قواعد للتوضيح
البيئات
قارن قبل أن تُرقّي.
لكل بيئة مسودتها ونسخها ومفاتيحها. والترقية تنسخ إعدادات أعلام مختارة من مسودة بيئة إلى مسودة بيئة أخرى، وتحفظ سجلًا بما نسخته.
- تبدأ المشاريع الجديدة ببيئات Development وStaging وProduction، وتكون Production محمية منذ البداية.
- الترقية لا تنشر شيئًا، ويُربط النشر التالي في البيئة الهدف بسجل الترقية.
- إذا تغيّرت البيئة الهدف أثناء مراجعتك، تُرفض الترقية بدلًا من الكتابة فوق التغيير.
- checkout-v2Staging · 50% · EU, signed inProduction · 25% · EU, signed in
- new-pricing-pageStaging · on · internal-staffProduction · off
- search-rankingStaging · "relevance-v2"Production · "relevance-v2"
- dark-modeStaging · onProduction · on
Promotion record
- source
- staging r212 · draft matched
- target
- production draft · base r184
- checksum
- a41e09 → 7c0b3d
- publish
- linked on the next publish
فحوص السيناريوهات
اختبارات وحدات لتغييرات الأعلام.
السيناريو سياق محفوظ مع القيمة التي تتوقعها. شغّل السيناريوهات على المسودة قبل النشر، من لوحة التحكم أو في CI. وحيث تكون إلزامية، ينتظر النشر حتى ينجح كل سيناريو ضمن النطاق على تلك المسودة بعينها.
- النجاح يعني التطابق التام: لا تحويل للأنواع، ولا نجاح جزئي.
- أي تعديل على المسودة يُسقط احتساب التشغيلات السابقة.
- المحرك نفسه يعمل في لوحة التحكم والـ CLI وGitHub Action والـ SDK.
شغّلها في CI
nanoflags scenarios run --source draftEU signed-in users get the new checkout
{ region: "EU", signedIn: true, key: "u_18" }
expected trueactual true
Signed-out visitors keep the old checkout
{ region: "EU", signedIn: false }
expected falseactual false
Internal staff always see it
{ staff: true, region: "US" }
expected trueactual true
US customers stay out of the rollout
{ region: "US", signedIn: true }
expected falseactual truematched Rule 02 (region in [EU, US])
طلبات التغيير
يوافق شخص آخر، لا صاحب التغيير.
اجمع الأعلام التي تعدّلها في طلب تغيير واحد مع سبب واضح. وحيث تُشترط الموافقة، لا يتم النشر إلا عبر تغيير حصل على العدد الكافي من الموافقات المستقلة، وكل موافقة مرتبطة بالمسودة نفسها التي رُوجعت.
- لا يستطيع صاحب التغيير الموافقة عليه، ولا أي شخص عدّل المسودة منذ بدء التغيير.
- إذا عُدّلت المسودة بعد الموافقة، تصبح الموافقة متقادمة.
- لا تتجاوز مفاتيح API المراجعة: مفتاح المسؤول لا يستطيع النشر حيث تُشترط الموافقة.
- draft
- testing
- awaiting_approval
- approved
- published
author maya
draft 9f3c1a
reason Error rate flat for 48 h at 25%. Next step of the rollout plan.
Scenario checks
4 / 4 passed on draft 9f3c1a · CI key
Approvals · 1 required
- mayaauthor · cannot approve
- samedited this draft · cannot approve
- leeapproved 9f3c1a · 12:04 UTC
التسليم
يُوقَّع عند المصدر، ويُدفع إلى كل SDK.
يُوقَّع كل نشر بخوارزمية Ed25519 ويُدفع عبر WebSockets على شبكة حافة عالمية. يتحقق الـ SDK منه، ويستبدله دفعة واحدة، ويواصل التقييم محليًا.
كيف نقيس ذلك222ms
p50، من تثبيت قاعدة البيانات حتى مستمع الـ SDK
326ms
p95، على المسار نفسه
latency_summary · آخر 24 ساعة · 1,418 عيّنة
- التقييم محلي ومتزامن: لا طلب شبكة لكل علم.
- إذا انقطع الاتصال، يواصل الـ SDK التقييم بآخر إعدادات تحقّق منها.
- مفاتيح المتصفح لا تستقبل إلا الأعلام المتاحة للعميل والشرائح التي تستخدمها.
الـ SDK والأدوات
يندمج في طريقة عملك الحالية.
حزم SDK أصلية لـ JavaScript/TypeScript وPython وGo، ومزوّد OpenFeature لكل منها، وأي لغة أخرى عبر OFREP، وأدوات لـ CI وطلبات الدمج. والشيفرة التي تعمل داخل تطبيقك مرخّصة بـ Apache-2.0.
- @nanoflags/sdk
SDK لـ JavaScript وNode
تقييم محلي، وتحقق من التوقيع، وآخر إعدادات سليمة. بلا أي اعتماديات وقت التشغيل.
التوثيق - pip install nanoflags
SDK لـ Python
التثبيت بـ pip install nanoflags. تقييم محلي، وتحديثات حية، وتحقق من التوقيعات افتراضيًا، وغلاف asyncio. Python 3.9 فأحدث.
التوثيق - github.com/motazalmaroai/nanoflags-sdk/go
SDK لـ Go
تقييم محلي دون أي إدخال أو إخراج، وتحديثات حية، وتحقق من التوقيعات افتراضيًا، وآمن للاستخدام المتزامن. Go 1.22 فأحدث.
التوثيق - @nanoflags/sdk/react
React
مزوّد وhooks فوق الـ SDK. مرّر حزمة bootstrap ليتطابق العرض على الخادم والعميل.
التوثيق - @nanoflags/openfeature-provider
مزوّدات OpenFeature
استدعِ الأعلام عبر واجهة OpenFeature القياسية في JavaScript (الخادم والويب) وPython وGo، ويتولى NanoFlags التقييم المحلي من تحتها.
التوثيق - @nanoflags/cli
CLI
أنشئ الأعلام، وقيّم سياقًا، وشغّل السيناريوهات، وافحص مراجع الشيفرة، وصدّر كل شيء.
التوثيق - integrations/github-action
GitHub Action
يشغّل فحوص السيناريوهات لكل commit ويُفشل المهمة إذا فشل أحدها.
التوثيق - github.com/apps/nanoflags
تطبيق GitHub
حالة الأعلام في تعليق على طلب الدمج، وفحص باسم “NanoFlags scenarios”.
التوثيق - /ofrep/v1
أي لغة عبر OFREP
يطبّق الـ edge بروتوكول OpenFeature Remote Evaluation Protocol، فتستطيع مزوّدات OFREP في Java و.NET وPHP وRuby وSwift وKotlin وغيرها قراءة أعلامك.
التوثيق
السجل
كل نسخة محفوظة، وأي نسخة قابلة للاستعادة.
كل نشر يُنشئ نسخة مرقّمة غير قابلة للتعديل. الاستعادة تحمّل نسخة قديمة إلى المسودة ثم تنشرها كنسخة جديدة، فلا يُعاد كتابة التاريخ أبدًا.
- تكتب قاعدة البيانات سجل التدقيق بنفسها لا المتصفح، وهو للقراءة فقط.
- استعادة نسخة تُعيد معها الشرائح التي كانت تستخدمها أيضًا.
- صدّر سجل التدقيق في خطة Scale، وصدّر المشروع كاملًا بصيغة JSON من لوحة التحكم أو الـ CLI.
- r185current
Raise checkout-v2 to 50% in EU
lee · 12:06
- r184Restore to draft
checkout-v2 to 25% in EU
lee · 10 Nov 09:12
- r183Restore to draft
Enable new-pricing-page for internal staff
omar · 9 Nov 16:40
audit log
12:06:14leepublished r185 · production
12:04:51leeapproved change · draft 9f3c1a
12:01:09ciscenarios 4/4 passed · commit 3e1f2a0
11:58:32mayaedited draft · checkout-v2
مرّر إصدارك القادم عبره.
خطة Explore مجانية. وتضيف خطة Team الموافقات وفحوص السيناريوهات الإلزامية للبيئات المحمية.