Synopsis
Description
Opens an interactive TUI for the current organization. It lists every member with their role, the date they were added, and a count of their project memberships, and it lets you expand a member to see their per-project roles and, under each project, the branches they can reach.
Run it inside a Capy project: Capy reads the organization from keep.lock in the working directory and exits if there isn’t one. capy users is disabled in local-only mode, which has no organization, team, or server.
If stdin isn’t a TTY, Capy skips the TUI and prints a static rendering of the same table instead. See Non-interactive use.
Example
The cursor row is highlighted and carries a ▸ marker, which turns into ▾ once the row is expanded. Projects is a plain count.
Expanding a row
Pressing Enter on a member row expands it into that member’s project rows. Pressing Enter on a project row expands that project into its branches:
(protected) marks a protected branch, and the right-hand column reads access granted or no access for that member on that branch. The cursor only lands on branch rows under a project the member holds as member - a project-admin already reaches every branch in their project.
Owners and admins have org-wide access, so their rows expand to a single Access to all branches line instead of a project list. A member with no project memberships expands to No project access.
Changing a role
Pressing r on a member row or a project row turns the Role cell into an in-place picker. ↑/↓ cycle through the choices one at a time, Enter applies, Esc cancels:
On a member row the choices are admin, project-admin, and member, capped by your own role: owners and admins can assign all three, project-admins can assign project-admin and member. You can’t change your own role, and the owner’s role can’t be changed from this table - Capy prints the reason under the table instead of opening the picker.
Picking admin applies straight away. project-admin and member are project-scoped, so Capy opens a multi-select project picker with the projects the member already holds at that role pre-checked. Space toggles a project, Enter commits every add and removal, Esc cancels:
On a project row the choices are project-admin, member, and none. Picking none drops that project membership only; the member stays in the org. To remove someone from the organization, use capy kick.
Granting a protected branch
Move the cursor onto a branch row that reads no access and press g. It flips to access granted, and pressing g again revokes it. These are the same operations as the non-interactive capy grant-branch / capy revoke-branch commands. On a branch that isn’t marked (protected), g does nothing.
Keys
Non-interactive use
Capy chooses the TUI or the static table by looking at stdin, not stdout, so capy users | tee members.txt still opens the TUI. Redirect stdin to get the static rendering:
The static table is the same header and member rows with no cursor, nothing expanded, and no footer hints. It isn’t plain text: role cells keep their colour codes and every line ends with a clear-to-end-of-line escape, so strip ANSI before you diff it. Capy still authenticates first and falls back to the interactive browser sign-in when your cached session can’t be refreshed, so a CI job needs a session that is still valid.Last modified on August 11, 2026