Doku

TeamOnly Doku

Die CLI, das SDK für Ihre App und die Skill-Datei, die Ihrer KI beibringt, was sie schreiben soll. Technisch und kurz. Coding-Agenten können diese Seite als Markdown unter /docs.md lesen.

Schnellstart

Sie brauchen Node.js 20 oder neuer. Noch kein Tarif? Beim ersten Anmelden können Sie eine 14-tägige kostenlose Testphase ohne Karte starten oder ein Abo abschließen. Sie können auch hier abonnieren. In einem neuen Ordner oder in einem bestehenden Projekt:

  1. npx teamonly init fügt eine Start-App und die Anweisungen hinzu, denen Ihr KI-Tool folgt.
  2. npx teamonly login einmal pro Computer. Sie geben Ihre geschäftliche E-Mail und den 6-stelligen Code ein, den wir Ihnen mailen. Hat Ihre Firma noch keinen Tarif, bietet es die 14-tägige kostenlose Testphase an, die sofort beginnt, oder einen Tarif mit Zahlungsseite. Drücken Sie statt einer E-Mail Enter, um sich im Browser anzumelden.
  3. npx teamonly deploy stellt die App online unter https://<app>.<company>.teamonly.app.

Das sieht so aus:

Terminal~/expenses
npx teamonly initAdded the TeamOnly skill, Cursor rules and SDKBau ein Tool zur Spesenfreigabe(Ihre KI baut die App)npx teamonly loginSigned in as dana@acme.comnpx teamonly deployLive at https://expenses.acme.teamonly.appOnly @acme.com accounts can sign in

Die erste Veröffentlichung legt die App, ihre Datenbank und ihren Dateispeicher an. Spätere Veröffentlichungen aktualisieren dieselbe App unter derselben Adresse.

CLI-Befehle

npx teamonly login
Von diesem Computer aus bei TeamOnly anmelden, einmal pro Computer. Geben Sie Ihre geschäftliche E-Mail und den 6-stelligen Code aus unserer Mail ein, oder drücken Sie Enter für die Anmeldung im Browser. --email und --code machen dasselbe ohne Rückfragen, für KI-Tools und Skripte.
npx teamonly trial --company "Acme"
Die 14-tägige kostenlose Testphase für Ihre Firma starten, ohne Karte. Nach login verwenden, wenn Ihre Firma noch keinen Tarif hat. Eine Testphase pro Firmen-E-Mail-Domain.
npx teamonly subscribe --plan builder
Ein Abo abschließen oder Apps nach der Testphase wieder einschalten. Wählen Sie builder, team oder business. Es öffnet eine Zahlungsseite und meldet Sie hier an, sobald Sie bezahlt haben.
npx teamonly init
Diesen Ordner einrichten: eine Start-App, oder in einem bestehenden Projekt die TeamOnly-Anweisungen für Ihr KI-Tool (Claude Code Skill, Cursor-Regeln, AGENTS.md) und das SDK.
npx teamonly deploy
Die App bauen und online stellen. Legt bei der ersten Veröffentlichung Datenbank und Dateispeicher an. Gibt die Adresse der App aus.
npx teamonly access
Zeigt, wer die App öffnen darf. Mit only, add oder remove und E-Mail-Adressen nutzen Sie eine Liste, mit everyone die ganze Firma.
npx teamonly roles
Vergibt Rollen in der App, etwa Freigebende oder Buchhaltung. roles add approver dana@acme.com vergibt eine, roles remove entzieht sie, und roles allein zeigt, wer welche hat. Nur Firmenadressen.
npx teamonly secrets set NAME
Ein Secret für diese App speichern. Der Wert wird abgefragt, damit er nie in Ihrem Shell-Verlauf landet.
npx teamonly logs
Anfragen, Ausgabe von console.log und Fehler der Live-App verfolgen, während sie passieren. Mit Strg+C beenden.
npx teamonly whoami
Zeigt, als wer Sie angemeldet sind, Ihren Tarif und Ihre Apps.
npx teamonly delete
Die Live-App samt Datenbank und Dateien löschen. Vorher müssen Sie den Namen der App eintippen.
npx teamonly logout
Auf diesem Computer von TeamOnly abmelden.

