Admin Commands
Commands restricted to configured admin users.
User Management
Section titled “User Management”Approve a user as “Good To Go” - add to community groups.
!gtg @userExample:
!gtg @NewMemberWhat Happens:
- User is added to standard community groups
- User is marked as verified in the database
- Confirmation sent to admin
!pending
Section titled “!pending”Show pending join requests and safety number changes.
!pendingResponse: Lists users waiting for approval and any safety number changes.
!sn / !safetynumber
Section titled “!sn / !safetynumber”Trigger safety number verification for a user.
!sn @user!safetynumber @userUse Case: When Signal shows a safety number change warning.
!sngtg / !sngoodtogo
Section titled “!sngtg / !sngoodtogo”Approve a user after safety number verification.
!sngtg @user!sngoodtogo @user!remove
Section titled “!remove”Remove a user from all groups (usually after safety number issues).
!remove @userWarning: This removes the user from ALL groups where the bot has admin rights.
!clearroom
Section titled “!clearroom”Remove all non-admin members from the current group.
!clearroom confirmWarning: Destructive action. Requires confirm parameter.
!groupdestroy / !destroygroup
Section titled “!groupdestroy / !destroygroup”Permanently destroy a Signal group: removes all members, bot leaves, marks group dead in DB.
Dry-run by default — shows a preview without confirm.
!groupdestroy Preview destroying current group!groupdestroy <name or #> Preview destroying by name/number!groupdestroy confirm Execute on current group!groupdestroy <name or #> confirm Execute on target group!groupdestroy --force confirm Override 20-member soft limitSafety limits:
- Soft limit: 20 members (override with
--force) - Hard limit: 50 members (cannot be overridden)
What it does:
- Removes all non-bot members from the group
- Bot leaves the group
- Marks group inactive in database (member_count → 0)
- Deactivates all membership records
- Unlists from approved groups if present
Warning: This is irreversible. Always review the dry-run preview first.
!unlistgroup / !removegroup
Section titled “!unlistgroup / !removegroup”Remove a group from the community directory (!groups listing). Does not destroy the group or remove members — just hides it from the listing.
!unlistgroup Unlist current group!unlistgroup <name or #> Unlist by name/number!accountaudit / !audit
Section titled “!accountaudit / !audit”Scan for and remove deleted/abandoned Signal accounts from community groups.
!audit scan Scan all members for unregistered accounts!audit scan --limit 500 Scan with member limit!audit scan-group Scan current group only!audit trust Scan using trust method (less reliable)!audit report Show latest scan results!audit remove Preview removal (dry run)!audit remove confirm Execute removal (notifies groups)!audit remove confirm --quiet Execute silently (no group notifications)Workflow: scan → report → remove → remove confirm
Detection: Uses sendReceipt to detect UNREGISTERED_FAILURE responses from Signal’s servers. More reliable than trust-based detection.
Notifications: By default, each affected group is notified about the cleanup. Use --quiet to suppress. All removals are logged to the admin activity feed on irregulars.io.
See Account Audit for full documentation.
!safetycheck / !sc
Section titled “!safetycheck / !sc”Run a safety check on the group - identify any flagged users.
!safetycheck!scSSO Account Management
Section titled “SSO Account Management”!createuser
Section titled “!createuser”Create an SSO account for a user (Authentik integration).
!createuser @user email@example.com!createuser email@example.com "Display Name"Examples:
!createuser @JohnDoe john@example.com!createuser alice@example.com "Alice Smith"Requirements: Authentik API credentials configured.
!accountinvite / !invite
Section titled “!accountinvite / !invite”Generate an SSO account creation invite link.
!accountinvite!accountinvite <hours>!accountinvite <hours> -c <count>Examples:
!accountinvite # 24-hour, single-use invite!accountinvite 48 # 48-hour invite!accountinvite 72 -c 5 # 72-hour invite, 5 usesResponse: Returns a one-time invite URL.
Announcements
Section titled “Announcements”!announce
Section titled “!announce”Send an announcement to groups.
!announce [groups] [-t time] [-dm] message!announce -h | --help | helpExamples:
!announce 1,2,3 Important update for these groups only!announce tech,cyber Security alert for tech groups!announce confirm All groups meeting at 5pm today # ALL groups requires "confirm"!announce -t 24h 5,7 Reminder tomorrow at this time!announce -dm 5 Check your email (DM each member)Options:
[groups]- Group numbers (1,2,3) or keywords (tech,cyber)-t <time>- Schedule for later (e.g., “24h”, “2024-01-15T14:00”)-dm- Send as DM to each member-h, --help- Show help
Safety:
- Announcing to ALL groups requires the word “confirm” in the message
- Shows a preview of affected groups before sending
!announcements
Section titled “!announcements”List pending/scheduled announcements.
!announcements!cancelannounce
Section titled “!cancelannounce”Cancel a scheduled announcement.
!cancelannounce <id>Example:
!cancelannounce 42Career Board
Section titled “Career Board”!backfill-profiles
Section titled “!backfill-profiles”Batch-create draft career profiles for existing verified members who don’t have one yet. Uses AI to extract structured career data (name, military status, clearance, skills, etc.) from stored introduction text.
!backfill-profiles!backfill-profiles --dry-runOptions:
--dry-run— Preview what would be created without actually creating profiles
What Happens:
- Queries all verified members with stored intro text
- For each member without a career profile:
- AI extracts career data from their intro (Local AI → OpenAI → regex fallback)
- Creates a draft profile on jobs.irregulars.io
- Reports results: created, skipped (existing), skipped (no intro), failed
Example Output:
📋 Career Profile Backfill (DRY RUN)
Found 47 verified member(s) with intro text.
Would create: John Smith (local_ai) Would create: Jane Doe (openai) Would create: Bob Wilson (regex)
Results: ✅ Would create: 32 ⏭️ Skipped (existing profile): 10 ⏭️ Skipped (no/short intro): 5Notes:
- Always run
--dry-runfirst to preview - Rate-limited (200ms between API calls) to avoid overloading AI providers
- Profiles are created as drafts — members can edit or delete via jobs.irregulars.io/my/profile/edit
- See Member Onboarding for how profiles are auto-created during the normal onboarding flow
Request Management
Section titled “Request Management”!req / !request
Section titled “!req / !request”View or manage join requests.
!req!requestResponse: Shows pending community join requests.
Environment Variables (Admin Features)
Section titled “Environment Variables (Admin Features)”| Variable | Description |
|---|---|
ADMIN_PHONE_NUMBERS | Comma-separated admin phone numbers |
ADMIN_UUIDS | Comma-separated admin UUIDs |
AUTHENTIK_BASE_URL | Authentik SSO base URL |
AUTHENTIK_API_TOKEN | Authentik API token |
AUTHENTIK_INVITE_FLOW_ID | Invite flow UUID |
AUTHENTIK_INVITE_FLOW_SLUG | Invite flow slug |
Security Notes
Section titled “Security Notes”- Admin Verification: Commands check both phone number and UUID
- Audit Trail: All admin actions are logged
- Group Context: Most admin commands require group chat (not DM)
- Confirmation Required: Destructive actions require explicit confirmation