Group Permissions for App Access
An application asking the user for one permission at a time, over and over, teaches them to click yes without reading. This lets an application declare everything it needs up front, in one place, so the user makes one informed decision.
Summary
- Why
- Apps that need several kinds of wallet permission at once had no way to ask for them together, forcing users through a string of disconnected prompts.
- What
- BRC-73 defines a manifest format, `metanet.groupPermissions`, for declaring an app's protocol, spending, basket, and certificate permission needs in one grouped structure.
- How
- A developer adds a `metanet.groupPermissions` object to their app's `manifest.json`, listing protocol permissions, a spending authorization, basket access entries, and certificate access entries, each with a human-readable description, and the wallet fetches that manifest to present one combined prompt.
What this lets you do
- Declare BRC-43 protocol access needs by protocol ID and optional counterparty
- Request a monthly spending limit in satoshis with spendingAuthorization
- List BRC-46 baskets the app needs to read or write
- Ask for specific BRC-52 certificate fields to be revealed to a named verifier
- Bundle all four permission types into one manifest.json declaration
Written by claude-sonnet-5 from the specification text. Where the two differ, the original is correct.
Reference for an AI
Everything an assistant needs to answer questions about BRC-73 accurately, including what it depends on.
The specification
Abstract
This specification defines the manifest declaration format for grouped wallet permissions. It allows an application to declare, in one place, the protocol access, spending authorization, basket access, and certificate disclosure capabilities it expects to request from the user.
The current interoperable manifest namespace is metanet.groupPermissions. Wallets may continue to read the legacy babbage.groupPermissions namespace for backwards compatibility, but it is deprecated.
Motivation
As applications become more integrated with user data and cryptographic operations, permission prompts can become fragmented and repetitive. Grouped permission declarations let wallets present a single, coherent prompt instead of a series of unrelated one-off requests, improving both transparency and user comprehension.
Status Note
This document defines the grouped-permission declaration shape.
The full runtime permission lifecycle, including manifest fetching, prompt routing, persistence, renewal, revocation, and interaction with counterparty trust (PACT), is authoritatively specified by BRC-116. This document should therefore be read as the grouped-permission schema used by current BRC-100 wallet implementations, not as a complete permission-system specification by itself.
Specification
Canonical Manifest Location
Applications SHOULD serve a W3C web-app manifest at:
https://{originator}/manifest.json
For local development, wallets MAY use:
http://localhost/.../manifest.json
Wallets MAY fetch this manifest proactively, or lazily when the first protected operation is attempted. Current wallet-toolbox behavior supports both patterns.
Namespace
The canonical grouped-permission declaration lives under:
metanet.groupPermissions
Wallets SHOULD continue to recognize:
babbage.groupPermissions
for backwards compatibility, but applications SHOULD migrate to metanet.
groupPermissions Structure
The groupPermissions object may contain the following keys:
descriptionprotocolPermissionsspendingAuthorizationbasketAccesscertificateAccess
Grouped permissions do not cover privileged-key usage. Privileged operations remain one-off permission decisions in current interoperable wallet behavior.
Permission Types
There are four grouped permission categories:
- Protocol permissions for BRC-43 scoped cryptographic operations.
- Spending authorization for wallet spending on behalf of the originator.
- Basket access for BRC-46 basket usage.
- Certificate access for BRC-52 field revelation to a designated verifier.
Protocol Permissions
Each element of protocolPermissions is an object with:
protocolID: a BRC-43 protocol tuple[securityLevel, protocolName]counterparty: required when the declaration is for a specific Level 2 counterpartydescription: human-readable explanation for the user
Level 1 protocol declarations MAY omit counterparty.
Level 2 declarations used in grouped permission requests SHOULD name the specific counterparty they are about.
Spending Authorization
spendingAuthorization is an object with:
amount: the authorized monthly spend limit in satoshisdescription: human-readable explanation for the user
The older duration field is no longer part of current interoperable grouped-permission behavior and SHOULD be considered deprecated for new manifests.
Basket Access
Each element of basketAccess is an object with:
basket: the BRC-46 basket namedescription: human-readable explanation for the user
Certificate Access
Each element of certificateAccess is an object with:
type: the BRC-52 certificate typefields: the certificate fields requested for revelationverifierPublicKey: the verifier's compressed public keydescription: human-readable explanation for the user
Current Interoperability Notes
- Wallets commonly fetch grouped permissions from
manifest.jsonwhen the first protected operation is attempted, not only duringwaitForAuthentication. metanet.groupPermissionsis canonical.babbage.groupPermissionsis a deprecated backwards-compatibility fallback.- Grouped permissions and PACT are distinct; PACT is defined in BRC-116.
Examples
-
protocolPermissions{ "protocolID": [2, "Convo"], "counterparty": "...", "description": "For encrypted messaging." } -
spendingAuthorization{ "amount": 10000, "description": "For in-app purchases." } -
basketAccess{ "basket": "BRC-46 Gold", "description": "For in-game items." } -
certificateAccess{ "type": "...", "fields": ["Name", "DOB"], "verifierPublicKey": "...", "description": "For age verification." } -
Full
manifest.json{ "name": "My App", "short_name": "MyApp", "display": "standalone", "metanet": { "schemaVersion": 1, "groupPermissions": { "protocolPermissions": [ { "protocolID": [2, "Convo"], "counterparty": "...", "description": "For encrypted messaging." } ], "spendingAuthorization": { "amount": 10000, "description": "For in-app purchases." }, "basketAccess": [ { "basket": "BRC-46 Gold", "description": "For in-game items." } ], "certificateAccess": [ { "type": "...", "fields": ["Name", "DOB"], "verifierPublicKey": "...", "description": "For age verification." } ] } }, "icons": [] }
Applications SHOULD provide clear descriptions that help the user understand why each grouped permission is being requested. Wallets SHOULD interpret these declarations using the lifecycle and enforcement rules in BRC-116.