Skip to content
CAI
Software that uses CAICheck a score

nickbutcher/plaid

57.1

Adequate · 25 September 2026

22.4k

lines of production code

Kotlin

with Java

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This release delivers a comprehensive architectural overhaul, migrating the codebase to Kotlin, AndroidX, and a modularized structure with dedicated feature modules for About, Designer News, Dribbble, and Search. Significant changes include the introduction of Dagger 2 for dependency injection across all modules, the adoption of the ViewModel and DataBinding patterns for UI logic, and the implementation of Coroutines for asynchronous data loading. The update also features a complete rewrite of the Plaid 2.0 about screen, refactored API clients for Designer News and Dribbble, and the removal of legacy data layers and custom UI widgets, accompanied by extensive new unit and integration tests.

Features

About screen now displays a structured list of open-source libraries

The About screen has been refactored to use a new data model and ViewModel architecture. Users will see a dedicated list of open-source libraries used in the app, including Android Jetpack, Dagger2, Glide, and others, each with a title, description, and link. This change introduces the \AboutUiModel\ and \LibrariesUiModel\ data classes to structure the UI state, and an \AboutViewModel\ that manages the library list and click events. The \AboutViewModelFactory\ is also added to support dependency injection for the ViewModel.

about/src/main/java/io/plaidapp/about/ui/model · high confidence

About screen restructured with new model and UI components

The About screen now uses a dedicated \Library\ data class to model open-source credits, and introduces \AboutActivity\ and \AboutStyler\ to handle the UI and styling respectively. The activity manages the ViewPager2 with page margins and handles link navigation via Custom Tabs, while the styler provides theme-aware colors for links and highlights.

about/src/main/java/io/plaidapp/about/ui · high confidence

Added CI/CD scripts for linting and Firebase Test Lab testing

New shell scripts were added to the \scripts\ directory to support continuous integration workflows. \ftl\_setup.sh\ and \ftl\_run\_tests.sh\ configure Google Cloud authentication and execute Android instrumentation tests via Firebase Test Lab, specifically targeting the \plaid\ and \core\ APKs on a Pixel 2 device. \copy\_lint\_results.sh\ automates the collection and renaming of lint report files. Additionally, \greclipse.properties\ provides Groovy/Java formatting rules, and \installFromBundle.sh\ facilitates installing APKs from Android App Bundles. A Java source file was also moved to \scripts/copyright.kt\ to update the copyright header.

scripts · high confidence

Added circular reveal transition for search UI

A new CircularReveal transition class has been added to the search UI, enabling views to be revealed or concealed using a circular clipping mask animation. This allows for smoother, more engaging visual feedback when search-related UI elements appear or disappear.

search/src/main/java/io/plaidapp/search/ui/transitions · high confidence

Added custom UI widgets for About screen

Introduced two new custom Android views in the About section: CutoutTextView, which punches out text from an opaque color block to create a see-through effect, and InkPageIndicator, which provides an animated page indicator for ViewPager2. These components enhance the visual presentation of the About page with specialized drawing logic and animations.

about/src/main/java/io/plaidapp/about/ui/widget · high confidence

Added source file for Plaid product icon

A new source file, \art/plaid\_product\_icon\_noshadow.ai\, has been added to the repository. This Adobe Illustrator document contains the vector artwork for the Plaid product icon, including specific color swatches such as 'Custom Green A200' and various 'Blue Grey' shades, which are used to generate the application's launcher and product icons.

art · high confidence

Implemented search data source for Designer News

Added new classes to enable searching within Designer News. The \DesignerNewsDataSource\ handles fetching search results via the \StoriesRepository\, while the \DesignerNewsSearchDataSourceFactory\ creates these data sources. A \DesignerNewsSearchDataSourceFactoryProvider\ is introduced to supply the factory, using the activity context to build the dependency graph.

designernews/src/main/java/io/plaidapp/designernews/domain/search · high confidence

