Bumble logo

Bumble

We’re the tech team behind social networking apps Bumble and Badoo. Our products help millions of people build meaningful connections around the world.

Try:
Bumble logo
Bumble

Scaling iOS at Bumble: Part 3/3 — Results and Developer Quality of Life

Bumble evaluated SPM, Tuist and Bazel for scaling their iOS projects and chose Tuist as the best balance of low disruption, Swift-based familiarity, and performance. They migrated in Q2 2023, simplified modularisation, drastically reduced xcconfig sprawl, and set up processes to track tuist generate performance and enforce modular architecture. Tuist did not automatically improve build times, but enabled better modularisation and caching options; the migration was considered successful with positive developer feedback.

Bumble logo
Bumble

Refining Compose API for design systems

A technical walkthrough of API design patterns for Jetpack Compose design-system components (using a NavigationBar example). The article compares restrictive vs. relaxed (slot) APIs and shows how Defaults objects plus scoped lambdas (per-slot scopes and scope classes) can improve extensibility, scoping, discoverability and avoid global API pollution.

Bumble logo
Bumble

Scaling iOS at Bumble: Part 2/3 — The Assessment

Bumble evaluates three ways to scale an iOS monorepo: Swift Package Manager (SPM), Tuist, and Bazel. They describe their PoC process, a module-converter tool to generate manifests, and a simulation technique (cloning modules) to measure future growth effects. Results: SPM integrates tightly with Xcode but introduces frequent interactive package/graph resolution that hurts everyday responsiveness; Tuist (a project generator) avoids repeated in-Xcode resolution by making generation an explicit step and shows predictable, cached performance; Bazel delivers strong caching and raw performance but has a steep learning curve and requires selecting and integrating rule sets (rules_xcodeproj recommended). The next post promises to reveal their final decision and migration results.

Bumble logo
Bumble

Crafting Android bytecode analysis tooling using a secret ingredient (Part 1)

A technical tutorial showing how to inspect Android .dex files and build a small JVM tool (Kotlin/Java) to diff classes between APK/AAB builds. It demonstrates using apkanalyzer (apkparser), smali-dexlib2 and R8/Retracer (ProGuard mapping) to detect added/removed classes despite obfuscation, and suggests integrating the analysis as a Gradle plugin in CI to catch debug leaks or unwanted obfuscation changes.

Bumble logo
Bumble

Scaling iOS at Bumble: Part 1/3 — The Challenges

This first post in a three-part series describes Bumble's iOS scaling challenges: Xcode performance degradation on a large monorepo, heavy custom tooling around .pbxproj/XcodeProj, friction when modularising, and goals to reduce custom tooling, improve modularity and open the door to faster builds. The team evaluated Swift Package Manager (SPM), Tuist and Bazel as potential solutions; subsequent posts will cover investigations and choices.

Bumble logo
Bumble

Crash course on the Android UI layer | Part 2

Part 2 of a crash course on the Android UI layer focused on state holders and saving UI state. It explains types of logic (business vs UI), when to use androidX.ViewModel as a screen-level state holder, when to introduce plain state holder classes (especially with Jetpack Compose), patterns for hoisting state, handling large ViewModels, and options for surviving configuration changes and process death (SavedState APIs, persistent storage). The post also covers related best practices and testing gotchas (viewModelScope and MainDispatcher), and mentions integrations with Jetpack Navigation and Hilt.

Bumble logo
Bumble

Crash course on the Android UI layer | Part 1

Part 1 of a crash course on the Android UI layer: explains UI vs UI state vs optional state-holders, unidirectional data flow, how to model/produce/observe UI state (examples using Kotlin), and lifecycle-aware collection using StateFlow/Flow/LiveData and lifecycle helpers for both Android Views and Jetpack Compose.

Bumble logo
Bumble

Live Mosaic at Droidcon London 2023

Bumble Tech’s Live Mosaic was an open-source, cross-platform interactive installation showcased at Droidcon London 2023. Built with Appyx and Compose Multiplatform, it provided a collaborative message wall, dynamic mosaics, custom Composables, and a web webcast. The post covers implementation highlights (custom mosaic component, Appyx-driven navigation/transitions), links to repositories and talks, and examples of community-created composables.

Bumble logo
Bumble

Dataset in a day

Bumble describes a clustering-based workflow to build large labeled computer-vision datasets quickly: compute CLIP embeddings, cluster images in latent space, auto-caption cluster members with CoCa, summarize captions with the Buzzwords library, then label whole clusters to create a dataset. They used this approach to assemble ~1M clustered photos (221,385 images used for training across labeled clusters) and trained a ResNet50 multi-label classifier (binary cross-entropy loss, early stopping), showing improved performance with more auto-clustered data and privacy benefits by avoiding inspection of every image.

Bumble logo
Bumble

An Android Developer’s Introduction to Machine Learning

