kickstarter/ios-oss
63.5
Adequate · 27 September 2026
109.9k
lines of production code
Swift
primary language
3
measurements over time
What this system is
This is the native iOS client for the Kickstarter crowdfunding platform, enabling users to discover projects, manage pledges, and interact with creators. It provides a comprehensive suite of features including a video-based discovery feed, a backer dashboard for tracking activity, and a full checkout flow with payment and shipping management. The system integrates deeply with a GraphQL API for data fetching and utilizes Statsig for feature experimentation and remote configuration.
Features
Add Statsig Debugger view to Beta tools
A new Statsig Debugger view has been added to the Beta tools menu, allowing users to verify the Statsig client status and manually reload the current user's experiments and flags. The interface displays a green confirmation when Statsig is active or a warning if no client is configured, and provides buttons to open the native Statsig debug overlay and refresh the user session.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/StatsigDebugger · high confidence
Add shipping location selection view for pledges
Users can now select their shipping location during the pledge flow via a new dedicated view controller. This component presents a button to choose a country or region, displays a loading shimmer while data is fetched, and handles the presentation of a sheet for location selection, integrating with the existing pledge workflow.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/PledgeShippingLocation · high confidence
Added GraphQL schema configuration and custom scalar definitions
The GraphAPI module now includes a new SchemaConfiguration file that allows for custom cache key resolution logic, alongside a set of generated custom scalar type aliases (Date, DateTime, Email, HTML, ISO8601DateTime, and JSON) that map GraphQL scalar types to Swift String types for consistent data handling.
GraphAPI, GraphAPI/Schema · high confidence
Added Rich Text Example view for beta tools
A new Rich Text Example view has been added to the Kickstarter iOS framework, providing a dedicated interface for beta tools to test rich text rendering. This feature includes a projects list view that displays available projects and allows users to load a specific project by entering its slug or URL. The implementation handles input normalization to accept both raw slugs and full Kickstarter project URLs, fetching the corresponding rich text content via GraphQL queries for display.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/RichTextExample · high confidence
Beta tools now display and toggle Statsig feature flags alongside Remote Config
The Remote Config Feature Flag Tools view has been updated to include a second section for Statsig feature gates. Users can now view and toggle both Remote Config and Statsig feature flags from a single interface, with each section displaying its respective list of features and allowing on/off toggles via switches.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/RemoteConfigFeatureFlagTools · high confidence
Expanded GraphQL query operations for project, backing, and payment flows
The GraphAPI layer now includes several new generated query operations to support specific user workflows. \BuildPaymentPlanQuery\ enables calculating pledge-over-time payment increments for a project. \DefaultLocationsQuery\ retrieves discoverable shipping locations based on the user's session. \FastFetchAddOnsQuery\ and \FastFetchProjectPageBaseQuery\ provide optimized data fetching for reward add-ons and core project details (including backing and rewards) to improve page load performance. \FastFetchProjectPageExtendedPropertiesQuery\ fetches extended project metadata, video, and rich text story content. Additionally, \FetchAddOnsQuery\, \FetchBackingQuery\, and \FetchBackingWithIncrementsRefundedQuery\ provide detailed data for managing pledges, including add-on selection, backing status, and refund handling for incremental payments.
GraphAPI/Sources/Operations/Queries · high confidence
Initial Fastlane automation setup for iOS builds and distribution
Introduces a new Fastlane configuration to automate iOS build and distribution workflows. The setup includes lanes for building and uploading Beta builds to an AWS S3 bucket (using the \fastlane-plugin-aws\_s3\), building and delivering Production builds to the App Store via App Store Connect Auth, and building Alpha releases. It also configures Fastlane Match for managing code-signing certificates and provisioning profiles across App Store, Enterprise, and Development environments, and integrates automatic dSYM upload to Crashlytics for production releases.
.fastlane · high confidence
Introduce Backer Dashboard with project tabs
The Backer Dashboard now features a tabbed interface allowing users to view their backed and saved projects in a single location. This change introduces the \BackerDashboardViewController\ and its associated data source, which manages navigation between the 'Backed' and 'Saved' project lists via a page view controller, replacing the previous profile-centric layout.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/BackerDashboardPages · high confidence
Introduce Similar Projects use case and data models
Added a new use case and supporting data structures for the Similar Projects feature. This includes the \SimilarProjectsUseCase\ to fetch and manage similar projects, \ProjectCardProperties\ to represent project data, and \SimilarProjectsState\ to handle loading states. The implementation parses GraphQL fragments into these models and provides navigation signals when a user taps on a similar project.
Library/Sources/Library/Library/UseCases/SimilarProjects · high confidence
Introduce iOS Experimentation module with Statsig integration
This change introduces a new iOS Experimentation module that integrates the Statsig SDK to manage feature flags and A/B tests. It provides a strongly-typed protocol for defining experiments (such as Instant Pledge, Speedy Checkout, and moving the No Reward option) and feature gates (like Project Story Rich Text and Video Feed). The module includes a Statsig client wrapper that supports environment tiers (Production, Staging, Development) and anonymous user identification via Segment IDs. Additionally, it adds test helpers, including a mock client and A/A experiments, to validate the infrastructure.
Experimentation · high confidence
Introduce new Activities screen with dedicated UI components
The Activities feature now uses a new \ActivitiesViewController\ and a suite of custom table view cells (including \ActivityErroredBackingsCell\, \ActivityFriendBackingCell\, \ActivityFriendFollowCell\, \ActivityProjectStatusCell\, \ActivitySurveyResponseCell\, \ActivityUpdateCell\, and \FindFriendsFacebookConnectCell\) to display user activity. This change implements the view layer for the Activities tab, handling the presentation of project updates, friend activity, survey responses, and payment errors.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/Activities · high confidence
Introduce new Backer Dashboard Projects view with infinite scroll and empty states
The Backer Dashboard now features a dedicated projects list view that supports infinite scrolling via a next-page loading indicator and pull-to-refresh. The interface displays distinct empty states for backed and saved projects, including an animated heart icon for saved items, and presents project cards with funding progress and metadata.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/BackerDashboardProjects · high confidence
Introduces async/await support for GraphQL API calls
The API layer now supports Swift concurrency. A new \AsyncApolloClient\ wrapper bridges the existing Apollo client to \async/await\, and the \Service\ type exposes a \fetch(query:) async throws\ method. This allows callers to perform GraphQL queries using modern concurrency patterns instead of relying solely on reactive streams.
KsApi/Sources/KsApi · high confidence
Introduction of RootTabBarViewController with floating tab bar support
The app now uses a new RootTabBarViewController to manage the main tab bar interface, introducing support for a 'floating' tab bar style that can be toggled via remote configuration. This controller handles synchronization between the UI and a ViewModel, managing tab item styles, badge values, and navigation state while listening for user session and accessibility changes to ensure the interface remains consistent across foreground/background transitions and user updates.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/RootTabBar · high confidence
Kickstarter Design System (KDS) package introduction
The Kickstarter Design System (KDS) has been extracted into a dedicated Swift package, providing a centralized library for UI components and design tokens. This package introduces a new semantic color system with distinct light and dark mode support, a comprehensive set of Inter font styles with Dynamic Type accessibility, and a unified button component (KSRButton) that supports multiple visual styles and loading states for both UIKit and SwiftUI.
KDS · high confidence
New Beta Tools menu with debugging and feedback options
The Beta Tools menu now includes direct access to several internal debugging and configuration utilities. Users can navigate to the Statsig debugger, push notification tools, config feature flag tools, remote config feature flag tools, a paginated scroll view example, a rich text example, and the design system. The menu also allows users to change the app environment and language, submit beta feedback, and view the app version and device identifier in the footer.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/BetaTools · high confidence
New GraphQL mutation operations for payments, backing, and user management
The GraphAPI client now includes generated Swift types for a comprehensive set of new GraphQL mutations, enabling users to manage payments, backings, and account interactions. Key additions include mutations for creating and managing payment sources and intents (CreatePaymentSource, CreatePaymentIntent, CreateSetupIntent), handling backing workflows (CreateBacking, CancelBacking, CreateCheckout, CompleteOnSessionCheckout), and user actions (AddUserToSecretRewardGroup, BlockUser, CreateFlagging, CreateOrUpdateBackingAddress, ClearUserUnseenActivity, CreateAttributionEvent). These generated files provide the necessary type-safe interfaces for the client to execute these server-side operations.
GraphAPI/Sources/Operations/Mutations · high confidence
New GraphQL mutations for project, user, and payment operations
The application now supports a comprehensive set of new GraphQL mutations in the \graphql/mutations\ directory, enabling users to manage project interactions (watching/unwatching, flagging, adding to secret reward groups), handle user account and profile updates (sign-in with Apple, email verification, blocking users), and execute payment workflows (creating and canceling backings, managing payment sources and intents, completing on-session checkout, and marking backers as completed).
graphql/mutations · high confidence
New Login Tout screen with Apple, Facebook, and OAuth login options
The app now includes a dedicated Login Tout view controller that presents users with multiple authentication methods, including Apple ID, Facebook, and a generic OAuth signup/login button. This screen handles the initial login flow, integrating with the app environment to process logins from Apple and Facebook providers, and supports contextual navigation for both modal and full-screen presentations.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/LoginTout · high confidence
New Project Page UI cells for media, content, and FAQs
The Project Page now uses a new set of table-view cells to render project content. This includes \AudioVideoViewElementCell\ for playing video with thumbnails, \ExternalSourceViewElementCell\ for rendering HTML content via \WKWebView\, and \ImageViewElementCell\ for displaying images with captions and pinch-to-zoom. The page also features new cells for the FAQ section (\ProjectFAQsCell\, \ProjectFAQsEmptyStateCell\, \ProjectFAQsAskAQuestionCell\), project risks (\ProjectRisksCell\, \ProjectRisksDisclaimerCell\), and project metadata (\ProjectHeaderCell\, \ProjectPamphletCreatorHeaderCell\, \ProjectPamphletMainCell\, \ProjectPamphletSubpageCell\). Additionally, a new \ProjectTabAIGenerationCell\ displays AI content disclosures, and \ProjectTabCategoryDescriptionCell\ shows category details.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/ProjectPage/Views · high confidence
New account settings screens for changing email, creating passwords, and selecting currency
Users can now update their account details through newly added settings screens. The Change Email feature (SwiftUI) allows users to verify their current email and set a new one with a dedicated save button. The Create Password flow (UIKit) enables users to set a new password and confirm it, handling validation errors and success states. Additionally, the Select Currency screen lets users choose their preferred currency for pledges, displaying a list with checkmarks and saving the selection via a save button.
(repo-wide) · high confidence
New discovery page cells and video feed banner UI
The discovery page now includes a set of new table-view cells to display various activity types (backing, following, and project updates) alongside a dedicated onboarding cell for unauthenticated users. A new video feed banner cell has been added, which embeds a SwiftUI view to promote the new video-based discovery mode with a "Try it now" call-to-action. Additionally, a reusable category tag view is introduced to display project categories on discovery cards.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/Discovery/Views · high confidence
New iOS UI components for comments, category selection, and pledge cancellation
This change introduces a set of new iOS view controllers and UI components for the Comments, Category Selection, and Cancel Pledge features. Specifically, it adds the CancelPledgeViewController for handling pledge cancellations, CategorySelectionHeaderView and CategoryPillCell for the category selection flow, and a comprehensive suite of Comment-related components including CommentsViewController, CommentRepliesViewController, CommentDialogViewController, and various table view cells (CommentCell, CommentPostFailedCell, CommentRemovedCell) along with their corresponding data sources. These files establish the user-facing interfaces and view-model bindings for these distinct product areas.
(repo-wide) · high confidence
New iOS screens for Curated Projects, Messages, and Pledge Manager surveys
This change introduces three new iOS feature areas. The Curated Projects screen allows users to browse and select from curated project categories via a table view with a category header. The Messages feature adds a full messaging interface, including a table view for message threads, support for project and backing banners, and cells for displaying messages, empty states, and backing details. Additionally, a new Pledge Manager web view enables users to complete survey responses and manage pledges through an embedded web interface, handling navigation to native screens like the project page and pledge management.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/CuratedProjects, Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/Messages, Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/SurveyResponse · high confidence
New localized strings generation tool and build scripts
This change introduces a new Swift-based \StringsScript\ tool in \bin/StringsScript\ to automate the fetching, flattening, and generation of localized strings and static Swift code from the API, replacing the previous \bin/strings.swift\ script. It also adds several new utility scripts for the build and CI process, including \apollo-schema-download.sh\ for fetching GraphQL schemas, \count\_swiftlint\_violations.sh\ for linting metrics, \danger.sh\ for CI integration, \find-graphql-files.sh\ for dependency tracking, \firebase-crashlytics-run.sh\ for symbol uploading, \format.sh\ for code formatting, and helper scripts for sending test push notifications (\send\_fix\_payment\_push.sh\, \send\_pm\_push.sh\).
bin · high confidence
New shared UI components and layout systems
The SharedViews module introduces a suite of new reusable components and layout engines to support recent design updates. This includes a frosted glass background view for the video feed, a custom search bar with animated clear and cancel states, and a flow layout for SwiftUI alongside a pill layout for UICollectionViews. Several new header views have been added for categories, rewards, and settings, along with dedicated views for pledge CTAs, pledge disclaimers, and loading states (including a shimmer effect for shipping locations). A new alert banner component and a pills view for displaying tag-like data are also included.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/SharedViews · high confidence
New video player implementation for the video feed
This change introduces a new \VideoFeedVideoPlayer\ class and its backing \VideoFeedPlayerView\ to handle video playback within the feed. The player wraps \AVPlayer\ to provide specific behaviors required for the feed context, including automatic looping when a video ends, tracking of playback progress and total watch time, and robust handling of edge cases such as network loss or playback stalls. It exposes callbacks for when a video is ready to play or fails to load, ensuring the UI can react appropriately to state changes.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/VideoFeed/VideoPlayer · high confidence
Server-driven rich text content blocks
The ServerDrivenUI module now supports rendering rich text content from the server. This includes dedicated SwiftUI views for text (with headings, links, and inline styles), images, audio/video media, and OEmbed web embeds. The implementation handles data normalization to correctly separate nested elements (like images within text paragraphs) and applies a consistent, adaptive styling system that supports light and dark modes.
ServerDrivenUI/Sources · high confidence
Support for rich push notification attachments via Braze
A new RichPushNotifications extension has been added to the app, enabling the display of rich media attachments (such as images) in push notifications sent through Braze. The extension intercepts incoming notifications, downloads specified attachments from the provided URLs, and attaches them to the notification content before display, falling back to the original text-only content if the attachment cannot be retrieved or processed.
RichPushNotifications · high confidence
Video Feed Cell Implementation
This change introduces the core \VideoFeedCell\ component, which manages video playback, UI overlays, and user interactions within the video feed. The cell integrates an \AVPlayer\-backed view for rendering video, a SwiftUI-based overlay for controls (mute, progress bar, save, share, close), and handles state management for playback readiness, errors, and save failures via toast notifications. It also includes a data source for binding video feed items to cells and a dedicated state class to track playback status (playing, ready, failed) to ensure proper lifecycle management during cell reuse.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/VideoFeed/Cell · high confidence
Video Feed Overlay UI Components
This change introduces the SwiftUI-based UI components for the Video Feed overlay, including the bottom overlay with project badges, title, stats, CTA, and progress bar; the right rail with creator avatar, save, and share buttons; an animated funded percentage circle; and toast notifications for save or video errors. Users will see these visual elements and interactions when viewing a video in the feed.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/VideoFeed/Overlay · high confidence
Video Feed: New Social Sharing Sheet with Multiple Destinations
Users can now share Video Feed projects via a dedicated share sheet that supports multiple destinations including X, Instagram Stories, Facebook Stories, Facebook Feed, WhatsApp, Messages, Email, and a system 'More' options sheet. The sheet displays a preview card with the project thumbnail and title, and includes a 'Copy Link' action that provides visual confirmation via a Lottie animation. Availability of specific destinations is dynamically filtered based on whether the corresponding apps are installed on the device.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/VideoFeed/Social Sharing · high confidence
Architecture
Library migrated to Swift Package Manager
The Library module has been converted from an Xcode project to a Swift Package, introducing a new package manifest and workspace configuration. This change modernizes the build system and allows the library to be consumed as a standard Swift Package by other projects.
Library · high confidence
Migrate Kickstarter iOS framework to Swift Package Manager
The Kickstarter iOS framework has been converted from an Xcode project to a Swift Package, introducing a new library module that consolidates core UI components, utilities, and protocols. This change includes the addition of a \ContentSizeTableView\ for improved table view sizing, a \GIFAnimatedImageView\ wrapper for animated images, and a \Nib\ enum with helper extensions to simplify registering and loading XIB files from the framework bundle. It also introduces a \Storyboard\ enum for type-safe view controller instantiation, a \WebViewController\ for displaying web content with cookie support, and extensions for image loading via Alamofire and Kingfisher. Additionally, the update adds support for haptic feedback generation, a mail composer helper for support emails, and presentation helpers for handling modal sheets on iPad versus iPhone.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Library · high confidence
Behavioural changes
App launch configuration and dark-mode-ready design system assets
The app now initializes core services (Facebook, Braze, Segment) and manages user sessions and push notifications at launch via a new AppDelegate. A comprehensive design system has been added, including a new Inter font, a full set of semantic color assets (alert, support, trust, etc.) with explicit light and dark mode definitions, and new template-rendering assets for the logo and search icon. Additionally, an Alpha entitlements file has been added to configure production push notifications and associated domains for universal links.
Kickstarter-iOS · high confidence
Centralized deep-link handling in AppDelegateViewModel
The deep-linking logic for the Project page has been consolidated into the new AppDelegateViewModel. This change centralizes how the app handles incoming URLs and user activities, ensuring that navigation to specific project pages uses the correct presentation style and is managed from a single location rather than being scattered across the app delegate.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS · high confidence
Comprehensive GraphQL query restructuring and new data capabilities
The GraphQL query layer has been significantly reorganized and expanded to support new features and performance optimizations. Key additions include a new Video Feed query, support for Pledge Over Time (PPO) v2 tier types, and a dedicated query for fetching sorted rewards. Performance improvements are introduced via 'Fast Fetch' queries that split project page data loading into base and extended property requests, alongside optimized queries for add-ons and backing management that include refund state support. The project fetch logic has been consolidated into a single parameterized query, and new queries have been added for managing user stored cards, default locations, and rich text example projects.
graphql/queries · high confidence
Discovery screen restructured into a paginated, tabbed interface
The Discovery feature has been refactored to use a new \DiscoveryViewController\ that manages a \UIPageViewController\ for horizontal paging between different discovery categories. This controller integrates a \SortPagerViewController\ for vertical sorting and a new \DiscoveryNavigationHeaderViewController\ to handle filter selection and header interactions. The underlying data flow is now driven by \DiscoveryPagesDataSource\ to manage the page transitions and \DiscoveryProjectsDataSource\ to populate the table views with sections for video feed banners, activity samples, onboarding, personalization, and project cards.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/Discovery/Controller · high confidence
Migrate UI layouts to Storyboards
The app's user interface for key screens, including the Activity feed, Backer Dashboard, and Backing details, has been migrated from XIB files to Storyboards. This change consolidates the layout definitions for these views, standardizing how the interface is constructed and managed within the framework.
Kickstarter-Framework/Sources/Kickstarter-Framework/Resources · high confidence
New GraphQL file list and test plan for KsApi
The KsApi module now includes a \GraphQLFiles.xcfilelist\ that explicitly registers 81 GraphQL definitions (fragments, queries, and mutations) and the \graphql-schema.json\ file, ensuring the build system correctly tracks these assets for code generation. Additionally, a new \KsApi.xctestplan\ has been added to configure test execution for the \KsApiTests\ target.
KsApi · high confidence
New configuration scaffolding for Segments, Statsig, and API endpoints
The project now includes a standardized configuration layer to support modern analytics and feature-flagging services. A new Secrets.swift.example file defines placeholder keys for Segment (staging and production write keys), Statsig (production, staging, development, and sandbox client keys), and Stripe, alongside API and web endpoints. This is supported by a Base.xcconfig setting to disable the Application Extension API and a placeholder GoogleService-Info.plist to ensure successful Debug builds.
Configs · high confidence
Project page and pledge flow controllers refactored to full-screen presentation
The Project page now presents as a full-screen modal on all devices, replacing the previous behavior where iPhones used a form-sheet presentation. This change is implemented in the ProjectPageViewController, which now configures its navigation controller with a full-screen style and a white background to prevent visual artifacts during transitions. The refactoring also introduces dedicated view controllers for sub-features—ProjectCreatorViewController, ProjectUpdatesViewController, and VideoViewController—each handling their own navigation and presentation logic, while the RestrictedCreatorViewController provides a new UI for displaying creator restrictions.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/ProjectPage/Controller · high confidence
Redesigned Manage Pledge flow with new UI components and Liquid Glass navigation
The Manage Pledge screen has been rebuilt using a new modular view controller architecture, introducing dedicated controllers for the pledge summary, reward received status, and payment method display. This update adds a collapsible payment schedule view for pledges paid over time, a new badge view component for status indicators, and a reward card table cell for displaying pledge details. Additionally, the navigation bar now adapts to the system's Liquid Glass style on iOS 26+ while maintaining an opaque white appearance on earlier versions for consistent visual behavior.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/ManagePledge · high confidence
Redesigned Pledged Projects Overview cards with new layout and status alerts
The Pledged Projects Overview card view has been rebuilt using SwiftUI to improve layout clarity and responsiveness. The new design introduces a structured two-column layout for project details and includes dedicated components for displaying shipping addresses (with edit capabilities) and project creator information. A new alert system displays status flags—such as payment failures, survey availability, or address lock warnings—using color-coded badges. The card also features a new reward-received toggle and updated action buttons (e.g., Fix Payment, Complete Survey) that reflect the current pledge state.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/PledgedProjectsOverview/CardView · high confidence
Redesigned Pledged Projects Overview with Activity Feed and V4 Empty State
The Pledged Projects Overview screen has been restructured to include a tabbed interface with two sections: Project Alerts and an Activity Feed. The Activity Feed tab is now automatically selected if the user has unseen activity, and badge counts for both tabs update dynamically. The empty state view has been updated to support a new V4 design, displaying different titles and descriptions based on the feature flag, and offering an 'Explore projects' button in V4 mode. The view also now handles Stripe 3DS configuration and displays message banners for actions like address confirmation and 3DS authentication.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/PledgedProjectsOverview · high confidence
Redesigned Thanks page with standard navigation bar and Liquid Glass styling
The Thanks page now uses a standard navigation bar with a custom close button that respects Liquid Glass theming and dark mode colors, replacing the previous presentation style. The view controller has been refactored to support a seamless header appearance and includes updated data sources and cells for displaying backed project recommendations.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/ThanksProjects · high confidence
Redesigned pledge and reward add-on selection flows with new UI components
The pledge and reward add-on selection interfaces have been rebuilt using new view controllers and views, introducing a more structured layout for the checkout experience. The PledgeViewController and PostCampaignCheckoutViewController now manage dedicated sub-views for payment methods, rewards, and shipping, while the PledgeSummaryViewController provides a clear breakdown of the total amount. New SwiftUI-based components like EstimatedShippingCheckoutView and UIKit-based views such as PledgeLocalPickupView and PledgeShippingSummaryView enhance the display of shipping details. The RewardAddOnSelectionViewController now features a dedicated table for add-on rewards with a new card-based cell design, allowing users to easily select quantities and view included items. These changes collectively streamline the pledge process, offering a more intuitive and visually consistent experience for backers.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/PledgeView, Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/RewardAddOnSelection · high confidence
Redesigned project reporting interface with expandable categories and new form view
The Report Project feature now uses a new SwiftUI-based interface. Users encounter an expandable list of report categories (ReportProjectInfoView) where tapping a group reveals sub-categories, and selecting a specific option navigates to a dedicated report form (ReportProjectFormView). This form displays the user's email and project URL, allows them to enter details in a text editor, and includes a send button with loading states. The previous implementation has been replaced by this hierarchical navigation and dedicated form layout.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/ReportProject · high confidence
Redesigned search interface with video feed banner and enhanced project cards
The Search feature has been rebuilt to include a Video Feed Banner at the top of results, a dedicated 'Most Popular' project card that displays extra-large, and a refined empty state with a 'Remove all filters' button. The search bar width is now constrained to 90% of the screen width, and the results list now supports a 'Discover Projects' title row alongside standard result counts.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/Search · high confidence
Regenerated GraphQL fragments for the Backer Dashboard and Backing flows
The GraphQL fragment definitions in GraphAPI/Sources/Fragments have been regenerated to align with updated schema contracts. This update introduces BackerDashboardProjectCellFragment to support the backer dashboard project list, refactors BackingFragment to include detailed project and reward data (such as NoRewardRewardFragment and expanded shipping rules), and adds PPOBackingFragment to support the new PPO v2 tier types. It also updates ExtendedProjectPropertiesFragment to include AI disclosure and environmental commitment fields, and refreshes comment-related fragments (CommentBaseFragment, CommentFragment, CommentWithRepliesFragment) to support threaded replies and author metadata.
GraphAPI/Sources/Fragments · high confidence
Rewards page UI overhaul with loading states and new cell components
The Rewards page now features a redesigned user interface with new view components to improve clarity and responsiveness. A new loading state is displayed using a shimmer effect on placeholder cards while data is being fetched. The reward cards themselves have been restructured into dedicated cell views (RewardCell, RewardCardContainerView, RewardCardView) that support new visual elements, including a 'Featured' badge and a disabled state for rewards that do not ship to the user's location. Additionally, a footer has been added to display the total count of available rewards.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/RewardsCollection/Views · high confidence
Rewards page now displays a loading state while fetching data
The Rewards page now shows a loading indicator (loading cells) while reward data is being fetched from the server, improving the user experience by providing visual feedback during the wait. This change introduces a \RewardCardLoadingCell\ and updates the \RewardsCollectionViewDataSource\ to handle loading states, ensuring users see immediate feedback when the page loads or refreshes.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/RewardsCollection/Controller · high confidence
Standardize code quality tooling and CI configuration
This change introduces a unified configuration for Swift code quality and formatting tools, adding \.swiftformat\ and \.swiftlint.yml\ files to enforce consistent style and catch potential issues. It also adds a \Dangerfile\ to integrate SwiftFormat and SwiftLint checks into the pull request workflow, ensuring violations are flagged automatically. The \Makefile\ is updated to support these tools, including targets for running tests and linting, and the \Kickstarter.xctestplan\ file is added to define test execution configurations for various targets. Additionally, \.gitattributes\ is configured to mark generated and vendored files appropriately, and \NOTICE.md\ is added to track third-party license information.
(repo-wide) · high confidence
Standardized GraphQL fragments for project, backing, and user data
This change introduces a comprehensive set of new GraphQL fragments in the \graphql/fragments\ directory to standardize data fetching across the application. Key additions include \ProjectFragment\ and its specialized subsets (\ProjectCardFragment\, \ProjectVideoFeedFragment\, \PPOProjectFragment\) to optimize queries for different UI contexts like project cards and video feeds. Backing data is now structured via \BackingFragment\ and \PPOBackingFragment\, supporting features like PPO (Pledge Project Overview) and payment increments. User-related data is consolidated into \UserFragment\ and \PublicUserFragment\, while financial details are handled by \MoneyFragment\ and \PaymentSourceFragment\. The update also adds support for rich text content via \RichTextFragment\, shipping rules via \ShippingRuleFragment\, and category hierarchies via \CategoryFragment\, ensuring consistent data shapes for the frontend.
graphql/fragments · high confidence
Updated GraphQL schema types and enums in GraphAPI
The GraphAPI schema layer has been regenerated to reflect backend changes, introducing new custom scalar types (Date, DateTime, Email, HTML, ISO8601DateTime, JSON) and a comprehensive set of new enums for feature flags, project states, payment types, and shipping preferences. Additionally, new input objects have been added to support mutations such as adding users to secret reward groups, blocking users, canceling backings, and completing on-session checkouts with Apple Pay.
GraphAPI/Sources/Schema · high confidence
Updated Xcode project schemes for new targets and configurations
The Xcode project schemes in the shared data directory have been updated to support the new build structure. A new scheme for the 'Generate GraphQL Library' target was added, and the main 'Kickstarter iOS' scheme was updated to include test targets from the KDS, Kickstarter-Framework, and KsApi containers. The 'RichPushNotifications' app extension scheme was added to support rich push notifications with Braze, and environment variables for snapshot testing and package resources were configured in the framework schemes.
Kickstarter.xcodeproj/xcshareddata · high confidence
Video feed audio respects iOS 26 silent switch and enables playback on volume up
The video feed now manages audio sessions to respect the device's physical silent switch on iOS 26 and later, starting in \.soloAmbient\ mode. Tapping the volume-up button or the overlay unmute button switches the session to \.playback\ to bypass the silent switch, while toggling the silent switch resets the session to \.soloAmbient\. On iOS versions below 26, the feed remains in \.playback\ mode, with mute state managed entirely via the overlay button.
Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/VideoFeed/Controller · high confidence
Workspace configuration files added
The Xcode workspace configuration has been updated by adding the workspace data file, workspace settings, and IDE workspace checks. These changes establish the standard workspace structure and settings for the project, ensuring consistent build environment configuration across development environments.
Kickstarter.xcodeproj/project.xcworkspace · high confidence
Xcode project restructured with new targets and framework dependencies
The Xcode project file has been completely regenerated to introduce a new 'Generate GraphQL Library' aggregate build target and integrate several new framework dependencies, including GraphAPI, GraphAPITestMocks, SegmentBrazeUI, and Statsig. The project structure now explicitly links these libraries and includes updated test source files for various view models and use cases, reflecting a shift in the build configuration to support these new components.
Kickstarter.xcodeproj · high confidence
Test coverage
Added UI snapshot tests for Pledge, Post-Campaign Checkout, and Add-On Selection views; Added iOS test bundle for Keychain and AppEnvironment functionality; Added snapshot and unit tests for Discovery UI components; Added snapshot and unit tests for Manage Pledge UI components; Added snapshot and unit tests for the Search feature; Added snapshot tests for Project Page and Restricted Creator views; Added snapshot tests for ProjectPage navigation bar states; Added snapshot tests for Rewards Collection views; Added snapshot tests for Video Feed UI components; Added snapshot tests for the Beta Tools view controller; Added test fixtures for project, backing, and reward queries; Added test suite for AppDelegateViewModel and UI snapshot tests; Added tests for Pledged Projects Overview components; Added tests for RichText element normalization and GQL conversion; Added tests for Server-Driven UI rich text styling; Added unit and snapshot tests for Backer Dashboard Projects; Added unit tests for API extensions and mock clients; Added unit tests for API mutations and input models; Added unit tests for Activity, Backer Dashboard, and Apple Pay view models; Added unit tests for GraphQL model decoding and adapter inputs; Added unit tests for KsApi model JSON decoding and encoding; Added unit tests for Library components; Added unit tests for RewardsCollectionViewDataSource; Added unit tests for Server-Driven UI blocks; Added unit tests for SimilarProjects use case and data parsing; Added unit tests for Statsig experiment and feature helper logic; Added unit tests for VideoFeed playback state management; Added unit tests for library tracking and analytics components; Added unit tests for the Thanks Projects feature; Generated mock objects for GraphQL API testing; New test helpers for mocking GraphQL responses and observing Combine publishers.
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 42 → 64 (+21.7)
- Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 100 → 90 (-9.7)
- Architecture 92 (new)
- Maturity 26 → 59 (+33.0)
- Readiness 23 → 55 (+31.9)
- Security 100 → 76 (-23.9)
Resolved (8)
- Dimension evaluation failed
- No automated tests
- No exposed public API
- No tests found
- Test reliability not included
- early-stage repository — too little history to judge knowledge freshness
- single-commit history — no usable git history window to measure hotspots
- single-maintainer — knowledge-concentration (bus factor) risk
New (545)
- AppDelegateViewModel.init (cognitive 20) (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/AppDelegateViewModel.swift)
- AppDelegateViewModel.init (cyclomatic 21) (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/AppDelegateViewModel.swift)
- Boundary-crossing change coupling: ActivitiesDataSource.swift ↔ ActivitiesViewModel.swift (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/Activities/Datasource/ActivitiesDataSource.swift)
- Boundary-crossing change coupling: AppDelegate.swift ↔ Segment.swift (Kickstarter-iOS/AppDelegate.swift)
- Boundary-crossing change coupling: AppDelegateViewModel.swift ↔ KeyValueStoreType.swift (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/AppDelegateViewModel.swift)
- Boundary-crossing change coupling: AppDelegateViewModel.swift ↔ Segment.swift (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/AppDelegateViewModel.swift)
- Boundary-crossing change coupling: BackingTemplates.swift ↔ ManagePledgeViewModel.swift (KsApi/Sources/KsApi/models/templates/BackingTemplates.swift)
- Boundary-crossing change coupling: CommentsViewController.swift ↔ CommentRepliesViewModel.swift (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/Comments/Controllers/CommentsViewController.swift)
- Boundary-crossing change coupling: FilterRootView.swift ↔ SearchFilterPill.swift (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/SortFilter/FilterRootView/FilterRootView.swift)
- Boundary-crossing change coupling: PledgePaymentIncrement+GraphAPI.swift ↔ ManagePledgeViewModel.swift (KsApi/Sources/KsApi/models/PledgePaymentIncrement+GraphAPI.swift)
- Boundary-crossing change coupling: RewardAddOnSelectionViewController.swift ↔ RewardsCollectionViewModel.swift (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/RewardAddOnSelection/Controller/RewardAddOnSelectionViewController.swift)
- Boundary-crossing change coupling: SearchViewController.swift ↔ SearchFilterPill.swift (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/Search/Controller/SearchViewController.swift)
- Boundary-crossing change coupling: SearchViewController.swift ↔ SearchFilters.swift (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/Search/Controller/SearchViewController.swift)
- Boundary-crossing change coupling: VideoFeedCell.swift ↔ VideoFeedViewModel.swift (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/VideoFeed/Cell/VideoFeedCell.swift)
- Boundary-crossing change coupling: VideoFeedOverlayView.swift ↔ VideoFeedViewModel.swift (Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/VideoFeed/Overlay/VideoFeedOverlayView.swift)
- Change coupling: Backing+BackingFragment.swift ↔ BackingLenses.swift (KsApi/Sources/KsApi/models/graphql/adapters/Backing+BackingFragment.swift)
- Change coupling: Environment.swift ↔ TestCase.swift (Library/Sources/Library/Library/Environment.swift)
- Change coupling: ManagePledgeViewModel.swift ↔ MockPledgeOverTimePlanIncrements.swift (Library/Sources/Library/Library/ViewModels/ManagePledgeViewModel.swift)
- Change coupling: MessagesViewModel.swift ↔ ProjectPageViewModel.swift (Library/Sources/Library/Library/ViewModels/MessagesViewModel.swift)
- Change coupling: MockService.swift ↔ Route.swift (KsApi/Sources/KsApi/MockService.swift)
- …and 525 more
Changes since last survey
- 37 commits — 33 feature/other, 4 fixes
By area
- Kickstarter-Framework/Sources — 15 commits
- GraphAPI/Sources — 6 commits
- KsApi/Sources — 4 commits
- Library/Sources — 3 commits
- ServerDrivenUI/Sources — 3 commits
- Kickstarter.xcodeproj/project.pbxproj — 2 commits
- (root) — 1 commit
- .circleci/config.yml — 1 commit
- Experimentation/Sources — 1 commit
- GraphAPI/GraphAPITestMocks — 1 commit
Notable commits
- fix: DISC-431: Fix project preview currency conversion (#2997)
- fix: DISC-486: Fix pagination bug causing unstable results in Search (#3000)
- fix: Fix animated GIFs in RichTextView ImageBlock (#2958)
- fix: Fix linking (#2966)
- change: Bumping version to 5.37.0 (#2968) (#2969)
- change: Bumping version to 5.38.0 (#2998) (#2999)
- change: CHECK-395, DISC-378: Move ExtendedProjectProperties and Video out of ProjectFragment (#2949)
- change: CHECK-395: Add fast fetch to ProjectPageFetcher (#2950)
- change: CHECK-395: Hook new project page fetch into ProjectPageViewModel (#2952)
- change: CHECK-395: Make project page fetch faster by making reward image and items optional (#2954)
- change: CHECK-398: Add speedy checkout experiment (#2956)
- change: CHECK-400: Add fast fetch for reward add-ons (#2976)
- change: CHECK-400: Pull out add-ons query into a helper function (#2973)
- change: CHECK-400: Refactor simple shipping rules fragment (#2974)
- change: DISC-433, MBL-2868: Strip HTML using SwiftSoup (#2996)
- change: PF-479: Use different account for Fastlane access (#2959)
- change: Remove RichText OEmbed thumbnail (#2986)
- change: Reset audio session to .soloAmbient on each new video and when the silent switch toggles (#2970)
- change: Temporarily disable beta and alpha deploys (#2962)
- change: Video Feed: Replace Private API Usage and Extract Audio Session Logic Into Its Own File (#2971)
- …and 17 more
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/ios-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 27 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 ab124eb679a58056a1ae78bc25ce82050f01d80f — 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-d00c643c3f66.