Quality check · lesson 19 of 21 · Trust, Safety, And Privacy
Permission prompt with no context
Underlying principle: Trust grows when purpose, consequence, status, and control are visible at the point of decision. Sensitive tasks also need a safe route for correction and exit.
Classify contextless permission prompts as an anti-pattern, move the ask to the feature-triggered moment, show a resource-specific rationale and fallback before the platform prompt, avoid unrelated or bundled requests, and handle denied, dismissed, limited, revoked, and settings-required states explicitly.
Start with the decision
Does this fit your task?
A product currently asks for device, browser, or app permissions before the relevant feature context exists.
Review the boundary: Compare the task with the alternatives in the decision section.
Trust grows when purpose, consequence, status, and control are visible at the point of decision. Sensitive tasks also need a safe route for correction and exit.
01 / Recognize the need
What the person is doing
The prompt requests an operating-system, browser, or app-level permission for a device resource or powerful feature such as location, camera, microphone, photos, contacts, notifications, Bluetooth, clipboard, motion sensors, or storage access.
02 / Design the response
What the interface must communicate
Classify contextless permission prompts as an anti-pattern, move the ask to the feature-triggered moment, show a resource-specific rationale and fallback before the platform prompt, avoid unrelated or bundled requests, and handle denied, dismissed, limited, revoked, and settings-required states explicitly.
Cold-start prompt state before the user chooses a relevant feature.
03 / Judge the outcome
What to look for
What exact user action made this permission necessary now?
The pre-prompt must name the resource, user-triggered feature, immediate benefit, denial outcome, and fallback before the system prompt is invoked.
Decision first
Choose this pattern when the problem matches
Use when
A product currently asks for device, browser, or app permissions before the relevant feature context exists.
A team needs to audit permission conversion problems, denial dead ends, repeated nags, or low-trust first-run prompts.
Avoid when
The permission is requested after a clear feature-triggering action with resource-specific rationale and fallback; use permission request.
The issue is specifically location precision, tracking, stale coordinates, or manual location fallback; use location permission flow.
The issue is optional data processing consent rather than platform resource access; use consent prompt.
The user lacks account authorization after sign-in; use permission denied state.
Problem it prevents
The prompt requests an operating-system, browser, or app-level permission for a device resource or powerful feature such as location, camera, microphone, photos, contacts, notifications, Bluetooth, clipboard, motion sensors, or storage access.
Test the behavior
Open the interactive example when you need it
The full lab is intentionally loaded on request. That keeps this reading page fast while preserving the strong and weak states, keyboard checks, and failure scenarios.
In the lab you can
switch between strong UI, weak UI, strong UX, and weak UX;
trigger required, empty, loading, error, and recovery states;
inspect keyboard and accessibility expectations beside the demo.
The prompt requests an operating-system, browser, or app-level permission for a device resource or powerful feature such as location, camera, microphone, photos, contacts, notifications, Bluetooth, clipboard, motion sensors, or storage access.
Pattern promise
Classify contextless permission prompts as an anti-pattern, move the ask to the feature-triggered moment, show a resource-specific rationale and fallback before the platform prompt, avoid unrelated or bundled requests, and handle denied, dismissed, limited, revoked, and settings-required states explicitly.
Required state
Cold-start prompt state before the user chooses a relevant feature.
Failure to inspect
Denial blocks onboarding, checkout, account access, or unrelated navigation.
Access contract
Expose the resource, task, and fallback as text before the system prompt rather than relying on platform icons or button order.
Quality bar
The difference between expert and weak execution
Strong implementation
Specific, visible, recoverable
A receipt scanner waits until the user taps Scan receipt, explains camera is needed only for the scan, then offers Scan with camera or Upload file.
A route check-in shows why current location verifies arrival, offers Enter address instead, then opens the system location prompt only after Use current location.
A user declines camera access for receipt scanning, uploads an image instead, and can keep using expense entry.
A user dismisses location access at first, later taps Find near me, sees a contextual explanation, grants approximate location, and finishes the task.
Weak implementation
Vague, hidden, hard to recover from
An app opens with location, contacts, photos, and notifications prompts before any feature is selected.
A modal says Allow access to improve your experience and then triggers microphone permission.
A denied prompt blocks the whole account even though only one optional feature needed the resource.
A user accepts a vague request believing it is for nearby search, but the app also enables background tracking.
UI guidance
Do not trigger camera, microphone, location, photos, contacts, notification, Bluetooth, clipboard, motion, or storage permission prompts on launch, sign-in, onboarding, or unrelated navigation before the feature need is visible.
Replace a contextless permission prompt with a contextual feature gate that names the resource, task, timing, choices, fallback, denial outcome, and settings recovery before invoking the system prompt.
UX guidance
Treat permission prompts without context as an anti-pattern because users cannot make an informed choice when the resource, benefit, immediate task, and consequence of denial are unclear.
Ask only when the user starts the resource-dependent feature, request the least powerful resource that works, and preserve eligible work through manual input, picker, limited access, or continue-without routes.
Implementation contract
What the implementation must handle
States
Cold-start prompt state before the user chooses a relevant feature.
Vague rationale state where the copy hides the resource, task, or fallback.
Resource mismatch state where the system prompt asks for a different resource than the UI described.
Bundled permissions state that asks for multiple resources as one broad setup step.
Interaction
The pre-prompt must name the resource, user-triggered feature, immediate benefit, denial outcome, and fallback before the system prompt is invoked.
Each permission ask is scoped to one feature or clearly separated feature group; bundled prompts require separate explanation and separate choices.
The requested resource must match the visible action and copy.
Denying the permission must preserve unrelated navigation and eligible non-resource tasks.
Accessibility
Expose the resource, task, and fallback as text before the system prompt rather than relying on platform icons or button order.
Announce grant, denial, limited, revoked, settings-required, and fallback states through visible status text.
Keep long resource names, settings paths, and fallback explanations wrapped on compact mobile layouts.
Return focus to the feature task, fallback, or recovery panel after the platform prompt resolves.
Review
What exact user action made this permission necessary now?
Can the user understand the resource, task, benefit, fallback, and denial outcome before the system prompt appears?
Is the requested resource the least powerful option that works for this task?
What does the product do after deny, dismiss, limited access, revoked permission, or permanent denial?
Supports asking for runtime permissions in context, associating permission requests with user actions, handling denial and revocation, and graceful degradation.
Supports powerful-feature permission states, allow or deny choices, permission lifetime, and revocation handling.
Full agent/debug reference
Problem Context
The prompt requests an operating-system, browser, or app-level permission for a device resource or powerful feature such as location, camera, microphone, photos, contacts, notifications, Bluetooth, clipboard, motion sensors, or storage access.
The user has not yet chosen the feature that needs the resource, or the UI does not name the task and benefit before the system prompt appears.
The product may use first-run onboarding, account creation, a splash screen, a fake setup checklist, or a broad modal to collect permission for speculative future use.
Denial may be mishandled through repeat nags, blocked flows, settings dead ends, broad consent assumptions, resource mismatch, or loss of unrelated product access.
Selection Rules
Flag this anti-pattern when a permission prompt appears before the user starts a resource-dependent feature or before the interface explains why the resource is needed now.
Flag it when vague copy such as improve your experience, stay connected, or enable full functionality hides the resource, task, fallback, or denial outcome.
Flag it when one action triggers a different permission than the visible feature implies, such as a scan action triggering contacts or a store finder triggering background location.
Flag it when multiple permissions are requested together without separate feature-specific rationale and separate recovery paths.
Use permission request for the corrected pattern when the product can ask in context, name the resource, invoke the system prompt deliberately, and handle grant or denial.
Use location permission flow when the context problem is specifically current coordinates, precision, stale location, active tracking, stop sharing, or location fallback.
Use consent prompt when the choice is optional data use rather than OS or browser resource access.
Use permission denied state when the user is authenticated but lacks an account role, license, share, policy, or owner-granted authorization.
Use notification preferences when the user is managing message topics, channels, digest, quiet hours, or subscription settings after OS-level access is handled.
Use privacy settings when the user is reviewing durable account-level resource, data, or sharing controls rather than reacting to a just-in-time permission ask.
Required States
Cold-start prompt state before the user chooses a relevant feature.
Vague rationale state where the copy hides the resource, task, or fallback.
Resource mismatch state where the system prompt asks for a different resource than the UI described.
Bundled permissions state that asks for multiple resources as one broad setup step.
Feature-triggered correction state showing the exact resource and task before the system prompt.
Least-access alternative state with picker, upload, manual entry, approximate access, one-time access, or continue-without path.
Deny without punishment state where unrelated work remains available.
Previously denied or settings-required state with concise recovery instead of another prompt loop.
Repeat nag and blocked-on-deny bad states.
Mobile compact state where context, resource, primary choice, and fallback remain visible.
Interaction Contract
The product must not invoke the platform prompt from page load, app launch, passive onboarding, timers, or unrelated navigation.
The pre-prompt must name the resource, user-triggered feature, immediate benefit, denial outcome, and fallback before the system prompt is invoked.
Each permission ask is scoped to one feature or clearly separated feature group; bundled prompts require separate explanation and separate choices.
The requested resource must match the visible action and copy.
Dismissing or declining the contextual explanation must not trigger the system prompt.
Denying the permission must preserve unrelated navigation and eligible non-resource tasks.
Previously denied, permanently denied, revoked, blocked, or limited states must show a settings route or lower-access fallback rather than loop the same prompt.
The UI must distinguish permission request from consent, account authorization, notification topic settings, privacy settings, and approval gates.
Implementation Checklist
Inventory every system permission and map it to the exact feature action that first needs the resource.
Remove first-run, splash-screen, onboarding, sign-in, page-load, and unrelated-navigation permission triggers unless the feature itself is being started.
Write resource-specific rationale copy that names the task, resource, benefit, choice, fallback, and settings path.
Split bundled resource asks into separate feature-triggered requests or lower-access alternatives.
Provide fallback routes such as manual address, upload file, paste code, type contact, chat-only mode, continue without notifications, or open settings.
Test cold start, feature-triggered ask, grant, deny, dismiss, repeat visit, permanent denial, resource mismatch, bundled permissions, compact layout, keyboard order, and status messaging.
Common Generated-UI Mistakes
Requesting permissions on first launch because analytics show users may need the feature later.
Asking for location, notifications, contacts, and photos as one setup checklist before explaining any task.
Using vague benefit copy instead of naming the resource and feature.
Triggering a system prompt from a custom modal close, page load, hover, timeout, or background script.
Treating denial as a reason to block the whole product.
Looping a custom prompt or browser prompt after denial.
Requesting a more invasive permission than the feature needs.
Critique Questions
What exact user action made this permission necessary now?
Can the user understand the resource, task, benefit, fallback, and denial outcome before the system prompt appears?
Is the requested resource the least powerful option that works for this task?
What does the product do after deny, dismiss, limited access, revoked permission, or permanent denial?
Can users complete the core task through a manual or lower-access route?
Is this a device permission, optional data-use consent, account authorization, notification preference, privacy setting, or human approval decision?
Accessibility
Expose the resource, task, and fallback as text before the system prompt rather than relying on platform icons or button order.
Do not trigger permission prompts automatically while keyboard or assistive technology users are still orienting to the page.
Keep continue, not now, fallback, settings, and retry controls labelled with the resource and task.
Announce grant, denial, limited, revoked, settings-required, and fallback states through visible status text.
Keep long resource names, settings paths, and fallback explanations wrapped on compact mobile layouts.
Return focus to the feature task, fallback, or recovery panel after the platform prompt resolves.
Keyboard Behavior
Tab reaches context explanation, continue to system prompt, not now, fallback, settings help, and safe exit before any permission prompt is invoked.
Enter or Space activates only the focused visible control and must not trigger hidden permission requests.
Escape closes only the custom explanation surface before the system prompt; it must not grant, deny, or silently invoke the platform prompt.
After denial or dismissal, focus moves to fallback or recovery instructions rather than back to a repeated ask.
After settings recovery, focus returns to retry permission or continue without permission.