-
Notifications
You must be signed in to change notification settings - Fork 8
Security and Privacy.ar
يأتي هذا الدليل من ملف README الموجود. تحتفظ قياساتها بتواريخها الأصلية. لا يُبلغ نقل التوثيق هذا عن تشغيل اختباري جديد. English | فارسی | Русский | 中文
كل عنوان هنا مدعوم بمخرجات جدار الحماية التي تم إنشاؤها
internal/netcfg/testdata/، عن طريق اختبار مسمى، أو عن طريق قياس مسجل في
المستودع. docs/BEHAVIOUR.md هي قائمة الوعود المقروءة. كل
العنوان فيه هو اسم السيناريو في test/bdd/، وكل سيناريو له
مطابقة العيب المحقون. لذلك "يمكن لهذا الاختبار اكتشاف الشيء الذي يدعي أنه يمتلكه
Detect" هي في حد ذاتها نتيجة اختبار.
سياسة السلسلة الأمامية هي drop. القاعدة الأولى فيه هي منع التسرب،
ويسمي فقط نقطة الاتصال والوصلة الصاعدة:
iifname "wlan0" oifname "eth0" إسقاط التعليق "فشل الإغلاق: حركة مرور العميل لا تغادر أبدًا عبر الوصلة الصاعدة"
كل قاعدة تسمح بحركة مرور العميل تسمي جهاز النفق، لذا عندما يختفي النفق وتتوقف تلك القواعد عن المطابقة وتسقط السياسة كل شيء. ال لا يمكن للكتلة نفسها أن تتوقف عن العمل عندما يمر النفق، لأنها لا تفعل ذلك أذكر ذلك. تتم مطابقة كل واجهة بالاسم وليس بالفهرس أبدًا، لذا فإن يتم تحميل مجموعة القواعد دون وجود نفق، وهذا بالضبط عند الحاجة إليها. ال سلسلة ما بعد التوجيه فارغة عن قصد.
السيناريو: "مع اختفاء النفق، لا شيء يسمح للعميل بحركة المرور عبر الوصلة الصاعدة".
دعم اختبار المحلل: TestWithoutInterfaceRemovesOnlyTheRulesNamingIt.
سلسلة الإخراج هي policy drop مع قائمة تصاريح مسماة. وكانت التصاريح
يتم اشتقاقها من خلال تعداد ما يتم تشغيله فعليًا على الهدف بدلاً من أخذ العينات
حركة المرور، وكل تصريح في مجموعة القواعد التي تم إنشاؤها يحمل القراءة التي
يبرر ذلك: مآخذ عميل DHCP الخاصة بـ NetworkManager، وsystemd-timesyncd، وDNS، و
الاسترجاع وجهاز النفق واكتشاف جوار IPv6 والخادم الوكيل
مسموح به عن طريق العنوان وليس عن طريق المنفذ، لذا فإن نقل UDP-on-443 غير مسموح به
مكسورة بصمت. تمت إضافة تصريح واحد من الاستدلال وليس القياس و
يقول ذلك: مربع الرد DHCP كخادم على نقطة الاتصال، والتي conntrack
لا يمكن التغطية لأن رد DHCP وطلبه لا يشتركان في أي صف.
يتم تسجيل الاستفزازات، والأهم من ذلك، الضوابط السلبية
PROVENANCE.md، "الاستفزازات الثلاثة، يتم تشغيلها مع تحميل السياسة". الاختبارات:
TestRestrictedEgress_PermitList,
TestRestrictedEgress_AcceptsEstablishedBeforeItDropsAnything,
TestRestrictedEgress_ServerIsPermittedByAddressNotPort.
يتم ذكر التكلفة في رأس مجموعة القواعد بدلاً من اكتشافها: `apt فشل التحديث من الغلاف الموجود على الصندوق أثناء تشغيل الجهاز.
يؤدي إيقاف تشغيل الجهاز إلى إيقاف نقطة الاتصال، مما يؤدي إلى فصل الهاتف
الضغط على الزر. لذلك هناك عنصر تحكم منفصل يسقط العميل المعاد توجيهه
حركة المرور أثناء ترك نقطة الاتصال وDHCP وDNS واللوحة لأعلى. يرى
internal/privsvc/cut.go وعمل اللوحة cut في internal/panel/priv.go.
القطع هو حالة وقت التشغيل ولا يتم كتابته أبدًا على القرص، لذا قم بسحب القابس
يتراجع عنه. الاختبارات: TestCuttingClientTrafficLeavesTheWayBack،
TestACutIsNeverWrittenDown، TestACutDoesNotSurviveARestart،
TestForwardCut_StopsClientsAndKeepsThePanelReachable.
راجع لوحة والتكوين للتعرف على عناصر التحكم وما يتوقف عليه كل منها.
العملية التي بدأت ليست دليلاً على نجاحها. وكان هذا فشلا حقيقيا. ال
يسجل رأس internal/privsvc/readback.go أن الخدمة بتاريخ 2026-08-30
قام بتسجيل نفسه قيد التشغيل باستخدام نقطة اتصال على wlan0 بينما كان wlan0 لا يزال
محطة على الشبكة المنزلية. كان hostapd عبارة عن عملية مباشرة يتم التحكم فيها عن طريق مأخذ التوصيل
لم يجيب. يوجد هاتف في الغرفة يُدرج إحدى عشرة شبكة ليست من بين شبكاتنا
لهم. وكان dnsmasq يجيب على جهاز شخص غريب على شبكة محلية خاصة بشخص آخر
DHCPNAK.
لا يُسمح بأي شيء بالارتباط بواجهة نقطة الاتصال حتى
netcfg.AssertHotspotInterfaceReleased يثبت أنه مجاني، ولا يوجد تقارير
نفسه يعمل حتى يقرأ AssertHotspotIsAccessPoint نقطة الوصول
بث الاسم المتوقع. الاختبارات:
TestNothingBindsToTheHotspotInterfaceUntilItIsProvedFree,
TestTheServiceDoesNotReportRunningUntilTheAccessPointReadsBackAsOne,
TestAnAccessPointBroadcastingAnotherNameIsNotOurs,
TestTheReleaseIsReadBackBeforeAnythingBindsAndTheAccessPointAfter.
تتم كتابة كل تغيير في الشبكة إلى /var/lib/caspian/netcfg.journal مع ملف
معكوس قبل أن يتم تصنيعه، وإيقاف التشغيل يؤدي إلى إعادة تشغيل تلك العناصر في الاتجاه المعاكس. ال
السجل موجود على القرص وليس في الذاكرة، لذا فإن العملية المتوقفة أو انقطاع التيار الكهربائي يحدث
لا تفقده. يقوم المربع الذي مات في منتصف التغيير بإعادة تشغيل السجل قبل أن ينظر إليه
الجهاز أو يطبق أي شيء جديد.
يتم تسجيل عملية الاستيلاء على واجهة WiFi خطوة بخطوة. الى الامام
تم تشغيل التسلسل وعكساته على الهدف وتسجيلها
PROVENANCE.md، "تم تشغيل تسلسل الإصدار على الهدف". الأربعة
خرجت الأوامر، وأعادت المعكوسات الصندوق إلى شبكته الخاصة به
العنوان الخاص بعد ثماني ثوان.
تغيير واحد ليس له معكوس عن قصد، و
يؤكد TestPlan_InvariantsHoldOnEveryModelledMachine أنه الوحيد:
رفع واجهة نقطة الاتصال. إن أخذ جهاز راديو أثناء الخروج هو أمر أسوأ
بدلاً من ترك الأمر، لأن شبكة WiFi الخاصة بالجهاز، واللوحة الخاصة بالمستخدم
القراءة، يمكن أن يكون على ذلك.
السيناريوهات: "يؤدي إيقاف تشغيل المفتاح إلى إرجاع كل تغيير تم إجراؤه في الصندوق"، "أ
إن عملية التفكيك التي يتم إعادة تشغيلها من مجلة العملية المقتولة تؤدي إلى إلغاء نفس التغييرات".
"يتم تنظيف الصندوق الذي قُتل في منتصف الطريق قبل أن يفعل أي شيء آخر". الاختبارات:
TestJournal_RecordsInverseBeforeTheChange,
TestTeardown_ReplaysInExactReverseOrder,
TestRecover_UndoesAJournalLeftByAKilledProcess,
TestTheTakeoverReleasesTheInterfaceItSaysItWillRelease.
إذا فشل العكس، فسيتم تعليق عكس جدار الحماية بدلاً من تشغيله
المربع الذي لا يمكنه التراجع عن مساراته يحتفظ بالكتلة الخاصة به. اختبار:
TestTheFirewallIsNotRemovedWhenAnEarlierInverseFailed.
يتم البحث عن كل ما ينتجه التدفق عن بيانات الاعتماد الملصقة:
- كل خطأ، وكل رسالة تظهر للمستخدم
- خطوط سجل الجهاز
- وصف اللوحة للتكوين
- الإعدادات المحفوظة أثناء عرضها للتشخيصات
- جدار الحماية الذي تم إنشاؤه
- تكوين DHCP و DNS الذي تم إنشاؤه
- سجل المحرك الخاص
- المجلة على القرص
- الطلب الذي ينتقل من لوحة المحرومين إلى الخدمة المميزة
إنه ليس في أي منها. يتم التحقق من وجوده في المكانين الذي يجب أن يكون فيه، لذلك لا يمكن أن يمر الاختبار بسبب فقدان التكوين.
السيناريوهات: "لا تصل بيانات الاعتماد الملصقة أبدًا إلى الشاشة أو السجل أو الملف القابل للقراءة
file"، "تصل كلمة مرور نقطة الاتصال إلى نقطة الوصول ولا شيء آخر". الاختبارات:
TestPastedConfigNeverAppearsInAResponseOrALog,
TestFailedConfigPathsDoNotEchoTheInput، TestStartRequestRedactsItself،
TestNoCredentialReachesTheAdvancedView,
TestTheServerAddressNeverAppearsInADiagnosticLine.
يتم تجميع كل ورقة أنماط وبرنامج نصي وأيقونة يقوم المتصفح بتحميلها في ملف ثنائي
مع go:embed. انظر internal/panel/assets.go. لا يوجد خط ويب على الإطلاق:
مجموعة الخطوط في ورقة الأنماط عبارة عن وجوه نظام بالكامل، وهي وجوه ذات قدرة فارسية
أولا.
سبب الخصوصية هو أن الأصل البعيد يخبر طرفًا ثالثًا بعنوانه كل من يفتح اللوحة. السبب الأقوى هو التوفر. اللوحة لديها للتحميل عندما يكون النفق معطلاً، وهو بالضبط عندما يحتاجه شخص ما.
آليتان وليست واحدة. TestNoAssetReferencesAnExternalURL و
يقوم TestNoRenderedPageReferencesAnExternalURL بفحص الأصول وكل ما تم تقديمه
صفحة لعنوان URL مطلق. setSecurityHeaders يرسل default-src 'none' مع
تم تعيين كل مصدر مدرج على 'self'، لذلك يرفض المتصفح المصدر الذي تجاوز
الاختبارات. لا يوجد عميل HTTP صادر في أي مكان في internal/panel خارج نطاقه
الاختبارات الخاصة.
الطلب الوحيد الذي يقدمه Caspian للمحتوى هو تحديث الاشتراك، و يضغط عليه الشخص. يتم تشغيله في النصف المميز بدلاً من اللوحة، فهو كذلك تم الرفض قبل فتح أي مقبس ما لم يكن المحرك قيد التشغيل، ويتم الاتصال به من خلال الاسترجاع الخاص بالمحرك SOCKS الوارد مع تسليم اسم المضيف إليه الوكيل بدلاً من حلها هنا، لذلك لا البايتات ولا البحث عن الاسم الوصول إلى مزود خدمة الإنترنت الخاص بالشخص. لا يوجد مؤقت ولا تحديث عند التمهيد ولا تحديث عندما يأتي النفق.
لا يذكر التكوين الذي تم إنشاؤه أيضًا أي محلل Google في أي مكان، ولا يستخدم أي
القاعدة geoip: أو geosite:، لأن أيًا منهما سيعيد تقديم التنزيل إلى ملف
المنتج الذي تكون قصة تثبيته بالكامل عبارة عن ثنائي واحد تم التحقق منه. الاختبارات:
TestNoGoogleAnywhereInGeneratedConfigs,
TestGoogleResolverIsRejectedAtTheSource. السيناريو: "لا يحتاج الصندوق إلى التنزيل
ولا يطلب أي شيء من خادم Google".
يعمل caspian serve --privileged كجذر ويمتلك المسارات وجدار الحماية و
نقطة الوصول والمحرك. يقبل قائمة قصيرة من الإجراءات المسماة عبر ملف
مقبس يونكس ولم يتم إنشاء أمر من إدخال المستخدم أبدًا. caspian serve --panel
يعمل كحساب caspian غير المميز ويمتلك واجهة الويب و
لا شيء آخر. راجع Architecture للتعرف على المفردات وتنسيق الإطار.
تتم تجزئة كلمة مرور اللوحة باستخدام argon2id. انظر internal/state/password.go. ذلك
هي كلمة مرور محلية على المربع. لا يوجد حساب في أي مكان آخر.
لا تحتوي Pi على ساعة بطارية، وتعتمد آليتان منفصلتان على ساعة الحائط. يكتبها REALITY في المصافحة، ويقوم بتكوين xray-core يقبل يعتمد على التاريخ. لذا فإن الصندوق الذي تظهر ساعته بشكل خاطئ لا يفشل في ذلك فحسب اتصال. فهو يقبل التكوين الذي يرفضه الثنائي نفسه بمجرد أن تكون الساعة تصحيح.
يتم تشغيل الفحص قبل التحقق من الصحة وقبل محاولة أي شيء. انظر
internal/privsvc/clock.go، تم استدعاؤه من Service.Start كخطوة 1 من
applyLocked. إنه يثير خطأً واضحًا حتى لا تلوم اللجنة المستخدم
التكوين. الاختبار: TestClockFailureIsNotBlamedOnTheConfig.
"تعذرت قراءة هذا الرابط"، "اقرأه، ولا يمكن استخدامه كما هو مكتوب"، و "الارتباط جيد ولم يستجب الخادم" يحتاج إلى ثلاثة إجراءات مختلفة من المستخدم، والثالث هو الأكثر شيوعا. إلقاء اللوم على التكوين أولا هو ما يجعل شخصًا ما يتخلص من التكوين الذي لم يتم كسره أبدًا. لا شيء على الجهاز يتم لمسه قبل قراءة النص الملصق. السيناريوهات: "نص ليس رابطًا يتم رفضه على الإطلاق قبل لمس أي شيء"، "رابط لن يقوم به المحرك يتم إخبار القبول بصرف النظر عن الرابط الذي لن يتم تحليله، "الارتباط الذي لا خادمه أبدًا لا يتم إلقاء اللوم على الإجابات على الرابط".
هذه القائمة هي التي يجب قراءتها عن كثب.
تتم إعادة توجيه DNS الخاص بالعميل على المنفذ 53 إلى هذا المربع عبر كلا البروتوكولين بدلاً من مسموح به فقط. لذلك يتم الرد هنا على جهاز مزود بمحلل مشفر من السماح له بالوصول إلى الشخص الذي قيل له استخدامه. DNS عبر TLS على 853 هو تم رفضه من خلال إعادة تعيين TCP، وبالتالي يعود الجهاز إلى المنفذ المعاد توجيهه. DNS تم إسقاط أكثر من QUIC على 853.
لا يمكن تمييز DNS عبر HTTPS على المنفذ 443 عن أي HTTPS آخر وهو كذلك
يتم تنفيذها عبر النفق مثل أي شيء آخر. العميل الذي يستخدمه موجود داخل
النفق ولا يتسرب. كما أنها غير مرئية. لا شيء في هذا المشروع، و
لا شيء في تسخير الأجهزة، يمكن ملاحظته. وهذا هو الحد من التصميم.
تم ذكره في مجموعة القواعد التي تم إنشاؤها نفسها، في docs/BEHAVIOUR.md، وفي
الإخراج المطبوع لفحص تسرب DNS وليس هنا فقط.
لا يوجد نفق IPv6. يفضل الجهاز الذي يحتوي على مسار IPv6 صالحًا على IPv4
وسوف يتجاوز النفق بالكامل، وبالتالي فإن السياسة الافتراضية هي الحظر. أربعة
الأشياء تحمل ذلك. IPv6Block هو الإعداد الافتراضي في netcfg.DefaultOptions. الصندوق
لا يعيد توجيه IPv6. يسقط جدار الحماية IPv6 المُعاد توجيهه على نقطة الاتصال في كليهما
الاتجاهات. ويتم إسقاط إعلانات جهاز التوجيه الموجهة إلى نقطة الاتصال، لذلك أ
لا يمكن للجهاز أن يعطي لنفسه عنوانًا. السيناريو: "لا يُعرض على العملاء مطلقًا
IPv6 الذي لا يستطيع النفق حمله".
IPv6Forward موجود كخيار وينص تعليقه على عدم تعيينه. ال
لم يُظهر أن محرك TUN الداخلي للمحرك يحمل IPv6 على الهدف. إنه أيضًا
لا يضيف أي قاعدة تصريح إلى السلسلة الأمامية، بشكل متعمد: يسمح IPv4 بالاسم
الشبكة الفرعية لنقطة الاتصال في كلا الاتجاهين، ولا توجد بادئة v6 في أي مكان في
خطة للتسمية، والقاعدة التي تطابق اسمي الواجهة فقط ستقبل أي منها
عنوان المصدر كتبه العميل. TestRuleset_NoUnconstrainedIPv6AcceptInForward
يحمل هذا الخط.
"المحظور" يتعلق بالتوجيه، وليس بـ DNS، والفرق مهم. An
لا يتم منع استعلام AAAA من جهاز متصل ولا يتم الرد عليه فارغًا. ذلك
يذهب إلى المحرك، عبر النفق، ويعود بسجلات AAAA الحقيقية،
لأن مستند المحرك يطلب UseIP ولم يقم dnsmasq بتعيين filter-AAAA.
وبالتالي، يتعرف الجهاز على عناوين IPv6 التي لا يستطيع الوصول إليها، فيتراجع
إلى IPv4.
هذا غير ضار بينما لا شيء يمكن أن يمنح العميل عنوان v6، وهو
أول شيء يتوقف عن كونه غير ضار إذا حدث أي شيء على الإطلاق، لأن العميل
مع مسار v6 العامل يفضل إجابة AAAA وسيغادر عبر هذا المسار
لا يحمل مربع. هو مكتوب هنا بدلا من تركه كمفاجأة، و
TestAAAAQueriesAreAnsweredAndNotSuppressed يقوم بتثبيت كلا النصفين بحيث يتغير
يجب أن يكون قرارا.
لا يمكن لجهاز الكمبيوتر تصنيف IPv6 على الإطلاق، لذلك لا ينتج IPv6 منه
أي شيء. يسجل test/hardware/README.md، ضمن "ما لا تستطيع هذه الميزة تحقيقه
الصف: IPv6"، أن الهاتف يحمل فقط عنوان الارتباط المحلي، ذلك
ip -6 route show default فارغ على الهاتف وعلى Pi، وذلك أ
الاتصال بإجابات IPv6 الحرفية "الشبكة غير قابلة للوصول". لا يوجد IPv6
على شبكة LAN هذه على الإطلاق، لذلك سيتم إجراء فحص تسرب IPv6 هناك بدون
الجهاز يفعل أي شيء كل نتيجة أجهزة لهذا المشروع هي IPv4
نتيجة. يجب على أي شخص يقوم بتشغيل هذا على شبكة تعمل باستخدام IPv6 أن يتعامل مع ذلك على أنه
سؤال جديد، وليس سؤالًا مغطى، ويجب أن تتوقع كتابة الاختبار بدلاً من ذلك
تمكين واحد.
يتعلق الوعد بـ حركة مرور العميل المعاد توجيهها. اتصال الصندوق الخاص بـ
يجب أن يصل الخادم الخاص بك إلى الوصلة الصاعدة مباشرةً وإلا فلن يكون هناك نفق على الإطلاق، و
docs/2026-08-29-design.md القسم 7 يضع حركة المرور الخاصة بالصندوق خارج
ضمان لهذا السبب.
يعمل مفتاح إيقاف سلسلة الإخراج على تضييق ذلك ولا يغلقه. المتولدة تحدد مجموعة القواعد ما تبقى في رأسها. DNS عبارة عن ثقب: أي شيء على لا يزال بإمكان box الوصول إلى الشبكة على المنفذ 53، واسم مضيف الخادم هو حلها بشكل واضح على الشبكة المحلية قبل وجود أي نفق. ولا هو كذلك تسرب لحركة مرور العميل، ولا يتفاقم أي منهما بسبب مفتاح الإيقاف.
سياسة سلسلة الإدخال هي accept، أيضًا حسب التصميم ومذكورة أيضًا في
مجموعة القواعد. كان الإصدار السابق يحمل الاسم drop، ويسجل PROVENANCE.md ما
حدث عندما تم قياسه على الهدف. كان كل اتصال وارد جديد
تم الرفض وتوقف SSH عن الرد، بينما استمرت الجلسة المفتوحة بالفعل في العمل،
والتي على آلة مقطوعة الرأس لا يمكن تمييزها عن الحادث. المكان الوحيد
سلسلة الإدخال تقيد أي شيء هو جانب نقطة الاتصال، حيث يوجد جهاز متصل
يصل إلى DHCP وDNS واللوحة وصدى ICMP ولا شيء آخر على الصندوق.
تحتوي مجموعة القواعد على iifname "wlan0" oifname "wlan0" drop. هذه هي القاعدة
يتم فحص الحاضر. أنه يعمل ليس كذلك.
يقوم test/tunnel بنقل البايتات الحقيقية من خلال خادم حقيقي للأشعة السينية وكل شيء
فيه في حالة استرجاع، لذا فهو لا يلتقط أي خروج من IP ولا يمكنه ذلك. test/bdd لا يوجد لديه
شبكة، لا يوجد راديو، لا جذر ولا جهاز نفق. إنه يدير المحرك الحقيقي في
العملية من خلال محمل التكوين الحقيقي، لذلك "قبل المحرك هذا التكوين و
"بدأ" يعني ما يقوله، ولكن النفق الداخلي مغلق.
لذلك لا يوجد شيء في هذا المستودع يلبي معايير الاتصال الخاصة بالمشروع
شيء يعمل. ينتهي docs/BEHAVIOUR.md بقسم "ما هذا الجناح
لا يثبت"، مع ذكر ما لا يزال مستحقا. اقرأها كجزء من المجموعة.
انظر العيب د1. إذا كان هناك شيء يمسح الطاولة أثناء وجود الجهاز قيد التشغيل، ويستمر الصندوق في إعادة التوجيه، وتستمر اللوحة في توصيل التقارير، و لا شيء يلاحظ.
الإنترنت يتحرك بسبب فصل الكابل أو تجديد عقد الإيجار بشكل مختلف، هو التغيير الذي لا يفشل فيه شيء بصوت عالٍ. الطريق المثبت إلى لا يزال الخادم موجودًا ولا يزال يشير إلى عنوان لم يعد يمثل مخرجًا. لا يلاحظ الصندوق، ويظل النفق متوقفًا حتى يضغط شخص ما على الزر التبديل مرة أخرى.
ما يكلف ذلك هو التوفر، وليس الخصوصية. تظل حركة مرور العملاء محظورة
طوال الوقت، لأن السياسة الأمامية يتم إسقاطها وكل قبول فيها يسمي
نفق. netcfg.WatchUplink وPlan.RederiveForUplink موجودان ويعملان، ولا يوجد
مكالمات الرمز المشحونة أيضًا. TestNothingInTheApplianceWatchesTheUplink هو ما
يوقف الجملة المقابلة من الانجراف مرة أخرى إلى المستندات حيث كانت
حتى 2026-08-30.
يتم تأليف كل تركيبات الوضع B. يسجل PROVENANCE.md أن الهدف موجود
راديو واحد ولا يوجد محول USB، لذا فإن الترتيب الذي يخبر به هذا المنتج الأشخاص
شراء محول لثبت ضد بايت لا أحد يقاس.
Architecture | Panel-and-Configuration | Troubleshooting
أرصدة انتحال SNI: patterniha/SNI-Spoofing (GPL-3.0)، مع WinDivert (LGPL-3.0) على نظام التشغيل Windows x64. تراخيص الطرف الثالث، والإصدارات المصدر، والائتمانات.
أدلة Caspian: الإعداد والبروتوكولات المدعومة · انتحال SNI للتحايل على DPI: الإعداد والحدود.
- Architecture and data flow
- Development and testing
- Documentation map
- Getting started
- Install on Linux and Raspberry Pi
- Install on macOS
- Install on Windows
- Installation
- Licence and credits
- Page template
- Panel and configuration
- Protocols and transports
- Releases and maintenance
- Security and privacy
- Caspian SNI spoofing and TLS splitting for DPI circumvention
- Third-party code and credits
- Translations
- Troubleshooting for home users