Skip to content
CAI
Software that uses CAICheck a score

mehrankmlf/EasyCrypto

63.7

Adequate · 21 September 2026

3.7k

lines of production code

Swift

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

EasyCrypto is an iOS application that provides cryptocurrency market data, including coin details, price trends, and search functionality. It features a coordinator-based architecture with a dedicated network layer, a repository pattern for data persistence via Core Data, and a comprehensive set of reusable UI components. The system supports wishlist management, in-app web browsing, and background task scheduling, all managed through a centralized dependency injection container.

Features

Added Core Data model for cryptocurrency data

A new Core Data model named 'Coins' has been introduced to persist cryptocurrency information. The 'CoinENT' entity includes attributes for tracking market data such as price, 24-hour price change, market capitalization, supply metrics, and image URLs, enabling local storage and retrieval of coin details within the application.

EasyCrypto/Persistance/CoinsDB.xcdatamodeld · high confidence

Added SafariView component for in-app web browsing

A new SwiftUI-compatible wrapper for SFSafariViewController has been introduced in the core module, allowing the application to display web content within the app using a configurable Safari view controller.

EasyCrypto/Core/SafariView · high confidence

Added WorkScheduler for background task management

Introduced a new \WorkScheduler\ class that provides a pre-configured \OperationQueue\ for background operations (max 5 concurrent tasks, user-initiated quality of service) and exposes the main run loop and main thread dispatch queue for UI-related work.

EasyCrypto/Core/WorkScheduler · high confidence

Added coin detail view with price and market data display

Introduced new SwiftUI components (CoinDetail, DetailView, PriceView) that display detailed cryptocurrency information, including current price, market cap, 24-hour volume, and supply metrics. Users can now view comprehensive coin statistics and save items to their wishlist via a persistence toggle.

EasyCrypto/Presentation/Detail/View · high confidence

Three new use-case classes have been introduced in the domain layer to handle specific business logic: CoinMarketUsecase for retrieving coin details, MarketPriceUsecase for fetching market price data, and SearchMarketUsecase for executing search queries. Each class implements a corresponding protocol and delegates data retrieval to its respective repository, supporting the application's core data flow.

EasyCrypto/Domain/Usecase · high confidence

Added reusable UI components and utilities

The app now includes a suite of new core components: an ActivityIndicator for loading states, a CustomAlertView for displaying modal dialogs, a Dropdown for selection lists, and a SpinnerView for overlaying loading states. Additionally, new ViewModifiers (NavigationBarModifier, PlaceholderModifier) and utility classes (CurrencyFormatter, DecimalFormatter, ImageDownloader with caching) have been introduced to standardize UI behavior and data presentation.

EasyCrypto/Core/Components · high confidence

Added utility extensions and helper classes to the support layer

The EasyCrypto support layer now includes a suite of new extension files that provide utility methods for common types, including Binding, CGFloat, Color, Double, HTTPURLResponse, Int, UINavigationController, Optional, Publisher, String, UIScreen, URL, URLRequest, and View. Additionally, a MessageHelper struct was added to standardize server and device error messages. These changes introduce new capabilities for UI state management, formatting, and error handling within the application.

EasyCrypto/Support/Extension · high confidence

Adds core logging and Combine cancellation utilities

Introduces a new \Log.swift\ file that provides a simple \log\ function for printing messages with thread context, and a new \Cancelable\ class in \EasyCrypto/Core/Subscriber\ that manages a set of \AnyCancellable\ subscriptions, allowing subscribers to cancel all associated Combine operations at once.

EasyCrypto/Core/Subscriber · medium confidence

Centralized app constants and UI strings

Added a new Constants.swift file that centralizes application configuration, including the database name (CoinENT), main UI titles (EasyCrypto, Coin Detail, Error), and placeholder text for search and various market data fields (e.g., Market Cap Rank, Global Rank, Volume, Supply).

EasyCrypto/Core/Constants · high confidence

Centralized asset name constants added

A new Assets.swift file introduces an enum containing static string constants for UI asset names, including magnifier, sort, back, hashtag, coinGecko, save, and unsave. This centralizes the string identifiers used across the application's theme and UI components.

