kickstarter/android-oss
60.4
Adequate · 25 September 2026
100.5k
lines of production code
Kotlin
primary language
4
measurements over time
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
New intent mappers for discovery and project deep links
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
Home screen now uses a custom floating bottom navigation with integrated search and profile tabs
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
New Compose-based filter bottom sheets for search
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.