← All frames · Frame (c)

Installing an app: where, and for whom

Every registered app declares a scope level — personal, organization, or both — and an organization install policy. Personal installs always remain personal. An app may require every organization install to be organization-wide; in that case the dialog states the fixed outcome instead of asking an invalid “me or everyone” question.

personal available · organization forces everyone

The personal destination remains available. Because this app fixes organization installs to everyone, there is no data-group="mode" selector to imply that an organization-only self install is valid.

organization-wide policy · plain member blocked

A plain member cannot downgrade the organization policy to “install for me.” The write stays disabled while the organization destination is selected; choosing the still-available personal destination is the safe alternative.

organization policy = both · caller is org owner

The self/everyone selector exists only for apps whose organization install policy explicitly permits both modes. It is not shown for organization-wide-only apps.

scopeLevel = personal — no scope question

A single-scope app asks nothing. The dialog still confirms, because installing is a write the user should acknowledge.

Already installed for everyone

Install is idempotent per target, so re-opening shows the existing installation and offers the reverse action instead of a second install.

What the API accepts

App scopeLevelOrg policyRequested scopeModeOutcome
botheveryonepersonalselfInstalled for the caller; org policy does not affect personal space.
botheveryoneorganizationeveryoneRequires owner or admin, else 403.
botheveryoneorganizationself422 — organization policy does not permit a single-member install.
bothbothorganizationselfRequires active membership.
bothbothorganizationeveryoneRequires owner or admin, else 403.
personal—organization—422 — scope not permitted for this app.
organizationanypersonal—422 — scope not permitted for this app.
anyanyanyanyApp not visible to the caller → 404, never 403 (id probing).
Test hooks: [data-dialog='install-app'] · [data-scope-level] · [data-organization-install-mode='everyone'|'both'] · [data-scope='personal'|'organization'] · [data-mode='self'|'everyone'] · [data-guard='organization-wide'|'requires-org-admin'|'already-installed'] · [data-action='install'|'uninstall'|'cancel'].
Frame (c) — install scope & mode Next: notifications →
Review · app-scopes-user-menu approve or reject each flow ↓
user-menupendingApproveReject
accountspendingApproveReject
install-scopeapproved · izzywdev
notificationspendingApproveReject