بكلّم الـ AI بتاعي على الموبايل، ومتشفّر من الأول للآخر

الـ AI بتاعي كان عايش في tab في المتصفح. كنت عايز أبعتله رسايل زي ما بكلّم صاحبي، من أي حتة، وكل رسالة متشفّرة، ومفيش حاجة متخزّنة على server حد تاني. دي الحكاية إزاي جلسة واحدة طويلة مع Claude Code وصّلتني لكده، وإيه اللي باظ في السكة.

رسمة: موبايل على كومودينو فيه فقاعات رسايل فاضية تحت قفل منوّر، وخيط كهرماني رفيع طالع لبيت بعيد منوّر

H_AI، محرك الـ AI الشخصي اللي على الـ Mac Studio بتاعي، عنده dashboard كويسة. بس الـ dashboard حاجة بتفتحها، والصاحب حد بتبعتله رسالة. أغلب اللي بسأله لأي مساعد حاجات صغيرة: حسبة سريعة، كلمة نسيتها، «اقرالي ده». للحاجات دي مش عايز tab. عايز محادثة على الموبايل، جنب العيلة والصحاب، بترد في سطر ولا اتنين.

حطّيت لنفسي تلات شروط. لازم يبقى متشفّر من الأول للآخر. والمحادثات لازم تفضل على جهازي أنا. ولازم يشتغل من أي حتة، مش على الـ Wi-Fi بتاع البيت بس.

ليه Matrix

أول حاجة جت في بالي كانت بديل open-source لـ Slack، فبصّيت على Rocket.Chat. طلع برّه من أول شرط مهم: في الأوض المتشفّرة بتاعته، الـ bots مش بتقدر تقرا الرسايل. وbot مش بيقرا مش هيبقى مساعد أوي.

Matrix شغله مختلف. التشفير بيحصل على كل جهاز، والـ bot مجرد جهاز تاني في الأوضة، وليه مفاتيحه. بيفك تشفير اللي ببعته، وبيشفّر رده. والـ server اللي في النص عمره ما بيخزّن غير كلام متشفّر.

🏠
Synapse الـ Matrix server، على الـ Mac نفسه. التسجيل مقفول، والـ federation مقفولة، والتشفير شغال في كل أوضة
📱
Element X الـ app بتاع Matrix على الـ iPhone بتاعي. مفيش حاجة مخصوص أنزّلها
🤖
hishambot bot صغير بالـ Python (matrix-nio مع مكتبة التشفير vodozemac) قاعد بين Matrix وH_AI
🔒
Tailscale الشبكة الخاصة اللي بتخلّي الموبايل يوصل للـ Mac من أي حتة، من غير ما أفتحه على الإنترنت

النظام كله

رسمة: موبايل، وجواب مقفول بختم شمع، وserver صغير ألومنيوم للبيت، على طريق واحد منوّر
رسم للنظام: الـ iPhone بيوصل للـ Mac Studio عن طريق Tailscale بس. Element X بيكلّم الـ Matrix server، والـ bot بيفك التشفير ويسأل الـ AI server، اللي بيستخدم خدمات محلية، وClaude على الـ cloud لما أطلب بس. iPhone Element X محادثة Matrix مع hishambot H_AI dashboard في المتصفح، متثبّتة كـ app Tailscale · شبكة خاصة، لأجهزتي بس Mac Studio M4 Max متشفّر من الأول للآخر HTTPS Synapse الـ Matrix server، بيخزّن كلام متشفّر بس hishambot بيفك التشفير ويسأل H_AI، وبيشفّر الرد AI_server · H_AI FastAPI: محادثة وskills، وpersona، وأنسنة الصوت TLS خدمات محلية Ollama models من Qwen Draw Things صور Voicebox صوتي المستنسخ SearXNG بحث على الويب Obsidian vault كل محادثة كنوتة Claude Code الـ power mode بيشتغل أول ما الـ Mac يفتح · ولمبة في الـ menu bar بتراقبه Claude · cloud لما أكتب /claude بس طريق المحادثة، متشفّر من الأول للآخر الـ dashboard، HTTPS بيخرج من الـ Mac، لما أطلب بس
كل حاجة شغالة على Mac واحد. الموبايل بيوصله عن طريق شبكتي الخاصة بس، والحاجة الوحيدة اللي بتخرج من البيت هي /claude.

