{"id":26932669,"url":"https://github.com/asivery/rm-appload","last_synced_at":"2026-05-08T04:22:55.399Z","repository":{"id":270165714,"uuid":"909517437","full_name":"asivery/rm-appload","owner":"asivery","description":"A XOVI extension for the rM tablets, which makes it possible to write windowed and fullscreen apps","archived":false,"fork":false,"pushed_at":"2026-03-29T17:01:07.000Z","size":2359,"stargazers_count":69,"open_issues_count":6,"forks_count":18,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-03-29T19:25:58.027Z","etag":null,"topics":["qml","remarkable-tablet"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/asivery.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-12-29T00:02:27.000Z","updated_at":"2026-03-29T17:14:51.000Z","dependencies_parsed_at":null,"dependency_job_id":"6ddf0037-7632-4a55-ba4c-3b90ae15a564","html_url":"https://github.com/asivery/rm-appload","commit_stats":null,"previous_names":["asivery/rmpp-appload","asivery/rm-appload"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/asivery/rm-appload","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asivery%2Frm-appload","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asivery%2Frm-appload/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asivery%2Frm-appload/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asivery%2Frm-appload/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/asivery","download_url":"https://codeload.github.com/asivery/rm-appload/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asivery%2Frm-appload/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31978899,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T17:30:12.329Z","status":"ssl_error","status_checked_at":"2026-04-18T17:29:59.069Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["qml","remarkable-tablet"],"created_at":"2025-04-02T08:27:32.555Z","updated_at":"2026-04-18T18:09:37.861Z","avatar_url":"https://github.com/asivery.png","language":"C++","funding_links":[],"categories":["C++","Interface Customization"],"sub_categories":["Template Builders"],"readme":"\u003cimg align=\"left\" width=\"80\" height=\"80\" src=\"https://raw.githubusercontent.com/asivery/rmpp-appload/refs/heads/master/resources/icons/appload.svg\" alt=\"app icon\"\u003e\n\n# AppLoad\n\nAppLoad is a xovi extension for the RMPP which lets you write custom applications for the RMPP.\n\n## Dependencies\n\nThis extension depends on [qt-resource-rebuilder](https://github.com/asivery/rmpp-xovi-extensions/tree/master/qt-resource-rebuilder).\n\n## How to use?\n\nTo put new apps on the tablet, place their directories in `/home/root/xovi/exthome/appload/`. To close fullscreen apps, drag your finger from the center-top of the screen to the center.\nTo start an application as a window, long-press its icon in the AppLoad menu.\n\n## Applications' format\n\nApplications' frontend need to be written in QML.\nBackends are optional. They can be written in any language, but need to follow the AppLoad protocol and invocation rules. Backends are started with argv[1] being set to a temporary unix socket created by AppLoad.\nAn example client is provided in the `backend-clients` directory.\n\nI have provided a frontend-only and a backend-loading example application in the `examples` directory.\n\nEvery application needs to be stored in a separate directory. The name of the directory does not matter.\n\nThe application directory structure is as follows:\n\n```\napplication\n|\n|-\u003e manifest.json\n|\n|-\u003e icon.png\n|\n|-\u003e resources.rcc\n|\n|-\u003e backend (if loaded)\n     |\n     |-\u003e entry (binary, executable file)\n```\n\nThe root QML file needs to have the following values:\n\n```qml\nsignal close\nfunction unloading() {\n    ...\n}\n```\n\nTo communicate with backends, in QML, import `net.asivery.AppLoad 1.0`, then define the AppLoad entrypoint:\n\n```qml\nAppLoad {\n    id: endpoint\n    applicationID: \"\u003capplication id from the manifest\u003e\"\n\n    onMessageReceived: (type, contents) =\u003e {\n        \u003chandle the message\u003e\n    }\n}\n```\n\nTo send a message to the backend, invoke `endpoint.sendMesssage(type, contents)`.\n\nThe manifest file has the following properties:\n\n- id: The internal ID of a given application. It needs to be unique.\n- name: The name it's going to show up as in the launcher\n- loadsBackend: Whether or not the application needs the backend to run\n- entry: The path to the entry point of the frontend (the root QML file)\n- canHaveMultipleFrontends: Whether or not there can be multiple frontends loaded at the same time\n- supportsScaling: Whether or not the application supports arbitrary window sizes\n\nApplications' backends have the ability to stay running in the background, and unless killed by the app, won't be stopped. To stop an application permanently, in the `unloading()` function in the root file, invoke `terminate()` on any of the endpoints. That call will kill the backend and immediately unload any still existing frontends.\n\n## Writing applications\n\nThe simplest way to write AppLoad applications is to use the inbuilt PC emulator. To load an application, place it in the `applications_root` folder. \n\n## External applications\n\nAppLoad also supports starting external applications. To do that, create an application directory with the following contents:\n\n```\napplication\n|\n|-\u003e external.manifest.json (explained below)\n|\n|-\u003e icon.png\n|\n|-\u003e \u003cother app-dependent files\u003e\n```\n\nThe `external.manifest.json` file has the following properties:\n\n- name: The name it's going to show up as in the launcher (required)\n- application: The executable's path (either absolute or relative to the app directory) (required)\n- workingDirectory: Self explanatory\n- environment: A dictionary of key-value string pairs of the process' environment variables\n- args: A list of strings - the arguments that will be passed to the executable\n- qtfb: Boolean - whether or not to allocate a QTFB framebuffer for the application. The framebuffer's ID will be passed as the envvar `QTFB_KEY` to the application\n- aspectRatio: 'auto' (default) | 'original' | 'move' - defines the type of screen the application is built for. Original - rM1 / rM2 / rMPP, move - rMPPM\n- disablesWindowedMode: Boolean - set to true to disable windowed mode for this particular application\n\n## Launching applications programmatically\n\nAppLoad makes it possible to launch applications programmatically. To do so, use the `AppLoadLauncher.launchApplication` method.\n\n\u003e [!NOTE]\n\u003e Extra envvars and arguments are only passed to external applications.\n\n\u003e [!NOTE]\n\u003e External applications' IDs follow the format `external::\u003cname of directory\u003e`\n\nExample:\n\n```qml\nimport net.asivery.AppLoad 1.0\n\nfunction startMyApp() {\n    const isWindowed = true;\n    AppLoadLauncher.launchApplication(id, [\"extra\", \"arguments\"], { extra: \"environment variables\" }, isWindowed);\n}\n```\n\n## Compiling AppLoad\n\n[xovi-repo]: https://github.com/asivery/xovi\n\nBefore you can compile AppLoad, you need to checkout the [XOVI repository][xovi-repo] and set the `XOVI_REPO` environment variable to the repo's location.\n\nTo compile AppLoad for on-PC testing, run `qmake6 .`, then `make` in the root of this repository. To build a xovi version, go into `xovi` and run `make.sh`.\n\nAlternatively, if you don't want to build, you can download the [latest release](https://github.com/asivery/rmpp-appload/releases/latest).  \n\n## Happy Hacking!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasivery%2Frm-appload","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasivery%2Frm-appload","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasivery%2Frm-appload/lists"}