An open API service indexing awesome lists of open source software.

https://github.com/kooijmaninc/genesis-x

The start of a complete library that integrates most common elements used in a program and/or app. Stay tuned
https://github.com/kooijmaninc/genesis-x

android cxx23 firebase ios linux macos notifications physics physics-engine push-notifications qmake qml qt qt6

Last synced: 2 months ago
JSON representation

The start of a complete library that integrates most common elements used in a program and/or app. Stay tuned

Awesome Lists containing this project

README

          

# Genesis-X

[![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)
[![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)

Qt library with a physics-engine foundation and cross-platform notifications.
Tested with **Qt 6.10** (Qt Creator **17.0.2**).

---

## πŸ’– Donations & Sponsorships

[![Sponsor](https://img.shields.io/badge/Sponsor-GitHub%20Sponsors-ff69b4)](https://github.com/sponsors/KooijmanInc)
[![Stripe](https://img.shields.io/badge/Donate-Stripe-635bff)](https://buy.stripe.com/3cIaEXeEt1n66BybcjaAw00)
[![Stripe Monthly](https://img.shields.io/badge/Sponsor-Stripe%20Monthly-635bff)](https://buy.stripe.com/6oUfZh67X1n67FC4NVaAw01)
[![PayPal](https://img.shields.io/badge/Donate-PayPal-blue)](https://paypal.me/kooijmaninc)

If Genesis‑X saved you time, consider supporting development:
- GitHub Sponsors: https://github.com/sponsors/KooijmanInc
- Stripe (one‑time): https://buy.stripe.com/3cIaEXeEt1n66BybcjaAw00
- Stripe (monthly): https://buy.stripe.com/6oUfZh67X1n67FC4NVaAw01
- Company sponsorships (invoice/VAT): sponsors@kooijman-inc.com

See also **[BACKERS.md](BACKERS.md)** and **.github/FUNDING.yml**.

---

## New in this release
- **Biometrics**: C++ `BiometricsAuth` and QML `Biometrics` with `authenticate()`, `isAvailable`.
- **Permissions**: C++ `PermissionManager` and QML `Permissions` to check/request runtime permissions.
- **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))
- **qdocs**: Written qdocs for easy access via F1 and help (usally it's autodetected, otherwise add the docs manually)

### QML quick start
```qml
import GenesisX.App.Biometrics 1.0
import GenesisX.App.Permissions 1.0

Biometrics {
id: bio
onResult: (ok, error) => console.log("Auth:", ok, error)
}

Permissions {
id: perms
}

Button {
text: "Unlock"
onClicked: bio.authenticate("Confirm your identity")
}
Button {
text: "Allow Notifications"
onClicked: perms.request(["notifications"])
}
```

```qmake
QT += genesisx_orm genesisx_app_notifications genesisx_app_biometrics genesisx_app_permissions

GX_LOADED_MODULES = $$QT
GX_LOADED_MODULES_CSV = $$join(GX_LOADED_MODULES, ",")
DEFINES += GX_LOADED_MODULES=\\\"$$GX_LOADED_MODULES_CSV\\\"

# ---------- Genesis-X pass app root path ----------
GENESISX_APP_ROOT = $$PWD

# ---------- Build type sets library path ----------
debug {
LOCAL_BUILD_PATH = debug
} else: profile {
LOCAL_BUILD_PATH = profile
} else {
LOCAL_BUILD_PATH = release
DEFINES += QT_NO_DEBUG_OUTPUT # disables qDebug()
#DEFINES += QT_NO_INFO_OUTPUT # uncomment to also disable qInfo()
#DEFINES += QT_NO_WARNING_OUTPUT # (usually keep warnings on)
}

# ---------- Set same build path optional ----------
DESTDIR = $$PWD/../$$LOCAL_DESTINATION_PATH/$$LOCAL_BUILD_PATH
DEST_LIBDIRS = $$DESTDIR
```

### C++ quick start
```cpp
#include
#include
#include
#include
#include
#include

int main (int argc, char* argv[])
{
GXOrm::TransportConfig cfg;
GXOrm::loadTransportConfig(":/config/config.json", cfg, u"dev");

auto* conn = GXOrm::gxOrmConnectionController();
conn->applyTransport(cfg);

auto* cmd = GXOrm::gxOrmCommandController();
cmd->cmdLogin("user@example.localhost", "your-password");
cmd->cmdPing();

QQmlApplicationEngine engine;
QQmlContext *rootContext = engine.rootContext();
GXCore::registerEnabledQmlModules(&engine, GX_LOADED_MODULES);
GXOrm::registerEnabledQmlModules(&engine);
}
```

```json
{
"backend": "http",
"api": {
"baseUrl": "https://api.example.com",
"appVersion": "1.0.0",
"userLanguage": "en",
"timeoutMs": 8000,
"retryCount": 0,
"allowInsecureDev": false,
"appKey": "app-key",
"apiToken": "2Y&1N+yBmJxgDp%D-you-token_%UJNHOUIuc0+!yFWW%OmJ",
"bearerToken": "",
"headers": {
"Accept": "application/json"
}
},
"sql": {
"driver": "",
"host": "",
"port": 3306,
"database": "",
"user": "",
"password": "",
"options": {}
},
"overrides": {
"dev": {
"api": {
"baseUrl": "https://api.example.localhost",
"allowInsecureDev": true
},
"sql": {
"host": "127.0.0.1",
"port": 3306,
"user": "dev",
"password": "secret"
}
},
"staging": {
"api": {
"baseUrl": "https://staging.api.example.com",
"allowInsecureDev": false
},
"sql": {
"host": "https://www.example.com",
"port": 3306,
"user": "staging",
"password": "secret"
}
}
}
}

```

---

## Features

- QML‑friendly Core API
- Notifications:
- βœ… Android (Firebase C++ SDK)
- βœ… Windows
- βœ… Linux, iOS/iPadOS, macOS
- Permissions:
- βœ… Android
- Biometrics:
- βœ… Android
- Android Firebase integration auto‑wired via generated `gradle.properties`
- Scripted 3rd‑party setup (kept out of Git)

---

## Requirements

- Qt 6.10 toolchains (Android kit if targeting Android)
- Android SDK + NDK (for Android builds)
- Git, PowerShell (Windows) or bash (macOS/Linux)

---

## Repo Layout (excerpt)

```
Genesis-X /
β”œβ”€ common/
β”‚ β”œβ”€ qmake-destination-path.pri
β”‚ └─ qmake-target-platform.pri
β”œβ”€ config/
β”‚ └─ deps.json
β”œβ”€ core/
β”‚ β”œβ”€ android-template/
β”‚ β”‚ β”œβ”€ build.gradle
β”‚ β”‚ β”œβ”€ google-services.json
β”‚ β”‚ β”œβ”€ gradle.properties
β”‚ β”‚ └─ gradle.properties.in
β”‚ β”œβ”€ include/
β”‚ β”‚ └─ GenesisX/
β”‚ β”‚ β”œβ”€ Auth/
β”‚ β”‚ β”‚ └─ Auth.h
β”‚ β”‚ β”œβ”€ Biometrics/
β”‚ β”‚ β”‚ └─ Biometrics.h
β”‚ β”‚ β”œβ”€ Permissions/
β”‚ β”‚ β”‚ └─ Permissions.h
β”‚ β”‚ β”œβ”€ utils/
β”‚ β”‚ β”‚ └─ SystemInfo.h
β”‚ β”‚ β”œβ”€ CoreQml.h
β”‚ β”‚ └─ genesisx_global.h
β”‚ β”œβ”€ qml/
β”‚ β”‚ β”œβ”€ GenesisX/
β”‚ β”‚ β”‚ β”œβ”€ App/
β”‚ β”‚ β”‚ β”‚ β”œβ”€ Biometrics/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ biometrics.qmltypes
β”‚ β”‚ β”‚ β”‚ β”‚ └─ qmldir
β”‚ β”‚ β”‚ β”‚ └─ Permissions/
β”‚ β”‚ β”‚ β”‚ β”œβ”€ permissions.qmltypes
β”‚ β”‚ β”‚ β”‚ └─ qmldir
β”‚ β”‚ β”‚ └─ Core/
β”‚ β”‚ β”‚ β”œβ”€ Navigation/
β”‚ β”‚ β”‚ β”‚ β”œβ”€ Link.qml
β”‚ β”‚ β”‚ β”‚ β”œβ”€ NavHost.qml
β”‚ β”‚ β”‚ β”‚ β”œβ”€ navigation.qmltypes
β”‚ β”‚ β”‚ β”‚ └─ qmldir
β”‚ β”‚ β”‚ β”œβ”€ Notifications/
β”‚ β”‚ β”‚ β”‚ β”œβ”€ notifications.qmltypes
β”‚ β”‚ β”‚ β”‚ └─ qmldir
β”‚ β”‚ β”‚ └─ SystemInfo/
β”‚ β”‚ β”‚ β”œβ”€ qmldir
β”‚ β”‚ β”‚ └─ systeminfo.qmltypes
β”‚ β”‚ └─ core_modules.qrc
β”‚ β”œβ”€ resources/
β”‚ β”‚ β”œβ”€ core.qrc
β”‚ β”‚ └─ logo.ico
β”‚ β”œβ”€ src/
β”‚ β”‚ β”œβ”€ app/
β”‚ β”‚ β”‚ β”œβ”€ ab/
β”‚ β”‚ β”‚ β”‚ β”œβ”€ ABTesting.cpp
β”‚ β”‚ β”‚ β”‚ └─ ABTesting.h
β”‚ β”‚ β”‚ β”œβ”€ analytics/
β”‚ β”‚ β”‚ β”‚ β”œβ”€ analytics.cpp
β”‚ β”‚ β”‚ β”‚ └─ analytics.h
β”‚ β”‚ β”‚ β”œβ”€ AudioRecorder/
β”‚ β”‚ β”‚ β”‚ β”œβ”€ AudioRecorder.cpp
β”‚ β”‚ β”‚ β”‚ └─ AudioRecorder.h
β”‚ β”‚ β”‚ β”œβ”€ Auth/
β”‚ β”‚ β”‚ β”‚ └─ Auth.cpp
β”‚ β”‚ β”‚ β”œβ”€ Biometrics/
β”‚ β”‚ β”‚ β”‚ β”œβ”€ android/
β”‚ β”‚ β”‚ β”‚ β”‚ └─ src/
β”‚ β”‚ β”‚ β”‚ β”‚ └─ main/
β”‚ β”‚ β”‚ β”‚ β”‚ └─ java/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ biometrics/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ GxBiometrics.java
β”‚ β”‚ β”‚ β”‚ β”‚ └─ org/
β”‚ β”‚ β”‚ β”‚ β”‚ └─ qtproject/
β”‚ β”‚ β”‚ β”‚ β”‚ └─ qt/
β”‚ β”‚ β”‚ β”‚ β”‚ └─ android/
β”‚ β”‚ β”‚ β”‚ β”‚ └─ QtActivityUtils.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€ Biometrics.cpp
β”‚ β”‚ β”‚ β”‚ β”œβ”€ BiometricsAndroid.cpp
β”‚ β”‚ β”‚ β”‚ β”œβ”€ BiometricsQml.cpp
β”‚ β”‚ β”‚ β”‚ └─ BiometricsQml.h
β”‚ β”‚ β”‚ β”œβ”€ notifications/
β”‚ β”‚ β”‚ β”‚ β”œβ”€ fcm_android.cpp
β”‚ β”‚ β”‚ β”‚ β”œβ”€ fcm_android.h
β”‚ β”‚ β”‚ β”‚ β”œβ”€ GXAppDelegate+Push_ios.mm
β”‚ β”‚ β”‚ β”‚ β”œβ”€ GXAppDelegate+Push_ios_old.mm
β”‚ β”‚ β”‚ β”‚ β”œβ”€ GXAppDelegate+Push_macos.mm
β”‚ β”‚ β”‚ β”‚ β”œβ”€ GXAppDelegate+Push_macos_old.mm
β”‚ β”‚ β”‚ β”‚ β”œβ”€ GXPush_macos.mm
β”‚ β”‚ β”‚ β”‚ β”œβ”€ GXPushBridge.mm
β”‚ β”‚ β”‚ β”‚ β”œβ”€ NotificationHandler.cpp
β”‚ β”‚ β”‚ β”‚ β”œβ”€ NotificationHandler.h
β”‚ β”‚ β”‚ β”‚ β”œβ”€ NotificationHandler_apple.mm
β”‚ β”‚ β”‚ β”‚ β”œβ”€ NotificationHandler_apple_bridge.h
β”‚ β”‚ β”‚ β”‚ β”œβ”€ NotificationHandler_apple_old.mm
β”‚ β”‚ β”‚ β”‚ β”œβ”€ NotificationsQml.cpp
β”‚ β”‚ β”‚ β”‚ └─ NotificationsQml.h
β”‚ β”‚ β”‚ └─ Permissions/
β”‚ β”‚ β”‚ β”œβ”€ android/
β”‚ β”‚ β”‚ β”‚ └─ src/
β”‚ β”‚ β”‚ β”‚ └─ main/
β”‚ β”‚ β”‚ β”‚ └─ java/
β”‚ β”‚ β”‚ β”‚ └─ permissions/
β”‚ β”‚ β”‚ β”‚ └─ GxPermissions.java
β”‚ β”‚ β”‚ β”œβ”€ Permissions.cpp
β”‚ β”‚ β”‚ β”œβ”€ PermissionsAndroid.cpp
β”‚ β”‚ β”‚ β”œβ”€ PermissionsQml.cpp
β”‚ β”‚ β”‚ └─ PermissionsQml.h
β”‚ β”‚ β”œβ”€ core/
β”‚ β”‚ β”‚ └─ CoreQml.cpp
β”‚ β”‚ β”œβ”€ navigation/
β”‚ β”‚ β”‚ β”œβ”€ GxRouter.cpp
β”‚ β”‚ β”‚ β”œβ”€ GxRouter.h
β”‚ β”‚ β”‚ β”œβ”€ NavigationQml.cpp
β”‚ β”‚ β”‚ └─ NavigationQml.h
β”‚ β”‚ └─ utils/
β”‚ β”‚ β”œβ”€ SystemInfo.cpp
β”‚ β”‚ β”œβ”€ SystemInfoQml.cpp
β”‚ β”‚ └─ SystemInfoQml.h
β”‚ └─ core.pro
β”œβ”€ docs/
β”‚ β”œβ”€ images/
β”‚ β”‚ └─ arrow_bc.png
β”‚ β”œβ”€ out/
β”‚ β”‚ β”œβ”€ classes.html
β”‚ β”‚ β”œβ”€ codegen-h.html
β”‚ β”‚ β”œβ”€ coreqml-h.html
β”‚ β”‚ β”œβ”€ genesisx-app-biometrics-qmlmodule.html
β”‚ β”‚ β”œβ”€ genesisx-app-permissions-qmlmodule.html
β”‚ β”‚ β”œβ”€ genesisx-core.html
β”‚ β”‚ β”œβ”€ genesisx-guides-module.html
β”‚ β”‚ β”œβ”€ genesisx-notifications-qmlmodule.html
β”‚ β”‚ β”œβ”€ genesisx-orm-module.html
β”‚ β”‚ β”œβ”€ genesisx-orm.html
β”‚ β”‚ β”œβ”€ genesisx.index
β”‚ β”‚ β”œβ”€ GenesisX.qch
β”‚ β”‚ β”œβ”€ GenesisX.qhp
β”‚ β”‚ β”œβ”€ getting-started.html
β”‚ β”‚ β”œβ”€ gx-app-ab-abtesting.html
β”‚ β”‚ β”œβ”€ gx-app-ab.html
β”‚ β”‚ β”œβ”€ gx-app-analytics-analytics.html
β”‚ β”‚ β”œβ”€ gx-app-analytics.html
β”‚ β”‚ β”œβ”€ gx-app-audiorecorder-audiorecorder.html
β”‚ β”‚ β”œβ”€ gx-app-audiorecorder.html
β”‚ β”‚ β”œβ”€ gx-app-auth-auth.html
β”‚ β”‚ β”œβ”€ gx-app-auth.html
β”‚ β”‚ β”œβ”€ gx-app-biometrics-biometrics.html
β”‚ β”‚ β”œβ”€ gx-app-biometrics.html
β”‚ β”‚ β”œβ”€ gx-app-notifications-classes.html
β”‚ β”‚ β”œβ”€ gx-app-notifications-notificationhandler.html
β”‚ β”‚ β”œβ”€ gx-app-notifications.html
β”‚ β”‚ β”œβ”€ gx-app-permissions-permissions.html
β”‚ β”‚ β”œβ”€ gx-app-permissions.html
β”‚ β”‚ β”œβ”€ gx-app.html
β”‚ β”‚ β”œβ”€ gx-orm-codegen.html
β”‚ β”‚ β”œβ”€ gx-orm-commandcontroller.html
β”‚ β”‚ β”œβ”€ gx-orm-connectioncontroller.html
β”‚ β”‚ β”œβ”€ gx-orm.html
β”‚ β”‚ β”œβ”€ gx.html
β”‚ β”‚ β”œβ”€ index.html
β”‚ β”‚ β”œβ”€ namespaces-orm.html
β”‚ β”‚ β”œβ”€ namespaces.html
β”‚ β”‚ β”œβ”€ qml-genesisx-app-biometrics-biometrics-members.html
β”‚ β”‚ β”œβ”€ qml-genesisx-app-biometrics-biometrics.html
β”‚ β”‚ β”œβ”€ qml-genesisx-app-permissions-permissions-members.html
β”‚ β”‚ β”œβ”€ qml-genesisx-app-permissions-permissions.html
β”‚ β”‚ β”œβ”€ qml-genesisx-notifications-notificationhandler-members.html
β”‚ β”‚ β”œβ”€ qml-genesisx-notifications-notificationhandler.html
β”‚ β”‚ └─ systeminfo-h.html
β”‚ β”œβ”€ style/
β”‚ β”‚ └─ genesisx-dark.css
β”‚ β”œβ”€ topics/
β”‚ β”‚ β”œβ”€ classes.qdoc
β”‚ β”‚ β”œβ”€ genesisx-core.qdoc
β”‚ β”‚ β”œβ”€ getting-started.qdoc
β”‚ β”‚ β”œβ”€ group_notifications.qdoc
β”‚ β”‚ β”œβ”€ guides.qdoc
β”‚ β”‚ β”œβ”€ gx-namespace.qdoc
β”‚ β”‚ β”œβ”€ gx-orm.qdoc
β”‚ β”‚ β”œβ”€ index.qdoc
β”‚ β”‚ └─ namespaces.qdoc
β”‚ β”œβ”€ .gitignore
β”‚ β”œβ”€ .qmake.stash
β”‚ β”œβ”€ docs.pro
β”‚ β”œβ”€ genesisx.qdocconf
β”‚ β”œβ”€ Makefile
β”‚ β”œβ”€ Makefile.Debug
β”‚ β”œβ”€ Makefile.Release
β”‚ └─ qt-includes.qdocconf.in
β”œβ”€ LICENSES/
β”‚ β”œβ”€ GPL-3.0-only.txt
β”‚ └─ LicenseRef-KooijmanInc-Commercial.txt
β”œβ”€ mkspecs/
β”‚ β”œβ”€ features/
β”‚ β”‚ β”œβ”€ conf/
β”‚ β”‚ β”‚ β”œβ”€ gx_core.prf
β”‚ β”‚ β”‚ β”œβ”€ gx_core_sub.prf
β”‚ β”‚ β”‚ β”œβ”€ gx_orm.prf
β”‚ β”‚ β”‚ └─ gx_physics.prf
β”‚ β”‚ β”œβ”€ genesisx_app_core.prf
β”‚ β”‚ β”œβ”€ gx_app_ab.prf
β”‚ β”‚ β”œβ”€ gx_app_analytics.prf
β”‚ β”‚ β”œβ”€ gx_app_audiorecorder.prf
β”‚ β”‚ β”œβ”€ gx_app_auth.prf
β”‚ β”‚ β”œβ”€ gx_app_background.prf
β”‚ β”‚ β”œβ”€ gx_app_billing.prf
β”‚ β”‚ β”œβ”€ gx_app_biometrics.prf
β”‚ β”‚ β”œβ”€ gx_app_calendar.prf
β”‚ β”‚ β”œβ”€ gx_app_camera.prf
β”‚ β”‚ β”œβ”€ gx_app_cast.prf
β”‚ β”‚ β”œβ”€ gx_app_clipboard.prf
β”‚ β”‚ β”œβ”€ gx_app_config.prf
β”‚ β”‚ β”œβ”€ gx_app_connectivity.prf
β”‚ β”‚ β”œβ”€ gx_app_contacts.prf
β”‚ β”‚ β”œβ”€ gx_app_crash.prf
β”‚ β”‚ β”œβ”€ gx_app_deeplinks.prf
β”‚ β”‚ β”œβ”€ gx_app_files.prf
β”‚ β”‚ β”œβ”€ gx_app_haptics.prf
β”‚ β”‚ β”œβ”€ gx_app_imagepicker.prf
β”‚ β”‚ β”œβ”€ gx_app_intents.prf
β”‚ β”‚ β”œβ”€ gx_app_location.prf
β”‚ β”‚ β”œβ”€ gx_app_logging.prf
β”‚ β”‚ β”œβ”€ gx_app_media.prf
β”‚ β”‚ β”œβ”€ gx_app_notifications.prf
β”‚ β”‚ β”œβ”€ gx_app_permissions.prf
β”‚ β”‚ β”œβ”€ gx_app_remoteconfig.prf
β”‚ β”‚ β”œβ”€ gx_app_review.prf
β”‚ β”‚ β”œβ”€ gx_app_root.prf
β”‚ β”‚ β”œβ”€ gx_app_securestore.prf
β”‚ β”‚ β”œβ”€ gx_app_sensors.prf
β”‚ β”‚ β”œβ”€ gx_app_share.prf
β”‚ β”‚ β”œβ”€ gx_app_updater.prf
β”‚ β”‚ └─ gx_runtime.prf
β”‚ └─ modules/
β”‚ β”œβ”€ qt_lib_genesisx.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_ab.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_analytics.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_audiorecorder.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_auth.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_background.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_billing.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_biometrics.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_calendar.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_camera.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_cast.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_clipboard.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_config.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_connectivity.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_contacts.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_core.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_crash.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_deeplinks.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_files.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_haptics.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_imagepicker.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_intents.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_location.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_logging.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_media.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_notifications.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_permissions.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_preferences.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_remoteconfig.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_review.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_securestore.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_sensors.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_share.pri
β”‚ β”œβ”€ qt_lib_genesisx_app_updater.pri
β”‚ β”œβ”€ qt_lib_genesisx_orm.pri
β”‚ └─ qt_lib_genesisx_physics.pri
β”œβ”€ orm/
β”‚ β”œβ”€ include/
β”‚ β”‚ └─ GenesisX/
β”‚ β”‚ └─ Orm/
β”‚ β”‚ β”œβ”€ AuthCredentials.h
β”‚ β”‚ β”œβ”€ Codegen.h
β”‚ β”‚ β”œβ”€ CommandController.h
β”‚ β”‚ β”œβ”€ ConfigIO.h
β”‚ β”‚ β”œβ”€ ConnectionCheck.h
β”‚ β”‚ β”œβ”€ ConnectionController.h
β”‚ β”‚ β”œβ”€ Controllers.h
β”‚ β”‚ β”œβ”€ DataAccess.h
β”‚ β”‚ β”œβ”€ genesisx_orm_global.h
β”‚ β”‚ β”œβ”€ HttpConfig.h
β”‚ β”‚ β”œβ”€ HttpResponse.h
β”‚ β”‚ β”œβ”€ Json.h
β”‚ β”‚ β”œβ”€ JsonAdapter.h
β”‚ β”‚ β”œβ”€ OrmQml.h
β”‚ β”‚ β”œβ”€ Repository.h
β”‚ β”‚ β”œβ”€ RepositoryOld.h
β”‚ β”‚ β”œβ”€ SqlConfig.h
β”‚ β”‚ └─ TransportConfig.h
β”‚ β”œβ”€ src/
β”‚ β”‚ β”œβ”€ core/
β”‚ β”‚ β”‚ β”œβ”€ CommandController.cpp
β”‚ β”‚ β”‚ β”œβ”€ CommandControllerQml.cpp
β”‚ β”‚ β”‚ β”œβ”€ CommandControllerQml.h
β”‚ β”‚ β”‚ β”œβ”€ ConfigIO.cpp
β”‚ β”‚ β”‚ β”œβ”€ ConnectionController.cpp
β”‚ β”‚ β”‚ β”œβ”€ Controllers.cpp
β”‚ β”‚ β”‚ β”œβ”€ HttpConnectionChecker.cpp
β”‚ β”‚ β”‚ β”œβ”€ HttpResponse.cpp
β”‚ β”‚ β”‚ └─ OrmQml.cpp
β”‚ β”‚ └─ tools/
β”‚ β”‚ └─ Codegen.cpp
β”‚ └─ orm.pro
β”œβ”€ physics/
β”‚ β”œβ”€ include/
β”‚ β”‚ └─ GenesisX/
β”‚ β”‚ β”œβ”€ vehicles/
β”‚ β”‚ β”‚ └─ vehicle4w.h
β”‚ β”‚ └─ genesisx_physics_global.h
β”‚ β”œβ”€ plugin/
β”‚ β”‚ β”œβ”€ physics_plugin.cpp
β”‚ β”‚ └─ physics_plugin.pro
β”‚ β”œβ”€ src/
β”‚ β”‚ └─ vehicles/
β”‚ β”‚ └─ vehicle4w.cpp
β”‚ β”œβ”€ physics.json
β”‚ └─ physics.pro
β”œβ”€ scripts/
β”‚ β”œβ”€ ci/
β”‚ β”‚ β”œβ”€ check-spdx-and-bom.bat
β”‚ β”‚ β”œβ”€ check-spdx-and-bom.ps1
β”‚ β”‚ └─ check-spdx-and-bom.sh
β”‚ β”œβ”€ packages/
β”‚ β”‚ β”œβ”€ firebase.bat
β”‚ β”‚ └─ firebase.sh
β”‚ β”œβ”€ add-headers.bat
β”‚ β”œβ”€ add-headers.ps1
β”‚ β”œβ”€ add-headers.sh
β”‚ β”œβ”€ bootstrap.bat
β”‚ β”œβ”€ bootstrap.sh
β”‚ β”œβ”€ cleanup-merged-branches.bat
β”‚ β”œβ”€ cleanup-merged-branches.ps1
β”‚ β”œβ”€ cleanup-merged-branches.sh
β”‚ β”œβ”€ collect-traffic.js
β”‚ β”œβ”€ fetch-gpl-license.bat
β”‚ β”œβ”€ fetch-gpl-license.ps1
β”‚ β”œβ”€ fetch-gpl-license.sh
β”‚ β”œβ”€ fix-bom.bat
β”‚ β”œβ”€ fix-bom.ps1
β”‚ β”œβ”€ install-prepush.bat
β”‚ β”œβ”€ install-prepush.sh
β”‚ β”œβ”€ release.bat
β”‚ └─ release.sh
β”œβ”€ tools/
β”‚ β”œβ”€ gxgen/
β”‚ β”‚ β”œβ”€ debug/
β”‚ β”‚ β”‚ β”œβ”€ config.json
β”‚ β”‚ β”‚ β”œβ”€ genesisx.dll
β”‚ β”‚ β”‚ β”œβ”€ genesisx_orm.dll
β”‚ β”‚ β”‚ β”œβ”€ gxgen.exe
β”‚ β”‚ β”‚ β”œβ”€ libgenesisx.a
β”‚ β”‚ β”‚ └─ libgenesisx_orm.a
β”‚ β”‚ β”œβ”€ .qmake.stash
β”‚ β”‚ β”œβ”€ gxgen.pro
β”‚ β”‚ β”œβ”€ main.cpp
β”‚ β”‚ β”œβ”€ Makefile
β”‚ β”‚ β”œβ”€ Makefile.Debug
β”‚ β”‚ └─ Makefile.Release
β”‚ β”œβ”€ qtcreator-snippets/
β”‚ β”‚ └─ snippets.xml
β”‚ β”œβ”€ qtcreator-wizard/
β”‚ β”‚ β”œβ”€ projects/
β”‚ β”‚ β”‚ β”œβ”€ GenesisXApiDatabase/
β”‚ β”‚ β”‚ β”‚ └─ templates/
β”‚ β”‚ β”‚ β”‚ └─ config.json.tmpl
β”‚ β”‚ β”‚ β”œβ”€ GenesisXApp/
β”‚ β”‚ β”‚ β”‚ β”œβ”€ templates/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ features/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ gx_app_root.prf.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ project-ui/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ android/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ AndroidManifest.xml.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ google-services.json.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ apple/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ ios/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ Entitlements.plist.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ Info.plist.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ macos/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ Entitlements.plist.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ Info.plist.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ GoogleService-Info.plist.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ assets/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ genesisx-xcore.svg
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ qmldir.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ Style.qml.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ qmldir.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ SplashWobble.qml.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ src/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ main.cpp.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ views/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ MasterView.qml.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ assets.qrc.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ components.qrc.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ icons.qrc.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ ui.pro.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─ views.qrc.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ .gitignore.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€ .qmake.conf.tmpl
β”‚ β”‚ β”‚ β”‚ β”‚ └─ project.pro
β”‚ β”‚ β”‚ β”‚ └─ wizard.json
β”‚ β”‚ β”‚ β”œβ”€ GenesisXPhysicsApp/
β”‚ β”‚ β”‚ β”‚ └─ wizard.json
β”‚ β”‚ β”‚ └─ genesisx-xcore.png
β”‚ β”‚ └─ install-wizard.bat
β”‚ └─ update_gradle_props.ps1.in
β”œβ”€ zdev/
β”‚ β”œβ”€ readyFordeletion/
β”‚ β”‚ β”œβ”€ ApiClient.cpp
β”‚ β”‚ └─ ApiClient.h
β”‚ └─ zdev.pro
β”œβ”€ .gitattributes
β”œβ”€ .gitignore
β”œβ”€ .gitlab-ci.yml
β”œβ”€ BACKERS.md
β”œβ”€ CODE_OF_CONDUCT.md
β”œβ”€ CONTRIBUTING.md
β”œβ”€ dev.pri
β”œβ”€ GenesisX.pro
β”œβ”€ GenesisX.pro.user
β”œβ”€ LICENSE
β”œβ”€ LICENSING.md
β”œβ”€ README.md
β”œβ”€ SECURITY.md
└─ SUPPORT.md
```

---

## Install / Setup

### 1) Clone
```bash
git clone Genesis-X
cd Genesis-X
```

### 2) Fetch 3rd‑party packages (Firebase)
**Windows (PowerShell/cmd):**
```bat
scripts\bootstrap.bat firebase
:: or:
scripts\bootstrap.bat all
```

**macOS / Linux:**
```bash
./scripts/bootstrap.sh firebase
# or:
./scripts/bootstrap.sh all
```

What it does:
- Downloads `firebase_cpp_sdk_13.1.0.zip`
- Verifies SHA‑256
- Unzips to `3rdparty/firebase_cpp_sdk/` (Git‑ignored)

---

## Integrate into Your App

> Goal: zero per‑app hardcoding of Firebase paths.

### A) App root: copy feature + `.qmake.conf`
Copy **`mkspecs/features`** from Genesis‑X into your **app root**, then create **`.qmake.conf`** in your app root:

```ini
# .qmake.conf (in your APP root)
load(gx_app_root)
QMAKEPATH += /Genesis-X
```

### B) App `.pro`: set Android package dir
```qmake
# Where Qt copies Android template files from:
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
```

### C) Link Genesis‑X modules in your app
```qmake
# Core
QT += genesisx

# Optional modules
QT += genesisx-physics
```

### D) (Soon optional, now mandatory) Clean output structure in your app
```qmake
# ---------- Build type ----------
CONFIG(debug, debug|release|profile) {
BUILD_PATH = debug
} else: CONFIG(profile, debug|release|profile) {
BUILD_PATH = profile
} else {
BUILD_PATH = release
}

DESTDIR = $$PWD/binaries/$$LOCAL_DESTINATION_PATH/$$BUILD_PATH
```

---

## How Android Path Resolution Works

**Problem:** Gradle needs absolute paths to Firebase C++ SDK.
**Solution:** Genesis‑X generates them for youβ€”no app changes needed.

1. `core/android-template/gradle.properties.in` contains tokens:
```properties
firebase_cpp_sdk_dir=$$FIREBASE_CPP_SDK_DIR
baseDir=$$FIREBASE_DEPENDENCIES_GRADLE
```
2. During **Run qmake**, the library computes:
- `$$FIREBASE_CPP_SDK_DIR` β†’ `/3rdparty/firebase_cpp_sdk`
- `$$FIREBASE_DEPENDENCIES_GRADLE` β†’ `<...>/Android/firebase_dependencies.gradle`
3. qmake writes the resolved file to the shadow build tree and the library build copies it back to:
```
core/android-template/gradle.properties
```
4. `qt_lib_genesisx.pri` copies `build.gradle` and the **generated** `gradle.properties` into your app’s `ANDROID_PACKAGE_SOURCE_DIR`.
Qt then copies those into `android-build/` and Gradle uses them.

> If you move Genesis‑X, simply **rebuild the library**; paths are refreshed automatically.

---

## Scripts Reference

### Bootstrap (downloads 3rd‑party deps)
- **Windows**
```bat
scripts\bootstrap.bat firebase
scripts\bootstrap.bat all
```
- **macOS / Linux**
```bash
./scripts/bootstrap.sh firebase
./scripts/bootstrap.sh all
```

### SPDX headers (dual license)
```bash
# macOS/Linux
./scripts/add-headers.sh
# Windows
scripts\add-headers.bat
```
Writes **UTF‑8 (no BOM)** and respects shebangs. Override with env vars:
`COPYRIGHT_OWNER`, `COPYRIGHT_YEAR`, `LICENSE_EXPR`.

### Fix UTF‑8 BOM (Windows/qmake)
```bat
scripts\fix-bom.bat
```

### Pre‑push protection (main/staging)
```bash
./install-prepush.sh
# Windows: install-prepush.bat
```
Blocks direct pushes to `main`/`staging`. One‑off override:
`ALLOW_PROTECTED_PUSH=1 git push …`.

### Fetch GPL text
```bash
scripts/fetch-gpl-license.sh
# or Windows:
scripts\fetch-gpl-license.ps1
```

---

## Governance & Policies

- **Contributing Guide:** [CONTRIBUTING.md](CONTRIBUTING.md)
- **Code of Conduct:** [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)
- **Security Policy:** [SECURITY.md](SECURITY.md)
- **Support:** [SUPPORT.md](SUPPORT.md)

---

## Licensing

Genesis‑X is **dual‑licensed**:
**(LicenseRef-KooijmanInc-Commercial OR GPL-3.0-only)**

See:
- `LICENSES/LicenseRef-KooijmanInc-Commercial.txt` (commercial terms)
- `LICENSES/GPL-3.0-only.txt` (GPL v3 only; use fetch script if placeholder)

All source files should include an SPDX header. See **LICENSING.md** for examples.

---

## Roadmap

- Linux notifications
- iOS/iPadOS/macOS notifications (APNs)
- Physics modules exposed to QML
- CI samples (bootstrap + Android matrix)

---

## Support

Open an issue/discussion and include:
- your app’s `ANDROID_PACKAGE_SOURCE_DIR`
- `core/android-template/gradle.properties` contents
- the Gradle error snippet