Reference

Permissions reference

Every permission a widget can request, what the user is told it means at install time, and which methods and events it unlocks.

Everything is denied by default. A widget declares what it needs in the manifest's permissions object, and the user consents at install time, permission by permission. Three rules shape the system:

  • Consent can only narrow. What the user granted is intersected with the manifest; nothing can escalate past what the manifest declared, and the user may grant less.
  • Updates re-prompt only for additions. An update that adds a permission asks again; removals apply silently.
  • Ask for what you use. Every grant is shown to the user in plain language (the wording below). A widget requesting more than it visibly needs reads as suspicious in review and to users.

The permissions

The wording in the second column is exactly what the marketplace shows the user at install time.

PermissionShown to the user asUnlocks
timeReads the current time from the dashboard's clockdd.time, the time.tick event
storageSaves its own data inside the dashboarddd.storage
filesReads files or folders you explicitly pick for itdd.files.read of user-set filePath settings
desktopIntegrates with your desktop (icons, wallpaper area)dd.desktop, desktop.changed, dd.dialogs.pickDesktopItems
systemReads system stats like CPU, memory and batterydd.system.status / onVitals, the system.vitals stream
systemControlsChanges system settings such as volumethe dd.system write surface: volume, mute, Wi-Fi, openSettings. Useless without system
mediaSees what music or video is playingdd.media.status / onNowPlaying, the media.nowPlaying stream
mediaControlsControls media playbackthe dd.media transport verbs. Useless without media
audioReads audio levels (for visualizations)the audio.spectrum stream. Loudness bands only, never raw audio
controlControls other widgets you grant it access todd.widgets over user-approved targets, widgets.changed
peersTalks to other widgets of the same typedd.peers drag and drop
systemAppsOpens system apps you pick for itdd.apps, catalog keys only
claudeUsageReads your local Claude Code usage summarydd.claudeUsage.status, aggregated only
notificationsShows you reminders, even when the widget is hiddendd.notify.sync
powerShuts down, restarts, sleeps, locks or signs out of this PCdd.power
foldersLists and opens items in folders you pick for itdd.folders, folders.changed, dd.dialogs.pickFolderItems

The scoped grants

http and links are objects, not booleans, and their scope is part of the consent.

http

"permissions": { "http": { "hosts": ["api.open-meteo.com"], "rateLimit": 60 } }
  • hosts: exact hostnames the widget may fetch through dd.http.fetch. Shown to the user as: "Talks to the internet, only to:" followed by the list. No wildcards; every hop of a redirect is re-checked.
  • rateLimit: requests per minute, optional. Omitted means the host default of 30; values are clamped to 120. Never shown at install.
"permissions": { "links": { "prefixes": ["steam://run/"] } }
  • prefixes: URL prefixes dd.links.open may launch, each a full scheme://... string. Shown to the user as: "Can open these link types on your PC:" followed by the list. Empty means no access, and dangerous schemes are refused at call time no matter what a manifest declares.

Read and control pairs

Two capabilities are split so that reading never implies acting:

  • system reads vitals; systemControls changes volume, Wi-Fi, and opens settings panels. Controls without system are useless.
  • media reads now-playing; mediaControls drives playback.

power is deliberately its own permission rather than part of systemControls: granting a volume slider is not granting the ability to turn the machine off.

Version floors

Some permissions did not exist in the earliest app releases. The marketplace validators require a matching minAppVersion when a manifest requests them:

PermissionRequires at least
power"minAppVersion": "0.1.9"
folders"minAppVersion": "0.1.10"

Three setting types are part of the permission story: filePath (which file or folder), secretRef (which credential), and instances (which other widgets). Their manifest defaults are always ignored; only what the user actively picked counts. See the manifest reference.

For the containment model behind all of this, see How the sandbox works.