freeq channels can have access policies that control who can join and what roles they receive. Policies are credential-based: users prove something about their identity (e.g., GitHub membership, Bluesky follows) to gain access.
As a channel operator (+o), set the rules users must accept:
/msg ChanServ POLICY #mychannel SET Be respectful. Follow our Code of Conduct.
Or use the Channel Settings panel in the web UI (click the gear icon).
This creates a basic "accept rules" policy. Users see the rules and must accept to join.
Require users to prove something beyond accepting rules:
# Require GitHub repo access
/msg ChanServ POLICY #mychannel REQUIRE github_repo issuer=did:web:irc.freeq.at:verify url=/verify/github/start?repo=owner/repo label=GitHub_Repo
# Require GitHub org membership
/msg ChanServ POLICY #mychannel REQUIRE github_membership issuer=did:web:irc.freeq.at:verify url=/verify/github/start?org=myorg label=GitHub_Org
# Require Bluesky follow
/msg ChanServ POLICY #mychannel REQUIRE bluesky_follower issuer=did:web:irc.freeq.at:verify url=/verify/bluesky/start?target=handle.bsky.social label=Bluesky_Follow
Auto-grant channel modes based on credentials:
# GitHub repo contributors get op (+o)
/msg ChanServ POLICY #mychannel SET-ROLE op {"type":"PRESENT","credential_type":"github_repo","issuer":"did:web:irc.freeq.at:verify"}
# Moderators get halfop (+h)
/msg ChanServ POLICY #mychannel SET-ROLE moderator {"type":"PRESENT","credential_type":"channel_moderator","issuer":"did:web:irc.freeq.at:verify"}
/msg ChanServ POLICY #mychannel CLEAR
| Type | Description | Verifier |
|---|---|---|
github_repo |
Push access to a GitHub repository | GitHub OAuth |
github_membership |
Member of a GitHub organization | GitHub OAuth |
bluesky_follower |
Follows a specific Bluesky account | AT Protocol |
channel_moderator |
Appointed by channel ops | Manual |
The easiest way to manage policies is through the Channel Settings panel:
The UI provides templates for common setups and shows the current policy in human-readable form.
irc-policy.db)did:web:irc.freeq.at:verify)GET /api/v1/policy/{channel} — Fetch current policy
POST /api/v1/policy/{channel}/accept — Accept channel rules (returns credential)
+o) can set/modify policiesdid:plc:...) who are channel founders or DID-ops bypass all policy checksACCEPT requirements but not credential-based ones (they need a DID)REQUIRE adds to existing requirements with AND logic