تصور کنید اپلیکیشنی داشته باشید که هدفش این باشد شما را هرچه سریعتر از خودش دور کند. Haikamera دقیقاً با همین فلسفه ساخته شده است تا به جای جذب کاربر در حلقههای بیپایان اعلانها، او را به تماشای دنیای واقعی سوق دهد. شعار «Touch Grass» یا «کمی با طبیعت وقت بگذران» که موضوع هفته اول چالش Open-Source AI در Hacktoberfest بود، نیروی محرک اصلی پشت ساخت Haikamera است. این برنامه با بهرهگیری از یک مدل بینایی رایگان و تنها یک دکمه، کاربر را مجبور میکند نگاهش را از صفحه نمایش بگیرد؛ برنامه شعری کوتاه درباره محیط اطراف کاربر تولید میکند و سپس بلافاصله توجه او را به دنیای فیزیکی بازمیگرداند تا لحظهای از ذهنآگاهی (Mindfulness) ایجاد شود.
فرقی نمیکند کاربر گوشی خود را به سمت میز کار، یک پنجره یا یک دیوار خزهگرفته بگیرد؛ او تنها دکمه «Snap a poem» را میزند و یک مدل بینایی با وزنهای باز، یک هایکوی سه خطی درباره رنگها و اشیایی که واقعاً در قاب عکس هستند مینویسد. سپس برنامه عکس کاربر را به همراه آن شعر در زیر آن نمایش میدهد. این هسته اصلی طراحی است: وظیفه برنامه این است که کوتاهترین وقفه ممکن در زندگی واقعی باشد.
این پروژه در زمانی عرضه شده است که اکثر اپلیکیشنهای هوش مصنوعی برای به حداکثر رساندن تعامل کاربر از طریق فیدهای بیپایان و حلقههای اعلان طراحی شدهاند. در حالی که پیشتر پوشش دادیم چگونه اپلیکیشن OUTSIDE از LLaMA 3.3 برای تشویق به گشتوگذار در فضای باز استفاده میکند، Haikamera رویکردی مینیمالتر را در پیش گرفته است. این برنامه با هوش مصنوعی نه به عنوان یک مقصد، بلکه به عنوان یک پل کوتاه و کاربردی به دنیای واقعی برخورد میکند. هدف طراحی این است که کوتاهترین وقفه ممکن باشد: برنامه را باز میکنید، یک عکس میگیرید، سه خط میخوانید و آن را میبندید. هیچ فیدی برای رفرش کردن و هیچ «استریک» یا زنجیره حضور روزانهای برای حفظ کردن وجود ندارد. این ابزار برای هر کسی است که میخواهد تلنگری دریافت کند تا متوجه آنچه در مقابلش است شود؛ از رنگ کهربایی یک ماگ گرفته تا خزههای روی دیوار یا رنگ سربی آسمان.
معماری متمرکز بر حریم خصوصی
به نقل از مستندات پروژه، حریم خصوصی در Haikamera نه از طریق یک متن حقوقی یا سیاستهای مکتوب، بلکه از طریق ساختار فنی تضمین شده است. توسعهدهنده این برنامه، Amirreza، آن را بهگونهای ساخته که برای کودکان نیز بدون نیاز به سخنرانیهای طولانی درباره حریم خصوصی، ایمن باشد. برای دستیابی به این هدف، محدودیتهای سختگیرانهای در سطح محلی اعمال شده است:
- حذف محلی EXIF: برنامه هر عکس را از طریق یک بوم (Canvas) در گوشی کاربر بازنویسی میکند. این فرآیند بهطور خودکار مختصات GPS و متادادههای EXIF را پیش از هرگونه آپلود حذف میکند. تصویر پیش از ارسال به صورت یک Data URL، به ابعاد ۱۰۲۴ پیکسل کاهش مییابد.
- عدم ذخیرهسازی (Zero Persistence): عکسها تنها برای یک درخواست API در حافظه موقت (RAM) نگه داشته میشوند و هرگز روی دیسک دستگاه نوشته نمیشوند. تنها تصویری که روی صفحه است، عکس خود کاربر است؛ هیچ تصویری تولید یا از سرویسهای خارجی دریافت نمیشود و این تضمین میکند که هیچ سرویس دومی هرگز توصیفی از صحنه را نبیند. این رویکرد یادآور تلاشهای مشابه برای انتقال پردازشهای شناسایی محیطی به دستگاه کاربر است تا حریم خصوصی و سرعت پاسخدهی افزایش یابد.
- حذف ردیابی هویت: هیچ حساب کاربری، کوکی، ابزار تحلیل (Analytics) یا اثر انگشت دستگاهی (Device Fingerprint) وجود ندارد. برنامه به هیچ صفحه ورودی نیاز ندارد زیرا هیچ هویت کاربری ردیابی نمیشود.
- روزنامهنگاری محلی: هرگونه تاریخچه ذخیرهشده تنها در
localStorageمرورگر باقی میماند و هرگز با سرورهای ابری همگام نمیشود.
پیادهسازی فنی و انعطافپذیری مدلها
از نظر فنی, Haikamera یک اپلیکیشن Node.js بدون وابستگی (Zero-dependency) است که تحت لایسنس MIT منتشر شده است. کل بخش بکاند در یک فایل server.js حدود ۶۰۰ خطی خلاصه شده که سه نقطه اتصال (Endpoint) را مدیریت میکند: /api/poem برای تولید شعر، /api/pulse و /api/health برای بررسی وضعیت سیستم. فرانتاند برنامه در دایرکتوری public/ قرار دارد و شامل index.html (رابط کاربری)، app.js (مدیریت دوربین، آپلود و حذف EXIF) و sw.js (پوسته اپلیکیشن آفلاین) است.
بر اساس بررسی کد منبع، این برنامه «مدل-ناشناس» (Model-agnostic) طراحی شده است؛ یعنی هوش مصنوعی در آن مانند یک قطعه قابل تعویض است. بهطور پیشفرض، برنامه از مدل Google Gemma 4 31B (بهطور خاص نسخه google/gemma-4-31b-it:free) از طریق لایه رایگان OpenRouter استفاده میکند. چون سرور از فرمتهای استاندارد OpenAI chat-completion استفاده میکند، توسعهدهنده میتواند تنها با تغییر یک متغیر محیطی، «مغز» برنامه را عوض کند. ارائهدهنده مدل از روی پیشوند کلید API تشخیص داده میشود:
sk-or-برای OpenRoutergsk_برای Groqnvapi-برای NVIDIAhf_برای Hugging Face
سایر مدلهای سازگار که در پروژه ذکر شدهاند عبارتند از:
- Meta Llama 4 Maverick 17B (از طریق Groq:
meta-llama/llama-4-maverick-17b-128e-instruct) - Qwen3-VL-30B-A3B-Instruct (از طریق Hugging Face)
مهندسی تولید هایکو
برای اینکه مدل بهجای متون معمولی یا نثر، هایکوی واقعی تولید کند، سیستم خروجیهای JSON سختگیرانهای را تحمیل میکند. مدل باید یک عنوان، سه خط شعر، اشیای شناسایی شده، رنگهای غالب به همراه کدهای Hex و یک حس (Mood) را ارائه دهد.
طبق گزارش منتشر شده در dev.to، پرامپتهای سیستم شامل محدودیتهای دقیقی برای جلوگیری از «کلیشههای هوش مصنوعی» (AI-isms) است:
۱. شمارش هجاها: هر خط باید دقیقاً ۵، ۷ و ۵ هجا داشته باشد. پرامپت مدل را مجبور میکند که هجاها را بلند بلند بشمارد تا دقت افزایش یابد.
۲. مبنیسازی (Grounding): هر خط باید به شیئی اشاره کند که واقعاً در عکس دیده میشود؛ مدل صراحتاً از اختراع چیزهایی که در قاب نیستند منع شده است.
۳. ممنوعیت کلیشهها: کلماتی مانند «زیبایی»، «باشکوه»، «نفسگیر»، «آغوش طبیعت»، «نجوا»، «رقص»، «همیشگی» یا «آرام» بهطور کامل ممنوع شدهاند تا شعر از حالت مصنوعی و تکراری خارج شود.
برای مدیریت ناپایداری محدودیتهای نرخ درخواست (Rate Limits) در لایههای رایگان API (خطاهای ۴۲۹)، سرور یک زنجیره جایگزین (Fallback) را اجرا میکند. اگر مدل اصلی شکست بخورد یا JSON غیرقابل پردازش برگرداند، سرور با مدلهای جایگزین تلاش مجدد میکند. این تلاش مجدد تنها زمانی رخ میدهد که مدل پاسخی غیرقابل پردازش داده باشد، نه در صورت بروز خطای انتقال (Transport Error). اگر تمام تلاشها شکست بخورند، یک شعر «بهترین حدس» تضمینشده بازگردانده میشود تا تجربه کاربر هرگز با خطای فنی قطع نشود. نقطه اتصال health نیز شفافیت ایجاد میکند و یک شیء JSON شامل وضعیت ok، وضعیت حالت demo، ارائهدهنده فعلی (provider) و مدل فعال را برمیگرداند.
طراحی تجربه کاربری
حتی وضعیت بارگذاری برنامه نیز توسط هوش مصنوعی تولید میشود. بهجای یک دایره چرخان ساده، عباراتی مثل «در حال هایکو کردن...» (Haikoizing)، «در حال شکسپیر کردن...» (Shakespearing) یا «در حال مکیدن رنگها...» (Colour-sipping) نمایش داده میشوند. این عبارات توسط یک مدل متنی تولید، برای سه ساعت کش شده و سپس ارائه میشوند تا انتظار دو ثانیهای کاربر، بخشی از فرآیند خلاقانه به نظر برسد. اگر فراخوانی مدل متنی شکست بخورد، برنامه به یک لیست داخلی بازمیگردد.
به دلیل ساختار PWA، کاربران میتوانند Haikamera را از طریق Share Sheet به صفحه اصلی گوشی خود اضافه کنند تا مانند یک اپلیکیشن بومی عمل کند. برنامه از هر دو حالت عکاسی با دوربین پشتی و آپلود دستی پشتیبانی میکند. در دسکتاپ، وبکم باز میشود و در مکهای دارای Continuity Camera، بهطور خودکار آیفون متصل را انتخاب میکند. همچنین یک «حالت دمو» تعبیه شده تا کاربران بدون نیاز به کلید API، جریان کاری برنامه را تست کنند؛ در این حالت برای هر عکس همان شعر پیشفرض بازگردانده میشود تا کاربر پیش از اتصال به مدل، با رابط کاربری آشنا شود.
چالشهای توسعه و تکرار
ساخت این برنامه با چالشهای فنی متعددی همراه بود که نیاز به تغییر مسیر داشت. در نسخههای اولیه، مدلها اغلب پاسخها را در بلوکهای کد (Code Fences) میفرستادند که باعث شکست در JSON.parse میشد. برای حل این مشکل، یک استخراجکننده منعطف طراحی شد که پاسخ را از اولین { تا آخرین } برش میدهد. علاوه بر این، برخی مدلها عنوان پیشفرض موجود در Schema را عیناً تکرار میکردند؛ بنابراین یک نرمالساز (Normalizer) اضافه شد تا این جایگذارهای تکراری را حذف کرده و نامهای واقعی جایگزین کند.
استقرار (Deployment) از طریق Render و با استفاده از یک GitHub App برای استقرار خودکار هنگام ادغام در شاخه main انجام میشود. تنظیمات شامل npm install برای بیلد، node server.js برای دستور شروع و /api/health برای بررسی سلامت است. برای جلوگیری از مشکلاتی که در آن app.js کششده با HTML جدید اجرا میشد (و خطای Cannot set properties of null میداد)، پوسته برنامه با Cache-Control: no-cache ارائه میشود. سرویس ورکر (Service Worker) روی حالت network-first تنظیم شده و هنگام فعال شدن نسخه جدید، یک بار بارگذاری مجدد (Reload) را تحریک میکند.
تحلیل: مزیت وزنهای باز
اهمیت Haikamera برای کاربر عادی در شعرها نیست، بلکه در مدل کسبوکاری است که از آن دوری میکند. با استفاده از مدلهای با وزنهای باز (Open Weights) در لایههای رایگان، این برنامه اصطکاک مالی معمول در هوش مصنوعی مدرن را حذف کرده است. هیچ صورتحساب توکنی، نیاز به کارت اعتباری یا دوره آزمایشی منقضیشوندهای وجود ندارد. همانطور که توسعهدهنده اشاره میکند، یک استک بسته (Closed Frontier Stack) هر ضربه روی دکمه را به یک خط در صورتحساب تبدیل میکند و یک «اسباببازی» را مجبور میکند پیش از آنکه سرگرمکننده شود، به یک «کسبوکار» تبدیل شود. هدف این بود که چیزی کوچک و لذتبخش ساخته شود و فقط اجرا بماند.
این تغییر، توازن قدرت را بین توسعهدهنده و ارائهدهنده تغییر میدهد. وقتی مدل یک «قطعه» است و نه یک «پلتفرم»، توسعهدهنده دچار وابستگی به یک شرکت خاص (Vendor Lock-in) نمیشود. اگر یک ارائهدهنده کند شود یا سیاستهای دادهای خود را تغییر دهد، برنامه در چند ثانیه با تغییر یک خط تنظیمات به میزبان دیگری منتقل میشود. این تفاوت میان «ساختن روی هوش مصنوعی» و «ساختن درون هوش مصنوعیِ یک شرکت دیگر» است. این رویکرد بهینهسازی برای سختافزارهای محدود، مشابه آنچه در اجرای منتور کدنویسی KODA روی گوشیهای ارزانقیمت دیدیم، امکان دموکراتیزه کردن دسترسی به ابزارهای پیشرفته را فراهم میکند.
در نهایت، Haikamera ثابت میکند که هوش مصنوعی میتواند برای کاهش زمان استفاده از صفحه نمایش به کار رود، نه افزایش آن. با حذف حسابهای کاربری، فیدهای بیپایان و تلهمتری، هوش مصنوعی از ابزاری برای مصرف، به ابزاری برای مشاهده تبدیل میشود. تم پروژه «Touch Grass» است و کاهش زمان صفحه نمایش تنها زمانی قابل توصیه است که صفحه نمایش از کاربر پول نگیرد، مکان او را استخراج نکند و پروژه او را گروگان نگیرد. وزنهای باز هر سه هزینه را از بین میبرند.
ریشههای پروژه و اعتبارها
این پروژه با استفاده از OpenCode توسعه یافته و جلسات آن از طریق DevRelay ذخیره شده است. بخش زیادی از کار در حالی انجام شد که توسعهدهنده در کتابخانه مرکزی کمبریج (Cambridge Central Library) نشسته بود؛ مکانی که پنجرههای فراوان و صحنههای ارزشمندی برای عکاسی داشت. پست نهایی حاصل همکاری بین توسعهدهنده و یک عامل هوش مصنوعی در OpenCode بود؛ تصمیمات و نظرات متعلق به توسعهدهنده است، در حالی که متن توسط عامل تولید شده است.
Amirreza برای این چالش در دو دستهبندی شرکت میکند: بهترین استفاده از Render (چون برنامه به عنوان یک سرویس وب Node با استقرار خودکار اجرا میشود) و بهترین استفاده از Gemma (چون زنجیره پیشفرض و جایگزین بر محور مدل وزنباز Google Gemma 4 31B است).
اگر میخواهید ببینید چگونه مدلهای وزنباز را برای ابزارهای تخصصی با حریم خصوصی بالا مستقر کنید، میتوانید کد منبع را در گیتهاب (safeamiiir/haikamera) بررسی کنید یا دموی زنده را در haikamera.onrender.com امتحان کنید.
گام بعدی شما
- اگر توسعهدهنده هستید، کد منبع این پروژه را در گیتهاب (
safeamiiir/haikamera) بررسی کنید تا ببینید چگونه میتوان یک سرویس بدون وابستگی (Zero-dependency) ساخت. - دمو زنده برنامه را در
haikamera.onrender.comامتحان کنید و سعی کنید اشیای ساده محیطتان را به شعر تبدیل کنید. - درباره مدلهای بینایی-زبانی رایگان در OpenRouter تحقیق کنید تا متوجه شوید چگونه بدون هزینه، قابلیتهای بینایی را به پروژههای خود اضافه کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو