Skip to content
CAI
Software that uses CAICheck a score

jonjomckay/fritter

55.8

Adequate · 19 September 2026

9.3k

lines of production code

Dart

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

Fritter is a third-party Twitter client for Android and iOS that provides a customizable interface for browsing tweets, managing subscriptions, and viewing trends. It supports extensive localization, media handling, and data management features such as import/export and group organization. The application relies on the official Twitter API for data retrieval and includes robust error reporting and state management capabilities.

How it got here

2021 — Initial scaffolding and major architectural rewrite

19 changes.

This period established the Fritter project's foundational infrastructure, including release automation and CI/CD pipelines, before executing a comprehensive rewrite of the application's core architecture. The work involved migrating from Nitter scraping to the official Twitter API, redesigning the user interface with Material 3 support, and restructuring the database and state management layers to support new features like groups and saved tweets.

5 changes.

This period focused on implementing comprehensive internationalization support, adding generated localization files and storyboard translations for numerous languages across the app. Additionally, a new user search feature was introduced, enabling debounced queries and the ability to save search results as subscriptions directly from the interface.

Features

Added Android fastlane automation and store metadata

This change introduces fastlane configuration for the Android build, enabling automated testing, beta distribution via Crashlytics, and deployment to the Google Play Store. It also adds the initial store listing metadata for the 'Fritter' app, including its title, short and full descriptions, and a changelog entry dated 2021-07-16.

android/fastlane · high confidence

Added generated internationalization (i18n) files for app localization

The app now includes generated localization files in lib/generated/intl, enabling support for multiple languages including Arabic, Belarusian, Catalan, Czech, German, and others. These files provide the translated strings required for the app's UI, such as settings, error messages, and navigation labels, allowing users to see the interface in their preferred language.

lib/generated/intl · high confidence

Added generated localization support for Fritter

The app now includes generated localization files (lib/generated/l10n.dart) that enable translating the Fritter interface into multiple languages. This change introduces the L10n delegate and message loading logic required to display UI strings in the user's selected language, supporting features like manual UI language selection and translated home screen page names.

lib/generated · high confidence

Added localized launch screens for iOS

The iOS app now includes localized launch screens for a wide range of languages, including Arabic, Belarusian, Catalan, Czech, German, Esperanto, Spanish, Estonian, Basque, French, Hindi, Hungarian, Indonesian, Italian, Japanese, Korean, Lithuanian, Latvian, Malayalam, Norwegian, Dutch, Oriya, Polish, Portuguese (Brazil and Portugal), Romanian, Russian, Swedish, Turkish, Ukrainian, Vietnamese, and Simplified Chinese. This ensures that the initial splash screen respects the user's device language settings.

ios · high confidence

Added new localization files for multiple languages

The app now includes generated localization files (ARB format) for Arabic, Belarusian (Cyrillic and Latin), Catalan, Czech, German, and English. These files provide the translated strings for the user interface, covering settings, error messages, and core app features, enabling users to see the app in their preferred language.

lib/l10n · high confidence

Initial project scaffolding and release infrastructure

This change establishes the foundational structure for the Fritter application by adding essential configuration files, including an MIT license, Dart editor and analyzer settings, and a .gitignore. It introduces automated shell scripts for building releases: a Play Store build script that generates translations and creates an app bundle with icon tree-shaking disabled, and a comprehensive release script that manages versioning (starting at 300,000,000), generates F-Droid metadata for multiple ABIs, and handles changelog management. The README is also significantly expanded to include store badges, feature lists, screenshots, and contribution guidelines.

(repo-wide) · high confidence

New settings screen with data import/export and donation options

The settings interface has been restructured into a new screen with tabs for General, Home, Theme, Data, and About. Users can now import and export their app data (settings, subscriptions, groups, and saved tweets) to a JSON file, with support for legacy Android devices. The About tab includes a new donation dialog offering multiple payment methods (GitHub Sponsors, Liberapay, PayPal, Bitcoin, and credit card) for non-Play Store builds, and allows users to copy the app version to the clipboard.

lib/settings · high confidence

New user search functionality with subscription support

The search module now includes a dedicated screen for searching Twitter users, featuring debounced input to optimize API calls and the ability to save search queries as user subscriptions directly from the search bar. The implementation introduces a new state management model for user searches and integrates with the existing subscription system, allowing users to follow accounts discovered through search without leaving the search interface.

lib/search · high confidence

The Trends screen has been updated to allow users to save and switch between multiple trend locations (e.g., different cities or countries) instead of a single static setting. Users can add new locations via the floating action button, which opens a settings dialog listing available locations grouped by country. A new tab bar at the top of the screen displays all saved locations, allowing quick switching between them. Long-pressing a tab allows users to delete that specific location. The active location is persisted in preferences, and the trends list automatically reloads when the selected location changes.

lib/trends · high confidence

Unified subscriptions view with import and grouping support

