H_AI، محرك الـ AI الشخصي اللي على الـ Mac Studio بتاعي، عنده dashboard كويسة. بس الـ dashboard حاجة بتفتحها، والصاحب حد بتبعتله رسالة. أغلب اللي بسأله لأي مساعد حاجات صغيرة: حسبة سريعة، كلمة نسيتها، «اقرالي ده». للحاجات دي مش عايز tab. عايز محادثة على الموبايل، جنب العيلة والصحاب، بترد في سطر ولا اتنين.
حطّيت لنفسي تلات شروط. لازم يبقى متشفّر من الأول للآخر. والمحادثات لازم تفضل على جهازي أنا. ولازم يشتغل من أي حتة، مش على الـ Wi-Fi بتاع البيت بس.
ليه Matrix
أول حاجة جت في بالي كانت بديل open-source لـ Slack، فبصّيت على Rocket.Chat. طلع برّه من أول شرط مهم: في الأوض المتشفّرة بتاعته، الـ bots مش بتقدر تقرا الرسايل. وbot مش بيقرا مش هيبقى مساعد أوي.
Matrix شغله مختلف. التشفير بيحصل على كل جهاز، والـ bot مجرد جهاز تاني في الأوضة، وليه مفاتيحه. بيفك تشفير اللي ببعته، وبيشفّر رده. والـ server اللي في النص عمره ما بيخزّن غير كلام متشفّر.
النظام كله
/claude.رسالة واحدة، من الأول للآخر
- 01بكتب على الموبايلElement X بيشفّر الرسالة قبل ما تخرج من الجهاز.
- 02بتعدّي على Tailscaleمفيش غير الأجهزة اللي داخلة على شبكتي الخاصة تقدر توصل للـ server أصلاً. عمره ما بيتنشر على الإنترنت المفتوح.
- 03Synapse بيخزّن كلام متشفّرالـ server بيسمع على الـ Mac نفسه بس، وTailscale هو اللي بيسلّمه الرسايل. ومش بيقدر يقرا اللي بيخزّنه.
- 04hishambot بيفك التشفير ويسأل H_AIعلى اتصال TLS متثبّت على شهادة واحدة، ومحادثة منفصلة لكل أوضة.
- 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» لوحدها كان ممكن توافق على الحاجة الغلط. دلوقتي بتوافق بس على الطلب الوحيد اللي مستني، أو اللي أنا بارد عليه.
اللي جاي
إني أبعت voice notes للـ bot، مش بس أستلمها منه. إني أبعتله صورة وأسأله عنها. ملخص صباحي قصير يوصل لوحده. والشغل المعتاد: إني ألاقي الأماكن اللي بيبوظ فيها من غير ما يقول، وأخليها تتكلم.
الـ server والـ bot والمقال ده اتبنوا بـ Claude Code.