EasyCrypto/Theme/Assets · high confidence

Introduce Combine-based publishers for Core Data operations

The persistence layer now exposes Combine publishers for Core Data operations, allowing asynchronous fetch, save, and delete actions to be handled reactively. New files (CoreDataFetchPublisher, CoreDataSaveModelPublisher, CoreDataDeleteModelPublisher) implement the Publisher protocol to wrap NSManagedObjectContext methods, while CoreDataManager provides a unified interface to access these publishers via protocols (CoreDataFetchProtocol, CoreDataSaveProtocol, CoreDataDeleteModelPublishing). This enables users to subscribe to Core Data results and mutations using standard Combine operators.

EasyCrypto/Persistance · high confidence

Introduce centralized font and color theming

The app now uses a dedicated theming system for typography and colors. A new FontManager provides pre-configured fonts (headlines, titles, body text) using the Arial Rounded MT Bold typeface, while a Color extension defines reusable color constants (darkBlue, lightBlue, lightGreen) to standardize the UI's visual style.

EasyCrypto/Theme/Fonts · high confidence

Introduce new RequestBuilder protocol and implementation for network requests

A new RequestBuilder protocol and its HttpRequest implementation have been added to the networking layer. This introduces a structured way to build URLRequest objects, handling base URL construction, query parameter encoding (default, percent-encoded, and x-www-form-urlencoded), body encoding (JSON and form-encoded), and cache/timeout configuration. Users of the library will now interact with a more explicit request-building pattern for network calls.

EasyCrypto/Core/Networking/RequestBuilder · high confidence

Introduced AppDependencyContainer for dependency injection

A new AppDependencyContainer.swift file was added to the EasyCrypto/DIManager directory. This introduces a DIContainer class that implements a DIContainerProtocol, providing a shared instance for registering and injecting dependencies via a services dictionary. This change establishes the foundation for dependency injection within the application.

EasyCrypto/DIManager · high confidence

Introduced AppRouter and BaseViewModel for navigation and state management

Added AppRouter, a SwiftUI ViewModifier that manages navigation transitions (push, bottom sheet, URL) and a BaseViewModel class that handles loading states and API call callbacks using Combine. These new components provide a standardized way to handle navigation and view-model interactions across the app.

EasyCrypto/Base · high confidence

Introduced CoinDetailViewModel with Combine-based data flow

Added a new CoinDetailViewModel that uses Combine to manage coin detail data and navigation. The view model exposes a @Published coinData property and a navigateSubject for routing, implementing a DataFlowProtocol to handle a Load input (onAppear) and user interactions (didTapFirst).

EasyCrypto/Presentation/CoinDetail/ViewModel · high confidence

Introduced Coordinatable protocol for view routing

A new Swift protocol, Coordinatable, has been added to the EasyCrypto core. This protocol defines a generic associated type for a Route, enabling views to implement a routing mechanism. This change provides the foundational structure for managing navigation and state coordination within the application's UI components.

EasyCrypto/Core/Coordinatable · high confidence

Introduced DataFlowProtocol to define data flow interfaces

Added a new protocol, DataFlowProtocol, which establishes a generic interface for data flow operations. This protocol defines a generic InputType and an apply method, providing a standardized way to handle data transformations within the EasyCrypto core.

EasyCrypto/Core/DataFlow · high confidence

Introduced MainViewModel for the main screen

Added a new MainViewModel class that manages the state and logic for the main view, including market data loading, search functionality, sorting, and wishlist retrieval.

EasyCrypto/Presentation/Main/ViewModel · high confidence

Introduced NetworkClientManager for network request handling

Added a new NetworkClientManager class that manages network requests using a provided URLSession client. The manager exposes a request method that accepts a Target conforming to RequestBuilder, a JSONDecoder, a Scheduler, and a response object type, returning an AnyPublisher for the decoded response. This provides a centralized way to perform network calls with configurable decoding and scheduling.

EasyCrypto/Core/Networking/ClientManager · high confidence

Introduced new NetworkClient and request handling infrastructure

Added new networking components including the NetworkClient class and its protocol, which provide a Combine-based API for executing HTTP requests and handling responses. The implementation includes a NetworkTarget protocol and its default extension to define request parameters such as headers, timeouts, and cache policies. This establishes the core API client structure for the application's network layer.