Introduces SearchViewModel to manage search state and data loading

The search feature now uses a dedicated SearchViewModel to handle search queries, manage loading states, and prepare data for display in the SearchActivity. This change decouples the view from direct data fetching logic, centralizing the search flow and progress tracking within the ViewModel.

search/src/main/java/io/plaidapp/search/ui · high confidence

New domain use cases for shot UI model creation and sharing

Added two new domain use cases: CreateShotUiModelUseCase, which converts a raw Shot model into a formatted ShotUiModel for the UI, and GetShareShotInfoUseCase, which prepares the necessary information (image URI, title, text, MIME type) for sharing a shot.

dribbble/src/main/java/io/plaidapp/dribbble/domain · high confidence

New use cases for loading and posting comments and stories

Added new domain use cases to handle Designer News interactions: GetCommentsWithRepliesAndUsersUseCase and GetCommentsWithRepliesUseCase manage fetching comments with their reply trees and associated user data; GetStoryUseCase retrieves individual stories; PostReplyUseCase and PostStoryCommentUseCase enable posting replies and story comments for the logged-in user.

designernews/src/main/java/io/plaidapp/designernews/domain · high confidence

Plaid 2.0 rewrite and privacy policy added

The project introduces a new PRIVACY.md file detailing how user data from Dribbble and Designer News is stored locally. The README.md is updated to describe the Plaid 2.0 rewrite using Android Architecture Components and Kotlin, including setup instructions for ktlint and Android Studio 3.6+. The LICENSE and NOTICE files are updated to reflect the copyright holder as Google LLC. Additionally, the Gradle wrapper scripts (gradlew, gradlew.bat) are updated to version 5.6.4, and the .gitignore is updated to exclude ktlint and google-services.json.

(repo-wide) · high confidence

Removals

Removal of custom UI widget classes

Removed several custom Android view implementations from the app's UI layer, including BadgedFourThreeImageView, BaselineGridTextView, BottomSheet, CheckableImageButton, CutoutTextView, DynamicTextView, FABToggle, FabOverlapTextView, and FontTextView. These custom widgets are no longer part of the codebase.

app/src/main/java/io/plaidapp/ui/widget · high confidence

Removed legacy Dribbble API integration

The legacy Dribbble API client code, including the DribbbleService, DribbbleAuthService, and DribbbleSearch classes, has been removed from the application. This change eliminates the previous implementation for fetching and parsing Dribbble data, likely as part of a broader migration or cleanup of the Dribbble integration.

app/src/main/java/io/plaidapp/data/api/dribbble · high confidence

Removed legacy data layer classes

The legacy data management classes (BaseDataManager, DataManager, SearchDataManager, PlaidItem, Source, and ClientAuthInterceptor) have been removed from the app's data package. This cleanup removes the old implementation of data loading and source management, likely as part of a broader refactoring or migration to a new architecture.

app/src/main/java/io/plaidapp/data · high confidence

Architecture

Introduce Dagger dependency injection for the About feature

The About feature now uses Dagger for dependency injection. A new \AboutComponent\ and \AboutActivityModule\ provide dependencies like \AboutStyler\ and \Resources\ to \AboutActivity\. An \Injector\ utility is added to trigger the injection process, enabling the About screen to receive its required objects through the Dagger framework.

about/src/main/java/io/plaidapp/about/dagger · high confidence

Introduced core dependency injection and data management infrastructure

Added core Dagger components (CoreComponent, BaseComponent) and modules (CoreDataModule, DataManagerModule, etc.) to manage application-wide singletons like OkHttpClient and Gson. Introduced a new DataManager class to coordinate data loading from various sources (Designer News, Dribbble, Product Hunt) and a CoroutinesDispatcherProvider for background threading. Added ProGuard rules for core libraries and AndroidManifest.xml for the core module.

core · high confidence

Behavioural changes

About screen refactored to use RecyclerView adapters

