There are two types of DAC App packages - also known as a BOLT package - on in the RDK ecosystem:

  • Web Applications
  • Native Applications


Web Application

To build a web application package, you will need the following:

  • Bolt Tools
  • App package configuration
  • Certificates for signing the app bundle

1. Bolt Tools

Install and set up bolt-tools on your system by following the instructions in the repository:

bolt-tools

Bolt Tools provides the utilities required to package and sign your applications.



2. App Package Configuration

The app package configuration defines the entry point, dependencies, permissions, and other metadata required for building the BOLT package.

2.1 Key Fields:

  • Entry Point
    For a web application, the entry point should be the URL that the WPE WebKit browser should load.
    Example: "--url=https://lightningjs.io/tmdb/#splash"

  • Dependencies:
    Specify the runtime and base packages your app depends on.
    For web apps, you must include the WPE browser package and its appropriate version.
    Example: "com.rdkcentral.wpe-rdk": "0.1.0"
    

  • Permissions:
    Permissions required by the container, such as:
    • internet
    • thunder
    • firebolt
    • rialto

Sample App Configuration (JSON)

{
  "id": "com.rdkcentral.appName",
  "version": "0.1.0",
  "versionName": "develop",
  "name": "tmdb",
  "packageType": "application",
  "entryPoint": "--url=https://lightningjs.io/tmdb/#splash",
  "dependencies": {
    "com.rdkcentral.wpe-rdk": "0.1.0"
  },
  "permissions": [
    "urn:rdk:permission:internet",
    "urn:rdk:permission:firebolt",
    "urn:rdk:permission:thunder",
    "urn:rdk:permission:rialto"
  ],
  "configuration": {}
}


3. Creating the Package

To package an HTML/Lightning app into a DAC App bundle, you need:

  1. A JSON configuration file (com.rdkcentral.app_name.json)
  2. A rootfs layer in .tgz format

For HTML/Lightning applications, the rootfs layer can be an empty .tgz file, since the app is launched via a browser using a URL.

Steps

  1. Create an empty .tgz file, e.g.:
    empty.tgz
    
  2. Create your App Package configuration JSON file.
  3. Run the command:
    bolt pack com.rdkcentral.app_name.json empty.tgz
    
  4. The command will generate:
    com.rdkcentral.app_name+<version>.bolt
    
    This is the Bolt package to be installed on the platform.


Native Applications

A native application package( also known as BOLT package ) is a self-contained, application packaged as `.bolt` . Each application is maintained in its own Yocto meta-layer repository and follows a shared set of conventions across all such projects. This page describes the process for creating and building native app packages within the RDK ecosystem. The meta-bolt-youtube repository serves as the canonical reference implementation throughout this article.

The overall workflow is:

  1. Create a new application repository following the standard naming and layout.
  2. Declare all build-time dependencies in manifests/deps.xml.
  3. Add or reuse Yocto image recipes and native app recipes.
  4. Define package configs that instruct the Bolt tool how to assemble the final package.
  5. Source the build environment and run the Bolt make command.


See also: meta-bolt-distro | bolt-tools

1. Repository Setup

Naming Convention

All RDK application repositories follow this naming pattern:

meta-bolt-<app_name>

Examples:

  • meta-bolt-youtube
  • meta-bolt-amazon-prime
  • meta-bolt-myapplication

Repository Structure

A new meta-bolt repository is expected to contain the following top-level layout:

    meta-bolt-<app_name>/
    ├── README.md
    ├── CONTRIBUTING.md
    ├── LICENSE
    ├── COPYING
    ├── CHANGELOG.md
    ├── NOTICE
    ├── manifests/          # dependency declarations (see Section 3)
    ├── package-configs/    # Bolt package configuration JSON files (see Section 6)
    ├── recipes-core/       # image recipes (see Section 4)
    ├── recipes-devtools/   # host-tool recipes
    ├── recipes-extended/   # native app recipes and bbappend files (see Section 5)
    ├── conf/               # Yocto layer configuration
    └── setup-environment   # reusable environment setup script (see Section 7)

Note

