Skip to content

Teams

Invite people, pick a role, switch env — without writing IAM JSON.

What you get

PieceBehavior
OrgOwns one project name; solo users get a personal org automatically
EnvFirst-class dev / staging / produtopia:env on create/list/destroy
Rolesadmin · developer · read-only — enforced on the API, not just the UI
AuditAppend-only: who invited, created, destroyed, changed roles
BudgetsSoft monthly USD cap per project/env; uses Cost Explorer or says COST_UNAVAILABLE
PricingCLI free forever · dashboard free solo · teams per-seat (stub entitlements)

Roles (plain language)

RoleCanCan’t
read-onlyInventory, logs, costs, redacted secrets, auditCreate/destroy/reveal/force/invite
developerCreate/destroy in project+env, reveal secrets, dry-runForce cross-project, manage members
adminDeveloper + force + invites + budgets + role changesBypass confirms or mint long-lived keys

Destroy/create still need the same consequence-named confirm as the CLI. Teams never weaken that.

Store choice

Team data (orgs, members, invites, audit, budgets) persists in Bun SQLite (.awsutopia/data/teams.sqlite by default). Same shape can move to Cloudflare D1 later — documented so we’re not inventing a third model.

bash
bun run dashboard:api          # opens SQLite + AssumeRole API
bun run dashboard:dev          # Teams / Audit / Pricing pages

Invites

Admins invite by email → pending → accept with the invite id. Email delivery is mocked in CI/dev (you still get a real invite row).

Pricing copy

  • CLI — free forever
  • Dashboard solo — free
  • Teams — per seat (entitlement stub until billing lands)

Working name — your AWS account, your bill.