The About screen's UI has been refactored to use RecyclerView-based adapters (AboutPagerAdapter, LibraryAdapter, LibraryHolder) for displaying app information, icons, and open-source libraries. This change improves the structure and maintainability of the About page by separating the presentation logic into distinct adapter components, allowing for more efficient rendering and easier management of the three main sections (About Plaid, Icon, and Libraries).

about/src/main/java/io/plaidapp/about/ui/adapter · high confidence

Add threaded comment drawable for UI theming support

A new \ThreadedCommentDrawable\ class has been added to the \io.plaidapp.ui.drawable\ package. This drawable renders vertical lines to indicate the depth of a threaded conversation. It supports dynamic depth updates and includes \setTintList\/\setTint\ methods, which enable the component to adapt to day/night theming changes, ensuring the visual representation of comment threads aligns with the current theme.

designernews/src/main/java/io/plaidapp/ui/drawable · medium confidence

Added ProGuard configuration for app optimization and shrinking

The app now includes a dedicated ProGuard rules file (proguard-rules.pro) that configures code shrinking, obfuscation, and optimization. The configuration preserves specific classes and resources required by the Android framework, Retrofit, OkHttp, and other dependencies, while also removing package names to reduce the final APK size. This change enables the build system to safely minify and optimize the application code.

app · high confidence

Bypass markdown renderer now accepts explicit color and image loading callbacks

The Bypass markdown renderer has been refactored to remove the dependency on Android's TextView for styling. It now accepts explicit ColorStateList and int highlightColor parameters, allowing the caller to define link and highlight colors directly rather than extracting them from a TextView. Additionally, the internal LoadImageCallback interface has been extracted into its own file and is passed as a parameter, decoupling image loading logic from the core rendering pipeline.

_third\party/bypass/src/main/java · high confidence

Designer News API client refactored to support v2 endpoints

The existing Designer News API client has been removed, reflecting a migration from the v1 API (which included methods for top, recent, and search stories) to a new implementation that supports the v2 API, including the ability to upvote stories and post new stories.

app/src/main/java/io/plaidapp/data/api/designernews · medium confidence

Designer News uses Dagger for dependency injection

The Designer News module now uses Dagger for dependency injection, introducing new components (LoginComponent, StoryComponent, DesignerNewsSearchComponent) and modules (DataModule, SearchDataModule, StoryModule, etc.) to manage object creation and lifecycle. This replaces the previous manual or less structured injection approach, providing better testability and separation of concerns for the Designer News feature.

designernews/src/main/java/io/plaidapp/designernews/dagger · high confidence

Dribbble shot view refactored to use data binding and ViewModel

The Dribbble shot view has been refactored to use data binding and a dedicated ViewModel. This introduces a new ShotUiModel data class and a ShotViewModel that manages the shot's state, enabling cleaner separation of concerns and easier testing. The ShotActivity now uses data binding to connect the UI to the ViewModel, and the ShotBindingAdapters provide custom binding adapters for image loading, relative time formatting, and animated click handling. The ShotStyler handles locale-specific formatting and color styling for the shot description. This change improves the maintainability and testability of the Dribbble shot feature.

dribbble/src/main/java/io/plaidapp/dribbble/ui · high confidence

Introduce DesignerNewsViewModelFactory for ViewModel instantiation

A new factory class, DesignerNewsViewModelFactory, has been added to the DesignerNews UI module. This factory is responsible for creating instances of the LoginViewModel, utilizing dependency injection to provide the necessary LoginRepository and CoroutinesDispatcherProvider. This change aligns with the broader project effort to standardize ViewModel creation across the application using constructor injection via Dagger.

designernews/src/main/java/io/plaidapp/designernews/ui · high confidence

Introduces HomeActivity-specific Dagger components

The app now uses a dedicated Dagger component (HomeComponent) and module (HomeModule) to manage dependencies for the HomeActivity. This includes providing the HomeViewModel, connectivity checker, and other activity-scoped dependencies, replacing previous injection patterns. The Injector utility is updated to build and inject this new component.

