Firebase vs Supabase
Google's Firebase versus open-source Supabase: developer experience, pricing, vendor lock-in, real-time capabilities, and full-stack feature comparison.
Google's free, lightweight crash-tracking SDK
Error tracking + performance + session replay on one self-hostable platform
The rule of thumb: if the only question you're asking is "when did the app crash" and your budget is zero, go with Crashlytics — setup takes minutes and there's no billing risk. If you want error tracking, performance, and session replay in one panel, or you need to keep data on your own infrastructure for GDPR/data-privacy reasons, Sentry's broader scope earns its cost. Many teams end up running both; if you go that route, measure the impact of the dual SDK on app size and cold-start time in your own build.
| Category | Firebase Crashlytics | Sentry |
|---|---|---|
| Performance | 7/10 | 9/10 |
| Ease of Learning | 9/10 | 6/10 |
| Ecosystem | 6/10 | 9/10 |
| Community | 8/10 | 8/10 |
| Job Market | 6/10 | 7/10 |
| Future-Proof | 7/10 | 8/10 |
// Firebase Crashlytics - Android (Kotlin) setup and non-fatal logging
// build.gradle.kts (app)
// plugins { id("com.google.gms.google-services"); id("com.google.firebase.crashlytics") }
// dependencies { implementation(platform("com.google.firebase:firebase-bom:34.19.0"))
// implementation("com.google.firebase:firebase-crashlytics") }
import com.google.firebase.Firebase
import com.google.firebase.crashlytics.crashlytics
import com.google.firebase.crashlytics.setCustomKeys
class CheckoutViewModel {
private val crashlytics = Firebase.crashlytics
fun onPaymentStarted(orderId: String, amount: Double) {
// Breadcrumb: lets you see which step you were on if a crash occurs
crashlytics.log("payment_started order=$orderId amount=$amount")
crashlytics.setCustomKeys {
key("order_id", orderId)
key("payment_amount", amount)
key("user_tier", "premium")
}
}
fun onPaymentFailed(error: Throwable, orderId: String) {
// Record the error without crashing the app (non-fatal)
crashlytics.setCustomKey("order_id", orderId)
crashlytics.recordException(error)
}
fun identifyUser(userId: String) {
crashlytics.setUserId(userId)
}
}
// AndroidManifest.xml: firebase_crashlytics_collection_enabled=false (enable after consent)
// Runtime: Firebase.crashlytics.setCrashlyticsCollectionEnabled(true)// Sentry - iOS (Swift): error + performance + session replay in one SDK
// Package.swift / SPM: https://github.com/getsentry/sentry-cocoa
import Sentry
func configureSentry() {
SentrySDK.start { options in
options.dsn = "https://<public-key>@o<org-id>.ingest.sentry.io/<project-id>"
options.debug = false
// Performance tracing
options.tracesSampleRate = 0.2
// UI Profiling (sentry-cocoa 9.x): tied to the trace lifecycle
options.configureProfiling = {
$0.lifecycle = .trace
$0.sessionSampleRate = 1.0
}
// Session Replay: records the screen flow leading up to a crash
options.sessionReplay.onErrorSampleRate = 1.0
options.sessionReplay.sessionSampleRate = 0.1
// Screenshot + view hierarchy at the moment of the error
options.attachScreenshot = true
options.attachViewHierarchy = true
}
}
// Breadcrumb + custom context + non-fatal capture
func onPaymentFailed(_ error: Error, orderId: String) {
let crumb = Breadcrumb(level: .error, category: "payment")
crumb.message = "payment_failed order=\(orderId)"
SentrySDK.addBreadcrumb(crumb)
SentrySDK.configureScope { scope in
scope.setTag(value: orderId, key: "order_id")
scope.setUser(User(userId: "u_123"))
}
SentrySDK.capture(error: error)
}
// Automatic dSYM upload (Xcode Run Script Build Phase):
// sentry-cli debug-files upload --include-sources "$DWARF_DSYM_FOLDER_PATH"The rule of thumb: if the only question you're asking is "when did the app crash" and your budget is zero, go with Crashlytics — setup takes minutes and there's no billing risk. If you want error tracking, performance, and session replay in one panel, or you need to keep data on your own infrastructure for GDPR/data-privacy reasons, Sentry's broader scope earns its cost. Many teams end up running both; if you go that route, measure the impact of the dual SDK on app size and cold-start time in your own build.
Get Free ConsultationIf crash tracking alone is enough and the budget has to be zero, use Crashlytics; if you also need performance tracing, session replay, and possibly self-hosting, Sentry is the right call. Both ship SDKs that are easy to set up — the decision comes down to scope and budget.