Documentación

FluentOps lleva una app web — un front-end estático, un backend real, o algo que renderiza sus propias páginas — de tu máquina a una URL pública con HTTPS. Nunca tocas la infraestructura. Cada proyecto recibe tu-proyecto.fluentops.org, y tu propio dominio cuando lo quieras.

¿Cómo quieres publicar?

Los tres terminan igual: tu app en una URL pública con HTTPS, gratis. Elige el que tengas más a mano.

¿Quién teclea los comandos?

Copia esto y pégalo en Claude Code, Codex o Cursor. Instala la CLI, se detiene para que entres a tu cuenta, y despliega.

Pégalo en tu agente
Configura FluentOps — hosting en un comando para apps web hechas con IA — y despliega esta app.

1. Si `fluentops version` falla, instala la CLI: descarga y ejecuta https://fluentops.org/install.sh
   (curl, wget o la herramienta de descarga que tengas).
2. Si `fluentops whoami` dice que no he iniciado sesión: ejecuta `fluentops login --device --no-wait --json`,
   muéstrame la url y el user_code para que lo apruebe, y luego ejecuta `fluentops login --resume`.
3. Ejecuta `fluentops init` para que este repo guarde las instrucciones de despliegue (AGENTS.md).
4. Desde el directorio de la app ejecuta `fluentops deploy --json` y dame la URL en vivo.
   Si regresa advertencias o un error, sigue AGENTS.md: corrige lo que puedas,
   pídeme los valores secretos que falten (nunca los inventes) y vuelve a desplegar.

Referencia para agentes: https://fluentops.org/llms.txt

Cuando ya está en línea

Todo lo demás que le puedes agregar, en el orden en que la gente suele necesitarlo.

Variables de entorno

Agrega secretos en Proyecto → Secrets (o fluentops secrets add KEY=VALUE). Se cifran en reposo y se inyectan tanto en tiempo de build como en tu backend en runtime, así que código como process.env.OPENAI_API_KEY (u os.environ) simplemente funciona.

  • Prefija una variable con VITE_ para exponerla al bundle del navegador (seguro para claves/URLs públicas).
  • Mantén las claves de servicio y secretas sin prefijo — se quedan del lado del servidor y llegan a tu backend en runtime.
  • Conectar un servicio lista las variables exactas para Supabase, OpenAI, Stripe, Firebase y más.
Dominios propios

En Proyecto → Domains, agrega tu dominio (p. ej. www.miempresa.com). FluentOps emite un certificado gratis y muestra los registros DNS exactos que hay que agregar, en dos pasos:

  1. Verifica la propiedad — agrega el registro CNAME de validación (una vez; las renovaciones lo reutilizan).
  2. Apunta tu dominio — agrega el registro de ruteo en tu proveedor DNS.

Para un dominio raíz/apex: si tu DNS lo soporta (Cloudflare, Route 53…) agregas el registro en @ directamente. Si tu registrador no puede (p. ej. Namecheap), conecta www y agrega una redirección 301 sin enmascarar desde la raíz — la interfaz lo detecta y muestra los registros correctos. El HTTPS se aprovisiona y renueva automáticamente en cuanto el DNS resuelve.

Formularios

FluentOps Forms convierte un simple <form> de tu sitio estático en captura de leads real — sin backend, sin código. Los envíos llegan a la bandeja de tu proyecto y te avisan por correo al instante. Es gratis (100 envíos/mes por cuenta). Ver la página de Forms.

1 · Actívalo

En tu proyecto, abre la pestaña Grow y haz clic en Enable forms. Obtienes una URL de endpoint única para ese proyecto.

2 · Vuelve a desplegar

Activarlo no cambia el sitio que ya está publicado. En tu próximo despliegue conectamos cada <form> de tu HTML que no tenga destino propio (sin action, con #, un .php, o un formulario de Netlify). Los buscadores, los logins y los formularios que apuntaste a otro servicio no se tocan. El panel te dice qué formularios conectó.

Si escribes el formulario tú

<form action="https://api.fluentops.org/forms/<token>" method="POST">
  <input name="email" />
  <textarea name="message"></textarea>
  <input type="text" name="_gotcha" style="display:none" tabindex="-1" />
  <button>Send</button>
</form>

Cualquier nombre de campo funciona — todos llegan a tu bandeja. El campo oculto _gotcha es una trampa (honeypot): el envío de un bot que lo llena se guarda marcado como spam y no te manda correo.

React, Vite, Bolt, Lovable (apps de JavaScript)

En una app de JavaScript el formulario lo dibuja el código, así que un despliegue no puede conectarlo. Envíalo con fetch — sirve JSON o form data — o pega en tu herramienta de IA el prompt que te da el panel:

const res = await fetch('https://api.fluentops.org/forms/<token>', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ ...form, 'form-name': 'contact' }),
})
if (res.ok) { /* show your thank-you message */ }