SDK

Ihre API ist eine Hono-App. Die Middleware des SDK gibt jeder Anfrage einen Kontext unter c.var.ctx:

ctx.user
Die angemeldete Person: email, name, isOwner für die Person, die die App zuerst veröffentlicht hat, und roles, ihre Rollen in dieser App. Von TeamOnly verifiziert, bevor Ihr Code läuft. Lesen Sie die Identität nie selbst aus Headern.
ctx.db
Die eigene SQL-Datenbank dieser App (SQLite, auf Cloudflare D1). Bei der ersten Veröffentlichung angelegt.
ctx.files
Der Dateispeicher dieser App: put, get, list, delete.
ctx.secrets
Werte, die mit npx teamonly secrets set gesetzt wurden. Auslesen mit ctx.secrets.get(name).
ctx.email
Sendet E-Mails an Kollegen: send({ to, subject, text, html?, replyTo? }). Siehe E-Mail.
ctx.schedule
Der Name des Jobs, wenn TeamOnly einen geplanten Job ausführt, sonst undefined. Siehe Geplante Jobs.

Im Browser gibt useUser() aus teamonly/react { email, name, roles } zurück.

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

Eine App kann Personen in Ihrer Firma mit ctx.email.send() eine E-Mail schicken, etwa um Freigebenden zu sagen, dass eine Ausgabe wartet.

api/index.tsBeispiel
// 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',
})
  • Nur an Adressen auf den eigenen E-Mail-Domains Ihrer Firma, also an dieselben Personen, die sich anmelden können. Jede andere Adresse wird abgelehnt, und nichts wird gesendet.
  • Gesendet von notify@teamonly.app im Namen der App in Ihrer Firma, etwa „Expenses at Acme“. Antworten gehen an die Person, der die App gehört, außer Sie setzen replyTo (ebenfalls eine Firmenadresse).
  • Jede E-Mail enthält eine Zeile, welche App sie gesendet hat.
  • Grenzen pro App: 100 Empfänger pro Stunde und 500 pro Tag, bis zu 50 Empfänger pro E-Mail.
  • Die Seite der App im Dashboard zeigt, wie viele E-Mails sie in den letzten 30 Tagen gesendet hat.
  • Lokal, mit npm run dev, werden E-Mails im Terminal ausgegeben, nicht gesendet.
  • E-Mails an Personen außerhalb Ihrer Firma werden nicht unterstützt.

Geplante Jobs

Für tägliche Übersichten, Erinnerungen und Monatsberichte tragen Sie die Jobs in teamonly.json ein. TeamOnly ruft jede Route zu diesen Zeiten auf.

teamonly.jsonBeispiel
{
  "name": "expenses",
  "timezone": "America/New_York",
  "schedules": [
    { "name": "daily-digest", "cron": "0 9 * * 1-5", "path": "/api/cron/daily-digest" }
  ]
}
api/index.tsBeispiel
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 hat fünf Felder: Minute, Stunde, Tag im Monat, Monat, Wochentag. Jobs laufen im 5-Minuten-Takt, die Minuten müssen also Vielfache von 5 sein.
  • timezone ist optional, Standard ist UTC.
  • Umschließen Sie die Route mit scheduled(...) aus teamonly/server. Wer die URL öffnet, bekommt einen 404.
  • Die Seite der App im Dashboard zeigt den letzten Lauf jedes Jobs und ob er geklappt hat.
  • Jobs werden pausiert, wenn eine kostenlose Testphase abgelaufen ist.

Rollen

Rollen wie Freigebende, Buchhaltung oder Admin liegen in TeamOnly, nicht in Ihrem Code. Die Person, der die App gehört, oder ein Admin vergibt sie auf der Seite der App im Dashboard oder mit npx teamonly roles. Nur Firmenadressen.

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

Die App liest sie als ctx.user.roles und entscheidet, was jede Rolle darf. Login-Code müssen Sie weiterhin keinen schreiben.

Die Skill-Datei