رسالة واحدة، من الأول للآخر

  1. 01
    بكتب على الموبايلElement X بيشفّر الرسالة قبل ما تخرج من الجهاز.
  2. 02
    بتعدّي على Tailscaleمفيش غير الأجهزة اللي داخلة على شبكتي الخاصة تقدر توصل للـ server أصلاً. عمره ما بيتنشر على الإنترنت المفتوح.
  3. 03
    Synapse بيخزّن كلام متشفّرالـ server بيسمع على الـ Mac نفسه بس، وTailscale هو اللي بيسلّمه الرسايل. ومش بيقدر يقرا اللي بيخزّنه.
  4. 04
    hishambot بيفك التشفير ويسأل H_AIعلى اتصال TLS متثبّت على شهادة واحدة، ومحادثة منفصلة لكل أوضة.
  5. 05
    الرد بيرجع وهو بيتكتبالـ bot بيعدّل رسالته وهي بتوصل كلمة كلمة، فتحس إن حد بيكتب، وكل تعديل بيتشفّر من جديد.

وقررت كمان مستخدمش Matrix server عام للحساب. محادثاتي مع الـ AI بتاعي هي بالظبط النوع اللي مش عايزه على server حد تاني، حتى لو متشفّر. فكل حاجة فاضلة على الـ Mac، والـ federation مقفولة.

أعطال شكلها نجاح، تاني

في مقال محرك الـ AI كتبت إن الأعطال هناك بتيجي متنكرة في شكل نجاح. المشروع ده فضل يثبت الكلام ده.

الـ bot رد، وأنا مشفتش حاجة. الـ logs بتقول إن كل رد اتبعت واتشفّر. والموبايل بيوريني أوضة فاضية. السبب: Element X بيخبّي الرسايل اللي جاية من أجهزة صاحبها موثّقهاش، والـ bot ملوش شاشة تانية يدوس فيها «verify». الحل كان script صغير بيعمل الـ cross-signing بإيده، مرة واحدة، فالـ bot يضمن جهازه بنفسه زي ما أي حد بيعمل.

الأوض الجديدة كانت ساكتة. عملت محادثة، كتبت فيها، واستنيت. الـ bot عمره ما اتعزم. دلوقتي فيه module صغير جوه الـ server بياخد باله لما أعمل أوضة، ويعزم الـ bot فيها بعدها بثانيتين.

الـ voice notes كانت كلمتين. طلبت نص طويل يتقري بصوت، ورجعلي تسجيل بيقول «voice equals Alloy». الـ parser بتاع الأدوات كان بياخد أول سطر بس من الطلب، اللي هو إعداد الصوت، ويرمي النص اللي تحته. وكمان اختار الصوت الغلط، عشان سطر قديم في الـ system prompt كان لسه بيقول إن Alloy هو الافتراضي.

كل حاجة كانت مستنية أبطأ حاجة. وصورة أو تسجيل بيترندروا، الـ bot مكانش بيرد على أي حاجة تانية. مكتبة Matrix بتشغّل الـ handlers واحد ورا التاني، فشغلانة بطيئة واحدة كانت بتوقف المحادثة كلها. دلوقتي كل رسالة بتشتغل لوحدها في الخلفية. لما أطلب صورة، بيقولي «شغال عليها، كمّل كلام»، وأقدر أسأله 2+2 بكام ويقولي «4» والصورة لسه بتترسم.

إزاي خليته يتكلم زي صاحبي

الـ system prompt بتاع الـ dashboard معمول لإجابات طويلة ومظبوطة. في app رسايل، ده بيبان كأنه مقال جوه فقاعة. فالـ bot بيقول لـ H_AI إنه app الرسايل، وH_AI بيزوّد persona قصيرة للطلب ده بس: رد في سطر ولا اتنين، من غير عناوين، ومن غير مقدمات، ومن غير «سؤال حلو!».

طلبت من Claude يدرس الـ system prompts بتاعة OpenCode، وهو coding agent مفتوح المصدر معروف إنه مختصر، وياخد منها اللي بيشتغل: كام مثال قصير بدل قواعد طويلة، وحد أقصى صريح لعدد السطور، ومنع صريح للمقدمات والخاتمات. وبعدين طلبت حاجة كمان: اتكلم زي صاحبي المصري.

meezayak ya basha

hishambotTamam, el7amdulillah! How’s your day going?

me15% of 240?

hishambot36.

ده خد شوية ظبط. أول نسخة كانت بترد Franco كامل، يعني عربي مكتوب بحروف إنجليزي، وده لطيف في سطر ومتعب في فقرة. دلوقتي بيتكلم إنجليزي في الأساس ومعاه كلمة ولا اتنين مصري بالكتير، وبيتحول للعربي المصري بس لو أنا كتبت بحروف عربي. وعمره ما بيبقى قليل الذوق معايا؛ الهزار مسموح بس لما يبقى واضح إنه من القلب. ولما الخبر يبقى حزين أو جد، الهزار بيقف خالص.

الـ persona كمان كانت بتخسر قدام الـ prompt الأساسي الأطول منها بكتير، فحاجتين صلّحوها. فيه تذكير في سطر واحد بيتبعت مع آخر رسالة ليا بس (وعمره ما بيتحفظ في التاريخ)، وطلبت من Claude يقصّر الـ persona من حوالي 940 token لـ 450. الأقصر اشتغل أحسن.

