Docs

Documentación de TeamOnly

La CLI, el SDK que usa tu app y el archivo de skill que le enseña a tu IA qué escribir. Técnico y breve. Los agentes de programación pueden leer esta página en Markdown en /docs.md.

Inicio rápido

Necesitas Node.js 20 o más reciente. ¿Aún no tienes plan? La primera vez que inicies sesión, puedes empezar una prueba gratis de 14 días sin tarjeta, o suscribirte. También puedes suscribirte aquí. En una carpeta nueva, o en un proyecto que ya tienes:

  1. npx teamonly init agrega una app de inicio y las instrucciones que sigue tu herramienta de IA.
  2. npx teamonly login una vez por computadora. Escribe tu correo de trabajo y el código de 6 dígitos que te enviamos por email. Si tu empresa aún no tiene plan, te ofrece la prueba gratis de 14 días, que empieza de inmediato, o un plan con una página de pago. Pulsa Enter en lugar de escribir un correo para iniciar sesión con tu navegador.
  3. npx teamonly deploy pone la app en línea en https://<app>.<company>.teamonly.app.

Se ve así:

Terminal~/expenses
npx teamonly initAdded the TeamOnly skill, Cursor rules and SDKCrea una herramienta de aprobación de gastos(tu IA crea la app)npx teamonly loginSigned in as dana@acme.comnpx teamonly deployLive at https://expenses.acme.teamonly.appOnly @acme.com accounts can sign in

La primera publicación crea la app, su base de datos y su almacenamiento de archivos. Las siguientes publicaciones actualizan la misma app en la misma dirección.

Comandos de la CLI

npx teamonly login
Inicia sesión en TeamOnly desde esta computadora, una vez por computadora. Escribe tu correo de trabajo y el código de 6 dígitos que te enviamos, o pulsa Enter para iniciar sesión con tu navegador. --email y --code hacen lo mismo sin preguntas, para herramientas de IA y scripts.
npx teamonly trial --company "Acme"
Empieza la prueba gratis de 14 días para tu empresa, sin tarjeta. Úsalo después de login cuando tu empresa aún no tiene plan. Una prueba por dominio de correo de empresa.
npx teamonly subscribe --plan builder
Suscríbete, o vuelve a activar tus apps después de la prueba. Elige builder, team o business. Abre una página de pago e inicia tu sesión aquí en cuanto pagas.
npx teamonly init
Prepara esta carpeta: una app de inicio, o las instrucciones de TeamOnly para tu herramienta de IA (skill de Claude Code, reglas de Cursor, AGENTS.md) y el SDK en un proyecto existente.
npx teamonly deploy
Compila la app y la pone en línea. Crea la base de datos y el almacenamiento de archivos en la primera publicación. Muestra la dirección de la app.
npx teamonly access
Muestra quién puede abrir la app. Agrega only, add o remove con direcciones de correo para usar una lista, o everyone para toda la empresa.
npx teamonly roles
Da roles a las personas dentro de la app, como aprobador o finanzas. roles add approver dana@acme.com da uno, roles remove lo quita y roles solo muestra quién tiene cuál. Solo direcciones de la empresa.
npx teamonly secrets set NAME
Guarda un secreto para esta app. Se te pide el valor, así que nunca queda en el historial de tu terminal.
npx teamonly logs
Mira en vivo las solicitudes de la app, la salida de console.log y los errores, a medida que ocurren. Presiona Ctrl+C para detenerlo.
npx teamonly whoami
Muestra con qué cuenta iniciaste sesión, tu plan y tus apps.
npx teamonly delete
Elimina la app en línea junto con su base de datos y sus archivos. Antes te pide escribir el nombre de la app.
npx teamonly logout
Cierra la sesión de TeamOnly en esta computadora.

SDK

Tu API es una app de Hono. El middleware del SDK le da a cada solicitud un contexto en c.var.ctx:

ctx.user
La persona que inició sesión: email, name, isOwner para quien publicó la app por primera vez, y roles, sus roles en esta app. TeamOnly lo verifica antes de que corra tu código. Nunca leas la identidad de los encabezados por tu cuenta.
ctx.db
La base de datos SQL propia de esta app (SQLite, en Cloudflare D1). Se crea en la primera publicación.
ctx.files
El almacenamiento de archivos de esta app: put, get, list, delete.
ctx.secrets
Valores configurados con npx teamonly secrets set. Se leen con ctx.secrets.get(name).
ctx.email
Envía correos a compañeros: send({ to, subject, text, html?, replyTo? }). Consulta Correo.
ctx.schedule
El nombre de la tarea cuando TeamOnly ejecuta una tarea programada; si no, undefined. Consulta Tareas programadas.

