{"id":37028861,"url":"https://github.com/ojaynico/ojaynico-kotlin-react-native","last_synced_at":"2026-01-14T03:27:25.939Z","repository":{"id":54283050,"uuid":"313264841","full_name":"ojaynico/ojaynico-kotlin-react-native","owner":"ojaynico","description":"Kotlin Wrapper for React Native Components and APIs","archived":false,"fork":false,"pushed_at":"2023-02-07T17:23:49.000Z","size":531,"stargazers_count":21,"open_issues_count":0,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-11-16T03:36:41.374Z","etag":null,"topics":["android","gradle","ios","kotlin","kotlin-wrappers","react","react-native"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ojaynico.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}},"created_at":"2020-11-16T10:24:50.000Z","updated_at":"2024-08-02T00:02:12.000Z","dependencies_parsed_at":"2022-08-13T10:51:04.197Z","dependency_job_id":null,"html_url":"https://github.com/ojaynico/ojaynico-kotlin-react-native","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/ojaynico/ojaynico-kotlin-react-native","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ojaynico%2Fojaynico-kotlin-react-native","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ojaynico%2Fojaynico-kotlin-react-native/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ojaynico%2Fojaynico-kotlin-react-native/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ojaynico%2Fojaynico-kotlin-react-native/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ojaynico","download_url":"https://codeload.github.com/ojaynico/ojaynico-kotlin-react-native/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ojaynico%2Fojaynico-kotlin-react-native/sbom","scorecard":{"id":703774,"data":{"date":"2025-08-11","repo":{"name":"github.com/ojaynico/ojaynico-kotlin-react-native","commit":"9e89f809f39b06ca1288e061ee14c92c6aef0816"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 1/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T05:52:40.734Z","repository_id":54283050,"created_at":"2025-08-22T05:52:40.734Z","updated_at":"2025-08-22T05:52:40.734Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408843,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"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","gradle","ios","kotlin","kotlin-wrappers","react","react-native"],"created_at":"2026-01-14T03:27:24.461Z","updated_at":"2026-01-14T03:27:25.923Z","avatar_url":"https://github.com/ojaynico.png","language":"Kotlin","funding_links":["https://www.buymeacoffee.com/ojaynico"],"categories":[],"sub_categories":[],"readme":"# ojaynico-kotlin-react-native\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.ojaynico/ojaynico-kotlin-react-native/badge.svg)](https://search.maven.org/artifact/com.github.ojaynico/ojaynico-kotlin-react-native/1.2.0/pom)\n[![Kotlin](https://img.shields.io/badge/kotlin-1.7.10-blue.svg?logo=kotlin)](http://kotlinlang.org)\n[![npm version](https://img.shields.io/npm/v/react.svg?style=flat)](https://www.npmjs.com/package/react)\n[![npm version](https://img.shields.io/npm/v/react-native?color=brightgreen\u0026label=npm%20package)](https://www.npmjs.com/package/react-native)\n[![Kotlin JS IR supported](https://img.shields.io/badge/Kotlin%2FJS-IR%20supported-yellow)](https://kotl.in/jsirsupported)\n\nKotlin Wrappers for React Native Components and APIs\n\nAvailable components: All react native components are available in this wrapper. Check them out using the URL below:\n\nhttps://reactnative.dev/docs/components-and-apis\n\nAvailable APIs: All react native APIs are available in this wrapper. Check them out using the URL below:\n\nhttps://reactnative.dev/docs/accessibilityinfo\n\n## `How to use the wrapper?`\n\nUse the cli tool below to generate a new Kotlin React Native application.\n\nhttps://github.com/ojaynico/create-ojaynico-krn\n\nProceed to the next step after generating the project.\n\nIn your react native application shared module (a kotlin gradle project), update your gradle file to include the following in the respective blocks.\n\n```kotlin\nrepositories {\n    mavenCentral()\n    jcenter()\n}\n\ndependencies {\n    implementation(\"com.github.ojaynico:ojaynico-kotlin-react-native:1.2.0\")\n}\n```\n\n### `Example of a react native app using the above wrapper`\n\n```kotlin\nimport ojaynico.kotlin.react.native.api.AppRegistry\nimport ojaynico.kotlin.react.native.api.Platform\nimport ojaynico.kotlin.react.native.component.ScrollView\nimport ojaynico.kotlin.react.native.component.StyleSheet\nimport ojaynico.kotlin.react.native.component.Text\nimport ojaynico.kotlin.react.native.component.View\nimport react.FC\nimport react.Props\n\nval styles = StyleSheet.create(object {\n    val body = object {\n            val backgroundColor = \"#FFF\"\n    }\n    val text = object {\n            val fontSize = 24\n            val fontWeight = \"600\"\n            val color = \"#000\"\n    }\n})\n\nval App = FC\u003cProps\u003e {\n    ScrollView {\n        contentInsetAdjustmentBehavior = \"automatic\"\n\n        View {\n            style = styles.body\n\n            Text {\n                style = styles.text\n                +\"Welcome to Kotlin React Native\"\n            }\n        }\n    }\n}\n\nfun main() {\n    // For class components\n    //AppRegistry.registerComponent(\"MyApp\") { App::class.js }\n    // For functional components (Assume App is the functional component)\n     AppRegistry.registerComponent(\"MyApp\") { App }\n\n    // Code below will work if you have added react native web dependency to your project. \n    // Visit how to set up react native web in your project for a detailed instruction.\n    // An example project using react native web is in the link at the end of this document.\n    if (Platform.OS == \"web\") {\n        AppRegistry.runApplication(\"MyApp\", json {\n            rootTag = document.getElementById(\"root\")\n        })\n    }\n}\n```\n\n## `NOTE: STILL UNDER DEVELOPMENT. USE ALTERNATIVE NAVIGATION`\n### `Example using Navigation`\n\n```kotlin\nimport ojaynico.kotlin.react.*\nimport ojaynico.kotlin.react.native.AppRegistry\nimport ojaynico.kotlin.react.native.Platform\nimport kotlinx.browser.document\nimport react.*\n\nval Menu = functionComponent\u003cMenuProps\u003e { props -\u003e\n    view {\n        this.attrs.style = json {\n            flex = 1\n            backgroundColor = \"white\"\n            marginRight = \"90%\"\n        }\n\n        button {\n            title = \"Screen Two\"\n            onPress = {\n                // props being passed through a json object\n                // NOTE: An interface with the props below have to be defined and used by ScreenTwo component\n                props.navigator.push(\"ScreenTwo\", json {\n                    name = \"Nicodemus Ojwee\"\n                    age = 25\n                    school = \"Namilyango College\"\n                })\n            }\n        }\n        button {\n            title = \"Screen Three\"\n            onPress = {\n                props.navigator.push(\"ScreenThree\", json {  })\n            }\n        }\n\n    }\n}\n\nval App = functionComponent\u003cProps\u003e {\n    navigator {\n        this.attrs {\n            // Side Menu (from above) is passed as functional component prop\n            // Using asDynamic() for now till the next update\n            asDynamic().sideMenu = Menu\n            asDynamic().menuPosition = \"left\"\n        }\n        route {\n            this.attrs {\n                name = \"ScreenOne\"\n                component = ScreenOne\n            }\n        }\n        // pathVariables has to be defined as below if you plan to pass props in react native web\n        // pathVariables names are supposed to be similar and in the order in which you have defined your props interface in ScreenTwoProps\n        route {\n            this.attrs {\n                name = \"ScreenTwo\"\n                component = ScreenTwo\n                pathVariables = \"name/age/school\"\n            }\n        }\n        route {\n            this.attrs {\n                name = \"ScreenThree\"\n                component = ScreenThree\n            }\n        }\n    }\n}\n\nval ScreenOne = functionComponent\u003cNavigationProps\u003e { props -\u003e\n    view {\n        this.attrs.style = json {\n            backgroundColor = \"#59C9A5\"\n            flex = 1\n        }\n\n        button {\n            title = \"Menu\"\n            onPress = {\n                props.navigator.showMenu()\n            }\n        }\n\n        button {\n            title = \"Screen Two\"\n            onPress = {\n                // props being passed through a json object\n                // NOTE: An interface with the props below have to be defined and used by ScreenTwo component\n                props.navigator.push(\"ScreenTwo\", json {\n                    name = \"Nicodemus Ojwee\"\n                    age = 25\n                    school = \"Namilyango College\"\n                })\n            }\n        }\n\n        button {\n            title = \"Pop\"\n            onPress = {\n                props.navigator.pop()\n            }\n        }\n    }\n}\n\n// If using web, the props defined in the interface below have to be defined as pathVariables\n// in the route {} function above in App component and they have to follow the order.\nexternal interface ScreenTwoProps : NavigationProps {\n    var name: String\n    var age: Int\n    var school: String\n}\n\nval ScreenTwo = functionComponent\u003cScreenTwoProps\u003e { props -\u003e\n    view {\n        this.attrs.style = json {\n            backgroundColor = \"#23395B\"\n            flex = 1\n            alignItems = \"center\"\n            justifyContent = \"center\"\n        }\n\n        button {\n            title = \"Screen Three\"\n            onPress = {\n                props.navigator.push(\"ScreenThree\", json {  })\n            }\n        }\n\n        button {\n            title = \"Pop\"\n            onPress = {\n                props.navigator.pop()\n            }\n        }\n\n        text(\"Name is \" + props.name) {\n            this.attrs {\n                style = json {\n                    color = \"white\"\n                }\n            }\n        }\n\n        text(\"Age is \" + props.age) {\n            this.attrs {\n                style = json {\n                    color = \"white\"\n                }\n            }\n        }\n\n        text(\"School is \" + props.school) {\n            this.attrs {\n                style = json {\n                    color = \"white\"\n                }\n            }\n        }\n    }\n}\n\nval ScreenThree = functionComponent\u003cNavigationProps\u003e { props -\u003e\n    view {\n        this.attrs.style = json {\n            backgroundColor = \"#B9E3C6\"\n            flex = 1\n            alignItems = \"center\"\n            justifyContent = \"center\"\n        }\n\n        button {\n            title = \"Pop\"\n            onPress = {\n                props.navigator.pop()\n            }\n        }\n    }\n}\n\nfun main() {\n    AppRegistry.registerComponent(\"MyApp\") { App }\n\n    // Code below will work if you have added react native web dependency to your project. \n    // Visit how to set up react native web in your project for a detailed instruction.\n    // An example project using react native web is in the link at the end of this document.\n    if (Platform.OS == \"web\") {\n        AppRegistry.runApplication(\"MyApp\", json {\n            rootTag = document.getElementById(\"root\")\n        })\n    }\n}\n\n```\n\n**NOTE:** In the main function, MyApp should be the same as the name of the app directory\n\n**A fully set up and working example can be found in the repository below.**\n\nhttps://github.com/ojaynico/KotlinReactNativeApp\n\n[![\"Buy Me A Coffee\"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/ojaynico)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fojaynico%2Fojaynico-kotlin-react-native","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fojaynico%2Fojaynico-kotlin-react-native","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fojaynico%2Fojaynico-kotlin-react-native/lists"}