Multisig Coordination Dashboard
Simulate the wallet generating a PSBT and passing it directly to the widget.
Simulate a user clicking a deep-link from a co-signer to join an existing room.
Install via package manager to use with modern build tools like Vite, Webpack, or Angular:
Or drop the Web Component bundle directly into your HTML via CDN:
You can render the component directly in your DOM. It requires zero framework dependencies.
| Attribute | Description |
|---|---|
network |
Sets the Bitcoin network. Options: bitcoin, testnet, signet. (Default: bitcoin) |
hide-header |
If true, hides the top "SigningRoom.io" header and network badges for a cleaner white-label embed. |
relay-endpoint |
(Optional) Overrides the default relay server URL. |
view |
(Optional) Set to inject to load into a specific flow context. |
room-id |
(Optional) The public ID of an existing room to join automatically. |
decryption-key |
(Optional) The private decryption key required to unlock the room. |
If your application already holds the Unsigned PSBT in memory, you can inject it directly into the component to instantly create a new room without file uploads. This is typically done by programmatically creating the element.
The <signing-room> web component emits standardized DOM CustomEvent objects whenever significant actions, security workflows, or lifecycle changes occur. Host applications can capture these events by attaching standard event listeners to the widget DOM element. All event data is passed inside the event.detail property.
Universal Context: Every event payload implicitly includes a BaseEventContext object, ensuring your host application always knows who triggered the event, and in which room.
roomCreated: Fired immediately after the Coordinator successfully initializes a new signing room.
transactionFinalized: Fired when the Coordinator successfully aggregates all required signatures and finalizes the transaction.
roomStateChanged: Fired when the Coordinator changes the overarching access or lifecycle state of the room.
participantPresence: Fired when a user successfully connects to or disconnects from the active WebSocket session.
destinationVerified: Fired when an administrator approves or revokes a specific input or output address on the strict whitelist.
securityAlert: Fired when suspicious activity (like failed decryption attempts) is detected.
privacyToggled: Fired whenever the user interacts with the OpSec blur/reveal mechanics.
modalViewed: Fired when the user opens a specific modal or dialog within the widget.
transactionViewChanged: Fired when the user toggles between viewing the Inputs and Outputs.
signatureReceived: Fired when a new signature is successfully merged into the transaction over the network.
fountainFormatChanged: Fired when the user switches the Air-Gapped animated QR code format.
fountainStateChanged: Fired when the user reveals or hides the Air-Gapped animated PSBT QR code.
psbtImported: Fired when a participant successfully injects a signed PSBT into the room.
qrStateChanged: Fired when the user configures or reveals the secure Room Entry QR code.
dataCopied: Fired when a user copies sensitive configuration data to their clipboard.
downloadTriggered: Fired when the user exports files or data from the room.
roomRenamed: Fired when the Coordinator changes the display name of the current session.
participantLabelled: Fired when a user sets their own display name, or when the Coordinator applies a label to a specific hardware signer.
Listen for the signingError CustomEvent to catch parsing issues, network mismatches, or room expiration events.