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:
npx teamonly initadiciona um app inicial e as instruções que sua ferramenta de IA segue.npx teamonly loginuma 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.npx teamonly deploycoloca o app no ar emhttps://<app>.<company>.teamonly.app.
Fica assim:
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 inA 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.
--emaile--codefazem 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
loginquando 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,teamoubusiness. 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,addouremovecom endereços de e-mail para usar uma lista, oueveryonepara a empresa toda. npx teamonly roles- Dá papéis às pessoas dentro do app, como aprovador ou financeiro.
roles add approver dana@acme.comdá um papel,roles removetira, erolessozinho 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.loge 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,isOwnerpara quem publicou o app pela primeira vez, eroles, 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 comctx.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 }.
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 appUm 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.
// 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.appem nome do app na sua empresa, como “Expenses at Acme”. As respostas vão para o responsável pelo app, a menos que você definareplyTo(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.
{
"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 })
}))crontem 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(...)deteamonly/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.
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)
// ...
})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.userpara identidade e nunca escrever as próprias telas de login, cadastro ou senha. - A usar
ctx.dbectx.filesem 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 verificarctx.user.rolesno servidor. - Como rodar o
deploye 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:
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.jsona 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.
Sem cartão no teste. Depois, a partir de $19 por mês, cancele quando quiser.
Ainda não? Receba novidades
Dúvidas vão para hello@teamonly.dev, e uma pessoa responde.