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:
npx teamonly initfügt eine Start-App und die Anweisungen hinzu, denen Ihr KI-Tool folgt.npx teamonly logineinmal 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.npx teamonly deploystellt die App online unterhttps://<app>.<company>.teamonly.app.
Das sieht so aus:
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 inDie 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.
--emailund--codemachen 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
loginverwenden, 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,teamoderbusiness. 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,addoderremoveund E-Mail-Adressen nutzen Sie eine Liste, miteveryonedie ganze Firma. npx teamonly roles- Vergibt Rollen in der App, etwa Freigebende oder Buchhaltung.
roles add approver dana@acme.comvergibt eine,roles removeentzieht sie, undrolesallein 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.logund 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,isOwnerfür die Person, die die App zuerst veröffentlicht hat, undroles, 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 setgesetzt wurden. Auslesen mitctx.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.
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 appEine App kann Personen in Ihrer Firma mit ctx.email.send() eine E-Mail schicken, etwa um Freigebenden zu sagen, dass eine Ausgabe wartet.
// 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.appim Namen der App in Ihrer Firma, etwa „Expenses at Acme“. Antworten gehen an die Person, der die App gehört, außer Sie setzenreplyTo(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.
{
"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 })
}))cronhat 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.timezoneist optional, Standard ist UTC.- Umschließen Sie die Route mit
scheduled(...)austeamonly/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.
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)
// ...
})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.userfür die Identität zu nutzen und nie eigene Login-, Registrierungs- oder Passwortseiten zu schreiben.ctx.dbundctx.fileszu nutzen, statt einen Datenbankdienst, Express, Supabase oder Firebase hinzuzufügen.- API-Schlüssel in
ctx.secretsabzulegen, nie im Code. - E-Mails mit
ctx.emailzu senden, zeitgesteuerte Arbeit als geplante Jobs laufen zu lassen undctx.user.rolesauf dem Server zu prüfen. - wie man
deployausfü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:
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.jsonheißt der Schlüsselservers, 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/teamonlygelistet.
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.
Keine Karte für die Testphase. Danach ab $19 im Monat, jederzeit kündbar.
Noch nicht so weit? Neuigkeiten erhalten
Fragen an hello@teamonly.dev. Ein Mensch antwortet.