En el navegador, useUser() de teamonly/react devuelve { email, name, roles }.

api/index.tsejemplo
import { Hono } from 'hono'
import { teamonly, type TeamOnly } from 'teamonly/server'

const app = new Hono<TeamOnly>()
app.use('*', teamonly())

// Who is signed in. Verified before your code runs.
app.get('/api/me', (c) => {
  return c.json(c.var.ctx.user) // { email: 'dana@acme.com', name: 'Dana Okafor', isOwner: false, roles: ['approver'] }
})

// Save to this app's own database.
app.post('/api/expenses', async (c) => {
  const { db, user } = c.var.ctx
  const { amount, reason } = await c.req.json()
  await db
    .prepare('INSERT INTO expenses (amount, reason, submitted_by) VALUES (?, ?, ?)')
    .bind(amount, reason, user.email)
    .run()
  return c.json({ ok: true })
})

// Store an uploaded receipt in this app's file storage.
app.put('/api/receipts/:id', async (c) => {
  await c.var.ctx.files.put(`receipts/${c.req.param('id')}`, c.req.raw.body)
  return c.json({ ok: true })
})

// Read a secret set with: npx teamonly secrets set QUICKBOOKS_KEY
app.get('/api/sync', async (c) => {
  const key = c.var.ctx.secrets.get('QUICKBOOKS_KEY')
  // ...
})

export default app

Correo

Una app puede enviar correos a personas de tu empresa con ctx.email.send(), por ejemplo para avisarle a un aprobador que hay un gasto esperando.

api/index.tsejemplo
// Tell the approver an expense is waiting.
await c.var.ctx.email.send({
  to: 'priya@acme.com',   // one address or a list, up to 50
  subject: 'An expense is waiting for you',
  text: 'Dana sent a $42 expense. Review it: https://expenses.acme.teamonly.app',
})
  • Solo a direcciones de los dominios de correo de tu propia empresa, las mismas personas que pueden iniciar sesión. Cualquier otra dirección se rechaza y no se envía nada.
  • Se envía desde notify@teamonly.app como la app en tu empresa, por ejemplo “Expenses at Acme”. Las respuestas le llegan al responsable de la app, salvo que configures replyTo (también una dirección de la empresa).
  • Cada correo lleva una línea que dice qué app lo envió.
  • Límites por app: 100 destinatarios por hora y 500 al día, y hasta 50 destinatarios por correo.
  • La página de la app en el panel muestra cuántos correos envió en los últimos 30 días.
  • En local, con npm run dev, los correos se muestran en la terminal y no se envían.
  • No se pueden enviar correos a personas de fuera de tu empresa.

Tareas programadas

Para resúmenes diarios, recordatorios e informes de fin de mes, enumera las tareas en teamonly.json. TeamOnly llama a cada ruta a esas horas.

teamonly.jsonejemplo
{
  "name": "expenses",
  "timezone": "America/New_York",
  "schedules": [
    { "name": "daily-digest", "cron": "0 9 * * 1-5", "path": "/api/cron/daily-digest" }
  ]
}
api/index.tsejemplo
import { scheduled } from 'teamonly/server'

// Runs at 9am New York time, Monday to Friday.
app.post('/api/cron/daily-digest', scheduled(async (c) => {
  const { db, email } = c.var.ctx
  // ...find what is waiting, then email each approver
  return c.json({ ok: true })
}))
  • cron tiene cinco campos: minuto, hora, día del mes, mes, día de la semana. Las tareas corren en marcas de 5 minutos, así que los minutos deben ser múltiplos de 5.
  • timezone es opcional y por defecto es UTC.
  • Envuelve la ruta en scheduled(...) de teamonly/server. Quien abra la URL recibe un 404.
  • La página de la app en el panel muestra la última ejecución de cada tarea y si funcionó.
  • Las tareas se pausan cuando termina una prueba gratis.

Roles

Los roles como aprobador, finanzas o admin se guardan en TeamOnly, no en tu código. El responsable de la app o un admin los asigna en la página de la app en el panel, o con npx teamonly roles. Solo direcciones de la empresa.

