Documentação

Documentação do TeamOnly

A CLI, o SDK que seu app usa e o arquivo de skill que ensina sua IA o que escrever. Técnico, e curto. Agentes de programação podem ler esta página em Markdown em /docs.md.

Início rápido

Você precisa do Node.js 20 ou mais recente. Ainda sem plano? Na primeira vez que entrar, você pode começar um teste grátis de 14 dias sem cartão, ou assinar. Você também pode assinar aqui. Numa pasta nova, ou num projeto que você já tem:

  1. npx teamonly init adiciona um app inicial e as instruções que sua ferramenta de IA segue.
  2. npx teamonly login uma vez por computador. Digite seu e-mail corporativo e o código de 6 dígitos que enviamos por e-mail. Se sua empresa ainda não tem plano, ele oferece o teste grátis de 14 dias, que começa na hora, ou um plano com página de pagamento. Aperte Enter em vez de digitar um e-mail para entrar pelo navegador.
  3. npx teamonly deploy coloca o app no ar em https://<app>.<company>.teamonly.app.

Fica assim:

Terminal~/expenses
npx teamonly initAdded the TeamOnly skill, Cursor rules and SDKCrie uma ferramenta de aprovação de despesas(sua IA cria o app)npx teamonly loginSigned in as dana@acme.comnpx teamonly deployLive at https://expenses.acme.teamonly.appOnly @acme.com accounts can sign in

A primeira publicação cria o app, o banco de dados e o armazenamento de arquivos. As publicações seguintes atualizam o mesmo app no mesmo endereço.

Comandos da CLI

npx teamonly login
Entra no TeamOnly a partir deste computador, uma vez por computador. Digite seu e-mail corporativo e o código de 6 dígitos que enviamos, ou aperte Enter para entrar pelo navegador. --email e --code fazem o mesmo sem perguntas, para ferramentas de IA e scripts.
npx teamonly trial --company "Acme"
Começa o teste grátis de 14 dias para sua empresa, sem cartão. Use depois do login quando sua empresa ainda não tem plano. Um teste por domínio de e-mail da empresa.
npx teamonly subscribe --plan builder
Assina, ou religa os apps depois do teste. Escolha builder, team ou business. Ele abre uma página de pagamento e faz seu login aqui assim que você paga.
npx teamonly init
Prepara esta pasta: um app inicial, ou as instruções do TeamOnly para sua ferramenta de IA (skill do Claude Code, regras do Cursor, AGENTS.md) e o SDK num projeto existente.
npx teamonly deploy
Gera o app e coloca no ar. Cria o banco de dados e o armazenamento de arquivos na primeira publicação. Mostra o endereço do app.
npx teamonly access
Mostra quem pode abrir o app. Adicione only, add ou remove com endereços de e-mail para usar uma lista, ou everyone para a empresa toda.
npx teamonly roles
Dá papéis às pessoas dentro do app, como aprovador ou financeiro. roles add approver dana@acme.com dá um papel, roles remove tira, e roles sozinho lista quem tem qual. Só endereços da empresa.
npx teamonly secrets set NAME
Guarda um segredo para este app. O valor é pedido na hora, então nunca vai parar no histórico do terminal.
npx teamonly logs
Acompanha ao vivo as requisições do app, a saída de console.log e os erros, conforme acontecem. Pressione Ctrl+C para parar.
npx teamonly whoami
Mostra com qual conta você entrou, seu plano e seus apps.
npx teamonly delete
Exclui o app no ar, com o banco de dados e os arquivos. Antes, pede que você digite o nome do app.
npx teamonly logout
Sai do TeamOnly neste computador.

SDK

Sua API é um app Hono. O middleware do SDK dá a cada requisição um contexto em c.var.ctx:

ctx.user
A pessoa que entrou: email, name, isOwner para quem publicou o app pela primeira vez, e roles, os papéis dela neste app. Verificado pelo TeamOnly antes de o seu código rodar. Nunca leia a identidade dos cabeçalhos por conta própria.
ctx.db
O banco de dados SQL próprio deste app (SQLite, no Cloudflare D1). Criado na primeira publicação.
ctx.files
O armazenamento de arquivos deste app: put, get, list, delete.
ctx.secrets
Valores definidos com npx teamonly secrets set. Leia com ctx.secrets.get(name).
ctx.email
Envia e-mails para colegas: send({ to, subject, text, html?, replyTo? }). Veja E-mail.
ctx.schedule
O nome da tarefa quando o TeamOnly roda uma tarefa agendada, senão undefined. Veja Tarefas agendadas.

No navegador, useUser() de teamonly/react retorna { email, name, roles }.

api/index.tsexemplo
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

E-mail

Um app pode mandar e-mail para pessoas da sua empresa com ctx.email.send(), por exemplo para avisar um aprovador que uma despesa está aguardando.

api/index.tsexemplo
// 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',
})
  • Só para endereços nos domínios de e-mail da sua empresa, as mesmas pessoas que podem entrar. Qualquer outro endereço é recusado e nada é enviado.
  • Enviado de notify@teamonly.app em nome do app na sua empresa, como “Expenses at Acme”. As respostas vão para o responsável pelo app, a menos que você defina replyTo (também um endereço da empresa).
  • Todo e-mail traz uma linha dizendo qual app o enviou.
  • Limites por app: 100 destinatários por hora e 500 por dia, e até 50 destinatários por e-mail.
  • A página do app no painel mostra quantos e-mails ele enviou nos últimos 30 dias.
  • No seu computador, com npm run dev, os e-mails aparecem no terminal em vez de serem enviados.
  • E-mail para pessoas de fora da sua empresa não é suportado.

