A JumpBundle is the universal AI deployment artifact for the JumpStation ecosystem. Every AI application that runs on a JumpStation device — from a keyword spotter on an Arduino UNO to a vision model on an Orion O9 — is packaged and deployed as a JumpBundle.
JumpBundles are produced by the JumpStation targeting suite (profiler → target selector → distillation → builder) and consumed by the runtime on any device in the catalog. The targeting suite ensures the bundle contains model weights at the correct precision for the declared target hardware; the runtime enforces compatibility at install and launch time.
A JumpBundle is a directory (or .jbundle zip archive) with the following layout:
my-model.jbundle/
├── manifest.json # Required: bundle metadata, model info, device requirements
├── model/
│ └── weights.tflite # Required (if AI bundle): optimized model weights
├── icon.png # Required for launcher-visible bundles
├── main.py # Required: entry point
├── assets/ # Optional: images, audio, fonts
└── data/ # Optional: read-only bundled data (labels, configs)
For microcontroller targets (Pico, UNO), the bundle is a firmware image + config rather than a Python package. The manifest format is identical; only the entry point and weights format differ.
The manifest is the heart of a JumpBundle. It is validated against core/jumpbundle/schema.json at build and install time.
{
"id": "com.zachtech.plant-classifier",
"name": "Plant Classifier",
"version": "1.0.0",
"author": "Zachtech",
"description": "MobileNetV3 INT8 plant species classifier. Targets Pico via TFLite Micro.",
"entry": "main.py",
"targets": ["pico"],
"requirements": {
"min_ram_kb": 192,
"storage_kb": 512,
"inference_backend": "tflite_micro"
},
"icon": "icon.png",
"category": "tool",
"model": {
"framework": "tflite_micro",
"precision": "int8",
"weights": "model/weights.tflite",
"input_shape": [1, 96, 96, 3],
"output_shape": [1, 50],
"flops": 15200000,
"peak_ram_kb": 148,
"latency_ms_turbo": 1.2,
"targeting_version": "0.1.0"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | Reverse-DNS unique identifier |
name |
string | Yes | Display name shown in launcher |
version |
string | Yes | Semantic version string |
author |
string | Yes | Publisher or individual name |
description |
string | No | Short description for launcher |
entry |
string | Yes | Entry point file, relative to bundle root |
targets |
array | Yes | Device class names this bundle supports |
requirements |
object | Yes | Hardware requirements (see below) |
icon |
string | Yes | Path to icon file within bundle |
category |
string | No | One of: game, tool, education, media, system |
rating |
string | No | Content rating: E, E10, T |
model |
object | No | AI model metadata. Present whenever the bundle contains ML inference. |
| Field | Type | Description |
|---|---|---|
min_ram_kb |
int | Minimum available RAM in kilobytes |
storage_kb |
int | Estimated storage footprint in kilobytes |
inference_backend |
string | Required backend: tflite, tflite_micro, onnx, dx_m1, orion_npu |
display.min_width |
int | Minimum display width in pixels (UI bundles only) |
display.min_height |
int | Minimum display height in pixels (UI bundles only) |
display.color |
bool | Whether a color display is required |
input |
array | Required input types: buttons, touch, keyboard, gamepad |
connectivity |
array | Optional: wifi, bluetooth, serial |
| Field | Type | Description |
|---|---|---|
framework |
string | Inference framework: tflite, tflite_micro, onnx, pytorch_mobile, dx_m1, orion_npu |
precision |
string | Weight precision: fp32, fp16, int8, int4 |
weights |
string | Path to weights file, relative to bundle root |
input_shape |
array | Input tensor shape (integers; -1 for dynamic) |
output_shape |
array | Output tensor shape |
flops |
int | Approximate FLOPs per inference, measured by the JumpStation profiler |
peak_ram_kb |
int | Peak RAM during inference in KB, measured by the profiler |
latency_ms_turbo |
float | Measured inference latency on Turbo DX-M1 in ms |
targeting_version |
string | Version of the JumpStation targeting suite that produced this bundle |
The canonical workflow is to produce a JumpBundle through the targeting suite:
# 1. Profile the model and select a target
python core/targeting/profiler.py --model ./my_model.onnx --output ./profile.json
python core/targeting/target_selector.py --profile ./profile.json
# -> outputs: target = "pico", recommended precision = "int8"
# 2. Distill and quantize for the selected target
python core/distillation/quantizer.py --model ./my_model.onnx --target pico --output ./model/weights.tflite
# 3. Package the bundle
python core/jumpbundle/builder.py --source ./my-app --output ./dist/my-app.jbundle
The builder will:
manifest.json against the schema (including model field if present)model.weights exists at the declared path--process-assets is passed.jbundle archive (zip with manifest at root)JumpBundles are installed to the device via:
bundles/ directory on device storageThe launcher scans the bundles/ directory at boot and re-validates all manifests. Invalid or incompatible bundles are flagged but not removed automatically.
A bundle is considered compatible with a target device if:
targetsrequirements fields are satisfied by the device profileThe runtime will refuse to launch an incompatible bundle and surface an error in the launcher.