Terminal~/expenses
npx teamonly roles add approver dana@acme.comGave dana@acme.com the role approverapprover: dana@acme.com
api/index.tsejemplo
// Only approvers can approve.
app.post('/api/expenses/:id/approve', async (c) => {
  const { user } = c.var.ctx
  if (!user.roles.includes('approver')) return c.json({ error: 'Approvers only' }, 403)
  // ...
})

La app los lee como ctx.user.roles y decide qué puede hacer cada rol. Sigues sin escribir código de inicio de sesión.

El archivo de skill

init agrega un archivo de skill para Claude Code y el mismo contenido como archivo de reglas para Cursor. Tu herramienta de IA lo lee antes de escribir código. Le enseña:

  • El único tipo de app compatible (abajo), y a no salirse de él.
  • A usar ctx.user para la identidad y nunca escribir sus propias pantallas de inicio de sesión, registro o contraseña.
  • A usar ctx.db y ctx.files en lugar de agregar un servicio de base de datos, Express, Supabase o Firebase.
  • A guardar las claves de API en ctx.secrets, nunca en el código.
  • A enviar correos con ctx.email, a ejecutar el trabajo periódico como tareas programadas y a revisar ctx.user.roles en el servidor.
  • Cómo ejecutar deploy y corregir lo que reporte.

La idea es que la primera publicación funcione. Si tu IA insiste en usar algo que no corremos, avísanos; es un error del archivo de skill.

Servidor MCP

El paquete teamonly también ejecuta un servidor MCP, para herramientas de IA que prefieren herramientas en lugar de comandos de terminal, como Claude Desktop o el agente de Cursor sin terminal. Se ejecuta en tu computadora, porque publicar lee los archivos de tu proyecto. Agrégalo a Claude Code con:

Terminal~/expenses
claude mcp add teamonly -- npx -y teamonly mcp
  • Cursor, Claude Desktop y Windsurf: agrega { "mcpServers": { "teamonly": { "command": "npx", "args": ["-y", "teamonly", "mcp"] } } } a su configuración MCP.
  • VS Code: en .vscode/mcp.json la clave es servers, con "type": "stdio".
  • Sus 12 herramientas: get_app_rules, init, deploy, status, logs, access, roles, set_secret, sign_in, start_trial, subscribe, delete_app.
  • Aparece en el MCP Registry oficial como dev.teamonly/teamonly.

El archivo de skill y las reglas siguen siendo la forma principal en que tu IA aprende el stack, y la CLI funciona exactamente igual. La configuración para cada herramienta, con un botón de un clic para Cursor: servidor MCP de TeamOnly.

Tipo de app compatible

  • Interfaz: React, compilado con Vite, servido como archivos estáticos.
  • API: una app de Hono en TypeScript o JavaScript, bajo /api, en la misma dirección.
  • Entorno de ejecución: Cloudflare Workers. APIs web estándar; la mayoría de los módulos integrados de Node por compatibilidad, pero sin módulos nativos ni procesos de larga duración.
  • No compatible: Python, Ruby, PHP, contenedores Docker, WebSockets y actualizaciones en vivo, procesos en segundo plano, correos a personas de fuera de tu empresa, conexión a servidores de la red privada de tu empresa, dominios propios, apps públicas.

Límites

Los límites hoy:

  • Builder: 1 creador, 3 apps. Team: creadores y apps ilimitados.
  • La base de datos y el almacenamiento de archivos de cada app siguen los límites de Cloudflare D1 y R2.
  • Las solicitudes corren dentro de los límites de Cloudflare Workers para tiempo de CPU y memoria.

Más sobre cómo encaja todo: Cómo funciona y Seguridad.

Acceso anticipado

Pon tu primera herramienta en línea esta semana.

TeamOnly está en acceso anticipado y todos los planes ya están abiertos. Pruébalo gratis 14 días sin tarjeta, o suscríbete. De cualquier forma, tu empresa queda lista de inmediato, y tres comandos ponen tu primera app en línea.

Prueba gratis 14 díasO suscríbete ahora

Sin tarjeta para la prueba. Después, desde $19 al mes, cancela cuando quieras.

¿Aún no? Recibe novedades

Usa tu correo de trabajo. Escribimos poco, y solo cuando hay algo que valga la pena contar.

Escribe tus preguntas a hello@teamonly.dev y te responde una persona.