skills/mobile-push-notification-expert/SKILL.md
Mobile push notification expert for FCM, APNs, deep linking, rich notifications, and notification channels. Activate on: push notifications, FCM setup, APNs configuration, notification channels, deep link from notification, rich notification, notification permissions, silent push. NOT for: in-app messaging (use react-native-architect), email notifications (use devops-automator), SMS (use api-architect).
npx skillsauth add curiositech/windags-skills mobile-push-notification-expertInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expert in implementing push notifications across iOS and Android with FCM, APNs, rich content, and deep linking.
Activate on: "push notifications", "FCM setup", "APNs configuration", "notification channels", "deep link notification", "rich notification", "notification permissions", "silent push", "notification grouping"
NOT for: In-app messaging → react-native-architect | Email notifications → devops-automator | SMS → api-architect
@react-native-firebase/messaging or expo-notifications| Domain | Technologies | |--------|-------------| | Services | Firebase Cloud Messaging (FCM v1 API), APNs, Amazon SNS | | Libraries | @react-native-firebase/messaging, expo-notifications, Notifee | | Rich Content | Images, action buttons, custom sounds, notification extensions | | Channels | Android notification channels, iOS categories, grouping | | Backend | FCM v1 HTTP API, APNs HTTP/2, OneSignal, Knock |
Backend sends push
│
├─ App in FOREGROUND:
│ ├─ onMessage handler fires
│ ├─ Show in-app toast/banner (NOT system notification)
│ └─ Update badge count
│
├─ App in BACKGROUND:
│ ├─ System shows notification
│ ├─ onNotificationOpenedApp fires on tap
│ └─ Navigate to deep link target
│
└─ App KILLED:
├─ System shows notification
├─ getInitialNotification on cold start
└─ Navigate after app initialization
// Server-side: send notification via FCM v1 HTTP API
const message = {
token: deviceToken,
notification: {
title: 'New Order #1234',
body: 'Your order has been confirmed',
image: 'https://cdn.example.com/order-confirmed.png',
},
data: {
type: 'order_update',
orderId: '1234',
deepLink: 'myapp://orders/1234',
},
android: {
priority: 'high',
notification: {
channelId: 'orders',
clickAction: 'OPEN_ORDER',
color: '#4A90D9',
},
},
apns: {
payload: {
aps: {
sound: 'order_confirmed.wav',
badge: 1,
'mutable-content': 1, // Enable Notification Service Extension
'thread-id': 'orders', // Group notifications
},
},
},
};
import notifee, { AndroidImportance } from '@notifee/react-native';
// Create channels on app start (Android 8+)
async function createNotificationChannels() {
await notifee.createChannelGroup({ id: 'general', name: 'General' });
await notifee.createChannel({
id: 'orders',
name: 'Order Updates',
groupId: 'general',
importance: AndroidImportance.HIGH,
sound: 'order_notification',
vibration: true,
lights: true,
lightColor: '#4A90D9',
});
await notifee.createChannel({
id: 'messages',
name: 'Messages',
groupId: 'general',
importance: AndroidImportance.HIGH,
sound: 'message_notification',
});
await notifee.createChannel({
id: 'promotions',
name: 'Promotions',
groupId: 'general',
importance: AndroidImportance.LOW, // Users can customize
});
}
POST_NOTIFICATIONS). Request it at a contextually appropriate moment, not on first launch.notification field for visible content.onTokenRefresh and update the backend.thread-id) and Android (group).[ ] APNs key and FCM credentials configured
[ ] Permission requested at contextual moment (not first launch)
[ ] Device token registered and refresh handled
[ ] Foreground, background, and killed states all handled
[ ] Deep link navigation from notification tap
[ ] Android notification channels created per category
[ ] Rich notifications with images and action buttons
[ ] Notification grouping by topic/thread
[ ] Silent push for background data refresh
[ ] Badge count management (increment/clear)
[ ] Notification analytics tracked (delivered, opened, dismissed)
[ ] Token cleanup for uninstalled apps (periodic prune)
data-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.