The conf/layer.conf file is critical for layer discovery and recipe resolution.
At minimum, verify the following:

  • BBPATH includes this layer path so BitBake can locate classes and metadata.
  • BBLAYERS (typically managed from bblayers.conf) includes all dependent layers declared in manifests/deps.xml.
  • BBFILES patterns include your local recipe trees (recipes-core, recipes-devtools, recipes-extended) so .bb and .bbappend files are discovered.
  • BBFILE_COLLECTIONS, BBFILE_PATTERN_<layer>, and BBFILE_PRIORITY_<layer> are set correctly for your layer identity and precedence.
  • LAYERSERIES_COMPAT_<layer> is aligned with the Yocto release used by your distro.

If your team uses the term "BBTPath", treat it as the layer search path concept and align it with standard Yocto BBPATH/BBLAYERS configuration.

Also confirm package-config consistency:

  • package-configs/<app_name>.bolt.json exists and target name matches "bolt make <app_name>".
  • package-configs/com.rdkcentral.<app_name>.json exists and references correct runtime deps.

Reference:


2. Dependency Management

manifests Folder

The manifests folder is the central location for declaring all components that the build system must fetch and integrate before building the native application.

deps.xml Format

The deps.xml file inside the manifests folder acts as a dependency resolver for the application build. It declares:

  • Required repositories and their remote locations
  • Branch names or commit references to pin versions
  • Build-time dependency relationships between components

Typical entries in deps.xml cover:

  • The base Bolt distro layer
  • Core runtime components
  • Application-specific libraries
  • Development tool layers

Reference: deps.xml

3. Bolt Image Recipe

Purpose

An image recipe is a BitBake (.bb) file placed under recipes-core/images/. It defines the full contents of the root filesystem that will be assembled into the final Bolt package, including which packages, binaries, libraries, and supporting components are installed.

What to Include

The image recipe should declare all runtime dependencies of the native application so that the resulting Bolt package is complete and self-contained.

The following image recipes in meta-bolt-youtube can be used as templates:

4. Native Application Recipes

Native application recipes are BitBake recipes that build the application binaries and libraries included in the final package. They can be sourced in one of two ways:

Reuse from Dependent Layers

If an existing recipe for the native application already exists in one of the meta-layers declared in manifests/deps.xml, that recipe can be consumed directly without duplication.

Adding New Recipes

When a suitable recipe does not exist upstream, new .bb recipe files or .bbappend overlay files can be added under the local recipes-extended tree:

recipes-extended/<app_or_component>/

Keeping customisations in recipes-extended isolates them from upstream changes and makes future maintenance easier.

5. Package Configuration

The package-configs directory holds JSON configuration files that the Bolt tool reads to determine how to build a target image and assemble the final Bolt package.

There are two distinct config file types for each application:

<app_name>.bolt.json

This file is the primary Bolt build configuration. It instructs the Bolt tool on:

  • Which Yocto image target to build
  • Which metadata files to include in the final Bolt package

Reference examples in meta-bolt-youtube:

com.rdkcentral.<app_name>.json

This file contains the native application package metadata that is shipped inside the Bolt package. At runtime, the on-device application management service reads this file to determine:

  • Which dependent Bolt packages (such as base and runtime) must be mounted before launch
  • Which environment variables and configuration must be exported into the app container.
  • How the application is to be started within the Bolt runtime model.

Reference examples in meta-bolt-youtube:

Info

More information on Package Metadata can be found here: oci-package-spec

6. Setup Environment

The setup-environment and repo-sync scripts provided in meta-bolt-youtube are intentionally generic and designed to be reused in new DAC application repositories with little to no modification.

To adapt them for a new repository:

  1. Copy setup-environment and repo-sync into the root of the new meta-bolt-<app_name> repository.
  2. Ensure the dependency layout declared in manifests/deps.xml aligns with any path assumptions made by the scripts.
  3. Apply only minimal repo-specific changes where required, such as updating default repository names or local build directory paths.

Reusing these scripts keeps the bootstrap and workspace initialization process consistent across all native Bolt application projects.

Build Commands:

Prerequisite:

To build an application that depends on base/runtime Bolt packages (for example, com.rdkcentral.base+<version>.bolt), ensure those dependent packages are available first. Either build them separately or place the corresponding .bolt artifacts in the following location before running the build:

  build/bolts/


source setup-environment
mkdir bolts/ # inside your build folder
cp <copy your dependent bolt package for eg. base.bolt> bolts/
bitbake bolt-env && hash bolt #build bolt tools for your build setup
bolt make <app_name>