EasyCrypto/Core/Networking/Client · high confidence

New Coin Detail view with header, ranking, and description

The app now displays a dedicated Coin Detail screen featuring a header with the coin's image, name, symbol, and links, alongside a description section. The view also shows the coin's market cap and CoinGecko rankings. This new SwiftUI-based view replaces the previous implementation, providing a more structured and visually consistent presentation of coin information.

EasyCrypto/Presentation/CoinDetail/View · high confidence

New ViewModifiers for lifecycle and state management

Added HandleViewModelStateModifier to automatically sync view state (loading, alerts) with a ViewModel's loading state, and ViewDidLoadModifier to execute a closure once a view appears. These modifiers simplify handling common UI states and view lifecycles in SwiftUI.

EasyCrypto/Support/ViewModifier · high confidence

New data repository layer for crypto market data

The app now uses a dedicated repository layer in the Data/Repository directory to handle all data fetching and caching. Four new Swift files introduce protocols and implementations for retrieving and storing market price data, coin details, and search results. The \MarketPriceCacheRepository\ manages local Core Data persistence for market prices, while \CoinDetailRepository\, \MarketPriceRepository\, and \SearchMarketRepository\ wrap remote API calls using Combine publishers. All repositories are initialized via dependency injection, allowing the app to fetch live data and cache it locally for offline access.

EasyCrypto/Data/Repository · high confidence

Added new domain entity structs to the application's data layer, including CoinUnit, CoreDataMarketData, MarketsPrice, and SearchMarket. These structs define the structure for cryptocurrency data such as price, market cap, and search results, enabling the app to parse and display detailed market information and search functionality.

EasyCrypto/Domain/Entity · high confidence

New networking core: HTTP methods, encoding, error handling, and debug logging

The networking layer now includes explicit HTTP method definitions (GET, POST, PUT, DELETE) and URL encoding utilities for query parameters and request bodies. A dedicated error type (APIError) maps HTTP status codes and network conditions to specific error cases, while an API response model parses standard error structures. Additionally, an API debugger is introduced to log request and response details for troubleshooting.

EasyCrypto/Core/Networking/Utility · high confidence

Added three new remote data sources—CoinDetailRemote, MarketPriceRemote, and SearchMarketDataRemote—that handle API requests for fetching individual coin details, a list of market prices with pagination and sparkline options, and search results respectively. These new classes implement specific protocols and request configurations to support the app's data layer for these features.

EasyCrypto/Data/Remote · high confidence

Architecture

Introduces centralized dependency injection and coordinator-based navigation

The app now uses a centralized DI container to register all remote, repository, and use-case components, replacing previous ad-hoc instantiation. Navigation is handled via a MainCoordinator that receives the injected view models and provides a Core Data managed object context via SwiftUI's environment, enabling consistent data persistence and cleaner architecture.

EasyCrypto/App · high confidence

Behavioural changes

Added wishlist management capabilities to the crypto detail view

Users can now add, remove, and check the status of items in their wishlist directly from the crypto detail screen. The new DetailViewModel introduces methods to save items to a cache repository, delete them by name, and verify if an item already exists in the wishlist, with error handling for persistence operations.

EasyCrypto/Presentation/Detail/ViewModel · high confidence

Introduced MainCoordinator to manage navigation and state for the main view

Added a new MainCoordinator struct that manages the main view's state, including active routes and transitions. It subscribes to the MainViewModel's navigation subject to update the active route, and handles routing to either a DetailView or a CoinDetailCoordinator based on the route type.

EasyCrypto/Presentation/Main/Coordinator · high confidence

Introduces coordinator pattern for Coin Detail navigation

The Coin Detail screen now uses a dedicated coordinator to manage internal navigation states and route transitions. This change encapsulates the logic for handling deep links (such as opening a Safari view) and managing the active route state, separating navigation concerns from the view and view model.

EasyCrypto/Presentation/CoinDetail/Coordinator · high confidence

Major project restructuring with new architecture and UI components

