{"id":25409720,"url":"https://github.com/yusuf0405/speakeasy","last_synced_at":"2026-04-25T12:36:11.773Z","repository":{"id":246714570,"uuid":"821943251","full_name":"yusuf0405/SpeakEasy","owner":"yusuf0405","description":"A convenient application for instant text and speech translation.","archived":false,"fork":false,"pushed_at":"2025-01-20T16:13:56.000Z","size":5661,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-25T12:36:11.290Z","etag":null,"topics":["android","clean-architecture","compose","coroutines","data-store","design-patterns","ios","koin","kotlin","ktor","lifecycle","multimodule-build","multithreading","mvc","mvvm","room-database"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","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/yusuf0405.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":"2024-06-29T21:44:55.000Z","updated_at":"2025-04-12T17:28:05.000Z","dependencies_parsed_at":null,"dependency_job_id":"775e708e-95ec-4ba8-ae07-9950c244c6c5","html_url":"https://github.com/yusuf0405/SpeakEasy","commit_stats":null,"previous_names":["yusuf0405/speakeasy"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yusuf0405/SpeakEasy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yusuf0405%2FSpeakEasy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yusuf0405%2FSpeakEasy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yusuf0405%2FSpeakEasy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yusuf0405%2FSpeakEasy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yusuf0405","download_url":"https://codeload.github.com/yusuf0405/SpeakEasy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yusuf0405%2FSpeakEasy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32262801,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T09:15:33.318Z","status":"ssl_error","status_checked_at":"2026-04-25T09:15:31.997Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["android","clean-architecture","compose","coroutines","data-store","design-patterns","ios","koin","kotlin","ktor","lifecycle","multimodule-build","multithreading","mvc","mvvm","room-database"],"created_at":"2025-02-16T09:28:02.065Z","updated_at":"2026-04-25T12:36:11.753Z","avatar_url":"https://github.com/yusuf0405.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Speak Easy Translator\n\n\"Speak Easy Translator\" is your go-to app for instant text and speech translation. With support for\nmultiple languages and an easy-to-use interface, it’s perfect for travel and learning.\n\n- KMP (Kotlin Multi-Platform) Compose-based Proof-of-concept experimental app for iOS and Android.\n- Pure Kotlin App using _ComposeApp_ core and _ComposeApp_ Compose based UI, running in native\n  Kotlin.\n\n[![Kotlin](https://img.shields.io/badge/Kotlin-2.0.21-blue.svg?style=flat\u0026logo=kotlin)](https://kotlinlang.org)\n![badge-kmp](https://img.shields.io/badge/KMP-1.7.3-blue)\n![badge-android](http://img.shields.io/badge/platform-android-6EDB8D.svg?style=flat)\n![badge-ios](http://img.shields.io/badge/platform-ios-CDCDCD.svg?style=flat)\n\n## Project Structure\n\n [\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/structure/project_structure.png\"\u003e]()\n\n### What is Modularization?\n\n* Modularization is the practice of dividing a monolithic codebase into independent, self-contained modules. This approach brings several advantages, such as parallel development, improved build times, better encapsulation, and enhanced reusability.\n\n### Benefits of Modularization\n- Scalability – Separation of concerns allows for independent feature development.\n- Parallel Development – Multiple developers can work on different modules simultaneously with minimal conflicts.\n- Ownership – Each module can have a dedicated owner responsible for its maintenance.\n- Encapsulation – Well-defined module boundaries enhance readability, testing, and maintainability.\n- Reduced Build Time – Incremental and parallel builds optimize the development workflow.\n- Reusability – Shared logic can be used across different apps or platforms.\n  \n### Potential Pitfalls\n- Too Many Modules – Excessive modularization can lead to increased build complexity.\n- Too Few Modules – Large, tightly coupled modules reduce the benefits of modularization.\n- Overcomplexity – Modularization should be aligned with project needs rather than applied blindly.\n  \n### Modularization Strategy\n\n* A well-structured module should have low coupling (minimal dependencies on other modules) and high cohesion (a well-defined responsibility). The project follows a layered modularization approach, separating concerns across core and feature-specific modules.\n\n### Core Modules\nThese modules provide fundamental functionalities and architecture:\n\n* analytics - Handles event tracking and logging.\n* common - Contains shared utilities and extensions.\n* data - Manages data flow between repository and domain layers.\n* database - Implements local storage mechanisms.\n* datastore - Provides key-value storage solutions.\n* designsystem - Contains UI components and themes.\n* domain - Defines business logic and use cases.\n* navigation - Manages in-app navigation.\n* network - Handles API communication.\n* ui - Contains base UI logic.\n* ui-components - Reusable UI elements.\n \n### Feature Modules\nThese modules encapsulate specific features of the application:\n\n* camera-capture - Handles camera-based text recognition.\n* history - Manages translation history.\n* languages - Provides language selection and handling.\n* permission - Manages app permissions.\n* settings - Implements user settings, including \"Help \u0026 Support\" and \"About\".\n* speech - Handles speech-to-text and text-to-speech functionalities.\n* translator - Core translation engine using various APIs.\n\n## Libraries\n\n### Android Jetpack\n\n* [Lifecycle](https://developer.android.com/topic/libraries/architecture/lifecycle) An interface\n  that automatically responds to lifecycle events.\n\n* [Navigation](https://developer.android.com/guide/navigation?gclsrc=aw.ds\u0026gclid=Cj0KCQiA09eQBhCxARIsAAYRiymyM6hTEs0cGr5ZCXOWtLhVUwDK1O86vf8V_Uq2DWvVYNFZwPFznzAaAllMEALw_wcB)\n  Navigation refers to interactions that allow users to navigate through , enter, and exit various\n  parts of the content in your app. Navigation component Android Jetpack helps you navigate, from\n  simple button clicks to more complex templates like application panels and navigation bar. The\n  navigation component also provides a consistent and predictable user interface, adhering to an\n  established set of principles.\n\n* [ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel) Data related to\n  the user interface that is not destroyed when the application is rotated. Easily schedule\n  asynchronous tasks for optimal execution.\n\n### Image loader\n\n* [Coil3](https://skydoves.github.io/landscapist/coil3/) Coil3 is a highly optimized,\n  pluggable Compose image loading solution.\n\n### Multithreading\n\n* [Coroutines](https://kotlinlang.org/docs/coroutines-overview.html) Asynchronous or non-blocking\n  programming is an important part of the development landscape. When creating server-side, desktop,\n  or mobile applications, it's important to provide an experience that is not only fluid from the\n  user's perspective, but also scalable when needed.\n\n### DI\n\n* [Koin](https://insert-koin.io/docs/reference/koin-mp/kmp/)\n  Koin is a pure Kotlin library and can be used in your shared Kotlin project.\n\n### Network\n\n* [Ktor](https://ktor.io/docs/client-create-multiplatform-application.html)\n  The Ktor HTTP client can be used in multiplatform projects. In this tutorial, we'll create a\n  simple Kotlin Multiplatform Mobile application, which sends a request and receives a response body\n  as plain HTML text.\n\n### Database\n\n* [Room (Kotlin Multiplatform)](https://developer.android.com/kotlin/multiplatform/room) The Room\n  persistence library provides an abstraction layer over SQLite to allow for more robust database\n  access while harnessing the full power of SQLite. This page focuses on using Room in Kotlin\n  Multiplatform (KMP) projects. For more information on using Room, see Save data in a local\n  database using Room or our official samples.\n\n* [DataStore (Kotlin Multiplatform)](https://developer.android.com/kotlin/multiplatform/datastore)\n  The DataStore library stores data asynchronously, consistently, and transactionally, overcoming\n  some of the drawbacks of SharedPreferences. This page focuses on creating DataStore in Kotlin\n  Multiplatform (KMP) projects. For more information on DataStore, see the primary documentation for\n  DataStore and official samples.\n\n## Screen Shots\n\n### Android Screenshots\n\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/android/dark_main_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/android/dark_history_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/android/dark_setting_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/android/dark_camera_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/android/dark_theme_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/android/dark_about_app_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/android/dark_language_dialog.png\"\u003e]()\n\n### iOS Screenshots\n\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/ios/light_main_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/ios/light_history_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/ios/light_setting_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/ios/light_theme_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/ios/light_rate_app_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/ios/light_about_app_screen.png\"\u003e]()\n[\u003cimg width=\"200\" alt=\"image\" src=\"https://github.com/yusuf0405/SpeakEasy/blob/master/assets/screenshots/ios/light_language_dialog.png\"\u003e]()","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyusuf0405%2Fspeakeasy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyusuf0405%2Fspeakeasy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyusuf0405%2Fspeakeasy/lists"}