Every directory in an application repository that should be discovered, built
and packaged contains one app-builder.json at its root. The file plays two
roles:
- Packaging — feeds the CI
.debpipeline (existing behaviour). - Desktop dev loop — tells
czdevhow to build and run the app inside the emulator (new fields, optional).
Fields added for the desktop loop are all optional; a file that only contains the packaging fields keeps working exactly as before.
| Field | Required | Type | Default | Used by |
|---|---|---|---|---|
package_name |
yes | string | — | deb, czdev |
version |
no | string | "0.1" |
deb |
app_name |
no | string | same as package_name |
deb, czdev |
bin_name |
yes | string | — | deb, czdev |
description |
no | string | "" |
deb |
runtime |
no | "lvgl-dlopen" | "legacy-deb-only" |
"lvgl-dlopen" |
czdev |
entry |
no | string | "app_main" |
czdev, emulator |
event_entry |
no | string | "app_event" |
czdev, emulator |
lvgl_version |
no | string | "9.5" |
czdev (refuses mismatch) |
caps |
no | string[] | [] |
czdev (future: sandboxing) |
assets |
no | string[] | [] |
czdev (stage next to lib) |
lvgl-dlopen— the app is a shared library that exports theentryand optionalevent_entrysymbols described incz_app.h.czdev runloads it into the emulator viadlopen/LoadLibrary. This is the default for new apps.legacy-deb-only— the project is a standalone executable (Framebuffer, SDL, Qt, Python, …).czdevskips it duringrun; the CI.debpipeline still produces a package. Use this for examples inCardputerZero-Examples/that are not LVGL.
Apps that omit runtime are treated as lvgl-dlopen iff they export
app_main; otherwise czdev prints a clear error and suggests setting
"runtime": "legacy-deb-only".
Reserved vocabulary (enforcement comes later):
| Cap | Means |
|---|---|
keyboard |
Uses the 44-key physical keyboard / emulator skin |
audio |
Plays audio via ALSA on device, SDL_mixer in emulator |
network |
Reads hostname / IP / Wi-Fi state |
filesystem |
Writes into /usr/share/APPLaunch or the emu sandbox |
pty |
Spawns a PTY (terminal-style apps) |
process |
fork/exec of sub-processes |
Today caps is metadata only; a future milestone uses it to decide which
HAL shims the emulator pre-loads.
{ // ── Packaging (existing) ───────────────────────────────────────── "package_name": "hello_cz", // Debian package name (lowercase, dash) "version": "0.1", // SemVer-ish; goes into control file "app_name": "Hello CZ", // Display name in APPLaunch "bin_name": "hello_cz", // Shared-object basename (no lib prefix) "description": "Desktop dev hello app", // ── Desktop dev (new, all optional) ────────────────────────────── "runtime": "lvgl-dlopen", // "lvgl-dlopen" (default) | "legacy-deb-only" "entry": "app_main", // C symbol name, default "app_main" "event_entry": "app_event", // optional, default "app_event" "lvgl_version": "9.5", // host must match on major.minor "caps": [ // capabilities the app declares it uses "keyboard", "audio", "network" ], "assets": [ // paths relative to app dir; copied next "assets/fonts/", // to the built library under its app dir "assets/sprites/" ] }