سمة
ألوان، خطوط، زوايا، كثافة، تخطيط، خلفية، تأثيرات. ثلاثة ألوان تكفي؛ والبقية تُشتقّ ويبقى النص مقروءًا.
أو ابنِها في التطبيق: المظهر ← منشئ السمات ← تصدير. ويسرد THEMES.md كل ما تستطيع السمة ضبطه.
(FOSS) طلب السحب هو التقديم
السمة ملف JSON واحد. والإضافة ملف JavaScript واحد. اصنعها، جرّبها في التطبيق، ثم أضفها إلى المتجر: مجلد واحد في طلب سحب واحد، أو الملف في بلاغ إن كنت لا تستخدم git. كلاهما يحتاج إلى حساب مجاني على git.crt.fyi، ولا شيء غيره.
ابدأ من ملف يعمل. أداة الإنشاء تكتب لك واحدًا؛ وقسم «إنشاء» في التطبيق نفسه (wayBetter ← إنشاء) فيه أمثلة وقيم السمة الحيّة.
ألوان، خطوط، زوايا، كثافة، تخطيط، خلفية، تأثيرات. ثلاثة ألوان تكفي؛ والبقية تُشتقّ ويبقى النص مقروءًا.
أو ابنِها في التطبيق: المظهر ← منشئ السمات ← تصدير. ويسرد THEMES.md كل ما تستطيع السمة ضبطه.
صنف فيه start() وstop()، وترويسة تذكر من صنعها وما الذي تستخدمه.
أضف --ts لمشروع TypeScript. وفي PLUGINS.md واجهة API والأذونات وإعادة التحميل الحيّة.
/**
* @name Hide Trends
* @description Hides the trends box in the right column, so the timeline is the only thing moving.
* @version 1.0.0
* @author you
* @permissions network:none
*/
module.exports = class HideTrends {
start() { wayBetter.api.injectCSS('hide-trends', '[data-testid="sidebarColumn"] section { display: none }'); }
stop() { wayBetter.api.clearCSS('hide-trends'); }
};
يقرأ المتجر اسم الإضافة ومؤلفها وإصدارها ووصفها وأذوناتها من هذه الترويسة، واسم السمة ومؤلفها ووصفها من ملف JSON الخاص بها. وشاشة التثبيت تعرض القيم نفسها، فلا يمكن أن يختلف الاثنان أبدًا.
المتجر اختياري. الملف الذي يعمل قابل للمشاركة أصلًا.
custom.css المحفوظ يُعاد تحميله في كل علامات التبويب دفعة واحدة.waybetter://install يشير إلى عنوان https على waybetter.fyi أو cdn1.crt.fyi أو إلى ملف خام على git.crt.fyi. لا تُثبَّت أبدًا من دون شاشة التثبيت.كل عنصر في المتجر مجلد تحت store/<app>/ في المستودع. اسم المجلد هو معرّف العنصر وعنوانه هنا: /store/plugins/<id>/.
store/x/plugins/hide-trends/
hide-trends.plugin.js the plugin, exactly as it installs
item.json { "category": "focus", "tags": ["trends", "sidebar"] }
preview.svg optional, 640×400 (.svg or .png); drawn for you without one
store/x/themes/midnight-mint/
theme.json the theme, as Appearance → Export writes it
item.json { "version": "1.0.0" }
preview.svg optional; drawn from the theme without one
categoryreading أو writing أو filters أو focus أو tools. السمات: dark أو light، وتؤخذ من mode الخاص بالسمة إن تركتها.tagsversionهذا هو التقديم كله. الصفحة والبطاقة ومدخل البحث ومعاينة الرابط والبيانات المنظَّمة ومدخل خريطة الموقع تُولَّد من الفهرس الموقَّع عند بناء الموقع. وفي store/README.md القواعد كاملة.
لا يوجد CI مستضاف. الفحوص أوامر تشغّلها قبل أن ترسل، ويشغّلها أحد المشرفين مجددًا قبل الدمج.
git submodule update --init
bun install --frozen-lockfile
bun run check:store # your folder, against the Store's rules
bun run test # everything else, including the site's SEO test
a-z 0-9 -، حتى 40)، name.plugin.js، بلا تكرار داخل التطبيق الواحد@name و@version ووصف، وسطر @permissions يذكر network أو network:nonenetwork:none حين تستدعي الشيفرة fetch أو XMLHttpRequest أو WebSocket أو EventSource أو sendBeacon؛ واستدعاءات API المقيَّدة يجب التصريح بهاeval ولا new Function ولا import()؛ ولا سكربتات أو ملفات خارجية في المعاينة؛ ولا @import أو عناوين خارجية في CSS السمةطريقان للمشاركة. كلاهما يحتاج حسابًا مجانيًا على git.crt.fyi: يمكن لأي شخص التسجيل، ويوافق أحد المشرفين على كل حساب جديد يدويًا.
مفتاح توقيع المتجر غير متصل عمدًا، فالدمج ليس نشرًا. بعد الدمج يقرأ أحد المشرفين الشيفرة، ويشغّل waybetter store build وwaybetter store sign على الجهاز الذي يحفظ المفتاح، ثم يدفع التغييرات. يُعاد بناء الموقع، ويحصل عنصرك على صفحته، ويراه كل تطبيق في المرة التالية التي يقرأ فيها الفهرس الموقَّع.
كل ما في الفهرس الموقَّع يضمنه ذلك المفتاح، ولهذا يقرأ إنسان كل إضافة قبل توقيعها.
ملف واحد لكل تطبيقات wayBetter. لا تعدّله يدويًا أبدًا: إنه يُبنى من المجلدات.
{ "format": 2, "name": "wayBetter Store", "generatedAt": "2026-09-30T…Z", "items": [
{ "apps": ["x"], "kind": "plugin", "id": "thread-reader", "name": "Thread Reader",
"author": "wayBetter", "version": "1.2.0", "description": "…",
"category": "reading", "tags": ["threads"],
"url": "https://waybetter.fyi/store/plugins/bt-thread-reader.plugin.js",
"file": "bt-thread-reader.plugin.js", "sha256": "<64 hex>", "size": 10961,
"preview": "https://waybetter.fyi/store/previews/plugin-thread-reader.svg",
"permissions": ["ui", "clipboard", "commands", "network:none"] }
] }
apps الخاصة به. يتحقق التطبيق من الملف كله ويحتفظ بعناصره فقط.ليست عناصر في المتجر: اللغات الـ51 كلها مدمجة في التطبيق وتُحمَّل عند الحاجة.
apps/desktop/locales/<tag>.json، بطلب سحب أو ببلاغ ترفق به الملف المعدَّل.bun run i18n:check: المفاتيح، العناصر النائبة، صيغ الجمع، بلا وسوم. يجب أن يطبع 0 error(s).