سريع كفاية إنه يحسّسك إنها رسايل

صاحب بياخد دقيقة عشان يرد على «hi» مش صاحب أوي. الـ bot بيستخدم Qwen 3.6 35B-A3B، وده model من نوع mixture-of-experts طلّع حوالي 96 token في الثانية على الـ Mac، قصاد حوالي 21 لـ Qwen 3.8 الأكبر اللي بستخدمه في الـ dashboard. لإجابة في سطرين، ده الفرق بين على طول وإنك تستنى.

كل أوضة محادثة هي محادثة لوحدها. أوضة جديدة بتبدأ وهي مش فاكرة حاجة من التانيين، و!new بتبدأ محادثة جديدة في نفس الأوضة. ومحادثة الـ dashboard نفسها محدش بيلمسها.

الـ Power Mode

ساعات الـ model المحلي مش بيكفي. لو بدأت الرسالة بـ /claude، الرسالة دي بس بتروح لـ Claude بداله، من نفس الـ server، وفي نفس المحادثة. و!power on بتخلّي الأوضة كلها على Claude لحد ما أقفلها. المحلي هو الافتراضي، والـ cloud حاجة أنا اللي بختارها.

صوت شبهي

لما أطلب حاجة تتقري بصوت، الـ bot بيرد بـ voice note بصوتي المستنسخ. وقبل ما يتقال، النص بيعدّي على نفس خطوة الأنسنة اللي بتعدّي عليها حواديت قبل النوم: الـ Markdown بيتشال، والقوايم بتبقى جمل، و«%» بتبقى «في المية»، والـ model السريع بيزوّد كام إشارة للأداء زي warmly عشان الصوت يمثّلها.

لاحظت إن الصوت بيتغير شوية من تسجيل للتاني. الـ model بتاع الصوت بيستنسخ من الأول في كل مرة، فكل تسجيل كان طالع بنسخة مختلفة شوية مني. seed ثابت حل المشكلة. وراجعت النتيجة بـ model تفريغ صوت كمان: ولا إشارة من الإشارات اتقرت ككلمة.

شغال من غير ما أفكر فيه

كل حاجة بتشتغل لوحدها أول ما الـ Mac يفتح. فيه لمبة صغيرة في الـ menu bar بتنوّر أخضر أو أصفر أو أحمر، وبتوري كل حتة لوحدها (محرك الـ AI، وMatrix، والـ bot، وTailscale، والـ models، والبحث، والصوت) ومعاها زراير تشغيل وإيقاف. الصوت كان الحاجة الوحيدة اللي دايماً واقعة، عشان محدش كان بيشغّله. دلوقتي بيشتغل مع محرك الـ AI.

إزاي فضل خاص

الخصوصية كانت الهدف كله، فتعاملت معاها كـ feature لازم تتختبر، مش أمنية:

مفيش حاجة عامة. مفيش غير أجهزتي أنا اللي توصل للـ server، عن طريق Tailscale. مفيش تسجيل، ومفيش federation، وعمره ما بيبقى مفتوح على الإنترنت.

مفيش أسرار في الـ code. الـ passwords والمفاتيح فاضلة في ملفات محلية الـ git بيتجاهلها. خليت Claude يدوّر عليها في كل ملف وفي تاريخ الـ git كله. ملقاش حاجة، بس لقى ملف log قديم كان دخل في commit. مكانش فيه أي password، فيه عناوين أجهزة بس، واتشال من التاريخ قبل ما أي حاجة تتشارك.

مفيش passwords في الـ command line. مراجعة أمنية لقت إن الـ script بتاع تغيير الـ password كان بيبعته كـ argument، وده أي برنامج على الـ Mac يقدر يشوفه. دلوقتي بيسأل عنه من غير ما يظهر.

موافقات متتلخبطش. لما الـ bot بقى يعمل كذا حاجة في نفس الوقت، كلمة «yes» لوحدها كان ممكن توافق على الحاجة الغلط. دلوقتي بتوافق بس على الطلب الوحيد اللي مستني، أو اللي أنا بارد عليه.

أحسن مساعد هو اللي في جيبك أصلاً، في الـ app اللي بتفتحه خمسين مرة في اليوم.

اللي جاي

إني أبعت voice notes للـ bot، مش بس أستلمها منه. إني أبعتله صورة وأسأله عنها. ملخص صباحي قصير يوصل لوحده. والشغل المعتاد: إني ألاقي الأماكن اللي بيبوظ فيها من غير ما يقول، وأخليها تتكلم.

الـ server والـ bot والمقال ده اتبنوا بـ Claude Code.