Campos opcionales

  • _redirect (o _next) — envía al visitante a una página de gracias tras enviar; sin él recibe una pequeña respuesta JSON.
  • form-name (o _form) — etiqueta los envíos cuando un proyecto tiene más de un formulario.

Free incluye 100 envíos/mes en todos tus sitios, guardados 30 días. Pro lo sube a 1,000/mes con exportar CSV y retención ilimitada. Al pasar el límite, los leads se siguen capturando — nunca perdemos uno.

Backends y APIs

FluentOps corre un backend real para tu app — un proceso real en un contenedor, no una función serverless. Mantiene estado en memoria, sostiene conexiones WebSocket y se conecta a tu base de datos normalmente.

Cero config — detectamos tu stack

No escribes un Dockerfile. Igual que con el front-end, leemos los archivos de tu proyecto y construimos la imagen por ti. Despliega de la misma forma (CLI, arrastrar y soltar, o Git); si encontramos un servidor, lo desplegamos junto a tu front-end en un solo paso.

Dónde vive

Desplegado solo, tu backend responde en todas las rutas de la URL de tu proyecto — las que escribiste, donde las hayas montado. Nada más compite por /, así que no te lo quitamos:

https://your-project.fluentops.org/users

Con un front-end al lado, el front-end es dueño de / y tu backend responde bajo /api/* — un solo hostname, sin configurar CORS. Monta esas rutas bajo /api: en Express, app.use('/api', router); en FastAPI, @app.get("/api/...") (o un APIRouter con prefix="/api"). Una petición a /api/users llega a tu servidor como /api/users.

/api/* sigue funcionando en ambos casos, así que una URL que ya tenías cableada no se rompe. Los secretos de tu proyecto se inyectan como variables de entorno en runtime, así process.env / os.environ funciona.

Front + back en un proyecto (monorepos)

¿Tienes tu front-end y backend en un repo (digamos web/ y api/)? Despliégalo tal cual — escaneamos tus carpetas, encontramos ambos y los desplegamos juntos: el front-end en /, la API en /api/*. También puedes desplegar solo uno. Si encontramos más de un front-end o más de un backend, te preguntamos cuál desplegar.

Apps que renderizan sus propias páginas

Si tu app renderiza sus páginas en el servidor — Next.js SSR, Nuxt, SvelteKit, Astro, Remix, Django, Rails, o una app Express/Flask con plantillas — despliégala tal cual. La detectamos, la construimos, y tu app es dueña de todas las rutas en /, no solo de /api/*. Sin output: "export", sin partirla en dos, sin cambios en tu código.

Vale conocer el trade-off: un front-end estático se sirve desde el CDN y sigue en pie aunque un backend Free esté dormido, mientras que una app server-rendered construye cada página en tu contenedor. Si tu sitio es contenido que no cambia por visitante, un build estático sigue siendo más rápido y barato — pero esa es tu decisión, no un límite que te imponemos.

Bases de datos: FluentOps no hospeda tu base de datos — apunta tu backend a un proveedor gestionado (Supabase, Neon, PlanetScale…) vía un secreto. Ver Bases de datos.

Modos de ejecución

Cada backend es un artefacto con un modo de ejecución que eliges en la página del proyecto (junto a Secrets). Cámbialo cuando quieras — sin re-desplegar.

  • Always on — un servicio que sigue escuchando (una API, un servidor web). En Free se duerme tras unos minutos inactivo y despierta en la primera petición (un cold start de ~1–3s); en Pro nunca se duerme.
  • On demand — un job que corre cuando se dispara y se detiene. Te damos una URL de activación privada (POST) y un botón Run now; los logs y el código de salida de cada corrida se guardan en el historial.
  • On a schedule — el mismo job en un horario cron (UTC). Free corre a lo mucho una vez al día; Pro permite horarios por minuto.

Los minutos de ejecución de los jobs on-demand y programados se miden contra la cuota mensual de tu plan; cuando la alcanzas, los jobs se pausan hasta el mes siguiente — nunca se te cobra excedente.

Bases de datos

FluentOps hospeda tu app, no tu base de datos — el mismo modelo que Vercel. Usa un proveedor gestionado y conéctate a él desde tu backend con un secreto:

  • Supabase / Neon — Postgres
  • PlanetScale — MySQL
  • Upstash — Redis
  • Cualquier host — pon la cadena de conexión como secreto (p. ej. DATABASE_URL)

La sección de Secrets del panel tiene recetas de copiar y pegar para los más comunes, con los nombres exactos de variable que cada uno espera.

Referencia de la CLI

Comandos

ComandoQué hace
fluentops deployDetecta → (auto-crea) → sube → build → URL en vivo
fluentops deploy --front web --back apiElige qué apps desplegar cuando el proyecto tiene más de una ("none" omite un tipo)
fluentops initEscribe instrucciones de despliegue para agentes en AGENTS.md (y CLAUDE.md si existe)
fluentops logs [-f]Logs del último deploy; -f / --follow transmite
fluentops statusDeploys recientes del proyecto vinculado
fluentops openAbre la URL en vivo del proyecto
fluentops projectsLista tus proyectos
fluentops projects delete <slug>Borra un proyecto y su sitio (irreversible; pide escribir el slug, o --confirm <slug> sin terminal)
fluentops secrets list|add|deleteGestiona variables de entorno (add KEY=VALUE, varias a la vez)
fluentops login / logout / whoamiAutenticación
fluentops login --deviceInicia sesión aprobando un código corto desde cualquier navegador — para SSH, contenedores y agentes en la nube (automático ahí)
fluentops versionVersión / info de build

Modo agente y JSON

--json emite salida legible por máquina y --yes nunca pregunta — ambos se activan solos cuando la salida no es una terminal, así agentes y CI funcionan sin flags.

fluentops deploy --json --yes
# {"status":"success","project_slug":"my-app",
#  "url":"https://my-app.fluentops.org",
#  "warnings":[{"kind":"missing_env","items":["VITE_SUPABASE_URL"],
#    "fix":"fluentops secrets add VITE_SUPABASE_URL=<value> && fluentops deploy"}]}

Un deploy que no queda en línea sale con código distinto de cero, "status":"error" y un code estable: needs_selection (con las options encontradas — vuelve a correr con --front/--back), build_failed (con error y las últimas líneas del log en log_tail) o unsupported_stack. Todo lo que un agente necesita para corregir y reintentar, sin un segundo comando.

Ignorar archivos

node_modules, .git, dist, build, out y .fluentops siempre se omiten. Agrega un .fluentopsignore (sintaxis de gitignore) para excluir más.

Stacks soportados

Front-end (hosting estático)

  • React (CRA o cualquier bundler con un script de build)
  • Vite (incluido React + Vite)
  • Next.js export estático (output: "export")
  • HTML estático / CSS / JS

Apps que renderizan sus páginas (server-side)

Se despliegan tal cual: la app es dueña de todas las rutas en /, y la construimos como su framework espera. Sin output: "export", sin cambios de código.

  • Next.js (SSR / App Router — rutas dinámicas, middleware y route handlers incluidos)
  • Nuxt, SvelteKit, Astro (modo servidor), Remix
  • Django — manage.py y tu módulo de settings; corremos collectstatic por ti
  • Rails con vistas, y apps Express / Flask / FastAPI que renderizan plantillas (EJS, Pug, Jinja, ERB…)

Backend (auto-detectado, sin Dockerfile)

  • Node — Express, Fastify, Hono, Koa, NestJS, Elysia (o cualquier servidor con un script start)
  • Python — FastAPI, Flask, o un script/worker plano (job.py, main.py…) corrido como job
  • Go — cualquier módulo con un paquete main
  • Ruby — Rails, o apps Rack (Sinatra/Roda) con un config.ru
  • Jobs y cron — un script que corre y termina es un job: por defecto queda On demand (se dispara por URL/CLI) y puede cambiarse a On a schedule. Sin servidor, sin Dockerfile.

Cualquier otro lenguaje

FluentOps construye tu app desde el stack que detecta — no ejecuta un contenedor subido, así que un Dockerfile en tu proyecto se ignora (te avisamos cuando omitimos uno). Los stacks que aún no construimos — Rust, Java, PHP, Deno y otros — no están soportados por ahora; dinos qué necesitas y lo priorizamos.

Si no podemos saber cómo iniciar tu backend, el build falla con un mensaje claro (p. ej. "agrega un script start a package.json").

FAQ

¿Cómo genero un ZIP?

Comprime la carpeta del proyecto (la que tiene package.json o index.html). En macOS: clic derecho → Comprimir. Deja node_modules — lo omitimos — y mantén la carga bajo 50 MB.

¿Por qué falló mi build?

Abre el deploy y lee los logs — las últimas líneas dicen exactamente qué pasó (stack no soportado, error de install/build, o salida faltante). Arréglalo localmente y despliega de nuevo.

¿Cómo actualizo mi sitio?

Despliega de nuevo — CLI, arrastrar y soltar o Git. Cada deploy reemplaza la versión anterior en la misma URL.

¿Cómo agrego una API o backend?

No haces nada especial — si tu proyecto tiene un servidor (Node, Python, Go o Ruby), lo detectamos y lo construimos. Solo, responde en todas las rutas de la URL de tu proyecto; desplegado junto a un front-end, el front-end toma / y tu API responde bajo /api/*. Elige su modo de ejecución en la página del proyecto.

¿Hospedan mi base de datos?

No — conecta un proveedor gestionado (Supabase, Neon, PlanetScale…) agregando su cadena de conexión como secreto. Tu backend la lee del entorno.

¿De verdad es gratis?

Sí — hosting, HTTPS, dominios propios y un backend son gratis durante la beta. Los backends Free se duermen tras unos minutos inactivos y despiertan en la siguiente petición; Pro los mantiene always-on.

¿Sigues atorado? Usa Enviar Feedback en el panel — incluye tu WhatsApp y te contactamos.