wterm: Emulador de terminal web rápido impulsado por Zig y WASM

Introducción

Si alguna vez has necesitado un terminal dentro de una aplicación web —ya sea para un IDE en la nube, un panel de control de shell remoto o un tutorial interactivo— wterm es la herramienta que estabas esperando. Desarrollado por Vercel Labs, wterm es un emulador de terminal completamente funcional que se ejecuta en el navegador usando WebAssembly compilado con Zig. Su pequeño tamaño (≈12 KB para el binario WASM central) y su rendimiento similar al nativo lo hacen ideal para cualquier stack web moderno.


Por qué wterm destaca

Característica Beneficio
Zig + núcleo WASM Velocidad de análisis casi nativa para secuencias de escape VT100/VT220/xterm.
Núcleos intercambiables Elige el núcleo Zig ultra‑ligero (~12 KB) o el backend libghostty con todas las funciones (~400 KB) para cumplimiento total de VT.
Renderizado DOM Selección de texto nativa, copiar/pegar, búsqueda del navegador y soporte para lectores de pantalla sin bibliotecas adicionales.
Envoltorios de frameworks Paquetes listos para usar para React, Vue 3 y una API JS pura.
Tematización Las propiedades personalizadas de CSS permiten cambiar instantáneamente entre los temas Predeterminado, Solarized Dark, Monokai y Claro.
Transporte WebSocket Conéctate a un backend PTY remoto con encuadre binario y reconexión automática.
Auto‑redimensionado Utiliza ResizeObserver para adaptarse a cambios de tamaño del contenedor.
Desplazamiento y pantalla alterna Compatibilidad total con aplicaciones como vim, less y htop.

Estas capacidades hacen que wterm sea más que una demostración; es un componente listo para producción que puedes incrustar en cualquier proyecto web.


Comenzando

Requisitos previos

  • Zig 0.16.0+ (para compilar el núcleo WASM)
  • Node.js 20+
  • pnpm 10+ (gestor de paquetes recomendado)

Instalación

# Clone the repository
git clone https://github.com/vercel-labs/wterm.git
cd wterm

# Install JavaScript dependencies
pnpm install

Compilar el binario WASM

zig build               # Debug build (default)
zig build -Doptimize=ReleaseSmall   # Production‑size build (~12 KB)
El archivo resultante wterm.wasm se encuentra en el directorio web/ y puede servirse como un recurso estático.

Compilar todos los paquetes

pnpm run build   # Compiles @wterm/* packages and bundles examples

Usando wterm en diferentes entornos

1. JavaScript puro (Renderizador DOM)

<script type="module">
  import { createTerminal } from "https://cdn.jsdelivr.net/npm/@wterm/dom";
  const term = createTerminal({ wasmUrl: "/wterm.wasm" });
  term.attach(document.getElementById('terminal'));
</script>
<div id="terminal" style="height:400px; width:100%;"></div>
El renderizador DOM te brinda un terminal JavaScript puro con soporte completo de portapapeles y selección de texto nativa.

2. Integración con React

import { WTermReact } from "@wterm/react";

export default function App() {
  return (
    <WTermReact
      wasmUrl="/wterm.wasm"
      className="my-terminal"
      onData={data => console.log('User typed:', data)}
    />
  );
}
El hook useTerminal te permite interactuar con el PTY subyacente, enviar comandos y escuchar la salida.

3. Componente Vue 3

<template>
  <WTermVue :wasm-url="'/wterm.wasm'" />
</template>
<script setup>
import { WTermVue } from '@wterm/vue';
</script>
Los desarrolladores de Vue obtienen un componente sencillo que respeta el sistema de reactividad y puede colocarse en cualquier parte del árbol de componentes.


Funciones avanzadas

Tematización con variables CSS

:root {
  --wterm-bg: #1e1e1e;          /* Background */
  --wterm-fg: #d4d4d4;          /* Foreground */
  --wterm-cursor: #ffcc00;     /* Cursor */
}
Cambia los temas en tiempo de ejecución actualizando estas variables; el terminal se actualiza al instante sin recargar.

Conexión a un PTY remoto vía WebSocket

import { createTerminal } from '@wterm/core';
const term = createTerminal({
  wasmUrl: '/wterm.wasm',
  transport: new WebSocketTransport('wss://my-pty-server.example.com')
});
term.attach(document.body);
El transporte incorporado gestiona el encuadre binario, la reconexión y el control de flujo, lo que lo hace perfecto para entornos de desarrollo basados en la nube.

Uso del backend libghostty

Si necesitas cumplimiento total con VT100/VT220 (p. ej., para aplicaciones complejas como tmux), instala el paquete @wterm/ghostty:

pnpm add @wterm/ghostty
Luego pasa el núcleo ghostty al crear el terminal:
import { createTerminal } from '@wterm/core';
import { GhosttyCore } from '@wterm/ghostty';

const term = createTerminal({
  core: new GhosttyCore(),
  wasmUrl: '/wterm.wasm'
});
El payload adicional de 400 KB aporta cumplimiento total de VT, incluyendo color de 24 bits y trazado avanzado de líneas.


Casos de uso reales

  1. IDE en la nube – Integra wterm como la shell incorporada para plataformas como Gitpod, CodeSandbox o IDE SaaS personalizados.
  2. Documentación y tutoriales – Renderiza demostraciones de línea de comandos en vivo directamente en la documentación sin requerir un terminal local.
  3. Paneles de monitoreo – Muestra registros en tiempo real o herramientas CLI interactivas dentro de paneles de administración.
  4. Plataformas educativas – Proporciona a los estudiantes una shell aislada para aprender comandos de Linux.

Contribución y comunidad

wterm es de código abierto bajo la licencia Apache‑2.0. Se agradecen las contribuciones: - Informes de errores – Abre un issue en GitHub. - Solicitudes de funciones – Propón mejoras mediante pull requests. - Documentación – Mejora el README, agrega ejemplos o escribe tutoriales.

El proyecto utiliza Playwright para pruebas end‑to‑end (carpeta e2e) y Vitest para pruebas unitarias en todos los paquetes. Ejecutar la suite de pruebas es tan sencillo como:

pnpm test


Conclusión

wterm cierra la brecha entre la experiencia de terminal nativa y las aplicaciones web modernas. Su núcleo WASM basado en Zig ofrece velocidad, mientras que el ecosistema de paquetes (vanilla, React, Vue, Ghostty) garantiza una integración fluida sin importar tu stack. Ya sea que estés construyendo un IDE en la nube, un tutorial interactivo o un panel de shell remoto, wterm te brinda una solución fiable, extensible y de código abierto.

¿Listo para probarlo? Clona el repositorio, compila el binario WASM e incrusta el terminal en minutos. Únete a la creciente comunidad de desarrolladores que están llevando el poder de la línea de comandos al navegador.

Artículo original: Ver original

Compartir este artículo