Skip to content
CAI
Software that uses CAICheck a score

kickstarter/android-oss

60.4

Adequate · 25 September 2026

100.5k

lines of production code

Kotlin

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This is the official Android client for the Kickstarter platform, enabling users to discover projects, manage pledges, and process payments. It features a modernized architecture using Jetpack Compose, GraphQL, and RxJava 2 to handle core flows like project discovery, checkout, and social sharing. The system also includes internal tooling for developers to test features and manage the application's release lifecycle.

How it got here

2015–2017 — Open-source release and modernization

37 changes.

This period marks the initial open-source release of the Kickstarter Android application, establishing the foundational build infrastructure, documentation, and development environment automation. It simultaneously drives a comprehensive architectural modernization, migrating core data models, view holders, and adapters from Java to Kotlin while upgrading the reactive stack to RxJava 2 and introducing a new GraphQL-based API client.

2018–2021 — Modernization and GraphQL migration

35 changes.

This period focused on modernizing the Android codebase by migrating core activities, services, and utilities from Java to Kotlin, while adopting Jetpack ViewModel, ViewBinding, and Jetpack Compose for the UI layer. The team implemented a comprehensive GraphQL API layer to replace previous data-fetching mechanisms, integrating it with Stripe's PaymentSheet for checkout and Braze for push notifications. Additionally, automated release pipelines via Fastlane and robust testing infrastructure, including screenshot tests and mock factories, were established to support these architectural shifts.

2022–2024 — Jetpack Compose migration and rich media support

36 changes.

The project undertook a significant migration of UI screens and components to Jetpack Compose, establishing a new Material 3 design system and replacing legacy XML implementations across key flows like login, search, and pledging. Concurrently, the app enhanced content rendering capabilities by introducing a new HTML parser and rich media view holders to support audio, video, and headers within project campaigns. This period also saw the introduction of new features such as the Pledged Projects Overview and unified feature flag management, supported by extensive test coverage and backend model modernization.

2025–2026 — Video feed and search overhaul

25 changes.

This period focused on introducing major new features, including a vertical Video Feed experience, a dedicated Search and Filter screen, and Project Story components for pre-launch pages. The work involved building new Compose-based UI components, integrating a custom video player, and implementing social sharing with branded project cards. Comprehensive test coverage was added for these new features, alongside stability improvements to the checkout flow and home screen navigation.

Features

Add internal tools and playground infrastructure

The app now includes an internal tools module that provides a mechanism to launch the InternalToolsActivity with specific slide and fade animations, along with a hardcoded basic authorization header. Additionally, a new Playground class has been added to the internal libs package, establishing a placeholder for internal development or testing utilities.

app/src/internal/java/com/kickstarter/libs · high confidence

Added GraphQL scalar adapters for date and time handling

The app now includes dedicated adapters for serializing and deserializing date and time values within GraphQL responses. Specifically, DateAdapter handles standard date strings, while DateTimeAdapter and Iso8601DateTimeAdapter manage timestamp and ISO 8601 formatted datetime strings respectively, ensuring consistent data parsing across the application.

app/src/main/java/com/kickstarter/libs/graphql · high confidence

Added configuration scaffolding for Firebase App Distribution and regression builds

This change introduces example configuration files and stub Java classes to support new build variants and distribution channels. It adds \google-services.example.json\ files for \externalDebug\, \externalRelease\, \internalDebug\, \internalRelease\, \regressionDebug\, and \regressionRelease\ variants, enabling Firebase integration for these specific build types. It also includes \firebase.properties.example\ and \hockey\_app.yml.example\ to configure distribution tokens and app IDs for Firebase App Distribution and HockeyApp. Additionally, it adds \KSWebViewClient.java\ and \WebViewJavascriptInterface.java\ as structural placeholders (with empty method bodies) to support web view interactions and form handling in these new configurations.

config · high confidence

Added debug view for simulating push notifications

A new DebugPushNotificationsView has been added to the internal UI views, providing a set of buttons that allow developers to manually trigger and simulate various push notification events (such as project launches, cancellations, pledges, and messages) directly within the app for testing purposes.

app/src/internal/java/com/kickstarter/ui/views · high confidence

Added social sharing assets for Facebook and Twitter

New SVG icon assets for Facebook and Twitter have been added to the application's asset library. These graphics provide the visual resources required for social sharing functionality, specifically enabling users to share content via these platforms from the app.

assets · high confidence

Automated Android emulator setup for screenshot testing

A suite of shell scripts has been added to the emulator directory to automate the lifecycle of an Android emulator configured specifically for screenshot tests. The scripts handle creating an Android 30 emulator with specific DPI and resolution settings, disabling system animations to ensure consistent rendering, applying hidden API policy configurations to prevent test failures on newer API levels, and managing the start, wait, and stop processes. This enables reliable, headless execution of screenshot tests in CI environments.

script/emulator · high confidence

Automated Android release lanes for internal, external, and alpha builds

The fastlane directory now includes a complete Fastfile defining three new lanes: 'alpha' for internal debug builds, 'external' for external release builds, and 'internal' for internal release builds. These lanes automate the build process using Gradle, distribute APKs via Firebase App Distribution (for alpha and internal) and the Google Play Store (for external), and post notifications to Slack. The configuration specifies the app identifier 'com.kickstarter.kickstarter', requires Ruby 3.4.0, and relies on the 'fastlane-plugin-firebase\_app\_distribution' gem.

fastlane · high confidence

Automated project bootstrap and configuration setup

The new bootstrap scripts automate the initial setup of the development environment. The main script initializes git submodules, installs Ruby dependencies, configures Android Studio code styles and file templates, updates the pidcat utility, and checks for the presence of required signing keys and credentials. Additionally, a companion script copies example configuration files into place and sets up variant-specific directories with Google services JSON files, ensuring the project is ready for building immediately after cloning.

script · high confidence

Initial GraphQL API layer for mobile client

The mobile app now uses a comprehensive GraphQL API layer, replacing previous data-fetching mechanisms. This change introduces a full set of GraphQL queries and mutations covering core user flows: project discovery and details (including video feeds and stories), pledge management (creating, updating, and canceling backings), checkout and payment processing (including PaymentSheet integration and setup intents), user account management (passwords, email, currency), and social features (comments, replies, and activity tracking). It also includes support for shipping locations, rewards, add-ons, and third-party event tracking, establishing the foundation for all subsequent mobile data interactions.

app/src/main/graphql · high confidence

Initial open-source release of the Android application

This change introduces the initial open-source release of the Kickstarter Android application, making the codebase publicly available under the Apache License 2.0. It includes the full project structure with a Makefile for bootstrapping the development environment (including secret management and dependency setup), Gradle wrapper scripts for cross-platform builds, and comprehensive documentation in the README covering setup, contribution guidelines, and code of conduct. The release also adds necessary configuration files such as .gitignore, codecov.yml, and NOTICE files listing third-party dependencies.

(repo-wide) · high confidence

Initial project scaffolding with versioning and build configuration

The app module is initialized with essential build infrastructure, including separate internal and external version files (set to 3.42.0 / 2014150967), a .gitignore to exclude build artifacts, and a lint configuration that suppresses warnings for unused resources, Butterknife-generated code, and specific manifest issues. Additionally, example signing configuration and ProGuard rules are provided to support secure, optimized builds.

app · high confidence

Internal tools module with debug dependency injection

An internal tools module has been added to the application, providing a Dagger component and module that wire up specific dependencies for internal use. This setup enables the InternalToolsActivity and DebugPushNotificationsView to receive injected instances, including a conditional Apollo and API client that switches to mock implementations when the OSS flag is set, and exposes an internal tools interface accessible via the navigation drawer.

app/src/internal/java/com/kickstarter · high confidence

Introduce GraphQL data transformers for model mapping

Added a new \GraphQLTransformers\ component that converts raw GraphQL query results into internal application data models. This change establishes the mapping logic for key entities such as Projects, Rewards, FAQs, and Environmental Commitments, enabling the app to consume GraphQL API responses directly.

app/src/main/java/com/kickstarter/services/transformers · high confidence

Introduce Project Story components for Pre-launch pages

This change introduces a new set of UI components and data models for rendering 'Project Stories' within the Pre-launch Project Page. It adds a \ProjectStoryViewModel\ to fetch and manage story data via Apollo, defines \RichText\ data classes to handle structured content including text, photos, and embedded media, and implements Compose-based UI components like \ProjectStoryCaptionedImage\ and \RichTextItemTextComponent\ to display this content. The implementation includes support for image captions, linked images, and rich text formatting (headings, lists, bold/italic), replacing previous WebView-based approaches with native Compose views for better performance and styling control.

app/src/main/java/com/kickstarter/features/projectstory · high confidence

Introduce milkrun CLI for Android build and release automation

A new command-line tool named 'milkrun' is added to the bin directory to streamline the deployment of the Kickstarter Android app. The tool provides commands to manage internal and external releases, including building APKs, updating version codes and names, uploading to S3 or HockeyApp, and publishing changelogs. It also includes utilities for refreshing server configuration, generating string resources, and running quality checks like lint and checkstyle, with built-in prompts for release checklists and git status verification.

bin · high confidence

Introduce the new Pledged Projects Overview screen and Backing Details activity

Users can now access a dedicated Pledged Projects Overview (PPO) screen from the discovery overflow menu, featuring a paginated list of backed projects with distinct card states (such as Confirm Address, Fix Payment, and Take Survey) and tiered alert indicators. The screen includes a beta messaging bottom sheet to guide users toward the new backings dashboard and supports actions like editing addresses and managing pledges via a new Backing Details activity that loads project-specific webviews.

app/src/main/java/com/kickstarter/features/pledgedprojectsoverview/ui · high confidence

Introduce unified feature flag and experimentation client

The app now uses a centralized \FeatureFlagClient\ backed by Firebase Remote Config and a \StatsigClient\ for advanced feature gates and A/B experiments. This change replaces ad-hoc flag checks with a structured system that supports boolean, string, numeric, and double flag types, manages user identity synchronization for personalized experiments, and provides reactive state flows to ensure UI components only read gate values after they are fully loaded and settled for the current user.

app/src/main/java/com/kickstarter/libs/featureflag · high confidence

Introduction of Chrome Custom Tabs support for in-app web views

The app now includes helper classes (ChromeTabsHelper and ChromeTabsHelperActivity) to open URLs using Chrome Custom Tabs instead of standard WebViews or external browsers. This provides a smoother user experience by keeping the user within the app's context while browsing, with a fallback to the default browser if Custom Tabs are unavailable. This change supports features like Help views and login/signup flows that previously relied on embedded web views.

app/src/main/java/com/kickstarter/models/chrome · high confidence

Introduction of KSVideoPlayer Compose component

The app now includes a new \KSVideoPlayer\ Compose component in the design system, providing a unified video playback experience. This component integrates ExoPlayer for media handling and features custom UI controls, including play/pause, mute/unmute, and a scrub bar. It supports aspect-ratio transformations (center crop and fit/contain) via \TextureView\ matrix manipulation, handles playback errors with automatic recovery attempts, and exposes specific test tags for accessibility and UI testing.

app/src/main/java/com/kickstarter/ui/compose/designsystem/videoplayer · high confidence

Introduction of V2 API client layer with GraphQL and RxJava support

The app introduces a new V2 network layer in the services package, featuring a GraphQL-based client (KSApolloClientV2) alongside a traditional REST client (ApiClientV2). This new architecture leverages RxJava Observables for asynchronous data handling and includes updated models and parameters (such as DiscoveryParams) to support modern filtering and project discovery features. The change also brings improved network connectivity monitoring via ConnectivityReceiver and background tracking capabilities through TrackingWorker, laying the groundwork for more robust and scalable API interactions.

app/src/main/java/com/kickstarter/services · high confidence

Introduction of new core library components and analytics infrastructure

The \app/src/main/java/com/kickstarter/libs\ package has been significantly expanded with new foundational classes that support modern app functionality. This includes a comprehensive \AnalyticEvents\ class for tracking user interactions (such as page views and CTA clicks) and a new \AttributionEvents\ class for backend attribution. The update introduces \ActivityRequestCodes\ to standardize activity result handling, \ApiEndpoint\ to support custom API configurations, and \ApiPaginatorV2\ for improved data loading. Additionally, new utilities like \Config\ and \CurrentConfigV2\ manage feature flags and app settings, while \CurrentUserV2\ and \DeviceRegistrar\ handle user sessions and push notification registration using WorkManager.

app/src/main/java/com/kickstarter/libs · high confidence

Introduction of the Milkrun release automation library

The lib directory now includes the Milkrun library, a Ruby-based tool for managing application builds and releases. This addition introduces core modules for handling build processes, versioning, and changelogs, alongside integrations for AWS S3 storage, Firebase App Distribution, HockeyApp, and Slack notifications. The library also provides utilities for server configuration refreshing, linting, and Git state verification, effectively centralizing the automation logic previously scattered across scripts.

lib · high confidence

Introduction of the Pledged Projects Overview screen with infinite scroll and tier-based filtering

The app now includes a new Pledged Projects Overview (PPO) screen, implemented via the new \PledgedProjectsOverviewViewModel\. This feature introduces infinite scrolling for the list of pledged projects using Android Paging and GraphQL, allowing users to browse their pledges without manual refresh. The view model handles loading, error, and empty states, and applies client-side filtering to display only specific pledge tier types based on feature flags (V1 vs V2). It also integrates analytics tracking for page views and exposes flows for project details navigation and payment action requirements.

app/src/main/java/com/kickstarter/features/pledgedprojectsoverview/viewmodel · high confidence

Introduction of the Video Feed feature

The app now includes a new Video Feed experience, allowing users to browse and watch project videos in a vertical, swipeable list. This feature introduces a dedicated UI with video playback controls (play/pause, mute/unmute, progress scrubbing), project action overlays (bookmarking, sharing, viewing creator profiles), and visual badges (e.g., 'Project We Love', 'Trending'). It also supports infinite scrolling with pagination loading states, triggers an in-app review dialog upon reaching the end of the feed, and captures detailed analytics on video impressions, page views, and user interactions.

app/src/main/java/com/kickstarter/features/videofeed/ui · high confidence

Milkrun release tooling introduced

A new internal release automation tool named Milkrun has been added to the project. This Ruby-based tool streamlines the build and release process by handling Gradle assembly, generating localized string resources from server configuration, managing changelog editing (defaulting to vim), and publishing build metadata to S3. It also integrates with Firebase App Distribution for internal builds, extracts credentials from property files, and enforces git safety checks before release.

lib/milkrun · high confidence

New Compose UI components and design system tokens