The subscriptions tab now displays a combined list of followed users and saved search queries, allowing users to toggle subscriptions and sort the list by name, username, or date. A new import screen enables bulk importing of subscriptions from an existing Twitter account, and a new groups feature lets users organize subscriptions into named groups with custom icons and colors.

lib/subscriptions · high confidence

Behavioural changes

Added iOS storyboard localization files for multiple languages

The iOS app now includes localized Main.storyboard files for the Arabic, Belarusian (Latin and Cyrillic), Catalan, Czech, German, Esperanto, Spanish, Estonian, Basque, French, Hindi, Hungarian, Indonesian, Italian, Japanese, Korean, Lithuanian, Latvian, Malayalam, Norwegian Bokmål, Dutch, Odia, Polish, Portuguese (Brazil and Portugal), Romanian, Russian, Swedish, Turkish, Ukrainian, Vietnamese, and Simplified Chinese locales. These files ensure the iOS interface respects the device's language settings for these regions.

fritter · high confidence

Catcher module refactored to use Sentry and console logging

The error handling module in lib/catcher has been rewritten to replace the previous implementation with direct integration to Sentry for exception reporting and Dart's developer log for console output. New exception types, including HttpException for HTTP response details and SyntheticException, have been introduced to support this new reporting mechanism.

lib/catcher · high confidence

Customizable home screen with saved tweets and subscriptions

The home screen now supports a customizable set of tabs, defaulting to Subscriptions, Groups, Trending, and Saved. Users can reorder, add, or remove these pages via settings, with the layout persisting across app restarts. A new Saved Tweets tab allows users to view locally stored tweets, including handling for tweets that are too large to display. The Subscriptions tab is now the default first page, replacing the previous Trends-first layout.

lib/home · high confidence

Database schema refactored with new entities and migration history

The database layer has been restructured to support new features like saved tweets, search subscriptions, and customizable subscription groups. A new \entities.dart\ file defines the data models, including \SavedTweet\, \SearchSubscription\, \UserSubscription\, and \SubscriptionGroup\. The \repository.dart\ file now manages a comprehensive migration plan (up to version 19) that handles schema changes such as renaming 'following' to 'subscription', adding UUIDs for group uniqueness, introducing verified status indicators, and supporting saved searches. This refactoring ensures data integrity and enables the new UI capabilities for managing subscriptions and saved content.

lib/database · high confidence

Fixes black screen in recent apps and renames app package

The app now correctly handles the recent apps screen mode to prevent a black display, achieved by adding a small delay in the activity's pause lifecycle. Additionally, the Android package name has been renamed from 'com.jonjomckay.flitter' to 'com.jonjomckay.fritter' to align with the application's branding, and the main application class now explicitly initializes MultiDex support.

android/app/src/main/kotlin · high confidence

Group details screen now displays empty state and manages its own data loading

The group details view now uses a dedicated model to load subscription group data and displays a specific message when a group contains no subscriptions, rather than showing an empty list. This change also introduces a button to add subscriptions directly from the empty state view.

lib/group · high confidence

Major app overhaul: new architecture, Twitter API migration, and UI redesign

This release introduces a comprehensive rewrite of the application's core architecture and user interface. The Twitter client has been migrated from scraping Nitter instances to using the official Twitter API with guest tokens, improving reliability and data access. The UI has been redesigned to support Material 3 theming, including a new color scheme picker, dark mode, and true black mode. A new setup wizard guides first-time users through configuration, including opt-in error reporting via Sentry. The app now features a new home screen with custom pages, a dedicated status screen for viewing individual tweets, and improved profile and subscription management with group support. Data handling has been refactored using a repository pattern and state management via Flutter Triple, with new models for imports and settings. Many legacy screens and components have been removed or replaced to streamline the experience.

lib · high confidence

New timestamp toggle, error widgets, and scroll physics

Users can now tap a date to switch between relative and absolute timestamps via the new Timestamp widget. Error handling is improved with dedicated error widgets (including emoji-based ones for specific Twitter codes) and consistent snackbar styling. Additionally, page view scrolling is less sensitive, reducing accidental page swipes.

lib/ui · high confidence

Redesigned profile screen with new tabs and infinite scrolling

The profile view has been rebuilt to use a tabbed interface with infinite scroll pagination, replacing the previous implementation. Users can now browse a user's tweets, replies, media, and saved tweets in dedicated tabs, as well as view their followers and following lists. The new layout includes pull-to-refresh, scroll-to-top functionality, and improved memory management for media and tweets.

lib/profile · high confidence

Refactored utility layer with new caching, download, and translation helpers

The lib/utils directory has been restructured into dedicated modules to improve code organization and functionality. A new cache utility (lib/utils/cache.dart) provides a JSON-based caching extension using ffcache, while translation logic (lib/utils/translation.dart) now includes explicit caching for API responses from libretranslate.de. Download handling (lib/utils/downloads.dart) has been extracted into a robust utility that manages storage permissions for Android 11+ (using manageExternalStorage) and supports both legacy paths and user-picked directories. Additional utilities include debouncing (lib/utils/debounce.dart), iterable extensions (lib/utils/iterables.dart), legacy Android path support (lib/utils/legacy.dart), and a safe URL launcher (lib/utils/urls.dart) using the non-deprecated url\_launcher\_string API.

