Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Firebase backend services integration for mobile apps
.claude/skills/a5c-ai-firebase-mobile/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 40% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 88% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 86% | 0% |
This skill provides Firebase backend services integration for mobile applications. It enables configuration of Authentication, Firestore, Storage, Cloud Functions, and other Firebase services.
bash - Execute Firebase CLI commandsread - Analyze Firebase configurationswrite - Generate security rules and configurationsedit - Update Firebase implementationsglob - Search for Firebase filesgrep - Search for patternsfirebase-backend-integration.js - Firebase integrationfirebase-cloud-messaging.js - Push notificationsmobile-analytics-setup.js - Analyticsswift// AppDelegate.swift import FirebaseCore import FirebaseAuth import FirebaseFirestore @main class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() return true } } // AuthService.swift class AuthService: ObservableObject { @Published var user: User? private var handle: AuthStateDidChangeListenerHandle? init() { handle = Auth.auth().addStateDidChangeListener { [weak self] _, user in self?.user = user } } func signIn(email: String, password: String) async throws { try await Auth.auth().signIn(withEmail: email, password: password) } func signUp(email: String, password: String) async throws { try await Auth.auth().createUser(withEmail: email, password: password) } func signOut() throws { try Auth.auth().signOut() } }
kotlin// data/repository/PostRepository.kt class PostRepository @Inject constructor( private val firestore: FirebaseFirestore ) { private val postsCollection = firestore.collection("posts") fun observePosts(): Flow<List<Post>> = callbackFlow { val listener = postsCollection .orderBy("createdAt", Query.Direction.DESCENDING) .addSnapshotListener { snapshot, error -> if (error != null) { close(error) return@addSnapshotListener } val posts = snapshot?.documents?.mapNotNull { it.toObject<Post>() } ?: emptyList() trySend(posts) } awaitClose { listener.remove() } } suspend fun createPost(post: Post): String { val docRef = postsCollection.add(post).await() return docRef.id } suspend fun updatePost(postId: String, updates: Map<String, Any>) { postsCollection.document(postId).update(updates).await() } suspend fun deletePost(postId: String) { postsCollection.document(postId).delete().await() } }
javascript// firestore.rules rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { function isAuthenticated() { return request.auth != null; } function isOwner(userId) { return isAuthenticated() && request.auth.uid == userId; } match /users/{userId} { allow read: if isAuthenticated(); allow write: if isOwner(userId); } match /posts/{postId} { allow read: if true; allow create: if isAuthenticated() && request.resource.data.authorId == request.auth.uid; allow update, delete: if isOwner(resource.data.authorId); } } }
bash# Start emulators firebase emulators:start # Run with emulator in code if ProcessInfo.processInfo.environment["USE_FIREBASE_EMULATOR"] == "YES" { Auth.auth().useEmulator(withHost: "localhost", port: 9099) Firestore.firestore().useEmulator(withHost: "localhost", port: 8080) Storage.storage().useEmulator(withHost: "localhost", port: 9199) }
push-notifications - FCM integrationmobile-analytics - Firebase Analyticsmobile-security - Security patterns| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 15,762 | 17,776 | +13% | 1 | 1 | 0% | 2,644 | 3,699 | +40% | 0 | 0 | — |
case-02 | pass→pass | 10,747 | 9,981 | -7% | 1 | 1 | 0% | 1,901 | 3,565 | +88% | 0 | 0 | — |
case-03 | pass→pass | 19,220 | 28,964 | +51% | 1 | 1 | 0% | 3,831 | 7,121 | +86% | 0 | 0 | — |
case-04 | fail→pass | 9,600 | 4,727 | -51% | 1 | 1 | 0% | 1,454 | 2,380 | +64% | 0 | 0 | — |
case-05 | fail→pass | 10,667 | 4,986 | -53% | 1 | 1 | 0% | 2,347 | 2,359 | +1% | 0 | 0 | — |
case-06 | pass→pass | 12,852 | 11,339 | -12% | 1 | 1 | 0% | 2,290 | 3,475 | +52% | 0 | 0 | — |
case-07 | pass→pass | 10,244 | 6,897 | -33% | 1 | 1 | 0% | 1,542 | 2,400 | +56% | 0 | 0 | — |
case-08 | pass→pass | 9,128 | 8,279 | -9% | 1 | 1 | 0% | 1,595 | 2,922 | +83% | 0 | 0 | — |
case-09 | pass→pass | 3,136 | 2,620 | -16% | 1 | 1 | 0% | 484 | 1,795 | +271% | 0 | 0 | — |
case-10 | pass→pass | 8,892 | 4,871 | -45% | 1 | 1 | 0% | 1,325 | 2,283 | +72% | 0 | 0 | — |
case-11 | pass→pass | 4,121 | 3,168 | -23% | 1 | 1 | 0% | 777 | 2,031 | +161% | 0 | 0 | — |
case-12 | pass→pass | 3,232 | 2,539 | -21% | 1 | 1 | 0% | 543 | 1,740 | +220% | 0 | 0 | — |
case-13 | pass→pass | 7,505 | 3,638 | -52% | 1 | 1 | 0% | 1,194 | 1,996 | +67% | 0 | 0 | — |
case-14 | pass→pass | 4,305 | 4,296 | -0% | 1 | 1 | 0% | 677 | 2,235 | +230% | 0 | 0 | — |
case-15 | pass→pass | 5,478 | 2,875 | -48% | 1 | 1 | 0% | 858 | 1,791 | +109% | 0 | 0 | — |
case-16 | pass→pass | 8,466 | 6,521 | -23% | 1 | 1 | 0% | 1,708 | 2,643 | +55% | 0 | 0 | — |
case-17 | pass→pass | 11,655 | 11,062 | -5% | 1 | 1 | 0% | 2,294 | 3,212 | +40% | 0 | 0 | — |
case-18 | pass→pass | 8,216 | 5,150 | -37% | 1 | 1 | 0% | 1,499 | 2,334 | +56% | 0 | 0 | — |
case-19 | pass→pass | 10,131 | 9,160 | -10% | 1 | 1 | 0% | 2,046 | 3,158 | +54% | 0 | 0 | — |
case-20 | pass→pass | 20,105 | 5,771 | -71% | 1 | 1 | 0% | 698 | 2,372 | +240% | 0 | 0 | — |
case-21 | pass→pass | 8,609 | 6,196 | -28% | 1 | 1 | 0% | 1,730 | 2,664 | +54% | 0 | 0 | — |
case-22 | pass→pass | 5,442 | 5,906 | +9% | 1 | 1 | 0% | 1,027 | 2,589 | +152% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.