---
title: JS apps
slug: bar/dev/js-apps
image: https://cdn.images.archbee.com/3StCFqarJkJQZV-7N79yY/K1X_qOmHp6PEqgG1Z86US_busy-docs-prev.jpg
createdAt: 2026-10-23T13:33:41.838Z
---

![](https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/NxKuobwnaVovfuIUzfUZ1_about-js-final.png)

JS apps are small JavaScript programs that run on BUSY Bar itself. They draw on the screens, react to the buttons and scroll wheel, and fetch data from the internet — no computer needed once they’re installed.

On this page:

- [Try built-in JS apps%section%](docId\:l3BQPzkdGkWmsZM5LY7xb)
- [Types of apps you can build%section%](docId\:l3BQPzkdGkWmsZM5LY7xb)
- [Create an app and run it on BUSY Bar%section%](docId\:l3BQPzkdGkWmsZM5LY7xb)
- [How JS apps work%section%](docId\:l3BQPzkdGkWmsZM5LY7xb)
- [Tools for building JS apps%section%](docId\:l3BQPzkdGkWmsZM5LY7xb)
- [Where to get apps and how to share them%section%](docId\:l3BQPzkdGkWmsZM5LY7xb)
- [Learn more%section%](docId\:l3BQPzkdGkWmsZM5LY7xb)

***

## Try built-in JS apps

Starting with firmware 1.3.1, the built-in **[Clock](https://docs.busy.app/bar/apps-and-integrations/clock)** and **[Weather](https://docs.busy.app/bar/apps-and-integrations/weather)** apps are JS apps. Try them to see what a JS app can do. You can start the apps right on BUSY Bar or from its web interface:

::::::Tabs
:::::Tab{title="BUSY Bar"}
::::WorkflowBlock
:::WorkflowBlockItem
Switch the :inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/kBlpLStuBhGmON3SCi0uz-20260316-105319.png" alt caption width="96" height="96"} **mode selector** to :inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/M6Io6N1BMSKTHyrniD6_Q_apps-icon-bar.png" alt caption width="96" height="96"}**Apps**.
:::

:::WorkflowBlockItem
Go to **Weather** or **Clock**.
:::

:::WorkflowBlockItem
Select **Start**. The app will start on your BUSY Bar.
:::
::::

To quit the app:

- Press :inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/acizC_ktW4Oi3wrSX9lwA-20260316-105319.png" alt caption width="80" height="96"} **Back** twice or switch the :inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/kBlpLStuBhGmON3SCi0uz-20260316-105319.png" alt caption width="96" height="96"} **mode selector**.
:::::