Tarefas agendadas

Para resumos diários, lembretes e relatórios de fim de mês, liste as tarefas em teamonly.json. O TeamOnly chama cada rota nesses horários.

teamonly.jsonexemplo
{
  "name": "expenses",
  "timezone": "America/New_York",
  "schedules": [
    { "name": "daily-digest", "cron": "0 9 * * 1-5", "path": "/api/cron/daily-digest" }
  ]
}
api/index.tsexemplo
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 tem cinco campos: minuto, hora, dia do mês, mês, dia da semana. As tarefas rodam em marcas de 5 minutos, então os minutos precisam ser múltiplos de 5.
  • timezone é opcional e o padrão é UTC.
  • Envolva a rota em scheduled(...) de teamonly/server. Quem abrir a URL recebe um 404.
  • A página do app no painel mostra a última execução de cada tarefa e se deu certo.
  • As tarefas ficam pausadas quando um teste grátis termina.

Papéis

Papéis como aprovador, financeiro ou admin ficam no TeamOnly, não no seu código. O responsável pelo app ou um admin dá os papéis na página do app no painel, ou com npx teamonly roles. Só endereços da empresa.

Terminal~/expenses
npx teamonly roles add approver dana@acme.comGave dana@acme.com the role approverapprover: dana@acme.com
api/index.tsexemplo
// 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)
  // ...
})

O app lê os papéis como ctx.user.roles e decide o que cada papel pode fazer. Continua sem nenhum código de login para escrever.

O arquivo de skill

O init adiciona um arquivo de skill para o Claude Code e o mesmo conteúdo como arquivo de regras para o Cursor. Sua ferramenta de IA lê esse arquivo antes de escrever código. Ele ensina:

  • O único formato de app suportado (abaixo), e a não sair dele.
  • A usar ctx.user para identidade e nunca escrever as próprias telas de login, cadastro ou senha.
  • A usar ctx.db e ctx.files em vez de adicionar um serviço de banco de dados, Express, Supabase ou Firebase.
  • A guardar chaves de API em ctx.secrets, nunca no código.
  • A mandar e-mail com ctx.email, rodar trabalho com horário marcado como tarefas agendadas e verificar ctx.user.roles no servidor.
  • Como rodar o deploy e corrigir o que ele apontar.

O objetivo é que a primeira publicação funcione. Se sua IA insistir em algo que não rodamos, avise a gente: é um bug no arquivo de skill.

Servidor MCP

O pacote teamonly também roda um servidor MCP, para ferramentas de IA que preferem ferramentas a comandos de terminal, como o Claude Desktop ou o agente do Cursor sem terminal. Ele roda no seu computador, porque publicar lê os arquivos do seu projeto. Adicione ao Claude Code com:

Terminal~/expenses
claude mcp add teamonly -- npx -y teamonly mcp
  • Cursor, Claude Desktop e Windsurf: adicione { "mcpServers": { "teamonly": { "command": "npx", "args": ["-y", "teamonly", "mcp"] } } } à configuração MCP deles.
  • VS Code: no .vscode/mcp.json a chave é servers, com "type": "stdio".
  • As 12 ferramentas: get_app_rules, init, deploy, status, logs, access, roles, set_secret, sign_in, start_trial, subscribe, delete_app.
  • Está no MCP Registry oficial como dev.teamonly/teamonly.

O arquivo de skill e as regras continuam sendo a principal forma de a sua IA aprender o stack, e a CLI funciona exatamente como antes. A configuração para cada ferramenta, com um botão de um clique para o Cursor: servidor MCP do TeamOnly.

Formato de app suportado

  • Front-end: React, gerado com Vite, servido como arquivos estáticos.
  • API: um app Hono em TypeScript ou JavaScript, em /api, no mesmo endereço.
  • Runtime: Cloudflare Workers. APIs web padrão; a maioria dos módulos internos do Node via compatibilidade, mas sem módulos nativos nem processos de longa duração.
  • Não suportado: Python, Ruby, PHP, contêineres Docker, WebSockets e atualizações ao vivo, workers em segundo plano, e-mail para pessoas de fora da sua empresa, conexão com servidores na rede privada da sua empresa, domínios próprios, apps públicos.

Limites

Os limites hoje:

  • Builder: 1 criador, 3 apps. Team: criadores e apps ilimitados.
  • O banco de dados e o armazenamento de arquivos de cada app seguem os limites do Cloudflare D1 e R2.
  • As requisições rodam dentro dos limites do Cloudflare Workers para tempo de CPU e memória.

Mais sobre como tudo se encaixa: Como funciona e Segurança.

Acesso antecipado

Coloque sua primeira ferramenta no ar esta semana.

O TeamOnly está em acesso antecipado, e todos os planos já estão abertos. Teste grátis por 14 dias sem cartão, ou assine. Nos dois casos, sua empresa fica pronta na hora, e três comandos colocam seu primeiro app no ar.

Teste grátis por 14 diasOu assine agora

Sem cartão no teste. Depois, a partir de $19 por mês, cancele quando quiser.

Ainda não? Receba novidades

Use seu e-mail corporativo. Escrevemos pouco, e só quando há novidade que valha a pena.

Dúvidas vão para hello@teamonly.dev, e uma pessoa responde.