Resources
The Soulidity desktop app renders Souls you own (or hold an asset-scope grant for) as live personas — animated sprite, voice, memory-aware chat. This guide covers the web ↔ desktop bridge, sprite grant flow, the protected-sprite IPC, the post-mint deep-link callback, and install / upgrade.
The desktop app is an Electron shell. The renderer process loads a thin React UI that talks to a local backend running in the main process. The main process owns the Sui RPC client, the Walrus blob client, the Seal session keys, and the local cache. For protected persona sprites, the main process decrypts locally and returns an explicit byte payload to the renderer so the renderer can populate the local persona cache; the bytes remain on the user's machine and are not sent back to Soulidity servers.
When the desktop app first opens a Soul whose sprite or audio is not public, it walks the user through a single grant TX that authorizes the desktop wallet to decrypt those blobs.
SoulGrant for this Soul with at least SCOPE_ASSETS (bit 8)?grant::issue_to_grantee with the desktop wallet address as grantee. Default expiry is null (no TTL) — termination is by explicit revoke.For persona sprites bound under non-public read modes, the renderer fetches a Soul access payload, then asks the main process to decrypt that payload:
// Renderer → main
ipcRenderer.invoke('soul:decrypt-protected-sprite', {
access: privateAccessPayload,
})
// → { bytes: Uint8Array, fileName: 'sprite.png', mimeType: 'image/png' }
ipcRenderer.invoke('soul:cache-persona', {
catalogId,
sourceType: 'soul',
sourceRef: soulId,
version,
spriteBytes: decrypted.bytes,
configJson,
})The main process validates the access payload, pulls the encrypted blob from Walrus, decrypts it locally, and returns the decrypted bytes to the renderer. The renderer immediately hands those bytes back to soul:cache-persona; the main process writes the sprite and config into the desktop cache under the app's local user-data directory. The plaintext cache is local to the machine and is not uploaded to Soulidity servers.
After a Mint By Web hand-off finishes minting, the web app can notify the desktop app through the registered custom protocol:
soulidity://mint-completed?token=mh_...The desktop app registers soulidity:// via app.setAsDefaultProtocolClient. The current handler accepts mint-completed to clear the local extract draft and bring the main window forward. It does not currently implement a soulidity://open?soulId=... purchase or mint handoff route.
stable / beta) in the desktop settings.NOT_GRANTED, WALRUS_FETCH_FAILED, SEAL_DENIED, TIMEOUT.