Theme
Last updated: 2026-10-20
Beta membership belongs to one app. Installation requires an Active membership and a build assigned to beta.
Each command reads package_id from the current directory's app.json. Use --package-id <id> to target an app from another directory.
evenhub testers
List the roster and each tester's status:
bash
evenhub testers
evenhub testers --search name@
evenhub testers --package-id com.example.myapp --json| Option | Description |
|---|---|
--search <keyword> | Filter by email |
--package-id <id> | Override the package ID read from app.json |
--json | Return one JSON object |
evenhub testers add
Invite one address, several addresses or a file:
bash
evenhub testers add a@example.com
evenhub testers add "a@example.com,b@example.com"
evenhub testers add --from ./testers.csv| Option | Description |
|---|---|
--from <file> | Read addresses from a text file or single-column CSV |
--reinvite | Send a new invitation to an already Invited address |
--package-id <id> | Override the package ID read from app.json |
Comma, semicolon and newline separators are accepted. Quote a list containing shell separators. Email spelling and case are preserved. Exact duplicate strings are removed; case variants are submitted separately and reported in the output.
Existing memberships
Matching uses the exact email string, including case.
| Existing status | Default behaviour | With --reinvite |
|---|---|---|
| Invited | Skip; keep the current invitation link | Send a new invitation; invalidate the earlier link |
| Active | Skip; keep accepted membership | Skip; keep accepted membership |
| Rejected or Expired | Submit a new invitation | Submit a new invitation |
Use --reinvite when an Invited tester needs a replacement email:
bash
evenhub testers add a@example.com --reinviteThe earlier link stops working. Expired invitations can be submitted again without this flag.
The file format
--from accepts one address per line or a single-column CSV with an optional email header:
text
email
a@example.com
b@example.comQuoted CSV cells and a leading byte-order mark are supported. The entire batch is validated before submission: a malformed address exits 9 and leaves the roster unchanged.
A successful result confirms that invitation requests were submitted. It does not confirm email delivery. In JSON, invited lists submitted addresses, skipped explains held-back entries, and reinvited identifies submitted addresses matched to existing non-Active rows under --reinvite.
evenhub testers rm
Remove memberships from this app:
bash
evenhub testers rm a@example.com
evenhub testers rm "a@example.com,b@example.com"The removed account no longer qualifies for new beta installs through that membership. Use --package-id <id> to target another app.
Invitation states
| Status | Meaning |
|---|---|
| Invited | Invitation awaiting a response |
| Active | Invitation accepted; eligible to install the beta build |
| Rejected | Invitation declined |
| Expired | No response within seven days |
Invitations expire after seven days. Membership alone does not select a build; promote --to beta sets the version testers can install.
Limits
The server can reject further invitations with exit 8. Inspect the returned code, message and hint to distinguish an invitation limit from rate limiting. Repeated invitations, including --reinvite, are subject to these limits.
When the build does not appear
Check the two installation conditions separately:
bash
evenhub ls com.example.myapp
evenhub testers --package-id com.example.myapp| Check | Expected result | If missing |
|---|---|---|
| Build | CHANNEL includes beta | Promote the intended version |
| Tester | Correct account email has status Active | Ask the tester to accept a valid invitation |
Handle command errors before interpreting the roster or build list. Re-adding an exact Active address leaves its accepted membership unchanged.