{"id":4829,"date":"2025-08-26T13:26:06","date_gmt":"2025-08-26T13:26:06","guid":{"rendered":"https:\/\/uplatz.com\/blog\/?p=4829"},"modified":"2025-08-27T02:31:11","modified_gmt":"2025-08-27T02:31:11","slug":"firebase-gcp-pocket-book","status":"publish","type":"post","link":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/","title":{"rendered":"Firebase (GCP) Pocket Book"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3-1024x576.png\" alt=\"Firebase Pocket Book\" width=\"840\" height=\"473\" class=\"alignnone size-large wp-image-4835\" srcset=\"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3-1024x576.png 1024w, https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3-300x169.png 300w, https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3-768x432.png 768w, https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3.png 1280w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><br \/>\n<!-- Firebase (GCP) Pocket Book \u2014 Uplatz (50 Cards, Wide Layout, Readable Code, Scoped Styles) --><\/p>\n<div style=\"margin: 16px 0;\">\n<style>\n    .wp-firebase-pb { font-family: Arial, sans-serif; max-width: 1320px; margin:0 auto; }\n    .wp-firebase-pb .heading{\n      background: linear-gradient(135deg, #e0f2fe, #ccfbf1); \/* lighter gradient *\/\n      color:#0f172a; padding:22px 24px; border-radius:14px;\n      text-align:center; margin-bottom:18px; box-shadow:0 8px 20px rgba(0,0,0,.08);\n      border:1px solid #cbd5e1;\n    }\n    .wp-firebase-pb .heading h2{ margin:0; font-size:2.1rem; letter-spacing:.2px; }\n    .wp-firebase-pb .heading p{ margin:6px 0 0; font-size:1.02rem; opacity:.9; }<\/p>\n<p>    \/* Wide, dense grid *\/\n    .wp-firebase-pb .grid{ display:grid; gap:14px; grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); }\n    @media (min-width:1200px){ .wp-firebase-pb .grid{ grid-template-columns: repeat(3, 1fr); } }<\/p>\n<p>    .wp-firebase-pb .section-title{ grid-column:1\/-1; background:#f8fafc; border-left:8px solid #0ea5e9; padding:12px 16px; border-radius:10px; font-weight:700; color:#0f172a; font-size:1.08rem; box-shadow:0 2px 8px rgba(0,0,0,.05); border:1px solid #e2e8f0; }\n    .wp-firebase-pb .card{ background:#ffffff; border-left:6px solid #0ea5e9; padding:18px; border-radius:12px; box-shadow:0 6px 14px rgba(0,0,0,.06); transition:transform .12s ease, box-shadow .12s ease; border:1px solid #e5e7eb; }\n    .wp-firebase-pb .card:hover{ transform: translateY(-3px); box-shadow:0 10px 22px rgba(0,0,0,.08); }\n    .wp-firebase-pb .card h3{ margin:0 0 10px; font-size:1.12rem; color:#0f172a; }\n    .wp-firebase-pb .card p{ margin:0; font-size:.96rem; color:#334155; line-height:1.62; }<\/p>\n<p>    \/* Color helpers (same palette) *\/\n    .bg-blue { border-left-color:#0ea5e9 !important; background:#f0f9ff !important; }\n    .bg-green{ border-left-color:#10b981 !important; background:#f0fdf4 !important; }\n    .bg-amber{ border-left-color:#f59e0b !important; background:#fffbeb !important; }\n    .bg-violet{ border-left-color:#8b5cf6 !important; background:#f5f3ff !important; }\n    .bg-rose{ border-left-color:#ef4444 !important; background:#fff1f2 !important; }\n    .bg-cyan{ border-left-color:#06b6d4 !important; background:#ecfeff !important; }\n    .bg-lime{ border-left-color:#16a34a !important; background:#f0fdf4 !important; }\n    .bg-orange{ border-left-color:#f97316 !important; background:#fff7ed !important; }\n    .bg-indigo{ border-left-color:#6366f1 !important; background:#eef2ff !important; }\n    .bg-emerald{ border-left-color:#22c55e !important; background:#ecfdf5 !important; }\n    .bg-slate{ border-left-color:#334155 !important; background:#f8fafc !important; }<\/p>\n<p>    \/* Utilities *\/\n    .tight ul{ margin:0; padding-left:18px; }\n    .tight li{ margin:4px 0; }\n    .mono{ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }\n    .kbd{ background:#e5e7eb; border:1px solid #cbd5e1; padding:1px 6px; border-radius:6px; font-family:ui-monospace,monospace; font-size:.88em; }\n    .muted{ color:#64748b; }\n    .wp-firebase-pb code{ background:#f1f5f9; padding:0 4px; border-radius:4px; border:1px solid #e2e8f0; }\n    .wp-firebase-pb pre{ background:#f5f5f5; color:#111827; border:1px solid #e5e7eb; padding:12px; border-radius:8px; overflow:auto; font-size:.92rem; line-height:1.55; }\n    .q{font-weight:700;}\n    .qa p{ margin:8px 0; }\n    .qa b{ color:#0f172a; }\n  <\/style>\n<div class=\"wp-firebase-pb\">\n<div class=\"heading\">\n<h2>Firebase (GCP) Pocket Book \u2014 Uplatz<\/h2>\n<p>    50 deep-dive flashcards \u2022 Wide layout \u2022 Fewer scrolls \u2022 20+ Interview Q&amp;A \u2022 Readable JS\/TS examples\n  <\/p><\/div>\n<div class=\"grid\">\n    <!-- ===================== SECTION 1 ===================== --><\/p>\n<div class=\"section-title\">Section 1 \u2014 Fundamentals<\/div>\n<div class=\"card bg-blue\">\n<h3>1) What is Firebase?<\/h3>\n<p>      Firebase is a Google\u2011backed platform for building web\/mobile apps quickly: Auth, Firestore\/Realtime DB, Storage, Cloud Functions, Hosting, Analytics, Remote Config, FCM, and more. It integrates tightly with Google Cloud.<\/p>\n<pre><code class=\"mono\">npm i firebase # Web v9 modular SDK\r\nnpm i firebase-admin # Admin SDK (Node server)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-green\">\n<h3>2) Firebase vs Google Cloud<\/h3>\n<p>      Firebase provides developer\u2011friendly SDKs, hosted services, and managed security rules; Google Cloud offers granular primitives (Cloud Run, Pub\/Sub, IAM). You can mix: e.g., Firebase Auth + Cloud Run API + Firestore.<\/p>\n<pre><code class=\"mono\"># Link Firebase project to GCP billing &amp; BigQuery export<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-amber\">\n<h3>3) Projects &amp; Environments<\/h3>\n<p>      Create separate Firebase projects per environment (dev\/stage\/prod). Use <span class=\"mono\">projectId<\/span> aliases and per\u2011env config files.<\/p>\n<pre><code class=\"mono\">firebase use --add # add dev\/stage\/prod aliases\r\nfirebase use prod<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-violet\">\n<h3>4) Web SDK v9 (Modular)<\/h3>\n<p>      Initialize the app and use tree\u2011shakable imports.<\/p>\n<pre><code class=\"mono\">import { initializeApp } from 'firebase\/app'\r\nimport { getAuth } from 'firebase\/auth'\r\nconst app = initializeApp({ apiKey: '\u2026', authDomain: '\u2026', projectId: '\u2026' })\r\nconst auth = getAuth(app)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-rose\">\n<h3>5) CLI &amp; Emulator Suite<\/h3>\n<p>      Use <span class=\"mono\">firebase-tools<\/span> for deploys and local development with emulators for Auth, Firestore, Functions, Storage, Hosting.<\/p>\n<pre><code class=\"mono\">npm i -g firebase-tools\r\nfirebase init\r\nfirebase emulators:start<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-cyan\">\n<h3>6) Authentication Overview<\/h3>\n<p>      Supports email\/password, phone, OAuth providers (Google\/GitHub), SAML\/OIDC, anonymous. Secure client SDKs plus Admin SDK for server tasks.<\/p>\n<pre><code class=\"mono\">import { signInWithEmailAndPassword } from 'firebase\/auth'<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-lime\">\n<h3>7) Firestore vs Realtime DB<\/h3>\n<p>      Firestore is document\/collection, strong consistency, compound queries, scalable; Realtime DB is JSON tree, low\u2011latency realtime sync, simpler queries. Choose by data shape and latency needs.<\/p>\n<pre><code class=\"mono\"># Firestore collections\/docs vs RTDB paths<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-orange\">\n<h3>8) Storage<\/h3>\n<p>      Firebase Storage uses Google Cloud Storage under the hood; store files with resumable uploads and security rules.<\/p>\n<pre><code class=\"mono\">import { getStorage, ref, uploadBytes } from 'firebase\/storage'<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-indigo\">\n<h3>9) Cloud Functions (Gen 2)<\/h3>\n<p>      Serverless functions on Google\u2019s infra. Gen2 uses Cloud Run\/Events; supports concurrency and regional control.<\/p>\n<pre><code class=\"mono\">npm i -D firebase-functions firebase-admin<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-emerald\">\n<h3>10) Q&amp;A \u2014 \u201cWhen should I pick Firebase?\u201d<\/h3>\n<p>      <span class=\"q\">Answer:<\/span> When you want rapid delivery with managed auth\/data\/storage, strong client SDKs, and realtime features. If you need bespoke VPCs, custom runtimes, or heavy CPU, mix with Cloud Run\/GKE.\n    <\/div>\n<p>    <!-- ===================== SECTION 2 ===================== --><\/p>\n<div class=\"section-title\">Section 2 \u2014 Auth, Firestore &amp; Realtime Database<\/div>\n<div class=\"card bg-blue\">\n<h3>11) Auth Providers<\/h3>\n<p>      Enable providers in Console and use modular APIs on the client.<\/p>\n<pre><code class=\"mono\">import { GoogleAuthProvider, signInWithPopup } from 'firebase\/auth'\r\nconst provider = new GoogleAuthProvider()\r\nawait signInWithPopup(auth, provider)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-green\">\n<h3>12) Auth State &amp; Persistence<\/h3>\n<p>      Listen for user changes and set persistence (<span class=\"mono\">local<\/span>, <span class=\"mono\">session<\/span>, <span class=\"mono\">none<\/span>).<\/p>\n<pre><code class=\"mono\">import { onAuthStateChanged, setPersistence, browserLocalPersistence } from 'firebase\/auth'\r\nawait setPersistence(auth, browserLocalPersistence)\r\nonAuthStateChanged(auth, (u) =&gt; console.log(u?.uid))<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-amber\">\n<h3>13) Custom Claims &amp; Roles<\/h3>\n<p>      Use Admin SDK to set custom claims for RBAC; read them on the client and enforce via rules.<\/p>\n<pre><code class=\"mono\">\/\/ Node server (Admin)\r\nimport admin from 'firebase-admin'\r\nadmin.initializeApp()\r\nawait admin.auth().setCustomUserClaims(uid, { role: 'admin' })<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-violet\">\n<h3>14) Firestore Data Model<\/h3>\n<p>      Organize data as collections of documents with subcollections; avoid unbounded arrays and large docs.<\/p>\n<pre><code class=\"mono\">import { getFirestore, collection, addDoc } from 'firebase\/firestore'\r\nconst db = getFirestore(app)\r\nawait addDoc(collection(db, 'users'), { email, createdAt: Date.now() })<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-rose\">\n<h3>15) Queries &amp; Indexes<\/h3>\n<p>      Compound queries require composite indexes; use limits and cursors for pagination.<\/p>\n<pre><code class=\"mono\">import { query, where, orderBy, limit, getDocs } from 'firebase\/firestore'\r\nconst q = query(collection(db,'orders'), where('status','==','paid'), orderBy('createdAt','desc'), limit(20))\r\nconst snap = await getDocs(q)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-cyan\">\n<h3>16) Transactions &amp; Batched Writes<\/h3>\n<p>      Keep transactions small; batched writes allow atomic multi\u2011doc updates.<\/p>\n<pre><code class=\"mono\">import { writeBatch, doc } from 'firebase\/firestore'\r\nconst batch = writeBatch(db)\r\nbatch.update(doc(db,'users',uid), { plan:'pro' })\r\nbatch.set(doc(db,'logs',id), { type:'upgrade' })\r\nawait batch.commit()<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-lime\">\n<h3>17) Firestore Security Rules (Basics)<\/h3>\n<p>      Rules gate read\/write based on auth and document data; test with the emulator.<\/p>\n<pre><code class=\"mono\">rules_version = '2';\r\nservice cloud.firestore { match \/databases\/{db}\/documents {\r\n  match \/users\/{uid} {\r\n    allow read: if request.auth != null &amp;&amp; request.auth.uid == uid;\r\n    allow write: if false; \/\/ write via Cloud Functions only\r\n  }\r\n} }<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-orange\">\n<h3>18) Realtime Database Basics<\/h3>\n<p>      Low\u2011latency JSON tree; great for presence\/chat. Structure with shallow paths and fan\u2011out writes.<\/p>\n<pre><code class=\"mono\">import { getDatabase, ref, onValue } from 'firebase\/database'\r\nconst rtdb = getDatabase(app)\r\nonValue(ref(rtdb,'presence\/'+uid), (snap) =&gt; console.log(snap.val()))<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-indigo\">\n<h3>19) Offline &amp; Caching<\/h3>\n<p>      Firestore SDK supports offline persistence (web\/mobile). Handle merge conflicts on reconnect.<\/p>\n<pre><code class=\"mono\">import { enableIndexedDbPersistence } from 'firebase\/firestore'\r\ntry { await enableIndexedDbPersistence(db) } catch(e){ \/* tabs? *\/ }<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-emerald\">\n<h3>20) Q&amp;A \u2014 \u201cHow to control Firestore costs?\u201d<\/h3>\n<p>      <span class=\"q\">Answer:<\/span> Denormalize for fewer reads, use <b>selective<\/b> queries and <b>limits<\/b>, cache on the client, stream with listeners only when needed, and batch writes. Prefer Cloud Functions for server\u2011side aggregation.\n    <\/div>\n<p>    <!-- ===================== SECTION 3 ===================== --><\/p>\n<div class=\"section-title\">Section 3 \u2014 Functions, Storage, Messaging, Hosting<\/div>\n<div class=\"card bg-blue\">\n<h3>21) Cloud Functions Triggers<\/h3>\n<p>      HTTP, callable, Firestore\/RTDB triggers, Storage, Auth, Pub\/Sub, and scheduled functions.<\/p>\n<pre><code class=\"mono\">\/\/ functions\/src\/index.ts\r\nimport * as functions from 'firebase-functions\/v2'\r\nimport * as logger from 'firebase-functions\/logger'\r\nexport const hello = functions.https.onRequest((req, res) =&gt; {\r\n  logger.info('hello'); res.json({ ok:true })\r\n})<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-green\">\n<h3>22) Gen 2 Options<\/h3>\n<p>      Choose region, memory, concurrency, min instances to reduce cold starts.<\/p>\n<pre><code class=\"mono\">export const api = functions.https.onRequest({ region:'asia-south1', memory:'512MiB', minInstances:1, concurrency:80 }, handler)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-amber\">\n<h3>23) Callable vs HTTP<\/h3>\n<p>      <b>Callable<\/b> simplifies auth &amp; client errors; <b>HTTP<\/b> is flexible for external clients.<\/p>\n<pre><code class=\"mono\">export const addNote = functions.https.onCall(async (data, ctx) =&gt; {\r\n  if(!ctx.auth) throw new functions.https.HttpsError('unauthenticated','login')\r\n  return { id: await createNote(ctx.auth.uid, data) }\r\n})<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-violet\">\n<h3>24) Pub\/Sub &amp; Schedules<\/h3>\n<p>      Schedule CRON\u2011like tasks or process topics.<\/p>\n<pre><code class=\"mono\">export const nightly = functions.scheduler.onSchedule('0 18 * * *', () =&gt; cleanup())<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-rose\">\n<h3>25) Storage Uploads &amp; Rules<\/h3>\n<p>      Validate file types, sizes, and paths via Storage rules; generate signed URLs in Admin code.<\/p>\n<pre><code class=\"mono\">import { getStorage, ref, uploadBytes } from 'firebase\/storage'\r\nconst storage = getStorage(app)\r\nawait uploadBytes(ref(storage, `avatars\/${uid}.jpg`), file)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-cyan\">\n<h3>26) Firebase Cloud Messaging (FCM)<\/h3>\n<p>      Send push notifications to devices\/topics; use the Admin SDK from servers.<\/p>\n<pre><code class=\"mono\">await admin.messaging().send({ token, notification:{ title:'Hi', body:'Welcome!' } })<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-lime\">\n<h3>27) Hosting Basics<\/h3>\n<p>      Global CDN, automatic SSL, SPA rewrites. Use <span class=\"mono\">firebase.json<\/span> for config.<\/p>\n<pre><code class=\"mono\">{\r\n  \"hosting\": { \"public\": \"dist\", \"ignore\": [\"**\/.*\"], \"rewrites\": [{\"source\":\"**\",\"destination\":\"\/index.html\"}] }\r\n}<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-orange\">\n<h3>28) SSR with Hosting + Functions\/Run<\/h3>\n<p>      Use Hosting rewrites to an SSR endpoint in Functions or Cloud Run.<\/p>\n<pre><code class=\"mono\">{\r\n  \"hosting\": { \"rewrites\": [{ \"source\": \"**\", \"function\": \"ssr\" }] }\r\n}<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-indigo\">\n<h3>29) App Check<\/h3>\n<p>      Protect resources from abuse by attesting app integrity (DeviceCheck\/Play Integrity\/recaptcha\u2011v3). Enforce on Firestore\/Storage\/Functions.<\/p>\n<pre><code class=\"mono\">import { initializeAppCheck, ReCaptchaV3Provider } from 'firebase\/app-check'\r\ninitializeAppCheck(app, { provider: new ReCaptchaV3Provider('site-key'), isTokenAutoRefreshEnabled: true })<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-emerald\">\n<h3>30) Q&amp;A \u2014 \u201cReduce cold starts?\u201d<\/h3>\n<p>      <span class=\"q\">Answer:<\/span> Use Gen2 with <b>minInstances &gt; 0<\/b>, regional proximity (e.g., <span class=\"kbd\">asia-south1<\/span> for India), smaller bundles, and keep dependencies lean.\n    <\/div>\n<p>    <!-- ===================== SECTION 4 ===================== --><\/p>\n<div class=\"section-title\">Section 4 \u2014 Analytics, Remote Config, Testing &amp; CI\/CD<\/div>\n<div class=\"card bg-blue\">\n<h3>31) Analytics &amp; BigQuery<\/h3>\n<p>      Enable Google Analytics for Firebase to track events; export raw events to BigQuery for analysis\/ML.<\/p>\n<pre><code class=\"mono\"># Query GA4 export tables in BigQuery for funnels\/retention<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-green\">\n<h3>32) Remote Config<\/h3>\n<p>      Feature flags and parameterization with conditions (country, app version, user property).<\/p>\n<pre><code class=\"mono\">import { getRemoteConfig, fetchAndActivate, getValue } from 'firebase\/remote-config'\r\nconst rc = getRemoteConfig(app)\r\nawait fetchAndActivate(rc)\r\nconst isNewUI = getValue(rc,'new_ui').asBoolean()<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-amber\">\n<h3>33) A\/B Testing<\/h3>\n<p>      Combine Remote Config with A\/B Testing to evaluate variants on metrics like retention, revenue, or conversions.<\/p>\n<pre><code class=\"mono\"># Configure experiments in the console; read params via Remote Config<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-violet\">\n<h3>34) Performance Monitoring<\/h3>\n<p>      Track app start, HTTP latency, and custom traces; investigate slow endpoints.<\/p>\n<pre><code class=\"mono\">\/\/ web perf monitoring SDK (when applicable)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-rose\">\n<h3>35) Emulator Suite<\/h3>\n<p>      Develop offline with local Auth\/Firestore\/Functions\/Storage; seed data and run tests.<\/p>\n<pre><code class=\"mono\">export FIREBASE_EMULATORS_HOST=localhost:4000<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-cyan\">\n<h3>36) Testing Security Rules<\/h3>\n<p>      Use the rules unit testing library with the emulator to verify allow\/deny scenarios.<\/p>\n<pre><code class=\"mono\">import { initializeTestEnvironment } from '@firebase\/rules-unit-testing'<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-lime\">\n<h3>37) Unit Test Functions<\/h3>\n<p>      Mock context and assert responses; prefer small, pure modules.<\/p>\n<pre><code class=\"mono\">\/\/ jest.config.js &amp; firebase-functions-test for v1; for v2 test handler modules<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-orange\">\n<h3>38) CI\/CD with GitHub Actions<\/h3>\n<p>      Automate deploys with environment targets and preview channels.<\/p>\n<pre><code class=\"mono\">- uses: FirebaseExtended\/action-hosting-deploy@v0\r\n  with: { channelId: 'preview', projectId: 'your-app' }<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-indigo\">\n<h3>39) Multiple Projects &amp; Tenants<\/h3>\n<p>      Support multiple Firebase projects in one codebase using environment files and <span class=\"mono\">initializeApp<\/span> per tenant.<\/p>\n<pre><code class=\"mono\">const appA = initializeApp(cfgA, 'A')\r\nconst appB = initializeApp(cfgB, 'B')<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-emerald\">\n<h3>40) Q&amp;A \u2014 \u201cMigrate beyond Firebase?\u201d<\/h3>\n<p>      <span class=\"q\">Answer:<\/span> Keep IDs stable, export Firestore to GCS, mirror traffic, then cut over to Cloud Run\/Bigtable\/Spanner as needed. Use Pub\/Sub for dual\u2011write during transition.\n    <\/div>\n<p>    <!-- ===================== SECTION 5 ===================== --><\/p>\n<div class=\"section-title\">Section 5 \u2014 Ops, Security, Limits, Extensions &amp; Interview Q&amp;A<\/div>\n<div class=\"card bg-blue\">\n<h3>41) Pricing &amp; Quotas<\/h3>\n<p>      Firestore charges per document read\/write\/storage; Functions per GB\u2011s &amp; invocations; Storage per GB\/month &amp; egress; FCM free. Monitor usage and set budgets\/alerts in Cloud Billing.<\/p>\n<pre><code class=\"mono\"># Use Cost Table + Budgets &amp; Alerts in GCP console<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-green\">\n<h3>42) Monitoring &amp; Logs<\/h3>\n<p>      Use Cloud Logging\/Monitoring dashboards; add structured logs in Functions and trace IDs.<\/p>\n<pre><code class=\"mono\">import * as logger from 'firebase-functions\/logger'\r\nlogger.info('event', { user: uid })<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-amber\">\n<h3>43) Secrets Management<\/h3>\n<p>      Store secrets in Google Secret Manager; access via Functions runtime and do not commit to repo.<\/p>\n<pre><code class=\"mono\">export const api = functions.https.onRequest({ secrets: ['STRIPE_KEY'] }, (req,res) =&gt; {...})<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-violet\">\n<h3>44) Backups &amp; Exports<\/h3>\n<p>      Export Firestore collections to GCS; schedule periodic exports.<\/p>\n<pre><code class=\"mono\">gcloud firestore export gs:\/\/my-bucket\/backup_$(date +%F)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-rose\">\n<h3>45) Privacy &amp; Compliance<\/h3>\n<p>      Use user deletion APIs, data retention policies, and regional resources; document processing of PII and obtain consent where required.<\/p>\n<pre><code class=\"mono\">await admin.auth().deleteUser(uid)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-cyan\">\n<h3>46) Firebase Extensions<\/h3>\n<p>      Prebuilt functions for tasks like image resize, full\u2011text search (with Algolia), payments. Review quotas and costs.<\/p>\n<pre><code class=\"mono\"># Install via Console or CLI; configure parameters per env<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-lime\">\n<h3>47) Common Pitfalls<\/h3>\n<p>      Over\u2011listening to collections, unbounded queries, writing from the client without rules, storing secrets in client code, and ignoring indexes.<\/p>\n<pre><code class=\"mono\"># Prefer server-side privileged operations via Admin SDK<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-orange tight\">\n<h3>48) Production Checklist<\/h3>\n<ul>\n<li>Per\u2011env Firebase projects &amp; configs<\/li>\n<li>Security rules with unit tests &amp; emulator<\/li>\n<li>Indexing strategy &amp; pagination<\/li>\n<li>Budgets\/alerts, logs &amp; metrics<\/li>\n<li>Functions gen2 with regional settings<\/li>\n<li>Backups\/exports and data governance<\/li>\n<\/ul><\/div>\n<div class=\"card bg-indigo\">\n<h3>49) Example App Skeleton<\/h3>\n<p>      Minimal web app + functions layout for clarity and CI friendliness.<\/p>\n<pre><code class=\"mono\">\/web\r\n  src\/main.ts  # init app\/auth\/firestore\r\n\/functions\r\n  src\/index.ts # https routes, triggers\r\nfirebase.json\r\n.firebaserc<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-emerald qa\">\n<h3>50) Interview Q&amp;A \u2014 20 Practical Questions (Firebase\u2011focused)<\/h3>\n<p>      <b>1) Why Firebase for startups?<\/b> Rapid prototyping, managed backend, strong client SDKs.<br \/>\n      <br \/><b>2) Firestore vs RTDB?<\/b> Documents vs JSON tree; queries vs realtime simplicity.<br \/>\n      <br \/><b>3) How to secure writes?<\/b> Security rules + callable\/HTTP functions; avoid direct privileged writes from clients.<br \/>\n      <br \/><b>4) Control costs?<\/b> Denormalize, indexes, limits, caching, server aggregation.<br \/>\n      <br \/><b>5) What is App Check?<\/b> Attestation to reduce abuse; enforce on resources.<br \/>\n      <br \/><b>6) Callable vs HTTP?<\/b> Callable simplifies auth\/errors for trusted clients; HTTP for public\/external.<br \/>\n      <br \/><b>7) Offline support?<\/b> Firestore offline cache; careful with conflict resolution.<br \/>\n      <br \/><b>8) When to use Admin SDK?<\/b> Server\u2011side privileged tasks (claims, batch ops, CRON).<br \/>\n      <br \/><b>9) How to handle files?<\/b> Storage with rules; process via functions; generate signed URLs.<br \/>\n      <br \/><b>10) Multi\u2011region?<\/b> Choose nearest region; understand replication &amp; egress.<br \/>\n      <br \/><b>11) Backups?<\/b> Firestore export to GCS; verify restores.<br \/>\n      <br \/><b>12) Auth providers tradeoffs?<\/b> Simplicity vs friction (email\/phone vs OAuth).<br \/>\n      <br \/><b>13) Index management?<\/b> Define in firestore.indexes.json; deploy with CLI.<br \/>\n      <br \/><b>14) Testing rules?<\/b> Emulator + rules unit tests.<br \/>\n      <br \/><b>15) What causes cold starts?<\/b> Zero instances, large deps; mitigate with minInstances.<br \/>\n      <br \/><b>16) BigQuery export?<\/b> For Analytics\/Crashlytics; advanced reporting.<br \/>\n      <br \/><b>17) Rate limiting?<\/b> Via rules validations, Functions middleware, or API gateways.<br \/>\n      <br \/><b>18) GDPR\/PII?<\/b> Data minimization, consent, deletion APIs, regionality.<br \/>\n      <br \/><b>19) Extensions?<\/b> Prebuilt automations\u2014evaluate cost and fit.<br \/>\n      <br \/><b>20) When not to use Firebase?<\/b> Very complex transactional workloads, massive analytical queries\u2014consider Cloud SQL\/Spanner\/BigQuery.\n    <\/div>\n<\/p><\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Firebase (GCP) Pocket Book \u2014 Uplatz 50 deep-dive flashcards \u2022 Wide layout \u2022 Fewer scrolls \u2022 20+ Interview Q&amp;A \u2022 Readable JS\/TS examples Section 1 \u2014 Fundamentals 1) What is <span class=\"readmore\"><a href=\"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/\">Read More &#8230;<\/a><\/span><\/p>\n","protected":false},"author":2,"featured_media":4835,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2550,2462],"tags":[],"class_list":["post-4829","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-firebase","category-pocket-book"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Firebase (GCP) Pocket Book | Uplatz Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Firebase (GCP) Pocket Book | Uplatz Blog\" \/>\n<meta property=\"og:description\" content=\"Firebase (GCP) Pocket Book \u2014 Uplatz 50 deep-dive flashcards \u2022 Wide layout \u2022 Fewer scrolls \u2022 20+ Interview Q&amp;A \u2022 Readable JS\/TS examples Section 1 \u2014 Fundamentals 1) What is Read More ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/\" \/>\n<meta property=\"og:site_name\" content=\"Uplatz Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Uplatz-1077816825610769\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-26T13:26:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-27T02:31:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"uplatzblog\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@uplatz_global\" \/>\n<meta name=\"twitter:site\" content=\"@uplatz_global\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"uplatzblog\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/\"},\"author\":{\"name\":\"uplatzblog\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/person\\\/8ecae69a21d0757bdb2f776e67d2645e\"},\"headline\":\"Firebase (GCP) Pocket Book\",\"datePublished\":\"2025-08-26T13:26:06+00:00\",\"dateModified\":\"2025-08-27T02:31:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/\"},\"wordCount\":1230,\"publisher\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/3.png\",\"articleSection\":[\"Firebase\",\"Pocket Book\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/\",\"name\":\"Firebase (GCP) Pocket Book | Uplatz Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/3.png\",\"datePublished\":\"2025-08-26T13:26:06+00:00\",\"dateModified\":\"2025-08-27T02:31:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/#primaryimage\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/3.png\",\"contentUrl\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/3.png\",\"width\":1280,\"height\":720,\"caption\":\"Firebase Pocket Book\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/firebase-gcp-pocket-book\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Firebase (GCP) Pocket Book\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/\",\"name\":\"Uplatz Blog\",\"description\":\"Uplatz is a global IT Training &amp; Consulting company\",\"publisher\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#organization\",\"name\":\"uplatz.com\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/11\\\/Uplatz-Logo-Copy-2.png\",\"contentUrl\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/11\\\/Uplatz-Logo-Copy-2.png\",\"width\":1280,\"height\":800,\"caption\":\"uplatz.com\"},\"image\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Uplatz-1077816825610769\\\/\",\"https:\\\/\\\/x.com\\\/uplatz_global\",\"https:\\\/\\\/www.instagram.com\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/7956715?trk=tyah&amp;amp;amp;amp;trkInfo=clickedVertical:company,clickedEntityId:7956715,idx:1-1-1,tarId:1464353969447,tas:uplatz\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/person\\\/8ecae69a21d0757bdb2f776e67d2645e\",\"name\":\"uplatzblog\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g\",\"caption\":\"uplatzblog\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Firebase (GCP) Pocket Book | Uplatz Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/","og_locale":"en_US","og_type":"article","og_title":"Firebase (GCP) Pocket Book | Uplatz Blog","og_description":"Firebase (GCP) Pocket Book \u2014 Uplatz 50 deep-dive flashcards \u2022 Wide layout \u2022 Fewer scrolls \u2022 20+ Interview Q&amp;A \u2022 Readable JS\/TS examples Section 1 \u2014 Fundamentals 1) What is Read More ...","og_url":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/","og_site_name":"Uplatz Blog","article_publisher":"https:\/\/www.facebook.com\/Uplatz-1077816825610769\/","article_published_time":"2025-08-26T13:26:06+00:00","article_modified_time":"2025-08-27T02:31:11+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3.png","type":"image\/png"}],"author":"uplatzblog","twitter_card":"summary_large_image","twitter_creator":"@uplatz_global","twitter_site":"@uplatz_global","twitter_misc":{"Written by":"uplatzblog","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/#article","isPartOf":{"@id":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/"},"author":{"name":"uplatzblog","@id":"https:\/\/uplatz.com\/blog\/#\/schema\/person\/8ecae69a21d0757bdb2f776e67d2645e"},"headline":"Firebase (GCP) Pocket Book","datePublished":"2025-08-26T13:26:06+00:00","dateModified":"2025-08-27T02:31:11+00:00","mainEntityOfPage":{"@id":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/"},"wordCount":1230,"publisher":{"@id":"https:\/\/uplatz.com\/blog\/#organization"},"image":{"@id":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/#primaryimage"},"thumbnailUrl":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3.png","articleSection":["Firebase","Pocket Book"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/","url":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/","name":"Firebase (GCP) Pocket Book | Uplatz Blog","isPartOf":{"@id":"https:\/\/uplatz.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/#primaryimage"},"image":{"@id":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/#primaryimage"},"thumbnailUrl":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3.png","datePublished":"2025-08-26T13:26:06+00:00","dateModified":"2025-08-27T02:31:11+00:00","breadcrumb":{"@id":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/#primaryimage","url":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3.png","contentUrl":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/3.png","width":1280,"height":720,"caption":"Firebase Pocket Book"},{"@type":"BreadcrumbList","@id":"https:\/\/uplatz.com\/blog\/firebase-gcp-pocket-book\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/uplatz.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Firebase (GCP) Pocket Book"}]},{"@type":"WebSite","@id":"https:\/\/uplatz.com\/blog\/#website","url":"https:\/\/uplatz.com\/blog\/","name":"Uplatz Blog","description":"Uplatz is a global IT Training &amp; Consulting company","publisher":{"@id":"https:\/\/uplatz.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/uplatz.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/uplatz.com\/blog\/#organization","name":"uplatz.com","url":"https:\/\/uplatz.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/uplatz.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2016\/11\/Uplatz-Logo-Copy-2.png","contentUrl":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2016\/11\/Uplatz-Logo-Copy-2.png","width":1280,"height":800,"caption":"uplatz.com"},"image":{"@id":"https:\/\/uplatz.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Uplatz-1077816825610769\/","https:\/\/x.com\/uplatz_global","https:\/\/www.instagram.com\/","https:\/\/www.linkedin.com\/company\/7956715?trk=tyah&amp;amp;amp;amp;trkInfo=clickedVertical:company,clickedEntityId:7956715,idx:1-1-1,tarId:1464353969447,tas:uplatz"]},{"@type":"Person","@id":"https:\/\/uplatz.com\/blog\/#\/schema\/person\/8ecae69a21d0757bdb2f776e67d2645e","name":"uplatzblog","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g","caption":"uplatzblog"}}]}},"_links":{"self":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts\/4829","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/comments?post=4829"}],"version-history":[{"count":3,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts\/4829\/revisions"}],"predecessor-version":[{"id":4859,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts\/4829\/revisions\/4859"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/media\/4835"}],"wp:attachment":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/media?parent=4829"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/categories?post=4829"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/tags?post=4829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}