nickbutcher/plaid
57.1
Adequate · 25 September 2026
22.4k
lines of production code
Kotlin
with Java
4
measurements over time
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.