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:
npx teamonly initagrega una app de inicio y las instrucciones que sigue tu herramienta de IA.npx teamonly loginuna 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.npx teamonly deploypone la app en línea enhttps://<app>.<company>.teamonly.app.
Se ve así:
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 inLa 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.
--emaily--codehacen 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
logincuando 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,teamobusiness. 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,addoremovecon direcciones de correo para usar una lista, oeveryonepara toda la empresa. npx teamonly roles- Da roles a las personas dentro de la app, como aprobador o finanzas.
roles add approver dana@acme.comda uno,roles removelo quita yrolessolo 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.logy 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,isOwnerpara quien publicó la app por primera vez, yroles, 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 conctx.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 }.
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 appCorreo
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.
// 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.appcomo la app en tu empresa, por ejemplo “Expenses at Acme”. Las respuestas le llegan al responsable de la app, salvo que configuresreplyTo(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.
{
"name": "expenses",
"timezone": "America/New_York",
"schedules": [
{ "name": "daily-digest", "cron": "0 9 * * 1-5", "path": "/api/cron/daily-digest" }
]
}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 })
}))crontiene 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.timezonees opcional y por defecto es UTC.- Envuelve la ruta en
scheduled(...)deteamonly/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.
npx teamonly roles add approver dana@acme.comGave dana@acme.com the role approverapprover: dana@acme.com// 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.userpara la identidad y nunca escribir sus propias pantallas de inicio de sesión, registro o contraseña. - A usar
ctx.dbyctx.filesen 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 revisarctx.user.rolesen el servidor. - Cómo ejecutar
deployy 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:
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.jsonla clave esservers, 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.
Sin tarjeta para la prueba. Después, desde $19 al mes, cancela cuando quieras.
¿Aún no? Recibe novedades
Escribe tus preguntas a hello@teamonly.dev y te responde una persona.