init fügt eine Skill-Datei für Claude Code hinzu und denselben Inhalt als Regeldatei für Cursor. Ihr KI-Tool liest sie, bevor es Code schreibt. Sie bringt ihm bei:

  • den einen unterstützten App-Aufbau (siehe unten) und dabei zu bleiben.
  • ctx.user für die Identität zu nutzen und nie eigene Login-, Registrierungs- oder Passwortseiten zu schreiben.
  • ctx.db und ctx.files zu nutzen, statt einen Datenbankdienst, Express, Supabase oder Firebase hinzuzufügen.
  • API-Schlüssel in ctx.secrets abzulegen, nie im Code.
  • E-Mails mit ctx.email zu senden, zeitgesteuerte Arbeit als geplante Jobs laufen zu lassen und ctx.user.roles auf dem Server zu prüfen.
  • wie man deploy ausführt und behebt, was es meldet.

Es geht darum, dass die erste Veröffentlichung funktioniert. Wenn Ihre KI immer wieder zu etwas greift, das wir nicht betreiben, sagen Sie uns Bescheid. Das ist dann ein Fehler in der Skill-Datei.

MCP-Server

Das Paket teamonly startet auch einen MCP-Server, für KI-Tools, die lieber Tools als Terminal-Befehle nutzen, etwa Claude Desktop oder den Agenten von Cursor ohne Terminal. Er läuft auf Ihrem Computer, weil das Veröffentlichen die Dateien Ihres Projekts liest. So fügen Sie ihn Claude Code hinzu:

Terminal~/expenses
claude mcp add teamonly -- npx -y teamonly mcp
  • Cursor, Claude Desktop und Windsurf: Fügen Sie { "mcpServers": { "teamonly": { "command": "npx", "args": ["-y", "teamonly", "mcp"] } } } in deren MCP-Konfiguration ein.
  • VS Code: In .vscode/mcp.json heißt der Schlüssel servers, mit "type": "stdio".
  • Seine 12 Tools: get_app_rules, init, deploy, status, logs, access, roles, set_secret, sign_in, start_trial, subscribe, delete_app.
  • Im offiziellen MCP Registry als dev.teamonly/teamonly gelistet.

Die Skill-Datei und die Regeln bleiben der wichtigste Weg, auf dem Ihre KI den Stack lernt, und die CLI funktioniert genau wie bisher. Die Einrichtung für jedes Tool, mit einem Ein-Klick-Button für Cursor: TeamOnly MCP-Server.

Unterstützter App-Aufbau

  • Frontend: React, gebaut mit Vite, als statische Dateien ausgeliefert.
  • API: eine Hono-App in TypeScript oder JavaScript, unter /api, unter derselben Adresse.
  • Laufzeit: Cloudflare Workers. Standard-Web-APIs, die meisten Node-Built-ins über Kompatibilität, aber keine nativen Module oder lang laufenden Prozesse.
  • Nicht unterstützt: Python, Ruby, PHP, Docker-Container, WebSockets und Live-Updates, Hintergrund-Worker, E-Mails an Personen außerhalb Ihrer Firma, Verbindungen zu Servern im privaten Firmennetz, eigene Domains, öffentliche Apps.

Grenzen

Die heutigen Grenzen:

  • Builder: 1 Ersteller, 3 Apps. Team: unbegrenzt viele Ersteller und Apps.
  • Datenbank und Dateispeicher jeder App richten sich nach den Grenzen von Cloudflare D1 und R2.
  • Anfragen laufen innerhalb der Grenzen von Cloudflare Workers für CPU-Zeit und Arbeitsspeicher.

Mehr dazu, wie alles zusammenpasst: So funktioniert’s und Sicherheit.

Early Access

Ihr erstes Tool, noch diese Woche online.

TeamOnly ist im Early Access, und alle Tarife sind jetzt buchbar. Testen Sie 14 Tage kostenlos ohne Karte, oder schließen Sie ein Abo ab. So oder so ist Ihre Firma sofort bereit, und drei Befehle bringen Ihre erste App online.

14 Tage kostenlos testenOder gleich abonnieren

Keine Karte für die Testphase. Danach ab $19 im Monat, jederzeit kündbar.

Noch nicht so weit? Neuigkeiten erhalten

Bitte die geschäftliche E-Mail verwenden. Wir schreiben selten, und nur wenn es wirklich etwas Neues gibt.

Fragen an hello@teamonly.dev. Ein Mensch antwortet.