00. Best free stack for this Arabic app (VPS + AI agents you already have) 00. أفضل حزمة مجانية لهذا التطبيق (الخادم والوكلاء الموجودون لديك)
Verdict: Static-First PWA on the Caddy you already run. No Node, no Docker, no paid API for version 1. القرار: PWA ساكن أولاً على Caddy الذي يعمل لديك. بلا Node وبلا Docker وبلا واجهة مدفوعة في الإصدار الأول.
Claude/Unified already named this Tier 0 — Static core: HTML/CSS/JS, progress in the browser, Caddy serving files. That alone delivers flashcards, native audio, record-and-compare, RTL, TPR, dialogues, streaks, and the phonetic bootcamp — most of the teaching value. Monica is the only source that requires a Service Worker; we take that piece and add a Web App Manifest so the app is installable from the browser on phones. Piper runs once at build time (your AI agents can generate curriculum + diacritics + audio). Runtime RAM on the VPS is Caddy only (~35 MB). The app stays usable when the mic is denied, when SpeechRecognition is missing (iOS Safari / Firefox), on 3G, in private mode, and with large system fonts.
وثائق كلود/الموحّد تسمّي هذا المستوى 0 — النواة الساكنة: HTML/CSS/JS، التقدم في المتصفح، وCaddy يقدّم الملفات. هذا وحده يعطي البطاقات والصوت الأصلي والتسجيل والمقارنة واتجاه RTL وأوامر TPR والحوارات والسلسلة والمعسكر الصوتي — معظم القيمة التعليمية. مونيكا هي المصدر الوحيد الذي يفرض Service Worker؛ نأخذ ذلك ونضيف بيان تطبيق ويب ليصبح قابلاً للتثبيت من المتصفح على الهواتف. Piper يعمل مرة واحدة وقت البناء (وكلاؤك يولّدون المنهج والتشكيل والصوت). استهلاك الذاكرة وقت التشغيل على الخادم هو Caddy فقط (~35 ميجا). التطبيق يبقى صالحاً عند رفض الميكروفون، وغياب التعرف على الكلام (سفاري آيفون / فايرفوكس)، وعلى شبكة 3G، وفي التصفح الخاص، ومع خط النظام الكبير.
| Layer | Choice | Why (from the files + your constraints) |
|---|---|---|
| UI | Vanilla HTML5 + CSS3 + ES modules | All serious build guides reject React/Vue/Next. No bundler. Initial page < 500 KB excluding media (Kimi). Works on old WebViews.كل أدلة البناء الجادة ترفض React/Vue/Next. بلا حزمة بناء. الصفحة الأولى أقل من 500 ك.ب بدون الوسائط. يعمل على متصفحات الويب القديمة في الهواتف. |
| Install / offline | manifest.webmanifest + service-worker.js | Monica Week 6 + deploy checklist: Service Worker, HTTPS, Lighthouse >90, iOS/Android. Add-to-Home-Screen on Android Chrome and desktop Chromium; iOS via Share → Add to Home Screen.أسبوع 6 وقائمة مونيكا: Service Worker وHTTPS وLighthouse أعلى من 90. التثبيت على أندرويد كروم وسطح المكتب، وعلى آيفون عبر المشاركة ← إضافة إلى الشاشة الرئيسية. |
| Server | Caddy 2 file_server only | Already on notes.addict.best (Contabo). Auto-HTTPS, HTTP/3, gzip/zstd. No Express process for v1. Node is optional later for multi-device sync only.موجود أصلاً على notes.addict.best. شهادات تلقائية وHTTP/3 وضغط. بلا عملية Express في الإصدار 1. Node لاحقاً فقط لمزامنة الأجهزة. |
| Lesson voice | Piper ar_JO-kareem-medium pre-generated OGG + MP3 | Z-AI / Kimi / Claude: generate once at build, serve static. 0 MB RAM at runtime. Must feed fully diacritized text. Dual format: OGG for Chrome/Firefox, MP3/MP4 for Safari.ولّد مرة واحدة وقت البناء وقدّم ملفات ساكنة. صفر ذاكرة وقت التشغيل. النص يجب أن يكون مشكّلاً. صيغتان: OGG لكروم/فايرفوكس وMP3/MP4 لسفاري. |
| Dynamic speak | Web Speech speechSynthesis lang=ar-SA rate 0.85 | Fallback only for typed text not in the curriculum. Quality varies by OS (Naayf / Maged / Tarik). Label it as auto-voice.احتياطي للنص المكتوب غير الموجود في المنهج. الجودة تختلف حسب النظام. يُوسم بأنه صوت تلقائي. |
| Record | getUserMedia + MediaRecorder | HTTPS required. Prefer audio/mp4 on iOS, webm/opus elsewhere. playsinline. First play() must sit inside the tap — no await before it (Unified bug table).يتطلب HTTPS. mp4 على آيفون وwebm/opus في غيره. أول تشغيل يجب أن يكون داخل النقرة مباشرة. |
| Pronunciation | Web Speech STT + Levenshtein + optional Meyda MFCC | Free, in-browser. Feature-detect. If missing: record-and-compare + type-what-you-said. Honest caveat (Claude C.2): Chrome/Edge/Safari STT often leaves the device to the vendor. Firefox STT is off by default.مجاني داخل المتصفح. إن غاب: سجّل وقارن أو اكتب ما سمعته. تنبيه: تعرف كروم/إيدج/سفاري غالباً يغادر الجهاز إلى مزوّد المتصفح. فايرفوكس معطّل افتراضياً. |
| Progress | localStorage + IndexedDB, SM-2 | schema_version + try/catch (private browsing). Ease min 1.3; quality <3 resets interval to 1 day. Cap review at 20 items. No SQLite process until you need two devices.إصدار مخطط وtry/catch للتصفح الخاص. حد أدنى لمعامل السهولة 1.3. سقف المراجعة 20 بنداً. بلا عملية SQLite حتى تحتاج جهازين. |
| Images | Local files + Wikimedia Commons (download once) | Do not call Unsplash live (Claude/Unified reject Monica/Qwen live APIs). One-time download, then self-host. Fallback image on error.لا تستدعِ Unsplash حيّاً. نزّل مرة ثم استضف. صورة احتياطية عند الفشل. |
| Fonts | Self-host Cairo + Noto Naskh Arabic (woff2) | Google Fonts CDN breaks true offline PWA. Gemini: Noto needed for لا ligature. Scale Arabic ~+4pt vs Latin. Logical CSS properties only.خطوط جوجل تكسر العمل بلا إنترنت. نوتو لازم لربط لا. كبّر العربية نحو 4 نقاط. خصائص CSS المنطقية فقط. |
| Curriculum | curriculum.json with tashkeel written in | Claude: do not run a diacritizer at request time. Your agents write tashkeel once. Phases: weeks 1–2 spoken only; 3–4 connected letters; 5–8 roots + toggle.لا تشغّل مشكِّلاً عند كل طلب. الوكلاء يكتبون التشكيل مرة. المراحل: 1–2 كلام فقط؛ 3–4 حروف متصلة؛ 5–8 جذور وتبديل. |
| Your VPS | Contabo Caddy site block | Drop public/ under the notes (or a new subdomain) site. Cache /audio/* immutable. UFW already 80/443. Fail2Ban optional. No new Caddyfile rewrite of other hosts.ضع مجلد public تحت الموقع. خزّن /audio/* بلا انتهاء. المنافذ 80/443 موجودة. لا تعِد كتابة مضيفين آخرين في Caddy. |
| Your AI agents | Content + Piper batch + QA | Generate diacritized JSON, mouth-position SVGs, Wikimedia picks, Piper batch, and Lighthouse/RTL checks. No paid model API is required in the running app.توليد JSON مشكّل ورسوم مخارج الحروف واختيار ويكيميديا ودفعات Piper وفحص Lighthouse/RTL. لا حاجة لواجهة نموذج مدفوعة داخل التطبيق العامل. |
v1 tags
| Surface | What works | What we degrade to |
|---|---|---|
| Chrome / Edge Android + desktop | Install PWA, STT, record, SW cache, HTTP/3تثبيت PWA والتعرف والتسجيل والتخزين | — |
| Samsung Internet | Treat as Chromium. Install + STT usually yes.يُعامل ككروميوم. التثبيت والتعرف غالباً نعم. | — |
| iOS Safari / Chrome-on-iOS | Add to Home Screen, audio with playsinline, record as audio/mp4إضافة للشاشة الرئيسية، صوت playsinline، تسجيل mp4 | Assume no SpeechRecognition (Unified bug table contradicts “Safari has STT”). Record-compare + type-in.افترض غياب التعرف. سجّل وقارن أو اكتب. |
| Firefox | PWA + audio + recordPWA والصوت والتسجيل | STT off by default → acoustic/manual pathالتعرف معطّل افتراضياً → مسار يدوي/صوتي |
| Mic denied / no mic | Lessons, audio, SRS, script toggle still workالدروس والصوت والمراجعة والتبديل تعمل | Hide record; show “type what you heard”أخفِ التسجيل؛ أظهر «اكتب ما سمعت» |
| Private browsing | App runsالتطبيق يعمل | localStorage try/catch; session-only progresstry/catch؛ تقدم للجلسة فقط |
| 3G / offline after first visit | SW cache HTML/CSS/JS + already-heard audioتخزين الصفحات والصوت المسموع | New audio waits; never block UIالصوت الجديد ينتظر؛ لا تجمّد الواجهة |
| System font 200% / large text | rem units, no fixed-height cardsوحدات rem بلا ارتفاع ثابت | — |
| prefers-reduced-motion | No Ken Burns, no pulse on recordبلا نبض أو حركات تكبير | — |
| RTL + LTR mixed | html dir=rtl; English/translit dir=ltr; logical marginsالجذر rtl والإنجليزي ltr وهوامش منطقية | — |
| Dark / light OS theme | Ship one dark learning theme; do not depend on color-scheme for meaningثيم داكن واحد؛ لا تعتمد على الوضع الفاتح للمعنى | — |
| Keyboard only / TalkBack / VoiceOver | aria-label, aria-live=polite, focus-visible, 44px targetsتسميات حية وتركيز ظاهر وأهداف 44px | — |
PWA install contractعقد تثبيت PWA
manifest: name, short_name, start_url=./, display=standalone, dir=rtl, lang=ar, theme_color, 192+512 icons, screenshots optional. SW: cache-first for app shell; stale-while-revalidate for curriculum.json; cache audio on first play. Never cache POST. Update via skipWaiting after a visible “new version” toast.
البيان: الاسم وstart_url وstandalone واتجاه rtl وأيقونات 192 و512. العامل: الغلاف أولاً من التخزين؛ المنهج بتحديث كسول؛ الصوت عند أول تشغيل. لا تخزّن POST. حدّث بعد رسالة «إصدار جديد».
Build with agents, not paid APIsابنِ بالوكلاء لا بالواجهات المدفوعة
Agents write curriculum.json with tashkeel, pick Wikimedia files, run Piper on the VPS once, emit OGG+MP3, and check RTL + Lighthouse. The running learner never hits Azure, Chirp 3, Unsplash, Firebase, or Netlify (those appear in older answers and are later rejected).
الوكلاء يكتبون المنهج المشكّل ويختارون ويكيميديا ويشغّلون Piper مرة ويصدرون OGG+MP3 ويفحصون RTL وLighthouse. المتعلم لا يلمس Azure أو Chirp أو Unsplash أو Firebase أو Netlify.
Later tiers (only if needed)مستويات لاحقة (عند الحاجة فقط)
Tier 1: tiny Node + SQLite WAL on 127.0.0.1 for multi-device sync (Kimi db.js). Tier 2: more photos, OPI prompt, root highlighter. Tier 3: self-hosted Whisper + Uptime Kuma + Borg/Restic. Do not start there. Docker/Portainer/Piper-as-a-service (~200 MB idle) is for a later ops upgrade, not the first ship.
المستوى 1: Node صغير وSQLite للمزامنة. 2: صور أكثر ومقابلة ومحلّل جذور. 3: Whisper محلي ومراقبة ونسخ. لا تبدأ من هنا. دوكر وPiper كخدمة (~200 ميجا خاملة) ترقية تشغيل لاحقة.
Why this beats the heavy boxes belowلماذا تتفوق على الصناديق الثقيلة أدناه
Z-AI’s full Docker+Piper-live stack is ~435–450 MB idle. File 4’s generic homelab (Portainer, AdGuard, DokuWiki, Maddy) is a server platform, not the app. Monica’s Netlify + live Unsplash + Chirp 3 needs keys and bills. You asked for non-heavy, free, PWA, every phone. Tier 0 + SW is the only box that matches all four.
حزمة Z-AI الكاملة ~435–450 ميجا خاملة. ملف 4 منصة خادم عامة لا التطبيق. مونيكا تحتاج مفاتيح وفواتير. طلبت خفة ومجانية وPWA وكل هاتف. المستوى 0 مع عامل الخدمة هو الصندوق الوحيد الذي يطابق الأربعة.