:::::Tab{title="Web interface"}
::::WorkflowBlock
:::WorkflowBlockItem
Connect BUSY Bar to PC via USB, and go to [http://10.0.4.20](http://10.0.4.20)

Or [access the web interface via Wi-Fi.](docId\:v_izwbs0I2kIljDxY_Kkp)
:::

:::WorkflowBlockItem
Go to the :inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/b8OHfntQ5OT2XNeY_Pkid_apps-icon-web-interface.png" alt caption width="96" height="96"}**Apps** tab&#x20;
:::

:::WorkflowBlockItem
Click **Weather** or **Clock**.
:::

:::WorkflowBlockItem
Click **Start**.
:::
::::

To quit the app:

- Click **Stop**.
:::::
::::::



The built-in apps are open source:

::::LinkArray{contentSource="CUSTOM" itemsPerRow="2"}
:::LinkArrayItem{headerType="IMAGE" headerImage="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/W-bSVf4U6CssFG8eI0cMd_clock-link-grid-bold-new.png"}
**[Clock on GitHub](https://github.com/busy-app/clock-app)**

Shows time and date on both screens of your BUSY Bar
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/vX9ekBMkYdgl008LIZE9C_weather-link-grid-bold-new.png"}
**[Weather on GitHub](https://github.com/busy-app/weather-app)**

Shows the current weather and a forecast
:::
::::

***

## Types of apps you can build

JS apps can show live data from the web, keep time, respond to buttons, and send alerts. Here’s what each type relies on and what you can build with it.

### Live data

::Image[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/TNexe0VFrEVBiO9bGRynU_bitcoin-screen.jpg" size="80" isUploading="false" position="center" width="1803" height="615" darkWidth="1803" darkHeight="615" showCaption="false"}

If a web service has an API, BUSY Bar can show its data. Apps call services over HTTP or HTTPS when connected to Wi-Fi and refresh the data at regular intervals. <u>*For example:*</u> exchange rates, build status, or the next bus.

### Clocks and timers

::Image[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/FoO43UySefdDfCqXHm6Ey_clock-screen.jpg" size="80" isUploading="false" position="center" width="1803" height="615" darkWidth="1803" darkHeight="615" showCaption="false"}

Apps get the current time from BUSY Bar. A countdown element updates on screen by itself, so the app doesn’t need to redraw it every second. <u>*For example:*</u> a world clock, days until a launch, or a meeting timer.

### Interactive tools and games

::Image[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/80RnAex5ejWApC8HQZD6t_game-screen.jpg" size="80" isUploading="false" position="center" width="1803" height="615" darkWidth="1803" darkHeight="615" showCaption="false"}

Apps respond to the :inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/nsAwZD5PgLJbX9tOp0m-D-20260316-105319.png" alt caption width="96" height="96"} **scroll wheel** and the :inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/xlWSbh7j8KDYqS-b2YSDD-20260316-105319.png" alt caption width="96" height="96"}**OK**, :inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/9cerr6S5jJu3AvWCAOTer-20260316-105319.png" alt caption width="128" height="96"}**Start / Pause**, and :inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/acizC_ktW4Oi3wrSX9lwA-20260316-105319.png" alt caption width="80" height="96"}**Back** buttons directly on the device, with no need to use a computer. <u>*For example:*</u> a counter, a menu of shortcuts, a quiz, a reaction game.

### Status and alerts

::Image[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/Da8hLcjFSGg2Cpx5zNj4g_rendering-screen.jpg" size="80" isUploading="false" position="center" width="1803" height="615" darkWidth="1803" darkHeight="615" showCaption="false"}

Beyond the front screen, apps can show messages on the back screen, play sounds, and read or control the BUSY timer. <u>*For example:*</u> a sign on the back screen for people around you, a sound when a delivery arrives.

***

## Create an app and run it on BUSY Bar

Follow these steps:

::::WorkflowBlock
:::WorkflowBlockItem
**[Install Node.js](https://nodejs.org/en/download)** `v24.XX.X` for your operating system, using `nvm` with `npm`.
:::

:::WorkflowBlockItem
**Connect the BUSY Bar** to your computer via USB.
:::

:::WorkflowBlockItem
**Create an app template** with one command in the terminal:

```bash
npm create @busy-app/app my-app
```
:::

:::WorkflowBlockItem
**Build, install, and run the app** on BUSY Bar with:

```bash
cd my-app
npm run build && npm run app:install && npm run app:run
```

BUSY Bar shows “Hello” and a number that grows every second:

::Image[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/kChSDuwDNOA67GDrmCIrn_create-app-1.jpg" size="70" isUploading="false" position="center" width="1803" height="549" darkWidth="1803" darkHeight="549" showCaption="false"}
:::

:::WorkflowBlockItem
**Point your AI coding agent to the my-app folder** and explain how you want to modify the JS app. The folder already has the `AGENTS.md` file with instructions for AI.
:::
::::

Learn how to create JS apps for BUSY Bar without coding in **[Create apps with AI](docId\:IjsbhMRWaG6dOYDkLlA9u)**.

If you don't want to use AI, you can manually modify the app's code, add settings and icons. To learn more about how to create apps, visit [Build a JS app](docId:68xNbWmB5YW2ohmzMjEuA).

***

## How JS apps work

BUSY Bar runs JS apps with the [JerryScript](https://jerryscript.net/) engine. To show text or images, or to play sounds, JS apps send HTTP API requests to the HTTP server on BUSY Bar. This is the same server that handles external HTTP API requests as described on the [HTTP API](docId\:H4whpEXTNlYjSR9PlxsAr) page.

### Built-in functions

Also, the JS apps can use these built-in functions to interact with BUSY Bar:

| **Function**                | **What is does**                                                                                                                                                                                                                                                                        |
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `fetch`                     | Sends requests to the [HTTP API](https://docs.busy.app/bar/dev/http-api) at `http://localhost` to draw on the screens, play sounds, and read the app’s settings. These requests stay on the device, so no API token is needed. With Wi-Fi, `fetch` can also get data from web services. |
| `listen`                    | Reacts to the buttons and the scroll wheel.                                                                                                                                                                                                                                             |
| `setTimeout`, `setInterval` | Run code later or on repeat.                                                                                                                                                                                                                                                            |
| `localStorage`              | Keeps data between app launches.                                                                                                                                                                                                                                                        |
| `console.log` and similar   | Write messages to the log.                                                                                                                                                                                                                                                              |

### App settings

Apps can have settings that are defined in `settings.json`, and BUSY Bar creates the settings screen automatically. Apps can read their settings but can’t change them. Some settings, such as colors and locations, can only be changed in the web interface.

### Limitations

Keep these in mind when creating an app:

- Only one app can run at a time.
- An app file (`.tgz`) can be up to 104 MB.
- Apps draw with display elements: text, images, animations, countdowns, rectangles, and bitmaps.
- An app can’t change its settings — only the user can change them, on BUSY Bar or in the web interface.
- Apps can’t use WebSockets.
- An app gets 128 KB of memory by default, configurable up to 512 KB in the manifest.

Find exact limits in the [JS apps reference](https://developer.busy.app/javascript-applications.html).

***

## Tools for building JS apps

::::LinkArray{contentSource="CUSTOM" itemsPerRow="3"}
:::LinkArrayItem{headerType="NONE"}
**[create-app](https://www.npmjs.com/package/@busy-app/create-app)**

Creates a new app project from the template, ready to build and install
:::

:::LinkArrayItem{headerType="NONE"}
**[busy-cli](https://www.npmjs.com/package/busy-cli)**

Builds your app and installs, starts, stops, and deletes apps on BUSY Bar
:::

:::LinkArrayItem{headerType="NONE"}
**[busy-lib](https://www.npmjs.com/package/@busy-app/busy-lib)**

Sends requests to BUSY Bar and helps lay out text on the screens
:::
::::

All tools are open source in the [busy-tools](https://github.com/busy-app/busy-tools) repository on GitHub.

***

## Apps vs. HTTP API integrations

Your code can run on BUSY Bar itself as a JS app, or [on another device as an HTTP API integration](docId\:H4whpEXTNlYjSR9PlxsAr). Here’s how they compare:

|                                 | **JS app**                                                                                                                                                                                 | **HTTP API integration**                                 |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------- |
| **Where the code runs**         | On BUSY Bar. You need a computer only to install the app                                                                                                                                   | On a computer, server, or smart home hub that stays on   |
| **Language**                    | JavaScript or TypeScript                                                                                                                                                                   | Any language that allows sending HTTP requests           |
| **Supported HTTP API requests** | Drawing, sound, brightness, volume, BUSY timer, and device status (see [full list](https://developer.busy.app/javascript-applications.html#:~\:text=HTTP%20Requests,-Requests%20to%20the)) | All                                                      |
| **Best for**                    | Apps that work on their own and can get data from the web                                                                                                                                  | Connecting BUSY Bar to apps and services you already run |

Choose a JS app when BUSY Bar should work on its own, such as a clock, a counter, or data from an online service. Choose an HTTP API integration when the data is on your computer or home network, such as call status or smart home sensors.

***

## Where to get apps and how to share them

There’s no app catalog yet, but one is on the way. Until then, you can:

- [Build your own app](https://docs.busy.app/bar/dev/js-apps/build) from scratch.
- Find apps from the community or share your own apps on [Reddit](https://www.reddit.com/r/busyapp/) or [Discord](https://discord.com/invite/jXnEQQ4ahf).

### Install apps

To install an app, upload its `.tgz` file to BUSY Bar via the web interface.

::::WorkflowBlock
:::WorkflowBlockItem
Connect BUSY Bar to your computer via USB.
:::

:::WorkflowBlockItem
Open [http://10.0.4.20](http://10.0.4.20) in a web browser.
:::

:::WorkflowBlockItem
Go to the :inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/b8OHfntQ5OT2XNeY_Pkid_apps-icon-web-interface.png" alt caption width="96" height="96"}**Apps** tab and click **＋Add app**.
:::

:::WorkflowBlockItem
Click **Select file**, choose the `.tgz` file, and click **Upload**.
:::

:::WorkflowBlockItem
Click **Install app**. If the app is already installed, the button says **Update app**.
:::
::::

To learn how to start, update, set up, and delete apps, visit [Manage apps on BUSY Bar](https://docs.busy.app/bar/apps-and-integrations/manage-apps).

:::hint{type="warning"}
:inlineImage[]{src="https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/VMfrpLrpuYMKhr31n5tsa_warning-icon.png" alt caption width="84" height="88"}  <font color="#FAAB00">**Install only apps you trust**</font>

Apps can access the internet through your Wi-Fi and control your BUSY Bar’s screens, sounds, and timer.
:::

***

## Learn more

::::LinkArray{contentSource="CUSTOM" itemsPerRow="3"}
:::LinkArrayItem{headerType="NONE"}
**[Build a JS app](https://docs.busy.app/bar/dev/js-apps/build)**

A step-by-step guide to building a real app that covers every feature
:::

:::LinkArrayItem{headerType="NONE"}
**[Create apps with AI agents](https://docs.busy.app/bar/dev/js-apps/create-with-ai)**

Give your AI agent a link to AGENTS.md, describe your idea, and get an app
:::

:::LinkArrayItem{headerType="NONE"}
**[JS app reference](https://developer.busy.app/javascript-applications.html)**

An in-depth reference to every feature of the runtime and firmware
:::

:::LinkArrayItem
**[Manage apps on BUSY Bar](https://docs.busy.app/bar/apps-and-integrations/manage-apps)**

Install, start, configure, update, and delete apps
:::
::::

### Get help

- Ask the community on [Reddit](https://www.reddit.com/r/busyapp) or [Discord](https://discord.com/invite/jXnEQQ4ahf).
- Report a bug with the app tools on [GitHub](https://github.com/busy-app/busy-tools/issues).
- Contact [support](https://support.busy.app).

