diff --git a/.gitignore b/.gitignore
index 47233d1f5..523dc5f20 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@ appdates.csv
_config.yml
tests/Layout/bin/tmp.*
tests/Layout/testresult.bmp
+apps.local.json
\ No newline at end of file
diff --git a/README.md b/README.md
index 8e186cf79..0a92aae30 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ and that it is not licensed in another way that would make this impossible.
## How does it work?
-* A list of apps is in `apps.json`
+* A list of apps is in `apps.json` (this is auto-generated from all the `apps/yourapp/metadata.json` using Jekyll or `bin/create_apps_json.sh`)
* Each element references an app in `apps/` which is uploaded
* When it starts, BangleAppLoader checks the JSON and compares
it with the files it sees in the watch's storage.
@@ -53,10 +53,10 @@ easily distinguish between file types, we use the following:
is limited to 28 char filenames and appends a file extension (eg `.js`) so please
try and keep filenames short to avoid overflowing the buffer.
* Create a folder called `apps/`, lets assume `apps/myappid`
-* We'd recommend that you copy files from 'Example Applications' (below) as a base, or...
+* We'd recommend that you copy files from one of the Examples in `apps/_example_*` (see below), or...
* `apps/myappid/app.png` should be a 48px icon
* Use http://www.espruino.com/Image+Converter to create `apps/myappid/app-icon.js`, using a 1 bit, 4 bit or 8 bit Web Palette "Image String"
-* Create an entry in `apps.json` as follows:
+* Create/modify `apps/myappid/metadata.json` as follows:
```
{ "id": "myappid",
@@ -116,8 +116,7 @@ and set it to `Load default application`.
To make the process easier we've come up with some example applications that you can use as a base
when creating your own. Just come up with a unique name (ideally lowercase, under 20 chars), copy `apps/_example_app`
-or `apps/_example_widget` to `apps/myappid`, and add `apps/_example_X/add_to_apps.json` to
-`apps.json`.
+or `apps/_example_widget` to `apps/myappid`, and edit `apps/myappid/metadata.json` accordingly.
**Note:** the max filename length is 28 chars, so we suggest an app ID of under
20 so that when `.app.js`/etc gets added to the end the filename isn't cropped.
@@ -131,7 +130,7 @@ The app example is available in [`apps/_example_app`](apps/_example_app)
Apps are listed in the Bangle.js menu, accessible from a clock app via the middle button.
-* `add_to_apps.json` - insert into `apps.json`, describes the app to bootloader and loader
+* `metadata.json` - describes the app to bootloader and loader
* `app.png` - app icon - 48x48px
* `app-icon.js` - JS version of the icon (made with http://www.espruino.com/Image+Converter) for use in Bangle.js's menu
* `app.js` - app code
@@ -144,11 +143,11 @@ Use the Espruino [image converter](https://www.espruino.com/Image+Converter) and
Follow this steps to create a readable icon as image string.
-1. upload a png file
+1. upload a 48x48 png file - THE IMAGE SHOULD BE 48x48 OR LESS
2. set _X_ Use Compression
3. set _X_ Transparency (optional)
4. set Diffusion: _flat_
-5. set Colours: _1 bit_, _4 bit_ or _8 bit Web Palette_
+5. set Colours: _1 bit_, any of the Optimised options, or _8 bit Web Palette_ are best
6. set Output as: _Image String_
Replace this line with the image converter output:
@@ -157,6 +156,8 @@ Replace this line with the image converter output:
require("heatshrink").decompress(atob("mEwwJC/AH4A/AH4AgA=="))
```
+**Do not add a trailing semicolon**
+
You can also use this converter for creating images you like to draw with `g.drawImage()` with your app.
Apps that need widgets can call `Bangle.loadWidgets()` **once** at startup to load
@@ -167,17 +168,18 @@ has call to completely clear the screen. Widgets themselves will update as and w
The widget example is available in [`apps/_example_widget`](apps/_example_widget)
-* `add_to_apps.json` - insert into `apps.json`, describes the widget to bootloader and loader
+* `metadata.json` - describes the widget to bootloader and loader
* `widget.js` - widget code
Widgets are just small bits of code that run whenever an app that supports them
calls `Bangle.loadWidgets()`. If they want to display something in the 24px high
-widget bars at the top and bottom of the screen they can add themselves to
-the global `WIDGETS` array with:
+widget bar at the top of the screen they can add themselves to the global
+`WIDGETS` array with:
```
WIDGETS["mywidget"]={
- area:"tl", // tl (top left), tr (top right), bl (bottom left), br (bottom right)
+ area:"tl", // tl (top left), tr (top right)
+ sortorder:0, // (Optional) determines order of widgets in the same corner
width: 24, // how wide is the widget? You can change this and call Bangle.drawWidgets() to re-layout
draw:draw // called to draw the widget
};
@@ -202,7 +204,7 @@ and which gives information about the app for the Launcher.
// if it's 'clock' then it'll be loaded by default at boot time
// if this is 'bootloader' then it's code that is run at boot time, but is not in a menu
"version":"1.23",
- // added by BangleApps loader on upload based on apps.json
+ // added by BangleApps loader on upload based on metadata.json
"files:"file1,file2,file3",
// added by BangleApps loader on upload - lists all files
// that belong to the app so it can be deleted
@@ -214,7 +216,7 @@ and which gives information about the app for the Launcher.
}
```
-### `apps.json` format
+### `metadata.json` format
```
{ "id": "appid", // 7 character app id
@@ -293,9 +295,9 @@ and which gives information about the app for the Launcher.
* storage is used to identify the app files and how to handle them
* data is used to clean up files when the app is uninstalled
-### `apps.json`: `custom` element
+### `metadata.json`: `custom` element
-Apps that can be customised need to define a `custom` element in `apps.json`,
+Apps that can be customised need to define a `custom` element in `metadata.json`,
which names an HTML file in that app's folder.
When `custom` is defined, the 'upload' button is replaced by a customize
@@ -303,7 +305,7 @@ button, and when clicked it opens the HTML page specified in an iframe.
In that HTML file you're then responsible for handling a button
press and calling `sendCustomizedApp` with your own customised
-version of what's in `apps.json`:
+version of what's in `metadata.json`:
```
@@ -335,9 +337,9 @@ for a clean example.
and will never be loaded. This is so the app loader can tell if it's a JavaScript
file based on the extension, and if so it can minify and pretokenise it.
-### `apps.json`: `interface` element
+### `metadata.json`: `interface` element
-Apps that create data that can be read back can define a `interface` element in `apps.json`,
+Apps that create data that can be read back can define a `interface` element in `metadata.json`,
which names an HTML file in that app's folder.
When `interface` is defined, a `Download from App` button is added to
@@ -401,7 +403,7 @@ Example `settings.js`
E.showMenu(appMenu)
})
```
-In this example the app needs to add `myappid.settings.js` to `storage` in `apps.json`.
+In this example the app needs to add `myappid.settings.js` to `storage` in `metadata.json`.
It should also add `myappid.json` to `data`, to make sure it is cleaned up when the app is uninstalled.
```json
{ "id": "myappid",
@@ -461,16 +463,13 @@ The screen is parted in a widget and app area for lcd mode `direct`(default).
| areas | as rectangle or point |
| :-:| :-: |
| Widget | (0,0,239,23) |
-| Widget bottom bar (optional) | (0,216,239,239) |
-| Apps | (0,24,239,239) (see below) |
+| Apps | (0,24,239,239) |
| BTN1 | (230, 55) |
| BTN2 | (230, 140) |
| BTN3 | (230, 210) |
| BTN4 | (0,0,119, 239)|
| BTN5 | (120,0,239,239) |
-- If there are widgets at the bottom of the screen, apps should actually keep the bottom 24px free, so should keep to the area (0,24,239,215)
-
- Use `g.setFontAlign(0, 0, 3)` to draw rotated string to BTN1-BTN3 with `g.drawString()`.
- For BTN4-5 the touch area is named
@@ -515,7 +514,6 @@ The [`testing`](testing) folder contains snippets of code that might be useful f
* `testing/colors.js` - 16 bit colors as name value pairs
* `testing/gpstrack.js` - code to store a GPS track in Bangle.js storage and output it back to the console
-* `testing/map` - code for splitting an image into map tiles and then displaying them
## Credits
diff --git a/apps.json b/apps.json
index 8551481aa..537a4f697 100644
--- a/apps.json
+++ b/apps.json
@@ -1,5431 +1,38 @@
+---
+# =================================================================
+# ALL THE INFORMATION INSIDE APPS.JSON HAS NOW BEEN MOVED
+#
+# You'll find it inside a file called apps/yourapp/metadata.json
+#
+# Otherwise nothing has changed. GitHub Pages will automatically
+# create apps.json as your site is hosted, or if you're hosting
+# yourself you can run bin/create_apps_json.sh
+#
+# If you serve the store from localhost for development/testing,
+# the loader looks for apps.local.json instead, you can run
+# `bin/create_apps_json.sh apps.local.json` to create that file.
+# =================================================================
+
+# Uncomment the following line if you only want explicitly listed
+# apps to be available on your site
+
+# restricted: ["boot", "launch", "antonclk", "health", "setting", "about", "widbat", "widbt", "widlock", "widid"]
+---
+{%- if page.restricted == nil -%}
+ {%- assign apps = site.static_files | where: "name", "metadata.json" | map: "path" -%}
+{%- else -%}
+ {%- capture temp -%}
+ {%- for app in page.restricted %} /apps/{{app}}/metadata.json {%- endfor -%}
+ {%- endcapture -%}
+ {%- assign apps = temp | strip | split: " " -%}
+{%- endif -%}
+
[
- {
- "id": "fwupdate",
- "name": "Firmware Update",
- "version": "0.02",
- "description": "[BETA] Uploads new Espruino firmwares to Bangle.js 2. For now, please use the instructions under https://www.espruino.com/Bangle.js2#firmware-updates",
- "icon": "app.png",
- "type": "RAM",
- "tags": "tools,system",
- "supports": ["BANGLEJS2"],
- "custom": "custom.html",
- "customConnect": true,
- "storage": [],
- "sortorder": 20
- },
- {
- "id": "boot",
- "name": "Bootloader",
- "version": "0.40",
- "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings",
- "icon": "bootloader.png",
- "type": "bootloader",
- "tags": "tool,system",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":".boot0","url":"boot0.js"},
- {"name":".bootcde","url":"bootloader.js"},
- {"name":"bootupdate.js","url":"bootupdate.js"}
- ],
- "sortorder": -10
- },
- {
- "id": "hebrew_calendar",
- "name": "Hebrew Calendar",
- "shortName": "HebCal",
- "version": "0.04",
- "description": "lists the date according to the hebrew calendar",
- "icon": "app.png",
- "allow_emulator": false,
- "tags": "tool,locale",
- "supports": [
- "BANGLEJS",
- "BANGLEJS2"
- ],
- "readme": "README.md",
- "storage": [
- {
- "name": "hebrew_calendar.app.js",
- "url": "app.js"
- },
- {
- "name": "hebrewDate",
- "url": "hebrewDate.js"
- },
- {
- "name": "hebrew_calendar.img",
- "url": "app-icon.js",
- "evaluate": true
- }
- ]
- },
- { "id": "golfscore",
- "name": "Golf Score",
- "shortName":"golfscore",
- "version":"0.02",
- "description": "keeps track of strokes during a golf game",
- "icon": "app.png",
- "tags": "outdoors",
- "allow_emulator": true,
- "supports" : ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"golfscore.app.js","url":"app.js"},
- {"name":"golfscore.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "messages",
- "name": "Messages",
- "version": "0.17",
- "description": "App to display notifications from iOS and Gadgetbridge",
- "icon": "app.png",
- "type": "app",
- "tags": "tool,system",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"messages.app.js","url":"app.js"},
- {"name":"messages.settings.js","url":"settings.js"},
- {"name":"messages.img","url":"app-icon.js","evaluate":true},
- {"name":"messages.wid.js","url":"widget.js"},
- {"name":"messages","url":"lib.js"}
- ],
- "data": [{"name":"messages.json"},{"name":"messages.settings.json"}],
- "screenshots": [{"url":"screenshot.png"},{"url":"screenshot-notify.gif"}],
- "sortorder": -9
- },
- {
- "id": "android",
- "name": "Android Integration",
- "shortName": "Android",
- "version": "0.05",
- "description": "Display notifications/music/etc sent from the Gadgetbridge app on Android. This replaces the old 'Gadgetbridge' Bangle.js widget.",
- "icon": "app.png",
- "tags": "tool,system,messages,notifications",
- "dependencies": {"messages":"app"},
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"android.app.js","url":"app.js"},
- {"name":"android.settings.js","url":"settings.js"},
- {"name":"android.img","url":"app-icon.js","evaluate":true},
- {"name":"android.boot.js","url":"boot.js"}
- ],
- "sortorder": -8
- },
- {
- "id": "ios",
- "name": "iOS Integration",
- "version": "0.08",
- "description": "Display notifications/music/etc from iOS devices",
- "icon": "app.png",
- "tags": "tool,system,ios,apple,messages,notifications",
- "dependencies": {"messages":"app"},
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"ios.app.js","url":"app.js"},
- {"name":"ios.img","url":"app-icon.js","evaluate":true},
- {"name":"ios.boot.js","url":"boot.js"}
- ],
- "sortorder": -8
- },
- {
- "id": "health",
- "name": "Health Tracking",
- "version": "0.09",
- "description": "Logs health data and provides an app to view it (requires firmware 2v10.100 or later)",
- "icon": "app.png",
- "tags": "tool,system,health",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "interface": "interface.html",
- "storage": [
- {"name":"health.app.js","url":"app.js"},
- {"name":"health.img","url":"app-icon.js","evaluate":true},
- {"name":"health.boot.js","url":"boot.js"},
- {"name":"health","url":"lib.js"}
- ]
- },
- {
- "id": "launch",
- "name": "Launcher",
- "shortName": "Launcher",
- "version": "0.10",
- "description": "This is needed to display a menu allowing you to choose your own applications. You can replace this with a customised launcher.",
- "icon": "app.png",
- "type": "launch",
- "tags": "tool,system,launcher",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"launch.app.js","url":"app-bangle1.js","supports":["BANGLEJS"]},
- {"name":"launch.app.js","url":"app-bangle2.js","supports":["BANGLEJS2"]},
- {"name":"launch.settings.js","url":"settings.js","supports":["BANGLEJS2"]}
- ],
- "data": [{"name":"launch.json"}],
- "sortorder": -10
- },
- {
- "id": "setting",
- "name": "Settings",
- "version": "0.40",
- "description": "A menu for setting up Bangle.js",
- "icon": "settings.png",
- "tags": "tool,system",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"setting.app.js","url":"settings.js"},
- {"name":"setting.img","url":"settings-icon.js","evaluate":true}
- ],
- "data": [{"name":"setting.json","url":"settings.min.json","evaluate":true}],
- "sortorder": -5
- },
- {
- "id": "about",
- "name": "About",
- "version": "0.12",
- "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers",
- "icon": "app.png",
- "tags": "tool,system",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "screenshots": [{"url":"bangle1-about-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"about.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]},
- {"name":"about.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]},
- {"name":"about.img","url":"app-icon.js","evaluate":true}
- ],
- "sortorder": -4
- },
- {
- "id": "alarm",
- "name": "Default Alarm & Timer",
- "shortName": "Alarms",
- "version": "0.14",
- "description": "Set and respond to alarms and timers",
- "icon": "app.png",
- "tags": "tool,alarm,widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"alarm.app.js","url":"app.js"},
- {"name":"alarm.boot.js","url":"boot.js"},
- {"name":"alarm.js","url":"alarm.js"},
- {"name":"alarm.img","url":"app-icon.js","evaluate":true},
- {"name":"alarm.wid.js","url":"widget.js"}
- ],
- "data": [{"name":"alarm.json"}]
- },
- {
- "id": "locale",
- "name": "Languages",
- "version": "0.14",
- "description": "Translations for different countries",
- "icon": "locale.png",
- "type": "locale",
- "tags": "tool,system,locale,translate",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "custom": "locale.html",
- "storage": [
- {"name":"locale"}
- ],
- "sortorder": -10
- },
- {
- "id": "notify",
- "name": "Notifications (default)",
- "shortName": "Notifications",
- "version": "0.11",
- "description": "Provides the default `notify` module used by applications to display notifications in a bar at the top of the screen. This module is installed by default by client applications such as the Gadgetbridge app. Installing `Fullscreen Notifications` replaces this module with a version that displays the notifications using the full screen",
- "icon": "notify.png",
- "type": "notify",
- "tags": "widget",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"notify","url":"notify.js"}
- ]
- },
- {
- "id": "notifyfs",
- "name": "Fullscreen Notifications",
- "shortName": "Notifications",
- "version": "0.12",
- "description": "Provides a replacement for the `Notifications (default)` `notify` module. This version is used by applications to display notifications fullscreen. This may not fully restore the screen after on some apps. See `Notifications (default)` for more information about the notify module.",
- "icon": "notify.png",
- "type": "notify",
- "tags": "widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"notify","url":"notify.js"}
- ]
- },
- {
- "id": "welcome",
- "name": "Welcome",
- "shortName": "Welcome",
- "version": "0.14",
- "description": "Appears at first boot and explains how to use Bangle.js",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot_welcome.png"}],
- "tags": "start,welcome",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"welcome.boot.js","url":"boot.js"},
- {"name":"welcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]},
- {"name":"welcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]},
- {"name":"welcome.settings.js","url":"settings.js"},
- {"name":"welcome.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [{"name":"welcome.json"}]
- },
- {
- "id": "mywelcome",
- "name": "Customised Welcome",
- "shortName": "My Welcome",
- "version": "0.13",
- "description": "Appears at first boot and explains how to use Bangle.js. Like 'Welcome', but can be customised with a greeting",
- "icon": "app.png",
- "tags": "start,welcome",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "custom": "custom.html",
- "screenshots": [{"url":"bangle1-customized-welcome-screenshot.png"}],
- "storage": [
- {"name":"mywelcome.boot.js","url":"boot.js"},
- {"name":"mywelcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]},
- {"name":"mywelcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]},
- {"name":"mywelcome.settings.js","url":"settings.js"},
- {"name":"mywelcome.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [{"name":"mywelcome.json"}]
- },
- {
- "id": "gbridge",
- "name": "Gadgetbridge",
- "version": "0.25",
- "description": "(NOT RECOMMENDED) Displays Gadgetbridge notifications from Android. Please use the 'Android' Bangle.js app instead.",
- "icon": "app.png",
- "type": "widget",
- "tags": "tool,system,android,widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "dependencies": {"notify":"type"},
- "readme": "README.md",
- "storage": [
- {"name":"gbridge.settings.js","url":"settings.js"},
- {"name":"gbridge.img","url":"app-icon.js","evaluate":true},
- {"name":"gbridge.wid.js","url":"widget.js"}
- ],
- "data": [{"name":"gbridge.json"}]
- },
- { "id": "gbdebug",
- "name": "Gadgetbridge Debug",
- "shortName":"GB Debug",
- "version":"0.01",
- "description": "Debug info for Gadgetbridge. Run this app and when Gadgetbridge messages arrive they are displayed on-screen.",
- "icon": "app.png",
- "tags": "",
- "supports" : ["BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"gbdebug.app.js","url":"app.js"},
- {"name":"gbdebug.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "mclock",
- "name": "Morphing Clock",
- "version": "0.07",
- "description": "7 segment clock that morphs between minutes and hours",
- "icon": "clock-morphing.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-morphing-clock-screenshot.png"}],
- "storage": [
- {"name":"mclock.app.js","url":"clock-morphing.js"},
- {"name":"mclock.img","url":"clock-morphing-icon.js","evaluate":true}
- ],
- "sortorder": -9
- },
- {
- "id": "moonphase",
- "name": "Moonphase",
- "version": "0.02",
- "description": "Shows current moon phase. Now with GPS function.",
- "icon": "app.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"bangle1-moon-phase-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"moonphase.app.js","url":"app.js"},
- {"name":"moonphase.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "daysl",
- "name": "Days left",
- "version": "0.03",
- "description": "Shows you the days left until a certain date. Date can be set with a settings app and is written to a file.",
- "icon": "app.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "allow_emulator": false,
- "storage": [
- {"name":"daysl.app.js","url":"app.js"},
- {"name":"daysl.img","url":"app-icon.js","evaluate":true},
- {"name":"daysl.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "wclock",
- "name": "Word Clock",
- "version": "0.03",
- "description": "Display Time as Text",
- "icon": "clock-word.png",
- "screenshots": [{"url":"screenshot_word.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"wclock.app.js","url":"clock-word.js"},
- {"name":"wclock.img","url":"clock-word-icon.js","evaluate":true}
- ]
- },
- {
- "id": "fontclock",
- "name": "Font Clock",
- "version": "0.01",
- "description": "Choose the font and design of clock face from a library of available designs",
- "icon": "fontclock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "custom": "custom.html",
- "allow_emulator": false,
- "storage": [
- {"name":"fontclock.app.js","url":"fontclock.js"},
- {"name":"fontclock.img","url":"fontclock-icon.js","evaluate":true},
- {"name":"fontclock.hand.js","url":"fontclock.hand.js"},
- {"name":"fontclock.thinhand.js","url":"fontclock.thinhand.js"},
- {"name":"fontclock.thickhand.js","url":"fontclock.thickhand.js"},
- {"name":"fontclock.hourscriber.js","url":"fontclock.hourscriber.js"},
- {"name":"fontclock.font.js","url":"fontclock.font.js"},
- {"name":"fontclock.font.abril_ff50.js","url":"fontclock.font.abril_ff50.js"},
- {"name":"fontclock.font.cpstc58.js","url":"fontclock.font.cpstc58.js"},
- {"name":"fontclock.font.mntn25.js","url":"fontclock.font.mntn25.js"},
- {"name":"fontclock.font.mntn50.js","url":"fontclock.font.mntn50.js"},
- {"name":"fontclock.font.vector25.js","url":"fontclock.font.vector25.js"},
- {"name":"fontclock.font.vector50.js","url":"fontclock.font.vector50.js"}
- ]
- },
- {
- "id": "slidingtext",
- "name": "Sliding Clock",
- "version": "0.07",
- "description": "Inspired by the Pebble sliding clock, old times are scrolled off the screen and new times on. You are also able to change language on the fly so you can see the time written in other languages using button 1. Currently English, French, Japanese, Spanish and German are supported",
- "icon": "slidingtext.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "custom": "custom.html",
- "allow_emulator": false,
- "storage": [
- {"name":"slidingtext.app.js","url":"slidingtext.js"},
- {"name":"slidingtext.img","url":"slidingtext-icon.js","evaluate":true},
- {"name":"slidingtext.locale.en.js","url":"slidingtext.locale.en.js"},
- {"name":"slidingtext.locale.en2.js","url":"slidingtext.locale.en2.js"},
- {"name":"slidingtext.utils.en.js","url":"slidingtext.utils.en.js"},
- {"name":"slidingtext.locale.es.js","url":"slidingtext.locale.es.js"},
- {"name":"slidingtext.locale.fr.js","url":"slidingtext.locale.fr.js"},
- {"name":"slidingtext.locale.jp.js","url":"slidingtext.locale.jp.js"},
- {"name":"slidingtext.locale.de.js","url":"slidingtext.locale.de.js"},
- {"name":"slidingtext.dtfmt.js","url":"slidingtext.dtfmt.js"}
- ]
- },
- {
- "id": "solarclock",
- "name": "Solar Clock",
- "version": "0.02",
- "description": "Using your current or chosen location the solar watch face shows the Sun's sky position, time and date. Also allows you to wind backwards and forwards in time to see the sun's position",
- "icon": "solar_clock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "custom": "custom.html",
- "allow_emulator": false,
- "storage": [
- {"name":"solarclock.app.js","url":"solar_clock.js"},
- {"name":"solarclock.img","url":"solar_clock-icon.js","evaluate":true},
- {"name":"solar_colors.js","url":"solar_colors.js"},
- {"name":"solar_controller.js","url":"solar_controller.js"},
- {"name":"solar_date_utils.js","url":"solar_date_utils.js"},
- {"name":"solar_graphic_utils.js","url":"solar_graphic_utils.js"},
- {"name":"solar_location.js","url":"solar_location.js"},
- {"name":"solar_math_utils.js","url":"solar_math_utils.js"},
- {"name":"solar_loc.Reykjavik.json","url":"solar_loc.Reykjavik.json"},
- {"name":"solar_loc.Hong_Kong.json","url":"solar_loc.Hong_Kong.json"},
- {"name":"solar_loc.Honolulu.json","url":"solar_loc.Honolulu.json"},
- {"name":"solar_loc.Rio.json","url":"solar_loc.Rio.json"},
- {"name":"solar_loc.Tokyo.json","url":"solar_loc.Tokyo.json"},
- {"name":"solar_loc.Seoul.json","url":"solar_loc.Seoul.json"}
- ]
- },
- {
- "id": "sweepclock",
- "name": "Sweep Clock",
- "version": "0.04",
- "description": "Smooth sweep secondhand with single hour numeral. Use button 1 to toggle the numeral font, button 3 to change the colour theme and button 4 to change the date placement",
- "icon": "sweepclock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-sweep-clock-screenshot.png"}],
- "storage": [
- {"name":"sweepclock.app.js","url":"sweepclock.js"},
- {"name":"sweepclock.img","url":"sweepclock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "matrixclock",
- "name": "Matrix Clock",
- "version": "0.02",
- "description": "inspired by The Matrix, a clock of the same style",
- "icon": "matrixclock.png",
- "screenshots": [{"url":"screenshot_matrix.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"matrixclock.app.js","url":"matrixclock.js"},
- {"name":"matrixclock.img","url":"matrixclock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "mandelbrotclock",
- "name": "Mandelbrot Clock",
- "version": "0.01",
- "description": "A mandelbrot set themed clock cool",
- "icon": "mandelbrotclock.png",
- "screenshots": [{ "url": "screenshot_mandelbrotclock.png" }],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- { "name": "mandelbrotclock.app.js", "url": "mandelbrotclock.js" },
- {
- "name": "mandelbrotclock.img",
- "url": "mandelbrotclock-icon.js",
- "evaluate": true
- }
- ]
- },
- {
- "id": "imgclock",
- "name": "Image background clock",
- "shortName": "Image Clock",
- "version": "0.08",
- "description": "A clock with an image as a background",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "custom": "custom.html",
- "storage": [
- {"name":"imgclock.app.js","url":"app.js"},
- {"name":"imgclock.img","url":"app-icon.js","evaluate":true},
- {"name":"imgclock.face.img"},
- {"name":"imgclock.face.json"},
- {"name":"imgclock.face.bg","content":""}
- ]
- },
- {
- "id": "impwclock",
- "name": "Imprecise Word Clock",
- "version": "0.04",
- "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.",
- "icon": "clock-impword.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "screenshots": [{"url":"bangle1-impercise-word-clock-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"impwclock.app.js","url":"clock-impword.js"},
- {"name":"impwclock.img","url":"clock-impword-icon.js","evaluate":true}
- ]
- },
- {
- "id": "aclock",
- "name": "Analog Clock",
- "version": "0.15",
- "description": "An Analog Clock",
- "icon": "clock-analog.png",
- "screenshots": [{"url":"screenshot_analog.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"aclock.app.js","url":"clock-analog.js"},
- {"name":"aclock.img","url":"clock-analog-icon.js","evaluate":true}
- ]
- },
- {
- "id": "clock2x3",
- "name": "2x3 Pixel Clock",
- "version": "0.05",
- "description": "This is a simple clock using minimalist 2x3 pixel numerical digits",
- "icon": "clock2x3.png",
- "screenshots": [{"url":"screenshot_pixel.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"clock2x3.app.js","url":"clock2x3-app.js"},
- {"name":"clock2x3.img","url":"clock2x3-icon.js","evaluate":true}
- ]
- },
- {
- "id": "geissclk",
- "name": "Geiss Clock",
- "version": "0.03",
- "description": "7 segment clock with animated background in the style of Ryan Geiss' music visualisation. NOTE: The first run will take ~1 minute to do some precalculation",
- "icon": "clock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"geissclk.app.js","url":"clock.js"},
- {"name":"geissclk.precompute.js","url":"precompute.js"},
- {"name":"geissclk.img","url":"clock-icon.js","evaluate":true}
- ],
- "data": [{"name":"geissclk.0.map"},{"name":"geissclk.1.map"},{"name":"geissclk.2.map"},{"name":"geissclk.3.map"},{"name":"geissclk.4.map"},{"name":"geissclk.5.map"},{"name":"geissclk.0.pal"},{"name":"geissclk.1.pal"},{"name":"geissclk.2.pal"}]
- },
- {
- "id": "trex",
- "name": "T-Rex",
- "version": "0.04",
- "description": "T-Rex game in the style of Chrome's offline game",
- "icon": "trex.png",
- "screenshots": [{"url":"screenshot_trex.png"}],
- "tags": "game",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"trex.app.js","url":"trex.js"},
- {"name":"trex.img","url":"trex-icon.js","evaluate":true},
- {"name":"trex.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"trex.score","storageFile":true}]
- },
- {
- "id": "cubescramble",
- "name": "Cube Scramble",
- "version":"0.04",
- "description": "A random scramble generator for the 3x3 Rubik's cube with a basic timer",
- "icon": "cube-scramble.png",
- "tags": "",
- "supports" : ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle2-cube-scramble-screenshot.png"},{"url":"bangle1-cube-scramble-screenshot.png"}],
- "storage": [
- {"name":"cubescramble.app.js","url":"cube-scramble.js"},
- {"name":"cubescramble.img","url":"cube-scramble-icon.js","evaluate":true}
- ]
- },
- {
- "id": "astroid",
- "name": "Asteroids!",
- "version": "0.03",
- "description": "Retro asteroids game",
- "icon": "asteroids.png",
- "screenshots": [{"url":"screenshot_asteroids.png"}],
- "tags": "game",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"astroid.app.js","url":"asteroids.js"},
- {"name":"astroid.img","url":"asteroids-icon.js","evaluate":true}
- ]
- },
- {
- "id": "clickms",
- "name": "Click Master",
- "version": "0.01",
- "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!",
- "icon": "click-master.png",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"clickms.app.js","url":"click-master.js"},
- {"name":"clickms.img","url":"click-master-icon.js","evaluate":true}
- ]
- },
- {
- "id": "horsey",
- "name": "Horse Race!",
- "version": "0.01",
- "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!",
- "icon": "horse-race.png",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"horsey.app.js","url":"horse-race.js"},
- {"name":"horsey.img","url":"horse-race-icon.js","evaluate":true}
- ]
- },
- {
- "id": "compass",
- "name": "Compass",
- "version": "0.05",
- "description": "Simple compass that points North",
- "icon": "compass.png",
- "screenshots": [{"url":"screenshot_compass.png"}],
- "tags": "tool,outdoors",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"compass.app.js","url":"compass.js"},
- {"name":"compass.img","url":"compass-icon.js","evaluate":true}
- ]
- },
- {
- "id": "gpstime",
- "name": "GPS Time",
- "version": "0.05",
- "description": "Update the Bangle.js's clock based on the time from the GPS receiver",
- "icon": "gpstime.png",
- "tags": "tool,gps",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"gpstime.app.js","url":"gpstime.js"},
- {"name":"gpstime.img","url":"gpstime-icon.js","evaluate":true}
- ]
- },
- {
- "id": "openloc",
- "name": "Open Location / Plus Codes",
- "shortName": "Open Location",
- "version": "0.01",
- "description": "Convert your current GPS location to a series of characters",
- "icon": "app.png",
- "tags": "tool,outdoors,gps",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"openloc.app.js","url":"app.js"},
- {"name":"openloc.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "speedo",
- "name": "Speedo",
- "version": "0.05",
- "description": "Show the current speed according to the GPS",
- "icon": "speedo.png",
- "tags": "tool,outdoors,gps",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"speedo.app.js","url":"speedo.js"},
- {"name":"speedo.img","url":"speedo-icon.js","evaluate":true}
- ]
- },
- {
- "id": "gpsrec",
- "name": "GPS Recorder",
- "version": "0.27",
- "description": "Application that allows you to record a GPS track. Can run in background",
- "icon": "app.png",
- "tags": "tool,outdoors,gps,widget",
- "screenshots": [{"url":"screenshot.png"}],
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "interface": "interface.html",
- "storage": [
- {"name":"gpsrec.app.js","url":"app.js"},
- {"name":"gpsrec.img","url":"app-icon.js","evaluate":true},
- {"name":"gpsrec.wid.js","url":"widget.js"},
- {"name":"gpsrec.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"gpsrec.json"},{"wildcard":".gpsrc?","storageFile":true}]
- },
- {
- "id": "recorder",
- "name": "Recorder (BETA)",
- "shortName": "Recorder",
- "version": "0.05",
- "description": "Record GPS position, heart rate and more in the background, then download to your PC.",
- "icon": "app.png",
- "tags": "tool,outdoors,gps,widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "interface": "interface.html",
- "storage": [
- {"name":"recorder.app.js","url":"app.js"},
- {"name":"recorder.img","url":"app-icon.js","evaluate":true},
- {"name":"recorder.wid.js","url":"widget.js"},
- {"name":"recorder.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"recorder.json"},{"wildcard":"recorder.log?.csv","storageFile":true}]
- },
- {
- "id": "gpsnav",
- "name": "GPS Navigation",
- "version": "0.05",
- "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording, now with waypoint editor",
- "icon": "icon.png",
- "tags": "tool,outdoors,gps",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "interface": "waypoints.html",
- "storage": [
- {"name":"gpsnav.app.js","url":"app.min.js"},
- {"name":"gpsnav.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [{"name":"waypoints.json","url":"waypoints.json"}]
- },
- {
- "id": "heart",
- "name": "Heart Rate Recorder",
- "shortName": "HRM Record",
- "version": "0.07",
- "description": "Application that allows you to record your heart rate. Can run in background",
- "icon": "app.png",
- "tags": "tool,health,widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "interface": "interface.html",
- "storage": [
- {"name":"heart.app.js","url":"app.js"},
- {"name":"heart.img","url":"app-icon.js","evaluate":true},
- {"name":"heart.wid.js","url":"widget.js"}
- ],
- "data": [{"name":"heart.json"},{"wildcard":".heart?","storageFile":true}]
- },
- {
- "id": "slevel",
- "name": "Spirit Level",
- "version": "0.02",
- "description": "Show the current angle of the watch, so you can use it to make sure something is absolutely flat",
- "icon": "spiritlevel.png",
- "tags": "tool",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"slevel.app.js","url":"spiritlevel.js"},
- {"name":"slevel.img","url":"spiritlevel-icon.js","evaluate":true}
- ]
- },
- {
- "id": "files",
- "name": "App Manager",
- "version": "0.07",
- "description": "Show currently installed apps, free space, and allow their deletion from the watch",
- "icon": "files.png",
- "tags": "tool,system,files",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"files.app.js","url":"files.js"},
- {"name":"files.img","url":"files-icon.js","evaluate":true}
- ]
- },
- {
- "id": "weather",
- "name": "Weather",
- "version": "0.15",
- "description": "Show Gadgetbridge weather report",
- "icon": "icon.png",
- "screenshots": [{"url":"screenshot.png"}],
- "tags": "widget,outdoors",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "readme.md",
- "storage": [
- {"name":"weather.app.js","url":"app.js"},
- {"name":"weather.wid.js","url":"widget.js"},
- {"name":"weather","url":"lib.js"},
- {"name":"weather.img","url":"icon.js","evaluate":true},
- {"name":"weather.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"weather.json"}]
- },
- {
- "id": "chargeanim",
- "name": "Charge Animation",
- "version": "0.02",
- "description": "When charging, show a sideways charging animation and keep the screen on. When removed from the charger load the clock again.",
- "icon": "icon.png",
- "tags": "battery",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle2-charge-animation-screenshot.png"},{"url":"bangle-charge-animation-screenshot.png"}],
- "storage": [
- {"name":"chargeanim.app.js","url":"app.js"},
- {"name":"chargeanim.boot.js","url":"boot.js"},
- {"name":"chargeanim.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "bluetoothdock",
- "name": "Bluetooth Dock",
- "shortName": "Dock",
- "version": "0.01",
- "description": "When charging shows the time, scans Bluetooth for known devices (eg temperature) and shows them on the screen",
- "icon": "app.png",
- "tags": "bluetooth",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"bluetoothdock.app.js","url":"app.js"},
- {"name":"bluetoothdock.boot.js","url":"boot.js"},
- {"name":"bluetoothdock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widbat",
- "name": "Battery Level Widget",
- "version": "0.09",
- "description": "Show the current battery level and charging status in the top right of the clock",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,battery",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widbat.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "widbatv",
- "name": "Battery Level Widget (Vertical)",
- "version": "0.01",
- "description": "Slim, vertical battery widget that only takes up 14px",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,battery",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widbatv.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "widlock",
- "name": "Lock Widget",
- "version": "0.03",
- "description": "On devices with always-on display (Bangle.js 2) this displays lock icon whenever the display is locked",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,lock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widlock.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "widbatpc",
- "name": "Battery Level Widget (with percentage)",
- "shortName": "Battery Widget",
- "version": "0.15",
- "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,battery",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"widbatpc.wid.js","url":"widget.js"},
- {"name":"widbatpc.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"widbatpc.json"}]
- },
- {
- "id": "widbatwarn",
- "name": "Battery Warning",
- "shortName": "Battery Warning",
- "version": "0.02",
- "description": "Show a warning when the battery runs low.",
- "icon": "widget.png",
- "screenshots": [{"url":"screenshot.png"}],
- "type": "widget",
- "tags": "tool,battery",
- "supports": ["BANGLEJS"],
- "dependencies": {"notify":"type"},
- "readme": "README.md",
- "storage": [
- {"name":"widbatwarn.wid.js","url":"widget.js"},
- {"name":"widbatwarn.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"widbatwarn.json"}]
- },
- {
- "id": "widbt",
- "name": "Bluetooth Widget",
- "version": "0.08",
- "description": "Show the current Bluetooth connection status in the top right of the clock",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,bluetooth",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widbt.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "widchime",
- "name": "Hour Chime",
- "version": "0.02",
- "description": "Buzz or beep on every whole hour.",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widchime.wid.js","url":"widget.js"},
- {"name":"widchime.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"widchime.json"}]
- },
- {
- "id": "widram",
- "name": "RAM Widget",
- "shortName": "RAM Widget",
- "version": "0.01",
- "description": "Display your Bangle's available RAM percentage in a widget",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widram.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "hrm",
- "name": "Heart Rate Monitor",
- "version": "0.06",
- "description": "Measure your heart rate and see live sensor data",
- "icon": "heartrate.png",
- "tags": "health",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"hrm.app.js","url":"heartrate.js"},
- {"name":"hrm.img","url":"heartrate-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widhrm",
- "name": "Simple Heart Rate widget",
- "version": "0.05",
- "description": "When the screen is on, the widget turns on the heart rate monitor and displays the current heart rate (or last known in grey). For this to work well you'll need at least a 15 second LCD Timeout.",
- "icon": "widget.png",
- "type": "widget",
- "tags": "health,widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widhrm.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "bthrm",
- "name": "Bluetooth Heart Rate Monitor",
- "shortName": "BT HRM",
- "version": "0.01",
- "description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.",
- "icon": "app.png",
- "type": "boot",
- "tags": "health,bluetooth",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"bthrm.boot.js","url":"boot.js"},
- {"name":"bthrm.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "stetho",
- "name": "Stethoscope",
- "version": "0.01",
- "description": "Hear your heart rate",
- "icon": "stetho.png",
- "tags": "health",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"stetho.app.js","url":"stetho.js"},
- {"name":"stetho.img","url":"stetho-icon.js","evaluate":true}
- ]
- },
- {
- "id": "swatch",
- "name": "Stopwatch",
- "version": "0.07",
- "description": "Simple stopwatch with Lap Time logging to a JSON file",
- "icon": "stopwatch.png",
- "tags": "health",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "interface": "interface.html",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-stopwatch-screenshot.png"}],
- "storage": [
- {"name":"swatch.app.js","url":"stopwatch.js"},
- {"name":"swatch.img","url":"stopwatch-icon.js","evaluate":true}
- ]
- },
- {
- "id": "hidmsic",
- "name": "Bluetooth Music Controls",
- "shortName": "Music Control",
- "version": "0.02",
- "description": "Enable HID in settings, pair with your phone, then use this app to control music from your watch!",
- "icon": "hid-music.png",
- "tags": "bluetooth",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"hidmsic.app.js","url":"hid-music.js"},
- {"name":"hidmsic.img","url":"hid-music-icon.js","evaluate":true}
- ]
- },
- {
- "id": "hidkbd",
- "name": "Bluetooth Keyboard",
- "shortName": "Bluetooth Kbd",
- "version": "0.02",
- "description": "Enable HID in settings, pair with your phone/PC, then use this app to control other apps",
- "icon": "hid-keyboard.png",
- "tags": "bluetooth",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"hidkbd.app.js","url":"hid-keyboard.js"},
- {"name":"hidkbd.img","url":"hid-keyboard-icon.js","evaluate":true}
- ]
- },
- {
- "id": "hidbkbd",
- "name": "Binary Bluetooth Keyboard",
- "shortName": "Binary BT Kbd",
- "version": "0.02",
- "description": "Enable HID in settings, pair with your phone/PC, then type messages using the onscreen keyboard by tapping repeatedly on the key you want",
- "icon": "hid-binary-keyboard.png",
- "tags": "bluetooth",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"hidbkbd.app.js","url":"hid-binary-keyboard.js"},
- {"name":"hidbkbd.img","url":"hid-binary-keyboard-icon.js","evaluate":true}
- ]
- },
- {
- "id": "animals",
- "name": "Animals Game",
- "version": "0.01",
- "description": "Simple toddler's game - displays a different number of animals each time the screen is pressed",
- "icon": "animals.png",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"animals.app.js","url":"animals.js"},
- {"name":"animals.img","url":"animals-icon.js","evaluate":true},
- {"name":"animals-snake.img","url":"animals-snake.js","evaluate":true},
- {"name":"animals-duck.img","url":"animals-duck.js","evaluate":true},
- {"name":"animals-swan.img","url":"animals-swan.js","evaluate":true},
- {"name":"animals-fox.img","url":"animals-fox.js","evaluate":true},
- {"name":"animals-camel.img","url":"animals-camel.js","evaluate":true},
- {"name":"animals-pig.img","url":"animals-pig.js","evaluate":true},
- {"name":"animals-sheep.img","url":"animals-sheep.js","evaluate":true},
- {"name":"animals-mouse.img","url":"animals-mouse.js","evaluate":true}
- ]
- },
- {
- "id": "qrcode",
- "name": "Custom QR Code",
- "version": "0.05",
- "description": "Use this to upload a customised QR code to Bangle.js",
- "icon": "app.png",
- "tags": "qrcode",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "custom": "custom.html",
- "customConnect": true,
- "storage": [
- {"name":"qrcode.app.js"},
- {"name":"qrcode.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "beer",
- "name": "Beer Compass",
- "version": "0.01",
- "description": "Uploads all the pubs in an area onto your watch, so it can always point you at the nearest one",
- "icon": "app.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "custom": "custom.html",
- "storage": [
- {"name":"beer.app.js"},
- {"name":"beer.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "route",
- "name": "Route Viewer",
- "version": "0.02",
- "description": "Upload a KML file of a route, and have your watch display a map with how far around it you are",
- "icon": "app.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "custom": "custom.html",
- "storage": [
- {"name":"route.app.js"},
- {"name":"route.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "ncstart",
- "name": "NCEU Startup",
- "version": "0.06",
- "description": "NodeConfEU 2019 'First Start' Sequence",
- "icon": "start.png",
- "tags": "start,welcome",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"ncstart.app.js","url":"start.js"},
- {"name":"ncstart.boot.js","url":"boot.js"},
- {"name":"ncstart.settings.js","url":"settings.js"},
- {"name":"ncstart.img","url":"start-icon.js","evaluate":true},
- {"name":"nc-bangle.img","url":"start-bangle.js","evaluate":true},
- {"name":"nc-nceu.img","url":"start-nceu.js","evaluate":true},
- {"name":"nc-nfr.img","url":"start-nfr.js","evaluate":true},
- {"name":"nc-nodew.img","url":"start-nodew.js","evaluate":true},
- {"name":"nc-tf.img","url":"start-tf.js","evaluate":true}
- ],
- "data": [{"name":"ncstart.json"}]
- },
- {
- "id": "ncfrun",
- "name": "NCEU 5K Fun Run",
- "version": "0.01",
- "description": "Display a map of the NodeConf EU 2019 5K Fun Run route and your location on it",
- "icon": "nceu-funrun.png",
- "tags": "health",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"ncfrun.app.js","url":"nceu-funrun.js"},
- {"name":"ncfrun.img","url":"nceu-funrun-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widnceu",
- "name": "NCEU Logo Widget",
- "version": "0.02",
- "description": "Show the NodeConf EU logo in the top left",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"widnceu.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "sclock",
- "name": "Simple Clock",
- "version": "0.07",
- "description": "A Simple Digital Clock",
- "icon": "clock-simple.png",
- "screenshots": [{"url":"screenshot_simplec.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"sclock.app.js","url":"clock-simple.js"},
- {"name":"sclock.img","url":"clock-simple-icon.js","evaluate":true}
- ]
- },
- {
- "id": "s7clk",
- "name": "Simple 7 segment Clock",
- "version": "0.03",
- "description": "A simple 7 segment Clock with date",
- "icon": "icon.png",
- "screenshots": [{"url":"screenshot_s7segment.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"s7clk.app.js","url":"app.js"},
- {"name":"s7clk.img","url":"icon.js","evaluate":true}
- ]
- },
- {
- "id": "vibrclock",
- "name": "Vibrate Clock",
- "version": "0.03",
- "description": "When BTN1 is pressed, vibrate out the time as a series of buzzes, one digit at a time. Hours, then Minutes. Zero is signified by one long buzz. Otherwise a simple digital clock.",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-vibrate-clock-screenshot.png"}],
- "storage": [
- {"name":"vibrclock.app.js","url":"app.js"},
- {"name":"vibrclock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "svclock",
- "name": "Simple V-Clock",
- "version": "0.04",
- "description": "Modification of Simple Clock 0.04 to use Vectorfont",
- "icon": "vclock-simple.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle2-simple-v-clock-screenshot.png"}],
- "storage": [
- {"name":"svclock.app.js","url":"vclock-simple.js"},
- {"name":"svclock.img","url":"vclock-simple-icon.js","evaluate":true}
- ]
- },
- {
- "id": "dclock",
- "name": "Dev Clock",
- "version": "0.10",
- "description": "A Digital Clock including timestamp (tst), beats(@), days in current month (dm) and days since new moon (l)",
- "icon": "clock-dev.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle2-dev-clock-screenshot.png"},{"url":"bangle1-dev-clock-screenshot.png"}],
- "storage": [
- {"name":"dclock.app.js","url":"clock-dev.js"},
- {"name":"dclock.img","url":"clock-dev-icon.js","evaluate":true}
- ]
- },
- {
- "id": "gesture",
- "name": "Gesture Test",
- "version": "0.01",
- "description": "BETA! Uploads a basic Tensorflow Gesture model, and then outputs each gesture as a message",
- "icon": "gesture.png",
- "type": "app",
- "tags": "gesture,ai",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "storage": [
- {"name":"gesture.app.js","url":"gesture.js"},
- {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true},
- {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true},
- {"name":"gesture.img","url":"gesture-icon.js","evaluate":true}
- ]
- },
- {
- "id": "pparrot",
- "name": "Party Parrot",
- "version": "0.01",
- "description": "Party with a parrot on your wrist",
- "icon": "party-parrot.png",
- "type": "app",
- "tags": "party,parrot,lol",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-party-parrot-screenshot.png"}],
- "storage": [
- {"name":"pparrot.app.js","url":"party-parrot.js"},
- {"name":"pparrot.img","url":"party-parrot-icon.js","evaluate":true}
- ]
- },
- {
- "id": "hrings",
- "name": "Hypno Rings",
- "version": "0.01",
- "description": "Experiment with trippy rings, press buttons for change",
- "icon": "hypno-rings.png",
- "type": "app",
- "tags": "rings,hypnosis,psychadelic",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-hypno-rings-screenshot.png"}],
- "storage": [
- {"name":"hrings.app.js","url":"hypno-rings.js"},
- {"name":"hrings.img","url":"hypno-rings-icon.js","evaluate":true}
- ]
- },
- {
- "id": "morse",
- "name": "Morse Code",
- "version": "0.01",
- "description": "Learn morse code by hearing/seeing/feeling the code. Tap to toggle buzz!",
- "icon": "morse-code.png",
- "type": "app",
- "tags": "morse,sound,visual,input",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"morse.app.js","url":"morse-code.js"},
- {"name":"morse.img","url":"morse-code-icon.js","evaluate":true}
- ]
- },
- {
- "id": "blescan",
- "name": "BLE Scanner",
- "version": "0.01",
- "description": "Scan for advertising BLE devices",
- "icon": "blescan.png",
- "tags": "bluetooth",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"blescan.app.js","url":"blescan.js"},
- {"name":"blescan.img","url":"blescan-icon.js","evaluate":true}
- ]
- },
- {
- "id": "mmonday",
- "name": "Manic Monday Tone",
- "version": "0.02",
- "description": "The Bangles make a comeback",
- "icon": "manic-monday-icon.png",
- "tags": "sound",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"mmonday.app.js","url":"manic-monday.js"},
- {"name":"mmonday.img","url":"manic-monday-icon.js","evaluate":true}
- ]
- },
- {
- "id": "jbells",
- "name": "Jingle Bells",
- "version": "0.01",
- "description": "Play Jingle Bells",
- "icon": "jbells.png",
- "type": "app",
- "tags": "sound",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"jbells.app.js","url":"jbells.js"},
- {"name":"jbells.img","url":"jbells-icon.js","evaluate":true}
- ]
- },
- {
- "id": "scolor",
- "name": "Show Color",
- "version": "0.01",
- "description": "Display all available Colors and Names",
- "icon": "show-color.png",
- "type": "app",
- "tags": "tool",
- "screenshots": [{"url":"bangle1-view-color-screenshot.png"}],
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "storage": [
- {"name":"scolor.app.js","url":"show-color.js"},
- {"name":"scolor.img","url":"show-color-icon.js","evaluate":true}
- ]
- },
- {
- "id": "miclock",
- "name": "Mixed Clock",
- "version": "0.05",
- "description": "A mix of analog and digital Clock",
- "icon": "clock-mixed.png",
- "type": "clock",
- "tags": "clock",
- "screenshots": [{"url":"bangle1-mixed-clock-screenshot.png"}],
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "storage": [
- {"name":"miclock.app.js","url":"clock-mixed.js"},
- {"name":"miclock.img","url":"clock-mixed-icon.js","evaluate":true}
- ]
- },
- {
- "id": "bclock",
- "name": "Binary Clock",
- "version": "0.03",
- "description": "A simple binary clock watch face",
- "icon": "clock-binary.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-binary-clock-screenshot.png"}],
- "storage": [
- {"name":"bclock.app.js","url":"clock-binary.js"},
- {"name":"bclock.img","url":"clock-binary-icon.js","evaluate":true}
- ]
- },
- {
- "id": "clotris",
- "name": "Clock-Tris",
- "version": "0.01",
- "description": "A fully functional clone of a classic game of falling blocks",
- "icon": "clock-tris.png",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"bangle1-clock-tris-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"clotris.app.js","url":"clock-tris.js"},
- {"name":"clotris.img","url":"clock-tris-icon.js","evaluate":true},
- {"name":".trishig","url":"clock-tris-high"}
- ]
- },
- {
- "id": "flappy",
- "name": "Flappy Bird",
- "version": "0.05",
- "description": "A Flappy Bird game clone",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot1_flappy.png"},{"url":"screenshot2_flappy.png"}],
- "tags": "game",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"flappy.app.js","url":"app.js"},
- {"name":"flappy.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "gpsinfo",
- "name": "GPS Info",
- "version": "0.06",
- "description": "An application that displays information about altitude, lat/lon, satellites and time",
- "icon": "gps-info.png",
- "type": "app",
- "tags": "gps",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"gpsinfo.app.js","url":"gps-info.js"},
- {"name":"gpsinfo.img","url":"gps-info-icon.js","evaluate":true}
- ]
- },
- {
- "id": "assistedgps",
- "name": "Assisted GPS Update (AGPS)",
- "version": "0.01",
- "description": "Downloads assisted GPS (AGPS) data to Bangle.js 1 for faster GPS startup and more accurate fixes. **No app will be installed**, this just uploads new data to the GPS chip.",
- "icon": "app.png",
- "type": "RAM",
- "tags": "tool,outdoors,agps",
- "supports": ["BANGLEJS"],
- "custom": "custom.html",
- "storage": []
- },
- {
- "id": "pomodo",
- "name": "Pomodoro",
- "version": "0.02",
- "description": "A simple pomodoro timer.",
- "icon": "pomodoro.png",
- "type": "app",
- "tags": "pomodoro,cooking,tools",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle2-pomodoro-screenshot.png"}],
- "storage": [
- {"name":"pomodo.app.js","url":"pomodoro.js"},
- {"name":"pomodo.img","url":"pomodoro-icon.js","evaluate":true}
- ]
- },
- {
- "id": "blobclk",
- "name": "Large Digit Blob Clock",
- "shortName": "Blob Clock",
- "version": "0.06",
- "description": "A clock with big digits",
- "icon": "clock-blob.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle2-large-digit-blob-clock-screenshot.png"},{"url":"bangle1-large-digit-blob-clock-screenshot.png"}],
- "storage": [
- {"name":"blobclk.app.js","url":"clock-blob.js"},
- {"name":"blobclk.img","url":"clock-blob-icon.js","evaluate":true}
- ]
- },
- {
- "id": "boldclk",
- "name": "Bold Clock",
- "version": "0.05",
- "description": "Simple, readable and practical clock",
- "icon": "bold_clock.png",
- "screenshots": [{"url":"screenshot_bold.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"boldclk.app.js","url":"bold_clock.js"},
- {"name":"boldclk.img","url":"bold_clock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widclk",
- "name": "Digital clock widget",
- "version": "0.06",
- "description": "A simple digital clock widget",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widclk.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "widpedom",
- "name": "Pedometer widget",
- "version": "0.20",
- "description": "Daily pedometer widget",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widpedom.wid.js","url":"widget.js"},
- {"name":"widpedom.settings.js","url":"settings.js"}
- ]
- },
- {
- "id": "berlinc",
- "name": "Berlin Clock",
- "version": "0.05",
- "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)",
- "icon": "berlin-clock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"berlin-clock-screenshot.png"}],
- "storage": [
- {"name":"berlinc.app.js","url":"berlin-clock.js"},
- {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "ctrclk",
- "name": "Centerclock",
- "version": "0.03",
- "description": "Watch-centered digital 24h clock with date in dd.mm.yyyy format.",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"bangle1-center-clock-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"ctrclk.app.js","url":"app.js"},
- {"name":"ctrclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "demoapp",
- "name": "Demo Loop",
- "version": "0.02",
- "description": "Simple demo app - displays Bangle.js, JS logo, graphics, and Bangle.js information",
- "icon": "app.png",
- "type": "app",
- "tags": "",
- "screenshots": [{"url":"bangle1-demo-loop-screenshot1.png"},{"url":"bangle1-demo-loop-screenshot2.png"},{"url":"bangle1-demo-loop-screenshot3.png"},{"url":"bangle1-demo-loop-screenshot4.png"}],
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "storage": [
- {"name":"demoapp.app.js","url":"app.js"},
- {"name":"demoapp.img","url":"app-icon.js","evaluate":true}
- ],
- "sortorder": -9
- },
- {
- "id": "flagrse",
- "name": "Espruino Flag Raiser",
- "version": "0.01",
- "description": "App to send a command to another Espruino to cause it to raise a flag",
- "icon": "app.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"flagrse.app.js","url":"app.js"},
- {"name":"flagrse.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "pipboy",
- "name": "Pipboy",
- "version": "0.04",
- "description": "Pipboy themed clock",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-pipboy-themed-clock-screenshot.png"}],
- "storage": [
- {"name":"pipboy.app.js","url":"app.js"},
- {"name":"pipboy.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "torch",
- "name": "Torch",
- "shortName": "Torch",
- "version": "0.02",
- "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets",
- "icon": "app.png",
- "tags": "tool,torch",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"torch.app.js","url":"app.js"},
- {"name":"torch.wid.js","url":"widget.js"},
- {"name":"torch.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "rtorch",
- "name": "Red Torch",
- "shortName": "RedTorch",
- "version": "0.02",
- "description": "Turns screen RED to help you see in the dark without breaking your night vision. Select from the launcher or on Bangle 1 press BTN3,BTN1,BTN3,BTN1 quickly to start when in any app that shows widgets",
- "icon": "app.png",
- "tags": "tool,torch",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"rtorch.app.js","url":"app.js"},
- {"name":"rtorch.wid.js","url":"widget.js", "supports": ["BANGLEJS"]},
- {"name":"rtorch.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "wohrm",
- "name": "Workout HRM",
- "version": "0.08",
- "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.",
- "icon": "app.png",
- "type": "app",
- "tags": "hrm,workout",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-workout-HRM-screenshot.png"}],
- "storage": [
- {"name":"wohrm.app.js","url":"app.js"},
- {"name":"wohrm.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widid",
- "name": "Bluetooth ID Widget",
- "version": "0.03",
- "description": "Display the last two tuple of your Bangle.js MAC address in the widget section. This is useful for figuring out which Bangle.js to connect to if you have more than one Bangle.js!",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,address,mac",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widid.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "grocery",
- "name": "Grocery",
- "version": "0.02",
- "description": "Simple grocery (shopping) list - Display a list of product and track if you already put them in your cart.",
- "icon": "grocery.png",
- "type": "app",
- "tags": "tool,outdoors,shopping,list",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "custom": "grocery.html",
- "allow_emulator": true,
- "storage": [
- {"name":"grocery.app.js","url":"app.js"},
- {"name":"grocery.img","url":"grocery-icon.js","evaluate":true}
- ]
- },
- {
- "id": "marioclock",
- "name": "Mario Clock",
- "version": "0.15",
- "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.",
- "icon": "marioclock.png",
- "type": "clock",
- "tags": "clock,mario,retro",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": false,
- "screenshots": [{"url":"bangle1-mario-clock-screenshot.png"}],
- "storage": [
- {"name":"marioclock.app.js","url":"marioclock-app.js"},
- {"name":"marioclock.img","url":"marioclock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "cliock",
- "name": "Commandline-Clock",
- "shortName": "CLI-Clock",
- "version": "0.15",
- "description": "Simple CLI-Styled Clock",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot_cli.png"}],
- "type": "clock",
- "tags": "clock,cli,command,bash,shell",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"cliock.app.js","url":"app.js"},
- {"name":"cliock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widver",
- "name": "Firmware Version Widget",
- "version": "0.03",
- "description": "Display the version of the installed firmware in the top widget section.",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,tool,system",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widver.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "barclock",
- "name": "Bar Clock",
- "version": "0.09",
- "description": "A simple digital clock showing seconds as a bar",
- "icon": "clock-bar.png",
- "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_pm.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"barclock.app.js","url":"clock-bar.js"},
- {"name":"barclock.img","url":"clock-bar-icon.js","evaluate":true}
- ]
- },
- {
- "id": "dotclock",
- "name": "Dot Clock",
- "version": "0.03",
- "description": "A Minimal Dot Analog Clock",
- "icon": "clock-dot.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle2-dot-clcok-screenshot.png"},{"url":"bangle1-dot-clock-screenshot.png"}],
- "storage": [
- {"name":"dotclock.app.js","url":"clock-dot.js"},
- {"name":"dotclock.img","url":"clock-dot-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widtbat",
- "name": "Tiny Battery Widget",
- "version": "0.02",
- "description": "Tiny blueish battery widget, vibs and changes level color when charging",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,tool,system",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widtbat.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "chrono",
- "name": "Chrono",
- "shortName": "Chrono",
- "version": "0.01",
- "description": "Single click BTN1 to add 5 minutes. Single click BTN2 to add 30 seconds. Single click BTN3 to add 5 seconds. Tap to pause or play to timer. Double click BTN1 to reset. When timer finishes the watch vibrates.",
- "icon": "chrono.png",
- "tags": "tool",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"chrono.app.js","url":"chrono.js"},
- {"name":"chrono.img","url":"chrono-icon.js","evaluate":true}
- ]
- },
- {
- "id": "astrocalc",
- "name": "Astrocalc",
- "version": "0.02",
- "description": "Calculates interesting information on the sun and moon cycles for the current day based on your location.",
- "icon": "astrocalc.png",
- "tags": "app,sun,moon,cycles,tool,outdoors",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "storage": [
- {"name":"astrocalc.app.js","url":"astrocalc-app.js"},
- {"name":"suncalc.js","url":"suncalc.js"},
- {"name":"astrocalc.img","url":"astrocalc-icon.js","evaluate":true},
- {"name":"first-quarter.img","url":"first-quarter-icon.js","evaluate":true},
- {"name":"last-quarter.img","url":"last-quarter-icon.js","evaluate":true},
- {"name":"waning-crescent.img","url":"waning-crescent-icon.js","evaluate":true},
- {"name":"waning-gibbous.img","url":"waning-gibbous-icon.js","evaluate":true},
- {"name":"full.img","url":"full-icon.js","evaluate":true},
- {"name":"new.img","url":"new-icon.js","evaluate":true},
- {"name":"waxing-gibbous.img","url":"waxing-gibbous-icon.js","evaluate":true},
- {"name":"waxing-crescent.img","url":"waxing-crescent-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widhwt",
- "name": "Hand Wash Timer",
- "version": "0.01",
- "description": "Swipe your wrist over the watch face to start your personal Bangle.js hand wash timer for 35 sec. Start washing after the short buzz and stop after the long buzz.",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,tool",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"widhwt.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "toucher",
- "name": "Touch Launcher",
- "shortName": "Toucher",
- "version": "0.07",
- "description": "Touch enable left to right launcher.",
- "icon": "app.png",
- "type": "launch",
- "tags": "tool,system,launcher",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"toucher.app.js","url":"app.js"},
- {"name":"toucher.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"toucher.json"}]
- },
- {
- "id": "balltastic",
- "name": "Balltastic",
- "version": "0.02",
- "description": "Simple but fun ball eats dots game.",
- "icon": "app.png",
- "type": "app",
- "tags": "game,fun",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"balltastic.app.js","url":"app.js"},
- {"name":"balltastic.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "rpgdice",
- "name": "RPG dice",
- "version": "0.02",
- "description": "Simple RPG dice rolling app.",
- "icon": "rpgdice.png",
- "type": "app",
- "tags": "game,fun",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-rpg-dice-screenshot.png"}],
- "storage": [
- {"name":"rpgdice.app.js","url":"app.js"},
- {"name":"rpgdice.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widmp",
- "name": "Moon Phase Widget",
- "version": "0.02",
- "description": "Display the current moon phase in blueish for the northern hemisphere in eight phases",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,tools",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widmp.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "widmpsh",
- "name": "Moon Phase Widget Southern Hemisphere",
- "version": "0.01",
- "description": "Display the current moon phase in blueish for the southern hemisphere in eight phases",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,tools",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widmpsh.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "minionclk",
- "name": "Minion clock",
- "version": "0.05",
- "description": "Minion themed clock.",
- "icon": "minionclk.png",
- "type": "clock",
- "tags": "clock,minion",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-minion-clock-screenshot.png"}],
- "storage": [
- {"name":"minionclk.app.js","url":"app.js"},
- {"name":"minionclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "openstmap",
- "name": "OpenStreetMap",
- "shortName": "OpenStMap",
- "version": "0.11",
- "description": "Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are. Once installed this also adds map functionality to `GPS Recorder` and `Recorder` apps",
- "icon": "app.png",
- "tags": "outdoors,gps,osm",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "screenshots": [{"url":"screenshot.png"}],
- "custom": "custom.html",
- "customConnect": true,
- "storage": [
- {"name":"openstmap","url":"openstmap.js"},
- {"name":"openstmap.app.js","url":"app.js"},
- {"name":"openstmap.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "activepedom",
- "name": "Active Pedometer",
- "shortName": "Active Pedometer",
- "version": "0.09",
- "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.",
- "icon": "app.png",
- "tags": "outdoors,widget",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"activepedom.wid.js","url":"widget.js"},
- {"name":"activepedom.settings.js","url":"settings.js"},
- {"name":"activepedom.img","url":"app-icon.js","evaluate":true},
- {"name":"activepedom.app.js","url":"app.js"}
- ]
- },
- {
- "id": "chronowid",
- "name": "Chrono Widget",
- "shortName": "Chrono Widget",
- "version": "0.05",
- "description": "Chronometer (timer) which runs as widget.",
- "icon": "app.png",
- "tags": "tool,widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "screenshots": [{"url":"screenshot.png"}],
- "readme": "README.md",
- "storage": [
- {"name":"chronowid.wid.js","url":"widget.js"},
- {"name":"chronowid.app.js","url":"app.js"},
- {"name":"chronowid.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "tabata",
- "name": "Tabata",
- "shortName": "Tabata - Control High-Intensity Interval Training",
- "version": "0.01",
- "description": "Control high-intensity interval training (according to tabata: https://en.wikipedia.org/wiki/Tabata_method).",
- "icon": "tabata.png",
- "tags": "workout,health",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"tabata.app.js","url":"tabata.js"},
- {"name":"tabata.img","url":"tabata-icon.js","evaluate":true}
- ]
- },
- {
- "id": "custom",
- "name": "Custom Boot Code ",
- "version": "0.01",
- "description": "Add code you want to run at boot time",
- "icon": "custom.png",
- "type": "bootloader",
- "tags": "tool,system",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "custom": "custom.html",
- "storage": [
- {"name":"custom"}
- ]
- },
- {
- "id": "devstopwatch",
- "name": "Dev Stopwatch",
- "shortName": "Dev Stopwatch",
- "version": "0.03",
- "description": "Stopwatch with 5 laps supported (cyclically replaced)",
- "icon": "app.png",
- "tags": "stopwatch,chrono,timer,chronometer",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "screenshots": [{"url":"bangle1-dev-stopwatch-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"devstopwatch.app.js","url":"app.js"},
- {"name":"devstopwatch.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "batchart",
- "name": "Battery Chart",
- "shortName": "Battery Chart",
- "version": "0.10",
- "description": "A widget and an app for recording and visualizing battery percentage over time.",
- "icon": "app.png",
- "tags": "app,widget,battery,time,record,chart,tool",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"batchart.wid.js","url":"widget.js"},
- {"name":"batchart.app.js","url":"app.js"},
- {"name":"batchart.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "nato",
- "name": "NATO Alphabet",
- "shortName": "NATOAlphabet",
- "version": "0.01",
- "description": "Learn the NATO Phonetic alphabet plus some numbers.",
- "icon": "nato.png",
- "type": "app",
- "tags": "app,learn,visual",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-NATO-alphabet-screenshot.png"},{"url":"bangle1-NATO-alphabet-screenshot2.png"}],
- "storage": [
- {"name":"nato.app.js","url":"nato.js"},
- {"name":"nato.img","url":"nato-icon.js","evaluate":true}
- ]
- },
- {
- "id": "numerals",
- "name": "Numerals Clock",
- "shortName": "Numerals Clock",
- "version": "0.10",
- "description": "A simple big numerals clock",
- "icon": "numerals.png",
- "type": "clock",
- "tags": "numerals,clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-numerals-screenshot.png"}],
- "storage": [
- {"name":"numerals.app.js","url":"numerals.app.js"},
- {"name":"numerals.img","url":"numerals-icon.js","evaluate":true},
- {"name":"numerals.settings.js","url":"numerals.settings.js"}
- ],
- "data": [{"name":"numerals.json"}]
- },
- {
- "id": "bledetect",
- "name": "BLE Detector",
- "shortName": "BLE Detector",
- "version": "0.03",
- "description": "Detect BLE devices and show some informations.",
- "icon": "bledetect.png",
- "tags": "app,bluetooth,tool",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"bledetect.app.js","url":"bledetect.js"},
- {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true}
- ]
- },
- {
- "id": "snake",
- "name": "Snake",
- "shortName": "Snake",
- "version": "0.02",
- "description": "The classic snake game. Eat apples and don't bite your tail.",
- "icon": "snake.png",
- "tags": "game,fun",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"snake.app.js","url":"snake.js"},
- {"name":"snake.img","url":"snake-icon.js","evaluate":true}
- ]
- },
- { "id": "snek",
- "name": "The snek game",
- "shortName":"Snek",
- "version": "0.02",
- "description": "A snek game where you control a snek to eat all the apples!",
- "screenshots": [{"url":"screenshot_snek.png"}],
- "icon": "snek.png",
- "supports": ["BANGLEJS2"],
- "tags": "game,fun",
- "storage": [
- {"name":"snek.app.js","url":"snek.js"},
- {"name":"snek.img","url":"snek.icon.js","evaluate":true}
- ]
- },
- {
- "id": "calculator",
- "name": "Calculator",
- "shortName": "Calculator",
- "version": "0.05",
- "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.",
- "icon": "calculator.png",
- "screenshots": [{"url":"screenshot_calculator.png"}],
- "tags": "app,tool",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"calculator.app.js","url":"app.js"},
- {"name":"calculator.img","url":"calculator-icon.js","evaluate":true}
- ]
- },
- {
- "id": "dane",
- "name": "Digital Assistant, not EDITH",
- "shortName": "DANE",
- "version": "0.16",
- "description": "A Watchface inspired by Tony Stark's EDITH and based on https://arwes.dev/",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "storage": [
- {"name":"dane.app.js","url":"app.js"},
- {"name":"dane.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "dane_tcr",
- "name": "DANE Touch Launcher",
- "shortName": "DANE Toucher",
- "version": "0.07",
- "description": "Touch enable left to right launcher in the style of the DANE Watchface",
- "icon": "app.png",
- "type": "launch",
- "tags": "tool,system,launcher",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"dane_tcr.app.js","url":"app.js"},
- {"name":"dane_tcr.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"dane_tcr.json"}]
- },
- {
- "id": "buffgym",
- "name": "BuffGym",
- "version": "0.02",
- "description": "BuffGym is the famous 5x5 workout program for the BangleJS",
- "icon": "buffgym.png",
- "type": "app",
- "tags": "tool,outdoors,gym,exercise",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "interface": "buffgym.html",
- "allow_emulator": false,
- "storage": [
- {"name":"buffgym.app.js","url":"buffgym.app.js"},
- {"name":"buffgym-set.js","url":"buffgym-set.js"},
- {"name":"buffgym-exercise.js","url":"buffgym-exercise.js"},
- {"name":"buffgym-workout.js","url":"buffgym-workout.js"},
- {"name":"buffgym-workout-a.json","url":"buffgym-workout-a.json"},
- {"name":"buffgym-workout-b.json","url":"buffgym-workout-b.json"},
- {"name":"buffgym-workout-index.json","url":"buffgym-workout-index.json"},
- {"name":"buffgym.img","url":"buffgym-icon.js","evaluate":true}
- ]
- },
- {
- "id": "banglerun",
- "name": "BangleRun",
- "shortName": "BangleRun",
- "version": "0.10",
- "description": "An app for running sessions. Displays info and logs your run for later viewing.",
- "icon": "banglerun.png",
- "tags": "run,running,fitness,outdoors",
- "supports": ["BANGLEJS"],
- "interface": "interface.html",
- "allow_emulator": false,
- "storage": [
- {"name":"banglerun.app.js","url":"app.js"},
- {"name":"banglerun.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "metronome",
- "name": "Metronome",
- "version": "0.07",
- "readme": "README.md",
- "description": "Makes the watch blinking and vibrating with a given rate",
- "icon": "metronome_icon.png",
- "tags": "tool",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-metronome-screenshot.png"}],
- "storage": [
- {"name":"metronome.app.js","url":"metronome.js"},
- {"name":"metronome.img","url":"metronome-icon.js","evaluate":true},
- {"name":"metronome.settings.js","url":"settings.js"}
- ]
- },
- {
- "id": "blackjack",
- "name": "Black Jack game",
- "shortName": "Black Jack game",
- "version": "0.02",
- "description": "Simple implementation of card game Black Jack",
- "icon": "blackjack.png",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"bangle1-black-jack-game-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"blackjack.app.js","url":"blackjack.app.js"},
- {"name":"blackjack.img","url":"blackjack-icon.js","evaluate":true}
- ]
- },
- {
- "id": "hidcam",
- "name": "Camera shutter",
- "shortName": "Cam shutter",
- "version": "0.03",
- "description": "Enable HID, connect to your phone, start your camera and trigger the shot on your Bangle",
- "icon": "app.png",
- "tags": "bluetooth,tool",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"hidcam.app.js","url":"app.js"},
- {"name":"hidcam.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "swlclk",
- "name": "SWL Clock / Short Wave Listner Clock",
- "shortName": "SWL Clock",
- "version": "0.02",
- "description": "Display Local, UTC time and some programs on the shorts waves along the day, with the frequencies",
- "icon": "swlclk.png",
- "type": "clock",
- "tags": "tool,clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-SWL-clock-screenshot.png"}],
- "storage": [
- {"name":"swlclk.app.js","url":"app.js"},
- {"name":"swlclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "rclock",
- "name": "Round clock with seconds, minutes and date",
- "shortName": "Round Clock",
- "version": "0.06",
- "description": "Designed round clock with ticks for minutes and seconds and heart rate indication",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"rclock.app.js","url":"rclock.app.js"},
- {"name":"rclock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "fclock",
- "name": "fclock",
- "shortName": "F Clock",
- "version": "0.02",
- "description": "Simple design of a digital clock",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"fclock.app.js","url":"fclock.app.js"},
- {"name":"fclock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "hamloc",
- "name": "QTH Locator / Maidenhead Locator System",
- "shortName": "QTH Locator",
- "version": "0.01",
- "description": "Convert your current GPS location to the Maidenhead locator system used by HAM amateur radio operators",
- "icon": "app.png",
- "tags": "tool,outdoors,gps",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"hamloc.app.js","url":"app.js"},
- {"name":"hamloc.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "osmpoi",
- "name": "POI Compass",
- "version": "0.03",
- "description": "Uploads all the points of interest in an area onto your watch, same as Beer Compass with more p.o.i.",
- "icon": "app.png",
- "tags": "tool,outdoors,gps",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "custom": "custom.html",
- "storage": [
- {"name":"osmpoi.app.js"},
- {"name":"osmpoi.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "pong",
- "name": "Pong",
- "shortName": "Pong",
- "version": "0.03",
- "description": "A clone of the Atari game Pong",
- "icon": "pong.png",
- "type": "app",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-pong-screenshot.png"}],
- "storage": [
- {"name":"pong.app.js","url":"app.js"},
- {"name":"pong.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "ballmaze",
- "name": "Ball Maze",
- "version": "0.02",
- "description": "Navigate a ball through a maze by tilting your watch.",
- "icon": "icon.png",
- "type": "app",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"ballmaze.app.js","url":"app.js"},
- {"name":"ballmaze.img","url":"icon.js","evaluate":true}
- ],
- "data": [{"name":"ballmaze.json"}]
- },
- {
- "id": "calendar",
- "name": "Calendar",
- "version": "0.06",
- "description": "Simple calendar",
- "icon": "calendar.png",
- "screenshots": [{"url":"screenshot_calendar.png"}],
- "tags": "calendar",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"calendar.app.js","url":"calendar.js"},
- {"name":"calendar.settings.js","url":"settings.js"},
- {"name":"calendar.img","url":"calendar-icon.js","evaluate":true}
- ],
- "data": [{"name":"calendar.json"}]
- },
- {
- "id": "hidjoystick",
- "name": "Bluetooth Joystick",
- "shortName": "Joystick",
- "version": "0.01",
- "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.",
- "icon": "app.png",
- "tags": "bluetooth",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"hidjoystick.app.js","url":"app.js"},
- {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "largeclock",
- "name": "Large Clock",
- "version": "0.10",
- "description": "A readable and informational digital watch, with date, seconds and moon phase",
- "icon": "largeclock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-large-clock-screenshot.png"}],
- "storage": [
- {"name":"largeclock.app.js","url":"largeclock.js"},
- {"name":"largeclock.img","url":"largeclock-icon.js","evaluate":true},
- {"name":"largeclock.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"largeclock.json"}]
- },
- {
- "id": "smtswch",
- "name": "Smart Switch",
- "shortName": "Smart Switch",
- "version": "0.01",
- "description": "Using EspruinoHub, control your smart devices on and off via Bluetooth Low Energy!",
- "icon": "app.png",
- "type": "app",
- "tags": "bluetooth,btle,smart,switch",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"smtswch.app.js","url":"app.js"},
- {"name":"smtswch.img","url":"app-icon.js","evaluate":true},
- {"name":"light-on.img","url":"light-on.js","evaluate":true},
- {"name":"light-off.img","url":"light-off.js","evaluate":true},
- {"name":"switch-on.img","url":"switch-on.js","evaluate":true},
- {"name":"switch-off.img","url":"switch-off.js","evaluate":true}
- ]
- },
- {
- "id": "miplant",
- "name": "Xiaomi Plant Sensor",
- "shortName": "Mi Plant",
- "version": "0.02",
- "description": "Reads and displays data from Xiaomi bluetooth plant moisture sensors",
- "icon": "app.png",
- "tags": "xiaomi,mi,plant,ble,bluetooth",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"miplant.app.js","url":"app.js"},
- {"name":"miplant.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "simpletimer",
- "name": "Timer",
- "version": "0.07",
- "description": "Simple timer, useful when playing board games or cooking",
- "icon": "app.png",
- "tags": "timer",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-timer-screenshot.png"}],
- "storage": [
- {"name":"simpletimer.app.js","url":"app.js"},
- {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true},
- {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true},
- {"name":"simpletimer.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [{"name":"simpletimer.json"}]
- },
- {
- "id": "beebclock",
- "name": "Beeb Clock",
- "version": "0.05",
- "description": "Clock face that may be coincidentally familiar to BBC viewers",
- "icon": "beebclock.png",
- "type": "clock",
- "tags": "clock",
- "screenshots": [{"url":"bangle1-beeb-clock-screenshot.png"}],
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "storage": [
- {"name":"beebclock.app.js","url":"beebclock.js"},
- {"name":"beebclock.img","url":"beebclock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "findphone",
- "name": "Find Phone",
- "shortName": "Find Phone",
- "version": "0.03",
- "description": "Find your phone via Gadgetbridge. Click any button to let your phone ring. 📳 Note: The functionality is available even without this app, just go to Settings, App Settings, Gadgetbridge, Find Phone.",
- "icon": "app.png",
- "tags": "tool,android",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"findphone.app.js","url":"app.js"},
- {"name":"findphone.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "getup",
- "name": "Get Up",
- "shortName": "Get Up",
- "version": "0.01",
- "description": "Reminds you to getup every x minutes. Sitting to long is dangerous!",
- "icon": "app.png",
- "tags": "tools,health",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "screenshots": [{"url":"bangle1-get-up-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"getup.app.js","url":"app.js"},
- {"name":"getup.settings.js","url":"settings.js"},
- {"name":"getup.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "gallifr",
- "name": "Time Traveller's Chronometer",
- "shortName": "Time Travel Clock",
- "version": "0.02",
- "description": "A clock for time travellers. The light pie segment shows the minutes, the black circle, the hour. The dial itself reads 'time' just in case you forget.",
- "icon": "gallifr.png",
- "screenshots": [{"url":"screenshot_time.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"gallifr.app.js","url":"app.js"},
- {"name":"gallifr.img","url":"app-icon.js","evaluate":true},
- {"name":"gallifr.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"gallifr.json"}]
- },
- {
- "id": "rndmclk",
- "name": "Random Clock Loader",
- "version": "0.03",
- "description": "Load a different clock whenever the LCD is switched on.",
- "icon": "rndmclk.png",
- "type": "widget",
- "tags": "widget,clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"rndmclk.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "dotmatrixclock",
- "name": "Dotmatrix Clock",
- "version": "0.01",
- "description": "A clear white-on-blue dotmatrix simulated clock",
- "icon": "dotmatrixclock.png",
- "type": "clock",
- "tags": "clock,dotmatrix,retro",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"dotmatrixclock.app.js","url":"app.js"},
- {"name":"dotmatrixclock.img","url":"dotmatrixclock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "jbm8b",
- "name": "Magic 8 Ball",
- "shortName": "Magic 8 Ball",
- "version": "0.03",
- "description": "A simple fortune telling app",
- "icon": "app.png",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"jbm8b.app.js","url":"app.js"},
- {"name":"jbm8b.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "jbm8b_IT",
- "name": "Magic 8 Ball Italiano",
- "shortName": "Magic 8 Ball IT",
- "version": "0.01",
- "description": "La palla predice il futuro",
- "icon": "app.png",
- "screenshots": [{"url":"bangle1-magic-8-ball-italiano-screenshot.png"}],
- "tags": "game",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "storage": [
- {"name":"jbm8b_IT.app.js","url":"app.js"},
- {"name":"jbm8b_IT.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "BLEcontroller",
- "name": "BLE Customisable Controller with Joystick",
- "shortName": "BLE Controller",
- "version": "0.01",
- "description": "A configurable controller for BLE devices and robots, with a basic four direction joystick. Designed to be easy to customise so you can add your own menus.",
- "icon": "BLEcontroller.png",
- "tags": "tool,bluetooth",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": false,
- "storage": [
- {"name":"BLEcontroller.app.js","url":"app.js"},
- {"name":"BLEcontroller.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widviz",
- "name": "Widget Visibility Widget",
- "shortName": "Viz Widget",
- "version": "0.03",
- "description": "Swipe left to hide top bar widgets, swipe right to redisplay.",
- "icon": "eye.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widviz.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "binclock",
- "name": "Binary Clock",
- "shortName": "Binary Clock",
- "version": "0.03",
- "description": "A binary clock with hours and minutes. BTN1 toggles a digital clock.",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock,binary",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"binclock.app.js","url":"app.js"},
- {"name":"binclock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "pizzatimer",
- "name": "Pizza Timer",
- "shortName": "Pizza Timer",
- "version": "0.01",
- "description": "A timer app for when you cook Pizza. Some say it can also time other things",
- "icon": "pizza.png",
- "tags": "timer,tool,pizza",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"pizzatimer.app.js","url":"app.js"},
- {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "animclk",
- "name": "Animated Clock",
- "shortName": "Anim Clock",
- "version": "0.03",
- "description": "An animated clock face using Mark Ferrari's amazing 8 bit game art and palette cycling: http://www.markferrari.com/art/8bit-game-art",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock,animated",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"animclk.app.js","url":"app.js"},
- {"name":"animclk.pixels1","url":"animclk.pixels1"},
- {"name":"animclk.pixels2","url":"animclk.pixels2"},
- {"name":"animclk.pal","url":"animclk.pal"},
- {"name":"animclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "analogimgclk",
- "name": "Analog Clock (Image background)",
- "shortName": "Analog Clock",
- "version": "0.03",
- "description": "An analog clock with an image background",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"analogimgclk.app.js","url":"app.js"},
- {"name":"analogimgclk.bg.img","url":"bg.img"},
- {"name":"analogimgclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "verticalface",
- "name": "Vertical watch face",
- "shortName": "Vertical Face",
- "version": "0.09",
- "description": "A simple vertical watch face with the date. Heart rate monitor is toggled with BTN1",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-vertical-watch-face-screenshot.png"}],
- "storage": [
- {"name":"verticalface.app.js","url":"app.js"},
- {"name":"verticalface.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "sleepphasealarm",
- "name": "SleepPhaseAlarm",
- "shortName": "SleepPhaseAlarm",
- "version": "0.02",
- "description": "Uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments (ESS, see https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en). This app will read the next alarm from the alarm application and will wake you up to 30 minutes early at the best guessed time when you are almost already awake.",
- "icon": "app.png",
- "tags": "alarm",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"sleepphasealarm.app.js","url":"app.js"},
- {"name":"sleepphasealarm.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "life",
- "name": "Game of Life",
- "version": "0.04",
- "description": "Conway's Game of Life - 16x16 board",
- "icon": "life.png",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"bangle1-game-of-life-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"life.app.js","url":"life.min.js"},
- {"name":"life.img","url":"life-icon.js","evaluate":true}
- ]
- },
- {
- "id": "magnav",
- "name": "Navigation Compass",
- "version": "0.05",
- "description": "Compass with linear display as for GPSNAV. Has Tilt compensation and remembers calibration.",
- "screenshots": [{"url":"screenshot-b2.png"},{"url":"screenshot-light-b2.png"}],
- "icon": "magnav.png",
- "tags": "tool,outdoors",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"magnav.app.js","url":"magnav_b1.js","supports":["BANGLEJS"]},
- {"name":"magnav.app.js","url":"magnav_b2.js","supports":["BANGLEJS2"]},
- {"name":"magnav.img","url":"magnav-icon.js","evaluate":true}
- ],
- "data": [{"name":"magnav.json"}]
- },
- {
- "id": "gpspoilog",
- "name": "GPS POI Logger",
- "shortName": "GPS POI Log",
- "version": "0.01",
- "description": "A simple app to log points of interest with their GPS coordinates and read them back onto your PC. Based on the https://www.espruino.com/Bangle.js+Storage tutorial",
- "icon": "app.png",
- "tags": "outdoors",
- "supports": ["BANGLEJS"],
- "interface": "interface.html",
- "storage": [
- {"name":"gpspoilog.app.js","url":"app.js"},
- {"name":"gpspoilog.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "miclock2",
- "name": "Mixed Clock 2",
- "version": "0.01",
- "description": "White color variant of the Mixed Clock with thicker clock hands for better readability in the bright sunlight, extra space under the clock for widgets and seconds in the digital clock.",
- "icon": "clock-mixed.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"bangle1-mixed-clock-2-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"miclock2.app.js","url":"clock-mixed.js"},
- {"name":"miclock2.img","url":"clock-mixed-icon.js","evaluate":true}
- ]
- },
- {
- "id": "1button",
- "name": "One-Button-Tracker",
- "version": "0.01",
- "description": "A widget that turns BTN1 into a tracker, records time of button press/release.",
- "icon": "widget.png",
- "type": "widget",
- "tags": "tool,quantifiedself,widget",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "interface": "interface.html",
- "storage": [
- {"name":"1button.wid.js","url":"widget.js"}
- ],
- "data": [{"name":"one_button_presses.csv","storageFile":true}]
- },
- {
- "id": "gpsautotime",
- "name": "GPS auto time",
- "shortName": "GPS auto time",
- "version": "0.01",
- "description": "A widget that automatically updates the Bangle.js time to the GPS time whenever there is a valid GPS fix.",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,gps",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"gpsautotime.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "espruinoctrl",
- "name": "Espruino Control",
- "shortName": "Espruino Ctrl",
- "version": "0.01",
- "description": "Send commands to other Espruino devices via the Bluetooth UART interface. Customisable commands!",
- "icon": "app.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "custom": "custom.html",
- "storage": [
- {"name":"espruinoctrl.app.js"},
- {"name":"espruinoctrl.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "multiclock",
- "name": "Multi Clock",
- "version": "0.09",
- "description": "Clock with multiple faces. Switch between faces with BTN1 & BTN3 (Bangle 2 touch top-right, bottom right). For best display set theme Background 2 to cyan or some other bright colour in settings.",
- "screenshots": [{"url":"screen-ana.png"},{"url":"screen-big.png"},{"url":"screen-td.png"},{"url":"screen-nifty.png"},{"url":"screen-word.png"},{"url":"screen-sec.png"}],
- "icon": "multiclock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"multiclock.app.js","url":"multiclock.app.js"},
- {"name":"big.face.js","url":"big.face.js"},
- {"name":"ana.face.js","url":"ana.face.js"},
- {"name":"digi.face.js","url":"digi.face.js"},
- {"name":"txt.face.js","url":"txt.face.js"},
- {"name":"dk.face.js","url":"dk.face.js"},
- {"name":"nifty.face.js","url":"nifty.face.js"},
- {"name":"multiclock.img","url":"multiclock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widancs",
- "name": "Apple Notification Widget",
- "shortName": "ANCS Widget",
- "version": "0.07",
- "description": "Displays call, message etc notifications from a paired iPhone. Read README before installation as it only works with compatible apps",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"widancs.wid.js","url":"ancs.min.js"},
- {"name":"widancs.settings.js","url":"settings.js"}
- ]
- },
- {
- "id": "accelrec",
- "name": "Acceleration Recorder",
- "shortName": "Accel Rec",
- "version": "0.02",
- "description": "This app puts the Bangle's accelerometer into 100Hz mode and reads 2 seconds worth of data after movement starts. The data can then be exported back to the PC.",
- "icon": "app.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "interface": "interface.html",
- "storage": [
- {"name":"accelrec.app.js","url":"app.js"},
- {"name":"accelrec.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [{"wildcard":"accelrec.?.csv"}]
- },
- {
- "id": "accellog",
- "name": "Acceleration Logger",
- "shortName": "Accel Log",
- "version": "0.03",
- "description": "Logs XYZ acceleration data to a CSV file that can be downloaded to your PC",
- "icon": "app.png",
- "tags": "outdoor",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "interface": "interface.html",
- "storage": [
- {"name":"accellog.app.js","url":"app.js"},
- {"name":"accellog.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [{"wildcard":"accellog.?.csv"}]
- },
- {
- "id": "cprassist",
- "name": "CPR Assist",
- "version": "0.02",
- "description": "Provides assistance while performing a CPR",
- "icon": "cprassist-icon.png",
- "tags": "tool,firstaid",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-CPR-assist-screenshot.png"}],
- "storage": [
- {"name":"cprassist.app.js","url":"cprassist.js"},
- {"name":"cprassist.img","url":"cprassist-icon.js","evaluate":true},
- {"name":"cprassist.settings.js","url":"settings.js"}
- ]
- },
- {
- "id": "osgridref",
- "name": "Ordnance Survey Grid Reference",
- "shortName": "OS Grid ref",
- "version": "0.01",
- "description": "Displays the UK Ordnance Survey grid reference of your current GPS location. Useful when in the United Kingdom with an Ordnance Survey map",
- "icon": "app.png",
- "tags": "outdoors,gps",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"osgridref.app.js","url":"app.js"},
- {"name":"osgridref.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "openseizure",
- "name": "OpenSeizureDetector Widget",
- "shortName": "Short Name",
- "version": "0.01",
- "description": "[BETA!] A widget to work alongside [OpenSeizureDetector](https://www.openseizuredetector.org.uk/)",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"openseizure.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "counter",
- "name": "Counter",
- "version": "0.03",
- "description": "Simple counter",
- "icon": "counter_icon.png",
- "tags": "tool",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"bangle1-counter-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"counter.app.js","url":"counter.js"},
- {"name":"counter.img","url":"counter-icon.js","evaluate":true}
- ]
- },
- {
- "id": "bootgattbat",
- "name": "BLE GATT Battery Service",
- "shortName": "BLE Battery Service",
- "version": "0.01",
- "description": "Adds the GATT Battery Service to advertise the percentage of battery currently remaining over Bluetooth.\n",
- "icon": "bluetooth.png",
- "type": "bootloader",
- "tags": "battery,ble,bluetooth,gatt",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"gattbat.boot.js","url":"boot.js"}
- ]
- },
- {
- "id": "viewstl",
- "name": "STL file viewer",
- "shortName": "ViewSTL",
- "version": "0.02",
- "description": "This app allows you to view STL 3D models on your watch",
- "icon": "icons8-octahedron-48.png",
- "tags": "tool",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"viewstl.app.js","url":"viewstl.min.js"},
- {"name":"viewstl.img","url":"viewstl-icon.js","evaluate":true},
- {"name":"tetra.stl","url":"tetra.stl"},
- {"name":"cube.stl","url":"cube.stl"},
- {"name":"icosa.stl","url":"icosa.stl"}
- ]
- },
- {
- "id": "cscsensor",
- "name": "Cycling speed sensor",
- "shortName": "CSCSensor",
- "version": "0.06",
- "description": "Read BLE enabled cycling speed and cadence sensor and display readings on watch",
- "icon": "icons8-cycling-48.png",
- "tags": "outdoors,exercise,ble,bluetooth",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"cscsensor.app.js","url":"cscsensor.app.js"},
- {"name":"cscsensor.settings.js","url":"settings.js"},
- {"name":"cscsensor.img","url":"cscsensor-icon.js","evaluate":true}
- ]
- },
- {
- "id": "fileman",
- "name": "File manager",
- "shortName": "FileManager",
- "version": "0.03",
- "description": "Simple file manager, allows user to examine watch storage and display, load or delete individual files",
- "icon": "icons8-filing-cabinet-48.png",
- "tags": "tools",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"fileman.app.js","url":"fileman.app.js"},
- {"name":"fileman.img","url":"fileman-icon.js","evaluate":true}
- ]
- },
- {
- "id": "worldclock",
- "name": "World Clock - 4 time zones",
- "shortName": "World Clock",
- "version": "0.05",
- "description": "Current time zone plus up to four others",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot_world.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "custom": "custom.html",
- "storage": [
- {"name":"worldclock.app.js","url":"app.js"},
- {"name":"worldclock.img","url":"worldclock-icon.js","evaluate":true}
- ],
- "data": [{"name":"worldclock.settings.json"}]
- },
- {
- "id": "digiclock",
- "name": "Digital Clock Face",
- "shortName": "Digi Clock",
- "version": "0.02",
- "description": "A simple digital clock with the time, day, month, and year",
- "icon": "digiclock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"digiclock.app.js","url":"digiclock.js"},
- {"name":"digiclock.img","url":"digiclock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "dsdrelay",
- "name": "DSD BLE Relay controller",
- "shortName": "DSDRelay",
- "version": "0.01",
- "description": "Control BLE relay board from the watch",
- "icon": "icons8-relay-48.png",
- "tags": "ble,bluetooth",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"dsdrelay.app.js","url":"dsdrelay.app.js"},
- {"name":"dsdrelay.img","url":"dsdrelay-icon.js","evaluate":true}
- ]
- },
- {
- "id": "mandel",
- "name": "Mandelbrot",
- "shortName": "Mandel",
- "version": "0.01",
- "description": "Draw a zoomable Mandelbrot set",
- "icon": "mandel.png",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"mandel.app.js","url":"mandel.min.js"},
- {"name":"mandel.img","url":"mandel-icon.js","evaluate":true}
- ]
- },
- {
- "id": "petrock",
- "name": "Pet rock",
- "version": "0.02",
- "description": "A virtual pet rock with wobbly eyes",
- "icon": "petrock.png",
- "type": "app",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"petrock.app.js","url":"app.js"},
- {"name":"petrock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "smartibot",
- "name": "Smartibot controller",
- "shortName": "Smartibot",
- "version": "0.01",
- "description": "Control a [Smartibot Robot](https://thecraftyrobot.net/) straight from your Bangle.js",
- "icon": "app.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"smartibot.app.js","url":"app.js"},
- {"name":"smartibot.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widncr",
- "name": "NCR Logo Widget",
- "version": "0.01",
- "description": "Show the NodeConf Remote logo in the top left",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"widncr.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "ncrclk",
- "name": "NCR Clock",
- "shortName": "NCR Clock",
- "version": "0.02",
- "description": "NodeConf Remote clock",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"ncrclk.app.js","url":"app.js"},
- {"name":"ncrclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "isoclock",
- "name": "ISO Compliant Clock Face",
- "shortName": "ISO Clock",
- "version": "0.02",
- "description": "Tweaked fork of digiclock for ISO date and time",
- "icon": "isoclock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"isoclock.app.js","url":"isoclock.js"},
- {"name":"isoclock.img","url":"isoclock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "gpstimeserver",
- "name": "GPS Time Server",
- "version": "0.01",
- "description": "A widget which automatically starts the GPS and turns Bangle.js into a Bluetooth time server.",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"gpstimeserver.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "tilthydro",
- "name": "Tilt Hydrometer Display",
- "shortName": "Tilt Hydro",
- "version": "0.01",
- "description": "A display for the [Tilt Hydrometer](https://tilthydrometer.com/) - [more info here](http://www.espruino.com/Tilt+Hydrometer+Display)",
- "icon": "app.png",
- "tags": "tools,bluetooth",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"tilthydro.app.js","url":"app.js"},
- {"name":"tilthydro.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "supmariodark",
- "name": "Super mario clock night mode",
- "shortName": "supmariodark",
- "version": "0.01",
- "description": "Super mario clock in night mode",
- "icon": "supmariodark.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"supmariodark.app.js","url":"supmariodark.js"},
- {"name":"supmariodark.img","url":"supmariodark-icon.js","evaluate":true},
- {"name":"supmario30x24.bin","url":"supmario30x24.bin.js"},
- {"name":"supmario30x24.wdt","url":"supmario30x24.wdt.js"},
- {"name":"banner-up.img","url":"banner-up.js","evaluate":true},
- {"name":"banner-down.img","url":"banner-down.js","evaluate":true},
- {"name":"brick2.img","url":"brick2.js","evaluate":true},
- {"name":"enemy.img","url":"enemy.js","evaluate":true},
- {"name":"flower.img","url":"flower.js","evaluate":true},
- {"name":"flower_b.img","url":"flower_b.js","evaluate":true},
- {"name":"mario_wh.img","url":"mario_wh.js","evaluate":true},
- {"name":"pipe.img","url":"pipe.js","evaluate":true}
- ]
- },
- {
- "id": "gmeter",
- "name": "G-Meter",
- "shortName": "G-Meter",
- "version": "0.01",
- "description": "Simple G-Meter",
- "icon": "app.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"gmeter.app.js","url":"app.js"},
- {"name":"gmeter.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "dtlaunch",
- "name": "Desktop Launcher",
- "version": "0.07",
- "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.",
- "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}],
- "icon": "icon.png",
- "type": "launch",
- "tags": "tool,system,launcher",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"dtlaunch.app.js","url":"app-b1.js", "supports": ["BANGLEJS"]},
- {"name":"dtlaunch.app.js","url":"app-b2.js", "supports": ["BANGLEJS2"]},
- {"name":"dtlaunch.settings.js","url":"settings-b1.js", "supports": ["BANGLEJS"]},
- {"name":"dtlaunch.settings.js","url":"settings-b2.js", "supports": ["BANGLEJS2"]},
- {"name":"dtlaunch.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [{"name":"dtlaunch.json"}]
- },
- {
- "id": "HRV",
- "name": "Heart Rate Variability monitor",
- "shortName": "HRV monitor",
- "version": "0.04",
- "description": "Heart Rate Variability monitor, see Readme for more info",
- "icon": "hrv.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"HRV.app.js","url":"app.js"},
- {"name":"HRV.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "hardalarm",
- "name": "Hard Alarm",
- "shortName": "HardAlarm",
- "version": "0.02",
- "description": "Make sure you wake up! Count to the right number to turn off the alarm",
- "icon": "app.png",
- "tags": "tool,alarm,widget",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"hardalarm.app.js","url":"app.js"},
- {"name":"hardalarm.boot.js","url":"boot.js"},
- {"name":"hardalarm.js","url":"hardalarm.js"},
- {"name":"hardalarm.img","url":"app-icon.js","evaluate":true},
- {"name":"hardalarm.wid.js","url":"widget.js"}
- ],
- "data": [{"name":"hardalarm.json"}]
- },
- {
- "id": "edisonsball",
- "name": "Edison's Ball",
- "shortName": "Edison's Ball",
- "version": "0.01",
- "description": "Hypnagogia/Micro-Sleep alarm for experimental use in exploring sleep transition and combating drowsiness",
- "icon": "app-icon.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"edisonsball.app.js","url":"app.js"},
- {"name":"edisonsball.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "hrrawexp",
- "name": "HRM Data Exporter",
- "shortName": "HRM Data Exporter",
- "version": "0.01",
- "description": "export raw hrm signal data to a csv file",
- "icon": "app-icon.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "interface": "interface.html",
- "storage": [
- {"name":"hrrawexp.app.js","url":"app.js"},
- {"name":"hrrawexp.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "breath",
- "name": "Breathing App",
- "shortName": "Breathing App",
- "version": "0.01",
- "description": "app to aid relaxation and train breath syncronicity using haptics and visualisation, also displays HR",
- "icon": "app-icon.png",
- "tags": "tools,health",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"breath.app.js","url":"app.js"},
- {"name":"breath.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [{"name":"breath.settings.json","url":"settings.json"}]
- },
- {
- "id": "lazyclock",
- "name": "Lazy Clock",
- "version": "0.03",
- "description": "Tells the time, roughly",
- "icon": "lazyclock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "screenshots": [{"url":"bangle1-lazy-clock-screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"lazyclock.app.js","url":"lazyclock-app.js"},
- {"name":"lazyclock.img","url":"lazyclock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "astral",
- "name": "Astral Clock",
- "version": "0.03",
- "description": "Clock that calculates and displays Alt Az positions of all planets, Sun as well as several other astronomy targets (customizable) and current Moon phase. Coordinates are calculated by GPS & time and onscreen compass assists orienting. See Readme before using.",
- "icon": "app-icon.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"astral.app.js","url":"app.js"},
- {"name":"astral.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "alpinenav",
- "name": "Alpine Nav",
- "version": "0.01",
- "description": "App that performs GPS monitoring to track and display position relative to a given origin in realtime",
- "icon": "app-icon.png",
- "tags": "outdoors,gps",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"alpinenav.app.js","url":"app.js"},
- {"name":"alpinenav.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "lifeclk",
- "name": "Game of Life Clock",
- "shortName": "Conway's Clock",
- "version": "0.06",
- "description": "Modification and clockification of Conway's Game of Life",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"lifeclk.app.js","url":"app.min.js"},
- {"name":"lifeclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "speedalt",
- "name": "GPS Adventure Sports",
- "shortName": "GPS Adv Sport",
- "version": "1.02",
- "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.",
- "icon": "app.png",
- "type": "app",
- "tags": "tool,outdoors",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"speedalt.app.js","url":"app.js"},
- {"name":"speedalt.img","url":"app-icon.js","evaluate":true},
- {"name":"speedalt.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"speedalt.json"}]
- },
- {
- "id": "speedalt2",
- "name": "GPS Adventure Sports II",
- "shortName":"GPS Adv Sport II",
- "version":"1.10",
- "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.",
- "icon": "app.png",
- "type": "app",
- "tags": "tool,outdoors",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"speedalt2.app.js","url":"app.js"},
- {"name":"speedalt2.img","url":"app-icon.js","evaluate":true},
- {"name":"speedalt2.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"speedalt2.json"}]
- },
- {
- "id": "slomoclock",
- "name": "SloMo Clock",
- "shortName": "SloMo Clock",
- "version": "0.10",
- "description": "Simple 24h clock face with large digits, hour above minute. Uses Layout library.",
- "icon": "watch.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-slow-mo-clock-screenshot.png"}],
- "storage": [
- {"name":"slomoclock.app.js","url":"app.js"},
- {"name":"slomoclock.img","url":"app-icon.js","evaluate":true},
- {"name":"slomoclock.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"slomoclock.json"}]
- },
- {
- "id": "de-stress",
- "name": "De-Stress",
- "shortName": "De-Stress",
- "version": "0.02",
- "description": "Simple haptic heartbeat",
- "icon": "app.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"de-stress.app.js","url":"app.js"},
- {"name":"de-stress.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "mclockplus",
- "name": "Morph Clock+",
- "shortName": "Morph Clock+",
- "version": "0.03",
- "description": "Morphing Clock with more readable seconds and date and additional stopwatch",
- "icon": "mclockplus.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"mclockplus.app.js","url":"mclockplus.app.js"},
- {"name":"mclockplus.img","url":"mclockplus-icon.js","evaluate":true}
- ]
- },
- {
- "id": "intervals",
- "name": "Intervals App",
- "shortName": "Intervals",
- "version": "0.01",
- "description": "Intervals for training. It is possible to configure work time and rest time and number of sets.",
- "icon": "intervals.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"intervals.app.js","url":"intervals.app.js"},
- {"name":"intervals.img","url":"intervals-icon.js","evaluate":true}
- ]
- },
- {
- "id": "planetarium",
- "name": "Planetarium",
- "shortName": "Planetarium",
- "version": "0.03",
- "description": "Planetarium showing up to 500 stars using the watch location and time",
- "icon": "planetarium.png",
- "tags": "",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"planetarium.app.js","url":"planetarium.app.js"},
- {"name":"planetarium.data.csv","url":"planetarium.data.csv"},
- {"name":"planetarium.const.csv","url":"planetarium.const.csv"},
- {"name":"planetarium.extra.csv","url":"planetarium.extra.csv"},
- {"name":"planetarium.settings.js","url":"settings.js"},
- {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true}
- ],
- "data": [{"name":"planetarium.json"}]
- },
- {
- "id": "tapelauncher",
- "name": "Tape Launcher",
- "version": "0.02",
- "description": "An App launcher, icons displayed in a horizontal tape, swipe or use buttons",
- "icon": "icon.png",
- "type": "launch",
- "tags": "tool,system,launcher",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"tapelauncher.app.js","url":"app.js"},
- {"name":"tapelauncher.img","url":"icon.js","evaluate":true}
- ]
- },
- {
- "id": "oblique",
- "name": "Oblique Strategies",
- "version": "0.01",
- "description": "Oblique Strategies for creativity. Copied from Brian Eno.",
- "icon": "eno.png",
- "tags": "tool",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"oblique.app.js","url":"app.js"},
- {"name":"oblique.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "testuserinput",
- "name": "Test User Input",
- "shortName": "Test User Input",
- "version": "0.06",
- "description": "App to test the bangle.js input interface. It displays the user action in text, circle buttons or on/off switch UI elements.",
- "icon": "app.png",
- "tags": "input,interface,buttons,touch,UI",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"testuserinput.app.js","url":"app.js"},
- {"name":"testuserinput.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "gpssetup",
- "name": "GPS Setup",
- "shortName": "GPS Setup",
- "version": "0.02",
- "description": "Configure the GPS power options and store them in the GPS nvram",
- "icon": "gpssetup.png",
- "tags": "gps,tools,outdoors",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"gpssetup","url":"gpssetup.js"},
- {"name":"gpssetup.settings.js","url":"settings.js"},
- {"name":"gpssetup.app.js","url":"app.js"},
- {"name":"gpssetup.img","url":"icon.js","evaluate":true}
- ],
- "data": [{"name":"gpssetup.settings.json","url":"settings.json"}]
- },
- {
- "id": "walkersclock",
- "name": "Walkers Clock",
- "shortName": "Walkers Clock",
- "version": "0.04",
- "description": "A large font watch, displays steps, can switch GPS on/off, displays grid reference",
- "icon": "walkersclock48.png",
- "type": "clock",
- "tags": "clock,gps,tools,outdoors",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"walkersclock.app.js","url":"app.js"},
- {"name":"walkersclock.img","url":"icon.js","evaluate":true}
- ]
- },
- {
- "id": "widgps",
- "name": "GPS Widget",
- "version": "0.03",
- "description": "Tiny widget to show the power on/off status of the GPS",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,gps",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"widgps.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "widhrt",
- "name": "HRM Widget",
- "version": "0.03",
- "description": "Tiny widget to show the power on/off status of the Heart Rate Monitor",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,hrm",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"widhrt.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "countdowntimer",
- "name": "Countdown Timer",
- "version": "0.01",
- "description": "A simple countdown timer with a focus on usability",
- "icon": "countdowntimer.png",
- "tags": "timer,tool",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"countdowntimer.app.js","url":"countdowntimer.js"},
- {"name":"countdowntimer.img","url":"countdowntimer-icon.js","evaluate":true}
- ]
- },
- {
- "id": "helloworld",
- "name": "hello, world!",
- "shortName": "hello world",
- "version": "0.02",
- "description": "A cross cultural hello world!/hola mundo! app with colors and languages",
- "icon": "app.png",
- "tags": "input,interface,buttons,touch",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"helloworld.app.js","url":"app.js"},
- {"name":"helloworld.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widcom",
- "name": "Compass Widget",
- "version": "0.02",
- "description": "Tiny widget to show the power on/off status of the Compass",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget,compass",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"widcom.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "arrow",
- "name": "Arrow Compass",
- "version": "0.05",
- "description": "Moving arrow compass that points North, shows heading, with tilt correction. Based on jeffmer's Navigation Compass",
- "icon": "arrow.png",
- "type": "app",
- "tags": "tool,outdoors",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"arrow.app.js","url":"app.js"},
- {"name":"arrow.img","url":"icon.js","evaluate":true}
- ]
- },
- {
- "id": "waypointer",
- "name": "Way Pointer",
- "version": "0.01",
- "description": "Navigate to a waypoint using the GPS for bearing and compass to point way, uses the same waypoint interface as GPS Navigation",
- "icon": "waypointer.png",
- "tags": "tool,outdoors,gps",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "interface": "waypoints.html",
- "storage": [
- {"name":"waypointer.app.js","url":"app.js"},
- {"name":"waypointer.img","url":"icon.js","evaluate":true}
- ],
- "data": [{"name":"waypoints.json","url":"waypoints.json"}]
- },
- {
- "id": "color_catalog",
- "name": "Colors Catalog",
- "shortName": "Colors Catalog",
- "version": "0.01",
- "description": "Displays RGB565 and RGB888 colors, its name and code in screen.",
- "icon": "app.png",
- "tags": "Color,input,buttons,touch,UI",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"color_catalog.app.js","url":"app.js"},
- {"name":"color_catalog.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "UI4swatch",
- "name": "UI 4 swatch",
- "shortName": "UI 4 swatch",
- "version": "0.01",
- "description": "A UI/UX for espruino smartwatches, displays dinamically calc. x,y coordinates.",
- "icon": "app.png",
- "tags": "Color,input,buttons,touch,UI",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"UI4swatch.app.js","url":"app.js"},
- {"name":"UI4swatch.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "simplest",
- "name": "Simplest Clock",
- "version": "0.03",
- "description": "The simplest working clock, acts as a tutorial piece",
- "icon": "simplest.png",
- "screenshots": [{"url":"screenshot_simplest.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"simplest.app.js","url":"app.js"},
- {"name":"simplest.img","url":"icon.js","evaluate":true}
- ]
- },
- {
- "id": "stepo",
- "name": "Stepometer Clock",
- "version": "0.03",
- "description": "A large font watch, displays step count in a doughnut guage and warns of low battery, requires one of the steps widgets to be installed",
- "icon": "stepo.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"stepo.app.js","url":"app.js"},
- {"name":"stepo.img","url":"icon.js","evaluate":true}
- ]
- },
- {
- "id": "gbmusic",
- "name": "Gadgetbridge Music Controls",
- "shortName": "Music Controls",
- "version": "0.08",
- "description": "Control the music on your Gadgetbridge-connected phone",
- "icon": "icon.png",
- "screenshots": [{"url":"screenshot_v1.png"},{"url":"screenshot_v2.png"}],
- "type": "app",
- "tags": "tools,bluetooth,gadgetbridge,music",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"gbmusic.app.js","url":"app.js"},
- {"name":"gbmusic.settings.js","url":"settings.js"},
- {"name":"gbmusic.wid.js","url":"widget.js"},
- {"name":"gbmusic.img","url":"icon.js","evaluate":true}
- ],
- "data": [{"name":"gbmusic.json"},{"name":"gbmusic.load.json"}]
- },
- {
- "id": "battleship",
- "name": "Battleship",
- "version": "0.01",
- "description": "The classic game of battleship",
- "icon": "battleship-icon.png",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"bangle1-battle-ship-screenshot.png"}],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"battleship.app.js","url":"battleship.js"},
- {"name":"battleship.img","url":"battleship-icon.js","evaluate":true}
- ]
- },
- {
- "id": "kitchen",
- "name": "Kitchen Combo",
- "version": "0.13",
- "description": "Combination of the Stepo, Walkersclock, Arrow and Waypointer apps into a multiclock format. 'Everything but the kitchen sink'",
- "icon": "kitchen.png",
- "type": "clock",
- "tags": "tool,outdoors,gps",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "interface": "waypoints.html",
- "storage": [
- {"name":"kitchen.app.js","url":"kitchen.app.js"},
- {"name":"stepo2.kit.js","url":"stepo2.kit.js"},
- {"name":"swatch.kit.js","url":"swatch.kit.js"},
- {"name":"gps.kit.js","url":"gps.kit.js"},
- {"name":"compass.kit.js","url":"compass.kit.js"},
- {"name":"kitchen.img","url":"kitchen.icon.js","evaluate":true}
- ],
- "data": [{"name":"waypoints.json","url":"waypoints.json"}]
- },
- {
- "id": "banglebridge",
- "name": "BangleBridge",
- "shortName": "BangleBridge",
- "version": "0.01",
- "description": "Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App",
- "icon": "widget.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"banglebridge.wid.js","url":"widget.js"},
- {"name":"banglebridge.watch.img","url":"watch.img"},
- {"name":"banglebridge.heart.img","url":"heart.img"}
- ]
- },
- {
- "id": "qmsched",
- "name": "Quiet Mode Schedule and Widget",
- "shortName": "Quiet Mode",
- "version": "0.06",
- "description": "Automatically turn Quiet Mode on or off at set times, and change LCD options while Quiet Mode is active.",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot_b1_main.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_lcd.png"},
- {"url":"screenshot_b2_main.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_lcd.png"}],
- "tags": "tool,widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"qmsched","url":"lib.js"},
- {"name":"qmsched.app.js","url":"app.js"},
- {"name":"qmsched.boot.js","url":"boot.js"},
- {"name":"qmsched.img","url":"icon.js","evaluate":true},
- {"name":"qmsched.wid.js","url":"widget.js"}
- ],
- "data": [{"name":"qmsched.json"}]
- },
- {
- "id": "hourstrike",
- "name": "Hour Strike",
- "shortName": "Hour Strike",
- "version": "0.08",
- "description": "Strike the clock on the hour. A great tool to remind you an hour has passed!",
- "icon": "app-icon.png",
- "tags": "tool,alarm",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"hourstrike.app.js","url":"app.js"},
- {"name":"hourstrike.boot.js","url":"boot.js"},
- {"name":"hourstrike.img","url":"app-icon.js","evaluate":true},
- {"name":"hourstrike.json","url":"hourstrike.json"}
- ]
- },
- {
- "id": "whereworld",
- "name": "Where in the World?",
- "shortName": "Where World",
- "version": "0.01",
- "description": "Shows your current location on the world map",
- "icon": "app.png",
- "tags": "gps",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"whereworld.app.js","url":"app.js"},
- {"name":"whereworld.img","url":"app-icon.js","evaluate":true},
- {"name":"whereworld.worldmap","url":"worldmap"}
- ]
- },
- {
- "id": "omnitrix",
- "name": "Omnitrix",
- "version": "0.01",
- "description": "An Omnitrix Showpiece",
- "icon": "omnitrix.png",
- "screenshots": [{"url":"screenshot.png"}],
- "tags": "game",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"omnitrix.app.js","url":"omnitrix.app.js"},
- {"name":"omnitrix.img","url":"omnitrix.icon.js","evaluate":true}
- ]
- },
- {
- "id": "batclock",
- "name": "Bat Clock",
- "shortName": "Bat Clock",
- "version": "0.02",
- "description": "Morphing Clock, with an awesome \"The Dark Knight\" themed logo.",
- "icon": "bat-clock.png",
- "screenshots": [{"url":"screenshot.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"batclock.app.js","url":"bat-clock.app.js"},
- {"name":"batclock.img","url":"bat-clock.icon.js","evaluate":true}
- ]
- },
- {
- "id": "doztime",
- "name": "Dozenal Time",
- "shortName": "Dozenal Time",
- "version": "0.04",
- "description": "A dozenal Holocene calendar and dozenal diurnal clock",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"doztime.app.js","url":"app-bangle1.js","supports":["BANGLEJS"]},
- {"name":"doztime.app.js","url":"app-bangle2.js","supports":["BANGLEJS2"]},
- {"name":"doztime.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "gbtwist",
- "name": "Gadgetbridge Twist Control",
- "shortName": "Twist Control",
- "version": "0.01",
- "description": "Shake your wrist to control your music app via Gadgetbridge",
- "icon": "app.png",
- "type": "app",
- "tags": "tools,bluetooth,gadgetbridge,music",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": false,
- "storage": [
- {"name":"gbtwist.app.js","url":"app.js"},
- {"name":"gbtwist.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "thermom",
- "name": "Thermometer",
- "version": "0.05",
- "description": "Displays the current temperature in degree Celsius/Fahrenheit (depending on locale), updates every 10 seconds with average of last 5 readings.",
- "icon": "app.png",
- "tags": "tool",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "screenshots": [{"url":"screenshot.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"thermom.app.js","url":"app.js"},
- {"name":"thermom.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "mysticdock",
- "name": "Mystic Dock",
- "version": "1.00",
- "description": "A retro-inspired dockface that displays the current time and battery charge while plugged in, and which features an interactive mode that shows the time, date, and a rotating data display line.",
- "icon": "mystic-dock.png",
- "type": "dock",
- "tags": "dock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"mysticdock.app.js","url":"mystic-dock-app.js"},
- {"name":"mysticdock.boot.js","url":"mystic-dock-boot.js"},
- {"name":"mysticdock.settings.js","url":"mystic-dock-settings.js"},
- {"name":"mysticdock.img","url":"mystic-dock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "mysticclock",
- "name": "Mystic Clock",
- "version": "1.01",
- "description": "A retro-inspired watchface featuring time, date, and an interactive data display line.",
- "icon": "mystic-clock.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"bangle1-mystic-clock-screenshot.png"}],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"mysticclock.app.js","url":"mystic-clock-app.js"},
- {"name":"mysticclock.settings.js","url":"mystic-clock-settings.js"},
- {"name":"mysticclock.img","url":"mystic-clock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "hcclock",
- "name": "Hi-Contrast Clock",
- "version": "0.03",
- "description": "Hi-Contrast Clock : A simple yet very bold clock that aims to be readable in high luninosity environments. Uses big 10x5 pixel digits. Use BTN 1 to switch background and foreground colors.",
- "icon": "hcclock-icon.png",
- "type": "clock",
- "tags": "clock",
- "screenshots": [{"url":"bangle1-high-contrast-clock-screenshot.png"}],
- "supports": ["BANGLEJS"],
- "allow_emulator": true,
- "storage": [
- {"name":"hcclock.app.js","url":"hcclock.app.js"},
- {"name":"hcclock.img","url":"hcclock-icon.js","evaluate":true}
- ]
- },
- {
- "id": "thermomF",
- "name": "Fahrenheit Temp",
- "version": "0.01",
- "description": "[NOT RECOMMENDED] A modification of the Thermometer App to display temprature in Fahrenheit. Please use the 'Thermometer App' and install 'Languages' to get the temperature in the correct format for your locale.",
- "icon": "thermf.png",
- "tags": "tool",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"thermomF.app.js","url":"app.js"},
- {"name":"thermomF.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "nixie",
- "name": "Nixie Clock",
- "shortName": "Nixie",
- "version": "0.01",
- "description": "A nixie tube clock for both Bangle 1 and 2.",
- "icon": "nixie.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"nixie.app.js","url":"app.js"},
- {"name":"nixie.img","url":"app-icon.js","evaluate":true},
- {"name":"m_vatch.js","url":"m_vatch.js"}
- ]
- },
- {
- "id": "carcrazy",
- "name": "Car Crazy",
- "shortName": "Car Crazy",
- "version": "0.03",
- "description": "A simple car game where you try to avoid the other cars by tilting your wrist left and right. Hold down button 2 to start.",
- "icon": "carcrash.png",
- "tags": "game",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"carcrazy.app.js","url":"app.js"},
- {"name":"carcrazy.img","url":"app-icon.js","evaluate":true},
- {"name":"carcrazy.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"CarCrazy.csv"}]
- },
- {
- "id": "shortcuts",
- "name": "Shortcuts",
- "shortName": "Shortcuts",
- "version": "0.01",
- "description": "Quickly load your favourite apps from (almost) any watch face.",
- "icon": "app.png",
- "type": "bootloader",
- "tags": "tool",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"shortcuts.boot.js","url":"boot.js"},
- {"name":"shortcuts.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"shortcuts.json"}]
- },
- {
- "id": "vectorclock",
- "name": "Vector Clock",
- "version": "0.03",
- "description": "A digital clock that uses the built-in vector font.",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [
- {"url":"bangle2-vector-clock-screenshot.png"},
- {"url":"bangle1-vector-clock-screenshot.png"}
- ],
- "storage": [
- {"name":"vectorclock.app.js","url":"app.js"},
- {"name":"vectorclock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "fd6fdetect",
- "name": "fd6fdetect",
- "shortName": "fd6fdetect",
- "version": "0.2",
- "description": "Allows you to see 0xFD6F beacons near you.",
- "icon": "app.png",
- "tags": "tool",
- "readme": "README.md",
- "supports": ["BANGLEJS"],
- "storage": [
- {"name":"fd6fdetect.app.js","url":"app.js"},
- {"name":"fd6fdetect.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "choozi",
- "name": "Choozi",
- "version": "0.01",
- "description": "Choose people or things at random using Bangle.js.",
- "icon": "app.png",
- "tags": "tool",
- "supports": ["BANGLEJS"],
- "readme": "README.md",
- "allow_emulator": true,
- "screenshots": [{"url":"bangle1-choozi-screenshot1.png"},{"url":"bangle1-choozi-screenshot2.png"}],
- "storage": [
- {"name":"choozi.app.js","url":"app.js"},
- {"name":"choozi.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widclkbttm",
- "name": "Digital clock (Bottom) widget",
- "shortName": "Digital clock Bottom Widget",
- "version": "0.03",
- "description": "Displays time in the bottom area.",
- "icon": "widclkbttm.png",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"widclkbttm.wid.js","url":"widclkbttm.wid.js"}
- ]
- },
- {
- "id": "pastel",
- "name": "Pastel Clock",
- "shortName": "Pastel",
- "version": "0.10",
- "description": "A Configurable clock with custom fonts, background and weather display. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times",
- "icon": "pastel.png",
- "dependencies": {"mylocation":"app", "widpedom":"app","weather":"app"},
- "screenshots": [{"url":"screenshot_pastel.png"}, {"url":"weather_icons.png"}],
- "type": "clock",
- "tags": "clock, weather, tool",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"f_architect","url":"f_architect.js"},
- {"name":"f_gochihand","url":"f_gochihand.js"},
- {"name":"f_cabin","url":"f_cabin.js"},
- {"name":"f_orbitron","url":"f_orbitron.js"},
- {"name":"f_monoton","url":"f_monoton.js"},
- {"name":"f_elite","url":"f_elite.js"},
- {"name":"f_lato","url":"f_lato.js"},
- {"name":"f_latosmall","url":"f_latosmall.js"},
- {"name":"pastel.app.js","url":"pastel.app.js"},
- {"name":"pastel.img","url":"pastel.icon.js","evaluate":true},
- {"name":"pastel.settings.js","url":"pastel.settings.js"}
- ],
- "data": [{"name":"pastel.json"}]
- },
- {
- "id": "antonclk",
- "name": "Anton Clock",
- "version": "0.03",
- "description": "A simple clock using the bold Anton font.",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"antonclk.app.js","url":"app.js"},
- {"name":"antonclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "waveclk",
- "name": "Wave Clock",
- "version": "0.02",
- "description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2, but requires firmware 2v11 or later on Bangle.js 1**",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"waveclk.app.js","url":"app.js"},
- {"name":"waveclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "floralclk",
- "name": "Floral Clock",
- "version": "0.01",
- "description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2 but requires firmware 2v11 or later on Bangle.js 1**",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot_floral.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"floralclk.app.js","url":"app.js"},
- {"name":"floralclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "score",
- "name": "Score Tracker",
- "version": "0.01",
- "description": "Score Tracker for sports that use plain numbers (e.g. Badminton, Volleyball, Soccer, Table Tennis, ...). Also supports tennis scoring.",
- "icon": "score.app.png",
- "screenshots": [{"url":"screenshot_score.png"}],
- "type": "app",
- "tags": "",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"score.app.js","url":"score.app.js"},
- {"name":"score.settings.js","url":"score.settings.js"},
- {"name":"score.presets.json","url":"score.presets.json"},
- {"name":"score.img","url":"score.app-icon.js","evaluate":true}
- ],
- "data": [{"name":"score.json"}]
- },
- {
- "id": "menusmall",
- "name": "Small Menus",
- "version": "0.02",
- "description": "Replace Bangle.js 2's menus with a version that contains smaller text",
- "icon": "app.png",
- "type": "boot",
- "tags": "system",
- "supports": ["BANGLEJS2"],
- "storage": [
- {"name":"menusmall.boot.js","url":"boot.js"}
- ]
- },
- {
- "id": "ffcniftya",
- "name": "Nifty-A Clock",
- "version": "0.01",
- "description": "A nifty clock with time and date",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot_nifty.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"ffcniftya.app.js","url":"app.js"},
- {"name":"ffcniftya.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "ffcniftyb",
- "name": "Nifty-B Clock",
- "version": "0.02",
- "description": "A nifty clock (series B) with time, date and color configuration",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"ffcniftyb.app.js","url":"app.js"},
- {"name":"ffcniftyb.img","url":"app-icon.js","evaluate":true},
- {"name":"ffcniftyb.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"ffcniftyb.json"}]
- },
- {
- "id": "stopwatch",
- "name": "Stopwatch Touch",
- "version": "0.01",
- "description": "A touch based stop watch for Bangle JS 2",
- "icon": "stopwatch.png",
- "screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}],
- "tags": "tools,app",
- "supports": ["BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"stopwatch.app.js","url":"stopwatch.app.js"},
- {"name":"stopwatch.img","url":"stopwatch.icon.js","evaluate":true}
- ]
- },
- {
- "id": "vernierrespirate",
- "name": "Vernier Go Direct Respiration Belt",
- "shortName": "Respiration Belt",
- "version": "0.01",
- "description": "Connects to a Go Direct Respiration Belt and shows respiration rate",
- "icon": "app.png",
- "tags": "health,bluetooth",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"vernierrespirate.app.js","url":"app.js"},
- {"name":"vernierrespirate.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [{"name":"vernierrespirate.json"}]
- },
- {
- "id": "gpstouch",
- "name": "GPS Touch",
- "version": "0.02",
- "description": "A touch based GPS watch, shows OS map reference",
- "icon": "gpstouch.png",
- "screenshots": [{"url":"screenshot4.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"},{"url":"screenshot1.png"}],
- "tags": "tools,app",
- "supports": ["BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"geotools","url":"geotools.js"},
- {"name":"gpstouch.app.js","url":"gpstouch.app.js"},
- {"name":"gpstouch.img","url":"gpstouch.icon.js","evaluate":true}
- ]
- },
- {
- "id": "swiperclocklaunch",
- "name": "Swiper Clock Launch",
- "version": "0.02",
- "description": "Navigate between clock and launcher with Swipe action",
- "icon": "swiperclocklaunch.png",
- "type": "bootloader",
- "tags": "tools, system",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "storage": [
- {"name":"swiperclocklaunch.boot.js","url":"boot.js"},
- {"name":"swiperclocklaunch.img","url":"icon.js","evaluate":true}
- ]
- },
- {
- "id": "qalarm",
- "name": "Q Alarm and Timer",
- "shortName": "Q Alarm",
- "icon": "app.png",
- "version": "0.03",
- "description": "Alarm and timer app with days of week and 'hard' option.",
- "tags": "tool,alarm,widget",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "storage": [
- { "name": "qalarm.app.js", "url": "app.js" },
- { "name": "qalarm.boot.js", "url": "boot.js" },
- { "name": "qalarm.js", "url": "qalarm.js" },
- { "name": "qalarmcheck.js", "url": "qalarmcheck.js" },
- { "name": "qalarm.img", "url": "app-icon.js", "evaluate": true },
- { "name": "qalarm.wid.js", "url": "widget.js" }
- ],
- "data": [{ "name": "qalarm.json" }]
- },
- {
- "id": "emojuino",
- "name": "Emojuino",
- "shortName": "Emojuino",
- "version": "0.03",
- "description": "Emojis & Espruino: broadcast Unicode emojis via Bluetooth Low Energy.",
- "icon": "emojuino.png",
- "screenshots": [
- { "url": "screenshot-tx.png" },
- { "url": "screenshot-swipe.png" },
- { "url": "screenshot-welcome.png" }
- ],
- "type": "app",
- "tags": "emoji",
- "supports" : [ "BANGLEJS2" ],
- "allow_emulator": true,
- "readme": "README.md",
- "storage": [
- { "name": "emojuino.app.js", "url": "emojuino.js" },
- { "name": "emojuino.img", "url": "emojuino-icon.js", "evaluate": true }
- ]
- },
- {
- "id": "cliclockJS2Enhanced",
- "name": "Commandline-Clock JS2 Enhanced",
- "shortName": "CLI-Clock JS2",
- "version": "0.03",
- "description": "Simple CLI-Styled Clock with enhancements. Modes that are hard to use and unneded are removed (BPM, battery info, memory ect) credit to hughbarney for the original code and design. Also added HID media controlls, just swipe on the clock face to controll the media! Gadgetbride support coming soon(hopefully) Thanks to t0m1o1 for media controls!",
- "icon": "app.png",
- "screenshots": [{"url":"screengrab.png"}],
- "type": "clock",
- "tags": "clock,cli,command,bash,shell",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"cliclockJS2Enhanced.app.js","url":"app.js"},
- {"name":"cliclockJS2Enhanced.img","url":"app.icon.js","evaluate":true}
- ]
- },
- {
- "id": "wid_a_battery_widget",
- "name": "A Battery Widget (with percentage)",
- "shortName":"A Battery Widget",
- "icon": "widget.png",
- "version":"1.02",
- "type": "widget",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "readme": "README.md",
- "description": "Simple and slim battery widget with charge status and percentage",
- "tags": "widget,battery",
- "storage": [
- {"name":"wid_a_battery_widget.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "lcars",
- "name": "LCARS Clock",
- "shortName":"LCARS",
- "icon": "lcars.png",
- "version":"0.09",
- "readme": "README.md",
- "supports": ["BANGLEJS2"],
- "description": "Library Computer Access Retrieval System (LCARS) clock.",
- "type": "clock",
- "tags": "clock",
- "screenshots": [{"url":"screenshot.png"}],
- "storage": [
- {"name":"lcars.app.js","url":"lcars.app.js"},
- {"name":"lcars.img","url":"lcars.icon.js","evaluate":true},
- {"name":"lcars.settings.js","url":"lcars.settings.js"}
- ]
- },
- { "id": "binwatch",
- "name": "Binary Watch",
- "shortName":"BinWatch",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "version":"0.04",
- "supports": ["BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator":true,
- "description": "Famous binary watch",
- "tags": "clock",
- "type": "clock",
- "storage": [
- {"name":"binwatch.app.js","url":"app.js"},
- {"name":"binwatch.bg176.img","url":"Background176_center.img"},
- {"name":"binwatch.bg240.img","url":"Background240_center.img"},
- {"name":"binwatch.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "hidmsicswipe",
- "name": "Bluetooth Music Swipe Controls",
- "shortName": "Swipe Control",
- "version": "0.01",
- "description": "Based on the original Bluetooth Music Controls. Swipe up/down for volume, left/right for previous and next, tap for play/pause and btn1 to lock and unlock the controls. Enable HID in settings, pair with your phone, then use this app to control music from your watch!",
- "icon": "hidmsicswipe.png",
- "tags": "bluetooth",
- "supports": ["BANGLEJS2"],
- "storage": [
- {"name":"hidmsicswipe.app.js","url":"hidmsicswipe.js"},
- {"name":"hidmsicswipe.img","url":"hidmsicswipe-icon.js","evaluate":true}
- ]
- },
- {
- "id": "authentiwatch",
- "name": "2FA Authenticator",
- "shortName": "AuthWatch",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "version": "0.04",
- "description": "Google Authenticator compatible tool.",
- "tags": "tool",
- "interface": "interface.html",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"authentiwatch.app.js","url":"app.js"},
- {"name":"authentiwatch.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [{"name":"authentiwatch.json"}]
- },
- { "id": "schoolCalendar",
- "name": "School Calendar",
- "shortName":"SCalendar",
- "icon": "CalenderLogo.png",
- "version": "0.01",
- "description": "A simple calendar that you can see your upcoming events that you create in the customizer. Keep in note that your events reapeat weekly.(Beta)",
- "tags": "tool",
- "readme":"README.md",
- "custom":"custom.html",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"screenshot_basic.png"},{"url":"screenshot_info.png"}],
- "storage": [
- {"name":"schoolCalendar.app.js"},
- {"name":"schoolCalendar.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [
- {"name":"calendarItems.csv"}
- ]
- },
- { "id": "timecal",
- "name": "TimeCal",
- "shortName":"TimeCal",
- "icon": "icon.png",
- "version":"0.01",
- "description": "TimeCal shows the Time along with a 3 week calendar",
- "tags": "clock",
- "type": "clock",
- "supports":["BANGLEJS2"],
- "storage": [
- {"name":"timecal.app.js","url":"timecal.app.js"}
- ]
- },
- {
- "id": "a_clock_timer",
- "name": "A Clock with Timer",
- "version": "0.01",
- "description": "A Clock with Timer, Map and Time Zones",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS2"],
- "allow_emulator": true,
- "readme": "README.md",
- "storage": [
- {"name":"a_clock_timer.app.js","url":"app.js"},
- {"name":"a_clock_timer.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id":"intervalTimer",
- "name":"Interval Timer",
- "shortName":"Interval Timer",
- "icon": "app.png",
- "version":"0.01",
- "description": "Interval Timer for workouts, HIIT, or whatever else.",
- "tags": "timer, interval, hiit, workout",
- "readme":"README.md",
- "supports":["BANGLEJS2"],
- "storage": [
- {"name":"intervalTimer.app.js","url":"app.js"},
- {"name":"intervalTimer.img","url":"app-icon.js","evaluate":true}
- ]
- },
- { "id": "93dub",
- "name": "93 Dub",
- "shortName":"93 Dub",
- "icon": "93dub.png",
- "screenshots": [{"url":"screenshot.png"}],
- "version":"0.06",
- "description": "Fan recreation of orviwan's 91 Dub app for the Pebble smartwatch. Uses assets from his 91-Dub-v2.0 repo",
- "tags": "clock",
- "type": "clock",
- "supports":["BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"93dub.app.js","url":"app.js"},
- {"name":"93dub.img","url":"app-icon.js","evaluate":true}
- ]
- },
- { "id": "poweroff",
- "name": "Poweroff",
- "shortName":"Poweroff",
- "version":"0.01",
- "description": "Simple app to power off your Bangle.js",
- "icon": "app.png",
- "tags": "tool, poweroff, shutdown",
- "supports" : ["BANGLEJS", "BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"poweroff.app.js","url":"app.js"},
- {"name":"poweroff.img","url":"app-icon.js","evaluate":true}
- ]
-},
-{
- "id": "sensible",
- "name": "SensiBLE",
- "shortName": "SensiBLE",
- "version": "0.05",
- "description": "Collect, display and advertise real-time sensor data.",
- "icon": "sensible.png",
- "screenshots": [
- { "url": "screenshot-top.png" },
- { "url": "screenshot-acc.png" },
- { "url": "screenshot-bar.png" },
- { "url": "screenshot-gps.png" },
- { "url": "screenshot-hrm.png" },
- { "url": "screenshot-mag.png" }
- ],
- "type": "app",
- "tags": "tool,sensors",
- "supports" : [ "BANGLEJS2" ],
- "allow_emulator": true,
- "readme": "README.md",
- "storage": [
- { "name": "sensible.app.js", "url": "sensible.js" },
- { "name": "sensible.img", "url": "sensible-icon.js", "evaluate": true }
- ]
-},
- {
- "id": "widbars",
- "name": "Bars Widget",
- "version": "0.01",
- "description": "Display several measurements as vertical bars.",
- "icon": "icon.png",
- "screenshots": [{"url":"screenshot.png"}],
- "readme": "README.md",
- "type": "widget",
- "tags": "widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widbars.wid.js","url":"widget.js"}
- ]
-},
-{
- "id":"a_speech_timer",
- "name":"Speech Timer",
- "icon": "app.png",
- "version":"1.01",
- "description": "A timer designed to help keeping your speeches and presentations to time.",
- "tags": "tool,timer",
- "readme":"README.md",
- "supports":["BANGLEJS2"],
- "screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}],
- "allow_emulator": true,
- "storage": [
- {"name":"a_speech_timer.app.js","url":"app.js"},
- {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true}
- ]
-},
- { "id": "mylocation",
- "name": "My Location",
- "shortName":"My Location",
- "icon": "mylocation.png",
- "type": "app",
- "screenshots": [{"url":"screenshot_1.png"}],
- "version":"0.02",
- "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README",
- "readme": "README.md",
- "tags": "tool,utility",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "storage": [
- {"name":"mylocation.app.js","url":"mylocation.app.js"},
- {"name":"mylocation.img","url":"mylocation.icon.js","evaluate": true }
- ],
- "data": [
- {"name":"mylocation.json"}
- ]
- },
- {
- "id": "pebble",
- "name": "Pebble Clock",
- "shortName": "Pebble",
- "version": "0.07",
- "description": "A pebble style clock to keep the rebellion going",
- "dependencies": {"widpedom":"app"},
- "readme": "README.md",
- "icon": "pebble.png",
- "screenshots": [{"url":"pebble_screenshot.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "storage": [
- {"name":"pebble.app.js","url":"pebble.app.js"},
- {"name":"pebble.settings.js","url":"pebble.settings.js"},
- {"name":"pebble.img","url":"pebble.icon.js","evaluate":true}
- ]
- },
- { "id": "pooqroman",
- "name": "pooq Roman watch face",
- "shortName":"pooq Roman",
- "version":"0.03",
- "description": "A classic watch face with a certain dynamicity. Most amusing in 24h mode. Slide up to show more hands, down for less(!). By design does not support standard widgets, sorry!",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports" : ["BANGLEJS2"],
- "allow_emulator":true,
- "readme": "README.md",
- "storage": [
- {"name":"pooqroman.app.js","url":"app.js"},
- {"name":"pooqroman.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [
- {"name":"pooqroman.json"}
- ]
- },
- {
- "id": "widbata",
- "name": "Battery Level Widget (Themed)",
- "shortName":"Battery Theme",
- "icon": "widbata.png",
- "screenshots": [{"url":"screenshot_widbata_1.png"}],
- "version":"0.01",
- "type": "widget",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "readme": "README.md",
- "description": "Shows the current battery level status in the top right using the clocks colour theme",
- "tags": "widget,battery",
- "storage": [
- {"name":"widbata.wid.js","url":"widbata.wid.js"}
- ]
- },
- {
- "id": "weatherClock",
- "name": "Weather Clock",
- "version": "0.05",
- "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).",
- "icon": "app.png",
- "screenshots": [{"url":"screens/screen1.png"}],
- "type": "clock",
- "tags": "clock, weather",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "allow_emulator": true,
- "readme": "README.md",
- "storage": [
- {"name":"weatherClock.app.js","url":"app.js"},
- {"name":"weatherClock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "menuwheel",
- "name": "Wheel Menus",
- "version": "0.01",
- "description": "Replace Bangle.js 2's menus with a version that contains variable-size text and a back button",
- "readme": "README.md",
- "icon": "icon.png",
- "screenshots": [
- {"url":"screenshot_b1_dark.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_light.png"},
- {"url":"screenshot_b2_dark.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_light.png"}
- ],
- "type": "boot",
- "tags": "system",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"menuwheel.boot.js","url":"boot.js"}
- ]
- },
- { "id": "widChargingStatus",
- "name": "Charging Status",
- "shortName":"ChargingStatus",
- "icon": "widget.png",
- "version":"0.1",
- "type": "widget",
- "description": "A simple widget that shows a yellow lightning icon to indicate whenever the watch is charging. This way one can see the charging status at a glance, no matter which battery widget is being used.",
- "tags": "widget",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widChargingStatus.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "flow",
- "name": "FLOW",
- "shortName": "FLOW",
- "version": "0.01",
- "description": "A game where you have to help a flow avoid white obstacles thing by tapping! This is a demake of an app which I forgot the name of. Press BTN(1) to restart. See if you can get to 2500 score!",
- "icon": "app.png",
- "tags": "game",
- "supports" : ["BANGLEJS", "BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name": "flow.app.js", "url": "app.js" },
- {"name": "flow.img", "url": "app-icon.js","evaluate": true }
- ]
- },
- { "id": "tinydraw",
- "name": "TinyDraw",
- "shortName":"TinyDraw",
- "version":"0.01",
- "type": "app",
- "description": "Draw stuff in your wrist",
- "icon": "app.png",
- "allow_emulator": true,
- "tags": "tools, keyboard, text, scribble",
- "supports" : ["BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"tinydraw.app.js","url":"app.js"},
- {"name":"tinydraw.img","url":"app-icon.js","evaluate":true}
- ],
- "screenshots":[
- { "url":"screenshot.png" }
- ]
- },
- { "id": "scribble",
- "name": "Scribble",
- "shortName":"Scribble",
- "version":"0.01",
- "type": "app",
- "description": "A keyboard on your wrist! Swipe right for space, left for delete.",
- "icon": "app.png",
- "allow_emulator": true,
- "tags": "tools, keyboard, text, scribble",
- "supports" : ["BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"scribble.app.js","url":"app.js"},
- {"name":"scribble.img","url":"app-icon.js","evaluate":true}
- ],
- "screenshots":[
- { "url":"screenshot.png" }
- ]
- },
- {
- "id": "ptlaunch",
- "name": "Pattern Launcher",
- "shortName": "Pattern Launcher",
- "version": "0.13",
- "description": "Directly launch apps from the clock screen with custom patterns.",
- "icon": "app.png",
- "screenshots": [{"url":"manage_patterns_light.png"}],
- "tags": "tools",
- "supports": ["BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- { "name": "ptlaunch.app.js", "url": "app.js" },
- { "name": "ptlaunch.boot.js", "url": "boot.js" },
- { "name": "ptlaunch.img", "url": "app-icon.js", "evaluate": true }
- ],
- "data": [{"name":"ptlaunch.patterns.json"}]
- },
- { "id": "slimehunt",
- "name": "Slime Hunt",
- "shortName":"SlimeHunt",
- "icon": "app.png",
- "version":"0.02",
- "description": "Fight against slimes in turn based combat, try to get the highscore!",
- "tags": "rpg,slime",
- "supports" : ["BANGLEJS"],
- "readme": "README.md",
- "storage": [
- {"name":"slimehunt.app.js","url":"app.js"},
- {"name":"slimehunt.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "rebble",
- "name": "Rebble Clock",
- "shortName": "Rebble",
- "version": "0.04",
- "description": "A Pebble style clock, with configurable background, three sidebars including steps, day, date, sunrise, sunset, long live the rebellion",
- "readme": "README.md",
- "icon": "rebble.png",
- "dependencies": {"mylocation":"app", "widpedom":"app"},
- "screenshots": [{"url":"screenshot_rebble.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS2"],
- "storage": [
- {"name":"rebble.app.js","url":"rebble.app.js"},
- {"name":"rebble.settings.js","url":"rebble.settings.js"},
- {"name":"rebble.img","url":"rebble.icon.js","evaluate":true}
- ]
- },
- { "id": "snaky",
- "name": "Snaky",
- "shortName":"Snaky",
- "version":"0.01",
- "description": "The classic snake game. Eat apples and don't bite your tail. Control the snake with the touch screen.",
- "tags": "game,fun",
- "icon": "snaky.png",
- "supports" : ["BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"snaky.app.js","url":"snaky.js"},
- {"name":"snaky.img","url":"snaky-icon.js","evaluate":true}
- ]
- },
- {
- "id": "clicompleteclk",
- "name": "CLI complete clock",
- "shortName":"CLI cmplt clock",
- "version":"0.03",
- "description": "Command line styled clock with lots of information",
- "icon": "app.png",
- "allow_emulator": true,
- "type": "clock",
- "tags": "clock,cli,command,bash,shell,weather,hrt",
- "supports" : ["BANGLEJS", "BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"clicompleteclk.app.js","url":"app.js"},
- {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true},
- {"name":"clicompleteclk.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"clicompleteclk.json"}]
- },
- {
- "id":"awairmonitor",
- "name":"Awair Monitor",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "allow_emulator": true,
- "version":"0.03",
- "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.",
- "type": "clock",
- "tags": "clock,tool,health",
- "readme":"README.md",
- "supports":["BANGLEJS2"],
- "storage": [
- {"name":"awairmonitor.app.js","url":"app.js"},
- {"name":"awairmonitor.img","url":"app-icon.js","evaluate":true}
- ]
- },
- { "id": "pooqround",
- "name": "pooq Round watch face",
- "shortName":"pooq Round",
- "version":"0.01",
- "description": "A 24 hour analogue watchface with high legibility and a novel style.",
- "icon": "app.png",
- "type": "clock",
- "tags": "clock",
- "supports" : ["BANGLEJS2"],
- "allow_emulator":true,
- "readme": "README.md",
- "storage": [
- {"name":"pooqround.app.js","url":"app.js"},
- {"name":"pooqround.img","url":"app-icon.js","evaluate":true}
- ],
- "data": [
- {"name":"pooqround.json"}
- ]
- },
- {
- "id": "coretemp",
- "name": "CoreTemp",
- "version": "0.02",
- "description": "Display CoreTemp device sensor data",
- "icon": "coretemp.png",
- "type": "app",
- "tags": "health",
- "readme": "README.md",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"coretemp.wid.js","url":"widget.js"},
- {"name":"coretemp.app.js","url":"coretemp.js"},
- {"name":"coretemp.settings.js","url":"settings.js"},
- {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true},
- {"name":"coretemp.boot.js","url":"boot.js"}
- ],
- "data": [{"name":"coretemp.json","url":"app-settings.json"}],
- "screenshots": [{"url":"screenshot.png"}]
- },
- {
- "id": "showimg",
- "name": "simple image viewer",
- "shortName":"showImage",
- "version":"0.2",
- "description": "Displays the image in \"showimg.user.img\". The file has to be uploaded via the espruino IDE. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.",
- "icon": "app.png",
- "tags": "tool",
- "supports" : ["BANGLEJS2"],
- "storage": [
- {"name":"showimg.app.js","url":"app.js"},
- {"name":"showimg.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "lapcounter",
- "name": "Lap Counter",
- "version": "0.01",
- "description": "Click button to count laps. Shows count and total time snapshot (like a stopwatch, but laid back).",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "type": "app",
- "tags": "tool,outdoors",
- "readme":"README.md",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"lapcounter.app.js","url":"app.js"},
- {"name":"lapcounter.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "pebbled",
- "name": "Pebble Clock with distance",
- "shortName": "Pebble + distance",
- "version": "0.1",
- "description": "Fork of Pebble Clock with distance in KM. Both step count and the distance are on the main screen. Default step length = 0.75m (can be changed in settings).",
- "readme": "README.md",
- "icon": "pebbled.png",
- "screenshots": [{"url":"pebble_screenshot.png"}],
- "type": "clock",
- "tags": "clock,distance",
- "supports": ["BANGLEJS2"],
- "storage": [
- {"name":"pebbled.app.js","url":"pebbled.app.js"},
- {"name":"pebbled.settings.js","url":"pebbled.settings.js"},
- {"name":"pebbled.img","url":"pebbled.icon.js","evaluate":true}
- ]
- },
- { "id": "circlesclock",
- "name": "Circles clock",
- "shortName":"Circles clock",
- "version":"0.03",
- "description": "A clock with circles for different data at the bottom in a probably familiar style",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "dependencies": {"widpedom":"app"},
- "type": "clock",
- "tags": "clock",
- "supports" : ["BANGLEJS2"],
- "allow_emulator":true,
- "readme": "README.md",
- "storage": [
- {"name":"circlesclock.app.js","url":"app.js"},
- {"name":"circlesclock.img","url":"app-icon.js","evaluate":true},
- {"name":"circlesclock.settings.js","url":"settings.js"}
- ],
- "data": [
- {"name":"circlesclock.json"}
- ]
- },
- { "id": "contourclock",
- "name": "Contour Clock",
- "shortName" : "Contour Clock",
- "version":"0.01",
- "icon": "app.png",
- "description": "A Minimalist clockface with large Digits. Looks best with the dark theme",
- "screenshots" : [{"url":"screenshot.png"}],
- "tags": "clock",
- "allow_emulator":true,
- "supports" : ["BANGLEJS2"],
- "type": "clock",
- "storage": [
- {"name":"contourclock.app.js","url":"app.js"},
- {"name":"contourclock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "ltherm",
- "name": "Localized Thermometer",
- "shortName": "Thermometer",
- "version": "0.01",
- "description": "Displays the current temperature in localized units.",
- "icon": "thermf.png",
- "tags": "tool",
- "supports": ["BANGLEJS2"],
- "allow_emulator": true,
- "readme": "README.md",
- "storage": [
- {"name":"ltherm.app.js","url":"app.js"},
- {"name":"ltherm.img","url":"icon.js","evaluate":true}
- ]
- },
- {
- "id": "presentor",
- "name": "Presentor",
- "version": "3.0",
- "description": "Use your Bangle to present!",
- "icon": "app.png",
- "type": "app",
- "tags": "tool,bluetooth",
- "interface": "interface.html",
- "readme":"README.md",
- "supports": ["BANGLEJS", "BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"presentor.app.js","url":"app.js"},
- {"name":"presentor.img","url":"app-icon.js","evaluate":true},
- {"name":"presentor.json","url":"settings.json"}
- ]
- },
- {
- "id": "slash",
- "name": "Slash Watch",
- "shortName":"Slash",
- "icon": "slash.png",
- "screenshots": [{"url":"screenshot.png"}],
- "version":"0.01",
- "description": "Slash Watch based on Pebble watch face by Nikki.",
- "tags": "clock",
- "type": "clock",
- "supports":["BANGLEJS2"],
- "readme": "README.md",
- "allow_emulator": true,
- "storage": [
- {"name":"slash.app.js","url":"app.js"},
- {"name":"slash.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "promenu",
- "name": "Pro Menu",
- "version": "0.01",
- "description": "Replace Bangle.js 1's built in menu function.",
- "icon": "icon.png",
- "type": "boot",
- "tags": "system",
- "supports": ["BANGLEJS"],
- "screenshots": [{"url":"pro-menu-screenshot.png"}],
- "storage": [
- {"name":"promenu.boot.js","url":"boot.js"},
- {"name":"promenu.img","url":"promenuIcon.js","evaluate":true}
- ]
- },
- {
- "id": "touchtimer",
- "name": "Touch Timer",
- "shortName": "Touch Timer",
- "version": "0.02",
- "description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.",
- "icon": "app.png",
- "tags": "tools",
- "supports": ["BANGLEJS2"],
- "readme": "README.md",
- "screenshots": [{"url":"0_light_timer_edit.png"},{"url":"1_light_timer_ready.png"},{"url":"2_light_timer_running.png"},{"url":"3_light_timer_finished.png"}],
- "storage": [
- { "name": "touchtimer.app.js", "url": "app.js" },
- { "name":"touchtimer.settings.js", "url":"settings.js"},
- { "name": "touchtimer.img", "url": "app-icon.js", "evaluate": true }
- ],
- "data": [{"name":"touchtimer.data.json"}]
- },
- {
- "id": "teatimer",
- "name": "Tea Timer",
- "version": "1.00",
- "description": "A simple timer. You can easyly set up the time.",
- "icon": "teatimer.png",
- "type": "app",
- "tags": "tool",
- "supports": ["BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"teatimer.app.js","url":"app.js"},
- {"name":"teatimer.img","url":"app-icon.js","evaluate":true}
- ],
- "screenshots": [
- {"url":"TeatimerStart.jpg"},
- {"url":"TeatimerHelp.jpg"},
- {"url":"TeatimerRun.jpg"},
- {"url":"TeatimerUp.jpg"}
- ]
- },
- {
- "id": "swp2clk",
- "name": "Swipe back to the Clock",
- "shortName": "Swipe to Clock",
- "version": "0.01",
- "description": "Let's you swipe from left to right on any app to return back to the clock face. Please configure in the settings app after installing to activate, since its disabled by default.",
- "icon": "app.png",
- "type": "boot",
- "tags": "tools",
- "supports": ["BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- { "name": "swp2clk.boot.js", "url": "boot.js" },
- {"name":"swp2clk.settings.js","url":"settings.js"}
- ],
- "data": [{"name":"swp2clk.data.json"}]
- },
- {
- "id":"colorwheel",
- "name":"Color Wheel",
- "tags":"app,tool",
- "version":"0.01",
- "description":"a tappable wheel of good-looking colors",
- "readme":"README.md",
- "supports":["BANGLEJS2"],
- "allow_emulator":true,
- "icon":"colorwheel.png",
- "storage": [
- {"name":"colorwheel.app.js","url":"app.js"},
- {"name":"colorwheel.img","url":"app-icon.js","evaluate":true}
- ]
- },
- { "id": "minimal_clock",
- "name": "Minimal Analog Clock",
- "shortName":"Minimal Clock",
- "version":"0.03",
- "description": "a minimal analog clock - just with some hands and no clock face",
- "icon": "app-icon.png",
- "type": "clock",
- "tags": "clock",
- "supports" : ["BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"app-screenshot.png"}],
- "readme": "README.md",
- "storage": [
- {"name":"minimal_clock.app.js","url":"app.js"},
- {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- { "id": "simple_clock",
- "name": "Simple Analog Clock",
- "shortName":"Simple Clock",
- "version":"0.02",
- "description": "a simple, yet stylish, analog clock",
- "icon": "app-icon.png",
- "type": "clock",
- "tags": "clock",
- "supports" : ["BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"app-screenshot.png"}],
- "readme": "README.md",
- "storage": [
- {"name":"simple_clock.app.js","url":"app.js"},
- {"name":"simple_clock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- { "id": "colorful_clock",
- "name": "Colorful Analog Clock",
- "shortName":"Colorful Clock",
- "version":"0.02",
- "description": "a colorful analog clock",
- "icon": "app-icon.png",
- "type": "clock",
- "tags": "clock",
- "supports" : ["BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"app-screenshot.png"}],
- "readme": "README.md",
- "storage": [
- {"name":"colorful_clock.app.js","url":"app.js"},
- {"name":"colorful_clock.img","url":"app-icon.js","evaluate":true}
- ]
- },
- { "id": "themesetter",
- "name": "Theme Setter",
- "shortName":"Theme Setter",
- "version":"0.04",
- "description": "a comfortable way to configure theme colors",
- "icon": "app-icon.png",
- "type": "app",
- "tags": "tool",
- "supports" : ["BANGLEJS2"],
- "allow_emulator": true,
- "screenshots": [{"url":"app-screenshot.png"}],
- "readme": "README.md",
- "storage": [
- {"name":"themesetter.app.js","url":"app.js"},
- {"name":"themesetter.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "widviztime",
- "name": "Widget Autohide Widget",
- "shortName": "Viz Time Widget",
- "version": "0.01",
- "description": "The widgets will be shown for four seconds after the device is unlocked.",
- "icon": "eye.png",
- "type": "widget",
- "tags": "widget",
- "readme":"README.md",
- "supports": ["BANGLEJS","BANGLEJS2"],
- "storage": [
- {"name":"widviztime.wid.js","url":"widget.js"}
- ]
- },
- {
- "id": "supf",
- "name": "Simple Clock with Date",
- "shortName": "supf Clock",
- "version": "0.01",
- "description": "Simple Clock with seconds and date in custom language. Install 'Languages' to get localized names.",
- "icon": "icon.png",
- "screenshots": [{"url":"screenshot_supf.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS2"],
- "allow_emulator": true,
- "readme": "README.md",
- "storage": [
- {"name":"supf.app.js","url":"app.js"},
- {"name":"supf.img","url":"icon.js","evaluate":true}
- ]
- },
- { "id": "andark",
- "name": "Analog Dark",
- "shortName":"AnDark",
- "version":"0.04",
- "description": "analog clock face without disturbing widgets",
- "icon": "andark_icon.png",
- "type": "clock",
- "tags": "clock",
- "supports" : ["BANGLEJS2"],
- "readme": "README.md",
- "storage": [
- {"name":"andark.app.js","url":"app.js"},
- {"name":"andark.img","url":"app_icon.js","evaluate":true}
- ]
- },
- {
- "id": "diract",
- "name": "DirAct",
- "shortName": "DirAct",
- "version": "0.01",
- "description": "Proximity interaction detection.",
- "icon": "diract.png",
- "type": "app",
- "tags": "tool,sensors",
- "supports" : [ "BANGLEJS2" ],
- "allow_emulator": false,
- "readme": "README.md",
- "storage": [
- { "name": "diract.app.js", "url": "diract.js" },
- { "name": "diract.img", "url": "diract-icon.js", "evaluate": true }
- ]
- },
- {
- "id": "sonicclk",
- "name": "Sonic Clock",
- "version": "1.11",
- "description": "A classic sonic clock featuring run, stop and wait animations.",
- "icon": "app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "type": "clock",
- "tags": "clock",
- "supports": ["BANGLEJS2"],
- "allow_emulator": true,
- "readme": "README.md",
- "storage": [
- {"name":"sonicclk.app.js","url":"app.js"},
- {"name":"sonicclk.img","url":"app-icon.js","evaluate":true}
- ]
- },
- {
- "id": "touchmenu",
- "name": "TouchMenu",
- "version": "0.01",
- "description": "Redesigned menu that uses the full touchscreen on the Bangle.js 2",
- "screenshots": [{"url":"touchmenu.gif"}],
- "icon": "touchmenu.png",
- "type": "bootloader",
- "tags": "tool",
- "supports": ["BANGLEJS2"],
- "storage": [
- {"name":"touchmenu.boot.js","url":"touchmenu.boot.js"}
- ]
- },
- {
- "id": "puzzle15",
- "name": "15 puzzle",
- "version": "0.05",
- "description": "A 15 puzzle game with drag gesture interface",
- "readme":"README.md",
- "icon": "puzzle15.app.png",
- "screenshots": [{"url":"screenshot.png"}],
- "type": "app",
- "tags": "game",
- "supports": ["BANGLEJS2"],
- "allow_emulator": true,
- "storage": [
- {"name":"puzzle15.app.js","url":"puzzle15.app.js"},
- {"name":"puzzle15.settings.js","url":"puzzle15.settings.js"},
- {"name":"puzzle15.img","url":"puzzle15.app-icon.js","evaluate":true}
- ],
- "data": [{"name":"puzzle15.json"}]
- }
+
+{%- include_relative {{ apps.first }} -%}
+
+{%- for app in apps offset:1 -%}
+,{%- include_relative {{ app }} -%}
+{%- endfor -%}
+
]
diff --git a/apps/1button/metadata.json b/apps/1button/metadata.json
new file mode 100644
index 000000000..6cfcb9310
--- /dev/null
+++ b/apps/1button/metadata.json
@@ -0,0 +1,16 @@
+{
+ "id": "1button",
+ "name": "One-Button-Tracker",
+ "version": "0.01",
+ "description": "A widget that turns BTN1 into a tracker, records time of button press/release.",
+ "icon": "widget.png",
+ "type": "widget",
+ "tags": "tool,quantifiedself,widget",
+ "supports": ["BANGLEJS"],
+ "readme": "README.md",
+ "interface": "interface.html",
+ "storage": [
+ {"name":"1button.wid.js","url":"widget.js"}
+ ],
+ "data": [{"name":"one_button_presses.csv","storageFile":true}]
+}
diff --git a/apps/93dub/metadata.json b/apps/93dub/metadata.json
new file mode 100644
index 000000000..524780792
--- /dev/null
+++ b/apps/93dub/metadata.json
@@ -0,0 +1,17 @@
+{ "id": "93dub",
+ "name": "93 Dub",
+ "shortName":"93 Dub",
+ "icon": "93dub.png",
+ "screenshots": [{"url":"screenshot.png"}],
+ "version":"0.06",
+ "description": "Fan recreation of orviwan's 91 Dub app for the Pebble smartwatch. Uses assets from his 91-Dub-v2.0 repo",
+ "tags": "clock",
+ "type": "clock",
+ "supports":["BANGLEJS2"],
+ "readme": "README.md",
+ "allow_emulator": true,
+ "storage": [
+ {"name":"93dub.app.js","url":"app.js"},
+ {"name":"93dub.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/BLEcontroller/metadata.json b/apps/BLEcontroller/metadata.json
new file mode 100644
index 000000000..bb28b2360
--- /dev/null
+++ b/apps/BLEcontroller/metadata.json
@@ -0,0 +1,16 @@
+{
+ "id": "BLEcontroller",
+ "name": "BLE Customisable Controller with Joystick",
+ "shortName": "BLE Controller",
+ "version": "0.01",
+ "description": "A configurable controller for BLE devices and robots, with a basic four direction joystick. Designed to be easy to customise so you can add your own menus.",
+ "icon": "BLEcontroller.png",
+ "tags": "tool,bluetooth",
+ "supports": ["BANGLEJS"],
+ "readme": "README.md",
+ "allow_emulator": false,
+ "storage": [
+ {"name":"BLEcontroller.app.js","url":"app.js"},
+ {"name":"BLEcontroller.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/HRV/metadata.json b/apps/HRV/metadata.json
new file mode 100644
index 000000000..9e0aed176
--- /dev/null
+++ b/apps/HRV/metadata.json
@@ -0,0 +1,15 @@
+{
+ "id": "HRV",
+ "name": "Heart Rate Variability monitor",
+ "shortName": "HRV monitor",
+ "version": "0.04",
+ "description": "Heart Rate Variability monitor, see Readme for more info",
+ "icon": "hrv.png",
+ "tags": "",
+ "supports": ["BANGLEJS"],
+ "readme": "README.md",
+ "storage": [
+ {"name":"HRV.app.js","url":"app.js"},
+ {"name":"HRV.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/UI4swatch/metadata.json b/apps/UI4swatch/metadata.json
new file mode 100644
index 000000000..379d173c3
--- /dev/null
+++ b/apps/UI4swatch/metadata.json
@@ -0,0 +1,16 @@
+{
+ "id": "UI4swatch",
+ "name": "UI 4 swatch",
+ "shortName": "UI 4 swatch",
+ "version": "0.01",
+ "description": "A UI/UX for espruino smartwatches, displays dinamically calc. x,y coordinates.",
+ "icon": "app.png",
+ "tags": "Color,input,buttons,touch,UI",
+ "supports": ["BANGLEJS"],
+ "readme": "README.md",
+ "screenshots": [{"url":"UI4swatch_icon.png"},{"url":"UI4swatch_s1.png"}],
+ "storage": [
+ {"name":"UI4swatch.app.js","url":"app.js"},
+ {"name":"UI4swatch.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/_example_app/add_to_apps.json b/apps/_example_app/metadata.json
similarity index 89%
rename from apps/_example_app/add_to_apps.json
rename to apps/_example_app/metadata.json
index cc28e1e93..e0d664338 100644
--- a/apps/_example_app/add_to_apps.json
+++ b/apps/_example_app/metadata.json
@@ -1,4 +1,3 @@
-// Create an entry in apps.json as follows:
{ "id": "7chname",
"name": "My app's human readable name",
"shortName":"Short Name",
diff --git a/apps/_example_widget/add_to_apps.json b/apps/_example_widget/metadata.json
similarity index 89%
rename from apps/_example_widget/add_to_apps.json
rename to apps/_example_widget/metadata.json
index b55adce9d..ad4b7537d 100644
--- a/apps/_example_widget/add_to_apps.json
+++ b/apps/_example_widget/metadata.json
@@ -1,4 +1,3 @@
-// Create an entry in apps.json as follows:
{ "id": "7chname",
"name": "My widget's human readable name",
"shortName":"Short Name",
diff --git a/apps/a_clock_timer/metadata.json b/apps/a_clock_timer/metadata.json
new file mode 100644
index 000000000..cc61fc57b
--- /dev/null
+++ b/apps/a_clock_timer/metadata.json
@@ -0,0 +1,17 @@
+{
+ "id": "a_clock_timer",
+ "name": "A Clock with Timer",
+ "version": "0.01",
+ "description": "A Clock with Timer, Map and Time Zones",
+ "icon": "app.png",
+ "screenshots": [{"url":"screenshot.png"}],
+ "type": "clock",
+ "tags": "clock",
+ "supports": ["BANGLEJS2"],
+ "allow_emulator": true,
+ "readme": "README.md",
+ "storage": [
+ {"name":"a_clock_timer.app.js","url":"app.js"},
+ {"name":"a_clock_timer.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/a_speech_timer/metadata.json b/apps/a_speech_timer/metadata.json
new file mode 100644
index 000000000..6255a6b92
--- /dev/null
+++ b/apps/a_speech_timer/metadata.json
@@ -0,0 +1,16 @@
+{
+"id":"a_speech_timer",
+"name":"Speech Timer",
+"icon": "app.png",
+"version":"1.01",
+"description": "A timer designed to help keeping your speeches and presentations to time.",
+"tags": "tool,timer",
+"readme":"README.md",
+"supports":["BANGLEJS2"],
+"screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}],
+"allow_emulator": true,
+"storage": [
+ {"name":"a_speech_timer.app.js","url":"app.js"},
+ {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true}
+]
+}
diff --git a/apps/about/metadata.json b/apps/about/metadata.json
new file mode 100644
index 000000000..6c22bdc56
--- /dev/null
+++ b/apps/about/metadata.json
@@ -0,0 +1,17 @@
+{
+ "id": "about",
+ "name": "About",
+ "version": "0.12",
+ "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers",
+ "icon": "app.png",
+ "tags": "tool,system",
+ "supports": ["BANGLEJS","BANGLEJS2"],
+ "screenshots": [{"url":"bangle1-about-screenshot.png"}],
+ "allow_emulator": true,
+ "storage": [
+ {"name":"about.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]},
+ {"name":"about.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]},
+ {"name":"about.img","url":"app-icon.js","evaluate":true}
+ ],
+ "sortorder": -4
+}
diff --git a/apps/ac_ac/Customizer.html b/apps/ac_ac/Customizer.html
new file mode 100644
index 000000000..f2aa79920
--- /dev/null
+++ b/apps/ac_ac/Customizer.html
@@ -0,0 +1,890 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Please customize your analog clock for the Bangle.js 2 according to your needs.
+ When finished, click on "Upload" at the bottom of this form.
+
+ (Pressing "Upload" will also backup your current configuration so that you
+ won't have to enter the same settings over and over again when you come back
+ to this page later)
+
+
+
Clock Size Calculation
+
+
+ Click on the desired clock size calculator (if you installed some widgets
+ on your Bangle.js 2, the smart one may produce larger clock faces than the
+ simple one):
+
+
+
+
+
+ simple
+
+
+
+
+ smart
+
+
+
+
+ (custom)
+
+
+
+
+ If you prefer a "custom" clock size calculator, please enter the URL
+ of its JavaScript module below:
+
+ custom URL:
+
+
+
Clock Face
+
+
+ Click on the desired clock face:
+
+
+
+
+
+ (none)
+
+
+
+
+ four-numbered
+
+
+
+
+ twelve-numbered
+
+
+
+
+ "rainbow" colored
+
+
+
+
+ (custom)
+
+
+
+
+ If you prefer a "custom" clock face, please enter the URL
+ of its JavaScript module below:
+
+ custom URL:
+
+ Clock faces are drawn in the configured foreground and background colors
+ (you may select them at the end of this form)
+
+ "Four-numbered" clock faces may draw indian-arabic or roman numerals. Which do you prefer?
+
+ The "twelve-numbered" and "rainbow"-colored faces may be drawn with or without
+ dots marking the position of every minute. Which variant do you prefer?
+
+ without dots
+ with dots
+
+
+
Clock Hands
+
+
+ Click on the desired clock hands:
+
+
+
+
+
+ simple
+
+
+
+
+ rounded
+
+
+
+
+ hollow
+
+
+
+
+ (custom)
+
+
+
+
+ If you prefer "custom" clock hands, please enter the URL
+ of their JavaScript module below:
+
+ custom URL:
+
+ Clock hands are drawn in the configured foreground and background colors
+ (you may select them at the end of this form)
+
+ Hollow clock hands may optionally be filled with a given color. If you have
+ chosen hollow hands, please specify the desired fill mode and color below:
+
+ Hollow Hand Fill Color:
+
+
+
+
+
+
+
+
+
+
+
+
+ Additionally, all clock hands may be drawn with or without second hands.
+ If you want them to be drawn, please click on their desired color below
+ (or choose "themed" to use your Bangle's configured theme) - if not, just
+ select "none":
+
+ Second Hand Color:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Complications
+
+
+ Complications are small displays for additional information. If you want
+ one or multiple complications to be added to your clock, you'll have to
+ specify which one to be loaded and where it should be placed.
+
+ Up to 6 possible positions exist (top-left, top-right, left, right,
+ bottom-left and bottom-right). Alternatively, the positions "top-left" and
+ "top-right" may be traded for a slightly larger complication at position
+ "top" or "bottom-left" and "bottom-right" for one at the "bottom":
+
+
+
+
+
+
+
top-left:
+
+
+
Complication:
+
+
+
+
+
+
+
custom URL:
+
+
+
+
+
top:
+
+
+
Complication:
+
+
+
+
+
+
+
custom URL:
+
+
+
+
+
top-right:
+
+
+
Complication:
+
+
+
+
+
+
+
custom URL:
+
+
+
+
+
left:
+
+
+
Complication:
+
+
+
+
+
+
+
custom URL:
+
+
+
+
+
right:
+
+
+
Complication:
+
+
+
+
+
+
+
custom URL:
+
+
+
+
+
bottom-left:
+
+
+
Complication:
+
+
+
+
+
+
+
custom URL:
+
+
+
+
+
bottom:
+
+
+
Complication:
+
+
+
+
+
+
+
custom URL:
+
+
+
+
+
bottom-right:
+
+
+
Complication:
+
+
+
+
+
+
+
custom URL:
+
+
+
+
+
+
Settings
+
+
+ Color faces, hands and complications are often drawn using configurable
+ foreground and background colors.
+
+ Here you may specify these colors. Click on a color to select it - or on
+ "themed" if you want the clock to use the currently configured theme on
+ your Bangle.js 2:
+
+ Background Color:
+
+
+
+
+
+
+
+
+
+
+
+ Foreground Color:
+
+
+
+
+
+
+
+
+
+
+
+ When you are satisfied with your configuration, just click on "Upload" in
+ order to generate the specified clock and upload it to your Bangle.js 2:
+
+
+
+
+
+ This application is based on the author's
+ Analog Clock Construction Kit (ACCK).
+ If you need a different "clockwork", clock size calculation or clock face,
+ or specific clock hands or complications, just follow the link to learn how to
+ implement your own clock parts.
+
+
+
+
diff --git a/apps/ac_ac/README.md b/apps/ac_ac/README.md
new file mode 100644
index 000000000..05e5f4798
--- /dev/null
+++ b/apps/ac_ac/README.md
@@ -0,0 +1,34 @@
+# AC-AC - A Configurable Analog Clock #
+
+This app implements an analog clock with various faces, hands and complications
+to choose from before uploading to a Bangle.js 2.
+
+It is based on the [Analog Clock Construction Kit (ACCK)](https://github.com/rozek/banglejs-2-analog-clock-construction-kit)
+and makes most of the currently implemented parts available with a few mouse
+clicks - just click on "Upload" and you will be directed to a web form where
+you compose your very own, personal analog clock.
+
+You currently have the choice between
+
+* 2 different clock sizes,
+* 4 different clock faces,
+* 3 different clock hands and
+* 4 different complications
+
+Alternatively, you may specify the GitHub URL of ACCK compatible modules for
+external clock sizes, faces, hands or complications.
+
+Additionally, you may use the currently configured global theme or configure
+your own colors for clock fore- and background and second hands.
+
+Consequently, even without external modules you already have the choice between
+102144 combinations!
+
+
+
+## License ##
+
+[MIT License](LICENSE)
diff --git a/apps/ac_ac/RainbowClockFace.png b/apps/ac_ac/RainbowClockFace.png
new file mode 100644
index 000000000..2defa759b
Binary files /dev/null and b/apps/ac_ac/RainbowClockFace.png differ
diff --git a/apps/ac_ac/app-icon.js b/apps/ac_ac/app-icon.js
new file mode 100644
index 000000000..20caf2c8e
--- /dev/null
+++ b/apps/ac_ac/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwgn/ABH+AQPvBpIAI/n8/3f5/PCp/v9oHF7w1CABffGxAYMH4f9z/514YDCxW/O4gFBxwHD/ZEL7/9GgX8GwQLCBQQXH/uP/Hf/2N44IBAgIXJ7oaD/3v/3uAYIIB9wQGAA2+/iRG5oSIM4f+1nrPYgAB3aHIAC77QYYRoCAAP676ICABXYFIntDoPf3+PC5f+BoPOX4vPNBn7IogEB/eu3QXC9wNEAAeKBIP+dgbSCDYMwgEApQVEygPCeRH8iAWBAAMHPwXDgoRGAonACwYABgN5uMAC4q8GC4U0DQsAggRF9gXFgggB/2hC4kdVAQCBVAX7xwXCVAnGCwUadAeeDYfr7IhEAAf93e+A4gpB9yRB/mqcgndRgQAHzqRE1gEC/KoCjLZEsgCB9evO4gOC/RyEgqdC2KnFO4S/KgFYsC/Ga5EBs1AX5bXHgx1C2YXEnp7GCARgB4AfE64WCnawFCgf9VAK/G/3M7zWDz4PF/maXJIAD7D8EVAP85QXN3OP/42DfoQXN/wvE/ySGABa8FAC37AgepVwQ9E1SfBAAJIEAAnrBQ39xgwJ7pRHFQX+3QECCAbyG9bPDzwXC9QMBdgQXIAAf41wEC5pLCJJBcF9fZQ5IAGYYn81q7RJQwWC/wXM9/tA4veCxooDIAPv55PEABwpB97rDAAw"))
\ No newline at end of file
diff --git a/apps/ac_ac/app-icon.png b/apps/ac_ac/app-icon.png
new file mode 100644
index 000000000..b83541133
Binary files /dev/null and b/apps/ac_ac/app-icon.png differ
diff --git a/apps/ac_ac/app-screenshot.png b/apps/ac_ac/app-screenshot.png
new file mode 100644
index 000000000..0aef3fa38
Binary files /dev/null and b/apps/ac_ac/app-screenshot.png differ
diff --git a/apps/ac_ac/app.js b/apps/ac_ac/app.js
new file mode 100644
index 000000000..1d9b2e3c6
--- /dev/null
+++ b/apps/ac_ac/app.js
@@ -0,0 +1,2 @@
+let Clockwork = require('https://raw.githubusercontent.com/rozek/banglejs-2-simple-clockwork/main/Clockwork.js');
+Clockwork.windUp();
\ No newline at end of file
diff --git a/apps/ac_ac/custom.png b/apps/ac_ac/custom.png
new file mode 100644
index 000000000..14d797ba3
Binary files /dev/null and b/apps/ac_ac/custom.png differ
diff --git a/apps/ac_ac/fournumberedClockFace.png b/apps/ac_ac/fournumberedClockFace.png
new file mode 100644
index 000000000..391303b31
Binary files /dev/null and b/apps/ac_ac/fournumberedClockFace.png differ
diff --git a/apps/ac_ac/hollowClockHands.png b/apps/ac_ac/hollowClockHands.png
new file mode 100644
index 000000000..2dce42ef5
Binary files /dev/null and b/apps/ac_ac/hollowClockHands.png differ
diff --git a/apps/ac_ac/largePlaceholders.png b/apps/ac_ac/largePlaceholders.png
new file mode 100644
index 000000000..b7272e57c
Binary files /dev/null and b/apps/ac_ac/largePlaceholders.png differ
diff --git a/apps/ac_ac/metadata.json b/apps/ac_ac/metadata.json
new file mode 100644
index 000000000..a4f3de0ac
--- /dev/null
+++ b/apps/ac_ac/metadata.json
@@ -0,0 +1,18 @@
+{ "id": "ac_ac",
+ "name": "A Configurable Analog Clock",
+ "shortName":"Configurable Clock",
+ "version":"0.03",
+ "description": "AC-AC, a highly customizable analog clock with several clock faces, hands and complications to choose from",
+ "icon": "app-icon.png",
+ "type": "clock",
+ "tags": "clock",
+ "supports" : ["BANGLEJS2"],
+ "allow_emulator": false,
+ "screenshots": [{"url":"app-screenshot.png"}],
+ "readme": "README.md",
+ "custom": "Customizer.html",
+ "storage": [
+ {"name":"ac_ac.app.js","url":"app.js"},
+ {"name":"ac_ac.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/ac_ac/none.png b/apps/ac_ac/none.png
new file mode 100644
index 000000000..6f8d8ae14
Binary files /dev/null and b/apps/ac_ac/none.png differ
diff --git a/apps/ac_ac/roundedClockHands.png b/apps/ac_ac/roundedClockHands.png
new file mode 100644
index 000000000..cbd48e856
Binary files /dev/null and b/apps/ac_ac/roundedClockHands.png differ
diff --git a/apps/ac_ac/simpleClockHands.png b/apps/ac_ac/simpleClockHands.png
new file mode 100644
index 000000000..820606f27
Binary files /dev/null and b/apps/ac_ac/simpleClockHands.png differ
diff --git a/apps/ac_ac/simpleClockSize.png b/apps/ac_ac/simpleClockSize.png
new file mode 100644
index 000000000..49650586e
Binary files /dev/null and b/apps/ac_ac/simpleClockSize.png differ
diff --git a/apps/ac_ac/smallPlaceholders.png b/apps/ac_ac/smallPlaceholders.png
new file mode 100644
index 000000000..43569e56d
Binary files /dev/null and b/apps/ac_ac/smallPlaceholders.png differ
diff --git a/apps/ac_ac/smartClockSize.png b/apps/ac_ac/smartClockSize.png
new file mode 100644
index 000000000..6891acc89
Binary files /dev/null and b/apps/ac_ac/smartClockSize.png differ
diff --git a/apps/ac_ac/twelvenumberedClockFace.png b/apps/ac_ac/twelvenumberedClockFace.png
new file mode 100644
index 000000000..fc04d865e
Binary files /dev/null and b/apps/ac_ac/twelvenumberedClockFace.png differ
diff --git a/apps/accelgraph/ChangeLog b/apps/accelgraph/ChangeLog
new file mode 100644
index 000000000..5560f00bc
--- /dev/null
+++ b/apps/accelgraph/ChangeLog
@@ -0,0 +1 @@
+0.01: New App!
diff --git a/apps/accelgraph/app-icon.js b/apps/accelgraph/app-icon.js
new file mode 100644
index 000000000..d45b8cc63
--- /dev/null
+++ b/apps/accelgraph/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEw4UA/4AB304ief85L/ABNVAAwKCgILHoALBgoLHqALOrVVr4BEBZIFBBYiaCAAPq2oLQEYlqF5VrBZWnBZWvBZNWz4LGBoQLHJ4O///6v/1BZHa/4LFLYOlr9pR49r1ILJ09qr4ZBBY2vrWdBY5PBq2uyoLIquqBY5bBKoZTFLYILJJ4STDBY77IJ4QLUJ4QLU1QAE0oLPqoAGBZ0BBY9ABYMABY4KCAH4AGA="))
diff --git a/apps/accelgraph/app.js b/apps/accelgraph/app.js
new file mode 100644
index 000000000..a59d636d2
--- /dev/null
+++ b/apps/accelgraph/app.js
@@ -0,0 +1,24 @@
+Bangle.loadWidgets();
+g.clear(1);
+Bangle.drawWidgets();
+var R = Bangle.appRect;
+
+var x = 0;
+var last;
+
+function getY(v) {
+ return (R.y+R.y2 + v*R.h/2)/2;
+}
+Bangle.on('accel', a => {
+ g.reset();
+ if (last) {
+ g.setColor("#f00").drawLine(x-1,getY(last.x),x,getY(a.x));
+ g.setColor("#0f0").drawLine(x-1,getY(last.y),x,getY(a.y));
+ g.setColor("#00f").drawLine(x-1,getY(last.z),x,getY(a.z));
+ }
+ last = a;x++;
+ if (x>=g.getWidth()) {
+ x = 1;
+ g.clearRect(R);
+ }
+});
diff --git a/apps/accelgraph/app.png b/apps/accelgraph/app.png
new file mode 100644
index 000000000..b0ba00ee7
Binary files /dev/null and b/apps/accelgraph/app.png differ
diff --git a/apps/accelgraph/metadata.json b/apps/accelgraph/metadata.json
new file mode 100644
index 000000000..e4c1ae0a5
--- /dev/null
+++ b/apps/accelgraph/metadata.json
@@ -0,0 +1,14 @@
+{ "id": "accelgraph",
+ "name": "Accelerometer Graph",
+ "shortName":"Accel Graph",
+ "version":"0.01",
+ "description": "A simple app to draw a graph of data from the accelerometer on the screen",
+ "icon": "app.png",
+ "tags": "tool,debug",
+ "supports" : ["BANGLEJS","BANGLEJS2"],
+ "screenshots": [{"url":"screenshot.png"}],
+ "storage": [
+ {"name":"accelgraph.app.js","url":"app.js"},
+ {"name":"accelgraph.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/accelgraph/screenshot.png b/apps/accelgraph/screenshot.png
new file mode 100644
index 000000000..404243d85
Binary files /dev/null and b/apps/accelgraph/screenshot.png differ
diff --git a/apps/accellog/metadata.json b/apps/accellog/metadata.json
new file mode 100644
index 000000000..a30c9a6fc
--- /dev/null
+++ b/apps/accellog/metadata.json
@@ -0,0 +1,17 @@
+{
+ "id": "accellog",
+ "name": "Acceleration Logger",
+ "shortName": "Accel Log",
+ "version": "0.03",
+ "description": "Logs XYZ acceleration data to a CSV file that can be downloaded to your PC",
+ "icon": "app.png",
+ "tags": "outdoor",
+ "supports": ["BANGLEJS","BANGLEJS2"],
+ "readme": "README.md",
+ "interface": "interface.html",
+ "storage": [
+ {"name":"accellog.app.js","url":"app.js"},
+ {"name":"accellog.img","url":"app-icon.js","evaluate":true}
+ ],
+ "data": [{"wildcard":"accellog.?.csv"}]
+}
diff --git a/apps/accelrec/metadata.json b/apps/accelrec/metadata.json
new file mode 100644
index 000000000..8b082c8bc
--- /dev/null
+++ b/apps/accelrec/metadata.json
@@ -0,0 +1,17 @@
+{
+ "id": "accelrec",
+ "name": "Acceleration Recorder",
+ "shortName": "Accel Rec",
+ "version": "0.02",
+ "description": "This app puts the Bangle's accelerometer into 100Hz mode and reads 2 seconds worth of data after movement starts. The data can then be exported back to the PC.",
+ "icon": "app.png",
+ "tags": "",
+ "supports": ["BANGLEJS"],
+ "readme": "README.md",
+ "interface": "interface.html",
+ "storage": [
+ {"name":"accelrec.app.js","url":"app.js"},
+ {"name":"accelrec.img","url":"app-icon.js","evaluate":true}
+ ],
+ "data": [{"wildcard":"accelrec.?.csv"}]
+}
diff --git a/apps/aclock/metadata.json b/apps/aclock/metadata.json
new file mode 100644
index 000000000..c483a4e8c
--- /dev/null
+++ b/apps/aclock/metadata.json
@@ -0,0 +1,16 @@
+{
+ "id": "aclock",
+ "name": "Analog Clock",
+ "version": "0.15",
+ "description": "An Analog Clock",
+ "icon": "clock-analog.png",
+ "screenshots": [{"url":"screenshot_analog.png"}],
+ "type": "clock",
+ "tags": "clock",
+ "supports": ["BANGLEJS","BANGLEJS2"],
+ "allow_emulator": true,
+ "storage": [
+ {"name":"aclock.app.js","url":"clock-analog.js"},
+ {"name":"aclock.img","url":"clock-analog-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/acmaze/ChangeLog b/apps/acmaze/ChangeLog
new file mode 100644
index 000000000..b8c1ec0b5
--- /dev/null
+++ b/apps/acmaze/ChangeLog
@@ -0,0 +1,3 @@
+0.01: New App!
+0.02: Faster maze generation
+0.03: Avoid clearing bottom widgets
diff --git a/apps/acmaze/README.md b/apps/acmaze/README.md
new file mode 100644
index 000000000..4724eea3e
--- /dev/null
+++ b/apps/acmaze/README.md
@@ -0,0 +1,17 @@
+# AccelaMaze
+
+Tilt the watch to roll a ball through a maze.
+
+
+
+## Usage
+
+* Use the menu to select difficulty level (or exit).
+* Wait until the maze gets generated and a red ball appears.
+* Tilt the watch to get the ball into the green cell.
+
+At any time you can click the button to return to the menu.
+
+## Creator
+
+[Nimrod Kerrett](https://zzzen.com)
diff --git a/apps/acmaze/app-icon.js b/apps/acmaze/app-icon.js
new file mode 100644
index 000000000..8bd043b8b
--- /dev/null
+++ b/apps/acmaze/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwggaXh3M53/AA3yl4IHn//+EM5nMAoIX/C4RfCC4szmcxC4QFBAAUxC4UPAwIOB+YCCiMRkAFCkIGBAAQfBC4IUEAQhHIAAQX/C5EDmcyCgUTAoYXDR4kzC4UBPoKVB+YFFAQSPBiAKBiCnDGoZECABDUCa4YX/C5qPBQwoXGkczmC/FQYSSCVQSSCEwQOCC4hKFX4QXCd5YX/C4qMEmQXITAinDPoIADTwSPFkKMBX47RGI47XIC/4XCgZ9DQYYABmKYBmIXFkczmEBRIK/CQYQIBkECSoiSCA4MQa5pEFd6IX/RgMyC6H/QASVCRIS/EAQrXFJQoX/C6kDRQIXCiYFD+QFBmIUCkYFD+CJBiSPCRwIFFSoQFCiF3u9wI4gAO+wXW+IXygAAW"))
diff --git a/apps/acmaze/app.js b/apps/acmaze/app.js
new file mode 100644
index 000000000..16a1ce561
--- /dev/null
+++ b/apps/acmaze/app.js
@@ -0,0 +1,287 @@
+const MARGIN = 25;
+const WALL_RIGHT = 1, WALL_DOWN = 2;
+const STATUS_GENERATING = 0, STATUS_PLAYING = 1,
+ STATUS_SOLVED = 2, STATUS_ABORTED = -1;
+
+function Maze(n) {
+ this.n = n;
+ this.status = STATUS_GENERATING;
+ this.wall_length = Math.floor((g.getHeight()-2*MARGIN)/n);
+ this.total_length = this.wall_length*n;
+ this.margin = Math.floor((g.getHeight()-this.total_length)/2);
+ this.ball_x = 0;
+ this.ball_y = 0;
+ // This voodoo is needed because otherwise
+ // bottom line widgets (like digital clock)
+ // disappear during maze generation
+ Bangle.drawWidgets();
+ g.setColor(g.theme.fg);
+ for (let i=0; i<=n; i++) {
+ g.drawRect(
+ this.margin, this.margin+i*this.wall_length,
+ g.getWidth()-this.margin, this.margin+i*this.wall_length
+ );
+ g.drawRect(
+ this.margin+i*this.wall_length, this.margin,
+ this.margin+i*this.wall_length, g.getHeight() - this.margin
+ );
+ }
+ this.walls = new Uint8Array(n*n);
+ this.groups = new Uint8Array(n*n);
+ for (let cell = 0; cell0 && !(this.walls[n*(ball_r-1)+ball_c]&WALL_DOWN)) {
+ next_y--;
+ } else if (dy>0 && ball_r<(this.n-1) && !(this.walls[n*ball_r+ball_c]&WALL_DOWN)) {
+ next_y++;
+ } else if (dx<0 && ball_c>0 && !(this.walls[n*ball_r+ball_c-1]&WALL_RIGHT)) {
+ next_x--;
+ } else if (dx>0 && ball_c<(this.n-1) && !(this.walls[n*ball_r+ball_c]&WALL_RIGHT)) {
+ next_x++;
+ } else {
+ return false;
+ }
+ }
+ this.clearCell(ball_r, ball_c);
+ if (this.ball_x%this.wall_length) {
+ this.clearCell(ball_r, ball_c+1);
+ }
+ if (this.ball_y%this.wall_length) {
+ this.clearCell(ball_r+1, ball_c);
+ }
+ this.ball_x = next_x;
+ this.ball_y = next_y;
+ this.drawBall(this.ball_x, this.ball_y);
+ if (this.ball_x==(n-1)*this.wall_length && this.ball_y==(n-1)*this.wall_length) {
+ this.status = STATUS_SOLVED;
+ }
+ return true;
+ };
+ this.try_move_horizontally = function(accel_x) {
+ if (accel_x>0.15) {
+ return this.move(-1, 0);
+ } else if (accel_x<-0.15) {
+ return this.move(1, 0);
+ }
+ return false;
+ };
+ this.try_move_vertically = function(accel_y) {
+ if (accel_y<-0.15) {
+ return this.move(0,1);
+ } else if (accel_y>0.15) {
+ return this.move(0,-1);
+ }
+ return false;
+ };
+ this.tick = function() {
+ accel = Bangle.getAccel();
+ if (this.ball_x%this.wall_length) {
+ this.try_move_horizontally(accel.x);
+ } else if (this.ball_y%this.wall_length) {
+ this.try_move_vertically(accel.y);
+ } else {
+ if (Math.abs(accel.x)>Math.abs(accel.y)) { // prefer horizontally
+ if (!this.try_move_horizontally(accel.x)) {
+ this.try_move_vertically(accel.y);
+ }
+ } else { // prefer vertically
+ if (!this.try_move_vertically(accel.y)) {
+ this.try_move_horizontally(accel.x);
+ }
+ }
+ }
+ };
+ this.clearCell(0,0);
+ this.clearCell(n-1,n-1);
+ this.drawBall(0,0);
+ this.status = STATUS_PLAYING;
+}
+
+function timeToText(t) { // Courtesy of stopwatch app
+ let hrs = Math.floor(t/3600000);
+ let mins = Math.floor(t/60000)%60;
+ let secs = Math.floor(t/1000)%60;
+ let tnth = Math.floor(t/100)%10;
+ let text;
+
+ if (hrs === 0)
+ text = ("0"+mins).substr(-2) + ":" + ("0"+secs).substr(-2) + "." + tnth;
+ else
+ text = ("0"+hrs) + ":" + ("0"+mins).substr(-2) + ":" + ("0"+secs).substr(-2);
+ return text;
+}
+
+let aborting = false;
+let start_time = 0;
+let duration = 0;
+let maze=null;
+let mazeMenu = {
+ "": { "title": "Maze size", "selected": 1 },
+ "Easy (8x8)": function() { E.showMenu(); maze = new Maze(8); },
+ "Medium (10x10)": function() { E.showMenu(); maze = new Maze(10); },
+ "Hard (14x14)": function() { E.showMenu(); maze = new Maze(14); },
+ "< Exit": function() { setTimeout(load, 100); } // timeout voodoo prevents deadlock
+};
+
+g.reset();
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+Bangle.setLocked(false);
+Bangle.setLCDTimeout(0);
+E.showMenu(mazeMenu);
+let maze_interval = setInterval(
+ function() {
+ if (maze) {
+ if (digitalRead(BTN1) || maze.status==STATUS_ABORTED) {
+ maze = null;
+ start_time = duration = 0;
+ aborting = false;
+ setTimeout(function() {E.showMenu(mazeMenu); }, 100);
+ return;
+ }
+ if (!start_time) {
+ start_time = Date.now();
+ }
+ if (maze.status==STATUS_PLAYING) {
+ maze.tick();
+ }
+ if (maze.status==STATUS_SOLVED && !duration) {
+ duration = Date.now()-start_time;
+ g.setFontAlign(0,0).setColor(g.theme.fg);
+ g.setFont("Vector",18);
+ g.drawString(`Solved ${maze.n}X${maze.n} in\n ${timeToText(duration)} \nBtn1 to play again`, g.getWidth()/2, g.getHeight()/2, true);
+ }
+ }
+ }, 25);
diff --git a/apps/acmaze/app.png b/apps/acmaze/app.png
new file mode 100644
index 000000000..0d96448b1
Binary files /dev/null and b/apps/acmaze/app.png differ
diff --git a/apps/acmaze/metadata.json b/apps/acmaze/metadata.json
new file mode 100644
index 000000000..d8ab8fa62
--- /dev/null
+++ b/apps/acmaze/metadata.json
@@ -0,0 +1,15 @@
+{ "id": "acmaze",
+ "name": "AccelaMaze",
+ "shortName":"AccelaMaze",
+ "version":"0.03",
+ "description": "Tilt the watch to roll a ball through a maze.",
+ "icon": "app.png",
+ "tags": "game",
+ "supports" : ["BANGLEJS2"],
+ "readme": "README.md",
+ "screenshots": [{"url":"screenshot.png"}],
+ "storage": [
+ {"name":"acmaze.app.js","url":"app.js"},
+ {"name":"acmaze.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/acmaze/screenshot.png b/apps/acmaze/screenshot.png
new file mode 100644
index 000000000..4b7217b97
Binary files /dev/null and b/apps/acmaze/screenshot.png differ
diff --git a/apps/activepedom/metadata.json b/apps/activepedom/metadata.json
new file mode 100644
index 000000000..4deb7006d
--- /dev/null
+++ b/apps/activepedom/metadata.json
@@ -0,0 +1,18 @@
+{
+ "id": "activepedom",
+ "name": "Active Pedometer",
+ "shortName": "Active Pedometer",
+ "version": "0.09",
+ "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.",
+ "icon": "app.png",
+ "tags": "outdoors,widget",
+ "supports": ["BANGLEJS"],
+ "readme": "README.md",
+ "screenshots": [{"url":"600.png"},{"url":"10600.png"},{"url":"1600.png"}],
+ "storage": [
+ {"name":"activepedom.wid.js","url":"widget.js"},
+ {"name":"activepedom.settings.js","url":"settings.js"},
+ {"name":"activepedom.img","url":"app-icon.js","evaluate":true},
+ {"name":"activepedom.app.js","url":"app.js"}
+ ]
+}
diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json
new file mode 100644
index 000000000..3e109bda9
--- /dev/null
+++ b/apps/alarm/metadata.json
@@ -0,0 +1,18 @@
+{
+ "id": "alarm",
+ "name": "Default Alarm & Timer",
+ "shortName": "Alarms",
+ "version": "0.14",
+ "description": "Set and respond to alarms and timers",
+ "icon": "app.png",
+ "tags": "tool,alarm,widget",
+ "supports": ["BANGLEJS","BANGLEJS2"],
+ "storage": [
+ {"name":"alarm.app.js","url":"app.js"},
+ {"name":"alarm.boot.js","url":"boot.js"},
+ {"name":"alarm.js","url":"alarm.js"},
+ {"name":"alarm.img","url":"app-icon.js","evaluate":true},
+ {"name":"alarm.wid.js","url":"widget.js"}
+ ],
+ "data": [{"name":"alarm.json"}]
+}
diff --git a/apps/alpinenav/metadata.json b/apps/alpinenav/metadata.json
new file mode 100644
index 000000000..dcb56e912
--- /dev/null
+++ b/apps/alpinenav/metadata.json
@@ -0,0 +1,14 @@
+{
+ "id": "alpinenav",
+ "name": "Alpine Nav",
+ "version": "0.01",
+ "description": "App that performs GPS monitoring to track and display position relative to a given origin in realtime",
+ "icon": "app-icon.png",
+ "tags": "outdoors,gps",
+ "supports": ["BANGLEJS"],
+ "readme": "README.md",
+ "storage": [
+ {"name":"alpinenav.app.js","url":"app.js"},
+ {"name":"alpinenav.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/analogimgclk/metadata.json b/apps/analogimgclk/metadata.json
new file mode 100644
index 000000000..c33ac3a46
--- /dev/null
+++ b/apps/analogimgclk/metadata.json
@@ -0,0 +1,16 @@
+{
+ "id": "analogimgclk",
+ "name": "Analog Clock (Image background)",
+ "shortName": "Analog Clock",
+ "version": "0.03",
+ "description": "An analog clock with an image background",
+ "icon": "app.png",
+ "type": "clock",
+ "tags": "clock",
+ "supports": ["BANGLEJS"],
+ "storage": [
+ {"name":"analogimgclk.app.js","url":"app.js"},
+ {"name":"analogimgclk.bg.img","url":"bg.img"},
+ {"name":"analogimgclk.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/andark/metadata.json b/apps/andark/metadata.json
new file mode 100644
index 000000000..3e2b3116e
--- /dev/null
+++ b/apps/andark/metadata.json
@@ -0,0 +1,15 @@
+{ "id": "andark",
+ "name": "Analog Dark",
+ "shortName":"AnDark",
+ "version":"0.04",
+ "description": "analog clock face without disturbing widgets",
+ "icon": "andark_icon.png",
+ "type": "clock",
+ "tags": "clock",
+ "supports" : ["BANGLEJS2"],
+ "readme": "README.md",
+ "storage": [
+ {"name":"andark.app.js","url":"app.js"},
+ {"name":"andark.img","url":"app_icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/android/ChangeLog b/apps/android/ChangeLog
index c2c4ea6be..0d837fe43 100644
--- a/apps/android/ChangeLog
+++ b/apps/android/ChangeLog
@@ -4,3 +4,4 @@
0.03: Handling of message actions (ok/clear)
0.04: Android icon now goes to settings page with 'find phone'
0.05: Fix handling of message actions
+0.06: Option to keep messages after a disconnect (default false) (fix #1186)
diff --git a/apps/android/README.md b/apps/android/README.md
new file mode 100644
index 000000000..c10718aac
--- /dev/null
+++ b/apps/android/README.md
@@ -0,0 +1,48 @@
+# Android Integration
+
+This app allows your Bangle.js to receive notifications [from the Gadgetbridge app on Android](http://www.espruino.com/Gadgetbridge)
+
+See [this link](http://www.espruino.com/Gadgetbridge) for notes on how to install
+the Android app (and how it works).
+
+It requires the `Messages` app on Bangle.js (which should be automatically installed) to
+display any notifications that are received.
+
+## Settings
+
+You can access the settings menu either from the `Android` icon in the launcher,
+or from `App Settings` in the `Settings` menu.
+
+It contains:
+
+* `Connected` - shows whether there is an active Bluetooth connection or not
+* `Find Phone` - opens a submenu where you can activate the `Find Phone` functionality
+of Gadgetbridge - making your phone make noise so you can find it.
+* `Keep Msgs` - default is `Off`. When Gadgetbridge disconnects, should Bangle.js
+keep any messages it has received, or should it delete them?
+* `Messages` - launches the messages app, showing a list of messages
+
+## How it works
+
+Gadgetbridge on Android connects to Bangle.js, and sends commands over the
+BLE UART connection. These take the form of `GB({ ... JSON ... })\n` - so they
+call a global function called `GB` which then interprets the JSON.
+
+Responses are sent back to Gadgetbridge simply as one line of JSON.
+
+More info on message formats on http://www.espruino.com/Gadgetbridge
+
+## Testing
+
+Bangle.js can only hold one connection open at a time, so it's hard to see
+if there are any errors when handling Gadgetbridge messages.
+
+However you can:
+
+* Use the `Gadgetbridge Debug` app on Bangle.js to display/log the messages received from Gadgetbridge
+* Connect with the Web IDE and manually enter the Gadgetbridge messages on the left-hand side to
+execute them as if they came from Gadgetbridge, for instance:
+
+```
+GB({"t":"notify","id":1575479849,"src":"Hangouts","title":"A Name","body":"message contents"})
+```
diff --git a/apps/android/boot.js b/apps/android/boot.js
index 59ffe006d..fff9ad444 100644
--- a/apps/android/boot.js
+++ b/apps/android/boot.js
@@ -4,6 +4,7 @@
Bluetooth.println(JSON.stringify(message));
}
+ var settings = require("Storage").readJSON("android.settings.json",1)||{};
var _GB = global.GB;
global.GB = (event) => {
// feed a copy to other handlers if there were any
@@ -51,7 +52,8 @@
// Battery monitor
function sendBattery() { gbSend({ t: "status", bat: E.getBattery() }); }
NRF.on("connect", () => setTimeout(sendBattery, 2000));
- NRF.on("disconnect", () => require("messages").clearAll()); // remove all messages on disconnect
+ if (!settings.keep)
+ NRF.on("disconnect", () => require("messages").clearAll()); // remove all messages on disconnect
setInterval(sendBattery, 10*60*1000);
// Health tracking
Bangle.on('health', health=>{
@@ -68,4 +70,6 @@
if (isFinite(msg.id)) return gbSend({ t: "notify", n:response?"OPEN":"DISMISS", id: msg.id });
// error/warn here?
};
+ // remove settings object so it's not taking up RAM
+ delete settings;
})();
diff --git a/apps/android/metadata.json b/apps/android/metadata.json
new file mode 100644
index 000000000..6b780ff55
--- /dev/null
+++ b/apps/android/metadata.json
@@ -0,0 +1,20 @@
+{
+ "id": "android",
+ "name": "Android Integration",
+ "shortName": "Android",
+ "version": "0.06",
+ "description": "Display notifications/music/etc sent from the Gadgetbridge app on Android. This replaces the old 'Gadgetbridge' Bangle.js widget.",
+ "icon": "app.png",
+ "tags": "tool,system,messages,notifications,gadgetbridge",
+ "dependencies": {"messages":"app"},
+ "supports": ["BANGLEJS","BANGLEJS2"],
+ "readme": "README.md",
+ "storage": [
+ {"name":"android.app.js","url":"app.js"},
+ {"name":"android.settings.js","url":"settings.js"},
+ {"name":"android.img","url":"app-icon.js","evaluate":true},
+ {"name":"android.boot.js","url":"boot.js"}
+ ],
+ "data": [{"name":"android.settings.json"}],
+ "sortorder": -8
+}
diff --git a/apps/android/settings.js b/apps/android/settings.js
index d241397a4..7c46a1fc0 100644
--- a/apps/android/settings.js
+++ b/apps/android/settings.js
@@ -2,17 +2,29 @@
function gb(j) {
Bluetooth.println(JSON.stringify(j));
}
+ var settings = require("Storage").readJSON("android.settings.json",1)||{};
+ function updateSettings() {
+ require("Storage").writeJSON("android.settings.json", settings);
+ }
var mainmenu = {
"" : { "title" : "Android" },
"< Back" : back,
- "Connected" : { value : NRF.getSecurityStatus().connected?"Yes":"No" },
+ /*LANG*/"Connected" : { value : NRF.getSecurityStatus().connected?"Yes":"No" },
"Find Phone" : () => E.showMenu({
"" : { "title" : "Find Phone" },
"< Back" : ()=>E.showMenu(mainmenu),
- "On" : _=>gb({t:"findPhone",n:true}),
- "Off" : _=>gb({t:"findPhone",n:false}),
+ /*LANG*/"On" : _=>gb({t:"findPhone",n:true}),
+ /*LANG*/"Off" : _=>gb({t:"findPhone",n:false}),
}),
- "Messages" : ()=>load("messages.app.js")
+ /*LANG*/"Keep Msgs" : {
+ value : !!settings.keep,
+ format : v=>v?/*LANG*/"Yes":/*LANG*/"No",
+ onchange: v => {
+ settings.keep = v;
+ updateSettings();
+ }
+ },
+ /*LANG*/"Messages" : ()=>load("messages.app.js")
};
E.showMenu(mainmenu);
})
diff --git a/apps/animals/metadata.json b/apps/animals/metadata.json
new file mode 100644
index 000000000..773f0fd0a
--- /dev/null
+++ b/apps/animals/metadata.json
@@ -0,0 +1,21 @@
+{
+ "id": "animals",
+ "name": "Animals Game",
+ "version": "0.01",
+ "description": "Simple toddler's game - displays a different number of animals each time the screen is pressed",
+ "icon": "animals.png",
+ "tags": "game",
+ "supports": ["BANGLEJS"],
+ "storage": [
+ {"name":"animals.app.js","url":"animals.js"},
+ {"name":"animals.img","url":"animals-icon.js","evaluate":true},
+ {"name":"animals-snake.img","url":"animals-snake.js","evaluate":true},
+ {"name":"animals-duck.img","url":"animals-duck.js","evaluate":true},
+ {"name":"animals-swan.img","url":"animals-swan.js","evaluate":true},
+ {"name":"animals-fox.img","url":"animals-fox.js","evaluate":true},
+ {"name":"animals-camel.img","url":"animals-camel.js","evaluate":true},
+ {"name":"animals-pig.img","url":"animals-pig.js","evaluate":true},
+ {"name":"animals-sheep.img","url":"animals-sheep.js","evaluate":true},
+ {"name":"animals-mouse.img","url":"animals-mouse.js","evaluate":true}
+ ]
+}
diff --git a/apps/animclk/metadata.json b/apps/animclk/metadata.json
new file mode 100644
index 000000000..31dfe453f
--- /dev/null
+++ b/apps/animclk/metadata.json
@@ -0,0 +1,18 @@
+{
+ "id": "animclk",
+ "name": "Animated Clock",
+ "shortName": "Anim Clock",
+ "version": "0.03",
+ "description": "An animated clock face using Mark Ferrari's amazing 8 bit game art and palette cycling: http://www.markferrari.com/art/8bit-game-art",
+ "icon": "app.png",
+ "type": "clock",
+ "tags": "clock,animated",
+ "supports": ["BANGLEJS"],
+ "storage": [
+ {"name":"animclk.app.js","url":"app.js"},
+ {"name":"animclk.pixels1","url":"animclk.pixels1"},
+ {"name":"animclk.pixels2","url":"animclk.pixels2"},
+ {"name":"animclk.pal","url":"animclk.pal"},
+ {"name":"animclk.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/antonclk/ChangeLog b/apps/antonclk/ChangeLog
index f88276a90..4dca8053e 100644
--- a/apps/antonclk/ChangeLog
+++ b/apps/antonclk/ChangeLog
@@ -1,3 +1,10 @@
0.01: New App!
0.02: Load widgets after setUI so widclk knows when to hide
0.03: Clock now shows day of week under date.
+0.04: Clock can optionally show seconds, date optionally in ISO-8601 format, weekdays and uppercase configurable, too.
+0.05: Clock can optionally show ISO-8601 calendar weeknumber (default: Off)
+ when weekday name "Off": week #:
+ when weekday name "On": weekday name is cut at 6th position and .# is added
+0.06: fixes #1271 - wrong settings name
+ when weekday name and calendar weeknumber are on then display is #
+ week is buffered until date or timezone changes
\ No newline at end of file
diff --git a/apps/antonclk/README.md b/apps/antonclk/README.md
new file mode 100644
index 000000000..28a38f5fd
--- /dev/null
+++ b/apps/antonclk/README.md
@@ -0,0 +1,79 @@
+# Anton Clock - Large font digital watch with seconds and date
+
+Anton clock uses the "Anton" bold font to show the time in a clear, easily readable manner. On the Bangle.js 2, the time can be read easily even if the screen is locked and unlit.
+
+## Features
+
+The basic time representation only shows hours and minutes of the current time. However, Anton clock can show additional information:
+
+* Seconds can be shown, either always or only if the screen is unlocked.
+* To help easy recognition, the seconds can be coloured in blue on the Bangle.js 2.
+* Date can be shown in three different formats:
+ * ISO-8601: 2021-12-19
+ * short local format: 19/12/2021, 19.12.2021
+ * long local format: DEC 19 2021
+* Weekday can be shown (on seconds screen only instead of year)
+
+## Usage
+
+Install Anton clock through the Bangle.js app loader.
+Configure it through the default Bangle.js configuration mechanism
+(Settings app, "Apps" menu, "Anton clock" submenu).
+If you like it, make it your default watch face
+(Settings app, "System" menu, "Clock" submenu, select "Anton clock").
+
+## Configuration
+
+Anton clock is configured by the standard settings mechanism of Bangle.js's operating system:
+Open the "Settings" app, then the "Apps" submenu and below it the "Anton clock" menu.
+You configure Anton clock through several "on/off" switches in two menus.
+
+### The main menu
+
+The main menu contains several settings covering Anton clock in general.
+
+* **Seconds...** - Opens the submenu for configuring the presentation of the current time's seconds.
+* **Date** - Format of the date representation. Possible values are
+ * **Long** - "Long" date format in the current locale. Usually with the month as name, not number.
+ * **Short** - "Short" date format in the current locale. Usually with the month as number.
+ * **ISO8601** - Show the date in ISO-8601 format (YYYY-MM-DD), irrespective of the current locale.
+* **Show Weekday** - Weekday is shown in the time presentation without seconds.
+Weekday name depends on the current locale.
+If seconds are shown, the weekday is never shown as there is not enough space on the watch face.
+* **Show CalWeek** - Week-number (ISO-8601) is shown. (default: Off)
+If "Show Weekday" is "Off" displays the week-number as "week #".
+If "Show Weekday" is "On" displays "weekday name short" with " #" .
+If seconds are shown, the week number is never shown as there is not enough space on the watch face.
+* **Vector font** - Use the built-in vector font for dates and weekday.
+This can improve readability.
+Otherwise, a scaled version of the built-in 6x8 pixels font is used.
+
+### The "Seconds" submenu
+
+The "Seconds" submenu configures how (and if) seconds are shown on the "Anton" watch face.
+
+* **Show** - Configure when the seconds should be shown at all:
+ * **Never** - Seconds are never shown.
+In this case, hour and minute are a bit more centered on the screen and the clock will always only update every minute.
+This saves battery power.
+ * **Unlocked** - Seconds are shown if the display is unlocked.
+On locked displays, only hour, minutes, date and optionally the weekday are shown.
+_This option is highly recommended on the Bangle.js 2!_
+ * **Always** - Seconds are _always_ shown, irrespective of the display's unlock state.
+_Enabling this option increases power consumption as the watch face will update once per second instead of once per minute._
+* **With ":"** - If enabled, a colon ":" is prepended to the seconds.
+This resembles the usual time representation "hh:mm:ss", even though the seconds are printed on a separate line.
+* **Color** - If enabled, seconds are shown in blue instead of black.
+If the date is shown on the seconds screen, it is colored read instead of black.
+This make the visual orientation much easier on the watch face.
+* **Date** - It is possible to show the date together with the seconds:
+ * **No** - Date is _not_ shown in the seconds screen.
+In this case, the seconds are centered below hour and minute.
+ * **Year** - Date is shown with day, month, and year. If "Date" in the main settings is configured to _ISO8601_, this is used here, too. Otherwise, the short local format is used.
+ * **Weekday** - Date is shown with day, month, and weekday.
+
+The date is coloured in red if the "Coloured" option is chosen.
+
+## Compatibility
+
+Anton clock makes use of core Bangle.js 2 features (coloured display, display lock state). It also runs on the Bangle.js 1 but these features are not available there due to hardware restrictions.
diff --git a/apps/antonclk/app.js b/apps/antonclk/app.js
index 7912dfc0f..7b40d8eb5 100644
--- a/apps/antonclk/app.js
+++ b/apps/antonclk/app.js
@@ -1,61 +1,230 @@
+// Clock with large digits using the "Anton" bold font
+
+const SETTINGSFILE = "antonclk.json";
+
Graphics.prototype.setFontAnton = function(scale) {
-// Actual height 69 (68 - 0)
- g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAA/gAAAAAAAAAAP/gAAAAAAAAAH//gAAAAAAAAB///gAAAAAAAAf///gAAAAAAAP////gAAAAAAD/////gAAAAAA//////gAAAAAP//////gAAAAH///////gAAAB////////gAAAf////////gAAP/////////gAD//////////AA//////////gAA/////////4AAA////////+AAAA////////gAAAA///////wAAAAA//////8AAAAAA//////AAAAAAA/////gAAAAAAA////4AAAAAAAA///+AAAAAAAAA///gAAAAAAAAA//wAAAAAAAAAA/8AAAAAAAAAAA/AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////AAAAAB///////8AAAAH////////AAAAf////////wAAA/////////4AAB/////////8AAD/////////+AAH//////////AAP//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wA//8AAAAAB//4A//wAAAAAAf/4A//gAAAAAAP/4A//gAAAAAAP/4A//gAAAAAAP/4A//wAAAAAAf/4A///////////4Af//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH//////////AAD/////////+AAB/////////8AAA/////////4AAAP////////gAAAD///////+AAAAAf//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAP/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/AAAAAAAAAAA//AAAAAAAAAAA/+AAAAAAAAAAB/8AAAAAAAAAAD//////////gAH//////////gAP//////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAB/gAAD//4AAAAf/gAAP//4AAAB//gAA///4AAAH//gAB///4AAAf//gAD///4AAA///gAH///4AAD///gAP///4AAH///gAP///4AAP///gAf///4AAf///gAf///4AB////gAf///4AD////gA////4AH////gA////4Af////gA////4A/////gA//wAAB/////gA//gAAH/////gA//gAAP/////gA//gAA///8//gA//gAD///w//gA//wA////g//gA////////A//gA///////8A//gA///////4A//gAf//////wA//gAf//////gA//gAf/////+AA//gAP/////8AA//gAP/////4AA//gAH/////gAA//gAD/////AAA//gAB////8AAA//gAA////wAAA//gAAP///AAAA//gAAD//8AAAA//gAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+AAAAAD/wAAB//8AAAAP/wAAB///AAAA//wAAB///wAAB//wAAB///4AAD//wAAB///8AAH//wAAB///+AAP//wAAB///+AAP//wAAB////AAf//wAAB////AAf//wAAB////gAf//wAAB////gA///wAAB////gA///wAAB////gA///w//AAf//wA//4A//AAA//wA//gA//AAAf/wA//gB//gAAf/wA//gB//gAAf/wA//gD//wAA//wA//wH//8AB//wA///////////gA///////////gA///////////gA///////////gAf//////////AAf//////////AAP//////////AAP/////////+AAH/////////8AAH///+/////4AAD///+f////wAAA///8P////gAAAf//4H///+AAAAH//gB///wAAAAAP4AAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAA//wAAAAAAAAAP//wAAAAAAAAB///wAAAAAAAAf///wAAAAAAAH////wAAAAAAA/////wAAAAAAP/////wAAAAAB//////wAAAAAf//////wAAAAH///////wAAAA////////wAAAP////////wAAA///////H/wAAA//////wH/wAAA/////8AH/wAAA/////AAH/wAAA////gAAH/wAAA///4AAAH/wAAA//+AAAAH/wAAA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAH/4AAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//8AAA/////+B///AAA/////+B///wAA/////+B///4AA/////+B///8AA/////+B///8AA/////+B///+AA/////+B////AA/////+B////AA/////+B////AA/////+B////gA/////+B////gA/////+B////gA/////+A////gA//gP/gAAB//wA//gf/AAAA//wA//gf/AAAAf/wA//g//AAAAf/wA//g//AAAA//wA//g//gAAA//wA//g//+AAP//wA//g////////gA//g////////gA//g////////gA//g////////gA//g////////AA//gf///////AA//gf//////+AA//gP//////+AA//gH//////8AA//gD//////4AA//gB//////wAA//gA//////AAAAAAAH////8AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAB///////+AAAAH////////gAAAf////////4AAB/////////8AAD/////////+AAH//////////AAH//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wAf//////////4A//wAD/4AAf/4A//gAH/wAAP/4A//gAH/wAAP/4A//gAP/wAAP/4A//gAP/4AAf/4A//wAP/+AD//4A///wP//////4Af//4P//////wAf//4P//////wAf//4P//////wAf//4P//////wAP//4P//////gAP//4H//////gAH//4H//////AAH//4D/////+AAD//4D/////8AAB//4B/////4AAA//4A/////wAAAP/4AP////AAAAB/4AD///4AAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAADgA//gAAAAAAP/gA//gAAAAAH//gA//gAAAAB///gA//gAAAAP///gA//gAAAD////gA//gAAAf////gA//gAAB/////gA//gAAP/////gA//gAB//////gA//gAH//////gA//gA///////gA//gD///////gA//gf///////gA//h////////gA//n////////gA//////////gAA/////////AAAA////////wAAAA///////4AAAAA///////AAAAAA//////4AAAAAA//////AAAAAAA/////4AAAAAAA/////AAAAAAAA////8AAAAAAAA////gAAAAAAAA///+AAAAAAAAA///4AAAAAAAAA///AAAAAAAAAA//4AAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gB///wAAAAP//4H///+AAAA///8P////gAAB///+f////4AAD///+/////8AAH/////////+AAH//////////AAP//////////gAP//////////gAf//////////gAf//////////wAf//////////wAf//////////wA///////////wA//4D//wAB//4A//wB//gAA//4A//gA//gAAf/4A//gA//AAAf/4A//gA//gAAf/4A//wB//gAA//4A///P//8AH//4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////gAP//////////gAP//////////AAH//////////AAD/////////+AAD///+/////8AAB///8f////wAAAf//4P////AAAAH//wD///8AAAAA/+AAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAAAAAAAAB///+AA/+AAAAP////gA//wAAAf////wA//4AAB/////4A//8AAD/////8A//+AAD/////+A///AAH/////+A///AAP//////A///gAP//////A///gAf//////A///wAf//////A///wAf//////A///wAf//////A///wA///////AB//4A//4AD//AAP/4A//gAB//AAP/4A//gAA//AAP/4A//gAA/+AAP/4A//gAB/8AAP/4A//wAB/8AAf/4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH/////////+AAD/////////8AAB/////////4AAAf////////wAAAP////////AAAAB///////4AAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAB/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("EiAnGicnJycnJycnEw=="), 78+(scale<<8)+(1<<16));
+ // Actual height 69 (68 - 0)
+ g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAA/gAAAAAAAAAAP/gAAAAAAAAAH//gAAAAAAAAB///gAAAAAAAAf///gAAAAAAAP////gAAAAAAD/////gAAAAAA//////gAAAAAP//////gAAAAH///////gAAAB////////gAAAf////////gAAP/////////gAD//////////AA//////////gAA/////////4AAA////////+AAAA////////gAAAA///////wAAAAA//////8AAAAAA//////AAAAAAA/////gAAAAAAA////4AAAAAAAA///+AAAAAAAAA///gAAAAAAAAA//wAAAAAAAAAA/8AAAAAAAAAAA/AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////AAAAAB///////8AAAAH////////AAAAf////////wAAA/////////4AAB/////////8AAD/////////+AAH//////////AAP//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wA//8AAAAAB//4A//wAAAAAAf/4A//gAAAAAAP/4A//gAAAAAAP/4A//gAAAAAAP/4A//wAAAAAAf/4A///////////4Af//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH//////////AAD/////////+AAB/////////8AAA/////////4AAAP////////gAAAD///////+AAAAAf//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAP/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/AAAAAAAAAAA//AAAAAAAAAAA/+AAAAAAAAAAB/8AAAAAAAAAAD//////////gAH//////////gAP//////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAB/gAAD//4AAAAf/gAAP//4AAAB//gAA///4AAAH//gAB///4AAAf//gAD///4AAA///gAH///4AAD///gAP///4AAH///gAP///4AAP///gAf///4AAf///gAf///4AB////gAf///4AD////gA////4AH////gA////4Af////gA////4A/////gA//wAAB/////gA//gAAH/////gA//gAAP/////gA//gAA///8//gA//gAD///w//gA//wA////g//gA////////A//gA///////8A//gA///////4A//gAf//////wA//gAf//////gA//gAf/////+AA//gAP/////8AA//gAP/////4AA//gAH/////gAA//gAD/////AAA//gAB////8AAA//gAA////wAAA//gAAP///AAAA//gAAD//8AAAA//gAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+AAAAAD/wAAB//8AAAAP/wAAB///AAAA//wAAB///wAAB//wAAB///4AAD//wAAB///8AAH//wAAB///+AAP//wAAB///+AAP//wAAB////AAf//wAAB////AAf//wAAB////gAf//wAAB////gA///wAAB////gA///wAAB////gA///w//AAf//wA//4A//AAA//wA//gA//AAAf/wA//gB//gAAf/wA//gB//gAAf/wA//gD//wAA//wA//wH//8AB//wA///////////gA///////////gA///////////gA///////////gAf//////////AAf//////////AAP//////////AAP/////////+AAH/////////8AAH///+/////4AAD///+f////wAAA///8P////gAAAf//4H///+AAAAH//gB///wAAAAAP4AAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAA//wAAAAAAAAAP//wAAAAAAAAB///wAAAAAAAAf///wAAAAAAAH////wAAAAAAA/////wAAAAAAP/////wAAAAAB//////wAAAAAf//////wAAAAH///////wAAAA////////wAAAP////////wAAA///////H/wAAA//////wH/wAAA/////8AH/wAAA/////AAH/wAAA////gAAH/wAAA///4AAAH/wAAA//+AAAAH/wAAA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAH/4AAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//8AAA/////+B///AAA/////+B///wAA/////+B///4AA/////+B///8AA/////+B///8AA/////+B///+AA/////+B////AA/////+B////AA/////+B////AA/////+B////gA/////+B////gA/////+B////gA/////+A////gA//gP/gAAB//wA//gf/AAAA//wA//gf/AAAAf/wA//g//AAAAf/wA//g//AAAA//wA//g//gAAA//wA//g//+AAP//wA//g////////gA//g////////gA//g////////gA//g////////gA//g////////AA//gf///////AA//gf//////+AA//gP//////+AA//gH//////8AA//gD//////4AA//gB//////wAA//gA//////AAAAAAAH////8AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAB///////+AAAAH////////gAAAf////////4AAB/////////8AAD/////////+AAH//////////AAH//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wAf//////////4A//wAD/4AAf/4A//gAH/wAAP/4A//gAH/wAAP/4A//gAP/wAAP/4A//gAP/4AAf/4A//wAP/+AD//4A///wP//////4Af//4P//////wAf//4P//////wAf//4P//////wAf//4P//////wAP//4P//////gAP//4H//////gAH//4H//////AAH//4D/////+AAD//4D/////8AAB//4B/////4AAA//4A/////wAAAP/4AP////AAAAB/4AD///4AAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAADgA//gAAAAAAP/gA//gAAAAAH//gA//gAAAAB///gA//gAAAAP///gA//gAAAD////gA//gAAAf////gA//gAAB/////gA//gAAP/////gA//gAB//////gA//gAH//////gA//gA///////gA//gD///////gA//gf///////gA//h////////gA//n////////gA//////////gAA/////////AAAA////////wAAAA///////4AAAAA///////AAAAAA//////4AAAAAA//////AAAAAAA/////4AAAAAAA/////AAAAAAAA////8AAAAAAAA////gAAAAAAAA///+AAAAAAAAA///4AAAAAAAAA///AAAAAAAAAA//4AAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gB///wAAAAP//4H///+AAAA///8P////gAAB///+f////4AAD///+/////8AAH/////////+AAH//////////AAP//////////gAP//////////gAf//////////gAf//////////wAf//////////wAf//////////wA///////////wA//4D//wAB//4A//wB//gAA//4A//gA//gAAf/4A//gA//AAAf/4A//gA//gAAf/4A//wB//gAA//4A///P//8AH//4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////gAP//////////gAP//////////AAH//////////AAD/////////+AAD///+/////8AAB///8f////wAAAf//4P////AAAAH//wD///8AAAAA/+AAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAAAAAAAAB///+AA/+AAAAP////gA//wAAAf////wA//4AAB/////4A//8AAD/////8A//+AAD/////+A///AAH/////+A///AAP//////A///gAP//////A///gAf//////A///wAf//////A///wAf//////A///wAf//////A///wA///////AB//4A//4AD//AAP/4A//gAB//AAP/4A//gAA//AAP/4A//gAA/+AAP/4A//gAB/8AAP/4A//wAB/8AAf/4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH/////////+AAD/////////8AAB/////////4AAAf////////wAAAP////////AAAAB///////4AAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAB/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("EiAnGicnJycnJycnEw=="), 78 + (scale << 8) + (1 << 16));
+};
+
+Graphics.prototype.setFontAntonSmall = function(scale) {
+ // Actual height 53 (52 - 0)
+ g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAAAAAAAAAAAAAMAAAAAAAAD8AAAAAAAA/8AAAAAAAf/8AAAAAAH//8AAAAAB///8AAAAA////8AAAAP////8AAAD/////8AAB//////8AAf//////8AH///////4A///////+AA///////AAA//////wAAA/////8AAAA////+AAAAA////gAAAAA///4AAAAAA//8AAAAAAA//AAAAAAAA/wAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////wAAA//////8AAB//////+AAH///////gAH///////gAP///////wAf///////4Af///////4A////////8A////////8A////////8A//AAAAD/8A/8AAAAA/8A/8AAAAA/8A/8AAAAA/8A/+AAAAB/8A////////8A////////8A////////8Af///////4Af///////4AP///////wAP///////wAH///////gAD///////AAA//////8AAAP/////wAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAA/4AAAAAAAA/4AAAAAAAB/wAAAAAAAB/wAAAAAAAD/wAAAAAAAD/gAAAAAAAH///////8AP///////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAP8AA//4AAA/8AB//4AAH/8AH//4AAP/8AP//4AA//8AP//4AB//8Af//4AD//8Af//4AP//8A///4Af//8A///4A///8A///4D///8A//AAH///8A/8AAP///8A/8AA//+/8A/8AD//8/8A/+Af//w/8A//////g/8A/////+A/8A/////8A/8Af////4A/8Af////wA/8AP////AA/8AP///+AA/8AH///8AA/8AD///wAA/8AA///AAA/8AAP/4AAA/8AAAAAAAAAAAAAAAAAAAAAAH4AAf/gAAA/4AAf/8AAD/4AAf//AAH/4AAf//gAP/4AAf//wAP/4AAf//wAf/4AAf//4Af/4AAf//4A//4AAf//8A//4AAf//8A//4AAP//8A//A/8AB/8A/8A/8AA/8A/8B/8AA/8A/8B/8AA/8A/+D//AB/8A////////8A////////8A////////8Af///////4Af///////4Af///////wAP///////gAH//9////gAD//4///+AAB//wf//4AAAP/AH//gAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAB//wAAAAAAP//wAAAAAD///wAAAAA////wAAAAH////wAAAB/////wAAAf/////wAAD//////wAA///////wAA/////h/wAA////wB/wAA///8AB/wAA///AAB/wAA//gAAB/wAA////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8AAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AA////4P/+AA////4P//AA////4P//gA////4P//wA////4P//wA////4P//4A////4P//4A////4P//8A////4P//8A////4P//8A/8H/AAB/8A/8H+AAA/8A/8P+AAA/8A/8P+AAA/8A/8P/gAD/8A/8P/////8A/8P/////8A/8P/////8A/8P/////4A/8H/////4A/8H/////wA/8D/////wA/8B/////gA/8A////+AA/8AP///4AAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////wAAAf/////8AAB///////AAH///////gAP///////wAP///////wAf///////4Af///////4A////////8A////////8A////////8A/+AH/AB/8A/8AP+AA/8A/4Af+AA/8A/8Af+AA/8A/8Af/gH/8A//4f////8A//4f////8A//4f////8Af/4f////4Af/4f////4AP/4P////wAP/4P////gAH/4H////AAD/4D///+AAB/4B///4AAAP4AP//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAA/8AAAAAAAA/8AAAAAB8A/8AAAAB/8A/8AAAAf/8A/8AAAH//8A/8AAA///8A/8AAH///8A/8AA////8A/8AD////8A/8Af////8A/8B/////8A/8P/////8A/8//////8A////////AA///////AAA//////gAAA/////4AAAA/////AAAAA////4AAAAA////AAAAAA///8AAAAAA///gAAAAAA//+AAAAAAA//wAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gD//gAAA//4P//8AAD//8f///AAH//+////gAH///////wAP///////4AP///////8Af///////8Af///////+Af///////+A////////+A//B//AB/+A/+A/+AA/+A/8Af+AA/+A/+Af+AA/+A//A//AB/+A////////+Af///////+Af///////+Af///////8Af///////8AP///////4AH///////4AH//+////wAD//+////AAA//4P//+AAAP/gH//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAfgAAA///8A/8AAB///+A//AAH////A//gAH////g//wAP////g//wAf////w//4Af////w//4A/////w//8A/////w//8A/////w//8A//gP/wA/8A/8AD/wA/8A/8AD/wAf8A/8AD/gA/8A/+AH/AB/8A////////8A////////8A////////8Af///////4Af///////4Af///////wAP///////wAH///////gAD//////+AAA//////4AAAP/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DhgeFB4eHh4eHh4eDw=="), 60 + (scale << 8) + (1 << 16));
+};
+
+// variables defined from settings
+var secondsMode;
+var secondsColoured;
+var secondsWithColon;
+var dateOnMain;
+var dateOnSecs;
+var weekDay;
+var calWeek;
+var upperCase;
+var vectorFont;
+
+// dynamic variables
+var drawTimeout;
+var queueMillis = 1000;
+var secondsScreen = true;
+
+var isBangle1 = (process.env.HWVERSION == 1);
+
+//For development purposes
+/*
+require('Storage').writeJSON(SETTINGSFILE, {
+ secondsMode: "Unlocked", // "Never", "Unlocked", "Always"
+ secondsColoured: true,
+ secondsWithColon: true,
+ dateOnMain: "Long", // "Short", "Long", "ISO8601"
+ dateOnSecs: "Year", // "No", "Year", "Weekday", LEGACY: true/false
+ weekDay: true,
+ calWeek: true,
+ upperCase: true,
+ vectorFont: true,
+});
+*/
+
+// OR (also for development purposes)
+/*
+require('Storage').erase(SETTINGSFILE);
+*/
+
+// Load settings
+function loadSettings() {
+ // Helper function default setting
+ function def (value, def) {return value !== undefined ? value : def;}
+
+ var settings = require('Storage').readJSON(SETTINGSFILE, true) || {};
+ secondsMode = def(settings.secondsMode, "Never");
+ secondsColoured = def(settings.secondsColoured, true);
+ secondsWithColon = def(settings.secondsWithColon, true);
+ dateOnMain = def(settings.dateOnMain, "Long");
+ dateOnSecs = def(settings.dateOnSecs, "Year");
+ weekDay = def(settings.weekDay, true);
+ calWeek = def(settings.calWeek, false);
+ upperCase = def(settings.upperCase, true);
+ vectorFont = def(settings.vectorFont, false);
+
+ // Legacy
+ if (dateOnSecs === true)
+ dateOnSecs = "Year";
+ if (dateOnSecs === false)
+ dateOnSecs = "No";
}
-// timeout used to update every minute
-var drawTimeout;
-
-// schedule a draw for the next minute
+// schedule a draw for the next second or minute
function queueDraw() {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
drawTimeout = undefined;
draw();
- }, 60000 - (Date.now() % 60000));
+ }, queueMillis - (Date.now() % queueMillis));
}
-
-function draw() {
- var x = g.getWidth()/2;
- var y = g.getHeight()/2;
- g.reset();
- var date = new Date();
- var timeStr = require("locale").time(date,1);
- var dateStr = require("locale").date(date).toUpperCase();
- var dowStr = require("locale").dow(date).toUpperCase();
- // draw time
- g.setFontAlign(0,0).setFont("Anton");
- g.clearRect(0,y-40,g.getWidth(),y+35); // clear the background
- g.drawString(timeStr,x,y);
- // draw date
- y += 40;
- g.setFontAlign(0,0).setFont("6x8",2);
- g.clearRect(0,y-8,g.getWidth(),y+8); // clear the background
- g.drawString(dateStr,x,y);
- //draw day of week
- y += 16;
- g.clearRect(0,y-8,g.getWidth(),y+8); // clear the background
- g.drawString(dowStr,x,y);
- // queue draw in one minute
- queueDraw();
-}
-
-// Clear the screen once, at startup
-g.clear();
-// draw immediately at first, queue update
-draw();
-// Stop updates when LCD is off, restart when on
-Bangle.on('lcdPower',on=>{
- if (on) {
+function updateState() {
+ if (Bangle.isLCDOn()) {
+ if ((secondsMode === "Unlocked" && !Bangle.isLocked()) || secondsMode === "Always") {
+ secondsScreen = true;
+ queueMillis = 1000;
+ } else {
+ secondsScreen = false;
+ queueMillis = 60000;
+ }
draw(); // draw immediately, queue redraw
} else { // stop draw timer
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = undefined;
}
+}
+
+function isoStr(date) {
+ return date.getFullYear() + "-" + ("0" + (date.getMonth() + 1)).substr(-2) + "-" + ("0" + date.getDate()).substr(-2);
+}
+
+var calWeekBuffer = [false,false,false]; //buffer tz, date, week no (once calculated until other tz or date is requested)
+function ISO8601calWeek(date) { //copied from: https://gist.github.com/IamSilviu/5899269#gistcomment-3035480
+ dateNoTime = date; dateNoTime.setHours(0,0,0,0);
+ if (calWeekBuffer[0] === date.getTimezoneOffset() && calWeekBuffer[1] === dateNoTime) return calWeekBuffer[2];
+ calWeekBuffer[0] = date.getTimezoneOffset();
+ calWeekBuffer[1] = dateNoTime;
+ var tdt = new Date(date.valueOf());
+ var dayn = (date.getDay() + 6) % 7;
+ tdt.setDate(tdt.getDate() - dayn + 3);
+ var firstThursday = tdt.valueOf();
+ tdt.setMonth(0, 1);
+ if (tdt.getDay() !== 4) {
+ tdt.setMonth(0, 1 + ((4 - tdt.getDay()) + 7) % 7);
+ }
+ calWeekBuffer[2] = 1 + Math.ceil((firstThursday - tdt) / 604800000);
+ return calWeekBuffer[2];
+}
+
+function doColor() {
+ return !isBangle1 && !Bangle.isLocked() && secondsColoured;
+}
+
+// Actually draw the watch face
+function draw() {
+ var x = g.getWidth() / 2;
+ var y = g.getHeight() / 2 - (secondsMode !== "Never" ? 24 : (vectorFont ? 12 : 0));
+ g.reset();
+ /* This is to mark the widget areas during development.
+ g.setColor("#888")
+ .fillRect(0, 0, g.getWidth(), 23)
+ .fillRect(0, g.getHeight() - 23, g.getWidth(), g.getHeight()).reset();
+ /* */
+ g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); // clear whole background (w/o widgets)
+ var date = new Date(); // Actually the current date, this one is shown
+ var timeStr = require("locale").time(date, 1); // Hour and minute
+ g.setFontAlign(0, 0).setFont("Anton").drawString(timeStr, x, y); // draw time
+ if (secondsScreen) {
+ y += 65;
+ var secStr = (secondsWithColon ? ":" : "") + ("0" + date.getSeconds()).substr(-2);
+ if (doColor())
+ g.setColor(0, 0, 1);
+ g.setFont("AntonSmall");
+ if (dateOnSecs !== "No") { // A bit of a complex drawing with seconds on the right and date on the left
+ g.setFontAlign(1, 0).drawString(secStr, g.getWidth() - (isBangle1 ? 32 : 2), y); // seconds
+ y -= (vectorFont ? 15 : 13);
+ x = g.getWidth() / 4 + (isBangle1 ? 12 : 4) + (secondsWithColon ? 0 : g.stringWidth(":") / 2);
+ var dateStr2 = (dateOnMain === "ISO8601" ? isoStr(date) : require("locale").date(date, 1));
+ var year;
+ var md;
+ var yearfirst;
+ if (dateStr2.match(/\d\d\d\d$/)) { // formatted date ends with year
+ year = (dateOnSecs === "Year" ? dateStr2.slice(-4) : require("locale").dow(date, 1));
+ md = dateStr2.slice(0, -4);
+ if (!md.endsWith(".")) // keep separator before the year only if it is a dot (31.12. but 31/12)
+ md = md.slice(0, -1);
+ yearfirst = false;
+ } else { // formatted date begins with year
+ if (!dateStr2.match(/^\d\d\d\d/)) // if year position cannot be detected...
+ dateStr2 = isoStr(date); // ...use ISO date format instead
+ year = (dateOnSecs === "Year" ? dateStr2.slice(0, 4) : require("locale").dow(date, 1));
+ md = dateStr2.slice(5); // never keep separator directly after year
+ yearfirst = true;
+ }
+ if (dateOnSecs === "Weekday" && upperCase)
+ year = year.toUpperCase();
+ g.setFontAlign(0, 0);
+ if (vectorFont)
+ g.setFont("Vector", 24);
+ else
+ g.setFont("6x8", 2);
+ if (doColor())
+ g.setColor(1, 0, 0);
+ g.drawString(md, x, (yearfirst ? y + (vectorFont ? 26 : 16) : y));
+ g.drawString(year, x, (yearfirst ? y : y + (vectorFont ? 26 : 16)));
+ } else {
+ g.setFontAlign(0, 0).drawString(secStr, x, y); // Just the seconds centered
+ }
+ } else { // No seconds screen: Show date and optionally day of week
+ y += (vectorFont ? 50 : (secondsMode !== "Never") ? 52 : 40);
+ var dateStr = (dateOnMain === "ISO8601" ? isoStr(date) : require("locale").date(date, (dateOnMain === "Long" ? 0 : 1)));
+ if (upperCase)
+ dateStr = dateStr.toUpperCase();
+ g.setFontAlign(0, 0);
+ if (vectorFont)
+ g.setFont("Vector", 24);
+ else
+ g.setFont("6x8", 2);
+ g.drawString(dateStr, x, y);
+ if (calWeek || weekDay) {
+ var dowcwStr = "";
+ if (calWeek)
+ dowcwStr = " #" + ("0" + ISO8601calWeek(date)).substring(-2);
+ if (weekDay)
+ dowcwStr = require("locale").dow(date, calWeek ? 1 : 0) + dowcwStr; //weekDay e.g. Monday or weekDayShort # e.g. Mon #01
+ else //week #01
+ dowcwStr = /*LANG*/"week" + dowcwStr;
+ if (upperCase)
+ dowcwStr = dowcwStr.toUpperCase();
+ g.drawString(dowcwStr, x, y + (vectorFont ? 26 : 16));
+ }
+ }
+
+ // queue next draw
+ queueDraw();
+}
+
+// Init the settings of the app
+loadSettings();
+// Clear the screen once, at startup
+g.clear();
+// Set dynamic state and perform initial drawing
+updateState();
+// Register hooks for LCD on/off event and screen lock on/off event
+Bangle.on('lcdPower', on => {
+ updateState();
+});
+Bangle.on('lock', on => {
+ updateState();
});
// Show launcher when middle button pressed
Bangle.setUI("clock");
// Load widgets
Bangle.loadWidgets();
Bangle.drawWidgets();
+
+// end of file
\ No newline at end of file
diff --git a/apps/antonclk/app.png b/apps/antonclk/app.png
index d96f17758..a38093c5f 100644
Binary files a/apps/antonclk/app.png and b/apps/antonclk/app.png differ
diff --git a/apps/antonclk/metadata.json b/apps/antonclk/metadata.json
new file mode 100644
index 000000000..def5d3b48
--- /dev/null
+++ b/apps/antonclk/metadata.json
@@ -0,0 +1,19 @@
+{
+ "id": "antonclk",
+ "name": "Anton Clock",
+ "version": "0.06",
+ "description": "A clock using the bold Anton font, optionally showing seconds and date in ISO-8601 format.",
+ "readme":"README.md",
+ "icon": "app.png",
+ "screenshots": [{"url":"screenshot.png"}],
+ "type": "clock",
+ "tags": "clock",
+ "supports": ["BANGLEJS","BANGLEJS2"],
+ "allow_emulator": true,
+ "storage": [
+ {"name":"antonclk.app.js","url":"app.js"},
+ {"name":"antonclk.settings.js","url":"settings.js"},
+ {"name":"antonclk.img","url":"app-icon.js","evaluate":true}
+ ],
+ "data": [{"name":"antonclk.json"}]
+}
diff --git a/apps/antonclk/screenshot.png b/apps/antonclk/screenshot.png
index c66f8bdd8..e949b8a24 100644
Binary files a/apps/antonclk/screenshot.png and b/apps/antonclk/screenshot.png differ
diff --git a/apps/antonclk/settings.js b/apps/antonclk/settings.js
new file mode 100644
index 000000000..e452b02c7
--- /dev/null
+++ b/apps/antonclk/settings.js
@@ -0,0 +1,107 @@
+// Settings menu for the enhanced Anton clock
+
+(function(back) {
+ var FILE = "antonclk.json";
+ // Load settings
+ var settings = Object.assign({
+ secondsOnUnlock: false,
+ }, require('Storage').readJSON(FILE, true) || {});
+
+ function writeSettings() {
+ require('Storage').writeJSON(FILE, settings);
+ }
+
+ // Helper method which uses int-based menu item for set of string values
+ function stringItems(startvalue, writer, values) {
+ return {
+ value: (startvalue === undefined ? 0 : values.indexOf(startvalue)),
+ format: v => values[v],
+ min: 0,
+ max: values.length - 1,
+ wrap: true,
+ step: 1,
+ onchange: v => {
+ writer(values[v]);
+ writeSettings();
+ }
+ };
+ }
+
+ // Helper method which breaks string set settings down to local settings object
+ function stringInSettings(name, values) {
+ return stringItems(settings[name], v => settings[name] = v, values);
+ }
+
+ var mainmenu = {
+ "": {
+ "title": "Anton clock"
+ },
+ "< Back": () => back(),
+ "Seconds...": () => E.showMenu(secmenu),
+ "Date": stringInSettings("dateOnMain", ["Short", "Long", "ISO8601"]),
+ "Show Weekday": {
+ value: (settings.weekDay !== undefined ? settings.weekDay : true),
+ format: v => v ? "On" : "Off",
+ onchange: v => {
+ settings.weekDay = v;
+ writeSettings();
+ }
+ },
+ "Show CalWeek": {
+ value: (settings.calWeek !== undefined ? settings.calWeek : false),
+ format: v => v ? "On" : "Off",
+ onchange: v => {
+ settings.calWeek = v;
+ writeSettings();
+ }
+ },
+ "Uppercase": {
+ value: (settings.upperCase !== undefined ? settings.upperCase : false),
+ format: v => v ? "On" : "Off",
+ onchange: v => {
+ settings.upperCase = v;
+ writeSettings();
+ }
+ },
+ "Vector font": {
+ value: (settings.vectorFont !== undefined ? settings.vectorFont : false),
+ format: v => v ? "On" : "Off",
+ onchange: v => {
+ settings.vectorFont = v;
+ writeSettings();
+ }
+ },
+ };
+
+ // Submenu
+ var secmenu = {
+ "": {
+ "title": "Show seconds..."
+ },
+ "< Back": () => E.showMenu(mainmenu),
+ "Show": stringInSettings("secondsMode", ["Never", "Unlocked", "Always"]),
+ "With \":\"": {
+ value: (settings.secondsWithColon !== undefined ? settings.secondsWithColon : false),
+ format: v => v ? "On" : "Off",
+ onchange: v => {
+ settings.secondsWithColon = v;
+ writeSettings();
+ }
+ },
+ "Color": {
+ value: (settings.secondsColoured !== undefined ? settings.secondsColoured : false),
+ format: v => v ? "On" : "Off",
+ onchange: v => {
+ settings.secondsColoured = v;
+ writeSettings();
+ }
+ },
+ "Date": stringInSettings("dateOnSecs", ["No", "Year", "Weekday"])
+ };
+
+ // Actually display the menu
+ E.showMenu(mainmenu);
+
+});
+
+// end of file
diff --git a/apps/arrow/metadata.json b/apps/arrow/metadata.json
new file mode 100644
index 000000000..bf462e33b
--- /dev/null
+++ b/apps/arrow/metadata.json
@@ -0,0 +1,15 @@
+{
+ "id": "arrow",
+ "name": "Arrow Compass",
+ "version": "0.05",
+ "description": "Moving arrow compass that points North, shows heading, with tilt correction. Based on jeffmer's Navigation Compass",
+ "icon": "arrow.png",
+ "type": "app",
+ "tags": "tool,outdoors",
+ "supports": ["BANGLEJS"],
+ "readme": "README.md",
+ "storage": [
+ {"name":"arrow.app.js","url":"app.js"},
+ {"name":"arrow.img","url":"icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/assistedgps/ChangeLog b/apps/assistedgps/ChangeLog
index 5560f00bc..739ccf915 100644
--- a/apps/assistedgps/ChangeLog
+++ b/apps/assistedgps/ChangeLog
@@ -1 +1,3 @@
0.01: New App!
+0.02: Update to work with Bangle.js 2
+0.03: Select GNSS systems to use for Bangle.js 2
diff --git a/apps/assistedgps/custom.html b/apps/assistedgps/custom.html
index 139c232af..80d68a71f 100644
--- a/apps/assistedgps/custom.html
+++ b/apps/assistedgps/custom.html
@@ -8,34 +8,72 @@
GPS can take a long time (~5 minutes) to get an accurate position the first time it is used.
AGPS uploads a few hints to the GPS receiver about satellite positions that allow it
to get a faster, more accurate fix - however they are only valid for a short period of time.
-
You can upload data that covers a longer period of time, but the upload will take longer.
-
-
-
-
-
-
+
+
You can upload data that covers a longer period of time, but the upload will take longer.
+
+
+
+
+
+
+
-
Click
+
+
Using fewer GNSS systems may decrease the time to fix. (If unsure, select only GPS)