OpenBadges 3.0 digital credentials for the CogniPilot community.
- Create a new badge request issue
- Fill out the form with recipient details and badge type
- A member of the @CogniPilot/credentials team adds the
issue-badgelabel - The workflow automatically:
- Creates the signed credential
- Generates baked SVG and PNG badges
- Creates the credential page
- Comments on the issue with links
- Closes the issue
- Create a request file in
requests/:
{
"recipient_name": "Jane Doe",
"recipient_email": "jane@example.com",
"achievement": "tsc-member-2026",
"valid_from": "2026-01-01T00:00:00Z",
"status": "pending"
}- Run
python scripts/process_requests.pyor commit and push to trigger the GitHub Actions workflow
By default, your wallet URL is derived from your name (e.g., jane-doe). You can customize this:
Custom slug - Specify your own URL-friendly identifier:
{
"recipient_name": "Jane Doe",
"recipient_email": "jane@example.com",
"achievement": "tsc-member-2026",
"valid_from": "2026-01-01T00:00:00Z",
"wallet_slug": "jdoe-credentials"
}Anonymous slug - Generate a random alphanumeric identifier for privacy:
{
"recipient_name": "Jane Doe",
"recipient_email": "jane@example.com",
"achievement": "tsc-member-2026",
"valid_from": "2026-01-01T00:00:00Z",
"anonymize_slug": true
}This creates a wallet URL like profile/a7b2c9d4e1f8/wallet instead of profile/jane-doe/wallet.
Note: Wallet slug options only apply when creating a new wallet. If your email already has an associated wallet, new credentials are added to that existing wallet. To change an existing wallet's slug, see Renaming Wallet Slug.
Generated files are saved to docs/profile/<wallet-slug>/<achievement-id>/:
credential.json- Signed verifiable credentialbadge.svg- Baked SVG badge with earner name and embedded credentialbadge.png- PNG badge with embedded credential metadataindex.html- Credential page for sharing
- Create an update request issue
- Fill out the form with your current email and requested changes
- A maintainer will review and process your request
Note: If you have credentials in multiple wallets (e.g., from using different email addresses), updating to an email that already has a wallet will consolidate/merge your credentials into that existing wallet.
Create an update request file in requests/:
{
"request_type": "update",
"old_email": "old-email@example.com",
"recipient_name": "Jane Doe",
"recipient_email": "new-email@example.com",
"achievement": "achievement-id",
"valid_from": "2026-01-01T00:00:00Z",
"valid_until": "2026-12-31T23:59:59Z"
}To change your profile URL slug, create a rename request:
{
"request_type": "rename_wallet",
"recipient_email": "email@example.com",
"recipient_name": "Display Name",
"new_wallet_slug": "new-slug-name"
}To convert an existing wallet to an anonymous slug:
{
"request_type": "rename_wallet",
"recipient_email": "email@example.com",
"anonymize_slug": true
}- Create a removal request issue
- Choose whether to remove specific credentials or your entire profile
- Confirm the removal is intentional
- A maintainer will review and process your request
Create a removal request file in requests/:
{
"request_type": "remove",
"recipient_email": "email@example.com",
"remove_profile": false,
"achievements": ["achievement-id-1", "achievement-id-2"]
}Set remove_profile to true to remove your entire wallet and all credentials. Otherwise, list specific achievement IDs to remove.
Revocation marks a credential as invalid without deleting it. Revoked credentials will fail verification even if the recipient has already downloaded a copy. This is useful when:
- A credential was issued in error
- The recipient's status has changed
- The credential was compromised
- Create a revocation request issue
- Provide the credential holder's email and achievement ID
- Explain the reason for revocation
- A maintainer adds the
approve-revocationlabel to process
cd scripts
python revoke_credential.py --email user@example.com --achievement achievement-idOr using the credential ID directly:
python revoke_credential.py --credential wallet-slug/achievement-idTo list all credentials and their revocation status:
python revoke_credential.py --listRevoked credentials can be reinstated if the revocation was done in error or the situation has changed.
Via GitHub Issue:
- Create a reinstatement request issue
- Provide the credential holder's email and achievement ID
- Explain the reason for reinstatement
- A maintainer adds the
approve-unrevocationlabel to process
Manual Method:
cd scripts
python revoke_credential.py --email user@example.com --achievement achievement-id --unrevokeCredentials include a credentialStatus field pointing to a Bitstring Status List. When a credential is revoked:
- The credential's bit is set in the status list
- The status list credential is regenerated and signed
- Verifiers check the status list during validation
- The credential fails verification with "Credential has been revoked"
When a credential is reinstated, the bit is cleared and the credential passes verification again.
The status list is hosted at: https://credentials.cognipilot.org/status/revocation-list
Verify credentials at: https://credentials.cognipilot.org/verify
The verifier supports:
- JSON credentials - Upload or paste a
credential.jsonfile - SVG badges - Upload an SVG badge with embedded credential
- PNG badges - Upload a PNG badge with embedded credential metadata
An example wallet is available to demonstrate credential states:
- Expired - Rumoca Maintainer (expired 2024-12-31)
- Expiring Soon - CogniPilot Collaborator (expires within 30 days)
- Valid - CogniPilot Contributor (no expiration)
- Revoked - CogniPilot Maintainer (revoked credential)
Use these to test verification behavior for different credential states.