app/src/main/java/io/plaidapp/dagger · medium confidence

Migrate RecyclerView utilities to Kotlin

The \FilterTouchHelperCallback\ class has been migrated from Java to Kotlin, introducing a more robust swipe-to-delete experience for custom search filters with visual feedback and shadow effects. Additionally, a new \GridItemDividerDecoration\ utility has been added to draw dividers for RecyclerView items implementing the \Divided\ interface, enhancing the visual separation of grid items.

app/src/main/java/io/plaidapp/ui/recyclerview · high confidence

Moved and refactored the DesignerNews database layer

The DesignerNews Room database implementation, including the database class, DAO, and type converters, has been moved from the app module to the designernews module. The type converters have been refactored from a Java utility class (GlideUtils) into a Kotlin class (Converters) to support Room's type conversion for list data types.

designernews/src/main/java/io/plaidapp/designernews/data/database · high confidence

New dynamic typography and password visibility widgets, plus AndroidX migration

The app introduces two new custom UI widgets: DynamicTypeTextView, which automatically scales text size to fit its container, and PasswordEntry, which animates the transition between masked and visible password text. Additionally, existing widgets like PinnedOffsetView and SquareLinearLayout have been migrated to the AndroidX library (e.g., androidx.core.view.ViewCompat) and moved into the designernews module, reflecting the ongoing modularization and AndroidX conversion efforts.

designernews/src/main/java/io/plaidapp/ui/widget · medium confidence

Redesigned Designer News story view with expandable comments

The Designer News story screen has been refactored to support a new comment system. Users can now view and post comments and replies on stories. The UI includes a new comment list with expandable/collapsible comment threads, allowing users to see nested replies. The view also supports day/night theming and handles window insets for proper layout on modern Android devices.

designernews/src/main/java/io/plaidapp/designernews/ui/story · high confidence

Redesigns the Designer News login flow with ViewModel and DataBinding

The Designer News login screen has been refactored to use a LoginViewModel and DataBinding, replacing the previous implementation. Users will experience a more responsive login interface where the login button is automatically enabled or disabled based on input validity, and UI states (loading, errors, success) are managed through a centralized view model. This change also introduces a toast confirmation upon successful login and utilizes Dagger for dependency injection within the login activity.

designernews/src/main/java/io/plaidapp/designernews/ui/login · high confidence

Refactor Dribbble dependency injection to use a shared CoreComponent

The Dribbble feature module now uses a new DribbbleComponent and DribbbleSearchComponent that depend on a shared CoreComponent, replacing the previous per-activity component structure. This change centralizes common dependencies and allows the Dribbble module to access core services like the ShotsRepository and CoroutinesDispatcherProvider through the shared graph, improving consistency across the app's DI setup.

dribbble/src/main/java/io/plaidapp/dribbble/dagger · high confidence

Refactored Designer News comments data layer

Moved and restructured the comments data layer into the designernews module. The CommentsRemoteDataSource and CommentsRepository are now located in the designernews module, along with the associated request and response models (CommentResponse, NewCommentResponse, etc.). This change consolidates the data handling for comments within the DesignerNews module, improving modularity and separation of concerns for comment-related API interactions.

designernews/src/main/java/io/plaidapp/designernews/data/comments · high confidence

Refactored Dribbble search data source and factory

The Dribbble search functionality has been refactored to use a new DribbbleDataSource class that handles search queries and pagination via a ShotsRepository, replacing the previous implementation. A corresponding DribbbleSearchDataSourceFactory and its provider have been introduced to manage the creation of search data sources, utilizing the activity context for dependency injection. This change modifies how search results are loaded and presented, specifically addressing the missing page weight for Shots and Stories.

dribbble/src/main/java/io/plaidapp/dribbble/domain/search · high confidence

Refactored Home screen to use a dedicated ViewModel

