An AI-powered workspace for FRC (FIRST Robotics Competition) teams. Slack-style channels, task tracking, decision logs, and judge interview prep — all wired into Claude agents that actually do work, not just chat.
Built for the Built with Claude Opus 4.7 Hackathon.
Live demo → pitos.8092.tr
Read in: English · Türkçe · 한국어 · Other language? →
npx pitos-appThat's it. The wizard scaffolds the project, installs dependencies, provisions your database, optionally sets up a custom domain on Cloudflare, and deploys to Vercel. You get a working sign-in link at the end — about 2 minutes start to finish.
Requirements:
- Node.js 20+
- A Claude API key (
sk-ant-...) - (Optional) A Vercel account for production deploys
- (Optional) A Resend account for free transactional email (3,000/mo)
- (Optional) A Cloudflare account for a custom domain
Running npx pitos-app from any empty directory launches an interactive wizard. Each step is optional except the ones marked required.
If you're not already inside a PitOS checkout, the wizard copies the package into a new directory and runs npm install. Pick the directory name when prompted.
Paste your sk-ant-... key. The wizard validates it against the Anthropic API before continuing — no typos slip through.
Pick from ten built-in languages (English, Türkçe, Español, Français, Deutsch, Português, 中文, 日本語, עברית, or any other). "Other" triggers an on-demand Claude translation of the full setup bundle into your language.
- Team number — e.g.
8092(leave blank for demo / off-season) - Team name — e.g. Nordic Storm
- Your name and email — you'll be the workspace admin
Skip this in development — magic-link sign-in URLs print to the console.
Choose one of three options:
Resend (recommended — free 3,000 emails/month)
- Create a free account at resend.com and add your domain
- Paste your
re_*API key and the verified from-address - Free tier covers any FRC team indefinitely
Cloudflare Email Sending (optional — requires Workers Paid $5/mo)
- Cloudflare Account ID — from the Cloudflare dashboard sidebar
- Cloudflare Email API token — a
cfut_*scoped user token withEmail Sendingpermission - From email address — e.g.
noreply@yourteam.com - Note: requires the Workers Paid plan ($5/mo); not available on the free tier
Skip — magic-link URLs print to the server console (dev-only, copy-paste to sign in)
Hook up a domain like pitos.yourteam.com to your Vercel deployment.
You'll be asked for a Cloudflare API Token. Create one at dash.cloudflare.com/profile/api-tokens with these scopes:
| Permission | Why |
|---|---|
Zone:Zone:Read |
Look up the zone ID for your domain |
Zone:DNS:Edit |
Create the CNAME + SPF TXT records |
Zone:Email Routing Rules:Read |
(optional) Pull Cloudflare's DKIM key for email deliverability |
The token is used only during setup — it's never written to .env.local or pushed to Vercel. If you prefer not to use a scoped token, configure DNS manually and skip this step.
The wizard:
- Verifies the token against
/user/tokens/verify - Creates
CNAME → cname.vercel-dns.comon your domain - Adds the SPF TXT record
- Publishes the DKIM TXT record (if Email Routing provides one)
- Adds the domain to your Vercel project and updates
APP_URLto match
If the token is rejected, domain setup is skipped but the rest of the deploy continues.
After a successful Vercel deploy, the wizard asks if you want to set up Turso for persistent SQLite. Without it, data lives in /tmp/pitos.db and wipes on every cold start.
Turso free tier: 9 GB storage, 500 M row reads/month — more than enough for any FRC team.
- Create a free database at turso.tech/app/databases/new
- Copy the
libsql://your-db.turso.ioURL and auth token into the wizard
The wizard pushes both to Vercel and triggers a redeploy so migrations run against the new DB.
The final step offers a production deploy. If accepted, the wizard:
- Runs
vercel link(interactive — pick a team and project name) - Pushes
ANTHROPIC_API_KEY,AUTH_SECRET, and your email provider vars as environment variables - Runs
vercel --prod --yes - Updates
APP_URLto the deployed URL (or your custom domain if you set one) - Redeploys so
APP_URLtakes effect
You finish team setup through /onboarding on the deployed URL.
Channels — Slack-style threaded messaging. Every message can trigger a Claude agent that answers questions, creates tasks, or asks "jury reflex" questions (proof demands, why questions, teach-mode redirects) to build student reasoning.
Tasks — Action items surfaced from channel discussion. Teach-mode tasks prompt students to explain their approach before marking done.
Decisions — A log of design and strategy decisions with rationale, alternatives considered, and who was in the room. Searchable for end-of-season recap.
Ask — Semantic search over everything the team has ever said or decided. Ask "how did we solve the swerve drift issue last year?" and get a sourced answer with links back to the original messages.
Judge simulator — Realistic mock judge interview. Claude plays the judge, adapts difficulty based on answers, and generates a debrief with strong answers + gaps to work on.
Exit interview — End-of-season 1:1 with Claude. Captures what students learned, what frustrated them, and what they want next year — the raw input for the season recap.
Season recap — Generates a full retrospective document from channel history, decisions, and exit interviews. Ready for awards submissions and sponsor reports.
Settings — Team config, member management, language switch, API key rotation.
FRC teams run on tight budgets. PitOS is designed to fit on a student's allowance — you can run a real production instance with persistent data and real emails for $0/month (plus Claude API tokens).
| Service | Free tier | Paid from | Notes |
|---|---|---|---|
| Anthropic Claude API | $5 trial credits on signup | Pay-per-use | The main variable cost — see below |
| Vercel (Hobby) | 1M function invocations, 4 CPU-hrs Active CPU, 100 GB data transfer, 1M edge requests, 60s max function duration | $20 / user / month (Pro) + $20 usage credit | Hobby tier is "personal, non-commercial use" |
| Netlify (Free) | 100 GB bandwidth, 300 build min, 125k function invocations | $19 / user / month (Pro) | Hard caps — site suspends, no surprise bills |
| Resend | 3,000 emails/month, 1 custom domain, 100/day | $20 / month (Pro, 50k emails) | Default email provider — ideal for magic-link logins |
| Cloudflare DNS + Email Routing | Unlimited zones, unlimited DNS records, inbound email routing | Free | Covers the domain + DNS automation the CLI does |
| Cloudflare Workers Paid (optional for Email Sending) | — | $5 / month minimum | Alternative email provider; requires Workers Paid to send any outbound mail |
| Turso (LibSQL) | 9 GB storage, 500 M row reads, 500 DBs | $4.99 / month (Developer) | Persistent SQLite in production — wired into the CLI setup |
| Custom domain | — | ~$10–15 / year | Optional — a *.vercel.app or *.netlify.app URL works fine |
| Model | Input | Output | Cache read (10%) | Batch (50% off) |
|---|---|---|---|---|
| Haiku 4.5 | $1 | $5 | $0.10 | $0.50 / $2.50 |
| Sonnet 4.6 | $3 | $15 | $0.30 | $1.50 / $7.50 |
| Opus 4.7 | $5 | $25 | $0.50 | $2.50 / $12.50 |
PitOS defaults to Opus 4.7 in lib/agents/*.ts for quality. To cut costs 5x, swap the model ID to claude-haiku-4-5 for high-frequency, low-stakes agents (channel replies, task extraction) and keep Opus for judge-sim and season-recap where reasoning quality matters most. Prompt caching is already supported by the SDK — cache reads cost 10% of input price.
Rough monthly estimate for a team of 20 students chatting actively:
- All Opus 4.7: $15–40 / month
- Mixed (Haiku for channels, Opus for heavy agents): $3–8 / month
- All Haiku 4.5: $1–3 / month
Totally free production (recommended starting point):
- Vercel Hobby or Netlify Free
- Resend free tier (3,000 emails/month) for real magic-link emails
- Turso free tier (9 GB) for persistent SQLite — data survives cold starts
- Claude Haiku 4.5 for all agents
- Cost: $0/month + Anthropic usage (~$1–3/mo for a team of 20)
Totally free (dev / hackathon):
- Skip email — magic-link URLs print to server logs (copy-paste to sign in)
- Ephemeral
/tmp/pitos.dbSQLite (data resets on cold start) - Cost: $0/month + Anthropic usage
Real team with sponsors (~$25/month + API):
- Vercel Pro ($20/mo) — legal clarity on commercial use with sponsor logos
- Resend free tier (or Cloudflare Workers Paid $5/mo if you prefer)
- Turso free or Developer ($5/mo if you need more DBs)
- Custom domain ($1/mo amortized)
- Cost: $20–25/month + ~$10–40/month Claude usage
- Vercel Hobby is "non-commercial" — FRC teams are nonprofit/educational, but if you have named sponsors or sell merchandise through the site, talk to your mentor or switch to Netlify Free (no such clause) or upgrade to Pro.
- Vercel Hobby function duration caps at 60s (default 10s, configurable up to 60s). Long Opus 4.7 agent runs — judge-sim mock interviews, season-recap generation — can exceed this. Symptoms are 504 timeouts on complex agent requests. Pro unlocks 300s. Workarounds: use Haiku 4.5 for faster responses, stream via SSE (already supported), or split long agent work into background jobs.
- Cloudflare Email Sending is not free. It needs the Workers Paid plan ($5/mo) to send any outbound email. The setup wizard defaults to Resend (3,000 emails/mo free). Cloudflare Email is still supported as an option for teams already on Workers Paid.
- Cloudflare Workers Free is not enough for Email Sending. The free tier gives you 100k requests/day and 10ms CPU per invocation, but Email Sending specifically requires Workers Paid. The free tier is fine for everything else (DNS, caching, SSL).
- Ephemeral SQLite resets on cold start. Without Turso, the DB lives at
/tmp/pitos.dbwhich Vercel/Netlify wipe between invocations. The setup wizard will offer to configure Turso (free 9 GB) right after deploy. - Claude API trial credits expire. Anthropic gives $5 free credits on signup. After that, you need a payment method. Budget ~$5–10 for a month of testing before going live.
- Framework — Next.js 16 App Router with Turbopack (the default bundler)
- UI — React 19, Tailwind v4, shadcn/ui
- Database — LibSQL via
@libsql/client+ Drizzle ORM; localfile:./pitos.dbin dev, Turso in production (TURSO_DATABASE_URL) - Auth — Lucia v3 with magic-link tokens (no passwords)
- Email — Provider chain: Resend (
RESEND_API_KEY) → Cloudflare Email Sending (CLOUDFLARE_EMAIL_API_TOKEN) → console log - Real-time — SSE with a lightweight subscriber registry in
lib/sse.ts - AI —
@anthropic-ai/sdkwithclaude-opus-4-7for all agents
Auth and route protection live in proxy.ts at the root (renamed from middleware.ts in Next.js 16). Agents are one-file-per-agent under lib/agents/.
For forks and contributors who want to skip the wizard:
git clone https://github.com/bcanata/pitos.git
cd pitos
npm install
cp .env.example .env.local # fill in ANTHROPIC_API_KEY + AUTH_SECRET
npm run db:push # creates pitos.db
npx tsx scripts/seed-demo.ts # optional: seed Team 8092 demo data
npm run devVisit http://localhost:3000.
| Variable | Required | Purpose |
|---|---|---|
ANTHROPIC_API_KEY |
yes | Claude API key |
AUTH_SECRET |
yes | 64-char hex string — sign session cookies |
APP_URL |
yes | Base URL of the deployment (http://localhost:3000 in dev) |
DATABASE_URL |
no | Local SQLite path (defaults to ./pitos.db; ignored if TURSO_DATABASE_URL is set) |
RESEND_API_KEY |
no | Resend API key — enables magic-link emails (free 3k/mo) |
RESEND_FROM_EMAIL |
no | Sender address for Resend (e.g. noreply@yourteam.com) |
CLOUDFLARE_ACCOUNT_ID |
no | Alternative email provider (requires Workers Paid $5/mo) |
CLOUDFLARE_EMAIL_API_TOKEN |
no | Scoped cfut_* token with Email Sending permission |
FROM_EMAIL |
no | Sender address for Cloudflare Email |
TURSO_DATABASE_URL |
no | libsql://your-db.turso.io — enables persistent SQLite |
TURSO_AUTH_TOKEN |
no | Turso auth token |
Email priority: RESEND_API_KEY → CLOUDFLARE_EMAIL_API_TOKEN → console log (dev fallback).
npm run dev # dev server (Turbopack, localhost:3000)
npm run build # production build
npm run lint # ESLint
npm run db:push # apply schema to SQLite
npm run db:studio # Drizzle Studio GUI
npm run setup # re-run the CLI wizard (same as npx pitos-app)
npm run mcp # start the MCP server (for Claude Desktop / Code)npx pitos-app --forceOverwrites .env.local and re-prompts for everything. Use this if you mistype a key or want to reconfigure the domain.
PitOS is designed for a Vercel + Cloudflare stack:
user
│
▼
your-domain.com ← Cloudflare DNS (CNAME → cname.vercel-dns.com)
│
▼
Vercel (Next.js)
│
├──► LibSQL / Turso (persistent SQLite — free 9 GB)
├──► Anthropic API (claude-opus-4-7)
└──► Resend / Cloudflare Email (magic-link emails)
With Turso, db/index.ts connects to your remote LibSQL database — data persists across deployments. Without Turso, it falls back to /tmp/pitos.db (ephemeral) and auto-migrates on every cold start. The setup wizard provisions Turso right after deploy.
PitOS ships with a Model Context Protocol server so Claude Desktop or Claude Code can read from your team's workspace:
npx pitos-mcpExpose channels, tasks, decisions, and the ask-search as MCP tools. Add it to your Claude Desktop config under mcpServers.
MIT. See LICENSE.
Built with Claude Opus 4.7 · Next.js · Vercel · Cloudflare · shadcn/ui
