Skip to content

Package & Distribution

FormatContentsWhen to use
Single JSON fileOne root module JSON file.Simple screens, backend-generated payloads, API-delivered updates.
Zip packageJSON file(s) + localization/*.strings + assets/ folder + optional sub-module *.json files.Feature packages with custom localization, bundled images, or multi-screen units.
my_feature.zip
├── main.json ← root module
├── login.json ← sub-module loaded via file://login.json
├── bubble.json ← component loaded via file://bubble.json
├── localization/
│ └── en.strings ← "key" = "value"; format
└── assets/
└── logo.png ← loaded via file://assets/logo.png

ℹ Note: Source string resolution order inside a package: package resources first, then host app resources. This lets a package override app-level assets and localization strings.

"welcome_title" = "Welcome Back";
"close_button" = "Close";
// In StemJSON - direct in _text:
"_text": "l10n://welcome_title"
// In an expression:
"_text": "{{ localize('welcome_title', 'Welcome Back') }}"