The HomeActivity now delegates feed and source management to a new HomeViewModel, which handles data loading, source updates, and login status. This change moves logic previously in the Activity and DataManager into the ViewModel, improving separation of concerns and testability. The HomeViewModelFactory is introduced to inject dependencies into the ViewModel via Dagger.

app/src/main/java/io/plaidapp/ui · high confidence

Refactored and consolidated utility classes

The app's utility layer has been refactored to improve code quality and modernize the codebase. Several legacy Java utility classes (AnimUtils, FontUtil, HtmlUtils, ImageUtils, ParcelUtils, and ViewUtils) have been removed or consolidated. A new Kotlin file, DrawingExtensions.kt, has been added to provide extension functions for Android's Shader class, indicating a shift towards Kotlin and extension functions for utility methods.

app/src/main/java/io/plaidapp/util · medium confidence

Refactored transition animations for improved performance and modularity

The \MorphDialogToFab\ transition was moved from the app module to the designernews module and refactored to use shared core utilities (\AnimUtils\) and drawables (\MorphDrawable\), while also adding support for a configurable corner radius. A new \StretchyChangeBounds\ transition was added to handle stretchy resize animations. These changes improve code reuse and performance by centralizing animation logic and drawable handling.

designernews/src/main/java/io/plaidapp/ui/transitions · high confidence

Refactors Designer News API client and authentication

The Designer News API client has been refactored to use a new \DesignerNewsService\ interface, which consolidates comment-related endpoints and request/response models within the designernews module. Additionally, a \ClientAuthInterceptor\ was added to handle authentication headers for API requests, improving how the app manages user sessions and client IDs.

designernews/src/main/java/io/plaidapp/designernews/data/api · high confidence

Removal of ThreadedCommentDrawable

The ThreadedCommentDrawable class, which was responsible for rendering the visual indicators for threaded conversations, has been removed from the application. This change eliminates the specific drawable component used to display comment depth in the UI.

app/src/main/java/io/plaidapp/ui/drawable · high confidence

Removed Designer News model classes

The application has removed the internal data models for Designer News, specifically Comment, NewStoryRequest, Story, and User. This change likely reflects a shift in how the app interacts with the Designer News API or a refactoring of the data layer, removing these specific Java classes from the codebase.

app/src/main/java/io/plaidapp/data/api/designernews/model · high confidence

Removed Pocket integration utility class

The PocketUtils class, which previously handled sharing content to the Pocket app via Android Intents, has been removed from the application. This eliminates the ability to save items to Pocket directly from the app.

app/src/main/java/io/plaidapp/data/pocket · high confidence

Removed deprecated Glide v3 image loading utilities

The app has removed several custom Glide v3 utility classes—specifically CircleTransform, DribbbleTarget, and ImageSpanTarget—which were part of the older image loading implementation. These files, which handled circular image cropping, animated GIF playback with palette extraction, and inline image rendering in text views, have been deleted, indicating a migration away from the legacy Glide v3 API.

app/src/main/java/io/plaidapp/util/glide · high confidence

Removed legacy Dribbble model classes

The legacy Dribbble data model classes—Comment, Images, Shot, Team, and User—have been removed from the app. This change eliminates the old serialization and parsing logic for these entities, indicating a shift in how Dribbble data is handled within the application.

app/src/main/java/io/plaidapp/data/api/dribbble/model · high confidence

Removed legacy preference managers for Designer News, Dribbble, and source management

The app has removed the \DesignerNewsPrefs\, \DribbblePrefs\, and \SourceManager\ classes from the \app/src/main/java/io/plaidapp/data/prefs\ directory. These files previously handled local storage of user state and source configurations for specific content providers. Their removal indicates a shift away from these specific local preference implementations, likely as part of a broader refactoring or migration of data persistence logic.

app/src/main/java/io/plaidapp/data/prefs · high confidence

Removed obsolete Product Hunt model classes