The bolt make command reads the corresponding <app_name>.bolt.json config, triggers the Yocto image build for the declared target, and packages all required content into the final Bolt package.

References



Running your applications:

1. Signing Your App

Every DAC app must be digitally signed before installation.

Follow the signing instructions here: App package - signing and verification


2. Sideloading the App to the Platform

Note:

The public certificate must be located at/etc/rdk/certs/ in the platform


  1. Copy/SCP the .bolt package to the device, for example:
    /tmp/com.rdkcentral.app_name+0.1.0.bolt
  2. Install the app using the PackageManager.
    curl -X POST http://127.0.0.1:9998/jsonrpc -d '{"jsonrpc":2.0,"id":1,"method":"org.rdk.PackageManagerRDKEMS.install","params":{"packageId":"com.rdkcentral.app_name+0.1.0.bolt","version":"0.1.0","fileLocator":"/tmp/com.rdkcentral.app_name+0.1.0.bolt"}}' -H "Content-Type: application/json"
  3. Launch the app using the Application Manager.
    curl -s -X POST http://127.0.0.1:9998/jsonrpc -d '{"jsonrpc": "2.0","id": 1013, "method": "org.rdk.AppManager.1.launchApp", "params":{"appId":"com.rdkcentral.app_name"}}'



  • No labels

1 Comment

  1. Arun P Madhavan

    Hi Team,

    Getting error while following the steps mentioned.

    I'm trying to create a webapp with url from internet.

    Also; it would be helpful if there is a reference linked which details `permissions`. Not sure what all I need to give.


    This is the error I'm getting:
    Clonned bolt-tools and went inside where the binary is present.

    Do I need to install ralfpack ? How to build ralfpack (in its readme).

    d35@d35:~/bolt-app/bolt-tools/bolt/bin$ cat com.rdkcentral.keycode-info.json 
    {
      "id": "com.rdkcentral.keycodeinfo",
      "version": "0.0.1",
      "versionName": "develop",
      "name": "KeyCode Info WebApp",
      "packageType": "application",
      "entryPoint": "--url=https://lightningjs.io/tmdb/#splash",
      "dependencies": {
        "com.rdkcentral.wpe-develop": "0.0.1"
      },
      "permissions": [
        "urn:rdk:permission.internet",
        "urn:rdk:permission:firebolt",
        "urn:rdk:permission:thunder",
        "urn:rdk:permission:game-controller",
        "urn:rdk:permission:display-overlay",
        "urn:rdk:permission:compositor"
      ],
      "configuration": {
      }
    }
    d35@d35:~/bolt-app/bolt-tools/bolt/bin$ bolt pack com.rdkcentral.keycode-info.json empty.tgz 
    node:internal/errors:985
      const err = new Error(message);
                  ^

    Error: Command failed: ralfpack create --config com.rdkcentral.keycode-info.json --content empty.tgz --image-format erofs.lz4 com.rdkcentral.keycodeinfo+0.0.1.bolt
    [E] Error: Failed to create content from archive: Unknown archive format

        at genericNodeError (node:internal/errors:985:15)
        at wrappedFn (node:internal/errors:539:14)
        at checkExecSyncError (node:child_process:925:11)
        at execSync (node:child_process:997:15)
        at execNoOutput (/home/d35/Desktop/bolt-tools/bolt/src/utils.cjs:29:20)
        at exec (/home/d35/Desktop/bolt-tools/bolt/src/utils.cjs:54:18)
        at Object.pack [as handler] (/home/d35/Desktop/bolt-tools/bolt/src/pack.cjs:45:5)
        at Object.<anonymous> (/home/d35/Desktop/bolt-tools/bolt/src/bolt.cjs:100:11)
        at Module._compile (node:internal/modules/cjs/loader:1761:14)
        at Object..js (node:internal/modules/cjs/loader:1893:10) {
      status: 1,
      signal: null,
      output: [
        null,
        '',
        '[E] Error: Failed to create content from archive: Unknown archive format\n'
      ],
      pid: 11124,
      stdout: '',
      stderr: '[E] Error: Failed to create content from archive: Unknown archive format\n'
    }

    Node.js v24.11.1