📖 Guide
Firebase — Complete Reference
Firebase cheat sheet covering Authentication, Firestore, Realtime Database, Cloud Functions, Storage, Hosting, and emulators.
80 commands across 10 categories
Setup & CLIAuthenticationFirestoreRealtime DatabaseStorageCloud FunctionsHostingSecurity RulesEmulatorsCommon Patterns
Setup & CLI
| Command | Description |
|---|---|
npm install -g firebase-tools | Install Firebase CLI globally |
firebase login | Authenticate with your Google account |
firebase init | Initialize Firebase in a project (interactive setup) |
firebase projects:list | List all Firebase projects |
firebase use my-project-id | Set the active project |
firebase deploy | Deploy all configured services |
firebase deploy --only functions | Deploy only Cloud Functions |
firebase serve | Start local server for hosting and functions |
Authentication
| Command | Description |
|---|---|
import { getAuth, signInWithEmailAndPassword } from 'firebase/auth'; | Import auth functions (v9 modular SDK) |
const auth = getAuth(app); | Initialize the auth instance |
await createUserWithEmailAndPassword(auth, email, password); | Create a new user with email/password |
await signInWithEmailAndPassword(auth, email, password); | Sign in with email/password |
await signInWithPopup(auth, new GoogleAuthProvider()); | Sign in with Google popup |
onAuthStateChanged(auth, (user) => { }); | Listen to auth state changes (login/logout) |
await signOut(auth); | Sign out the current user |
auth.currentUser | Get the currently signed-in user (or null) |
Firestore
| Command | Description |
|---|---|
import { getFirestore, doc, collection } from 'firebase/firestore'; | Import Firestore functions |
const db = getFirestore(app); | Initialize Firestore instance |
await addDoc(collection(db, 'posts'), { title: 'Hello', date: new Date() }); | Add a document with auto-generated ID |
await setDoc(doc(db, 'posts', 'post-1'), { title: 'Hello' }); | Set a document with a specific ID (overwrites) |
await setDoc(doc(db, 'posts', 'post-1'), { views: 0 }, { merge: true }); | Merge fields into existing document |
const snap = await getDoc(doc(db, 'posts', 'post-1'));e.g. const data = snap.data(); | Get a single document by ID |
const q = query(collection(db, 'posts'), where('author', '==', 'Alice'), orderBy('date', 'desc'), limit(10)); | Build a query with filters, ordering, and limit |
const snapshot = await getDocs(q);e.g. snapshot.forEach(doc => console.log(doc.data())); | Execute a query and get results |
onSnapshot(q, (snapshot) => { }); | Listen to real-time query updates |
await updateDoc(doc(db, 'posts', 'post-1'), { title: 'Updated' }); | Update specific fields of a document |
await deleteDoc(doc(db, 'posts', 'post-1')); | Delete a document |
const batch = writeBatch(db);e.g. batch.set(ref, data); batch.update(ref2, data2); await batch.commit(); | Create a batch for atomic writes |
Realtime Database
| Command | Description |
|---|---|
import { getDatabase, ref, set, get, onValue } from 'firebase/database'; | Import Realtime Database functions |
const db = getDatabase(app); | Initialize Realtime Database instance |
await set(ref(db, 'users/' + uid), { name: 'Alice' }); | Write data at a specific path |
const snapshot = await get(ref(db, 'users/' + uid)); | Read data once from a path |
onValue(ref(db, 'messages'), (snapshot) => { }); | Listen for real-time updates at a path |
await push(ref(db, 'messages'), { text: 'Hello', ts: Date.now() }); | Push a new child with auto-generated key |
await update(ref(db, 'users/' + uid), { name: 'Bob' }); | Update specific fields at a path |
await remove(ref(db, 'users/' + uid)); | Remove data at a path |
Storage
| Command | Description |
|---|---|
import { getStorage, ref, uploadBytes, getDownloadURL } from 'firebase/storage'; | Import Storage functions |
const storage = getStorage(app); | Initialize Storage instance |
const storageRef = ref(storage, 'images/photo.jpg'); | Create a reference to a file path |
await uploadBytes(storageRef, file); | Upload a file (Blob, File, or Uint8Array) |
await uploadString(storageRef, dataUrl, 'data_url'); | Upload a base64 or data URL string |
const url = await getDownloadURL(storageRef); | Get the public download URL for a file |
await deleteObject(storageRef); | Delete a file from Storage |
const { items } = await listAll(ref(storage, 'images/')); | List all files in a directory |
Cloud Functions
| Command | Description |
|---|---|
firebase init functions | Initialize Cloud Functions in your project |
const { onRequest } = require('firebase-functions/v2/https'); | Import HTTP trigger (v2) |
exports.api = onRequest((req, res) => { res.send('Hello'); }); | Create an HTTP-triggered function |
const { onDocumentCreated } = require('firebase-functions/v2/firestore'); | Import Firestore trigger (v2) |
exports.onUserCreated = onDocumentCreated('users/{uid}', (event) => { }); | Trigger on Firestore document creation |
const { onSchedule } = require('firebase-functions/v2/scheduler'); | Import scheduled function trigger |
exports.cleanup = onSchedule('every 24 hours', async (event) => { }); | Run a function on a schedule |
firebase deploy --only functions:api | Deploy a single function by name |
Hosting
| Command | Description |
|---|---|
firebase init hosting | Initialize Firebase Hosting |
firebase deploy --only hosting | Deploy only hosting files |
firebase hosting:channel:deploy preview | Deploy to a preview channel |
firebase hosting:channel:list | List all preview channels |
firebase hosting:clone source:channel target:live | Clone a channel to live |
firebase.json: { "hosting": { "public": "out", "rewrites": [{ "source": "**", "destination": "/index.html" }] } } | SPA rewrite configuration |
Security Rules
| Command | Description |
|---|---|
allow read, write: if request.auth != null; | Allow access only to authenticated users |
allow read: if true; | Allow public read access |
allow write: if request.auth.uid == resource.data.authorId; | Allow write only if user owns the document |
allow create: if request.resource.data.keys().hasAll(['title', 'body']); | Validate required fields on create |
allow update: if request.resource.data.title is string; | Validate field types |
allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin'; | Check another document for role-based access |
firebase deploy --only firestore:rules | Deploy only Firestore security rules |
Emulators
| Command | Description |
|---|---|
firebase emulators:start | Start all configured emulators |
firebase emulators:start --only auth,firestore | Start specific emulators |
firebase emulators:export ./seed-data | Export emulator data for later import |
firebase emulators:start --import=./seed-data | Start emulators with pre-loaded data |
connectAuthEmulator(auth, 'http://localhost:9099'); | Connect app to Auth emulator |
connectFirestoreEmulator(db, 'localhost', 8080); | Connect app to Firestore emulator |
http://localhost:4000 | Emulator Suite UI (view all emulators in browser) |
Common Patterns
| Command | Description |
|---|---|
import { initializeApp } from 'firebase/app';e.g. const app = initializeApp(firebaseConfig); | Initialize Firebase app |
import { increment, serverTimestamp, arrayUnion } from 'firebase/firestore'; | Firestore field value helpers |
await updateDoc(ref, { count: increment(1) }); | Atomically increment a field |
await updateDoc(ref, { tags: arrayUnion('new-tag') }); | Add to array without duplicates |
await updateDoc(ref, { updatedAt: serverTimestamp() }); | Set field to server timestamp |
await runTransaction(db, async (transaction) => { const snap = await transaction.get(ref); transaction.update(ref, { count: snap.data().count + 1 }); }); | Run a Firestore transaction for atomic reads + writes |
const q = query(collection(db, 'posts'), startAfter(lastDoc), limit(10)); | Cursor-based pagination with startAfter |
import { getAnalytics } from 'firebase/analytics';e.g. const analytics = getAnalytics(app); | Initialize Firebase Analytics |
📖 Free, searchable command reference. Bookmark this page for quick access.