{"id":31679238,"url":"https://github.com/ipfans/readlyit","last_synced_at":"2025-10-08T06:47:20.496Z","repository":{"id":295238321,"uuid":"989559336","full_name":"ipfans/readlyit","owner":"ipfans","description":null,"archived":false,"fork":false,"pushed_at":"2025-05-24T11:03:58.000Z","size":271,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-05-24T12:20:27.605Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ipfans.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-24T10:50:47.000Z","updated_at":"2025-05-24T11:04:02.000Z","dependencies_parsed_at":"2025-05-24T12:20:33.512Z","dependency_job_id":"9fd7d769-1f9e-4930-b0a7-d4f3b2753429","html_url":"https://github.com/ipfans/readlyit","commit_stats":null,"previous_names":["ipfans/readlyit"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ipfans/readlyit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfans%2Freadlyit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfans%2Freadlyit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfans%2Freadlyit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfans%2Freadlyit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ipfans","download_url":"https://codeload.github.com/ipfans/readlyit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfans%2Freadlyit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278903009,"owners_count":26065786,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-08T06:47:17.418Z","updated_at":"2025-10-08T06:47:20.491Z","avatar_url":"https://github.com/ipfans.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ReadLyit - Read it Later App\n\nReadLyit is a \"Read it Later\" application for Android, iOS, and macOS, built with Flutter. It allows users to save articles, web pages, and other content for later reading.\n\n## Features\n\n*   **Cross-Platform:** Supports Android, iOS, and macOS.\n*   **Local First Storage:** Articles are primarily stored locally on the device using SQLite.\n*   **Article Content Fetching:** Fetches the main content of articles for an improved offline reading experience using HTML parsing.\n*   **Pocket Import:** Easily import your existing articles from Pocket (requires one-time authentication).\n*   **iCloud Synchronization (iOS \u0026 macOS):** Dart interface for iCloud synchronization is implemented. Native (Swift/Objective-C) CloudKit implementation is required by the developer to enable this feature. (Android sync functionality is planned for a future release).\n*   **Settings Screen:** Configure application preferences, including:\n    *   Theme mode selection (Light, Dark, System).\n    *   Primary theme color selection.\n    *   In-app language selection (e.g., English, Chinese).\n    *   Pocket account management (status, logout, connect).\n    *   Information on system font size settings.\n*   **Modern UI/UX:**\n    *   Beautiful and intuitive user interface.\n    *   Adaptive layouts for optimal viewing on different screen sizes, including responsive List/Grid view for articles.\n    *   Support for dynamic type for improved accessibility (developer testing recommended).\n*   **State Management:** Uses Riverpod for robust and maintainable state management.\n*   **Performance:** Designed for responsiveness and smooth performance.\n*   **Testing:** Includes widget tests for key UI components. (Comprehensive UI automation test coverage is planned).\n*   **Localization:** Default interface in Chinese, with English language support.\n\n## Project Structure\n\n```\nreadlyit/\n├── android/                      # Android specific files\n├── ios/                          # iOS specific files\n├── lib/                          # Dart code\n│   ├── app/                      # Application-wide widgets, routing, themes\n│   │   ├── ui/                   # UI specific components (screens, widgets)\n│   │   └── ...\n│   ├── core/                     # Core utilities, services (e.g., database, API clients)\n│   │   └── services/\n│   ├── features/                 # Feature modules (e.g., articles, settings)\n│   │   └── articles/\n│   │       ├── data/             # Data layer (models, sources, repositories)\n│   │       │   ├── datasources/  # Local and remote data sources\n│   │       │   ├── models/       # Data models\n│   │       │   └── repositories/ # Repositories\n│   │       ├── domain/           # Domain layer (entities, use cases - if using Clean Architecture)\n│   │       └── presentation/     # Presentation layer (providers, screens, widgets specific to feature)\n│   │           ├── providers/    # Riverpod providers\n│   │           ├── screens/      # Feature screens\n│   │           └── widgets/      # Feature-specific widgets\n│   ├── l10n/                     # Localization files\n│   └── main.dart                 # Main application entry point\n├── macos/                        # macOS specific files\n├── test/                         # Automated tests\n│   ├── core/\n│   ├── features/\n│   └── ui/\n├── .gitignore\n├── pubspec.yaml                  # Project dependencies and metadata\n└── README.md\n```\n\n## Getting Started\n\n**(To be updated with detailed build and run instructions for each platform)**\n\n### Required Setup\n\nBefore running the application, some platform-specific and API key configurations are necessary:\n\n#### 1. Pocket Integration Setup\nTo enable importing articles from Pocket, you need to:\n1.  Obtain a **Consumer Key** from the [Pocket Developer API site](https://getpocket.com/developer/).\n2.  Open the file `lib/features/articles/data/datasources/remote/pocket_service.dart`.\n3.  Replace the placeholder string `'YOUR_POCKET_CONSUMER_KEY_HERE'` with your actual Pocket Consumer Key.\n4.  Configure the custom URL scheme `readlyit://pocket-auth` for the OAuth callback. Detailed instructions for Android (`AndroidManifest.xml`), iOS (`Info.plist`), and macOS (`Info.plist`) are provided as comments at the end of the `lib/app/app_widget.dart` file.\n\n#### 2. iCloud Synchronization Setup (for iOS/macOS Developers)\nThe application includes a Dart interface (`ICloudService`) for synchronizing articles using iCloud on iOS and macOS. To enable this:\n1.  You will need to implement the native Swift/Objective-C methods that are called by the `ICloudService` platform channel. These methods will handle the actual CloudKit operations (saving, fetching, deleting records, etc.).\n2.  Configure iCloud capabilities for your app in Xcode, including setting up a CloudKit container and appropriate entitlements.\n\n#### 3. Code Generation (if applicable)\nIf you modify files that require code generation (e.g., for Riverpod providers with `@riverpod` annotations, or for Mockito mocks in tests), run the following command:\n```bash\nflutter pub run build_runner build --delete-conflicting-outputs\n```\nThis is necessary, for example, after creating or updating mock definitions for tests.\n\n## Development Guidelines\n\n*   **Code Style:** Follow the official [Effective Dart](https://dart.dev/guides/language/effective-dart) guidelines.\n*   **State Management:** Utilize Riverpod for state management. Clearly define providers and their scope.\n*   **Immutability:** Prefer immutable data structures where possible, especially for state objects.\n*   **Error Handling:** Implement robust error handling, especially for network requests and data parsing.\n*   **Testing:** Write unit, widget, and integration tests for your features.\n*   **Localization:** Ensure all user-facing strings are localized using Flutter's internationalization support. Add new keys to `lib/l10n/app_en.arb` (and other language files like `app_zh.arb`).\n*   **Commit Messages:** Follow conventional commit message formats (e.g., `feat: Add new article saving feature`).\n*   **README Updates:** Keep this README updated with any new features, setup steps, or important architectural changes.\n\n## Contributing\n(To be added - guidelines for contributing to the project)\n\n## License\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipfans%2Freadlyit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fipfans%2Freadlyit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipfans%2Freadlyit/lists"}