{"id":16079386,"url":"https://github.com/Lucodivo/Merlinsbag","last_synced_at":"2025-10-22T22:30:43.760Z","repository":{"id":247131210,"uuid":"762597375","full_name":"Lucodivo/Merlinsbag","owner":"Lucodivo","description":" Android application for virtualizing \u0026 organizing your wardrobe and favorite items","archived":false,"fork":false,"pushed_at":"2024-09-19T04:17:31.000Z","size":20601,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-10-09T11:04:05.793Z","etag":null,"topics":["android","coil","compose-animation","compose-navigation","crashlytics","flow","hilt","jetpack-compose","junit","kotlin","kotlin-coroutines","machine-learning","material-design","ml-kit","mvvm","proto-datastore","reactive-programming","robolectric","room-persistence-library","sqlite"],"latest_commit_sha":null,"homepage":"https://www.merlinsbag.com","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Lucodivo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2024-02-24T06:35:34.000Z","updated_at":"2024-09-19T04:17:35.000Z","dependencies_parsed_at":"2024-09-06T11:33:40.092Z","dependency_job_id":"fb46d410-d7a5-45f8-a859-19770adde10a","html_url":"https://github.com/Lucodivo/Merlinsbag","commit_stats":null,"previous_names":["lucodivo/merlinsbag"],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lucodivo%2FMerlinsbag","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lucodivo%2FMerlinsbag/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lucodivo%2FMerlinsbag/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lucodivo%2FMerlinsbag/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Lucodivo","download_url":"https://codeload.github.com/Lucodivo/Merlinsbag/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237743729,"owners_count":19359287,"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","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","coil","compose-animation","compose-navigation","crashlytics","flow","hilt","jetpack-compose","junit","kotlin","kotlin-coroutines","machine-learning","material-design","ml-kit","mvvm","proto-datastore","reactive-programming","robolectric","room-persistence-library","sqlite"],"created_at":"2024-10-09T11:00:33.465Z","updated_at":"2025-10-22T22:30:42.489Z","avatar_url":"https://github.com/Lucodivo.png","language":"Kotlin","funding_links":[],"categories":["Kotlin"],"sub_categories":[],"readme":"# Merlinsbag\n\u003ca href=\"https://play.google.com/store/apps/details?id=com.inasweaterpoorlyknit.merlinsbag\"\u003e\u003cimg alt=\"Download\" src=\"https://raw.githubusercontent.com/Lucodivo/RepoSampleImages/master/Merlinsbag/logo/merlinsbag_logo_96x96_rounded.png\"\u003e\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://play.google.com/store/apps/details?id=com.inasweaterpoorlyknit.merlinsbag\"\u003e\u003cimg alt=\"Download\" src=\"https://img.shields.io/badge/Google%20Play-%20?logo=googleplay\u0026amp;color=grey\"\u003e\u003c/a\u003e\n\nMerlinsbag is an Android application for cataloging the things in your life.\n\n## Video Demo\n[![YouTube Demo Video of Merlinsbag App](https://img.youtube.com/vi/uUQYMU2N4kA/0.jpg)](https://youtu.be/uUQYMU2N4kA )\n\n## Terminology\n- \"Article\": an item that has been cataloged \n  - stemming from an \"article of clothing\"\n  - examples: a shirt, a pair of pant, a poster, a cat, a record, a book, etc.\n- \"Ensemble\": a collection of articles\n  - analogous to hashtags on other platforms\n  - examples: \"tshirt\", \"yellow\", \"vinyl\", \"gaming\", \"non-fiction\", \"painting\", etc.\n\n## Features By Screen\n\n### Add Article\n- Provide photos of the things to catalog\n- Adjust the tightness of the article cutout area\n- Rotate the image in 90 degree increments\n- Confirm cutout as newly cataloged article or attach cutout to existing article\n\n### Articles\n- View articles in one large catalog\n- Select and edit articles in bulk\n- Navigate to article detail view\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Lucodivo/RepoSampleImages/master/Merlinsbag/Merlinsbag_snapshot_addArticle.png\" alt=\"Add Article Screen\" width=\"200\"/\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Lucodivo/RepoSampleImages/master/Merlinsbag/Merlinsbag_snapshot_articles.png\" alt=\"Articles Screen\" width=\"200\"/\u003e\n\u003c/p\u003e\n\n### Article Detail\n- View an article in its full glory\n- Attach additional images to article\n- Easily select and view each image attached to article\n- Attach article to existing or newly created ensembles\n- Navigate among articles via horizontal swiping\n- Export article images as PNGs to easily share outside the application\n- View and easily navigate to attached ensembles\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Lucodivo/RepoSampleImages/master/Merlinsbag/Merlinsbag_snapshot_articleDetail.png\" alt=\"Article Detail Screen\" width=\"200\"/\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Lucodivo/RepoSampleImages/master/Merlinsbag/Merlinsbag_snapshot_addToEnsemble.png\" alt=\"Add to Ensemble\" width=\"200\"/\u003e\n\u003c/p\u003e\n\n### Add Ensemble\n- Create an ensemble with a given title\n- Select articles to initialize ensemble with\n\n### View Ensembles\n- View all ensembles with short previews of the ensemble's articles\n- Search among all ensembles\n- Select and edit ensembles in bulk\n- Navigate to ensemble detail view\n\n### Ensemble Detail\n- View all articles attached to an ensemble on one screen\n- Select and remove articles from ensemble in bulk\n- Attach existing articles to ensemble\n- Navigate to article detail view that is filtered by the current ensemble\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Lucodivo/RepoSampleImages/master/Merlinsbag/Merlinsbag_snapshot_createEnsemble.png\" alt=\"Add Ensemble Dialog\" width=\"200\"/\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Lucodivo/RepoSampleImages/master/Merlinsbag/Merlinsbag_snapshot_ensembles.png\" alt=\"Ensembles Screen\" width=\"200\"/\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Lucodivo/RepoSampleImages/master/Merlinsbag/Merlinsbag_snapshot_ensembleDetail.png\" alt=\"EnsembleDetail\" width=\"200\"/\u003e\n\u003c/p\u003e\n\n### Settings\n- Adjust the app-wide appearance of Merlinsbag:\n  - Color Scheme\n  - Font\n  - Dark Mode\n  - High Contrast\n- View: \n  - Tips \u0026 information\n  - Statistics about cataloged articles and ensembles\n  - Welcome page (onboarding screen) \n  - App version numbers\n- Links to:\n  - Video demo\n  - Privacy information\n  - Developer information\n  - Source code\n  - Merlinsbag on Google Play Store for rating \u0026 reviewing\n  - Eccohedra on Google Play Store (advertisement)\n- Data Management:\n  - Clear cache\n  - Delete all data\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Lucodivo/RepoSampleImages/master/Merlinsbag/Merlinsbag_snapshot_settings.png\" alt=\"Settings\" width=\"200\"/\u003e\n\u003c/p\u003e\n\n### Accessibility\n- Landscape view supported in entire app with unique layout configurations\n- Great efforts made to ensure UI elements contain content descriptions for screen readers  \n\n🐛 [If you experience any problems accessibility, please create an issue and it will quickly become a priority.](https://github.com/Lucodivo/Merlinsbag/issues/new) 🐛\n\n## Codebase\n\n### Terminology\n- \"Noop\" is a simple prefix for application specific implementations of over general Android library classes and functions\n  - Ex: NoopApplication, NoopIcons, NoopTheme, NoopDatabase\n\n### Android Architecture\nMerlinsbag is a single activity, no fragment, Android application. All UI and navigation is accomplished using\nJetpack Compose and Navigation with Compose. Important keywords to look for to understand navigation within the application\n are: *NavHost*, *NavController*, *NavHostController*, *Route*, *RouteArgs*, *navigateTo-*, *navOptions*, *Screen*\n\n- *Screen*\n  - Composable functions representing the actual UI implementation of the various app \"screens\" or \"destinations\"\n  - In general, state is hoisted out of a *Screen* and into it's associated *Route*\n    - All UI displayed is driven by a *Screen* function's arguments\n    - This allows any *Screen* to be easily verified using @Preview annotated Composable functions\n- *Route*\n  - Composable functions that serve as a wrapper around a specific *Screen*\n  - Acquire and maintain the navigation lambdas, ViewModels, and ActivityResultContracts\n  - Provides state supplied by ViewModels to *Screen*\n- *RouteArgs*\n  - Data classes that hold the necessary information to fulfilling a navigation request to a specified *Route*\n- *NavController*\n  - Used to request navigation destination changes or otherwise manage the navigation back stack\n    - Navigation requests are intercepted by the *NavHost*\n- *navigateTo-*\n  - Prefix of *NavController* extension functions that requesting the navigation to some specified *Route* represented by the suffix\n  - It is also used as a prefix for *Route* navigation lambda arguments which are just wrappers around the *NavController* extension functions mentioned above\n- *NavOptions*\n  - Used by *navigateTo-* extension functions to create specified transitions between *Routes*\n    - Includes: Screen transition animations, popping the navigation backstack, and saving or restoring previous state\n- *NavHost*\n  - A Composable function that acts as the interceptor to *Route* navigation requests via navigation request lambdas\n  - Provides all *Routes* with relevant navigation request lambdas (wrappers of *navigateTo-* extension functions)\n  - Supplies arguments from *RouteArgs* to their associated *Route*\n- *NavHostController* (Subclass of NavController, no special use cases in this application)\n\n### Modules\n- :app\n  - Application, UI, ViewModels, Navigation\n  - Most likely module to contain code that has yet to find a better home\n- :core:database\n  - Room Persistence Library Database, Entities, DAOs\n- :core:datastore\n  - Proto DataStore .proto files, Serializers, DAOs\n- :core:data\n  - Repository abstraction layer isolating data sources from :app module\n- :core:common\n  - Utility functions \u0026 classes used by multiple modules\n- :core:ml\n  - ML Kit related files like SegmentedImage which uses Subject Segmentation\n- :core:model\n  - Classes \u0026 interfaces that abstract data passed between modules\n    - :app can indirectly communicate with :core:datastore without requiring it to become a dependency\n- :core:ui\n  - Reusable Compose UI components that are not tied to any particular screen\n    - On top of being convenient when creating new screens, it also serves as the foundation for the general design system \n    of Merlinsbag.\n- :core:common\n  - Generic helper \u0026 utility classes or functions used in multiple modules\n\n### Technology\n- ML Kit\n- Room Persistence Library (SQLite wrapper for Android)\n- Proto DataStore\n- Hilt (Dagger2 wrapper for Android)\n- Jetpack Compose\n  - Navigation with Compose\n  - Material 3 Composables \u0026 Icons\n- Kotlin Flow\n- Kotlin Coroutines\n- Firebase Crashlytics\n- JUnit\n- Robolectric\n\n### Documentation\n#### [Conventions](Conventions.md)\n#### [I Forgot How To (solutions for infrequent workflows \u0026 issues)](I_Forgot_How_To.md)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FLucodivo%2FMerlinsbag","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FLucodivo%2FMerlinsbag","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FLucodivo%2FMerlinsbag/lists"}