{"id":19495436,"url":"https://github.com/guilhe/whosnext","last_synced_at":"2025-10-04T18:43:31.225Z","repository":{"id":226672780,"uuid":"769345819","full_name":"GuilhE/WhosNext","owner":"GuilhE","description":"Kotlin Multiplatform Timer","archived":false,"fork":false,"pushed_at":"2025-09-11T23:51:45.000Z","size":36981,"stargazers_count":58,"open_issues_count":0,"forks_count":4,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-09-12T01:56:38.246Z","etag":null,"topics":["android","compose-multiplatform","desktop","ios","kotlin","kotlin-multiplatform","swift","wasm"],"latest_commit_sha":null,"homepage":"https://guilhe.github.io/WhosNext/","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/GuilhE.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-03-08T21:21:32.000Z","updated_at":"2025-09-11T23:51:49.000Z","dependencies_parsed_at":"2024-09-12T22:11:56.697Z","dependency_job_id":"347ecbd2-05c0-497c-97fe-8faaeec5e287","html_url":"https://github.com/GuilhE/WhosNext","commit_stats":null,"previous_names":["guilhe/whosnext"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/GuilhE/WhosNext","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuilhE%2FWhosNext","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuilhE%2FWhosNext/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuilhE%2FWhosNext/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuilhE%2FWhosNext/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GuilhE","download_url":"https://codeload.github.com/GuilhE/WhosNext/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuilhE%2FWhosNext/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278358488,"owners_count":25973946,"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-04T02:00:05.491Z","response_time":63,"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":["android","compose-multiplatform","desktop","ios","kotlin","kotlin-multiplatform","swift","wasm"],"created_at":"2024-11-10T21:37:43.836Z","updated_at":"2025-10-04T18:43:31.182Z","avatar_url":"https://github.com/GuilhE.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp\u003e\u003cimg src=\"/media/icon.png\" alt=\"icon\" width=\"100\" align=\"right\"/\u003e\u003c/p\u003e\u003c/br\u003e\n\n# Who's Next!?\nA simple application that lets you know when it’s time to change the goalkeeper in a football game with friends.  \n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"/media/android.png\" alt=\"android\" width=\"200\"/\u003e\n  \u003cimg src=\"/media/ios.png\" alt=\"ios\" width=\"200\"/\u003e\n  \u003cimg src=\"/media/desktop.png\" alt=\"desktop\" width=\"200\"/\u003e  \n  \u003cimg src=\"/media/wasm.png\" alt=\"wasm\" width=\"600\"/\u003e\n\u003c/p\u003e\n\n## Details\n\nUses [Kotlin Multiplatform](https://www.jetbrains.com/kotlin-multiplatform/) for sharing the _Data Layer_ between all platforms and [Compose Multiplatform](https://www.jetbrains.com/lp/compose-multiplatform/) to create a cross-platform _Ui Layer_. It also uses SwiftUI to provide an additional iOS _Ui Layer_.  \n\nSupports: `jvm` (android and desktop), `native` (iOS) and `wasm` (web)\n\n### Modules\n\n#### shared\n\n- UDF architecture implemented with Model-View-Intent\n- Finite State Machine to validate state transitions\n- State emission by Kotlin Flow\n- State restoration (both for UI State and FSM State)\n- ViewModel shared by [KMP-ObservableViewModel](https://github.com/rickclephas/KMP-ObservableViewModel)\n\n\u003cp\u003e\n  \u003c/br\u003e\n  \u003cimg src=\"/media/fsm.png\" alt=\"fsm\" width=\"412\"/\u003e \u003cimg src=\"/media/wn.png\" alt=\"wn\" width=\"200\"/\u003e \u003cimg src=\"/media/wnp.png\" alt=\"wnp\" width=\"200\"/\u003e\n\u003c/p\u003e\n\n#### shared-ui\n\n- Components\n- Screens\n- Themes\n- Resources\n\n#### androidApp\n\n- Uses Compose Multiplatform\n\n`./gradlew :androidApp:installDebug`  \n\n#### iosApp\n\n- Uses SwiftUI and Compose Multiplatform\n \nTo run it open `iosApp/WhosNext.xcodeproj` in Xcode and run standard configuration or use [KMP plugin](https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform) for Android Studio and choose `iosApp` in `run configurations`.\n\n#### desktopApp\n\n- Uses Compose Multiplatform\n\n`./gradlew :desktopApp:run`\n\n#### browserApp\n\n- Uses Compose Multiplatform\n\n`./gradlew :browserApp:wasmJsBrowserDevelopmentRun`  \n\n## UI\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"/media/android.gif\" alt=\"android\" width=\"200\"/\u003e\u0026nbsp;\u0026nbsp;\n  \u003cimg src=\"/media/ios.gif\" alt=\"ios\" width=\"200\"/\u003e\u0026nbsp;\u0026nbsp;\n  \u003cimg src=\"/media/desktop.gif\" alt=\"desktop\" width=\"200\"/\u003e\u003c/br\u003e\u003c/br\u003e\n  \u003cimg src=\"/media/wasm.gif\" alt=\"wasm\" width=\"600\"/\u003e\n\u003c/p\u003e\n\n## LICENSE\n\nCopyright (c) 2024-present GuilhE\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy\nof the License at\n\n\u003chttp://www.apache.org/licenses/LICENSE-2.0\u003e\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\nWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under\nthe License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguilhe%2Fwhosnext","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguilhe%2Fwhosnext","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguilhe%2Fwhosnext/lists"}