{"id":31727213,"url":"https://github.com/kooijmaninc/genesis-x","last_synced_at":"2026-04-11T14:02:32.619Z","repository":{"id":318536472,"uuid":"1071630905","full_name":"KooijmanInc/Genesis-X","owner":"KooijmanInc","description":"The start of a complete library that integrates most common elements used in a program and/or app. Stay tuned","archived":false,"fork":false,"pushed_at":"2025-10-07T20:03:46.000Z","size":126,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-07T20:16:11.205Z","etag":null,"topics":["android","cxx23","firebase","ios","linux","macos","notifications","physics","physics-engine","push-notifications","qmake","qml","qt","qt6"],"latest_commit_sha":null,"homepage":"https://www.kooijmaninc.nl","language":"QMake","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/KooijmanInc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":["KooijmanInc"],"patreon":"Sebastiaan Kooijman","open_collective":"Genesis-X","ko_fi":"Kooijman","tidelift":"pypi/genesis-x","custom":["https://paypal.me/kooijmaninc","https://buy.stripe.com/6oUfZh67X1n67FC4NVaAw01","https://buy.stripe.com/3cIaEXeEt1n66BybcjaAw00"]}},"created_at":"2025-10-07T15:48:23.000Z","updated_at":"2025-10-07T19:58:07.000Z","dependencies_parsed_at":"2025-10-07T20:16:16.994Z","dependency_job_id":"9e6ebbea-7f97-422a-b2b5-9f2b7bafaf27","html_url":"https://github.com/KooijmanInc/Genesis-X","commit_stats":null,"previous_names":["kooijmaninc/genesis-x"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/KooijmanInc/Genesis-X","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KooijmanInc%2FGenesis-X","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KooijmanInc%2FGenesis-X/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KooijmanInc%2FGenesis-X/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KooijmanInc%2FGenesis-X/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KooijmanInc","download_url":"https://codeload.github.com/KooijmanInc/Genesis-X/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KooijmanInc%2FGenesis-X/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000850,"owners_count":26082950,"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-09T02:00:07.460Z","response_time":59,"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","cxx23","firebase","ios","linux","macos","notifications","physics","physics-engine","push-notifications","qmake","qml","qt","qt6"],"created_at":"2025-10-09T06:19:15.325Z","updated_at":"2025-12-30T21:12:46.139Z","avatar_url":"https://github.com/KooijmanInc.png","language":"QMake","funding_links":["https://github.com/sponsors/KooijmanInc","https://patreon.com/Sebastiaan Kooijman","https://opencollective.com/Genesis-X","https://ko-fi.com/Kooijman","https://tidelift.com/funding/github/pypi/genesis-x","https://paypal.me/kooijmaninc","https://buy.stripe.com/6oUfZh67X1n67FC4NVaAw01","https://buy.stripe.com/3cIaEXeEt1n66BybcjaAw00"],"categories":[],"sub_categories":[],"readme":"\u003c!-- SPDX-License-Identifier: (LicenseRef-KooijmanInc-Commercial OR GPL-3.0-only) --\u003e\n\u003c!-- Copyright (c) 2025 Kooijman Incorporate Holding B.V. --\u003e\n\n# Genesis-X\n\n[![CI – Quality checks](https://github.com/KooijmanInc/Genesis-X/actions/workflows/quality.yml/badge.svg?branch=main)](https://github.com/KooijmanInc/Genesis-X/actions/workflows/quality.yml)\n[![CI – Quality checks (staging)](https://github.com/KooijmanInc/Genesis-X/actions/workflows/quality.yml/badge.svg?branch=staging)](https://github.com/KooijmanInc/Genesis-X/actions/workflows/quality.yml)\n\n\nQt library with a physics-engine foundation and cross-platform notifications.  \nTested with **Qt 6.10** (Qt Creator **17.0.2**).\n\n---\n\n## 💖 Donations \u0026 Sponsorships\n\n[![Sponsor](https://img.shields.io/badge/Sponsor-GitHub%20Sponsors-ff69b4)](https://github.com/sponsors/KooijmanInc)\n[![Stripe](https://img.shields.io/badge/Donate-Stripe-635bff)](https://buy.stripe.com/3cIaEXeEt1n66BybcjaAw00)\n[![Stripe Monthly](https://img.shields.io/badge/Sponsor-Stripe%20Monthly-635bff)](https://buy.stripe.com/6oUfZh67X1n67FC4NVaAw01)\n[![PayPal](https://img.shields.io/badge/Donate-PayPal-blue)](https://paypal.me/kooijmaninc)\n\nIf Genesis‑X saved you time, consider supporting development:  \n- GitHub Sponsors: https://github.com/sponsors/KooijmanInc  \n- Stripe (one‑time): https://buy.stripe.com/3cIaEXeEt1n66BybcjaAw00  \n- Stripe (monthly): https://buy.stripe.com/6oUfZh67X1n67FC4NVaAw01  \n- Company sponsorships (invoice/VAT): sponsors@kooijman-inc.com\n\nSee also **[BACKERS.md](BACKERS.md)** and **.github/FUNDING.yml**.\n\n---\n\n## New in this release\n- **Biometrics**: C++ `BiometricsAuth` and QML `Biometrics` with `authenticate()`, `isAvailable`.\n- **Permissions**: C++ `PermissionManager` and QML `Permissions` to check/request runtime permissions.\n- **CommandController**: C++ Connecting to an api server. (we created a template api package in symfony for you to download at [https://github.com/KooijmanInc/gx-template-api](https://github.com/KooijmanInc/gx-template-api))\n- **qdocs**: Written qdocs for easy access via F1 and help (usally it's autodetected, otherwise add the docs manually)\n\n### QML quick start\n```qml\nimport GenesisX.App.Biometrics 1.0\nimport GenesisX.App.Permissions 1.0\n\nBiometrics {\n    id: bio\n    onResult: (ok, error) =\u003e console.log(\"Auth:\", ok, error)\n}\n\nPermissions {\n    id: perms\n}\n\nButton {\n    text: \"Unlock\"\n    onClicked: bio.authenticate(\"Confirm your identity\")\n}\nButton {\n    text: \"Allow Notifications\"\n    onClicked: perms.request([\"notifications\"])\n}\n```\n\n```qmake\nQT += genesisx_orm genesisx_app_notifications genesisx_app_biometrics genesisx_app_permissions\n\nGX_LOADED_MODULES = $$QT\nGX_LOADED_MODULES_CSV = $$join(GX_LOADED_MODULES, \",\")\nDEFINES += GX_LOADED_MODULES=\\\\\\\"$$GX_LOADED_MODULES_CSV\\\\\\\"\n\n# ---------- Genesis-X pass app root path ----------\nGENESISX_APP_ROOT = $$PWD\n\n# ---------- Build type sets library path ----------\ndebug {\n    LOCAL_BUILD_PATH = debug\n} else: profile {\n    LOCAL_BUILD_PATH = profile\n} else {\n    LOCAL_BUILD_PATH = release\n    DEFINES += QT_NO_DEBUG_OUTPUT    # disables qDebug()\n    #DEFINES += QT_NO_INFO_OUTPUT    # uncomment to also disable qInfo()\n    #DEFINES += QT_NO_WARNING_OUTPUT # (usually keep warnings on)\n}\n\n# ---------- Set same build path optional ----------\nDESTDIR = $$PWD/../$$LOCAL_DESTINATION_PATH/$$LOCAL_BUILD_PATH\nDEST_LIBDIRS = $$DESTDIR\n```\n\n### C++ quick start\n```cpp\n#include \u003cGenesisX/CoreQml.h\u003e\n#include \u003cGenesisX/Orm/OrmQml.h\u003e\n#include \u003cGenesisX/Orm/ConfigIO.h\u003e\n#include \u003cGenesisX/Orm/Controllers.h\u003e\n#include \u003cGenesisX/utils/SystemInfo.h\u003e\n#include \u003cGenesisX/Orm/TransportConfig.h\u003e\n\nint main (int argc, char* argv[])\n{\n  GXOrm::TransportConfig cfg;\n  GXOrm::loadTransportConfig(\":/config/config.json\", cfg, u\"dev\");\n  \n  auto* conn = GXOrm::gxOrmConnectionController();\n  conn-\u003eapplyTransport(cfg);\n  \n  auto* cmd = GXOrm::gxOrmCommandController();\n  cmd-\u003ecmdLogin(\"user@example.localhost\", \"your-password\");\n  cmd-\u003ecmdPing();\n  \n  QQmlApplicationEngine engine;\n  QQmlContext *rootContext = engine.rootContext();\n  GXCore::registerEnabledQmlModules(\u0026engine, GX_LOADED_MODULES);\n  GXOrm::registerEnabledQmlModules(\u0026engine);\n}\n```\n\n```json\n{\n    \"backend\": \"http\",\n    \"api\": {\n        \"baseUrl\": \"https://api.example.com\",\n        \"appVersion\": \"1.0.0\",\n        \"userLanguage\": \"en\",\n        \"timeoutMs\": 8000,\n        \"retryCount\": 0,\n        \"allowInsecureDev\": false,\n        \"appKey\": \"app-key\",\n        \"apiToken\": \"2Y\u00261N+yBmJxgDp%D-you-token_%UJNHOUIuc0+!yFWW%OmJ\",\n        \"bearerToken\": \"\",\n        \"headers\": {\n            \"Accept\": \"application/json\"\n        }\n    },\n    \"sql\": {\n        \"driver\": \"\",\n        \"host\": \"\",\n        \"port\": 3306,\n        \"database\": \"\",\n        \"user\": \"\",\n        \"password\": \"\",\n        \"options\": {}\n    },\n    \"overrides\": {\n        \"dev\": {\n            \"api\": {\n                \"baseUrl\": \"https://api.example.localhost\",\n                \"allowInsecureDev\": true\n            },\n            \"sql\": {\n                \"host\": \"127.0.0.1\",\n                \"port\": 3306,\n                \"user\": \"dev\",\n                \"password\": \"secret\"\n            }\n        },\n        \"staging\": {\n            \"api\": {\n                \"baseUrl\": \"https://staging.api.example.com\",\n                \"allowInsecureDev\": false\n            },\n            \"sql\": {\n                \"host\": \"https://www.example.com\",\n                \"port\": 3306,\n                \"user\": \"staging\",\n                \"password\": \"secret\"\n            }\n        }\n    }\n}\n\n```\n\n---\n\n## Features\n\n- QML‑friendly Core API\n- Notifications:\n  - ✅ Android (Firebase C++ SDK)\n  - ✅ Windows\n  - ✅ Linux, iOS/iPadOS, macOS\n- Permissions:\n  - ✅ Android\n- Biometrics:\n  - ✅ Android\n- Android Firebase integration auto‑wired via generated `gradle.properties`\n- Scripted 3rd‑party setup (kept out of Git)\n\n---\n\n## Requirements\n\n- Qt 6.10 toolchains (Android kit if targeting Android)\n- Android SDK + NDK (for Android builds)\n- Git, PowerShell (Windows) or bash (macOS/Linux)\n\n---\n\n## Repo Layout (excerpt)\n\n```\nGenesis-X /\n├─ common/\n│  ├─ qmake-destination-path.pri\n│  └─ qmake-target-platform.pri\n├─ config/\n│  └─ deps.json\n├─ core/\n│  ├─ android-template/\n│  │  ├─ build.gradle\n│  │  ├─ google-services.json\n│  │  ├─ gradle.properties\n│  │  └─ gradle.properties.in\n│  ├─ include/\n│  │  └─ GenesisX/\n│  │     ├─ Auth/\n│  │     │  └─ Auth.h\n│  │     ├─ Biometrics/\n│  │     │  └─ Biometrics.h\n│  │     ├─ Permissions/\n│  │     │  └─ Permissions.h\n│  │     ├─ utils/\n│  │     │  └─ SystemInfo.h\n│  │     ├─ CoreQml.h\n│  │     └─ genesisx_global.h\n│  ├─ qml/\n│  │  ├─ GenesisX/\n│  │  │  ├─ App/\n│  │  │  │  ├─ Biometrics/\n│  │  │  │  │  ├─ biometrics.qmltypes\n│  │  │  │  │  └─ qmldir\n│  │  │  │  └─ Permissions/\n│  │  │  │     ├─ permissions.qmltypes\n│  │  │  │     └─ qmldir\n│  │  │  └─ Core/\n│  │  │     ├─ Navigation/\n│  │  │     │  ├─ Link.qml\n│  │  │     │  ├─ NavHost.qml\n│  │  │     │  ├─ navigation.qmltypes\n│  │  │     │  └─ qmldir\n│  │  │     ├─ Notifications/\n│  │  │     │  ├─ notifications.qmltypes\n│  │  │     │  └─ qmldir\n│  │  │     └─ SystemInfo/\n│  │  │        ├─ qmldir\n│  │  │        └─ systeminfo.qmltypes\n│  │  └─ core_modules.qrc\n│  ├─ resources/\n│  │  ├─ core.qrc\n│  │  └─ logo.ico\n│  ├─ src/\n│  │  ├─ app/\n│  │  │  ├─ ab/\n│  │  │  │  ├─ ABTesting.cpp\n│  │  │  │  └─ ABTesting.h\n│  │  │  ├─ analytics/\n│  │  │  │  ├─ analytics.cpp\n│  │  │  │  └─ analytics.h\n│  │  │  ├─ AudioRecorder/\n│  │  │  │  ├─ AudioRecorder.cpp\n│  │  │  │  └─ AudioRecorder.h\n│  │  │  ├─ Auth/\n│  │  │  │  └─ Auth.cpp\n│  │  │  ├─ Biometrics/\n│  │  │  │  ├─ android/\n│  │  │  │  │  └─ src/\n│  │  │  │  │     └─ main/\n│  │  │  │  │        └─ java/\n│  │  │  │  │           ├─ biometrics/\n│  │  │  │  │           │  └─ GxBiometrics.java\n│  │  │  │  │           └─ org/\n│  │  │  │  │              └─ qtproject/\n│  │  │  │  │                 └─ qt/\n│  │  │  │  │                    └─ android/\n│  │  │  │  │                       └─ QtActivityUtils.java\n│  │  │  │  ├─ Biometrics.cpp\n│  │  │  │  ├─ BiometricsAndroid.cpp\n│  │  │  │  ├─ BiometricsQml.cpp\n│  │  │  │  └─ BiometricsQml.h\n│  │  │  ├─ notifications/\n│  │  │  │  ├─ fcm_android.cpp\n│  │  │  │  ├─ fcm_android.h\n│  │  │  │  ├─ GXAppDelegate+Push_ios.mm\n│  │  │  │  ├─ GXAppDelegate+Push_ios_old.mm\n│  │  │  │  ├─ GXAppDelegate+Push_macos.mm\n│  │  │  │  ├─ GXAppDelegate+Push_macos_old.mm\n│  │  │  │  ├─ GXPush_macos.mm\n│  │  │  │  ├─ GXPushBridge.mm\n│  │  │  │  ├─ NotificationHandler.cpp\n│  │  │  │  ├─ NotificationHandler.h\n│  │  │  │  ├─ NotificationHandler_apple.mm\n│  │  │  │  ├─ NotificationHandler_apple_bridge.h\n│  │  │  │  ├─ NotificationHandler_apple_old.mm\n│  │  │  │  ├─ NotificationsQml.cpp\n│  │  │  │  └─ NotificationsQml.h\n│  │  │  └─ Permissions/\n│  │  │     ├─ android/\n│  │  │     │  └─ src/\n│  │  │     │     └─ main/\n│  │  │     │        └─ java/\n│  │  │     │           └─ permissions/\n│  │  │     │              └─ GxPermissions.java\n│  │  │     ├─ Permissions.cpp\n│  │  │     ├─ PermissionsAndroid.cpp\n│  │  │     ├─ PermissionsQml.cpp\n│  │  │     └─ PermissionsQml.h\n│  │  ├─ core/\n│  │  │  └─ CoreQml.cpp\n│  │  ├─ navigation/\n│  │  │  ├─ GxRouter.cpp\n│  │  │  ├─ GxRouter.h\n│  │  │  ├─ NavigationQml.cpp\n│  │  │  └─ NavigationQml.h\n│  │  └─ utils/\n│  │     ├─ SystemInfo.cpp\n│  │     ├─ SystemInfoQml.cpp\n│  │     └─ SystemInfoQml.h\n│  └─ core.pro\n├─ docs/\n│  ├─ images/\n│  │  └─ arrow_bc.png\n│  ├─ out/\n│  │  ├─ classes.html\n│  │  ├─ codegen-h.html\n│  │  ├─ coreqml-h.html\n│  │  ├─ genesisx-app-biometrics-qmlmodule.html\n│  │  ├─ genesisx-app-permissions-qmlmodule.html\n│  │  ├─ genesisx-core.html\n│  │  ├─ genesisx-guides-module.html\n│  │  ├─ genesisx-notifications-qmlmodule.html\n│  │  ├─ genesisx-orm-module.html\n│  │  ├─ genesisx-orm.html\n│  │  ├─ genesisx.index\n│  │  ├─ GenesisX.qch\n│  │  ├─ GenesisX.qhp\n│  │  ├─ getting-started.html\n│  │  ├─ gx-app-ab-abtesting.html\n│  │  ├─ gx-app-ab.html\n│  │  ├─ gx-app-analytics-analytics.html\n│  │  ├─ gx-app-analytics.html\n│  │  ├─ gx-app-audiorecorder-audiorecorder.html\n│  │  ├─ gx-app-audiorecorder.html\n│  │  ├─ gx-app-auth-auth.html\n│  │  ├─ gx-app-auth.html\n│  │  ├─ gx-app-biometrics-biometrics.html\n│  │  ├─ gx-app-biometrics.html\n│  │  ├─ gx-app-notifications-classes.html\n│  │  ├─ gx-app-notifications-notificationhandler.html\n│  │  ├─ gx-app-notifications.html\n│  │  ├─ gx-app-permissions-permissions.html\n│  │  ├─ gx-app-permissions.html\n│  │  ├─ gx-app.html\n│  │  ├─ gx-orm-codegen.html\n│  │  ├─ gx-orm-commandcontroller.html\n│  │  ├─ gx-orm-connectioncontroller.html\n│  │  ├─ gx-orm.html\n│  │  ├─ gx.html\n│  │  ├─ index.html\n│  │  ├─ namespaces-orm.html\n│  │  ├─ namespaces.html\n│  │  ├─ qml-genesisx-app-biometrics-biometrics-members.html\n│  │  ├─ qml-genesisx-app-biometrics-biometrics.html\n│  │  ├─ qml-genesisx-app-permissions-permissions-members.html\n│  │  ├─ qml-genesisx-app-permissions-permissions.html\n│  │  ├─ qml-genesisx-notifications-notificationhandler-members.html\n│  │  ├─ qml-genesisx-notifications-notificationhandler.html\n│  │  └─ systeminfo-h.html\n│  ├─ style/\n│  │  └─ genesisx-dark.css\n│  ├─ topics/\n│  │  ├─ classes.qdoc\n│  │  ├─ genesisx-core.qdoc\n│  │  ├─ getting-started.qdoc\n│  │  ├─ group_notifications.qdoc\n│  │  ├─ guides.qdoc\n│  │  ├─ gx-namespace.qdoc\n│  │  ├─ gx-orm.qdoc\n│  │  ├─ index.qdoc\n│  │  └─ namespaces.qdoc\n│  ├─ .gitignore\n│  ├─ .qmake.stash\n│  ├─ docs.pro\n│  ├─ genesisx.qdocconf\n│  ├─ Makefile\n│  ├─ Makefile.Debug\n│  ├─ Makefile.Release\n│  └─ qt-includes.qdocconf.in\n├─ LICENSES/\n│  ├─ GPL-3.0-only.txt\n│  └─ LicenseRef-KooijmanInc-Commercial.txt\n├─ mkspecs/\n│  ├─ features/\n│  │  ├─ conf/\n│  │  │  ├─ gx_core.prf\n│  │  │  ├─ gx_core_sub.prf\n│  │  │  ├─ gx_orm.prf\n│  │  │  └─ gx_physics.prf\n│  │  ├─ genesisx_app_core.prf\n│  │  ├─ gx_app_ab.prf\n│  │  ├─ gx_app_analytics.prf\n│  │  ├─ gx_app_audiorecorder.prf\n│  │  ├─ gx_app_auth.prf\n│  │  ├─ gx_app_background.prf\n│  │  ├─ gx_app_billing.prf\n│  │  ├─ gx_app_biometrics.prf\n│  │  ├─ gx_app_calendar.prf\n│  │  ├─ gx_app_camera.prf\n│  │  ├─ gx_app_cast.prf\n│  │  ├─ gx_app_clipboard.prf\n│  │  ├─ gx_app_config.prf\n│  │  ├─ gx_app_connectivity.prf\n│  │  ├─ gx_app_contacts.prf\n│  │  ├─ gx_app_crash.prf\n│  │  ├─ gx_app_deeplinks.prf\n│  │  ├─ gx_app_files.prf\n│  │  ├─ gx_app_haptics.prf\n│  │  ├─ gx_app_imagepicker.prf\n│  │  ├─ gx_app_intents.prf\n│  │  ├─ gx_app_location.prf\n│  │  ├─ gx_app_logging.prf\n│  │  ├─ gx_app_media.prf\n│  │  ├─ gx_app_notifications.prf\n│  │  ├─ gx_app_permissions.prf\n│  │  ├─ gx_app_remoteconfig.prf\n│  │  ├─ gx_app_review.prf\n│  │  ├─ gx_app_root.prf\n│  │  ├─ gx_app_securestore.prf\n│  │  ├─ gx_app_sensors.prf\n│  │  ├─ gx_app_share.prf\n│  │  ├─ gx_app_updater.prf\n│  │  └─ gx_runtime.prf\n│  └─ modules/\n│     ├─ qt_lib_genesisx.pri\n│     ├─ qt_lib_genesisx_app_ab.pri\n│     ├─ qt_lib_genesisx_app_analytics.pri\n│     ├─ qt_lib_genesisx_app_audiorecorder.pri\n│     ├─ qt_lib_genesisx_app_auth.pri\n│     ├─ qt_lib_genesisx_app_background.pri\n│     ├─ qt_lib_genesisx_app_billing.pri\n│     ├─ qt_lib_genesisx_app_biometrics.pri\n│     ├─ qt_lib_genesisx_app_calendar.pri\n│     ├─ qt_lib_genesisx_app_camera.pri\n│     ├─ qt_lib_genesisx_app_cast.pri\n│     ├─ qt_lib_genesisx_app_clipboard.pri\n│     ├─ qt_lib_genesisx_app_config.pri\n│     ├─ qt_lib_genesisx_app_connectivity.pri\n│     ├─ qt_lib_genesisx_app_contacts.pri\n│     ├─ qt_lib_genesisx_app_core.pri\n│     ├─ qt_lib_genesisx_app_crash.pri\n│     ├─ qt_lib_genesisx_app_deeplinks.pri\n│     ├─ qt_lib_genesisx_app_files.pri\n│     ├─ qt_lib_genesisx_app_haptics.pri\n│     ├─ qt_lib_genesisx_app_imagepicker.pri\n│     ├─ qt_lib_genesisx_app_intents.pri\n│     ├─ qt_lib_genesisx_app_location.pri\n│     ├─ qt_lib_genesisx_app_logging.pri\n│     ├─ qt_lib_genesisx_app_media.pri\n│     ├─ qt_lib_genesisx_app_notifications.pri\n│     ├─ qt_lib_genesisx_app_permissions.pri\n│     ├─ qt_lib_genesisx_app_preferences.pri\n│     ├─ qt_lib_genesisx_app_remoteconfig.pri\n│     ├─ qt_lib_genesisx_app_review.pri\n│     ├─ qt_lib_genesisx_app_securestore.pri\n│     ├─ qt_lib_genesisx_app_sensors.pri\n│     ├─ qt_lib_genesisx_app_share.pri\n│     ├─ qt_lib_genesisx_app_updater.pri\n│     ├─ qt_lib_genesisx_orm.pri\n│     └─ qt_lib_genesisx_physics.pri\n├─ orm/\n│  ├─ include/\n│  │  └─ GenesisX/\n│  │     └─ Orm/\n│  │        ├─ AuthCredentials.h\n│  │        ├─ Codegen.h\n│  │        ├─ CommandController.h\n│  │        ├─ ConfigIO.h\n│  │        ├─ ConnectionCheck.h\n│  │        ├─ ConnectionController.h\n│  │        ├─ Controllers.h\n│  │        ├─ DataAccess.h\n│  │        ├─ genesisx_orm_global.h\n│  │        ├─ HttpConfig.h\n│  │        ├─ HttpResponse.h\n│  │        ├─ Json.h\n│  │        ├─ JsonAdapter.h\n│  │        ├─ OrmQml.h\n│  │        ├─ Repository.h\n│  │        ├─ RepositoryOld.h\n│  │        ├─ SqlConfig.h\n│  │        └─ TransportConfig.h\n│  ├─ src/\n│  │  ├─ core/\n│  │  │  ├─ CommandController.cpp\n│  │  │  ├─ CommandControllerQml.cpp\n│  │  │  ├─ CommandControllerQml.h\n│  │  │  ├─ ConfigIO.cpp\n│  │  │  ├─ ConnectionController.cpp\n│  │  │  ├─ Controllers.cpp\n│  │  │  ├─ HttpConnectionChecker.cpp\n│  │  │  ├─ HttpResponse.cpp\n│  │  │  └─ OrmQml.cpp\n│  │  └─ tools/\n│  │     └─ Codegen.cpp\n│  └─ orm.pro\n├─ physics/\n│  ├─ include/\n│  │  └─ GenesisX/\n│  │     ├─ vehicles/\n│  │     │  └─ vehicle4w.h\n│  │     └─ genesisx_physics_global.h\n│  ├─ plugin/\n│  │  ├─ physics_plugin.cpp\n│  │  └─ physics_plugin.pro\n│  ├─ src/\n│  │  └─ vehicles/\n│  │     └─ vehicle4w.cpp\n│  ├─ physics.json\n│  └─ physics.pro\n├─ scripts/\n│  ├─ ci/\n│  │  ├─ check-spdx-and-bom.bat\n│  │  ├─ check-spdx-and-bom.ps1\n│  │  └─ check-spdx-and-bom.sh\n│  ├─ packages/\n│  │  ├─ firebase.bat\n│  │  └─ firebase.sh\n│  ├─ add-headers.bat\n│  ├─ add-headers.ps1\n│  ├─ add-headers.sh\n│  ├─ bootstrap.bat\n│  ├─ bootstrap.sh\n│  ├─ cleanup-merged-branches.bat\n│  ├─ cleanup-merged-branches.ps1\n│  ├─ cleanup-merged-branches.sh\n│  ├─ collect-traffic.js\n│  ├─ fetch-gpl-license.bat\n│  ├─ fetch-gpl-license.ps1\n│  ├─ fetch-gpl-license.sh\n│  ├─ fix-bom.bat\n│  ├─ fix-bom.ps1\n│  ├─ install-prepush.bat\n│  ├─ install-prepush.sh\n│  ├─ release.bat\n│  └─ release.sh\n├─ tools/\n│  ├─ gxgen/\n│  │  ├─ debug/\n│  │  │  ├─ config.json\n│  │  │  ├─ genesisx.dll\n│  │  │  ├─ genesisx_orm.dll\n│  │  │  ├─ gxgen.exe\n│  │  │  ├─ libgenesisx.a\n│  │  │  └─ libgenesisx_orm.a\n│  │  ├─ .qmake.stash\n│  │  ├─ gxgen.pro\n│  │  ├─ main.cpp\n│  │  ├─ Makefile\n│  │  ├─ Makefile.Debug\n│  │  └─ Makefile.Release\n│  ├─ qtcreator-snippets/\n│  │  └─ snippets.xml\n│  ├─ qtcreator-wizard/\n│  │  ├─ projects/\n│  │  │  ├─ GenesisXApiDatabase/\n│  │  │  │  └─ templates/\n│  │  │  │     └─ config.json.tmpl\n│  │  │  ├─ GenesisXApp/\n│  │  │  │  ├─ templates/\n│  │  │  │  │  ├─ features/\n│  │  │  │  │  │  └─ gx_app_root.prf.tmpl\n│  │  │  │  │  ├─ project-ui/\n│  │  │  │  │  │  ├─ android/\n│  │  │  │  │  │  │  ├─ AndroidManifest.xml.tmpl\n│  │  │  │  │  │  │  └─ google-services.json.tmpl\n│  │  │  │  │  │  ├─ apple/\n│  │  │  │  │  │  │  ├─ ios/\n│  │  │  │  │  │  │  │  ├─ Entitlements.plist.tmpl\n│  │  │  │  │  │  │  │  └─ Info.plist.tmpl\n│  │  │  │  │  │  │  ├─ macos/\n│  │  │  │  │  │  │  │  ├─ Entitlements.plist.tmpl\n│  │  │  │  │  │  │  │  └─ Info.plist.tmpl\n│  │  │  │  │  │  │  └─ GoogleService-Info.plist.tmpl\n│  │  │  │  │  │  ├─ assets/\n│  │  │  │  │  │  │  ├─ genesisx-xcore.svg\n│  │  │  │  │  │  │  ├─ qmldir.tmpl\n│  │  │  │  │  │  │  └─ Style.qml.tmpl\n│  │  │  │  │  │  ├─ components/\n│  │  │  │  │  │  │  ├─ qmldir.tmpl\n│  │  │  │  │  │  │  └─ SplashWobble.qml.tmpl\n│  │  │  │  │  │  ├─ src/\n│  │  │  │  │  │  │  └─ main.cpp.tmpl\n│  │  │  │  │  │  ├─ views/\n│  │  │  │  │  │  │  └─ MasterView.qml.tmpl\n│  │  │  │  │  │  ├─ assets.qrc.tmpl\n│  │  │  │  │  │  ├─ components.qrc.tmpl\n│  │  │  │  │  │  ├─ icons.qrc.tmpl\n│  │  │  │  │  │  ├─ ui.pro.tmpl\n│  │  │  │  │  │  └─ views.qrc.tmpl\n│  │  │  │  │  ├─ .gitignore.tmpl\n│  │  │  │  │  ├─ .qmake.conf.tmpl\n│  │  │  │  │  └─ project.pro\n│  │  │  │  └─ wizard.json\n│  │  │  ├─ GenesisXPhysicsApp/\n│  │  │  │  └─ wizard.json\n│  │  │  └─ genesisx-xcore.png\n│  │  └─ install-wizard.bat\n│  └─ update_gradle_props.ps1.in\n├─ zdev/\n│  ├─ readyFordeletion/\n│  │  ├─ ApiClient.cpp\n│  │  └─ ApiClient.h\n│  └─ zdev.pro\n├─ .gitattributes\n├─ .gitignore\n├─ .gitlab-ci.yml\n├─ BACKERS.md\n├─ CODE_OF_CONDUCT.md\n├─ CONTRIBUTING.md\n├─ dev.pri\n├─ GenesisX.pro\n├─ GenesisX.pro.user\n├─ LICENSE\n├─ LICENSING.md\n├─ README.md\n├─ SECURITY.md\n└─ SUPPORT.md\n```\n\n---\n\n## Install / Setup\n\n### 1) Clone\n```bash\ngit clone \u003cyour-repo-url\u003e Genesis-X\ncd Genesis-X\n```\n\n### 2) Fetch 3rd‑party packages (Firebase)\n**Windows (PowerShell/cmd):**\n```bat\nscripts\\bootstrap.bat firebase\n:: or:\nscripts\\bootstrap.bat all\n```\n\n**macOS / Linux:**\n```bash\n./scripts/bootstrap.sh firebase\n# or:\n./scripts/bootstrap.sh all\n```\n\nWhat it does:\n- Downloads `firebase_cpp_sdk_13.1.0.zip`\n- Verifies SHA‑256\n- Unzips to `3rdparty/firebase_cpp_sdk/` (Git‑ignored)\n\n---\n\n## Integrate into Your App\n\n\u003e Goal: zero per‑app hardcoding of Firebase paths.\n\n### A) App root: copy feature + `.qmake.conf`\nCopy **`mkspecs/features`** from Genesis‑X into your **app root**, then create **`.qmake.conf`** in your app root:\n\n```ini\n# .qmake.conf (in your APP root)\nload(gx_app_root)\nQMAKEPATH += \u003cabsolute-or-relative-path-to\u003e/Genesis-X\n```\n\n### B) App `.pro`: set Android package dir\n```qmake\n# Where Qt copies Android template files from:\nANDROID_PACKAGE_SOURCE_DIR = $$PWD/android\n```\n\n### C) Link Genesis‑X modules in your app\n```qmake\n# Core\nQT += genesisx\n\n# Optional modules\nQT += genesisx-physics\n```\n\n### D) (Soon optional, now mandatory) Clean output structure in your app\n```qmake\n# ---------- Build type ----------\nCONFIG(debug, debug|release|profile) {\n    BUILD_PATH = debug\n} else: CONFIG(profile, debug|release|profile) {\n    BUILD_PATH = profile\n} else {\n    BUILD_PATH = release\n}\n\nDESTDIR = $$PWD/binaries/$$LOCAL_DESTINATION_PATH/$$BUILD_PATH\n```\n\n---\n\n## How Android Path Resolution Works\n\n**Problem:** Gradle needs absolute paths to Firebase C++ SDK.  \n**Solution:** Genesis‑X generates them for you—no app changes needed.\n\n1. `core/android-template/gradle.properties.in` contains tokens:\n   ```properties\n   firebase_cpp_sdk_dir=$$FIREBASE_CPP_SDK_DIR\n   baseDir=$$FIREBASE_DEPENDENCIES_GRADLE\n   ```\n2. During **Run qmake**, the library computes:\n   - `$$FIREBASE_CPP_SDK_DIR` → `\u003cGenesis-X\u003e/3rdparty/firebase_cpp_sdk`\n   - `$$FIREBASE_DEPENDENCIES_GRADLE` → `\u003c...\u003e/Android/firebase_dependencies.gradle`\n3. qmake writes the resolved file to the shadow build tree and the library build copies it back to:\n   ```\n   core/android-template/gradle.properties\n   ```\n4. `qt_lib_genesisx.pri` copies `build.gradle` and the **generated** `gradle.properties` into your app’s `ANDROID_PACKAGE_SOURCE_DIR`.  \n   Qt then copies those into `android-build/` and Gradle uses them.\n\n\u003e If you move Genesis‑X, simply **rebuild the library**; paths are refreshed automatically.\n\n---\n\n## Scripts Reference\n\n### Bootstrap (downloads 3rd‑party deps)\n- **Windows**\n  ```bat\n  scripts\\bootstrap.bat firebase\n  scripts\\bootstrap.bat all\n  ```\n- **macOS / Linux**\n  ```bash\n  ./scripts/bootstrap.sh firebase\n  ./scripts/bootstrap.sh all\n  ```\n\n### SPDX headers (dual license)\n```bash\n# macOS/Linux\n./scripts/add-headers.sh\n# Windows\nscripts\\add-headers.bat\n```\nWrites **UTF‑8 (no BOM)** and respects shebangs. Override with env vars:\n`COPYRIGHT_OWNER`, `COPYRIGHT_YEAR`, `LICENSE_EXPR`.\n\n### Fix UTF‑8 BOM (Windows/qmake)\n```bat\nscripts\\fix-bom.bat\n```\n\n### Pre‑push protection (main/staging)\n```bash\n./install-prepush.sh\n# Windows: install-prepush.bat\n```\nBlocks direct pushes to `main`/`staging`. One‑off override:\n`ALLOW_PROTECTED_PUSH=1 git push …`.\n\n### Fetch GPL text\n```bash\nscripts/fetch-gpl-license.sh\n# or Windows:\nscripts\\fetch-gpl-license.ps1\n```\n\n---\n\n## Governance \u0026 Policies\n\n- **Contributing Guide:** [CONTRIBUTING.md](CONTRIBUTING.md)  \n- **Code of Conduct:** [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)  \n- **Security Policy:** [SECURITY.md](SECURITY.md)  \n- **Support:** [SUPPORT.md](SUPPORT.md)\n\n---\n\n## Licensing\n\nGenesis‑X is **dual‑licensed**:  \n**(LicenseRef-KooijmanInc-Commercial OR GPL-3.0-only)**\n\nSee:\n- `LICENSES/LicenseRef-KooijmanInc-Commercial.txt` (commercial terms)\n- `LICENSES/GPL-3.0-only.txt` (GPL v3 only; use fetch script if placeholder)\n\nAll source files should include an SPDX header. See **LICENSING.md** for examples.\n\n---\n\n## Roadmap\n\n- Linux notifications\n- iOS/iPadOS/macOS notifications (APNs)\n- Physics modules exposed to QML\n- CI samples (bootstrap + Android matrix)\n\n---\n\n## Support\n\nOpen an issue/discussion and include:\n- your app’s `ANDROID_PACKAGE_SOURCE_DIR`\n- `core/android-template/gradle.properties` contents\n- the Gradle error snippet\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkooijmaninc%2Fgenesis-x","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkooijmaninc%2Fgenesis-x","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkooijmaninc%2Fgenesis-x/lists"}