lib/utils · high confidence

Rewrote tweet rendering with new media, video, and card components

The \lib/tweet\ directory has been completely refactored into a new modular structure, introducing dedicated components for handling tweet content: \\_card.dart\ for unified and website cards, \\_entities.dart\ for interactive text elements like mentions and URLs, \\_media.dart\ for photo and video galleries, \\_photo.dart\ for zoomable images, \\_video.dart\ for video playback with download support, and \\_video\_controls.dart\ for custom video UI. The main \tweet.dart\ and \conversation.dart\ files now utilize these new components to render tweets, supporting features such as media size preferences, sensitive content hiding, video downloading, and tweet translation.

lib/tweet · high confidence

Test coverage

Added tests for tweet thread and reply parsing logic

Added \test/thread\_test.dart\ to verify the \Twitter.createUnconversationedChains\ method correctly groups tweets into threads, handles pinned tweets, and manages pagination cursors. Included sample JSON fixtures (\tweets-carmack.json\, \tweets-carmack-replies.json\) to support these tests. Removed the default Flutter counter smoke test (\widget\_test.dart\).

test · high confidence

Dependencies

Major dependency upgrade and Android build configuration update

The project has upgraded its core dependencies, including migrating the Dart SDK requirement to \>=2.18.0, updating the Android Gradle plugin to 7.2.1 and Kotlin to 1.7.0, and bumping the Android compile and target SDK versions to 33. The iOS build environment now includes a generated Podfile and lockfile to manage CocoaPods dependencies. Additionally, the app description was updated to remove the Nitter reference, and new dependencies such as Sentry for error reporting, Chewie for video playback, and infinite\_scroll\_pagination were added to support recent feature changes.

(dependencies) · high confidence

Updated Android Gradle wrapper to version 7.3.3

The Android build system now uses Gradle 7.3.3 instead of 5.6.2. This upgrade ensures compatibility with newer Android tooling and plugins, potentially requiring a local Gradle download on first build.

android/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

Baseline

  • First survey — no prior run to compare against. CAI 56.

Lenses

  • Code Health 89
  • Architecture 98
  • Maturity 43
  • Readiness 47
  • Security 74
  • Domain Modelling 100

Changes since last survey

  • 300 commits — 257 feature/other, 43 fixes

By area

  • lib/l10n — 150 commits
  • (repo) — 33 commits
  • fastlane/metadata — 17 commits
  • lib/client.dart — 12 commits
  • lib/generated — 12 commits
  • (root) — 10 commits
  • fritter/android — 8 commits
  • fritter/ios — 7 commits
  • android/app — 6 commits
  • ios/Runner — 6 commits
  • lib/tweet — 6 commits
  • lib/main.dart — 5 commits
  • .github/workflows — 4 commits
  • lib/catcher — 4 commits
  • lib/group — 4 commits
  • lib/profile — 4 commits
  • lib/database — 3 commits
  • lib/constants.dart — 2 commits
  • lib/home — 2 commits
  • .github/ISSUE_TEMPLATE — 1 commit

Notable commits

  • fix: Added note to the bug template to check for existing issues first
  • fix: Added pull-to-refresh and scroll-to-top on profiles. Fixes #589
  • fix: Added scaffold to fix white background on group feeds
  • fix: Added support for opening redirect links from emails. Fixes #257
  • fix: Fix that touching the RT account names gives an error.
  • fix: Fix the black recent screen mode.
  • fix: Fixed Sentry initialization bricking startup when disabled
  • fix: Fixed a bunch of warnings
  • fix: Fixed brick caused by deleting the last or current home tab. Fixes #590
  • fix: Fixed crash caused by tapping download multiple times. Fixed #576
  • fix: Fixed crash when encountering oversized tweets
  • fix: Fixed crash when scrolling to the top of large profiles. Fixes #607
  • fix: Fixed deleted users throwing a null pointer. Fixes #593
  • fix: Fixed errors not displaying when Twitter sends back non-JSON responses
  • fix: Fixed follow icon visibility on profiles in the light theme. Fixes #505
  • fix: Fixed group deletion not updating the UI. Fixes #591
  • fix: Fixed group feeds not working due to a Twitter API change. Fixes #663
  • fix: Fixed home and profile tabs resetting their position when switching. Fixes #533
  • fix: Fixed infinite loop blocking first startup. Fixes #592
  • fix: Fixed invalid output name in the CI release workflow
  • …and 280 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

jonjomckay/fritter 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 19 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 0662539a5c2643c2fdc07c8620ba79e969ff0157 — 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-13a154b7f5d1.