An Android developer’s beginner-friendly introduction to machine learning covering supervised/unsupervised/reinforcement learning, practical data gathering (Kaggle, CSV, APIs), model training and testing (recommends TensorFlow), and tips for Android/mobile developers starting with ML.

Bumble logo
Bumble

How to compare .apk /.aab files | Part 2

Technical guide showing how to compare Android .apk/.aab artifacts by analyzing dependency graph output, reporting added/removed/changed dependencies, and adding licence and CVE checks. The article includes Kotlin code examples (parsing Gradle plugin JSON with kotlinx.serialization), fetching/parsing pom.xml via ktor + Jackson, using tools like DependencyCheck for vulnerability analysis, and recommends CI integration to surface these checks on feature branches.

Bumble logo
Bumble

Understanding Publishers in SwiftUI and Combine

A practical tutorial on Combine publishers for SwiftUI app development: explains CurrentValueSubject, PassthroughSubject, and Just with code samples, shows sink/send and completion handling, and demonstrates using Just with AnyPublisher, setFailureType, receive(on: DispatchQueue.main), and eraseToAnyPublisher in an image-caching example.

Bumble logo
Bumble

Appyx 2.0 — Gesture-driven navigation for Compose Multiplatform

Appyx 2.0 refactors the original model-driven navigation library for Jetpack Compose into three modules—navigation, interactions, and components—while adding first-class gesture control and Compose Multiplatform support. The new interactions module lets developers build stateful, gesture-driven UI components that can plug into Appyx navigation or operate standalone, and the components module offers prebuilt examples like pagers and back-stack implementations.

Bumble logo
Bumble

GPU-powered Kubernetes clusters

A practical guide to enabling and operating NVIDIA GPU workloads on Kubernetes: covers driver installation, the NVIDIA GPU Operator (device plugin, container toolkit, DCGM exporter, feature discovery, MIG manager), MIG partitioning, GPU pod scheduling examples, Prometheus/Grafana monitoring, and scheduler bin-packing (MostAllocated). It also discusses GPU serving vs CPU trade-offs and uses Triton on KServe for model serving.

Bumble logo
Bumble

Your next KServe ML service: gRPC vs JSON-REST

A technical comparison of JSON/REST vs gRPC/protobuf for ML serving using KServe. The article examines text vs binary serialization costs (numeric arrays, images), input validation and type-safety (protobuf vs JSON-schema), KServe GRPC 2.0 design (named tensors), and practical steps to enable gRPC on Kubeflow/KServe (Istio/Knative Gateway, Envoy, HTTP/2, InferenceService constraints). Bumble's guidance: prefer gRPC for high-traffic or many-feature services and REST for quick prototypes.

Bumble logo
Bumble

Evaluation of classification models on unbalanced production data

Bumble describes methodology for comparing classification models (photo-moderation) under highly imbalanced production data. The post reviews confusion-matrix-based metrics and AUC approaches, explains two dataset biasing strategies (photo-based and model-based), shows how to re-weight test results back to production distribution, and outlines how these steps affect automation and safety decisions and opportunities for combining models.

Bumble logo
Bumble

QA — the fire safety specialist for your project. Part 1

Guidance on QA strategy framed as a 'fire safety' analogy. The author defines myths about QA, introduces a SAFE sequence (setup signal system; assess affected areas; facilitate findings/fixes; extend expertise/educate), and emphasizes production telemetry (logs/metrics/alarms), pre-production/release processes (Plan B/rollback), automating test artifacts (mocks, stubs, data generators), and documentation.

Bumble logo
Bumble

Hourglass into Pyramid:

A Bumble iOS QA engineer explains how their test suite shape shifted from an "hourglass" (many end-to-end and unit tests but few integration/component tests) toward a healthier Test Pyramid by migrating suitable end-to-end scenarios down to component and unit levels. The article covers test-level definitions, tooling and frameworks used (XCTest, Calabash/Cucumber on Ruby), playback/recording component-test approach, performance and flakiness improvements, and team practices for planning and maintaining test coverage.

Bumble logo
Bumble

Automating Android Jetpack Compose using Appium

Bumble engineers describe how they added first-class Appium support for Android Jetpack Compose by extending Appium's espresso-driver to use AndroidComposeTestRule and Compose semantics. The post explains why standard Espresso-based automation fails for Compose (Compose uses semantics nodes, not android.view.View), how UiAutomator2 and accessibility interact with Compose, how to toggle Appium to 'compose' mode via the Settings API, sample capabilities and a Ruby example, dependency-workarounds (espressoBuildConfig), and outstanding roadmap items like gesture support.

Bumble logo
Bumble

Multilingual message content moderation at scale

Bumble’s Data Science team describes building the multilingual Rude Message Detector: they adapted XLM-R for a 3-class toxicity classifier trained on ~3M labeled messages across 15+ languages, built a Tensorboard-based offline validation pipeline, re-implemented the SentencePiece tokenizer as a TensorFlow layer, and deployed the model on multi-zone GPU nodes with dynamic batching and centralized monitoring for production-scale moderation.