Install
$ agentstack add skill-khadinakbarlabs-expo-mobile-app-builder-add-expo-notifications-fcm ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Add FCM Push (expo-notifications)
Firebase Cloud Messaging — free, unlimited push for Android.
Install
npx expo install expo-notifications expo-device
Firebase project setup
Run set-up-firebase-cli skill first. Result: google-services.json in android/app/.
app.json:
{
"expo": {
"android": { "googleServicesFile": "./google-services.json" },
"notification": {
"icon": "./assets/notification-icon.png",
"color": "#ffffff",
"androidMode": "default"
}
}
}
Request permission (Android 13+ runtime)
import * as Notifications from 'expo-notifications';
import * as Device from 'expo-device';
async function registerForPush() {
if (!Device.isDevice) return;
let { status } = await Notifications.getPermissionsAsync();
if (status !== 'granted') {
const r = await Notifications.requestPermissionsAsync();
if (r.status !== 'granted') return null;
}
const token = (await Notifications.getDevicePushTokenAsync()).data;
// FCM token — save to backend
return token;
}
Custom pre-prompt (boost permission opt-in)
Before calling requestPermissionsAsync, show your own screen: > "Get a daily reminder. We promise no spam." > [Sure] [Later]
If "Sure" → trigger system dialog. If "Later" → don't ask again this session.
Notification channels (Android 8+)
import * as Notifications from 'expo-notifications';
Notifications.setNotificationChannelAsync('daily-reminders', {
name: 'Daily Reminders',
importance: Notifications.AndroidImportance.HIGH,
sound: 'default',
vibrationPattern: [0, 250, 250, 250],
lightColor: '#FF231F7C',
});
Channels are user-controllable in Settings. Group related notifs.
Foreground handler
Notifications.setNotificationHandler({
handleNotification: async () => ({
shouldShowAlert: true,
shouldPlaySound: false,
shouldSetBadge: true,
}),
});
Send from backend
Use Firebase Admin SDK or Expo Push API:
fetch('https://exp.host/--/api/v2/push/send', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
to: deviceToken,
title: 'Reminder',
body: 'Time to log today',
channelId: 'daily-reminders',
}),
});
Deep link on tap
const notificationRoutes = new Set(['/today', '/library']);
Notifications.addNotificationResponseReceivedListener((response) => {
const screen = response.notification.request.content.data.screen;
if (typeof screen === 'string' && notificationRoutes.has(screen)) {
router.push(screen);
}
});
Manufacturer battery optimization (CRITICAL)
Xiaomi (MIUI), Oppo (ColorOS), OnePlus, Samsung kill background apps aggressively. Push works most of the time but for ENGAGEMENT push (reminders), users must:
- Settings → Battery → [Your app] → "Don't optimize"
- Some need: Settings → Apps → [Your app] → Battery saver → "No restriction"
Document this in onboarding for power users.
Pair with
add-onesignal-pushfor advanced campaigns (RC for transactional, OS for marketing)add-deep-linksto handle taps
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: khadinakbarlabs
- Source: khadinakbarlabs/expo-mobile-app-builder
- License: MIT
- Homepage: https://khadinakbar.com
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.