capy redeem command to your clipboard.
Every prompt has a flag, so you can run the same thing unattended: --role <member|project-admin|admin>, --project <id|name> (repeatable), --ttl <duration> or --expires <iso>, plus --json and --non-tty for agents and CI.
Your teammate runs:
capy from then on syncs the secrets for the projects you granted.
Why out-of-band delivery matters
The redeem code carries an invite tokenT alongside the service-wrapped copy of the master key. T is one of the two halves that decrypt that copy; the other half is the Capy service stripping its own wrap. Anyone who holds T and can also get the service to strip its wrap - which takes an authenticated, active member of the org - recovers the master key.
The service only ever sees one half (its outer-wrapped blob). It never sees T. So T has to reach the invitee through a channel the service doesn’t touch:
- Good: Signal, a password manager share, a QR code scanned in person, a phone call to dictate.
- Bad: email, Slack DM that logs to your org admin, Git commit, a public chat log, screen share on Zoom with recording on.
capy invite alice@example.com --ttl 30m shortens that, and --expires <iso> sets an absolute cut-off. If someone else has already redeemed a leaked code, run capy kick <email> on the account that used it, which deletes the membership so the service stops co-decrypting for them, then rotate the values they could read through your normal secret rotation process.
Adjusting access after they join
capy users opens the interactive members list, but it only manages people who are already in the org - there is no way to type a new email into it. Press r on a member row to change their org role, Enter to expand a member (and then a project) to edit their per-project role - project-admin, member, or none - and g on a protected-branch row to grant or revoke that branch. Adding someone new always starts with capy invite.
What gets exchanged
The invite flow double-wraps the master key:- Your CLI wraps
Mwith a key derived fromT, the org ID, and the invitee’s email. - The service adds an outer wrap over that result.
- The invitee authenticates, gets the service to strip the outer wrap, and strips the inner wrap locally using
T+ their authenticated email.
What’s next
Roles
Member, Project Admin, Admin, Owner.
Kicking users
Remove a teammate. O(1), no re-encryption.