The EasyCrypto project has been significantly refactored to support a coordinator-based navigation architecture, introducing new files such as MainCoordinator, CoinDetailCoordinator, and AppRouter. The update also integrates Core Data with Combine publishers for data persistence, adds a comprehensive network client layer with HTTP and encoding utilities, and introduces numerous UI components including CoinDetailView, SearchBar, and various formatters and extensions. Additionally, the project configuration has been updated to reduce the minimum deployment target from iOS 16 to 15.

EasyCrypto.xcodeproj · medium confidence

Redesigned main screen with new list, search, and sort components

The main screen now features a complete UI overhaul including a new CryptoCellView for displaying coin data, a SearchBar with dropdown suggestions, and a SortView for toggling market cap ranking order. The MainView has been refactored to integrate these components, adding a wishlist tab, an alert view for error handling, and improved data persistence for items.

EasyCrypto/Presentation/Main/View · medium confidence

Updated Xcode scheme configuration

The Xcode project scheme for EasyCrypto has been updated, including the addition of a new scheme file that configures build, test, launch, profile, analyze, and archive actions. This change reflects a refactoring of the development environment settings, likely to support parallelized builds and enable code coverage for unit and UI tests.

EasyCrypto.xcodeproj/xcshareddata · medium confidence

Updated iOS app configuration and launch screen

The app now includes a custom launch screen (Splash) and configures system behaviors via Info.plist. Specifically, the app registers the 'arialbold' font, disables view-based status bar appearance, and displays a splash image on a dark background during startup. The previous default ContentView was removed.

EasyCrypto · medium confidence

Xcode workspace settings migrated to shared location

The Xcode workspace configuration has been moved from a user-specific directory (xcuserdata) to the shared workspace settings file (WorkspaceSettings.xcsettings). This change ensures that workspace-level settings, such as autocreating contexts, are consistent across all developers and are no longer tied to individual user profiles.

EasyCrypto.xcodeproj/project.xcworkspace · medium confidence

Test coverage

Added mock implementations for testing; Added unit tests for Core Data caching; Added unit tests for app view models; Added unit tests for entity and networking components.

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 62 → 64 (+1.7)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 100 (-0.4)
  • Architecture 99 → 95 (-3.6)
  • Maturity 44 → 48 (+3.6)
  • Readiness 57 → 59 (+2.1)
  • Security 92 → 97 (+5.4)

Resolved (7)

  • Change coupling: DetailView.swift ↔ MainView.swift (EasyCrypto/Presentation/Detail/View/DetailView.swift)
  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — no supported dependency manifest was read
  • No exposed public API
  • Test reliability not included
  • The Usage note links to Medium but does not state where or how one can run the app locally (e.g. build/run command). (README.md)
  • complexity unreadable for .swift — churn × complexity hotspots could not be measured

New (15)

  • Assertions commented out: testExample (EasyCryptoTests/EasyCryptoTests.swift)
  • Assertions commented out: testExample (EasyCryptoUITests/EasyCryptoUITests.swift)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (11 lines × 2) (EasyCrypto/Presentation/CoinDetail/Coordinator/CoinDetailCoordinator.swift)
  • Duplicated block (12 lines × 2) (EasyCrypto/Domain/Entity/CoreDataMarketData.swift)
  • Duplicated block (5 lines × 2) (EasyCrypto/Domain/Entity/CoinUnit.swift)
  • Medium: security finding (details withheld)
  • No ADRs found
  • No assertions: testLaunch (EasyCryptoUITests/EasyCryptoUITestsLaunchTests.swift)
  • No assertions: testLaunchPerformance (EasyCryptoUITests/EasyCryptoUITests.swift)
  • No assertions: testPerformanceExample (EasyCryptoTests/EasyCryptoTests.swift)
  • Test project verifies nothing: EasyCryptoTests (EasyCryptoTests/EasyCryptoTests.swift)
  • Test project verifies nothing: EasyCryptoUITests (EasyCryptoUITests/EasyCryptoUITests.swift)
  • Workflow token permissions not restricted

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

Survey your own repository

mehrankmlf/EasyCrypto 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 21 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 befca355402723af02d7ba250edc37c85b3dcf72 — 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-b84573e22831.