2 GB de RAM y nada de laptop: cómo se ve de verdad desarrollar en iPad en 2026
2 GB de RAM y nada de laptop: cómo se ve de verdad desarrollar en iPad en 2026
Contexto: ¿Qué cambió en 2026?
Un iPad no puede correr un contenedor. Eso no ha cambiado. Lo que sí cambió para 2026 es que dejó de importar tanto, porque las partes que necesitan una máquina de verdad se movieron a una caja que tú tienes y el iPad se volvió la cosa que las maneja. Esta es la nueva arquitectura que emerge de ese momento, con tres maneras de entrar a ella y varios modos de falla que solo aparecen cuando la laptop en casa está apagada.
¿Por qué la respuesta cambió en 2026?
Cuatro cosas se movieron, y ninguna es el iPad. Los CLI de código agéntico se volvieron remotos primero. El agente corre en un host que tú tienes y se registra en una sesión que abres desde una pestaña de navegador. El editor dejó de ser la cosa que tiene que ser local, porque la cosa haciendo el trabajo nunca fue el editor. Los túneles de VS Code pusieron el extension host en la máquina remota -una confusión muy común. Una pestaña de navegador apuntada a vscode.dev sobre SFTP corre el extension host en el navegador, recibiendo solo un subconjunto de web-extension y la mayoría de las extensiones reales están ausentes. La misma pestaña de navegador apuntada a un túnel corre el extension host en la caja, recibiendo el conjunto completo de escritorio. La misma barra de URL representa un producto completamente distinto.
Los VPN de malla hicieron alcanzable una instancia de solo salida. Una caja sin reglas de ingreso en el security group, sin SSH público y sin bastión de todos modos puede aceptar una sesión de SSH, porque marcó hacia afuera primero. Esto quita la última razón para poner un puerto en el internet. También, la capacidad spot de ARM se volvió lo suficientemente barata para dejar el trabajo pesado ahí. Un pool de runners spot t4g.medium cuesta como 9 USD al mes, y las pruebas, builds y despliegues viven ahí, lo que significa que la caja siempre encendida no necesita ser grande.
Lo que no se movió: límites persistentes
El iPadOS sigue sin tener virtualización, y los iPads sin un chip de la serie M siguen espejando solo en una pantalla externa. Estos dos son muros, no inconvenientes. El muro del hardware Mide esto antes de comprar nada. El dispositivo de prueba aquí es un iPad de 11 pulgadas con un A16 y 6 GB de RAM.
Veredicto: Contenedores, bases de datos y pruebas
Contenedores
Una base de datos local, una suite de pruebas contra un Postgres real resulta imposible sin virtualización en iPadOS. No es un problema de permisos ni de workaround. La arquitectura actual hace que esto sea fundamentalmente diferente.
El escritorio extendido
Todo lo demás espeja, así que un monitor te compra una copia con barras negras. VS Code completo con extensiones reales funciona a través de un túnel, no a través de SFTP. Ve abajo.
Una terminal que sobrevive al sleep, al Wi-Fi de hotel y a un hotspot
Funciona con mosh más tmux. No usa SSH pelón. Manejar un agente sobre una tarea larga funciona mediante pestaña de navegador, y sigue funcionando cuando la pestaña no está abierta.
Tres pestañas de navegador concurrentes
Las pestañas se desalojan. Hay que elegir un cliente primario. El encuadre útil es: el iPad es un teclado y una pantalla con un stack de red. Cada decisión arquitectónica después de eso es sobre con cuál cerebro habla.
La caja: infraestructura permanente
La caja es una instancia siempre encendida, tipo t4g.small, con 30 GB de gp3, sin reglas de ingreso en absoluto. La administración es a través de AWS Systems Manager, por lo que no hay puerto de SSH, no hay llave que perder y no hay bastión que mantener parcheado.
const box = new ec2.Instance(
this,
'AgentBox',
{
vpc,
vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC },
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T4G, ec2.InstanceSize.SMALL),
machineImage: ec2.MachineImage.fromSSMParameter(
'/aws/service/canonical/ubuntu/server/24.04/stable/current/arm64/hvm/ebs-gp3/ami-id',
),
blockDevices: [
{
deviceName: '/dev/sda1',
volume: ec2.BlockDeviceVolume.ebs(30, { encrypted: true, volumeType: ec2.EbsDeviceVolumeType.GP3 }),
}
],
role: boxRole,
userData,
},
// Sin ingreso. Solo egreso.
);
La administración se realiza mediante AWS Systems Manager, lo que elimina la necesidad de puertos SSH, claves que perder y bastiones que mantener actualizados.
Sobreviviendo cuando no estás presente
Una caja siempre encendida que necesita a un humano para volver a arrancar no es siempre encendida. Hay tres mecanismos, en orden de importancia:
-
Clone de repositorio privado: Necesita un token; el bootstrap idempotente lo trae en cada arranque. El archivo
CREDS_FILEcontiene las credenciales en un secreto de AWS Secrets Manager. -
Timer watchdog: Vuelve a correr el bootstrap periódicamente. Se define con
OnCalendar(noOnUnitActiveSec) para evitar dispararse en cajas sanas. Emite una alerta en CloudWatch cuando falta el heartbeat. -
Session Manager en el navegador: Actúa como "romper el vidrio". La consola de AWS da un shell a cualquier instancia con el agente y un instance role, desde Safari, sin nada instalado y sin VPN. Es el camino que funciona incluso cuando el VPN está muerto o una instancia fue reemplazada.
El editor: dos rutas con diferencias clave
Hay dos caminos principales, y la diferencia principal está en dónde corre el extension host:
| Ruta | Extensión Host | Ubicación |
|---|---|---|
| Túnel | Code tunnel en la caja | La caja (extensión completa del escritorio) |
| SFTP |
appuser@myapp-agent-box:~/myapp
|
El navegador (solo web-extensions) |
Para el caso de túnel, el CLI elige un túnel sin usar al azar y lo borra. Se debe registrar como servicio en lugar de dejarlo en un shell. Para evitar que el servicio muera al terminar la sesión, se puede habilitar linger:
sudo loginctl enable-linger appuser
O usar ./code tunnel dentro de una ventana de tmux.
La restricción de 2 GB de RAM
No el iPad. La caja tiene un t4g.small con 2 GB de RAM. El CLI del agente es un proceso de Node, y añadir un servidor de VS Code más su extension host hace que la máquina se quede sin memoria antes de ejecutar cualquier código de proyecto.
Lo que realmente cabe, medido en la caja viva:
- Carga de trabajo: CLI del agente + git + gh + edición + PRs ✓
- CLI del agente + servidor de VS Code + extension host: Apretado (necesita swap)
Docker Compose con Postgres, API y worker
Sin suite de pruebas de navegador headless. El arreglo barato primero es necesario porque no requiere despliegue complejo:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Cuatro GB de swap en un disco de 30 GB no hacen la caja rápida, ya que un pico de memoria de Node puede matar la sesión en la que estás sentado.
Trampas comunes
Cada solución costó tiempo real y tiene errores textuales:
-
Clone privado en user data: Si el
|| trueoculta un fallo, la primera arranque de una caja reemplazada puede fallar silenciosamente. El clone falla, pero el|| truelo esconde, y el sistema de systemd no tieneWorkingDirectory. La solución es verificar que las credenciales para el clone vienen de un secreto que el bootstrap lee, no de una esperanza de que el instance profile cubra git. -
Banner como menú, no como recibo: La sesión puede ser invisible durante seis días mientras cada health check pasa. El CLI imprime un banner con pinta de éxito y luego se bloquea en un prompt interactivo (
Enable Remote Control?). La solución es ajustar elExecStartpara que haga--continuesinsleep infinity. -
Lápida de credencial: La peor. La caja estaba arriba, el watchdog sano, la alarma despertando correctamente, y luego aparece
Error: You must be logged in to use Remote Control. El problema es que el archivo de credenciales se expiró (expiresAt: 0). El archivo sigue siendo de 280 bytes y un simple[ -s "$FILE" ]lo leerá como "credenciales presentes, deja en paz el token vivo", sin caer de vuelta al secreto. La solución es un login humano por navegador y diagnosticar elmtimedel archivo de credenciales.
Conclusión práctica
El iPad sigue siendo un dispositivo limitado para desarrollo intensivo. La arquitectura de 2026 centra la carga en una caja de desarrollo permanente (tipo t4g.small), con acceso remoto vía navegador, VPN o Session Manager. La extensión de VS Code funciona mejor a través de un túnel que conecta directamente la caja, no a través de SFTP. Las limitaciones de 2 GB de RAM exigen un diseño minimalista: CLI del agente + herramientas básicas + swap. Los desarrolladores deben planificar cuidadosamente sus dependencias y evitar soluciones que requieran más recursos de los que la caja puede proporcionar.
Comments
No comments yet. Start the discussion.