Esta página reúne todas las reglas que tu asistente de IA necesita para preparar tu proyecto para Ai to App. No hace falta que la leas; basta con dar a tu asistente el mensaje de abajo.

Lee la guía en https://aitoapp.com/es/upload-guide. Prepara mi proyecto para Ai to App según esta guía, aplica la lista de verificación punto por punto y crea el archivo zip.

Ai to App revisa y publica sitios y aplicaciones que se suben como archivo zip. Los archivos subidos no se ejecutan durante la revisión. Las aplicaciones de servidor, una vez publicadas, se ejecutan en su propio espacio cerrado, separado de los demás proyectos. Esta guía contiene todas las reglas necesarias para que el proyecto pase sin problemas en la primera carga.

1. Determina el tipo de proyecto

Ai to App reconoce el tipo por sí solo a partir de los archivos dentro del zip. Si coinciden varios tipos, vale el orden de abajo; gana el de más arriba.

OrdenTipoCómo se reconoceQué poner en el zip
1DockerfileDockerfile en la raízCódigo fuente + Dockerfile
2Next.js (servidor)next en las dependencias de package.jsonCódigo fuente
2Next.js (exportación estática)output: 'export' en next.config.*El INTERIOR de la carpeta out tras la compilación
3Servidor Node.jsexpress, fastify, koa, hono, @nestjs/core, @hapi/hapi, restify, socket.ioCódigo fuente
4Sitio compiladovite, react-scripts, vue, @angular/core, astro, @sveltejs/vite-plugin-svelte, parcel, webpack + script buildEl INTERIOR de la carpeta dist tras la compilación (build para react-scripts)
5Node.js (genérico)Script start o campo main en package.jsonCódigo fuente
6Pythonrequirements.txt, pyproject.toml, Pipfile o manage.pyCódigo fuente
7.NET.csproj / .fsproj en la raízCódigo fuente
8Sitio estáticoSolo index.html y archivos HTML/CSS/JSLos archivos tal cual

Importante:

  • En los sitios compilados (React, Vue, Vite, Angular, Svelte, Astro) ejecuta primero npm run build. Comprime en el zip los archivos que están DENTRO de la carpeta dist (o build) que se genera. En la raíz del zip debe estar directamente index.html.
  • Los proyectos Go solo se publican con un Dockerfile.
  • docker-compose no se admite; solo se ejecuta la aplicación principal (Dockerfile). La base de datos la proporciona Ai to App aparte (ver Sección 4).

2. Reglas del zip

Límites

ReglaLímite
Tamaño del archivo zipcomo máximo 50 MB
Tamaño total de los archivos extraídos del zipHasta 200 MB en un sitio estático, hasta 300 MB en una app de servidor (100 MB en el plan gratuito)
Tamaño de un solo archivocomo máximo 25 MB
Número de archivosHasta 2000 en un sitio estático, hasta 5000 en una app de servidor

Estructura de carpetas

  • Los archivos del proyecto deben estar en la raíz del zip o dentro de una única carpeta superior.
  • En un sitio estático, index.html debe estar en la raíz del zip o dentro de la única carpeta superior.
  • No se aceptan dos archivos con la misma ruta ni rutas inseguras que contengan ../.

NO pongas en el zip (se descartan automáticamente, ocupan espacio en vano)

  • Dependencias: node_modules, .venv, venv, __pycache__, bower_components, .pytest_cache, .mypy_cache
  • Carpetas de herramientas y control de versiones: .git, .svn, .hg, .idea, .vscode, .vs, .cache, .turbo, .parcel-cache, .gradle
  • Resultado de la compilación: .next, .nuxt, .svelte-kit. En .NET también bin y obj.
  • Archivos del sistema: __MACOSX, .DS_Store, Thumbs.db, desktop.ini, *.pyc

NUNCA pongas en el zip (se descartan y no se guardan)

  • Archivos .env: como .env, .env.local, .env.production. Los archivos de ejemplo pueden quedarse: .env.example, .env.sample, .env.template. Si tu zip incluye un .env, el archivo no se guarda; a la compilación solo pasan los valores públicos con los prefijos VITE_, NEXT_PUBLIC_, PUBLIC_, REACT_APP_. Introduce los valores secretos en el panel.
  • Archivos de claves y credenciales: *.pem, *.key, *.p12, *.pfx, *.ppk, *.jks, *.keystore, id_rsa, id_ed25519, .npmrc, .pypirc, .netrc. Si alguno de ellos se compartió antes, renueva la clave.

