npx skills add ...
npx skills add forcedotcom/sf-skills --skill using-mobile-native-capabilities
Build a Salesforce LWC that uses native mobile device capabilities — barcode scanner, biometrics, location, NFC, calendar, contacts, document scanner, geofencing, AR space capture, app review, and payments. Use this skill when the user asks for an LWC that scans a barcode, captures a photo of a document, reads location or geofences, prompts for biometrics, reads/writes the device calendar or contacts, taps NFC, takes a payment, prompts for an app review, or scans an AR space. Also triggers on \"lightning/mobileCapabilities\", \"mobile capability\", \"Nimbus\", \"device capability\". Do not use for mobile offline / Komaci priming reviews (use `reviewing-lwc-mobile-offline`) or for picking generic Lightning base components (use a generic Lightning base components skill).
npx skills add forcedotcom/sf-skills --skill using-mobile-native-capabilities
The lightning/mobileCapabilities module exposes a set of factory functions
that return service objects for native device features (barcode scanning,
biometrics, location, etc.). Each service extends a common
BaseCapability [blocked] with an isAvailable()
method, so an LWC can degrade gracefully on surfaces where the capability is
not present (desktop, mobile web).
This skill routes an agent through (1) picking the right capability, (2) loading the authoritative type definitions, and (3) wiring the service into an LWC with the correct availability gating, error handling, and deprecation-aware API choice.
lightning/mobileCapabilities, "mobile capability", or
"Nimbus" by name.Do NOT use this skill for:
reviewing-lwc-mobile-offline.using-lightning-base-components.isAvailable().lightning/mobileCapabilities module declaration
(see mobile-capabilities [blocked]).| Capability | Reference | One-line use |
|---|---|---|
| App Review | App Review [blocked] | Prompt the user for a native in-app review. |
| AR Space Capture | AR Space Capture [blocked] | Capture a 3D scan of a physical space using AR. |
| Barcode Scanner | Barcode Scanner [blocked] | Read QR / UPC / EAN / Code-128 / etc. from the camera. |
| Biometrics | Biometrics [blocked] | Authenticate via Face ID / fingerprint. |
| Calendar | Calendar [blocked] | Read or create events on the device calendar. |
| Contacts | Contacts [blocked] | Read or create entries in the device address book. |
| Document Scanner | Document Scanner [blocked] | Scan paper documents using the camera with edge detection. |
| Geofencing | Geofencing [blocked] | Trigger logic when the device crosses a geographic boundary. |
| Location | Location [blocked] | Read GPS coordinates and watch for updates. |
| NFC | NFC [blocked] | Read or write NFC tags. |
| Payments | Payments [blocked] | Take an Apple Pay / Google Pay payment. |
Map the user's feature ask to one row of the capability index. If the ask spans multiple capabilities (e.g. "scan a barcode and store it on a contact"), plan for each capability separately — there is one factory function per capability.
Read these two shared references once per session — they apply to every capability and are not duplicated in the per-capability files:
isAvailable() that every service extends.lightning/mobileCapabilities module declaration showing every
re-exported service.Then open the capability's reference file from the table above. Each per-capability reference contains the service-specific TypeScript API (factory function, service interface, options types, result types, error types) and assumes the two shared references above are already in context.
Do not infer the API from memory — read it. The services evolve and some
methods are explicitly @deprecated in favor of newer alternatives.
For each capability:
lightning/mobileCapabilities:
const scanner = getBarcodeScanner();isAvailable():
@deprecated alongside the recommended one — always
prefer the recommended method in the reference.try/catch and handle the typed failure codes the
service exposes (e.g. BarcodeScannerFailureCode,
LocationServiceFailureCode). User-cancelled vs. permission-denied vs.
service-unavailable are distinct UX states.Each service defines its own failure-code enum. Translate codes into
user-actionable messages: a USER_DENIED_PERMISSION should ask the user to
grant permission; a USER_DISABLED_PERMISSION must direct them to the OS
settings; a SERVICE_NOT_ENABLED should be a developer-visible error, not
shown to the user.
Mobile capabilities are available only when the LWC runs inside a
supported Salesforce mobile app. If the same component is rendered on
desktop or mobile web, the factory will still return an object but
isAvailable() will return false. Never assume availability — gate every
call.
scan(options) (not the deprecated beginCapture / resumeCapture
/ endCapture triple).barcodeTypes to the symbologies needed (default is
all supported types) and enableMultiScan: false for a single read.result[0].value to the bound field. On reject,
inspect error.code against BarcodeScannerFailureCode.isAvailable().isAvailable().beginCapture /
resumeCapture / endCapture for barcode, etc.).lightning/mobileCapabilities, not from a private
path.isAvailable() returns false on a real device — the device is
running an unsupported app surface (not Salesforce Mobile or Field
Service Mobile), or the service is gated by an org-level setting. The
fix is org configuration, not code.lightning/mobileCapabilities. The module is declared globally inside
Salesforce mobile containers; outside that, the types must be installed
separately.scan() and dismiss(). Refactor any sample code the agent received
before returning it.