The \Post\ and \User\ model classes from the \io.plaidapp.data.api.producthunt.model\ package have been removed. These classes previously handled Parcelable serialization for Product Hunt data, indicating that the app no longer relies on these specific data structures for that API.

app/src/main/java/io/plaidapp/data/api/producthunt · high confidence

Replaces FAB-to-dialog morphing transition with a staggered distance slide

The app's transition system has been updated to use a new \StaggeredDistanceSlide\ implementation, which staggers elements by distance rather than using start delays, producing a more cohesive choreography for list items. Concurrently, the previous \FabDialogMorphSetup\, \MorphFabToDialog\, and \MorphDialogToFab\ classes have been removed, indicating the deprecation of the circular FAB-to-rectangular-dialog morphing animation in favor of the new sliding approach.

app/src/main/java/io/plaidapp/ui/transitions · high confidence

Search module adopts Dagger 2 for dependency injection

The Search module now uses Dagger 2 to manage dependencies. A new SearchComponent and SearchModule have been introduced to handle injection for SearchActivity, including the creation of a SearchViewModel and the discovery of SearchDataSourceFactory implementations (for Designer News and Dribbble) via reflection. This replaces previous manual or less structured injection approaches within the search feature.

search/src/main/java/io/plaidapp/search/dagger · high confidence

Search results now load in parallel across all data sources

The search functionality has been refactored to load data from all registered data sources concurrently. Previously, the search process likely executed data source calls sequentially or in a less optimized manner. Now, the \LoadSearchDataUseCase\ utilizes Kotlin's \supervisorScope\ and \async\ to fetch data from each \SearchDataSourceFactory\ in parallel, which should improve search performance and responsiveness. The \SearchDataSourceFactoriesRegistry\ manages the set of available data source factories, enabling this parallel execution model.

search/src/main/java/io/plaidapp/search/domain · high confidence

User data layer moved to DesignerNews module

The UserRemoteDataSource and UserRepository classes have been moved into the designernews module, establishing a dedicated data layer for fetching and caching user information from the DesignerNews API. This change isolates user-related data logic within the DesignerNews module, ensuring that the app's user data handling is modular and consistent with the new module structure.

designernews/src/main/java/io/plaidapp/designernews/data/users · high confidence

Test coverage

Add unit tests for AboutViewModel; Added Mockito inline mock maker configuration; Added UI tests for HomeActivity drawer behavior; Added integration test for AboutViewModel; Added test data for comments and replies; Added test-shared module with shared testing utilities; Added tests for DesignerNews domain use cases; Added tests for LoggedInUserDao database operations; Added unit tests for Designer News comments data layer; Added unit tests for DesignerNewsSearchDataSourceFactory; Added unit tests for Dribbble domain and UI components; Added unit tests for HomeViewModel; Added unit tests for StoryViewModel; Added unit tests for database converters; Added unit tests for the Search feature; Added unit tests for the login ViewModel; Added unit tests for user data layer components.

Dependencies

Modernizes build configuration and upgrades dependencies

The project's build system has been modernized to support AndroidX, dynamic feature modules, and Kotlin. Key updates include upgrading the Android Gradle plugin to 3.6.1, enabling data binding across modules, and migrating to AndroidX libraries (e.g., AppCompat, Lifecycle, Room). The build script now centralizes dependency versions in a shared configuration, and the app module integrates Crashlytics and Firebase. Additionally, the project structure has been expanded to include new dynamic feature modules for About, Designer News, Dribbble, and Search, each with their own build configurations and dependencies.

(dependencies) · high confidence

Updated Gradle wrapper to version 5.6.4

The Gradle wrapper has been upgraded from version 2.2.1 to 5.6.4. This change updates the build tooling used to compile and run the project, which may affect build performance and compatibility with newer Android Gradle Plugin versions.

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

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

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

