wterm؛ ترمینالی که مستقیم توی DOM رندر میشه
خلاصهٔ کاملتر
wterm (تلفظش «دابترم») یه ترمینال امولاتور برای وبه که خروجی رو مستقیم توی DOM میسازه، یعنی هر سلول ترمینال یه المان واقعی توی صفحهست. تو صفحهٔ معرفی اومده که همین تصمیم باعث میشه انتخاب متن، کپی/پیست، سرچ خود مرورگر و پشتیبانی از screen reader بدون هیچ کد اضافهای کار کنه.
هستهش با Zig نوشته شده و به WASM کامپایل میشه، یعنی کد باینریای که مرورگر با سرعت نزدیک به نیتیو اجراش میکنه. کاری که این هسته میکنه پارس کردن escape sequenceهای VT100/VT220/xterm ـه، همون کدهای کنترلی که برنامههای ترمینال برای جابهجایی مکاننما و رنگبندی میفرستن. حجم فایل .wasm حدود ۱۲ کیلوبایته.
برای اینکه رندر توی DOM کند نشه، فقط ردیفهایی که عوض شدن دوباره رندر میشن (اسمش dirty-row tracking ـه) و این کار هر فریم با requestAnimationFrame انجام میشه. حالت synchronized output یا همون mode 2026 هم باعث میشه یه فریم کامل یکجا نقاشی بشه، با یه مهلت مشخص برای برگشت به حالت عادی. یعنی موقع آپدیت سریع صفحه، نصفهنیمه نمیبینیش.
از بقیهٔ چیزها: بافر صفحهٔ جایگزین (alternate screen) داره پس vim و less و htop درست کار میکنن، تاریخچهٔ اسکرول با اندازهٔ قابل تنظیم، لینکهای OSC 8 که به سلول خودشون چسبیده میمونن و فقط به HTTP(S) امن لینک میدن، کاراکترهای پهن مثل CJK و ایموجی بدون بههمریختگی، رنگ ۲۴ بیتی، و تم با CSS custom properties.
برای وصل شدن به یه ترمینال واقعی هم ترنسپورت WebSocket داره که به یه بکاند PTY وصل میشه و قطعی رو خودش دوباره برقرار میکنه. اندازهٔ ترمینال با ResizeObserver خودکار تنظیم میشه. نمونهٔ اصلی روی just-bash کار میکنه و نمونههای SSH و اجرای لوکال هم کنارش هست.
نکات کلیدی:
- هستهٔ Zig کامپایلشده به WASM، با حجم حدود ۱۲ کیلوبایت
- رندر روی DOM، پس انتخاب متن و سرچ مرورگر و screen reader مجانی بهدست میاد
- فقط ردیفهای تغییرکرده هر فریم با requestAnimationFrame دوباره رندر میشن
- پارسر VT100/VT220/xterm با بافر صفحهٔ جایگزین برای vim و less و htop
- کامپوننت آماده برای React و Vue 3 و Svelte، بهعلاوهٔ ترنسپورت WebSocket به بکاند PTY
- چهار تم پیشفرض: Default، Solarized Dark، Monokai و Light