This change introduces a new set of Jetpack Compose UI components and design system foundations for the app. It adds reusable Compose primitives for images (KSImageCompose) and text (KSTextCompose), including support for dark mode previews and specific styling like caption icons. It also introduces the KSRewardCard component, which displays reward details with badges (featured, secret) and selection states. Under the hood, the design system is expanded with new Kotlin data classes for button color variables (KSButtonColorVariables, KSButtonsColors), global colors (KSColors), dimensions (KSDimensions), and typography (KSType), providing a centralized, theme-aware configuration for the new Compose-based screens.

app/src/main/java/com/kickstarter/ui/compose · high confidence

New Compose UI components for Checkout: Bonus Support, Collection Plan, Itemized Details, and Shipping Selector

This change introduces four new Compose UI components to the checkout flow: BonusSupportContainer for adjusting pledge amounts, CollectionPlan for selecting between full and installment payments, PledgeItemizedDetails for displaying the breakdown of the pledge, and ShippingSelector for choosing a shipping location. These components implement the visual structure and user interactions for these specific checkout steps, utilizing the Material 3 design system and the new typography and color themes.

app/src/main/java/com/kickstarter/ui/views/compose/checkout · high confidence

New Compose UI components for Risks and Similar Projects sections

The project page now includes new Jetpack Compose implementations for the Risks and Similar Projects areas. A new RisksScreen composable displays the project's risks and challenges description along with a clickable accountability link, supporting both light and dark themes. Additionally, a SimilarProjectsComponent introduces a horizontal carousel for displaying similar projects, featuring a new SimilarProjectCard that utilizes the updated design system typography and colors, along with a SimilarProjectPlaceholderCard to handle loading states.

app/src/main/java/com/kickstarter/ui/fragments/projectpage/ui · high confidence

New Compose UI components for banners, creator info, and payment schedules

Added several new Jetpack Compose UI components to the app's view layer: \KSColorAccentedBanner\ and \KSImageTextBanner\ for displaying alert and informational banners with customizable colors and icons; \KsCreatorLayout\ to display creator avatar and name in a clickable row; \PaymentSchedule\ to show an expandable list of payment increments with currency formatting and badges; and \KSBottomSheetContent\ for structured bottom-sheet dialogs with titles, body text, and clickable links. These components utilize the new Material 3 design system (KSTheme, typographyV2) and support both light and dark modes.

app/src/main/java/com/kickstarter/ui/views/compose · high confidence

New Compose UI screens for Change Password, Onboarding, Pre-launch, and Reporting

Users will now see several key flows rendered with Jetpack Compose, including a new Change Password screen with validation and progress indicators, a multi-step Onboarding flow that adapts to login state and notification permissions, a Pre-launch Project Page featuring project details, story components, and similar project carousels, and a Report Project experience with a recursive flagging accordion and formulary. These screens replace or supplement previous implementations, bringing consistent Material 3 theming, dark mode support, and improved navigation to these areas of the app.

app/src/main/java/com/kickstarter/ui/activities/compose · high confidence

New Compose-based Toolbar component with beta badge support

A new Compose-based toolbar component (ToolBar.kt) has been added to the application, replacing or supplementing previous implementations. This component utilizes Material 3's TopAppBar and supports customizable titles, navigation icons, and action buttons. Notably, it includes specific support for displaying beta indicators: a generic 'Beta' badge via the showBetaPill parameter in TopToolBar, and a dedicated 'KSGreenBadge' in the TopToolBarBetaIcon variant, allowing users to visually identify beta features within the app interface.

app/src/main/java/com/kickstarter/ui/toolbars/compose · high confidence

New Compose-based UI components for the design system

The app's design system now includes a suite of new Jetpack Compose components, adding reusable UI elements such as alerts (snackbars, rounded text), badges (green, coral, alert, beta, secret reward, featured reward, video), banners (specifically for the discovery video feed), buttons (primary, secondary, small, Facebook, Google Pay, and a new V2 button system with loading states), clickable text, form controls (switches, radio buttons, checkboxes, dropdowns), dividers, and footers. These components standardize the visual language and interaction patterns across the application, replacing or supplementing previous XML-based implementations with a modern, type-safe Compose API.

app/src/main/java/com/kickstarter/ui/compose/designsystem · high confidence

New Compose-based pledge flow screens for rewards, add-ons, and checkout

The project page now uses a new set of Compose UI components to handle the pledge journey. This includes a RewardCarouselScreen for browsing and selecting rewards (with automatic scrolling to secret rewards), an AddOnsScreen for managing add-on quantities and totals, an AiDisclosureScreen for displaying creator AI usage information, and a CheckoutScreen for finalizing the pledge with payment details and collection plans. These screens are orchestrated by the ProjectPledgeButtonAndFragmentContainer, which manages the navigation flow between the reward selection, add-ons, and checkout steps.

app/src/main/java/com/kickstarter/ui/activities/compose/projectpage · high confidence

New Kotlin utility extensions for AI disclosure, checkout totals, and media playback

The app adds a suite of Kotlin extension functions in the \libs/utils/extensions\ package to support new product capabilities. \AiDisclosureExt\ introduces logic to detect when AI-related UI fields are effectively empty, enabling proper display of AI disclosure states. \CheckoutDataExt\ and \PledgeDataExt\ provide precise calculations for total pledge amounts, shipping costs, and bonus support, ensuring accurate checkout totals for backers. Additionally, \ContextExt\ implements a custom \ExoPlayer\ initialization that configures buffer limits to prevent memory issues and disables asynchronous codec queuing on emulators to avoid playback crashes, while also exposing dark mode status based on user preferences.

app/src/main/java/com/kickstarter/libs/utils/extensions · high confidence

New Pledge Redemption screen for viewing pledge details

A new Pledge Redemption screen has been added, allowing users to view the details of their pledge, including the reward, shipping amount, and total cost. This screen is accessible via the PledgeRedemptionActivity and uses the CheckoutScreen component to display the information.

app/src/main/java/com/kickstarter/features/pledgeredemption · high confidence

New Search and Filter screen with advanced filtering capabilities

A new Search and Filter activity has been introduced, allowing users to search for projects and apply various filters including category, location, project status, percentage raised, amount, and goal. The feature includes pagination support, a default sort of MAGIC/RECOMMENDED, and integration with the home screen navigation. It also supports feature flags for video feed banners and open calls, and tracks analytics for user interactions.

app/src/main/java/com/kickstarter/features/search · high confidence

New UI components for reward tracking in activity feed and pledge view

Added new Compose UI components (\RewardTrackingActivityFeed\, \RewardTrackingViewYourPledge\, and \RewardTrackingModal\) to display reward tracking information. These components render the tracking number, project details, and a 'Track Shipment' button, with the button's enabled state controlled by the \trackingButtonEnabled\ parameter to prevent interaction when the tracking URL is null.

app/src/main/java/com/kickstarter/features/rewardtracking · high confidence

New UI extension utilities for activities, views, and notifications

This change introduces a new set of Kotlin extension functions in the \ui/extensions\ package to standardize and simplify common UI operations. For activities, it adds helpers for starting activities with specific transition animations, managing keyboard visibility, displaying colored success/error snackbars, checking connectivity status, and triggering the in-app review dialog. For views, it provides utilities to handle text changes on \EditText\, load images (including WebP and GIFs) via Glide with error handling, and parse HTML or create clickable links in \TextView\ with optional underlining. It also includes a custom error toast implementation for consistent feedback.

app/src/main/java/com/kickstarter/ui/extensions · high confidence