Archivos que detienen la carga

  • En el código fuente de la aplicación: scripts y archivos de instalación de Windows (.bat, .cmd, .ps1, .vbs, .scr, .msi). Los archivos de programa compilados (.exe, .dll, .so y similares) se descartan; el servidor compila el proyecto a partir del código fuente.
  • En un sitio estático:
    • Están prohibidos el código de servidor y los archivos ejecutables: .php, .py, .rb, .pl, .cgi, .asp, .aspx, .cshtml, .jsp, .exe, .dll, .sh, .jar, .htaccess, .config.
    • Tipos permitidos: .html, .htm, .css, .js, .mjs, .json, .webmanifest, .txt, .xml, .csv, .svg, .png, .jpg, .jpeg, .gif, .webp, .avif, .ico, .bmp, .woff, .woff2, .ttf, .otf, .eot, .mp4, .webm, .mp3, .ogg, .wav, .pdf.
    • Los archivos .map y .md se omiten.

3. Ajustes obligatorios para aplicaciones de servidor

Puerto y dirección

Ai to App indica el puerto en el que debe escuchar la aplicación mediante la variable de entorno PORT. La aplicación debe enlazarse a la dirección 0.0.0.0; localhost o 127.0.0.1 no son accesibles desde fuera.

LenguajeUso correcto
Node.jsapp.listen(process.env.PORT || 3000, '0.0.0.0')
Python (FastAPI)uvicorn main:app --host 0.0.0.0 --port $PORT
Python (Flask)gunicorn app:app --bind 0.0.0.0:$PORT
Python (Django)gunicorn config.wsgi --bind 0.0.0.0:$PORT
Go":" + os.Getenv("PORT")
.NETEn el código NO debe haber la línea UseUrls(...)

Comando de inicio

  • Node.js:
    • El script start de package.json debe iniciar el servidor de producción, p. ej. "start": "node server.js".
    • Los comandos de desarrollo NO deben estar en start: vite, next dev, nodemon, ts-node-dev, tsx watch, webpack serve, react-scripts start, npm run dev. Déjalos en el script dev.
    • TypeScript: añade "build": "tsc" y pon "start": "node dist/index.js". Compilar TypeScript en tiempo de ejecución es lento.
    • Añade al zip el archivo de bloqueo (package-lock.json, pnpm-lock.yaml, yarn.lock o bun.lockb).
    • Indica la versión de Node con package.json → engines.node o con .nvmrc.
  • Python:
    • FastAPI, Flask, Django, Streamlit y Gradio se reconocen automáticamente.
    • Si usas otra estructura, crea en la raíz un Procfile: web: <comando de inicio>. El comando debe usar 0.0.0.0 y $PORT.
    • Flask: gunicorn debe estar en requirements.txt.
    • Django: ALLOWED_HOSTS no debe estar vacío, DEBUG = False y SECRET_KEY debe leerse de una variable de entorno.
    • Indica la versión de Python con runtime.txt o .python-version.
  • .NET: Debe haber un .csproj en la raíz. Ai to App compila con dotnet publish -c Release; la versión de destino se lee de TargetFramework en el .csproj.
  • Dockerfile: Indica el puerto de la aplicación con EXPOSE. La aplicación debe seguir leyendo la variable PORT.

4. Base de datos

Ai to App configura la base de datos por sí mismo y entrega los datos de conexión mediante una variable de entorno. No escribas la dirección de conexión en el código; léela de la variable indicada abajo.

Base de datosVariable de entornoNota
PostgreSQLDATABASE_URLSe te asigna una base de datos y un usuario independientes
MySQLDATABASE_URLSe te asigna una base de datos independiente
MongoDBMONGODB_URISe te asigna una base de datos independiente
RedisREDIS_URL
SQLiteDATABASE_PATHEl archivo se guarda en la carpeta persistente (/data/app.db)
SQL Server—No se proporciona; introduce la dirección de tu propio servidor como variable de entorno o cambia a PostgreSQL
Supabase, Firebase, Neon, PlanetScale, Tursotus propias variablesIntroduce los datos de conexión como variables de entorno en el panel
  • Prisma: añade al zip la carpeta prisma/migrations; si no, es posible que las tablas no se creen automáticamente.
  • Alembic: si existe alembic.ini, antes de la publicación se ejecuta automáticamente alembic upgrade head.
  • Archivo SQLite: el archivo SQLite incluido en el zip solo se usa como datos iniciales en la primera publicación; las cargas posteriores no sobrescriben los datos en vivo. No pongas en el zip una base de datos de prueba que contenga datos personales.
  • Actualizaciones: cuando subes una nueva versión, los datos de la base de datos se conservan.