Lenses

  • Code Health 100 → 95 (-4.5)
  • Architecture 94 → 89 (-5.1)
  • Maturity 50 → 54 (+4.1)
  • Readiness 23 → 50 (+26.5)
  • Security 63 → 77 (+14.3)
  • Domain Modelling 70 → 60 (-9.9)

Resolved (13)

  • Coverage not measured — test suite did not build
  • Dimension evaluation failed
  • Duplicated block (13 lines × 2) (designernews/src/main/java/io/plaidapp/designernews/ui/story/CommentViewHolder.kt)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Leaked secret: gcp-api-key (app/google-services.json)
  • Medium: security finding (details withheld)
  • No exposed public API
  • No tests found
  • Rotate the exposed credentials — git history can't be un-committed
  • Secret: generic-api-key (app/google-services.json)
  • Secret: generic-api-key (app/src/debug/google-services.json)
  • Test reliability not included

New (67)

  • Boundary-crossing change coupling: DesignerNewsSearchDataSourceFactoryProvider.kt ↔ SearchDataSourceFactoriesRegistry.kt (designernews/src/main/java/io/plaidapp/designernews/domain/search/DesignerNewsSearchDataSourceFactoryProvider.kt)
  • Change coupling: HomeComponent.kt ↔ Injector.kt (app/src/main/java/io/plaidapp/dagger/HomeComponent.kt)
  • Change coupling: HomeModule.kt ↔ Injector.kt (app/src/main/java/io/plaidapp/dagger/HomeModule.kt)
  • Change coupling: HomeViewModel.kt ↔ FilterAdapter.kt (app/src/main/java/io/plaidapp/ui/HomeViewModel.kt)
  • Change coupling: Injector.kt ↔ SearchComponent.kt (search/src/main/java/io/plaidapp/search/dagger/Injector.kt)
  • Change coupling: Injector.kt ↔ SearchModule.kt (search/src/main/java/io/plaidapp/search/dagger/Injector.kt)
  • Change coupling: LoginLocalDataSource.kt ↔ LoginRemoteDataSource.kt (core/src/main/java/io/plaidapp/core/designernews/data/login/LoginLocalDataSource.kt)
  • Change coupling: ProductHuntModule.kt ↔ DesignerNewsDataModule.kt (core/src/main/java/io/plaidapp/core/dagger/ProductHuntModule.kt)
  • Change coupling: ProductHuntModule.kt ↔ DribbbleDataModule.kt (core/src/main/java/io/plaidapp/core/dagger/ProductHuntModule.kt)
  • Change coupling: SourcesRepository.kt ↔ FilterAdapter.kt (core/src/main/java/io/plaidapp/core/data/prefs/SourcesRepository.kt)
  • ClassTooLong: InkPageIndicator (about/src/main/java/io/plaidapp/about/ui/widget/InkPageIndicator.java)
  • ClassTooLong: ReflowText (core/src/main/java/io/plaidapp/core/ui/transitions/ReflowText.java)
  • ClassTooLong: StoryActivity (designernews/src/main/java/io/plaidapp/designernews/ui/story/StoryActivity.java)
  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Dormant codebase
  • Duplicated block (10 lines × 2) (core/src/main/java/io/plaidapp/core/util/BindingAdapters.kt)
  • Duplicated block (11 lines × 2) (core/src/main/java/io/plaidapp/core/designernews/data/api/ClientAuthInterceptor.kt)
  • Duplicated block (13 lines × 2) (designernews/src/main/java/io/plaidapp/designernews/ui/story/CommentViewHolder.kt)
  • …and 47 more

Architecture

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

Added bounded contexts (7)

  • about
  • app
  • bypass
  • core
  • designernews
  • dribbble
  • search

Added dependency edges (7)

  • about → bypass
  • about → core
  • app → core (coupling)
  • core → bypass
  • designernews → core (coupling)
  • dribbble → core (coupling)
  • search → core (coupling)

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

Survey your own repository

nickbutcher/plaid 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 15958cc287f4a8efb2c39b65ca57cd41c7aad518 — 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.