2 GB de RAM y nada de laptop: cómo se ve de verdad desarrollar en iPad en 2026
DEV Community

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:

  1. Clone de repositorio privado: Necesita un token; el bootstrap idempotente lo trae en cada arranque. El archivo CREDS_FILE contiene las credenciales en un secreto de AWS Secrets Manager.

  2. Timer watchdog: Vuelve a correr el bootstrap periódicamente. Se define con OnCalendar (no OnUnitActiveSec) para evitar dispararse en cajas sanas. Emite una alerta en CloudWatch cuando falta el heartbeat.

  3. 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:

  1. Clone privado en user data: Si el || true oculta un fallo, la primera arranque de una caja reemplazada puede fallar silenciosamente. El clone falla, pero el || true lo esconde, y el sistema de systemd no tiene WorkingDirectory. 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.

  2. 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 el ExecStart para que haga --continue sin sleep infinity.

  3. 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 el mtime del 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.

Read on DEV Community ↗ ← Back to News

Comments

No comments yet. Start the discussion.