5. Archivos persistentes

El disco del espacio donde se ejecuta la aplicación no es persistente; se borra en cada nueva publicación. La única carpeta persistente es /data.

  • Guarda bajo /data las fotos y documentos que suben los visitantes, los archivos generados y la base de datos SQLite.
  • Lee la ruta de la carpeta de la variable de entorno DATA_DIR; Ai to App la configura por ti como /data.

6. Información secreta y variables de entorno

  • No escribas contraseñas, claves de API ni tokens en el código; léelos de variables de entorno. Los valores los introduces en el panel de Ai to App; se guardan cifrados.
  • Prefijos públicos: las variables con los prefijos VITE_, NEXT_PUBLIC_, REACT_APP_ y PUBLIC_ se incrustan en el código durante la compilación y cualquier visitante puede verlas. No pongas valores secretos en ellas.
  • Sistema de inicio de sesión (NextAuth / Auth.js): NEXTAUTH_URL (o AUTH_URL) debe ser la dirección real del sitio y NEXTAUTH_SECRET (o AUTH_SECRET) debe tener valor.
  • OAuth (Google, GitHub): añade la dirección de publicación en los ajustes del proveedor como URI de redirección autorizada.
  • Inicio de sesión con Supabase: en Supabase, en Authentication > URL Configuration, escribe tu dirección publicada en Site URL y añade la dirección exacta en Redirect URLs (https://your-app.aitoapp.com/). Si no, los enlaces de los correos de confirmación e inicio de sesión van a localhost:3000 y el inicio de sesión no se completa. Para iniciar sesión con Google, en Google Cloud añade tu dirección publicada a Authorized JavaScript origins y https://PROJECT.supabase.co/auth/v1/callback a Authorized redirect URIs.
  • Variables que proporciona el propio Ai to App: PORT, HOST=0.0.0.0, DATA_DIR=/data y las variables de la base de datos (Sección 4). En Node.js, NODE_ENV=production.

7. Lo que no debe haber en el código

  • Direcciones localhost: el código que hace peticiones a http://localhost:... o http://127.0.0.1:... una vez publicado va al ordenador del propio visitante y no funciona. Lee la dirección de una variable de entorno (p. ej. import.meta.env.VITE_API_URL) o, si está en el mismo servidor, usa una ruta relativa (fetch('/api/...')).
  • Peticiones /api/... en un sitio estático: detrás de un sitio estático no hay servidor. Si necesitas una API, prepara el proyecto como una única aplicación de servidor (p. ej. Express) que funcione junto con su API.
  • Puerto fijo: const PORT = 3000 no debe estar solo; usa process.env.PORT || 3000.
  • Modo de depuración: debug=True o DEBUG = True no deben estar activos en producción.
  • Secretos incrustados en el código: una clave encontrada se considera compartida; renuévala.

8. Lista de verificación para el asistente

  • Se determinó el tipo de proyecto (Sección 1).
  • Si es un sitio compilado, se hizo la compilación y se comprimió solo el interior de la carpeta dist / build / out; index.html está en la raíz.
  • Si es una aplicación de servidor, el script start (o el Procfile) inicia el servidor de producción.
  • El puerto se lee de la variable de entorno PORT; el servidor se enlaza a 0.0.0.0.
  • No quedó ninguna dirección localhost / 127.0.0.1 en el código.
  • Las contraseñas y claves se sacaron del código; se leen de variables de entorno.
  • La conexión a la base de datos se lee de DATABASE_URL / MONGODB_URI / REDIS_URL / DATABASE_PATH.
  • Los archivos persistentes se escriben bajo /data.
  • Existe el archivo de bloqueo (package-lock.json, etc.).
  • node_modules, .git, .venv, .next, bin, obj, .env y los archivos de claves NO están en el zip.
  • El zip pesa menos de 50 MB y cada archivo menos de 25 MB; como máximo 2000 archivos.

9. Al terminar, dime esto

  1. La ubicación exacta del archivo zip preparado.
  2. El tipo de proyecto y el lenguaje o framework usado (p. ej. "Node.js + Express").
  3. La lista de variables de entorno que debo introducir en el panel: el nombre de cada una y para qué sirve. No escribas los valores; los introduciré yo.
  4. Un breve resumen de los cambios que hiciste.

Si hay un problema después de subir el zip, Ai to App lo explica con palabras sencillas; pega ese texto a tu asistente.