Added new \DiscoveryIntentMapper\, \ProjectIntentMapper\, and \IntentMapper\ classes to handle Android Intents for discovery filters and project deep links. \DiscoveryIntentMapper\ converts intent data into \DiscoveryParams\, fetching full category and location details via API when only slugs are provided. \ProjectIntentMapper\ extracts project slugs and save flags from deep links (supporting both \ksr://\ and \https://\ schemes) and retrieves project data, while the base \IntentMapper\ provides utilities for URI parsing and banner detection.

app/src/main/java/com/kickstarter/ui/intentmappers · high confidence

New internal data models for GraphQL mutations

The app now includes a set of new internal data classes in the mutations package to support specific GraphQL operations. These include CreateAttributionEventData for tracking events, CreateBackingData and UpdateBackingData for pledge management (with UpdateBackingData featuring logic to handle PaymentSheet vs. existing card sources), CreateCheckoutData for checkout flows, CreateOrUpdateBackingAddressData for address management, PostCommentData for comments, SavePaymentMethodData for payment storage, and UpdateBackerCompletedData for backer completion states.

app/src/main/java/com/kickstarter/services/mutations · high confidence

New internal tools and design system preview screens

Developers now have access to new internal activities for testing and debugging: a Design System Activity that showcases the new Material 3-based UI components (buttons, badges, alerts, etc.) in both light and dark modes, an Internal Tools Activity that provides quick access to these previews, a Statsig debug view, and a Playground Activity for testing Stripe payment flows and stepper components.

app/src/internal/java/com/kickstarter/ui/activities · high confidence

New internal tools and sample screens added to the app

The internal build now includes several new activities accessible via the navigation drawer: InternalToolsActivity for managing feature flags, PlaygroundActivity for testing payment flows, DesignSystemActivity for UI previews, and PaginationActivity as a sample for GraphQL-based list pagination. These additions provide developers with dedicated screens to test and visualize internal features, design system components, and data loading patterns.

app/src/internal · high confidence

New project page tabs for FAQs, AI disclosure, environmental commitments, and risks

The project page now includes four additional tabs: Frequently Asked Questions, which allows users to view FAQs and message the creator; an AI Disclosure screen that explains the use of AI in project content; Environmental Commitments, which displays the creator's sustainability pledges and links to Kickstarter's resources; and Risks, which presents the project's potential challenges and accountability information. These fragments are integrated into the project overview navigation, enhancing transparency and user engagement.

app/src/main/java/com/kickstarter/ui/fragments/projectpage · high confidence

New project page view models for checkout, add-ons, and prelaunch flows

The project page now includes a suite of new view models to support the updated pledge and checkout experience. AddOnsViewModel manages add-on selection and totals for both crowdfund and late-pledge flows. CrowdfundCheckoutViewModel and LatePledgeCheckoutViewModel handle the respective checkout logic, including payment method management and Stripe integration. CheckoutFlowViewModel orchestrates the multi-step checkout navigation. PrelaunchProjectViewModel powers the prelaunch page, including deep linking and social sharing. Additional view models include AudioViewElementViewHolderViewModel for audio playback, ExperimentsViewModel for Statsig experiment logging, FrequentlyAskedQuestionViewModel for FAQ and messaging, and ProjectAIViewModel for AI disclosure handling.

app/src/main/java/com/kickstarter/viewmodels/projectpage · high confidence

New reusable UI components for add-ons, comments, and media

The app introduces a suite of new custom views in the \ui.views\ package to standardize and reuse UI elements. This includes \AddOnCard\ and \AddOnTagComponent\ for displaying pledge add-ons, \CommentCard\ and \CommentComposerView\ for handling user comments and replies, and \MediaHeader\ for project video playback. Additional utility views like \KSWebView\ (with updated user-agent masking), \ImageWithCaptionView\ (supporting WebP, GIF, and Compose-based image loading), \IconTextView\, \IconButton\, \HtmlTextView\, \KSBottomSheetDialogFragment\, \ConfirmDialog\, \FrequentlyAskedQuestionCard\, \EnvironmentalCommitmentsCard\, \LoginPopupMenu\, \BottomCropImageView\, and \CenterSpan\ are also added to support these features and general UI consistency.

app/src/main/java/com/kickstarter/ui/views · high confidence

New rich media view holders for project campaign content

This change introduces a suite of new view holders in the project campaign UI to support richer content types. Users can now interact with audio elements via a dedicated player with seek controls, view videos with ExoPlayer integration including fullscreen support, and see clickable images with captions that open external links. Additionally, text elements now support clickable links, headers are rendered as distinct elements, and external HTML content is displayed in a configured WebView.

app/src/main/java/com/kickstarter/ui/viewholders/projectcampaign · high confidence

New social sharing experience with branded project cards

Users can now share Kickstarter projects via a new bottom-sheet interface that supports X (Twitter), Instagram (Feed and Stories), Facebook (Feed and Stories), WhatsApp, Messages, Email, and Copy Link. The share flow generates a branded preview card combining the project's hero image, name, creator, and the Kickstarter logo, which is captured as a PNG and attached to the share intent where supported. The feature automatically detects which social apps are installed on the device and gates image-based sharing options until the branded card is ready. Reftags are included for analytics tracking on each platform.

app/src/main/java/com/kickstarter/features/socialshare · high confidence

New transformers for Project Story and Video Feed data

Added RichTextTransformers and VideoFeedTransformers to convert GraphQL fragments into internal data models. RichTextTransformers handles the mapping of rich text components (paragraphs, headers, lists, photos, and embeds) for project stories, while VideoFeedTransformers maps video feed nodes into VideoFeedEnvelope objects, including project details, creator info, and video sources.

app/src/main/java/com/kickstarter/services/transformers/extensions · high confidence

New use-case classes for shipping rules, user privacy, login, and third-party analytics

This change introduces several new use-case classes in the \viewmodels/usecases\ package to support specific product capabilities. \GetShippingRulesUseCase\ manages the retrieval and filtering of shipping rules and rewards, handling logic for worldwide vs. restricted shipping, default rule selection, and the placement of 'no-reward' items in the list. \GetUserPrivacyUseCaseV2\ and \RefreshUserUseCase\ provide mechanisms to fetch and update user privacy settings and user data via the Apollo client. \LoginUseCase\ handles authentication flows, including token management and updating user profiles with privacy data upon login. Finally, \SendThirdPartyEventUseCaseV2\ and its associated data classes (\TPEventInputData\, etc.) enable the sending of third-party analytics events (such as payment method additions and pledges) with support for consent management flags and detailed event payloads.

app/src/main/java/com/kickstarter/viewmodels/usecases · high confidence

New utility classes for analytics, animations, and application lifecycle management

The app introduces a suite of new utility classes in the utils package to support core functionality. AnalyticEventsUtils centralizes the generation of properties for analytics events, covering checkout data, discovery parameters, user details, and video playback. AnimationUtils provides reusable methods for view animations, including fade, scale, and cross-fade effects. ApplicationLifecycleUtil manages app lifecycle events, handling configuration and user data refreshes, while ApplicationUtils assists with activity navigation and external URL handling. Additionally, CodeVerifier implements PKCE (Proof Key for Code Exchange) for secure OAuth flows, and EventContextValues defines the context enums used in tracking events.

app/src/main/java/com/kickstarter/libs/utils · high confidence

New video feed UI components for campaign cards, action columns, and badges

This change introduces three new Compose UI components for the video feed: KSVideoCampaignCard, KSVideoActionsColumn, and KSVideoBadgesRow. The campaign card displays project title, subtitle, and a progress indicator with a call-to-action button, supporting a 'HideUI' mode that fades out details while keeping the button visible. The actions column provides a vertical stack of interactive elements including a profile button, a bookmark toggle with count, a share button with count, and a placeholder for more options. The badges row renders a horizontal list of project status badges (such as 'Trending', 'Hot Right Now', 'Days Left'), limiting display to the first two items. These components form the visual layer for the video feed campaign cards.

app/src/main/java/com/kickstarter/features/videofeed/ui/components · high confidence

New video player control icons added to design system

The video player design system now includes a new set of vector icons for standard playback and interaction controls, such as Play, Rewind, Forward, Mute, Volume Up, Bookmark, and Close. These assets are available for use in the app's Compose-based video UI components.

app/src/main/java/com/kickstarter/ui/compose/designsystem/videoplayer/icons · high confidence

Project campaign content now supports audio and external source elements

The project campaign view has been updated to render a richer set of content types within the campaign description. The new ViewElementAdapter processes HTML-parsed elements to display text, images, videos, and now includes support for audio players and external sources, in addition to the previously supported text and images. This allows creators to embed audio recordings and external links directly into their project stories, with the UI automatically handling the layout and lifecycle for these new media types.

app/src/main/java/com/kickstarter/ui/adapters/projectcampaign · high confidence

Behavioural changes

1 commit (0 fixes) modifying captures

A change to existing behaviour in captures — 1 commit, 2 files.

captures · medium confidence · unverified

API request bodies migrated to Kotlin with Parcelize

The API request body classes in the \apirequests\ package (including SignupBody, LoginWithFacebookBody, SettingsBody, and others) have been rewritten in Kotlin. These classes now use the \@Parcelize\ annotation for Android's Parcelable serialization and implement a Builder pattern for construction, replacing the previous Autoparcel-based implementation.

app/src/main/java/com/kickstarter/services/apirequests · high confidence

AddOns page stability improved by handling timeout exceptions

The AddOns page in the checkout flow is now more resilient to network timeouts. A new data class, AddOnsEnvelope, has been introduced to structure the response data for add-ons, ensuring that the page can properly handle and display add-on rewards without crashing when a timeout exception occurs.

app/src/main/java/com/kickstarter/features/checkout · medium confidence

App initialization now integrates Statsig feature flags and Braze push notifications

The application startup process has been updated to initialize the Statsig feature flag client and the Braze remote push notification client during the dependency initialization phase. This ensures that feature flags and push notification capabilities are ready before the app's main UI components load, supporting dynamic configuration and real-time user engagement features.

app/src/main/java/com/kickstarter · high confidence

Braze in-app message filtering and push notification integration

The app now integrates Braze for push notifications and in-app messages. Push notifications are handled via Firebase Cloud Messaging, with the SDK configured to automatically manage deep links and disable the back stack for those links. For in-app messages, a custom listener ensures that messages are only displayed to logged-in users; if no user is logged in, incoming messages are discarded.

app/src/main/java/com/kickstarter/libs/braze · high confidence

Centralized UI argument and intent key definitions

The app now uses dedicated Kotlin objects to centralize string constants for UI arguments, Intents, and shared preferences. This change introduces \ArgumentsKey\ for fragment arguments, \IntentKey\ for activity intents (including keys for Facebook login, pledge data, and deep links), and \SharedPreferenceKey\ for local storage keys (such as theme and onboarding status). \DiscoveryFilterStyle\ is also added to manage filter UI state. This refactoring improves maintainability by providing a single source of truth for these identifiers across the UI layer.

app/src/main/java/com/kickstarter/ui · high confidence

Commit hook to skip CI for ignored file changes

A new commit-msg hook has been added that checks for a .ciignore file. If the files changed in the current commit match patterns listed in .ciignore, the hook automatically prefixes the commit message with '\[skip ci\]', preventing unnecessary CI builds for changes to those specific files.

hooks · high confidence

Discovery drawer UI migrated to ViewBinding and Kotlin

The discovery drawer's user interface has been rebuilt using ViewBinding and Kotlin, replacing the previous implementation. This change introduces dedicated view holders for the drawer's distinct sections: a header, logged-in and logged-out states, and various filter types (top, parent, and child). For logged-in users, the drawer now displays the user's avatar, name, and specific activity counts (unread messages, general activity, and backing actions) with conditional visibility and styling, including support for dark mode indicators on project alerts. The filter sections allow users to expand/collapse categories and select specific filters, with visual feedback for the selected state.

app/src/main/java/com/kickstarter/ui/viewholders/discoverydrawer · high confidence

Discovery fragment view model input contract defined

A new interface, DiscoveryFragmentViewModelInputs, has been introduced to define the input contract for the discovery fragment's view model. This interface consolidates delegates for various discovery adapters (project cards, onboarding, editorial, and samples) and specifies methods for handling parameter changes from the activity, clearing page content, triggering pagination, and loading root categories.

app/src/main/java/com/kickstarter/viewmodels/outputs · high confidence

External API client wiring via Dagger modules

The app now uses new Dagger components (ApplicationComponent and ExternalApplicationModule) in the external source set to provide API clients. These modules supply production-ready ApiClientV2 and ApolloClientV2 instances for internal builds, while swapping in mock implementations (MockApiClientV2, MockApolloClientV2) when the OSS build flag is enabled, ensuring external integrations use appropriate client behavior based on the build variant.

app/src/external · high confidence

The Home screen has been redesigned to feature a custom floating bottom navigation bar instead of the previous standard layout. This new navigation includes dedicated tabs for Home, Search, and either Profile (for logged-in users, displaying their avatar) or Log In (for guests). The Search functionality is now integrated directly as a navigation destination within the Home activity, allowing users to access search and filtering capabilities seamlessly from the main navigation. The bottom navigation component supports dynamic icon updates for the profile tab and includes visual feedback animations for tab selection.

app/src/main/java/com/kickstarter/features/home · high confidence

Introduce new GraphQL-based comment response models

The app now uses new \CommentEnvelope\ and \PageInfoEnvelope\ data classes to handle comment API responses. These models support pagination via cursor-based navigation (start/end cursors, next/previous page flags) and are designed to integrate with the Apollo GraphQL client, replacing previous serialization approaches for comment threads.

app/src/main/java/com/kickstarter/services/apiresponses/commentresponse · high confidence

Introduces GraphQL envelope for Updates API responses

The app now includes a new \UpdatesGraphQlEnvelope\ class to handle data returned from the GraphQL-based Updates service. This class structures the response by wrapping a list of \Update\ objects along with pagination metadata (\PageInfoEnvelope\) and a total count, enabling the client to correctly parse and display updates fetched via the new GraphQL endpoint.

app/src/main/java/com/kickstarter/services/apiresponses/updatesresponse · high confidence

Introduction of Kotlin data classes for UI state and business logic

The app introduces a suite of new Kotlin data classes in the \ui.data\ package to replace legacy Java implementations, standardizing how UI state and business data are handled. This includes \ActivityResult\ for wrapping Android activity results, \CheckoutData\ and \PledgeData\ for managing payment and pledge details, and \ProjectData\ for holding project context and ref tags. Additionally, new enums and data structures such as \CardState\, \LoginReason\, \ManagePledgeMenuOptions\, \PledgeFlowContext\, \PledgeReason\, \Editorial\, and \MessageSubject\ are added to support specific UI flows like pledge management, login context, and editorial content display.

app/src/main/java/com/kickstarter/ui/data · high confidence

Introduction of custom toolbar components for discovery, login, and project screens

The app now uses a new set of custom toolbar views located in the \ui.toolbars\ package to standardize navigation and action handling across key screens. \KSToolbar\ serves as the base class, providing a consistent back-button behavior and a visual indicator for non-production environments. Specific implementations include \DiscoveryToolbar\ for the discovery screen (handling menu drawer and search actions), \LoginToolbar\ for the login flow (displaying a help popup menu), and \ProjectToolbar\ for project details (handling back navigation via an icon button).

app/src/main/java/com/kickstarter/ui/toolbars · high confidence

Introduction of structured country and currency configuration

The app now uses a new Country enum to define specific currency codes, symbols, and pledge limits for supported regions. This change centralizes country-specific data, ensuring consistent currency display and enforcing correct minimum and maximum pledge amounts for each market.

app/src/main/java/com/kickstarter/libs/models · high confidence

Login and password screens migrated to Jetpack Compose

The login and password-related UI screens (LoginTout, CreatePassword, SetPassword, and ResetPassword) have been rewritten using Jetpack Compose. This migration introduces a consistent Material 3 design system, including reusable components like the KSLoginDropdownMenu for help and policy links, and updates the visual appearance of these flows to align with the app's new design standards.

app/src/main/java/com/kickstarter/ui/activities/compose/login · high confidence

Migrate API response envelopes to Kotlin

The API response envelope classes in the \apiresponses\ package (including AccessTokenEnvelope, ActivityEnvelope, CategoriesEnvelope, DiscoverEnvelope, EmailVerificationEnvelope, ErrorEnvelope, MessageThreadEnvelope, MessageThreadsEnvelope, OAuthTokenEnvelope, ProjectStatsEnvelope, ProjectsEnvelope, PushNotificationEnvelope, ShippingRulesEnvelope, StarEnvelope, and UpdatesEnvelope) have been rewritten from Java to Kotlin. This migration replaces the legacy Autoparcel library with the standard \kotlinx.parcelize\ plugin for \Parcelable\ implementation, while preserving the existing builder patterns and data structures to ensure backward compatibility with the rest of the application.

app/src/main/java/com/kickstarter/services/apiresponses · high confidence

Migrate Firebase push notification handling to Kotlin and WorkManager

The Firebase push notification service layer has been rewritten in Kotlin and modernized to use AndroidX WorkManager for background token registration and cleanup tasks. The new \MessageService\ now parses Kickstarter-specific push payloads (including pledge redemptions) and delegates Braze messages to the remote client, while \RegisterTokenWorker\, \UnregisterTokenWorker\, and \ResetDeviceIdWorker\ handle token lifecycle events asynchronously. This change also integrates Firebase Crashlytics for error logging and reporting across these services, replacing previous implementations.

app/src/main/java/com/kickstarter/services/firebase · high confidence

Migrate adapters to sectioned RecyclerView architecture with View Binding

The adapter layer in the app has been refactored to use a new section-based RecyclerView architecture, introducing base classes KSAdapter and KSListAdapter to manage multi-section lists. All UI adapters in this package (including ActivityFeed, Comments, Discovery, Messages, and others) have been rewritten in Kotlin to use Android View Binding instead of Butter Knife, and now leverage these new base classes for data binding and view holder creation. This change standardizes how list data is structured and rendered across the app, improving maintainability and reducing boilerplate in adapter implementations.

app/src/main/java/com/kickstarter/ui/adapters · high confidence

Migrate core account and authentication activities to Kotlin and Jetpack ViewModel

The Account, Change Email, Change Password, Create Password, Activity Feed, Backing, Comments, Creator Bio, and Discovery activities have been rewritten in Kotlin and migrated to use Jetpack ViewModel and ViewBinding. This refactoring modernizes the UI layer, improves lifecycle safety, and aligns these core user-facing screens with the app's current architecture standards.

app/src/main/java/com/kickstarter/ui/activities · high confidence

Migrate core data models to Kotlin and adopt Kotlin Parcelize

The app's data model layer in the \models\ package has been migrated from Java to Kotlin, replacing the legacy Autoparcel library with the standard \kotlinx.parcelize\ plugin. This change updates the implementation of core models—including \Activity\, \Backing\, \Category\, \Checkout\, \Comment\, \Location\, \Message\, \Order\, and \Reward\—to use Kotlin data classes and sealed interfaces, ensuring consistent serialization for Intents and improving code maintainability across the application.

app/src/main/java/com/kickstarter/models · high confidence

Migrate navigation drawer data model to Kotlin and introduce new data classes for dashboard and thanks screens

The \NavigationDrawerData\ class has been rewritten in Kotlin, replacing the previous Java implementation and Autoparcel with the standard \kotlinx.parcelize\ library to handle Android parceling. Additionally, two new data classes, \ProjectDashboardData\ and \ThanksData\, have been added to support the project dashboard and thanks page features respectively, providing structured data containers for project stats, checkout information, and category details.

app/src/main/java/com/kickstarter/ui/adapters/data · high confidence

Migrate push data models to Kotlin

The Activity and GCM push data models have been rewritten in Kotlin, replacing the previous Java implementations. This change modernizes the codebase by using Kotlin's language features while maintaining the existing Parcelable functionality and builder patterns for creating and manipulating push notification data.

app/src/main/java/com/kickstarter/models/pushdata · high confidence

Migrate view models to Jetpack ViewModel and RxJava 2

The view models in the app have been migrated from the legacy architecture to use Android Jetpack ViewModel and RxJava 2. This change improves lifecycle management and reduces memory leaks by ensuring view models are properly scoped to their associated UI components. The migration also updates the reactive streams to use RxJava 2, providing better error handling and performance. Users will benefit from a more stable and responsive app experience as a result of these underlying improvements.

app/src/main/java/com/kickstarter/viewmodels · high confidence

Milkrun release tool adds structured helpers for versioning, linting, and distribution

The internal 'milkrun' release script now includes dedicated Ruby modules to manage Android build artifacts and metadata more reliably. Version management is split into separate classes for bumping numeric version codes and prompting for semver version names, supporting distinct internal and external audiences. A new lint module executes Gradle lint tasks and generates HTML reports, while distribution is handled by classes that upload APKs to an S3 bucket and create new app versions in HockeyApp. Additionally, a server config refresher can pull updated configuration from local or production API endpoints, ensuring the app binary stays in sync with backend settings.

ruby · high confidence

The search interface now includes a suite of new Material 3 Compose bottom sheets for configuring discovery filters. Users can select specific amounts raised, project goals, and locations (with search and suggestions) via dedicated sheets. Category selection has been expanded to support subcategories and multi-select modes. Additionally, new filters for 'Open Calls' (using tag chips) and a consolidated filter menu (grouping project status, location, and toggles like 'Recommended' or 'Staff Picks') are now available, replacing the previous implementation.

app/src/main/java/com/kickstarter/ui/activities/compose/search · high confidence

New HTML parser implementation supporting audio, video, and headers

The app introduces a new HTML parsing library (HTMLParser) that converts HTML content into structured view elements. This change adds support for parsing audio and video media, including audio source extraction and video thumbnail handling. It also enables the rendering of header tags (h1–h6) as distinct text styles, whereas previously they may have been treated as standard text. Additionally, image parsing logic has been updated to prioritize the 'data-src' attribute for GIFs when the 'src' attribute is blank, ensuring correct image display in those cases.

app/src/main/java/com/kickstarter/libs/htmlparser · high confidence

New HTTP request interceptors for API, GraphQL, web, and general requests

The app now uses four dedicated OkHttp interceptors to standardize outgoing network requests. ApiRequestInterceptor adds a client\_id query parameter and an X-Auth header for API calls. GraphQLInterceptor attaches an Authorization header, client ID, and Firebase device UUID to GraphQL requests. WebRequestInterceptor handles authentication for web views, using either the logged-in user's token or a basic auth header for specific internal endpoints. KSRequestInterceptor adds generic headers like Accept-Language and app version info to all other requests.

app/src/main/java/com/kickstarter/services/interceptors · high confidence

New RxJava2-based pagination library for load-more functionality

The app introduces ApolloPaginateV2, a new pagination component in the load-more library that replaces previous implementations with an RxJava2-based architecture. This change provides a more robust, observable-driven approach to handling paginated data loading, supporting features like start-over functionality, data transformation, and distinct value emission, which improves the reliability and flexibility of infinite scroll and load-more interactions across the application.

app/src/main/java/com/kickstarter/libs/loadmore · high confidence

New data models for Pledged Projects Overview

The Pledged Projects Overview feature now uses a new set of data classes to represent pledge cards and their associated metadata. This includes \PPOCard\ for individual pledge items, \DeliveryAddress\ for shipping details, \Flag\ for status indicators, and \PledgeTierType\ to categorize pledge states (e.g., payment failed, address locked, reward received). A \PPOCardFactory\ provides helper methods to construct these objects, and \PledgedProjectsOverviewEnvelope\ wraps the list of cards for pagination support. These models support the new card states and address confirmation flows introduced in this update.

app/src/main/java/com/kickstarter/features/pledgedprojectsoverview/data · high confidence

New item decorations for reward cards and table lists

Added RewardCardItemDecoration and TableItemDecoration to enhance list item spacing and styling. RewardCardItemDecoration applies a configurable bottom margin to items, while TableItemDecoration implements a striped background pattern by alternating between transparent and a support color based on item position.

app/src/main/java/com/kickstarter/ui/itemdecorations · high confidence

New model extensions for user traits, comment badges, and payment sheet integration

This change introduces new Kotlin extension functions in the models layer to support recent feature updates. UserExt adds logic to persist and compare user notification preferences (traits) for analytics, and exposes email verification and location checks. CommentExt provides utilities to update comment lists after posting (success/failure), assign author badges (Creator, Collaborator, Superbacker, You) with specific priority, and determine comment status (e.g., flagged, deleted, canceled pledge). StoredCardExt and AvatarExt add helpers to detect PaymentSheet-based cards, generate backing data with the correct setup intent or payment source ID, and resolve avatar images. These extensions support the underlying UI and data handling for the new payment flow, comment moderation states, and user preference tracking.

app/src/main/java/com/kickstarter/models/extensions · high confidence

Preferences migrated to Kotlin implementation

The internal preference storage classes (Boolean, Int, and String) in the \libs/preferences\ package have been rewritten in Kotlin. This change introduces a consistent interface for managing user preferences, including methods to get, set, check if a value is explicitly set, and delete stored data, replacing the previous implementation while maintaining the same \SharedPreferences\-backed behavior.

app/src/main/java/com/kickstarter/libs/preferences · high confidence

Qualifiers package migrated to Kotlin

The \com.kickstarter.libs.qualifiers\ package has been converted from Java to Kotlin. This change updates the underlying implementation language for dependency injection qualifiers (such as \AccessTokenPreference\, \ApiRetrofit\, and \ApplicationContext\) but does not alter the public API or runtime behavior for consumers of these annotations.

app/src/main/java/com/kickstarter/libs/qualifiers · high confidence

Refactored manage pledge menu visibility logic

The logic determining which options appear in the manage pledge menu has been consolidated into a new factory class. This change ensures that the 'Edit Pledge' option is only shown when the user is backing the project, the project is live, and specific feature flags for pledge-over-time editing are enabled. It also restricts the 'Choose Another Reward' option for pledge-over-time backers when the feature is active, while maintaining existing visibility rules for updating payment, viewing rewards, canceling, and contacting the creator.

app/src/main/java/com/kickstarter/ui/helpers · high confidence

Rewritten activity feed and pledge screen view holders

The activity feed and pledge screen view holders have been rewritten to use ViewBinding and RxJava 2, replacing the previous Butter Knife and RxJava 1 implementations. This change improves code safety and maintainability by eliminating manual view lookups and providing better lifecycle management for reactive streams. The activity feed now displays friend backings, follows, and project updates with updated UI components, while the pledge screen add-on view holders now support local pickup locations, secret reward badges, and featured reward badges with improved error handling and state management.

app/src/main/java/com/kickstarter/ui/viewholders · high confidence

Rewritten pledge-flow fragments with Compose UI and RxJava2 migration

The app's core pledge and discovery screens have been rebuilt using Jetpack Compose and migrated to RxJava2. The Discovery fragment now uses a unified ConcatAdapter for its content feed. The Rewards, Backing, and Crowdfund Checkout fragments have been replaced with Compose-based implementations (RewardCarouselScreen, BackingFragment, and CheckoutScreen) that integrate Stripe's PaymentSheet for native checkout. Additionally, new fragments have been introduced to support the full pledge lifecycle: BackingAddOnsFragment for managing add-ons, CancelPledgeFragment for cancellations, and ConsentManagementDialogFragment for user privacy preferences.

app/src/main/java/com/kickstarter/ui/fragments · high confidence

RxJava 2 transformer and operator library added

The app introduces a new set of RxJava 2-compatible reactive utilities in the \libs/rx\ package, including \ApiErrorOperatorV2\ for standardized API error handling and a suite of V2 transformers (such as \ObserveForUI\, \NeverError\, and \CombineLatestPair\) to support the migration from RxJava 1. These components provide the foundational reactive building blocks required for the broader ViewModel and architecture updates occurring in the codebase.

app/src/main/java/com/kickstarter/libs/rx · high confidence

Test coverage

Added Dagger test modules for screenshot testing; Added UI component tests for Video Feed; Added UI tests for Pledged Projects Overview and Beta Messaging components; Added UI tests for design system components; Added UI tests for new Compose screens and components; Added UI tests for search filter bottom sheets and search screen states; Added UI tests for the Video Feed screen; Added screenshot tests for UI components; Added tests for ActivityFeedAdapter sectioning logic; Added tests for CommentCard UI states and thread visibility; Added tests for Firebase push token refresh error handling; Added tests for Home screen navigation and user state; Added tests for KSVideoPlayer zoom matrix and control interactions; Added tests for Project Notice bottom sheet UI; Added tests for Project Story ViewModel and UI components; Added tests for RxJava 2 API error handling and TakeWhen transformer; Added tests for deep link parsing, push token registration, and URI utilities; Added tests for encryption engine and mock preference implementations; Added tests for reward tracking view interactions; Added tests for shipping rules and third-party event use cases; Added tests for the social sharing feature components; Added unit tests for API response envelope models; Added unit tests for DiscoveryFilterStyle; Added unit tests for GraphQL, RichText, and VideoFeed transformers; Added unit tests for HTMLParser element handling; Added unit tests for KSCurrency and updated Robolectric test infrastructure; Added unit tests for PledgedProjectsOverviewViewModel; Added unit tests for PushTokenBody and SettingsBody; Added unit tests for Search and Filter ViewModels; Added unit tests for VideoFeed ViewModel; Added unit tests for account, activity feed, and add-ons view models; Added unit tests for analytics, feature flag, and utility libraries; Added unit tests for app model classes; Added unit tests for intent mappers; Added unit tests for push notification data models; Added unit tests for utility classes in libs/utils; Added unit tests for utility extension functions; Configure Mockito inline mocking and Robolectric application class; Expanded mock data factories for testing payment schedules and comments; New mock API clients for testing.

Dependencies

Upgrade Gradle wrapper to version 8.13

The project's Gradle wrapper has been updated to use Gradle 8.13. This ensures that builds are executed with the specified version of the Gradle build tool, providing consistency across development environments and enabling the use of features and improvements available in the 8.x release line.

gradle · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 44 → 60 (+16.5)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 87 → 89 (+1.8)
  • Architecture 94 → 82 (-11.9)
  • Maturity 55 → 59 (+3.9)
  • Readiness 23 → 52 (+28.8)
  • Security 54 → 70 (+15.9)

Resolved (111)

  • Coverage not measured — test suite did not build
  • Dimension evaluation failed
  • Duplicated block (10 lines × 2) (app/src/main/java/com/kickstarter/mock/factories/CommentFactory.kt)
  • Duplicated block (10 lines × 2) (app/src/main/java/com/kickstarter/mock/factories/ProjectFactory.kt)
  • Duplicated block (10 lines × 2) (app/src/main/java/com/kickstarter/viewmodels/projectpage/CrowdfundCheckoutViewModel.kt)
  • Duplicated block (10 lines × 5) (app/src/main/java/com/kickstarter/services/KSApolloClientV2.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/kickstarter/features/pledgedprojectsoverview/ui/PPOCardView.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/kickstarter/features/pledgedprojectsoverview/ui/PPOCardView.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/kickstarter/services/KSApolloClientV2.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/kickstarter/services/KSApolloClientV2.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/kickstarter/services/KSApolloClientV2.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/kickstarter/services/KSApolloClientV2.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/kickstarter/ui/extensions/ImageViewExt.kt)
  • Duplicated block (11 lines × 3) (app/src/main/java/com/kickstarter/services/KSApolloClientV2.kt)
  • Duplicated block (11 lines × 3) (app/src/main/java/com/kickstarter/services/KSApolloClientV2.kt)
  • Duplicated block (12 lines × 2) (app/src/internal/java/com/kickstarter/ui/views/DebugPushNotificationsView.kt)
  • Duplicated block (12 lines × 2) (app/src/main/java/com/kickstarter/features/pledgedprojectsoverview/ui/PledgedProjectsOverviewScreen.kt)
  • Duplicated block (12 lines × 2) (app/src/main/java/com/kickstarter/mock/factories/RewardsItemFactory.kt)
  • Duplicated block (12 lines × 2) (app/src/main/java/com/kickstarter/services/KSApolloClientV2.kt)
  • Duplicated block (12 lines × 2) (app/src/main/java/com/kickstarter/services/KSApolloClientV2.kt)
  • …and 91 more

New (366)

  • AddOnViewHolder.bindReward (cognitive 16) (app/src/main/java/com/kickstarter/ui/viewholders/AddOnViewHolder.kt)
  • BackingFragmentViewModel.pledgeStatusData (cognitive 30) (app/src/main/java/com/kickstarter/viewmodels/BackingFragmentViewModel.kt)
  • BackingFragmentViewModel.pledgeStatusData (cyclomatic 28) (app/src/main/java/com/kickstarter/viewmodels/BackingFragmentViewModel.kt)
  • Builder.mergeWith (cognitive 16) (app/src/main/java/com/kickstarter/services/DiscoveryParams.kt)
  • Builder.mergeWith (cyclomatic 17) (app/src/main/java/com/kickstarter/services/DiscoveryParams.kt)
  • Change coupling: CheckoutScreen.kt ↔ CrowdfundCheckoutFragment.kt (app/src/main/java/com/kickstarter/ui/activities/compose/projectpage/CheckoutScreen.kt)
  • Change coupling: ExternalApplicationModule.java ↔ InternalApplicationModule.java (app/src/external/java/com/kickstarter/ExternalApplicationModule.java)
  • Change coupling: GraphQLTransformers.kt ↔ PaymentSchedule.kt (app/src/main/java/com/kickstarter/services/transformers/GraphQLTransformers.kt)
  • Change coupling: ProjectPageActivity.kt ↔ ProjectPledgeButtonAndFragmentContainer.kt (app/src/main/java/com/kickstarter/ui/activities/ProjectPageActivity.kt)
  • Change coupling: UriExt.kt ↔ SplashScreenActivity.kt (app/src/main/java/com/kickstarter/libs/utils/extensions/UriExt.kt)
  • Change coupling: UriExt.kt ↔ SplashScreenViewModel.kt (app/src/main/java/com/kickstarter/libs/utils/extensions/UriExt.kt)
  • Change-coupling hub: DiscoveryParamsExt.kt → SearchAndFilterActivity.kt, SearchAndFilterViewModel.kt, KSApolloClientV2.kt, FilterMenuSheet.kt, SearchScreen.kt (app/src/main/java/com/kickstarter/libs/utils/extensions/DiscoveryParamsExt.kt)
  • CheckoutScreenKt.CheckoutScreen (cognitive 30) (app/src/main/java/com/kickstarter/ui/activities/compose/projectpage/CheckoutScreen.kt)
  • CheckoutScreenKt.CheckoutScreen (cyclomatic 25) (app/src/main/java/com/kickstarter/ui/activities/compose/projectpage/CheckoutScreen.kt)
  • ClassTooLong: AnalyticEvents (app/src/main/java/com/kickstarter/libs/AnalyticEvents.kt)
  • ClassTooLong: DiscoveryParams (app/src/main/java/com/kickstarter/services/DiscoveryParams.kt)
  • ClassTooLong: KSApolloClientV2 (app/src/main/java/com/kickstarter/services/KSApolloClientV2.kt)
  • ClassTooLong: Project (app/src/main/java/com/kickstarter/models/Project.kt)
  • ClassTooLong: ProjectOverviewFragment (app/src/main/java/com/kickstarter/ui/fragments/projectpage/ProjectOverviewFragment.kt)
  • ClassTooLong: ProjectPageActivity (app/src/main/java/com/kickstarter/ui/activities/ProjectPageActivity.kt)
  • …and 346 more

Changes since last survey

  • 6 commits — 5 feature/other, 1 fixes

By area

  • app/src — 5 commits
  • app/external_version_code.txt — 1 commit

Notable commits

  • fix: CHECK-459: Fix Config not being cached (#2559)
  • change: DISC-436: VideoFeed deeplink (#2558)
  • change: Disc 380: Open Calls UI filter (#2563)
  • change: PF-48: Upgrade Stripe & map PaymentSheetResult to an internal data model (#2562)
  • change: [CHECK-357, CHECK-455, CHECK-222]: Refactor RewardsSelectionViewModel to address multiple concerns (#2560)
  • change: [no-jira]: Update versions after release (3.42.0/2014150967) (#2561)

Architecture

  • Containers 0 added · 0 removed · contexts 2 added · 0 removed · edges 0 added · 0 removed

Added bounded contexts (2)

  • app
  • ruby

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

kickstarter/android-oss was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 25 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit a302985e8e16ac498f28534eb38b25d1b6087760 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-dd72cc24c749.