From 96a6dee94c72b4a716d70808d362716ad9ef3c3d Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:14:40 +1300 Subject: [PATCH 001/105] Update app.js --- apps/speedalt2/app.js | 156 +++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 84 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 0db9629c7..951c878fb 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -1,11 +1,8 @@ /* Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com -0.01 : Initial -0.06 : Add Posn screen -0.07 : Add swipe to change screens same as BTN3 */ -var v = '1.05'; +var v = '1.06'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -173,6 +170,15 @@ var KalmanFilter = (function () { var buf = Graphics.createArrayBuffer(240,160,2,{msb:true}); +let LED = // LED as minimal and only definition (as instance / singleton) +{ isOn: false // status on / off, not needed if you don't need to ask for it +, set: function(v) { // turn on w/ no arg or truey, else off + g.setColor((this.isOn=(v===undefined||!!v))?1:0,0,0).fillCircle(10,10,10); } +, reset: function() { this.set(false); } // turn off +, write: function(v) { this.set(v); } // turn on w/ no arg or truey, else off +, toggle: function() { this.set( ! this.isOn); } // toggle the LED +}, LED1 = LED; // LED1 as 'synonym' for LED + // Load fonts //require("Font7x11Numeric7Seg").add(Graphics); @@ -183,17 +189,16 @@ var canDraw = 1; var time = ''; // Last time string displayed. Re displayed in background colour to remove before drawing new time. var tmrLP; // Timer for delay in switching to low power after screen turns off -var max = {}; -max.spd = 0; -max.alt = 0; -max.n = 0; // counter. Only start comparing for max after a certain number of fixes to allow kalman filter to have smoohed the data. +var maxSpd = 0; +var maxAlt = 0; +var maxN = 0; // counter. Only start comparing for max after a certain number of fixes to allow kalman filter to have smoohed the data. var emulator = (process.env.BOARD=="EMSCRIPTEN")?1:0; // 1 = running in emulator. Supplies test values; var wp = {}; // Waypoint to use for distance from cur position. -function nxtWp(inc){ - cfg.wp+=inc; +function nxtWp(){ + cfg.wp++; loadWp(); } @@ -252,23 +257,14 @@ function drawScrn(dat) { buf.setFontVector(35); buf.drawString(dat.unit,5,164); - if ( dat.max ) drawMax(); // MAX display indicator - if ( dat.wp ) drawWP(); // Waypoint name - - //Sats - if ( dat.sat ) { - if ( dat.age > 10 ) { - if ( dat.age > 90 ) dat.age = '>90'; - drawSats('Age:'+dat.age); - } - else drawSats('Sats:'+dat.sats); - } - + drawMax(dat.max); // MAX display indicator + drawWP(dat.wp); // Waypoint name + drawSats(dat.sats); + g.reset(); g.drawImage(img,0,40); - if ( pwrSav ) LED1.reset(); - else LED1.set(); + LED1.write(!pwrSav); } @@ -293,20 +289,12 @@ function drawPosn(dat) { buf.drawString(dat.ew,x,y+70); - //Sats - if ( dat.sat ) { - if ( dat.age > 10 ) { - if ( dat.age > 90 ) dat.age = '>90'; - drawSats('Age:'+dat.age); - } - else drawSats('Sats:'+dat.sats); - } + drawSats(dat.sats); g.reset(); g.drawImage(img,0,40); - if ( pwrSav ) LED1.reset(); - else LED1.set(); + LED1.write(!pwrSav); } @@ -329,19 +317,14 @@ function drawClock() { g.reset(); g.drawImage(img,0,40); - if ( pwrSav ) LED1.reset(); - else LED1.set(); + LED1.write(!pwrSav); } -function drawWP() { - var nm = wp.name; - if ( nm == undefined || nm == 'NONE' || cfg.modeA ==1 ) nm = ''; +function drawWP(wp) { buf.setColor(2); - buf.setFontAlign(0,1); //left, bottom buf.setFontVector(48); - buf.drawString(nm.substring(0,8),120,140); - + buf.drawString(wp,120,140); } function drawSats(sats) { @@ -351,16 +334,15 @@ function drawSats(sats) { buf.drawString(sats,240,160); } -function drawMax() { +function drawMax(max) { buf.setFontVector(30); buf.setColor(2); buf.setFontAlign(0,1); //centre, bottom - buf.drawString('MAX',120,164); + buf.drawString(max,120,164); } function onGPS(fix) { - - if ( emulator ) { +if ( emulator ) { fix.fix = 1; fix.speed = 10 + (Math.random()*5); fix.alt = 354 + (Math.random()*50); @@ -382,10 +364,12 @@ function onGPS(fix) { var ns = ''; var ew = ''; var lon = '---.--'; + var sats = '---'; + var wpName = ''; // Waypoint name if (fix.fix) lf = fix; - + if (lf.fix) { // Smooth data @@ -393,10 +377,9 @@ function onGPS(fix) { if ( cfg.spdFilt ) lf.speed = spdFilter.filter(lf.speed); if ( cfg.altFilt ) lf.alt = altFilter.filter(lf.alt); lf.smoothed = 1; - if ( max.n <= 15 ) max.n++; + if ( maxN <= 15 ) maxN++; } - // Speed if ( cfg.spd == 0 ) { m = require("locale").speed(lf.speed).match(/([0-9,\.]+)(.*)/); // regex splits numbers from units @@ -408,17 +391,22 @@ function onGPS(fix) { if ( sp < 10 ) sp = sp.toFixed(1); else sp = Math.round(sp); - if (parseFloat(sp) > parseFloat(max.spd) && max.n > 15 ) max.spd = sp; + if (parseFloat(sp) > parseFloat(maxSpd) && maxN > 15 ) maxSpd = sp; // Altitude al = lf.alt; al = Math.round(parseFloat(al)/parseFloat(cfg.alt)); - - if (parseFloat(al) > parseFloat(max.alt) && max.n > 15 ) max.alt = al; + + if (parseFloat(al) > parseFloat(maxAlt) && maxN > 15 ) maxAlt = al; // Distance to waypoint di = distance(lf,wp); - if (isNaN(di)) di = 0; + if (isNaN(di)) di = '--------'; + + // Waypoint name + wpName = wp.name; + if ( wpName == undefined || wpName == 'NONE' ) wpName = ''; + wpName = wpName.substring(0,8); // Age of last fix (secs) age = Math.max(0,Math.round(getTime())-(lf.time.getTime()/1000)); @@ -431,6 +419,13 @@ function onGPS(fix) { ew = 'E'; if ( lf.lon < 0 ) ew = 'W'; lon = Math.abs(lf.lon.toFixed(2)); + + // Sats + if ( age > 10 ) { + sats = 'Age:'+age; + if ( age > 90 ) sats = 'Age:>90'; + } + else sats = 'Sats:'+lf.satellites; } @@ -438,23 +433,21 @@ function onGPS(fix) { // Speed if ( showMax ) drawScrn({ - val:max.spd, + val:maxSpd, unit:cfg.spd_unit, - sats:lf.satellites, + sats:sats, age:age, - max:true, - wp:false, - sat:true + max:'MAX', + wp:'' }); // Speed maximums else drawScrn({ val:sp, unit:cfg.spd_unit, - sats:lf.satellites, + sats:sats, age:age, - max:false, - wp:false, - sat:true + max:'', + wp:'' }); } @@ -462,23 +455,21 @@ function onGPS(fix) { // Alt if ( showMax ) drawScrn({ - val:max.alt, + val:maxAlt, unit:cfg.alt_unit, - sats:lf.satellites, + sats:sats, age:age, - max:true, - wp:false, - sat:true + max:'MAX', + wp:'' }); // Alt maximums else drawScrn({ val:al, unit:cfg.alt_unit, - sats:lf.satellites, + sats:sats, age:age, - max:false, - wp:false, - sat:true + max:'', + wp:'' }); } @@ -487,24 +478,22 @@ function onGPS(fix) { drawScrn({ val:di, unit:cfg.dist_unit, - sats:lf.satellites, + sats:sats, age:age, - max:false, - wp:true, - sat:true + max:'', + wp:wpName }); } if ( cfg.modeA == 3 ) { // Position - drawPosn({ - sats:lf.satellites, + drawPosn({ + sats:sats, age:age, lat:lat, lon:lon, ns:ns, - ew:ew, - sat:true + ew:ew }); } @@ -534,9 +523,9 @@ function nextFunc(dur) { if ( cfg.modeA == 0 || cfg.modeA == 1 ) { // Spd+Alt mode - Switch between fix and MAX if ( dur < 2 ) showMax = !showMax; // Short press toggle fix/max display - else { max.spd = 0; max.alt = 0; } // Long press resets max values. + else { maxSpd = 0; maxAlt = 0; } // Long press resets max values. } - else if ( cfg.modeA == 2) nxtWp(1); // Dist mode - Select next waypoint + else if ( cfg.modeA == 2) nxtWp(); // Dist mode - Select next waypoint onGPS(lf); } @@ -545,7 +534,7 @@ function updateClock() { if (!canDraw) return; if ( cfg.modeA != 4 ) return; drawClock(); - if ( emulator ) {max.spd++;max.alt++;} + if ( emulator ) {maxSpd++;maxAlt++;} } function startDraw(){ @@ -585,7 +574,6 @@ function setButtons(){ setWatch(function(e){ pwrSav=!pwrSav; if ( pwrSav ) { - LED1.reset(); var s = require('Storage').readJSON('setting.json',1)||{}; var t = s.timeout||10; Bangle.setLCDTimeout(t); @@ -593,8 +581,8 @@ function setButtons(){ else { Bangle.setLCDTimeout(0); // Bangle.setLCDPower(1); - LED1.set(); } + LED1.write(!pwrSav); }, BTN2, {repeat:true,edge:"falling"}); // BTN3 - next screen From d5c827cd18c12f3c34dc1b754fe3cf0d88ef1d37 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:16:29 +1300 Subject: [PATCH 002/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 0136a744a..689779b31 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"0.07", + "version":"1.06", "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 5b00b2599888f3fd062c14b826e9d3565b0fe9a1 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:17:24 +1300 Subject: [PATCH 003/105] Update ChangeLog --- apps/speedalt2/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/speedalt2/ChangeLog b/apps/speedalt2/ChangeLog index 91f01988e..bd338f8b2 100644 --- a/apps/speedalt2/ChangeLog +++ b/apps/speedalt2/ChangeLog @@ -1,2 +1,3 @@ 0.01: Initial import. 0.07: Add swipe to change screens. +1.06: Misc memory and screen optimisations. From 1f207561e6af2f59ce9806138a32e54c4ba757c6 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:31:23 +1300 Subject: [PATCH 004/105] Update app.js --- apps/speedalt2/app.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 951c878fb..b41f3054f 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,7 +2,7 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com */ -var v = '1.06'; +var v = '1.07'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -173,7 +173,7 @@ var buf = Graphics.createArrayBuffer(240,160,2,{msb:true}); let LED = // LED as minimal and only definition (as instance / singleton) { isOn: false // status on / off, not needed if you don't need to ask for it , set: function(v) { // turn on w/ no arg or truey, else off - g.setColor((this.isOn=(v===undefined||!!v))?1:0,0,0).fillCircle(10,10,10); } + g.setColor((this.isOn=(v===undefined||!!v))?1:0,0,0).fillCircle(20,10,10); } , reset: function() { this.set(false); } // turn off , write: function(v) { this.set(v); } // turn on w/ no arg or truey, else off , toggle: function() { this.set( ! this.isOn); } // toggle the LED @@ -390,14 +390,15 @@ if ( emulator ) { if ( sp < 10 ) sp = sp.toFixed(1); else sp = Math.round(sp); + if (isNaN(sp)) sp = '---'; if (parseFloat(sp) > parseFloat(maxSpd) && maxN > 15 ) maxSpd = sp; // Altitude al = lf.alt; al = Math.round(parseFloat(al)/parseFloat(cfg.alt)); - if (parseFloat(al) > parseFloat(maxAlt) && maxN > 15 ) maxAlt = al; + if (isNaN(al)) al = '---'; // Distance to waypoint di = distance(lf,wp); @@ -422,7 +423,7 @@ if ( emulator ) { // Sats if ( age > 10 ) { - sats = 'Age:'+age; + sats = 'Age:'+Math.round(age); if ( age > 90 ) sats = 'Age:>90'; } else sats = 'Sats:'+lf.satellites; From e39ba7778879f3eb7f31524ee2f5568f49b9ccf5 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:32:06 +1300 Subject: [PATCH 005/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 689779b31..243a5b814 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.06", + "version":"1.07", "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 2d8eb136b31a3bd2602a96df3a6d2e0cf680567d Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:43:54 +1300 Subject: [PATCH 006/105] Update app.js --- apps/speedalt2/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index b41f3054f..6085ee92d 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,7 +2,7 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com */ -var v = '1.07'; +var v = '1.08'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -173,7 +173,7 @@ var buf = Graphics.createArrayBuffer(240,160,2,{msb:true}); let LED = // LED as minimal and only definition (as instance / singleton) { isOn: false // status on / off, not needed if you don't need to ask for it , set: function(v) { // turn on w/ no arg or truey, else off - g.setColor((this.isOn=(v===undefined||!!v))?1:0,0,0).fillCircle(20,10,10); } + g.setColor((this.isOn=(v===undefined||!!v))?1:0,0,0).fillCircle(40,10,10); } , reset: function() { this.set(false); } // turn off , write: function(v) { this.set(v); } // turn on w/ no arg or truey, else off , toggle: function() { this.set( ! this.isOn); } // toggle the LED From 13a3127bfca3d924ba994838ed7f80dcd3993de2 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:44:39 +1300 Subject: [PATCH 007/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 243a5b814..39986d936 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.07", + "version":"1.08", "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 8be0bd2e34f8a86c917519c009348ae58ca7576b Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 18:51:39 +1300 Subject: [PATCH 008/105] Update app.js --- apps/speedalt2/app.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 6085ee92d..df101e9f1 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,7 +2,7 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com */ -var v = '1.08'; +var v = '1.09'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -365,8 +365,11 @@ if ( emulator ) { var ew = ''; var lon = '---.--'; var sats = '---'; - var wpName = ''; // Waypoint name + // Waypoint name + var wpName = wp.name; + if ( wpName == undefined || wpName == 'NONE' ) wpName = ''; + wpName = wpName.substring(0,8); if (fix.fix) lf = fix; @@ -403,11 +406,6 @@ if ( emulator ) { // Distance to waypoint di = distance(lf,wp); if (isNaN(di)) di = '--------'; - - // Waypoint name - wpName = wp.name; - if ( wpName == undefined || wpName == 'NONE' ) wpName = ''; - wpName = wpName.substring(0,8); // Age of last fix (secs) age = Math.max(0,Math.round(getTime())-(lf.time.getTime()/1000)); From ea28ffd65711f680e5fb08374c842d0b0d93fc26 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 18:53:58 +1300 Subject: [PATCH 009/105] Update app.js --- apps/speedalt2/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index df101e9f1..de94db6a3 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -321,7 +321,7 @@ function drawClock() { } function drawWP(wp) { - buf.setColor(2); + buf.setColor(3); buf.setFontAlign(0,1); //left, bottom buf.setFontVector(48); buf.drawString(wp,120,140); From a29af499e769fe9db9d6ec91e0d91040ad71fa0f Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 18:55:06 +1300 Subject: [PATCH 010/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 39986d936..ada4c4509 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.08", + "version":"1.09", "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 7c7a0ae2cf5c8ee5bc4227517216326cd1226611 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 21:55:45 +1300 Subject: [PATCH 011/105] Update app.js --- apps/speedalt2/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index de94db6a3..cee725993 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -677,7 +677,7 @@ var img = { }; if ( cfg.colour == 1 ) img.palette = new Uint16Array([0,0xFFFF,0xFFF6,0xDFFF]); -if ( cfg.colour == 2 ) img.palette = new Uint16Array([0,0xFF800,0xFAE0,0xF813]); +if ( cfg.colour == 2 ) img.palette = new Uint16Array([0,0xF800,0xFAE0,0xF813]); var SCREENACCESS = { withApp:true, From 4b66b9ffa8dcae0f1552b147657bcec3c7687d4a Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:19:35 +1300 Subject: [PATCH 012/105] Update app.js --- apps/speedalt2/app.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index cee725993..2cf73dfe9 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -1,8 +1,9 @@ /* Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com +1.10 : add inverted colours */ -var v = '1.09'; +var v = '1.10'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -232,7 +233,8 @@ function drawScrn(dat) { if (!canDraw) return; buf.clear(); - + buf.setBgColor(0); + var n; n = dat.val.toString(); @@ -271,6 +273,7 @@ function drawScrn(dat) { function drawPosn(dat) { if (!canDraw) return; buf.clear(); + buf.setBgColor(0); var x, y; x=210; @@ -302,6 +305,8 @@ function drawClock() { if (!canDraw) return; buf.clear(); + buf.setBgColor(0); + var x, y; x=185; y=0; @@ -678,6 +683,7 @@ var img = { if ( cfg.colour == 1 ) img.palette = new Uint16Array([0,0xFFFF,0xFFF6,0xDFFF]); if ( cfg.colour == 2 ) img.palette = new Uint16Array([0,0xF800,0xFAE0,0xF813]); +if ( cfg.colour == 3 ) img.palette = new Uint16Array([0xFFFF,0x007F,0x0054,0x0054]); var SCREENACCESS = { withApp:true, From 7bd799accc7fb7d67784966ee11188d386cdc5a7 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:20:30 +1300 Subject: [PATCH 013/105] Update settings.js --- apps/speedalt2/settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/speedalt2/settings.js b/apps/speedalt2/settings.js index 96174a89b..3ec4742ac 100644 --- a/apps/speedalt2/settings.js +++ b/apps/speedalt2/settings.js @@ -66,6 +66,7 @@ 'Default' : function() { setColour(0); }, 'Hi Contrast' : function() { setColour(1); }, 'Night' : function() { setColour(2); } + 'Inverted' : function() { setColour(3); } }; const kalMenu = { From 644db080fe0eb78d2dbc0f6f2d6929e1eb0219f9 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:21:13 +1300 Subject: [PATCH 014/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index ada4c4509..5aeb95eb6 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.09", + "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 684138c36ef4829e31f3ada0193436269aa24e42 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:24:02 +1300 Subject: [PATCH 015/105] Update settings.js --- apps/speedalt2/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt2/settings.js b/apps/speedalt2/settings.js index 3ec4742ac..fe30d88df 100644 --- a/apps/speedalt2/settings.js +++ b/apps/speedalt2/settings.js @@ -65,7 +65,7 @@ '< Back': function() { E.showMenu(appMenu); }, 'Default' : function() { setColour(0); }, 'Hi Contrast' : function() { setColour(1); }, - 'Night' : function() { setColour(2); } + 'Night' : function() { setColour(2); }, 'Inverted' : function() { setColour(3); } }; From 9147108f8a18d91c36d4fa595140de2e7966bf02 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:24:44 +1300 Subject: [PATCH 016/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 5aeb95eb6..5e69ddd05 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.10", + "version":"1.11", "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From a5becb249ba93e4fc18fcd9b1b8f43acb8ce931e Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:32:56 +1300 Subject: [PATCH 017/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 5e69ddd05..46826cf91 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.11", + "version":"1.12", "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From adcdb50cbc15b651c94e7cc57a4cd74dc3e33ddb Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 08:51:40 +1300 Subject: [PATCH 018/105] Update app.js --- apps/speedalt2/app.js | 88 +++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 25 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 2cf73dfe9..d61eb4386 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,8 +2,9 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com 1.10 : add inverted colours +1.11 : Add VMG screen */ -var v = '1.10'; +var v = '1.11'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -194,6 +195,10 @@ var maxSpd = 0; var maxAlt = 0; var maxN = 0; // counter. Only start comparing for max after a certain number of fixes to allow kalman filter to have smoohed the data. +// Previous values for calculating VMG. +var lastDist = -1; +var lastTime = -1; + var emulator = (process.env.BOARD=="EMSCRIPTEN")?1:0; // 1 = running in emulator. Supplies test values; var wp = {}; // Waypoint to use for distance from cur position. @@ -201,6 +206,8 @@ var wp = {}; // Waypoint to use for distance from cur position. function nxtWp(){ cfg.wp++; loadWp(); + lastDist = -1; // Reset VMG calcs + lastTime = -1; } function loadWp() { @@ -219,11 +226,11 @@ function distance(a,b){ var x = radians(a.lon-b.lon) * Math.cos(radians((a.lat+b.lat)/2)); var y = radians(b.lat-a.lat); - // Distance in selected units + // Distance in metres var d = Math.sqrt(x*x + y*y) * 6371000; - d = (d/parseFloat(cfg.dist)).toFixed(2); - if ( d >= 100 ) d = parseFloat(d).toFixed(1); - if ( d >= 1000 ) d = parseFloat(d).toFixed(0); +// d = (d/parseFloat(cfg.dist)).toFixed(2); +// if ( d >= 100 ) d = parseFloat(d).toFixed(1); +// if ( d >= 1000 ) d = parseFloat(d).toFixed(0); return d; } @@ -328,8 +335,8 @@ function drawClock() { function drawWP(wp) { buf.setColor(3); buf.setFontAlign(0,1); //left, bottom - buf.setFontVector(48); - buf.drawString(wp,120,140); + buf.setFontVector(40); + buf.drawString(wp,120,132); } function drawSats(sats) { @@ -370,6 +377,7 @@ if ( emulator ) { var ew = ''; var lon = '---.--'; var sats = '---'; + var vmg = '---'; // Waypoint name var wpName = wp.name; @@ -389,17 +397,10 @@ if ( emulator ) { } // Speed - if ( cfg.spd == 0 ) { - m = require("locale").speed(lf.speed).match(/([0-9,\.]+)(.*)/); // regex splits numbers from units - sp = parseFloat(m[1]); - cfg.spd_unit = m[2]; - } - else sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units - + sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units if ( sp < 10 ) sp = sp.toFixed(1); else sp = Math.round(sp); if (isNaN(sp)) sp = '---'; - if (parseFloat(sp) > parseFloat(maxSpd) && maxN > 15 ) maxSpd = sp; // Altitude @@ -408,9 +409,34 @@ if ( emulator ) { if (parseFloat(al) > parseFloat(maxAlt) && maxN > 15 ) maxAlt = al; if (isNaN(al)) al = '---'; - // Distance to waypoint + // Distance to waypoint and vmg di = distance(lf,wp); - if (isNaN(di)) di = '--------'; + +//lastDist = 13640; +//lastTime = (getTime()/1000) - 10; + + if ( lastDist != -1 && ! isNaN(lastDist)) { +//console.log(' Distance : '+di); +//console.log('last.Distance : '+lastDist); +//console.log('last.Time : '+lastTime); + + // Have two WP distances and a time. Calc speed + vmg = ((lastDist-di)/1000)/((getTime()/1000-lastTime)/3600); // k/h + vmg = vmg/parseFloat(cfg.spd); // Calculate for selected units +//console.log('VMG : '+vmg); + } + lastDist = di; + lastTime = getTime()/1000; // secs + + di = (di/parseFloat(cfg.dist)).toFixed(2); + if ( di >= 100 ) di = parseFloat(di).toFixed(1); + if ( di >= 1000 ) di = parseFloat(di).toFixed(0); + + if ( Math.abs(vmg) < 10 ) vmg = vmg.toFixed(1); + else vmg = Math.round(vmg); + + if (isNaN(vmg)) vmg = '---'; + if (isNaN(di)) di = '------'; // Age of last fix (secs) age = Math.max(0,Math.round(getTime())-(lf.time.getTime()/1000)); @@ -490,6 +516,18 @@ if ( emulator ) { } if ( cfg.modeA == 3 ) { + // VMG + drawScrn({ + val:vmg, + unit:cfg.spd_unit, + sats:sats, + age:age, + max:'VMG', + wp:wpName + }); + } + + if ( cfg.modeA == 4 ) { // Position drawPosn({ sats:sats, @@ -501,7 +539,7 @@ if ( emulator ) { }); } - if ( cfg.modeA == 4 ) { + if ( cfg.modeA == 5 ) { // Large clock drawClock(); } @@ -510,14 +548,14 @@ if ( emulator ) { function prevScrn() { cfg.modeA = cfg.modeA-1; - if ( cfg.modeA < 0 ) cfg.modeA = 4; + if ( cfg.modeA < 0 ) cfg.modeA = 5; savSettings(); onGPS(lf); } function nextScrn() { cfg.modeA = cfg.modeA+1; - if ( cfg.modeA > 4 ) cfg.modeA = 0; + if ( cfg.modeA > 5 ) cfg.modeA = 0; savSettings(); onGPS(lf); } @@ -529,14 +567,14 @@ function nextFunc(dur) { if ( dur < 2 ) showMax = !showMax; // Short press toggle fix/max display else { maxSpd = 0; maxAlt = 0; } // Long press resets max values. } - else if ( cfg.modeA == 2) nxtWp(); // Dist mode - Select next waypoint + else if ( cfg.modeA == 2 || cfg.modeA == 3) nxtWp(); // Dist or VMG mode - Select next waypoint onGPS(lf); } function updateClock() { if (!canDraw) return; - if ( cfg.modeA != 4 ) return; + if ( cfg.modeA != 5 ) return; drawClock(); if ( emulator ) {maxSpd++;maxAlt++;} } @@ -646,15 +684,15 @@ console.log('MDL'); // Read settings. let cfg = require('Storage').readJSON('speedalt2.json',1)||{}; -cfg.spd = cfg.spd||0; // Multiplier for speed unit conversions. 0 = use the locale values for speed -cfg.spd_unit = cfg.spd_unit||''; // Displayed speed unit +cfg.spd = cfg.spd||1; // Multiplier for speed unit conversions. 0 = use the locale values for speed +cfg.spd_unit = cfg.spd_unit||'kph'; // Displayed speed unit cfg.alt = cfg.alt||0.3048;// Multiplier for altitude unit conversions. cfg.alt_unit = cfg.alt_unit||'feet'; // Displayed altitude units cfg.dist = cfg.dist||1000;// Multiplier for distnce unit conversions. cfg.dist_unit = cfg.dist_unit||'km'; // Displayed altitude units cfg.colour = cfg.colour||0; // Colour scheme. cfg.wp = cfg.wp||0; // Last selected waypoint for dist -cfg.modeA = cfg.modeA||0; // 0=Speed 1=Alt 2=Dist 3=Position 4=Clock +cfg.modeA = cfg.modeA||0; // 0=Speed 1=Alt 2=Dist 3 = vmg 4=Position 5=Clock cfg.primSpd = cfg.primSpd||0; // 1 = Spd in primary, 0 = Spd in secondary cfg.spdFilt = cfg.spdFilt==undefined?true:cfg.spdFilt; From c5a981d39b9639937188db1cd6cfb11df24df1a4 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 08:52:33 +1300 Subject: [PATCH 019/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 46826cf91..2239db796 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.12", + "version":"1.14", "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From c329bbe9036a7dda2e12f45648546f3b4c290219 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 08:52:51 +1300 Subject: [PATCH 020/105] Update app.js --- apps/speedalt2/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index d61eb4386..389beda8f 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,9 +2,9 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com 1.10 : add inverted colours -1.11 : Add VMG screen +1.14 : Add VMG screen */ -var v = '1.11'; +var v = '1.14'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { From d009bddf8bd451460e3a4d2f48181bb438c7204d Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 09:24:24 +1300 Subject: [PATCH 021/105] Update app.js --- apps/speedalt2/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 389beda8f..e36c2efc0 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -476,7 +476,7 @@ if ( emulator ) { unit:cfg.spd_unit, sats:sats, age:age, - max:'', + max:'SPD', wp:'' }); } @@ -498,7 +498,7 @@ if ( emulator ) { unit:cfg.alt_unit, sats:sats, age:age, - max:'', + max:'ALT', wp:'' }); } @@ -510,7 +510,7 @@ if ( emulator ) { unit:cfg.dist_unit, sats:sats, age:age, - max:'', + max:'DST', wp:wpName }); } From 134ae6bf73450e2cb40638164bcf0f9317052033 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 09:26:16 +1300 Subject: [PATCH 022/105] Update app.js --- apps/speedalt2/app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index e36c2efc0..6d89bac81 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -188,7 +188,6 @@ var lf = {fix:0,satellites:0}; var showMax = 0; // 1 = display the max values. 0 = display the cur fix var pwrSav = 1; // 1 = default power saving with watch screen off and GPS to PMOO mode. 0 = screen kept on. var canDraw = 1; -var time = ''; // Last time string displayed. Re displayed in background colour to remove before drawing new time. var tmrLP; // Timer for delay in switching to low power after screen turns off var maxSpd = 0; From 54442044f248c665f1ca42a226f272806a4c1ae9 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 09:32:17 +1300 Subject: [PATCH 023/105] Update app.js --- apps/speedalt2/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 6d89bac81..34a73012d 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -4,7 +4,7 @@ Mike Bennett mike[at]kereru.com 1.10 : add inverted colours 1.14 : Add VMG screen */ -var v = '1.14'; +var v = '1.15'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { From 0bc35288eb164be14fe099423f8a92602e428241 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 09:33:13 +1300 Subject: [PATCH 024/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 2239db796..42e54a6bd 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.14", + "version":"1.15", "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 0c6cf8f0d0313f1322c82251518de3d9ab030506 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 11:39:30 +1300 Subject: [PATCH 025/105] Update app.js --- apps/speedalt2/app.js | 86 ++++++++++++++++++++++++++++--------------- 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 34a73012d..1823b9911 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -4,7 +4,7 @@ Mike Bennett mike[at]kereru.com 1.10 : add inverted colours 1.14 : Add VMG screen */ -var v = '1.15'; +var v = '1.16'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -195,8 +195,11 @@ var maxAlt = 0; var maxN = 0; // counter. Only start comparing for max after a certain number of fixes to allow kalman filter to have smoohed the data. // Previous values for calculating VMG. -var lastDist = -1; -var lastTime = -1; +var vmgD1 = -1; // Dist start +var vmgD2 = -1; // Dist end +var vmgT1 = -1; // Time start +var vmgT2 = -1; // Time end +var vmgSpd = 0; var emulator = (process.env.BOARD=="EMSCRIPTEN")?1:0; // 1 = running in emulator. Supplies test values; @@ -205,8 +208,9 @@ var wp = {}; // Waypoint to use for distance from cur position. function nxtWp(){ cfg.wp++; loadWp(); - lastDist = -1; // Reset VMG calcs - lastTime = -1; + vmgD1 = -1; // Reset VMG calcs + vmgD2 = -1; + vmgT1 = -1; } function loadWp() { @@ -376,7 +380,6 @@ if ( emulator ) { var ew = ''; var lon = '---.--'; var sats = '---'; - var vmg = '---'; // Waypoint name var wpName = wp.name; @@ -408,33 +411,13 @@ if ( emulator ) { if (parseFloat(al) > parseFloat(maxAlt) && maxN > 15 ) maxAlt = al; if (isNaN(al)) al = '---'; - // Distance to waypoint and vmg + // Distance to waypoint di = distance(lf,wp); - -//lastDist = 13640; -//lastTime = (getTime()/1000) - 10; - - if ( lastDist != -1 && ! isNaN(lastDist)) { -//console.log(' Distance : '+di); -//console.log('last.Distance : '+lastDist); -//console.log('last.Time : '+lastTime); - - // Have two WP distances and a time. Calc speed - vmg = ((lastDist-di)/1000)/((getTime()/1000-lastTime)/3600); // k/h - vmg = vmg/parseFloat(cfg.spd); // Calculate for selected units -//console.log('VMG : '+vmg); - } - lastDist = di; - lastTime = getTime()/1000; // secs - + vmgD2 = di; + vmgT2 = Math.round(lf.time.getTime()/1000); di = (di/parseFloat(cfg.dist)).toFixed(2); if ( di >= 100 ) di = parseFloat(di).toFixed(1); if ( di >= 1000 ) di = parseFloat(di).toFixed(0); - - if ( Math.abs(vmg) < 10 ) vmg = vmg.toFixed(1); - else vmg = Math.round(vmg); - - if (isNaN(vmg)) vmg = '---'; if (isNaN(di)) di = '------'; // Age of last fix (secs) @@ -517,7 +500,7 @@ if ( emulator ) { if ( cfg.modeA == 3 ) { // VMG drawScrn({ - val:vmg, + val:vmgSpd, unit:cfg.spd_unit, sats:sats, age:age, @@ -545,6 +528,48 @@ if ( emulator ) { } +function updateVMG() { +//console.log('----------'); +//console.log('vmgT1 : '+vmgT1); +//console.log('vmgT2 : '+vmgT2); + + if (!canDraw) return; + vmgSpd = '---'; + + if ( ! lf.fix ) return; + if ( vmgT1 == vmgT2 ) return; // No new fix + + +//vmgD1 = 13640; +//vmgT1 = (getTime()/1000) - 10; + + + + + if ( vmgD1 != -1 && ! isNaN(vmgD1)) { +//console.log(' Distance : '+di); +//console.log('last.Distance : '+vmgD1); +//console.log('last.Time : '+vmgT1); + + // Have two WP distances and a time. Calc speed + vmgSpd = ((vmgD1-vmgD2)/1000)/((vmgT2-vmgT1)/3600); // k/h + + vmgSpd = vmgSpd/parseFloat(cfg.spd); // Calculate for selected units +//console.log('VMG : '+vmg); + } + vmgD1 = vmgD2; + vmgT1 = vmgT2; // secs + + + if ( Math.abs(vmgSpd) < 10 ) vmgSpd = vmgSpd.toFixed(1); + else vmgSpd = Math.round(vmgSpd); + + if (isNaN(vmgSpd)) vmgSpd = '---'; + + console.log('vmgSpd : '+vmgSpd); + +} + function prevScrn() { cfg.modeA = cfg.modeA-1; if ( cfg.modeA < 0 ) cfg.modeA = 5; @@ -753,3 +778,4 @@ Bangle.on('GPS', onGPS); setButtons(); setInterval(updateClock, 10000); +setInterval(updateVMG, 10000); From 020a2ea00598568e9a755a78969bcea08c661767 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 11:39:58 +1300 Subject: [PATCH 026/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 42e54a6bd..6e18c3505 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.15", + "version":"1.16", "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From a7b5f530c30c28f2c53c80692934135ad898a562 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 11:50:03 +1300 Subject: [PATCH 027/105] Update app.js --- apps/speedalt2/app.js | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 1823b9911..76dbccfc0 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -231,10 +231,6 @@ function distance(a,b){ // Distance in metres var d = Math.sqrt(x*x + y*y) * 6371000; -// d = (d/parseFloat(cfg.dist)).toFixed(2); -// if ( d >= 100 ) d = parseFloat(d).toFixed(1); -// if ( d >= 1000 ) d = parseFloat(d).toFixed(0); - return d; } @@ -529,10 +525,6 @@ if ( emulator ) { } function updateVMG() { -//console.log('----------'); -//console.log('vmgT1 : '+vmgT1); -//console.log('vmgT2 : '+vmgT2); - if (!canDraw) return; vmgSpd = '---'; @@ -542,32 +534,19 @@ function updateVMG() { //vmgD1 = 13640; //vmgT1 = (getTime()/1000) - 10; - - - if ( vmgD1 != -1 && ! isNaN(vmgD1)) { -//console.log(' Distance : '+di); -//console.log('last.Distance : '+vmgD1); -//console.log('last.Time : '+vmgT1); - // Have two WP distances and a time. Calc speed vmgSpd = ((vmgD1-vmgD2)/1000)/((vmgT2-vmgT1)/3600); // k/h - vmgSpd = vmgSpd/parseFloat(cfg.spd); // Calculate for selected units -//console.log('VMG : '+vmg); } vmgD1 = vmgD2; vmgT1 = vmgT2; // secs - if ( Math.abs(vmgSpd) < 10 ) vmgSpd = vmgSpd.toFixed(1); else vmgSpd = Math.round(vmgSpd); if (isNaN(vmgSpd)) vmgSpd = '---'; - - console.log('vmgSpd : '+vmgSpd); - } function prevScrn() { From 0bd6399d833236021f76fdb3aee298a74ae766a8 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 11:58:16 +1300 Subject: [PATCH 028/105] Update app.js --- apps/speedalt2/app.js | 94 ++++++++++++------------------------------- 1 file changed, 26 insertions(+), 68 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 76dbccfc0..fd53cf7c3 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,9 +2,8 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com 1.10 : add inverted colours -1.14 : Add VMG screen */ -var v = '1.16'; +var v = '1.10'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -188,19 +187,13 @@ var lf = {fix:0,satellites:0}; var showMax = 0; // 1 = display the max values. 0 = display the cur fix var pwrSav = 1; // 1 = default power saving with watch screen off and GPS to PMOO mode. 0 = screen kept on. var canDraw = 1; +var time = ''; // Last time string displayed. Re displayed in background colour to remove before drawing new time. var tmrLP; // Timer for delay in switching to low power after screen turns off var maxSpd = 0; var maxAlt = 0; var maxN = 0; // counter. Only start comparing for max after a certain number of fixes to allow kalman filter to have smoohed the data. -// Previous values for calculating VMG. -var vmgD1 = -1; // Dist start -var vmgD2 = -1; // Dist end -var vmgT1 = -1; // Time start -var vmgT2 = -1; // Time end -var vmgSpd = 0; - var emulator = (process.env.BOARD=="EMSCRIPTEN")?1:0; // 1 = running in emulator. Supplies test values; var wp = {}; // Waypoint to use for distance from cur position. @@ -208,9 +201,6 @@ var wp = {}; // Waypoint to use for distance from cur position. function nxtWp(){ cfg.wp++; loadWp(); - vmgD1 = -1; // Reset VMG calcs - vmgD2 = -1; - vmgT1 = -1; } function loadWp() { @@ -229,8 +219,12 @@ function distance(a,b){ var x = radians(a.lon-b.lon) * Math.cos(radians((a.lat+b.lat)/2)); var y = radians(b.lat-a.lat); - // Distance in metres + // Distance in selected units var d = Math.sqrt(x*x + y*y) * 6371000; + d = (d/parseFloat(cfg.dist)).toFixed(2); + if ( d >= 100 ) d = parseFloat(d).toFixed(1); + if ( d >= 1000 ) d = parseFloat(d).toFixed(0); + return d; } @@ -334,8 +328,8 @@ function drawClock() { function drawWP(wp) { buf.setColor(3); buf.setFontAlign(0,1); //left, bottom - buf.setFontVector(40); - buf.drawString(wp,120,132); + buf.setFontVector(48); + buf.drawString(wp,120,140); } function drawSats(sats) { @@ -395,10 +389,17 @@ if ( emulator ) { } // Speed - sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units + if ( cfg.spd == 0 ) { + m = require("locale").speed(lf.speed).match(/([0-9,\.]+)(.*)/); // regex splits numbers from units + sp = parseFloat(m[1]); + cfg.spd_unit = m[2]; + } + else sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units + if ( sp < 10 ) sp = sp.toFixed(1); else sp = Math.round(sp); if (isNaN(sp)) sp = '---'; + if (parseFloat(sp) > parseFloat(maxSpd) && maxN > 15 ) maxSpd = sp; // Altitude @@ -409,12 +410,7 @@ if ( emulator ) { // Distance to waypoint di = distance(lf,wp); - vmgD2 = di; - vmgT2 = Math.round(lf.time.getTime()/1000); - di = (di/parseFloat(cfg.dist)).toFixed(2); - if ( di >= 100 ) di = parseFloat(di).toFixed(1); - if ( di >= 1000 ) di = parseFloat(di).toFixed(0); - if (isNaN(di)) di = '------'; + if (isNaN(di)) di = '--------'; // Age of last fix (secs) age = Math.max(0,Math.round(getTime())-(lf.time.getTime()/1000)); @@ -494,18 +490,6 @@ if ( emulator ) { } if ( cfg.modeA == 3 ) { - // VMG - drawScrn({ - val:vmgSpd, - unit:cfg.spd_unit, - sats:sats, - age:age, - max:'VMG', - wp:wpName - }); - } - - if ( cfg.modeA == 4 ) { // Position drawPosn({ sats:sats, @@ -517,48 +501,23 @@ if ( emulator ) { }); } - if ( cfg.modeA == 5 ) { + if ( cfg.modeA == 4 ) { // Large clock drawClock(); } } -function updateVMG() { - if (!canDraw) return; - vmgSpd = '---'; - - if ( ! lf.fix ) return; - if ( vmgT1 == vmgT2 ) return; // No new fix - - -//vmgD1 = 13640; -//vmgT1 = (getTime()/1000) - 10; - - if ( vmgD1 != -1 && ! isNaN(vmgD1)) { - // Have two WP distances and a time. Calc speed - vmgSpd = ((vmgD1-vmgD2)/1000)/((vmgT2-vmgT1)/3600); // k/h - vmgSpd = vmgSpd/parseFloat(cfg.spd); // Calculate for selected units - } - vmgD1 = vmgD2; - vmgT1 = vmgT2; // secs - - if ( Math.abs(vmgSpd) < 10 ) vmgSpd = vmgSpd.toFixed(1); - else vmgSpd = Math.round(vmgSpd); - - if (isNaN(vmgSpd)) vmgSpd = '---'; -} - function prevScrn() { cfg.modeA = cfg.modeA-1; - if ( cfg.modeA < 0 ) cfg.modeA = 5; + if ( cfg.modeA < 0 ) cfg.modeA = 4; savSettings(); onGPS(lf); } function nextScrn() { cfg.modeA = cfg.modeA+1; - if ( cfg.modeA > 5 ) cfg.modeA = 0; + if ( cfg.modeA > 4 ) cfg.modeA = 0; savSettings(); onGPS(lf); } @@ -570,14 +529,14 @@ function nextFunc(dur) { if ( dur < 2 ) showMax = !showMax; // Short press toggle fix/max display else { maxSpd = 0; maxAlt = 0; } // Long press resets max values. } - else if ( cfg.modeA == 2 || cfg.modeA == 3) nxtWp(); // Dist or VMG mode - Select next waypoint + else if ( cfg.modeA == 2) nxtWp(); // Dist mode - Select next waypoint onGPS(lf); } function updateClock() { if (!canDraw) return; - if ( cfg.modeA != 5 ) return; + if ( cfg.modeA != 4 ) return; drawClock(); if ( emulator ) {maxSpd++;maxAlt++;} } @@ -687,15 +646,15 @@ console.log('MDL'); // Read settings. let cfg = require('Storage').readJSON('speedalt2.json',1)||{}; -cfg.spd = cfg.spd||1; // Multiplier for speed unit conversions. 0 = use the locale values for speed -cfg.spd_unit = cfg.spd_unit||'kph'; // Displayed speed unit +cfg.spd = cfg.spd||0; // Multiplier for speed unit conversions. 0 = use the locale values for speed +cfg.spd_unit = cfg.spd_unit||''; // Displayed speed unit cfg.alt = cfg.alt||0.3048;// Multiplier for altitude unit conversions. cfg.alt_unit = cfg.alt_unit||'feet'; // Displayed altitude units cfg.dist = cfg.dist||1000;// Multiplier for distnce unit conversions. cfg.dist_unit = cfg.dist_unit||'km'; // Displayed altitude units cfg.colour = cfg.colour||0; // Colour scheme. cfg.wp = cfg.wp||0; // Last selected waypoint for dist -cfg.modeA = cfg.modeA||0; // 0=Speed 1=Alt 2=Dist 3 = vmg 4=Position 5=Clock +cfg.modeA = cfg.modeA||0; // 0=Speed 1=Alt 2=Dist 3=Position 4=Clock cfg.primSpd = cfg.primSpd||0; // 1 = Spd in primary, 0 = Spd in secondary cfg.spdFilt = cfg.spdFilt==undefined?true:cfg.spdFilt; @@ -757,4 +716,3 @@ Bangle.on('GPS', onGPS); setButtons(); setInterval(updateClock, 10000); -setInterval(updateVMG, 10000); From 2981aaf4af2c4c85987f460348f2169499f11e3a Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 11:58:40 +1300 Subject: [PATCH 029/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 6e18c3505..5aeb95eb6 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.16", + "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From d80dc2ae12ef26c8c9e8e0eb2fcc97bea586883d Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:30:50 -0500 Subject: [PATCH 030/105] Add files via upload --- apps/thermomF2.app.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 apps/thermomF2.app.js diff --git a/apps/thermomF2.app.js b/apps/thermomF2.app.js new file mode 100644 index 000000000..d3ba14dcd --- /dev/null +++ b/apps/thermomF2.app.js @@ -0,0 +1,26 @@ +function onTemperature(p) { + g.reset(1).clearRect(0,24,g.getWidth(),g.getHeight()); + g.setFont("6x8",2).setFontAlign(0,0); + var x = g.getWidth()/2; + var y = g.getHeight()/2 + 10; + g.drawString("Temp", x, y - 45); + g.setFontVector(70).setFontAlign(0,0); + var t = require('locale').temp(p.temperature); + g.drawString(t, x, y); +} + +function drawTemperature() { + onTemperature({ + temperature : E.getTemperature() + }); + +} + + +setInterval(function() { + drawTemperature(); +}, 2000); +drawTemperature(); +E.showMessage("Loading..."); +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file From 69dc98c6819d4c8fa5e4a542de39f8ad046dcd28 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:33:07 -0500 Subject: [PATCH 031/105] Rename apps/thermomF2.app.js to apps/ltherm/app.js --- apps/{thermomF2.app.js => ltherm/app.js} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename apps/{thermomF2.app.js => ltherm/app.js} (96%) diff --git a/apps/thermomF2.app.js b/apps/ltherm/app.js similarity index 96% rename from apps/thermomF2.app.js rename to apps/ltherm/app.js index d3ba14dcd..06ff92e18 100644 --- a/apps/thermomF2.app.js +++ b/apps/ltherm/app.js @@ -23,4 +23,4 @@ setInterval(function() { drawTemperature(); E.showMessage("Loading..."); Bangle.loadWidgets(); -Bangle.drawWidgets(); \ No newline at end of file +Bangle.drawWidgets(); From 36ed08f0eadb93b4b161298e4681084cab7730e2 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:33:35 -0500 Subject: [PATCH 032/105] Create icon.js --- apps/ltherm/icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/ltherm/icon.js diff --git a/apps/ltherm/icon.js b/apps/ltherm/icon.js new file mode 100644 index 000000000..4f3cc4b0a --- /dev/null +++ b/apps/ltherm/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/AH4AChGIxGAC6eIAQgARFgUIC9ReCAYJgSC7BHDF6gUBC6ovWI/5Hga/6P/ABsCkABDC/4XxkQXDkQuSAQwXPDQkAC6BBCkQDDC6MCmczFoIXQCQQXBDgQXP2EA2YXBncAhYXR3YXB3YXRCQWznYcCC6ICBAYYXPhYrBApAwPFyQqCIoYuRLwZgDAH4A/")) From 2fed2e2c45a70dbda1c82e3415486a01c716097b Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:34:43 -0500 Subject: [PATCH 033/105] Add files via upload --- apps/ltherm/thermf.png | Bin 0 -> 1189 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ltherm/thermf.png diff --git a/apps/ltherm/thermf.png b/apps/ltherm/thermf.png new file mode 100644 index 0000000000000000000000000000000000000000..bb33cb939d63a9682e318025e2f94c7c1f0ea31b GIT binary patch literal 1189 zcmV;W1X}xvP)nbkt*}t8k&unGMZv-!*9L9P7LD0b z$gE+K)ifw5s5ZsGe@q54Q4?BH5!OTshs9=5bi*=m{V<9_)2Li(Qenkb?8kkd(;xS~ z+nBrl(fi!m#T|J5c+NST@AKt3&pGG47p7%eE^SfS3LJYvmN-HjK!i_E?@`CHfn%M( z{3oTz8Kzy}t_h}2m89YOm(-s&@f@4M0Q^DPwV~QKH2DrO-y!A;&7R>7?eMy7JgaiU zBeJBlQKW3WG)=UXt(T_KMv<}&vdAW;)f@2PR&Br^Vc!L|5%y^VI-tTPrd0y2p->x8 zaHf2nNclRE(02S4bygd211__Psci=H0TB>I%Vc&>Kv^yuRtad6B5?FI)tt$0n}F36 z(k8WTTO(5Wplr!xw~A>sSo#K(qJ@A@CbLiZ6hh$L{gbDVXRzKnvywt}_leZ4&e0SC zP|#vzk`xj^CTb&M+6?BK)cM|gD{~6j9=_~9V&MLjV-0No!LetnbA^D)(8zLzz^iXx zq>u}~2$_WCYJawle0Cv2msz&Wo znSh_3g~sp4iB=*1?*_!TRLTrnxK;>k ztB@;(JrbU>gd8*T}bwAsLpOkn3ysn>>k-GFDGKB^9f`qsEC(1tnMFlX0Nxh~W{^Reo54b9rH zsENgSpfq|@qFVk^&G&93#D2qK1i0sP;JW3?*i{jaG?6pZuKER+alQtH2E_rc<3WF z_;1e;=>`gg`C4$CfSyq2L4(dGnZE*xW~SE66`=D8TxbaWT&!wG2#_4}?Joe+&)jhDCOPjYP!OpaMY@3*hI870FT_Rz26U@)I0Zk# zl_RND@B_GKaWr&?exBi)bffz@${8XNSp5~JJi{5^P!sA3|7N={^!>gUGuQ!x9dLdx z#)Cd@i0z@D4>g|Q^qMdD>3<`jP@)Y7T*EybH>OHueXr_w0~Wc%v=4mFz+a!y?c#~YM15N_p=pm|Wzf(gO^Y2<9dC5Ey3QAp{ z>uZmzU!&kh?gJ~oR=;S&S}nx!>3pYHW@qy4S|C^9)1`&Qj<7cB;lbkP#rq}l0Pr%x zpulcX9P(Xy0Y;LPD2I9skE6&Fc(~?UwciG=)!{Z#EG57;U^(DUFb4__8O5gCdsVM3 z%&h#)nkbgp+E67hFAZ`!>5!;8p?=E--n2~1r7ZsdH4U76`VJt+00000NkvXXu0mjf DV^KD_ literal 0 HcmV?d00001 From 8a4d79ef2fd0345e062538bc120b84201df8c8a9 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:37:07 -0500 Subject: [PATCH 034/105] Create readme.md --- apps/ltherm/readme.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 apps/ltherm/readme.md diff --git a/apps/ltherm/readme.md b/apps/ltherm/readme.md new file mode 100644 index 000000000..477c51bd6 --- /dev/null +++ b/apps/ltherm/readme.md @@ -0,0 +1,3 @@ +# Thermometer + +Localized Bangle.js 2 thermometer app. From a83b444b051e7ccda5241c681e3ed52db4b9ef64 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:47:23 -0500 Subject: [PATCH 035/105] Delete apps.json --- apps.json | 4976 ----------------------------------------------------- 1 file changed, 4976 deletions(-) delete mode 100644 apps.json diff --git a/apps.json b/apps.json deleted file mode 100644 index ca73a0d10..000000000 --- a/apps.json +++ /dev/null @@ -1,4976 +0,0 @@ -[ - { - "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.38", - "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.13", - "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 from Gadgetbridge on Android. This replaces the old Gadgetbridge 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.07", - "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.08", - "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.36", - "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) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", - "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.03", - "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.04", - "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.13", - "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.14", - "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.07", - "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.04", - "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"], - "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.05", - "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.19", - "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"], - "custom": "grocery.html", - "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.04", - "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.04", - "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.03", - "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.01", - "description": "Provides assistance while performing a CPR", - "icon": "cprassist-icon.png", - "tags": "tool,firstaid", - "supports": ["BANGLEJS"], - "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": "0.07", - "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.02", - "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.05", - "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"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"doztime.app.js","url":"app.js"}, - {"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.04", - "description": "Displays the current temperature in degree Celsius, updated every 20 seconds", - "icon": "app.png", - "tags": "tool", - "supports": ["BANGLEJS", "BANGLEJS2"], - "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.02", - "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": "A modification of the Thermometer App to display temprature in Fahrenheit", - "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.08", - "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", - "icon": "pastel.png", - "dependencies": {"mylocation":"app"}, - "screenshots": [{"url":"screenshot_pastel.png"}], - "type": "clock", - "tags": "clock", - "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.01", - "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.06", - "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} - ] - }, - { "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.05", - "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.04", - "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"], - "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.01", - "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.04", - "description": "A pebble style clock to keep the rebellion going", - "readme": "README.md", - "icon": "pebble.png", - "screenshots": [{"url":"pebble_screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["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": ["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.04", - "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": "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.10", - "description": "Directly launch apps from the clock screen with custom patterns.", - "icon": "app.png", - "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.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": "rebble", - "name": "Rebble Clock", - "shortName": "Rebble", - "version": "0.02", - "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"}, - "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.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", - "allow_emulator": true, - "version":"0.01", - "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", - "tags": "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.00", - "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": "Core Temp Display", - "version": "0.01", - "description": "Display CoreTemp device sensor data", - "icon": "coretemp.png", - "type": "app", - "tags": "health", - "readme": "README.md", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"coretemp.boot.js","url":"boot.js"}, - {"name":"coretemp.app.js","url":"coretemp.js"}, - {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} - ] - } -] From dbfc114dd6d30e1cc5c288d3b369c4c20d3eff60 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:48:11 -0500 Subject: [PATCH 036/105] Add files via upload --- apps.json | 4990 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4990 insertions(+) create mode 100644 apps.json diff --git a/apps.json b/apps.json new file mode 100644 index 000000000..2a83c2b69 --- /dev/null +++ b/apps.json @@ -0,0 +1,4990 @@ +[ + { + "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.38", + "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.13", + "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 from Gadgetbridge on Android. This replaces the old Gadgetbridge 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.07", + "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.08", + "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.36", + "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) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", + "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.03", + "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.04", + "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.13", + "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.14", + "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.07", + "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.04", + "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"], + "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.05", + "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.19", + "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"], + "custom": "grocery.html", + "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.04", + "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.04", + "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.03", + "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.01", + "description": "Provides assistance while performing a CPR", + "icon": "cprassist-icon.png", + "tags": "tool,firstaid", + "supports": ["BANGLEJS"], + "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": "0.07", + "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.02", + "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.05", + "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"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"doztime.app.js","url":"app.js"}, + {"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.04", + "description": "Displays the current temperature in degree Celsius, updated every 20 seconds", + "icon": "app.png", + "tags": "tool", + "supports": ["BANGLEJS", "BANGLEJS2"], + "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.02", + "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": "A modification of the Thermometer App to display temprature in Fahrenheit", + "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.08", + "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", + "icon": "pastel.png", + "dependencies": {"mylocation":"app"}, + "screenshots": [{"url":"screenshot_pastel.png"}], + "type": "clock", + "tags": "clock", + "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.01", + "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.06", + "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} + ] + }, + { "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.05", + "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.04", + "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"], + "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.01", + "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.04", + "description": "A pebble style clock to keep the rebellion going", + "readme": "README.md", + "icon": "pebble.png", + "screenshots": [{"url":"pebble_screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["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": ["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.04", + "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": "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.10", + "description": "Directly launch apps from the clock screen with custom patterns.", + "icon": "app.png", + "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.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": "rebble", + "name": "Rebble Clock", + "shortName": "Rebble", + "version": "0.02", + "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"}, + "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.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", + "allow_emulator": true, + "version":"0.01", + "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", + "tags": "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.00", + "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": "Core Temp Display", + "version": "0.01", + "description": "Display CoreTemp device sensor data", + "icon": "coretemp.png", + "type": "app", + "tags": "health", + "readme": "README.md", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"coretemp.boot.js","url":"boot.js"}, + {"name":"coretemp.app.js","url":"coretemp.js"}, + {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} + ] + }, + { + "id": "ltherm", + "name": "Thermometer", + "version": "0.01", + "description": "Displays the current temperature in localized units.", + "icon": "thermf.png", + "tags": "tool", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"ltherm.app.js","url":"app.js"}, + {"name":"thermf.img","url":"icon.js","evaluate":true} + ] + } +] \ No newline at end of file From 73ef9ce7fba2ed30508eae45c228849d2e2533b8 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 06:02:51 -0500 Subject: [PATCH 037/105] Delete apps.json --- apps.json | 4990 ----------------------------------------------------- 1 file changed, 4990 deletions(-) delete mode 100644 apps.json diff --git a/apps.json b/apps.json deleted file mode 100644 index 2a83c2b69..000000000 --- a/apps.json +++ /dev/null @@ -1,4990 +0,0 @@ -[ - { - "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.38", - "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.13", - "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 from Gadgetbridge on Android. This replaces the old Gadgetbridge 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.07", - "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.08", - "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.36", - "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) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", - "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.03", - "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.04", - "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.13", - "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.14", - "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.07", - "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.04", - "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"], - "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.05", - "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.19", - "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"], - "custom": "grocery.html", - "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.04", - "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.04", - "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.03", - "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.01", - "description": "Provides assistance while performing a CPR", - "icon": "cprassist-icon.png", - "tags": "tool,firstaid", - "supports": ["BANGLEJS"], - "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": "0.07", - "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.02", - "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.05", - "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"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"doztime.app.js","url":"app.js"}, - {"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.04", - "description": "Displays the current temperature in degree Celsius, updated every 20 seconds", - "icon": "app.png", - "tags": "tool", - "supports": ["BANGLEJS", "BANGLEJS2"], - "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.02", - "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": "A modification of the Thermometer App to display temprature in Fahrenheit", - "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.08", - "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", - "icon": "pastel.png", - "dependencies": {"mylocation":"app"}, - "screenshots": [{"url":"screenshot_pastel.png"}], - "type": "clock", - "tags": "clock", - "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.01", - "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.06", - "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} - ] - }, - { "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.05", - "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.04", - "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"], - "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.01", - "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.04", - "description": "A pebble style clock to keep the rebellion going", - "readme": "README.md", - "icon": "pebble.png", - "screenshots": [{"url":"pebble_screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["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": ["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.04", - "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": "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.10", - "description": "Directly launch apps from the clock screen with custom patterns.", - "icon": "app.png", - "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.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": "rebble", - "name": "Rebble Clock", - "shortName": "Rebble", - "version": "0.02", - "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"}, - "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.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", - "allow_emulator": true, - "version":"0.01", - "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", - "tags": "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.00", - "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": "Core Temp Display", - "version": "0.01", - "description": "Display CoreTemp device sensor data", - "icon": "coretemp.png", - "type": "app", - "tags": "health", - "readme": "README.md", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"coretemp.boot.js","url":"boot.js"}, - {"name":"coretemp.app.js","url":"coretemp.js"}, - {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} - ] - }, - { - "id": "ltherm", - "name": "Thermometer", - "version": "0.01", - "description": "Displays the current temperature in localized units.", - "icon": "thermf.png", - "tags": "tool", - "supports": ["BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"ltherm.app.js","url":"app.js"}, - {"name":"thermf.img","url":"icon.js","evaluate":true} - ] - } -] \ No newline at end of file From 9769934d71457725e262e3189751c6aa4c18c5e0 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 06:04:14 -0500 Subject: [PATCH 038/105] Add files via upload --- apps.json | 4990 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4990 insertions(+) create mode 100644 apps.json diff --git a/apps.json b/apps.json new file mode 100644 index 000000000..5813561cf --- /dev/null +++ b/apps.json @@ -0,0 +1,4990 @@ +[ + { + "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.38", + "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.13", + "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 from Gadgetbridge on Android. This replaces the old Gadgetbridge 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.07", + "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.08", + "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.36", + "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) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", + "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.03", + "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.04", + "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.13", + "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.14", + "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.07", + "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.04", + "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"], + "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.05", + "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.19", + "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"], + "custom": "grocery.html", + "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.04", + "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.04", + "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.03", + "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.01", + "description": "Provides assistance while performing a CPR", + "icon": "cprassist-icon.png", + "tags": "tool,firstaid", + "supports": ["BANGLEJS"], + "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": "0.07", + "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.02", + "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.05", + "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"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"doztime.app.js","url":"app.js"}, + {"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.04", + "description": "Displays the current temperature in degree Celsius, updated every 20 seconds", + "icon": "app.png", + "tags": "tool", + "supports": ["BANGLEJS", "BANGLEJS2"], + "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.02", + "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": "A modification of the Thermometer App to display temprature in Fahrenheit", + "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.08", + "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", + "icon": "pastel.png", + "dependencies": {"mylocation":"app"}, + "screenshots": [{"url":"screenshot_pastel.png"}], + "type": "clock", + "tags": "clock", + "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.01", + "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.06", + "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} + ] + }, + { "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.05", + "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.04", + "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"], + "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.01", + "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.04", + "description": "A pebble style clock to keep the rebellion going", + "readme": "README.md", + "icon": "pebble.png", + "screenshots": [{"url":"pebble_screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["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": ["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.04", + "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": "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.10", + "description": "Directly launch apps from the clock screen with custom patterns.", + "icon": "app.png", + "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.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": "rebble", + "name": "Rebble Clock", + "shortName": "Rebble", + "version": "0.02", + "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"}, + "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.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", + "allow_emulator": true, + "version":"0.01", + "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", + "tags": "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.00", + "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": "Core Temp Display", + "version": "0.01", + "description": "Display CoreTemp device sensor data", + "icon": "coretemp.png", + "type": "app", + "tags": "health", + "readme": "README.md", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"coretemp.boot.js","url":"boot.js"}, + {"name":"coretemp.app.js","url":"coretemp.js"}, + {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} + ] + }, + { + "id": "ltherm", + "name": "Thermometer", + "version": "0.01", + "description": "Displays the current temperature in localized units.", + "icon": "thermf.png", + "tags": "tool", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"ltherm.app.js","url":"app.js"}, + {"name":"ltherm.img","url":"icon.js","evaluate":true} + ] + } +] \ No newline at end of file From 6679922bfb853c6f214d8d0ce15815c1a89cc022 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:00:12 +0300 Subject: [PATCH 039/105] feat: add pebbleDistance app --- apps.json | 20 +++- apps/pebbleDistance/ChangeLog | 1 + apps/pebbleDistance/LECO 1976-Regular.otf | Bin 0 -> 26432 bytes apps/pebbleDistance/README.md | 10 ++ apps/pebbleDistance/pebble.app.js | 123 ++++++++++++++++++++++ apps/pebbleDistance/pebble.icon.js | 1 + apps/pebbleDistance/pebble.png | Bin 0 -> 2004 bytes apps/pebbleDistance/pebble.settings.js | 48 +++++++++ apps/pebbleDistance/pebble_screenshot.png | Bin 0 -> 25140 bytes 9 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 apps/pebbleDistance/ChangeLog create mode 100644 apps/pebbleDistance/LECO 1976-Regular.otf create mode 100644 apps/pebbleDistance/README.md create mode 100644 apps/pebbleDistance/pebble.app.js create mode 100644 apps/pebbleDistance/pebble.icon.js create mode 100644 apps/pebbleDistance/pebble.png create mode 100644 apps/pebbleDistance/pebble.settings.js create mode 100644 apps/pebbleDistance/pebble_screenshot.png diff --git a/apps.json b/apps.json index c379a1de4..abeb920c0 100644 --- a/apps.json +++ b/apps.json @@ -4981,7 +4981,7 @@ "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", "icon": "app.png", "tags": "tool", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS2"], "storage": [ {"name":"showimg.app.js","url":"app.js"}, {"name":"showimg.img","url":"app-icon.js","evaluate":true} @@ -5003,5 +5003,23 @@ {"name":"lapcounter.app.js","url":"app.js"}, {"name":"lapcounter.img","url":"app-icon.js","evaluate":true} ] + }, + { + "id": "pebbleDistance", + "name": "Pebble Clock with distance", + "shortName": "Pebble with distance", + "version": "0.1", + "description": "Fork of pebble clock with distance", + "readme": "README.md", + "icon": "pebble.png", + "screenshots": [{"url":"pebble_screenshot.png"}], + "type": "clock", + "tags": "clock, distance, pebble", + "supports": ["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} + ] } ] diff --git a/apps/pebbleDistance/ChangeLog b/apps/pebbleDistance/ChangeLog new file mode 100644 index 000000000..a678cffdb --- /dev/null +++ b/apps/pebbleDistance/ChangeLog @@ -0,0 +1 @@ +0.1: first release diff --git a/apps/pebbleDistance/LECO 1976-Regular.otf b/apps/pebbleDistance/LECO 1976-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..05a318224400bacae73f2529f448f780f61b414f GIT binary patch literal 26432 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 F{|A0DE;axF literal 0 HcmV?d00001 diff --git a/apps/pebbleDistance/README.md b/apps/pebbleDistance/README.md new file mode 100644 index 000000000..7f34aa3c4 --- /dev/null +++ b/apps/pebbleDistance/README.md @@ -0,0 +1,10 @@ +# Pebble with distance and steps + +- Forked from [Pebble](https://github.com/espruino/BangleApps/tree/master/apps/pebble) +- Added distance in km (kilometers) based on step length (can be changed in settings and is equal 0.75m by default) +- Battery warning changed to 15% instead of 30% + +![](pebble_screenshot.png) + +Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) +Forked and changed by [RomanistHere](https://github.com/RomanistHere) diff --git a/apps/pebbleDistance/pebble.app.js b/apps/pebbleDistance/pebble.app.js new file mode 100644 index 000000000..a9e737fa0 --- /dev/null +++ b/apps/pebbleDistance/pebble.app.js @@ -0,0 +1,123 @@ +Graphics.prototype.setFontLECO1976Regular42 = function(scale) { + // Actual height 42 (41 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAA/AAAAAAAAH/AAAAAAAA//AAAAAAAP//AAAAAAB///AAAAAAP///AAAAAB////AAAAAf////AAAAD////4AAAAf////AAAAH////4AAAA////+AAAAA////wAAAAA///+AAAAAA///gAAAAAA//8AAAAAAA//gAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////gD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4B/gH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAH+AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ERkmHyYmJiYmJCYmEQ=="), 60+(scale<<8)+(1<<16)); +}; + +Graphics.prototype.setFontLECO1976Regular22 = function(scale) { + // Actual height 22 (21 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22+(scale<<8)+(1<<16)); +}; + +const SETTINGS_FILE = "pebbleDistance.json"; +let settings; + +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green', 'avStep': 0.75}; +} + +var img = require("heatshrink").decompress(atob("oFAwkEogA/AH4A/AH4A/AH4A/AE8AAAoeXoAfeDQUBmcyD7A+Dh///8QD649CiAfaHwUvD4sEHy0DDYIfEICg+Cn4fHICY+DD4nxcgojOHwgfEIAYfRCIQaDD4ZAFD5r7DH4//kAfRCIZ/GAAnwD5p9DX44fTHgYSBf4ofVDAQEBl4fFUAgfOXoQzBgIfFBAIfPP4RAEAoYAB+cRiK/SG4h/WIBAfXIA7CBAAswD55AHn6fUIBMCD65AHl4gCmcziAfQQJqfQQJpiDgk0IDXxQLRAEECaBM+QgRYRYgUIA0CD4ggSQJiDCiAKBICszAAswD55AHABKBVD7BAFABIqBD5pAFABPxD55AOD6BADiIAJQAyxLABwf/gaAPAH4A/AH4ARA==")); + +const h = g.getHeight(); +const w = g.getWidth(); +const ha = 2*h/5 - 11; +const h2 = 3*h/5 - 19; +const h3 = 7*h/8 - 10; + +let batteryWarning = false; + +function draw() { + let date = new Date(); + let da = date.toString().split(" "); + let timeStr = da[4].substr(0,5); + const t = 6; + const stps = getSteps(); + + // turn the warning on once we have dipped below 15% + if (E.getBattery() < 15) + batteryWarning = true; + + // turn the warning off once we have dipped above 20% + if (E.getBattery() > 20) + batteryWarning = false; + + g.reset(); + g.setColor(settings.bg); + g.fillRect(0, 0, w, h2 - t); + + // contrast bar + g.setColor(g.theme.fg); + g.fillRect(0, h2 - t, w, h2); + + // day and steps + if (settings.color == 'Blue' || settings.color == 'Red') + g.setColor('#fff'); // white on blue or red best contrast + else + g.setColor('#000'); // otherwise black regardless of theme + + g.setFontLECO1976Regular22(); + g.setFontAlign(0, -1); + g.drawString(da[0].toUpperCase(), w/4, ha); // day of week + g.drawString(stps, 3*w/4, ha); + + // time + // white on red for battery warning + g.setColor(!batteryWarning ? g.theme.bg : '#f00'); + g.fillRect(0, h2, w, h3); + + g.setFontLECO1976Regular42(); + g.setFontAlign(0, -1); + g.setColor(!batteryWarning ? g.theme.fg : '#fff'); + g.drawString(timeStr, w/2, h2 + 8); + + // contrast bar + g.setColor(g.theme.fg); + g.fillRect(0, h3, w, h3 + t); + + // the bottom + g.setColor(settings.bg); + g.fillRect(0, h3 + t, w, h); + + g.setColor(settings.bg); + g.drawImage(img, w/2 + ((w/2) - 64)/2, -2, { scale: 1 }); + drawCalendar(((w/2) - 42)/2, 11, 42, 4, da[2]); + g.drawString((stps / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); +} + +// at x,y width:wi thicknes:th +function drawCalendar(x,y,wi,th,str) { + g.setColor(g.theme.fg); + g.fillRect(x, y, x + wi, y + wi); + g.setColor(g.theme.bg); + g.fillRect(x + th, y + th, x + wi - th, y + wi - th); + g.setColor(g.theme.fg); + + let hook_t = 6; + // first calendar hook, one third in + g.fillRect(x + (wi/3) - (th/2), y - hook_t, x + wi/3 + th - (th/2), y + hook_t); + // second calendar hook, two thirds in + g.fillRect(x + (2*wi/3) -(th/2), y - hook_t, x + 2*wi/3 + th - (th/2), y + hook_t); + + g.setFontLECO1976Regular22(); + g.setFontAlign(0, 0); + g.drawString(str, x + wi/2, y + wi/2 + th); +} + +function getSteps() { + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } + return '375'; +} + +g.clear(); +Bangle.loadWidgets(); +/* + * we are not drawing the widgets as we are taking over the whole screen + * so we will blank out the draw() functions of each widget and change the + * area to the top bar doesn't get cleared. + */ +for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} +loadSettings(); +setInterval(draw, 15000); // refresh every 15s +draw(); +Bangle.setUI("clock"); diff --git a/apps/pebbleDistance/pebble.icon.js b/apps/pebbleDistance/pebble.icon.js new file mode 100644 index 000000000..38f2ad40e --- /dev/null +++ b/apps/pebbleDistance/pebble.icon.js @@ -0,0 +1 @@ +var img = require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")) diff --git a/apps/pebbleDistance/pebble.png b/apps/pebbleDistance/pebble.png new file mode 100644 index 0000000000000000000000000000000000000000..cb836f39f993235aeb616c208173989c44adae0b GIT binary patch literal 2004 zcmV;_2P^oAP)2IEn4pj_t(B`$%d0=f$bN`T6&L?~i{rFfPoA zIm}`K2F}uJ0RnThb-~$N^!S8Ducq^A*y{q1uuIELqlq!Vz^Gs`_oIXvoTs&AcncVp z2Ax?0|Kl!Rpgtm+CyQ{c z4co>Vh9JJUGG@JpPAh5>X^@+^6xU6}6Ic3I7Pg4VC$=AsF79**tB56VG;ya>SVd%k z!;3rJ!YV90$70xypzxuXfgds5!ZJmt5)VZYPm+Q?-A`yzG!Pd~ly&t5&Oy#N+vG_KXf4@^^ z^;4jFz5ke(KkR%q6=-;j-9j$M$k_6fIJIwpja%O3+(Ngvol99*rocWohXarmvc~l* za@lqjrgu5EWEQelV76MdKTSB!Eh0y-#VKK}Kgg$k>|d6JXWYJ(QDSfXgfuB8GqXHH z*w4rel(%GXvt>1T<^9mxv;#yHYz+a+Hh->XE;Y+#tHJ$J+xvc&NuW*Yw zM(&{gOUE@R-)lO)ST#O^Sar^k&pD#NRwT=H3u~`m!^m*A)coATQD$N^YoP0v%V`%lWQ(=SYMFj?*CLJ|IHIQ`Ex@NZ+@-}(U!u_Gs`gzJL_o7 z%+K*BKl2wpv1`rA4AWY6&ho`!p6fIG%yOADeQjb|a(o^w>T=x~E*ZQ$R8mZW9~P+7 z-<9!tP6WgMknF_ZU)(~TP}cg?NbCU|@~~;ZR!m*LezPaX3ihpg)PIt~Gt<%$S24~a z^XLKc_*AK0IwF@aN}nt*{~C6&k;T*fvJuw}=P#2vb(WC@Qc!+UNzILC&4vbOpjrUtR1gFPw

5&nPkjackn*GG;?_F=0000 color_options[v], + onchange: v => { + s.color = color_options[v]; + s.bg = bg_code[v]; + save(); + }, + }, + 'Step length': { + value: 0.75 || s.avStep, + min: 0.2, + max: 1.5, + step: 0.05, + onchange : v => { + s.avStep = v; + save(); + } + } + }); +}); diff --git a/apps/pebbleDistance/pebble_screenshot.png b/apps/pebbleDistance/pebble_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..35ae3b5686b52be4325ceff2ac1a8cab2d8b216f GIT binary patch literal 25140 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 literal 0 HcmV?d00001 From d57ccb5073514ac85c271d5a77f493490e4a4a01 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:06:43 +0300 Subject: [PATCH 040/105] fix: update icon.js --- apps/pebbleDistance/pebble.app.js | 2 +- apps/pebbleDistance/pebble.icon.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/pebbleDistance/pebble.app.js b/apps/pebbleDistance/pebble.app.js index a9e737fa0..14cc9e398 100644 --- a/apps/pebbleDistance/pebble.app.js +++ b/apps/pebbleDistance/pebble.app.js @@ -106,7 +106,7 @@ function getSteps() { if (WIDGETS.wpedom !== undefined) { return WIDGETS.wpedom.getSteps(); } - return '375'; + return '0'; } g.clear(); diff --git a/apps/pebbleDistance/pebble.icon.js b/apps/pebbleDistance/pebble.icon.js index 38f2ad40e..c6b8950db 100644 --- a/apps/pebbleDistance/pebble.icon.js +++ b/apps/pebbleDistance/pebble.icon.js @@ -1 +1 @@ -var img = require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")) +require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")) From 2378ff304bb13d33e78c764875dcdb971376b3e5 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Wed, 15 Dec 2021 19:11:32 +0000 Subject: [PATCH 041/105] Pastle, Pebble, Rebble: updated dependancies and ChangeLogs --- apps.json | 9 +++++---- apps/pastel/ChangeLog | 1 + apps/pebble/ChangeLog | 1 + apps/rebble/ChangeLog | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index c379a1de4..0dd10cce6 100644 --- a/apps.json +++ b/apps.json @@ -4209,7 +4209,7 @@ "id": "pastel", "name": "Pastel Clock", "shortName": "Pastel", - "version": "0.08", + "version": "0.09", "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"app", "widpedom":"app"}, @@ -4723,8 +4723,9 @@ "id": "pebble", "name": "Pebble Clock", "shortName": "Pebble", - "version": "0.04", + "version": "0.06", "description": "A pebble style clock to keep the rebellion going", + "dependencies": {"widpedom":"app"}, "readme": "README.md", "icon": "pebble.png", "screenshots": [{"url":"pebble_screenshot.png"}], @@ -4876,11 +4877,11 @@ "id": "rebble", "name": "Rebble Clock", "shortName": "Rebble", - "version": "0.02", + "version": "0.03", "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"}, + "dependencies": {"mylocation":"app", "widpedom":"app"}, "screenshots": [{"url":"screenshot_rebble.png"}], "type": "clock", "tags": "clock", diff --git a/apps/pastel/ChangeLog b/apps/pastel/ChangeLog index 2ede0e161..afeb305c5 100644 --- a/apps/pastel/ChangeLog +++ b/apps/pastel/ChangeLog @@ -6,3 +6,4 @@ 0.06: Converted fonts to font modules 0.07: Added info line that cycles on BTN1/BTN3 (or vitual buttons on a bangle 2) 0.08: Added dependancy on MyLocation +0.09: Added dependancy on Pedometer Widget diff --git a/apps/pebble/ChangeLog b/apps/pebble/ChangeLog index b3d37f841..d92be5e9c 100644 --- a/apps/pebble/ChangeLog +++ b/apps/pebble/ChangeLog @@ -3,3 +3,4 @@ 0.03: Changed time+calendar font to LECO1976Regular, changed to slanting boot 0.04: Fix widget hiding code (fix #1046) 0.05: Fix typo in settings - Purple +0.06: Added dependancy on Pedometer Widget diff --git a/apps/rebble/ChangeLog b/apps/rebble/ChangeLog index 3e7094eab..16e65d4f9 100644 --- a/apps/rebble/ChangeLog +++ b/apps/rebble/ChangeLog @@ -1,2 +1,3 @@ 0.01: First release -0.02: Fix dependancies, fix type to Purple +0.02: Fix typo to Purple +0.03: Added dependancy on Pedometer Widget From 99e75b8e11fe07127dd98d074f27710c2173de34 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:11:48 +0300 Subject: [PATCH 042/105] fix: change version --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index abeb920c0..00aea6139 100644 --- a/apps.json +++ b/apps.json @@ -5008,7 +5008,7 @@ "id": "pebbleDistance", "name": "Pebble Clock with distance", "shortName": "Pebble with distance", - "version": "0.1", + "version": "0.11", "description": "Fork of pebble clock with distance", "readme": "README.md", "icon": "pebble.png", From 8e0ba23aa8ff485b402df652e9b748475a4bf76f Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:23:38 +0300 Subject: [PATCH 043/105] fix: play with syntax --- apps/pebbleDistance/pebble.app.js | 18 +++++++++--------- apps/pebbleDistance/pebble.icon.js | 2 +- apps/pebbleDistance/pebble.settings.js | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/pebbleDistance/pebble.app.js b/apps/pebbleDistance/pebble.app.js index 14cc9e398..9caee62c9 100644 --- a/apps/pebbleDistance/pebble.app.js +++ b/apps/pebbleDistance/pebble.app.js @@ -8,7 +8,7 @@ Graphics.prototype.setFontLECO1976Regular22 = function(scale) { g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22+(scale<<8)+(1<<16)); }; -const SETTINGS_FILE = "pebbleDistance.json"; +const SETTINGS_FILE = "pbd.json"; let settings; function loadSettings() { @@ -23,22 +23,22 @@ const ha = 2*h/5 - 11; const h2 = 3*h/5 - 19; const h3 = 7*h/8 - 10; -let batteryWarning = false; +let batWarn = false; function draw() { let date = new Date(); let da = date.toString().split(" "); let timeStr = da[4].substr(0,5); const t = 6; - const stps = getSteps(); + const stp = getSteps(); // turn the warning on once we have dipped below 15% if (E.getBattery() < 15) - batteryWarning = true; + batWarn = true; // turn the warning off once we have dipped above 20% if (E.getBattery() > 20) - batteryWarning = false; + batWarn = false; g.reset(); g.setColor(settings.bg); @@ -57,16 +57,16 @@ function draw() { g.setFontLECO1976Regular22(); g.setFontAlign(0, -1); g.drawString(da[0].toUpperCase(), w/4, ha); // day of week - g.drawString(stps, 3*w/4, ha); + g.drawString(stp, 3*w/4, ha); // time // white on red for battery warning - g.setColor(!batteryWarning ? g.theme.bg : '#f00'); + g.setColor(!batWarn ? g.theme.bg : '#f00'); g.fillRect(0, h2, w, h3); g.setFontLECO1976Regular42(); g.setFontAlign(0, -1); - g.setColor(!batteryWarning ? g.theme.fg : '#fff'); + g.setColor(!batWarn ? g.theme.fg : '#fff'); g.drawString(timeStr, w/2, h2 + 8); // contrast bar @@ -80,7 +80,7 @@ function draw() { g.setColor(settings.bg); g.drawImage(img, w/2 + ((w/2) - 64)/2, -2, { scale: 1 }); drawCalendar(((w/2) - 42)/2, 11, 42, 4, da[2]); - g.drawString((stps / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); + g.drawString((stp / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); } // at x,y width:wi thicknes:th diff --git a/apps/pebbleDistance/pebble.icon.js b/apps/pebbleDistance/pebble.icon.js index c6b8950db..5f7b157df 100644 --- a/apps/pebbleDistance/pebble.icon.js +++ b/apps/pebbleDistance/pebble.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")) +require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")); diff --git a/apps/pebbleDistance/pebble.settings.js b/apps/pebbleDistance/pebble.settings.js index 6b8702c56..ea1845e57 100644 --- a/apps/pebbleDistance/pebble.settings.js +++ b/apps/pebbleDistance/pebble.settings.js @@ -1,8 +1,8 @@ (function(back) { - const SETTINGS_FILE = "pebbleDistance.json"; + const SETTINGS_FILE = "pbd.json"; // initialize with default settings... - let s = {'bg': '#0f0', 'color': 'Green', 'avStep': 0.75}}; + let s = {'bg': '#0f0', 'color': 'Green', 'avStep': 0.75}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -10,13 +10,13 @@ let settings = storage.readJSON(SETTINGS_FILE, 1) || s; const saved = settings || {}; for (const key in saved) { - s[key] = saved[key] - }; + s[key] = saved[key]; + } function save() { settings = s; storage.write(SETTINGS_FILE, settings); - }; + } var color_options = ['Green','Orange','Cyan','Purple','Red','Blue']; var bg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; From 7cd6748d84fc2b848b10a1e1fed090413468af40 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:24:02 +0300 Subject: [PATCH 044/105] fix: version --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 00aea6139..00a9a21c9 100644 --- a/apps.json +++ b/apps.json @@ -5008,7 +5008,7 @@ "id": "pebbleDistance", "name": "Pebble Clock with distance", "shortName": "Pebble with distance", - "version": "0.11", + "version": "0.12", "description": "Fork of pebble clock with distance", "readme": "README.md", "icon": "pebble.png", From 0c9eeb4e2369fe3bda41bf56e0edccdba4036162 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Wed, 15 Dec 2021 19:30:05 +0000 Subject: [PATCH 045/105] Updated README for stopwatch touch --- apps/stopwatch/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/stopwatch/README.md b/apps/stopwatch/README.md index 30a9306d1..ceeafaefc 100644 --- a/apps/stopwatch/README.md +++ b/apps/stopwatch/README.md @@ -31,3 +31,6 @@ Which one is which ? ![](A.jpg) ![](B.jpg) + + +Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) From 4ffa694c6496f54a4a20bfaed5122412c5e1f35f Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:36:31 +0300 Subject: [PATCH 046/105] fix: try to fix empty source error --- apps.json | 8 ++++---- apps/pebbleDistance/pebble.icon.js | 1 - apps/pebbleDistance/pebble.png | Bin 2004 -> 0 bytes apps/{pebbleDistance => pebbled}/ChangeLog | 0 .../LECO 1976-Regular.otf | Bin apps/{pebbleDistance => pebbled}/README.md | 0 apps/{pebbleDistance => pebbled}/pebble.app.js | 0 apps/pebbled/pebble.icon.js | 1 + apps/pebbled/pebble.png | Bin 0 -> 1591 bytes .../pebble.settings.js | 0 .../pebble_screenshot.png | Bin 11 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 apps/pebbleDistance/pebble.icon.js delete mode 100644 apps/pebbleDistance/pebble.png rename apps/{pebbleDistance => pebbled}/ChangeLog (100%) rename apps/{pebbleDistance => pebbled}/LECO 1976-Regular.otf (100%) rename apps/{pebbleDistance => pebbled}/README.md (100%) rename apps/{pebbleDistance => pebbled}/pebble.app.js (100%) create mode 100644 apps/pebbled/pebble.icon.js create mode 100644 apps/pebbled/pebble.png rename apps/{pebbleDistance => pebbled}/pebble.settings.js (100%) rename apps/{pebbleDistance => pebbled}/pebble_screenshot.png (100%) diff --git a/apps.json b/apps.json index 00a9a21c9..07783d340 100644 --- a/apps.json +++ b/apps.json @@ -5005,16 +5005,16 @@ ] }, { - "id": "pebbleDistance", + "id": "pebbled", "name": "Pebble Clock with distance", "shortName": "Pebble with distance", - "version": "0.12", - "description": "Fork of pebble clock with distance", + "version": "0.1", + "description": "Fork of pebble clock with distance in KM", "readme": "README.md", "icon": "pebble.png", "screenshots": [{"url":"pebble_screenshot.png"}], "type": "clock", - "tags": "clock, distance, pebble", + "tags": "clock,distance", "supports": ["BANGLEJS2"], "storage": [ {"name":"pebble.app.js","url":"pebble.app.js"}, diff --git a/apps/pebbleDistance/pebble.icon.js b/apps/pebbleDistance/pebble.icon.js deleted file mode 100644 index 5f7b157df..000000000 --- a/apps/pebbleDistance/pebble.icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")); diff --git a/apps/pebbleDistance/pebble.png b/apps/pebbleDistance/pebble.png deleted file mode 100644 index cb836f39f993235aeb616c208173989c44adae0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2004 zcmV;_2P^oAP)2IEn4pj_t(B`$%d0=f$bN`T6&L?~i{rFfPoA zIm}`K2F}uJ0RnThb-~$N^!S8Ducq^A*y{q1uuIELqlq!Vz^Gs`_oIXvoTs&AcncVp z2Ax?0|Kl!Rpgtm+CyQ{c z4co>Vh9JJUGG@JpPAh5>X^@+^6xU6}6Ic3I7Pg4VC$=AsF79**tB56VG;ya>SVd%k z!;3rJ!YV90$70xypzxuXfgds5!ZJmt5)VZYPm+Q?-A`yzG!Pd~ly&t5&Oy#N+vG_KXf4@^^ z^;4jFz5ke(KkR%q6=-;j-9j$M$k_6fIJIwpja%O3+(Ngvol99*rocWohXarmvc~l* za@lqjrgu5EWEQelV76MdKTSB!Eh0y-#VKK}Kgg$k>|d6JXWYJ(QDSfXgfuB8GqXHH z*w4rel(%GXvt>1T<^9mxv;#yHYz+a+Hh->XE;Y+#tHJ$J+xvc&NuW*Yw zM(&{gOUE@R-)lO)ST#O^Sar^k&pD#NRwT=H3u~`m!^m*A)coATQD$N^YoP0v%V`%lWQ(=SYMFj?*CLJ|IHIQ`Ex@NZ+@-}(U!u_Gs`gzJL_o7 z%+K*BKl2wpv1`rA4AWY6&ho`!p6fIG%yOADeQjb|a(o^w>T=x~E*ZQ$R8mZW9~P+7 z-<9!tP6WgMknF_ZU)(~TP}cg?NbCU|@~~;ZR!m*LezPaX3ihpg)PIt~Gt<%$S24~a z^XLKc_*AK0IwF@aN}nt*{~C6&k;T*fvJuw}=P#2vb(WC@Qc!+UNzILC&4vbOpjrUtR1gFPw

5&nPkjackn*GG;?_F=0000 Date: Wed, 15 Dec 2021 11:54:23 -0800 Subject: [PATCH 049/105] Update app.js Implement tap-to-decorate feature. --- apps/pooqround/app.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/apps/pooqround/app.js b/apps/pooqround/app.js index 29fae6ee6..744828ca7 100644 --- a/apps/pooqround/app.js +++ b/apps/pooqround/app.js @@ -330,6 +330,8 @@ class Round { this.render(new Date()); // Not quite right, I think. } + enhanceUntil(t) {this.enhance = t;} + pie(f, a0, a1, invert) { if (!invert) return this.pie(f, a1, a0 + 1, true); let t0 = Math.tan(a0 * 2 * Math.PI), t1 = Math.tan(a1 * 2 * Math.PI); @@ -369,17 +371,18 @@ class Round { const g = this.g; const b = this.b, bI = this.bI; const c = this.c, cI = this.cI; + const e = d < this.enhance; const state = this.state; const options = this.options; const cal = options.calendric; const res = options.resolution; - const dow = (cal == 1 || cal > 2) && d.getDay(); + const dow = (e || cal == 1 || cal > 2) && d.getDay(); const ts = res < 2 && d.getSeconds(); - const tm = res < 3 && d.getMinutes() + ts / 60; + const tm = (e || res < 3) && d.getMinutes() + ts / 60; const th = d.getHours() + d.getMinutes() / 60; - const dd = cal > 1 && d.getDate(); - const dm = cal > 3 && d.getMonth(); - const dy = cal > 4 && d.getFullYear(); + const dd = (e || cal > 1) && d.getDate(); + const dm = (e || cal > 3) && d.getMonth(); + const dy = (e || cal > 4) && d.getFullYear(); const xc = this.xc, yc = this.yc, r = this.r; const dlr = xc * 3/4, dlw = 8, dlhw = 4; @@ -504,9 +507,15 @@ class Clock { this.options.resolution++; this.rates.clock = this.timescales[this.options.resolution]; this.active(); - } else if (this.yX - this.yN < 20 && Date.now() - this.t0 > 500) { - this.stop(); - this.options.interact(); + } else if (this.yX - this.yN < 20) { + const now = new Date(); + if (now - this.t0 < 250) { + face.enhanceUntil(now + 30000); + face.render(now); + } else if (now - this.t0 > 500) { + this.stop(); + this.options.interact(); + } } this.t0 = null; } From 4ec850bec21e34a4e0c317b72b2616d2df16752d Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:55:40 -0800 Subject: [PATCH 050/105] Update ChangeLog --- apps/pooqround/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/pooqround/ChangeLog b/apps/pooqround/ChangeLog index 12876f71a..bad8933d0 100644 --- a/apps/pooqround/ChangeLog +++ b/apps/pooqround/ChangeLog @@ -1 +1,2 @@ 0.00: Initial check-in. +0.01: Add tap-to-decorate feature. From 556d872f5e2c9de3216f719398fed0e9dc6d3d11 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:56:40 -0800 Subject: [PATCH 051/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c379a1de4..83be006f9 100644 --- a/apps.json +++ b/apps.json @@ -4941,7 +4941,7 @@ { "id": "pooqround", "name": "pooq Round watch face", "shortName":"pooq Round", - "version":"0.00", + "version":"0.01", "description": "A 24 hour analogue watchface with high legibility and a novel style.", "icon": "app.png", "type": "clock", From 700e12f18dd087f6916a6803bd3e53039fc184cb Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 23:03:01 +0300 Subject: [PATCH 052/105] fix: rename everything --- apps.json | 12 ++++++------ apps/pebbled/README.md | 5 +++++ .../pebbled/{pebble.app.js => pebbled.app.js} | 18 +++++++++--------- .../{pebble.icon.js => pebbled.icon.js} | 0 apps/pebbled/{pebble.png => pebbled.png} | Bin ...pebble.settings.js => pebbled.settings.js} | 2 +- 6 files changed, 21 insertions(+), 16 deletions(-) rename apps/pebbled/{pebble.app.js => pebbled.app.js} (96%) rename apps/pebbled/{pebble.icon.js => pebbled.icon.js} (100%) rename apps/pebbled/{pebble.png => pebbled.png} (100%) rename apps/pebbled/{pebble.settings.js => pebbled.settings.js} (96%) diff --git a/apps.json b/apps.json index 89249848b..e2501dbcb 100644 --- a/apps.json +++ b/apps.json @@ -5007,19 +5007,19 @@ { "id": "pebbled", "name": "Pebble Clock with distance", - "shortName": "Pebble with distance", + "shortName": "Pebble + distance", "version": "0.02", - "description": "Fork of pebble clock with distance in KM. See step count and the distance together. Default step length = 0.75m (can be changed in settings).", + "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": "pebble.png", + "icon": "pebbled.png", "screenshots": [{"url":"pebble_screenshot.png"}], "type": "clock", "tags": "clock,distance", "supports": ["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} + {"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} ] } ] diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index 7f34aa3c4..7b393d0fc 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -7,4 +7,9 @@ ![](pebble_screenshot.png) Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) + Forked and changed by [RomanistHere](https://github.com/RomanistHere) + +## Plans + +Make step length depend on height/sex/age. diff --git a/apps/pebbled/pebble.app.js b/apps/pebbled/pebbled.app.js similarity index 96% rename from apps/pebbled/pebble.app.js rename to apps/pebbled/pebbled.app.js index 9caee62c9..14cc9e398 100644 --- a/apps/pebbled/pebble.app.js +++ b/apps/pebbled/pebbled.app.js @@ -8,7 +8,7 @@ Graphics.prototype.setFontLECO1976Regular22 = function(scale) { g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22+(scale<<8)+(1<<16)); }; -const SETTINGS_FILE = "pbd.json"; +const SETTINGS_FILE = "pebbleDistance.json"; let settings; function loadSettings() { @@ -23,22 +23,22 @@ const ha = 2*h/5 - 11; const h2 = 3*h/5 - 19; const h3 = 7*h/8 - 10; -let batWarn = false; +let batteryWarning = false; function draw() { let date = new Date(); let da = date.toString().split(" "); let timeStr = da[4].substr(0,5); const t = 6; - const stp = getSteps(); + const stps = getSteps(); // turn the warning on once we have dipped below 15% if (E.getBattery() < 15) - batWarn = true; + batteryWarning = true; // turn the warning off once we have dipped above 20% if (E.getBattery() > 20) - batWarn = false; + batteryWarning = false; g.reset(); g.setColor(settings.bg); @@ -57,16 +57,16 @@ function draw() { g.setFontLECO1976Regular22(); g.setFontAlign(0, -1); g.drawString(da[0].toUpperCase(), w/4, ha); // day of week - g.drawString(stp, 3*w/4, ha); + g.drawString(stps, 3*w/4, ha); // time // white on red for battery warning - g.setColor(!batWarn ? g.theme.bg : '#f00'); + g.setColor(!batteryWarning ? g.theme.bg : '#f00'); g.fillRect(0, h2, w, h3); g.setFontLECO1976Regular42(); g.setFontAlign(0, -1); - g.setColor(!batWarn ? g.theme.fg : '#fff'); + g.setColor(!batteryWarning ? g.theme.fg : '#fff'); g.drawString(timeStr, w/2, h2 + 8); // contrast bar @@ -80,7 +80,7 @@ function draw() { g.setColor(settings.bg); g.drawImage(img, w/2 + ((w/2) - 64)/2, -2, { scale: 1 }); drawCalendar(((w/2) - 42)/2, 11, 42, 4, da[2]); - g.drawString((stp / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); + g.drawString((stps / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); } // at x,y width:wi thicknes:th diff --git a/apps/pebbled/pebble.icon.js b/apps/pebbled/pebbled.icon.js similarity index 100% rename from apps/pebbled/pebble.icon.js rename to apps/pebbled/pebbled.icon.js diff --git a/apps/pebbled/pebble.png b/apps/pebbled/pebbled.png similarity index 100% rename from apps/pebbled/pebble.png rename to apps/pebbled/pebbled.png diff --git a/apps/pebbled/pebble.settings.js b/apps/pebbled/pebbled.settings.js similarity index 96% rename from apps/pebbled/pebble.settings.js rename to apps/pebbled/pebbled.settings.js index ea1845e57..3d82f0700 100644 --- a/apps/pebbled/pebble.settings.js +++ b/apps/pebbled/pebbled.settings.js @@ -1,5 +1,5 @@ (function(back) { - const SETTINGS_FILE = "pbd.json"; + const SETTINGS_FILE = "pebbleDistance.json"; // initialize with default settings... let s = {'bg': '#0f0', 'color': 'Green', 'avStep': 0.75}; From cff3a993809d50bf1ba79f6116395c2d50f8bf48 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 14 Dec 2021 10:34:42 +0000 Subject: [PATCH 053/105] ptlaunch: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js --- apps.json | 2 +- apps/ptlaunch/ChangeLog | 3 +- apps/ptlaunch/app.js | 14 +- apps/ptlaunch/boot.js | 326 ++++++++++++++++++++-------------------- 4 files changed, 173 insertions(+), 172 deletions(-) diff --git a/apps.json b/apps.json index c379a1de4..0a69096c8 100644 --- a/apps.json +++ b/apps.json @@ -4858,7 +4858,7 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.10", + "version": "0.11", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], diff --git a/apps/ptlaunch/ChangeLog b/apps/ptlaunch/ChangeLog index de38d715a..23031cff3 100644 --- a/apps/ptlaunch/ChangeLog +++ b/apps/ptlaunch/ChangeLog @@ -1,4 +1,5 @@ 0.01: Initial creation of the pattern launch app 0.02: Turn on lcd when launching an app if the lock screen was disabled in the settings 0.03: Make tap to confirm new pattern more reliable. Also allow for easier creation of single circle patterns. -0.10: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. \ No newline at end of file +0.10: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. +0.11: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js \ No newline at end of file diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index b5a3bf610..9cd566e3d 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -119,8 +119,7 @@ var recognizeAndDrawPattern = () => { return new Promise((resolve) => { E.showMenu(); g.clear(); - g.setColor(0, 0, 0); - CIRCLES.forEach((circle) => drawCircle(circle)); + drawCirclesWithPattern([]); var pattern = []; @@ -369,7 +368,6 @@ var drawAppWithPattern = (i, r, storedPatterns) => { offset: { x: 1, y: 3 + r.y }, }); - g.setColor(0, 0, 0); if (!storedPattern.wrappedAppName) { storedPattern.wrappedAppName = g .wrapString(app.name, g.getWidth() - 64) @@ -490,7 +488,10 @@ var drawCircle = (circle, drawBuffer, scale) => { log("drawing circle"); log({ x: x, y: y, r: r }); + drawBuffer.setColor(0); drawBuffer.fillCircle(x, y, r); + drawBuffer.setColor(1); + drawBuffer.drawCircle(x, y, r); }; var cachedCirclesDrawings = {}; @@ -535,17 +536,16 @@ var drawCirclesWithPattern = (pattern, options) => { { msb: true } ); - drawBuffer.setColor(1); CIRCLES.forEach((circle) => drawCircle(circle, drawBuffer, scale)); - drawBuffer.setColor(0); + drawBuffer.setColor(1); drawBuffer.setFontAlign(0, 0); - drawBuffer.setFont("6x8", 4 * scale); + drawBuffer.setFont("Vector", scale === 1 ? 40 : 20); pattern.forEach((circleIndex, patternIndex) => { var circle = CIRCLES[circleIndex]; drawBuffer.drawString( patternIndex + 1, - circle.x * scale, + (circle.x + 5) * scale, circle.y * scale ); }); diff --git a/apps/ptlaunch/boot.js b/apps/ptlaunch/boot.js index a23607768..6fbd3ca41 100644 --- a/apps/ptlaunch/boot.js +++ b/apps/ptlaunch/boot.js @@ -1,167 +1,167 @@ -var DEBUG = true; -var log = (message) => { - if (DEBUG) { - console.log(JSON.stringify(message)); - } -}; - -var storedPatterns; -var positions = []; -var dragHandler = (position) => { - positions.push(position); - - debounce().then(() => { - log(positions.length); - - var CIRCLE_RADIUS = 25; - var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; - - var circles = [ - { x: 25, y: 25, i: 0 }, - { x: 87, y: 25, i: 1 }, - { x: 150, y: 25, i: 2 }, - { x: 25, y: 87, i: 3 }, - { x: 87, y: 87, i: 4 }, - { x: 150, y: 87, i: 5 }, - { x: 25, y: 150, i: 6 }, - { x: 87, y: 150, i: 7 }, - { x: 150, y: 150, i: 8 }, - ]; - var pattern = []; - - var step = Math.floor(positions.length / 100) + 1; - - var p, a, b, circle; - - for (var i = 0; i < positions.length; i += step) { - p = positions[i]; - - circle = circles[0]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(0, 1); - } - } - - circle = circles[1]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(1, 1); - } - } - - circle = circles[2]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(2, 1); - } - } - - circle = circles[3]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(3, 1); - } - } - - circle = circles[4]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(4, 1); - } - } - - circle = circles[5]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(5, 1); - } - } - - circle = circles[6]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(6, 1); - } - } - circle = circles[7]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(7, 1); - } - } - - circle = circles[8]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(8, 1); - } - } - } - positions = []; - - pattern = pattern.join(""); - - if (pattern) { - if (storedPatterns[pattern]) { - var app = storedPatterns[pattern].app; - if (!!app && !!app.src) { - if (storedPatterns.settings) { - if (storedPatterns.settings.lockDisabled) { - Bangle.setLCDPower(true); - } - } - - Bangle.removeListener("drag", dragHandler); - load(app.src); - } - } - } - }); -}; - -var debounceTimeoutId; -var debounce = (delay) => { - if (debounceTimeoutId) { - clearTimeout(debounceTimeoutId); - } - - return new Promise((resolve) => { - debounceTimeoutId = setTimeout(() => { - debounceTimeoutId = undefined; - resolve(); - }, delay || 500); - }); -}; - (function () { + var DEBUG = false; + var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } + }; + + var storedPatterns; + var positions = []; + var dragHandler = (position) => { + positions.push(position); + + debounce().then(() => { + log(positions.length); + + var CIRCLE_RADIUS = 25; + var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; + + var circles = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, + ]; + var pattern = []; + + var step = Math.floor(positions.length / 100) + 1; + + var p, a, b, circle; + + for (var i = 0; i < positions.length; i += step) { + p = positions[i]; + + circle = circles[0]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(0, 1); + } + } + + circle = circles[1]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(1, 1); + } + } + + circle = circles[2]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(2, 1); + } + } + + circle = circles[3]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(3, 1); + } + } + + circle = circles[4]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(4, 1); + } + } + + circle = circles[5]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(5, 1); + } + } + + circle = circles[6]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(6, 1); + } + } + circle = circles[7]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(7, 1); + } + } + + circle = circles[8]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(8, 1); + } + } + } + positions = []; + + pattern = pattern.join(""); + + if (pattern) { + if (storedPatterns[pattern]) { + var app = storedPatterns[pattern].app; + if (!!app && !!app.src) { + if (storedPatterns.settings) { + if (storedPatterns.settings.lockDisabled) { + Bangle.setLCDPower(true); + } + } + + Bangle.removeListener("drag", dragHandler); + load(app.src); + } + } + } + }); + }; + + var debounceTimeoutId; + var debounce = (delay) => { + if (debounceTimeoutId) { + clearTimeout(debounceTimeoutId); + } + + return new Promise((resolve) => { + debounceTimeoutId = setTimeout(() => { + debounceTimeoutId = undefined; + resolve(); + }, delay || 500); + }); + }; + var sui = Bangle.setUI; Bangle.setUI = function (mode, cb) { sui(mode, cb); From fd6fa1522a5ddaa5b92661cdc06fb44f8f056d00 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 14 Dec 2021 20:54:35 +0000 Subject: [PATCH 054/105] ptlaunch: update screenshots --- apps.json | 2 +- apps/ptlaunch/README.md | 17 ++++++++++++----- apps/ptlaunch/add_pattern.png | Bin 2642 -> 0 bytes apps/ptlaunch/add_pattern_dark.png | Bin 0 -> 3185 bytes apps/ptlaunch/add_pattern_light.png | Bin 0 -> 3202 bytes apps/ptlaunch/app.js | 7 ++----- apps/ptlaunch/main_menu_add_dark.png | Bin 0 -> 2872 bytes ...in_menu_add.png => main_menu_add_light.png} | Bin apps/ptlaunch/main_menu_manage_dark.png | Bin 0 -> 2863 bytes ...u_manage.png => main_menu_manage_light.png} | Bin apps/ptlaunch/manage_patterns.png | Bin 2670 -> 0 bytes apps/ptlaunch/manage_patterns_dark.png | Bin 0 -> 3008 bytes apps/ptlaunch/manage_patterns_light.png | Bin 0 -> 3027 bytes apps/ptlaunch/select_app_dark.png | Bin 0 -> 2898 bytes .../{select_app.png => select_app_light.png} | Bin 15 files changed, 15 insertions(+), 11 deletions(-) delete mode 100644 apps/ptlaunch/add_pattern.png create mode 100644 apps/ptlaunch/add_pattern_dark.png create mode 100644 apps/ptlaunch/add_pattern_light.png create mode 100644 apps/ptlaunch/main_menu_add_dark.png rename apps/ptlaunch/{main_menu_add.png => main_menu_add_light.png} (100%) create mode 100644 apps/ptlaunch/main_menu_manage_dark.png rename apps/ptlaunch/{main_menu_manage.png => main_menu_manage_light.png} (100%) delete mode 100644 apps/ptlaunch/manage_patterns.png create mode 100644 apps/ptlaunch/manage_patterns_dark.png create mode 100644 apps/ptlaunch/manage_patterns_light.png create mode 100644 apps/ptlaunch/select_app_dark.png rename apps/ptlaunch/{select_app.png => select_app_light.png} (100%) diff --git a/apps.json b/apps.json index 0a69096c8..c28c6686c 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ "version": "0.11", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", - "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], + "screenshots": [{"url":"manage_patterns_light.png"}], "tags": "tools", "supports": ["BANGLEJS2"], "readme": "README.md", diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index 8d61afece..7cc39e3d6 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -10,14 +10,21 @@ Then launch the linked apps directly from the clock screen by simply drawing the ## Add Pattern Screenshots -![](main_menu_add.png) -![](add_pattern.png) -![](select_app.png) +![](main_menu_add_light.png) +![](add_pattern_light.png) +![](select_app_light.png) + +![](main_menu_add_dark.png) +![](add_pattern_dark.png) +![](select_app_dark.png) ## Manage Pattern Screenshots -![](main_menu_manage.png) -![](manage_patterns.png) +![](main_menu_manage_light.png) +![](manage_patterns_light.png) + +![](main_menu_manage_dark.png) +![](manage_patterns_dark.png) ## Detailed Steps diff --git a/apps/ptlaunch/add_pattern.png b/apps/ptlaunch/add_pattern.png deleted file mode 100644 index c7cc38e82c25b4661bc026ce7dd5901c77fb9f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 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 literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/add_pattern_light.png b/apps/ptlaunch/add_pattern_light.png new file mode 100644 index 0000000000000000000000000000000000000000..47549b43e718f0929a1b58bb7dd71e3ff71f6b2d GIT binary patch literal 3202 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 l8rwYIwsec%<81V { }, }; - var appList = getAppList(); - appList.forEach((app) => { - selectAppMenu[app.name] = () => { + [].forEach((app) => { + selectAppMenu[app] = () => { log("app selected"); - log(app); - resolve(app); }; }); diff --git a/apps/ptlaunch/main_menu_add_dark.png b/apps/ptlaunch/main_menu_add_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4c1564ecadefd9f7289ecd436e1b166208a8ee39 GIT binary patch literal 2872 zcmd^B`#;l*AO36_T7-j{rB+9YG7{!Kgh}otcQdz5Ml4~BY^Qr|rkk^fE)plV&24hY zr*i4!I&zmXiI6)>jylet@csGwyk773^Ss`#_w&>9%X8h$#au}ummN&90!Nr&230Dvz!*jjtg2;Z{D;%78vE@g>Rr{)}LJE$)}mel}0 zb0fOHES-c?Pg}$7y(KkVKLF|$%HFB3I#jo_Ch&u*T(nM`q-lJ{*kK8$X;G$f-%Re`>I_l zVxm5eoY+xd|Le2K$IDit-0=h6`jj&Uo-?%dUzFyf@^_CtPU4PY^n*&}&X27`6z|?8 zye%Z}*DYMu!&yl9DV8@0oGLS8I(o9$NePy2oT=)5+~at?M|^wT_Xj67trSI%OG z6d^hFaaY^Yq+=+-+;t_*I8)ugbo*0|*9gMdnrlpe$vEdt%5}ep$C-4QSjbw?Uminu zCea;rleRNUj7iRyz|f$GDC3A-u>JeZH2iAA%p)h>1nXK~c^hfl zDnG(!;Zj}34)qZfl6gk&?eF`cJ9`alIaBQDuP@r(T=0GJbFePYMRWcrqw{iwWYEJ7 zR^uubK5@rrUR9wT496HPJ-yw#3*v4z+Fd4YWcl>a>F+-@?i0rO!_A!`o7NjWYVH;q zux&gC9hjvvv)_o`vVP`X;T|ow3wg(H9A|z|>iR9%sKsL*z4gNw@P$C?DpL*-fSb%> zWqHtVI9~+gA^+#I^pPJIdTZ$`2b0cgTc0}(#z|KFLxby6IM7IwdBVEkk0NMmKR8k3 zyD{IFGz1M!wDwlg0*3mfm#sp&A2d-e#5EZK;N`I_ec#zu9TzY?N zFX)Q#k8@xOpipnM$YKUCI)qc!Wi)|(@Ve1dI6qG65UvsmHLl#;F#09+sn6g4AKys9 zjJj0pPQ{xzG?$w0?6kYVReV7|k##+yo9e=p12M5h&wNDp2M98;ICY7vtL%_w4;BY% z38;s3Eyik%@-@+>9d8@I5XZTC%Hz2V0IMy#jVE_L$L9*9s>m6`4~vz~T%tu6Ef3u* zzRotACaoz%w$CROkJDfCZA$hrFf%6|Bb|>N1~EeN3=vD6#fj96deEi`QUIA^Ai=U- zKAQhP7-5#`vBNB@JdvdHN2ZQ_N_{P=0DC?ek)HpsK^Da9!w4z{RL?bOk3x~X9Kf#S z;m%KyDX9Sd?+!{?#)4M|C~bg9LO|zLk+00kBdrN|lb7u>ZCtiYL$D;Cc;pUfB2`n} zMfK>MYq5c_+UlUhFUM@+;KZM0zkx1drp03=5L*45K_c#91^nKw&x^}8DPOb>>9yUX z%E`8HS2M%D%T?tzBwqn=7n^2RZT z^l#I=Uywtdn_k_D<7#J6tr8ei+%Dt-9b>TrI;+K>d3|5Poq)*&lgK|GK131;(wjf$ z6ckn5F|D;D_ziNP?b~K{AHOGYB|0=zrF{wC?hbgf2djmq@uu@~;QVXhd_~wpCZ<6m z7{-L%VV9>hg#2R({3$;pICvq-uItgbj9TPQY?^AUn46j*Uo6NG5Htf6AFYj!X1Eoj zkJu)1#xp9lmUG5Dv!ye8e|Y~e4~z-3tWP*3URgx_DrlLxQ&%I2Q=!XTlF?=ccZ9@N zk*r#4DwJFM7^1Gl3>+CWKevLz_^PNbXC?3P)kk?-Dr9C=C%l^7)zxb4S57N7?yKlV zp3g~;MM&J*epvUJLIBr?y1%qvd$=d|?*Qp&T7*|g{v%DVdG-5x4GBzoCs^=jrqMh~ zK2kl=-R1ma{g!-y)MuB`jG6IuBsk7ap{m7Sg9Co4kCSn-+IMbFh*0gVRyCoLB)f{& z<-hCJba8!@R$q0LWf)GsZ3_L`+pTybsFMmJuk}vfR3f)-%2;BK{BddHu2P^vC9)z2 zS#RC(8RJaG?x?Q|#}W+=QFtrD8L7>bcP(u_0>}FVjK$*tKO-talyKedkNNJa)3b-= z*W`v^F*{dmpxU%paO1@eKBczJG`fG(!zkbCttyui;I5z~4=VUOjl4lK{Lp_-Ary1b zwK`!UF7la1(`+dy^=UBQ<~ST-s*!fxdUc8>11mU4-2?JWxW*b9S1hKXT2>I&?ISHd zQv=2%r=~_PB9cg|Z^NC~&CXh1ni?JwQXRF;*Q6KS{d&gaLG_uicv6@sLa%gDyXpp<6`lAiJxD#~VT;vzr+)r~WBz1axQt_wTa6cFIm+PXy5|wUn4>DU@^m@} z=-+y#7Oe4Ss+y7^+MwrQ0HQ;-t5{qwa=sCG-1-xGQjgka7*!~>WM~OT`hB_=| zc)bRaZ3lJsr5i>DYI4#zT6-CXYyQhA&F5)(65LH7G>@Ms5;~3aI$q0RIMpAE$%Zaq zGnF%TpUqv(I5fFBH1DP!(D~2*_@!^m(x YBXrXi4m7yi#M(M&1VnuJJYi?NPqLd-;qt?Xop(M&NKmj=U3D#XxsuO(ZCY|YsB zWO!{c8pCikgrYELTxBQM{rG--KffQ&d7kt9e&@?`e&_s7g56d0L8u%Q0Dyzm7cCw3 zu>9W;-M5#^>ZZN+07P&=TL6p?@^b(HowK$yzjn`SG3#^Kl=^`OFV|vb7ed(9sSe&K zGW_D;jkPo2{B*YLXu^-p&CQ6IIa{cF3G))5$j==3Z144bxw-&+p2Z+lkNs@JWcX{ zta5!gl_(-^K7DO&WtNSY^AtUS#IjrEK3<|VU>7%9Qj`3Zx*u9>=+wA7wK*M|W#0Pg zhMng;;}l{%oMzbDKcTmerCoU!P%`u&G;0AgqzP{B|<3PZQ`Z@@Pwnqg5ktMxNo ze?UnA-$r>69Cy*sc6g++@JX2C;(c1^EAoSzGdBr!thml9 zJU%GF%0NZwV{BC6IeZy1$*JJ1d+D8GdL#t3AL_k5@+t4LV+9z|lxK<3L93c{W@#w% z*t#+*MafOI5R)XFvCh~cMLbP9R?|Xx($0(ampFYx%V1`z9CPW~d6OW9gxs1TdC(I3 zyxbNO@x@IBy79d3qlU5@h2zDTu~scL0_SnP1}j(ElRgfzSBr?^ahA?ak|S3@q+F5_ z`bCO02z2||rPe03rHHEV%*HJNQN@Peo2P!&ATXb9o zyBv_GlK~_Tsj5xxVE(VN8JV+I%HVU*kJAM-YDxFB@!7adL7|z1w={Hhv@-lp_O}R( zm|SEt_&Qn3EZ2pLq%BAhSly0(tn0a=ts@lQ42161+l^ZTN8{&@y-x#_T|O?4UlkFn8U4-4v2KDbvPR0hb>mu;bp zh8gwpZR@eiWKK!qw+xK}RHOw3jfD9$;OrCq1!qOSoGN!Sn(@m)`F*#Dx>?l0w;nrd z7nZdj{1*46=MvNdD(W4AuLgtH1Giqh1*C=08cO7pTHE(9Z}^_v!M2!|az#3OHwb## z-Gb^?&bCg!DvWIAkB=UTmZKUNwP1S9*hzPYvm6bn=W)RI>uclD+!=~%Ed8Y3RGuvN zLw8qlYbTtb9*_(MBZy^?vpCU76VnCTQ&sfYhJd3{+sP7R|(>RaRcTI|U#zXh*zHxbcD#nk7s_DGAG# zJ9PY>d${@gcP}i`$P44UvSge^9tp=w@jNa-q}hn98XW3T1U=@3i{SNJZUD5_v|wnN z2Sq$k^QWe;%IM+5Gc5D2OsOY13cM6o3dg2Hw$T@YveQW<11R-h!Ql`cH*05rB_DX& z7Nki|-1AK#$x*omY#Z?ePPje-bNDd859Kb`R z2?aS5YpkuLF_Amwtm!{*Y!{G5oSQ3c*O4LMG!aQF{txEG<2Av1OEAt;P>qv3{NLq0 zPeC2Z9GePmQdc5}|BfQsL!*SE=&fZqJDY(u{3WHiYnEA<=wE zrhhNStYdF(Sz@Q2@8)P(s$X4fDWkYYwn^TdAAfpm%`ww|+f9>TryRH(Rx4&0V<9>uuofwxZ})u)=Phhf{=-{@en?-p!+BvVH#4>2N^N>arExBTn;mPACz6p!uci zm1)ys8ia7t_h(%h&{LGdO?#JsOm#8YTW~;cOZnPm9IpR)FU$)BeXP z%$>hAH|W8e=KIvg?!FKl?u~zlRe*1ak&l=;ajy*w>uN8*#_e6(1)xAxafyy;ZAgm43aqN+(Y(VN=851;U#5b11(!z&FRfd^xX9f2+Yld9h2RmOX6 z+Jw~&xqR6+nNP?DOEUF(d|&xZ1x)9|KRD+eo#dIsd<_5UHSkr?OMma0IG?VO6-x?+ z9}P!}&0Oz?;Mu`f$~813oFDs4B>$?2r=mAlNmM-qW;7HUb2s9j z1cMH*v&O5XVmk$%l)+7o)wcv7Gn-(oorGG;c7-fW zT6v_*^7U*%pv+svL*WV@8Yn0XkK4sHcQv=2?z4AN(qw|$;=tgMxD=n#!%QFgnteU6 z`q^(pT^R2&Pm(-CCaufXLP7Gw5sD9C-ipXabPFJ^W*q(b|F=bGenPND!@u=Pwc0G* zdmyY0onkfd#(u&&g@d--Pf9S4m&d^)um8HE1RF!D2;*~t2F;}F{q~7Y!gm_YrRxa~ zWSE4|{C^o_kFC79uZb6ky8#olQj}*t8Spw${kj27iE&&J#Kahnc<+6{fVI_CONNE_ G{eJ*RlwsQd literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/main_menu_manage.png b/apps/ptlaunch/main_menu_manage_light.png similarity index 100% rename from apps/ptlaunch/main_menu_manage.png rename to apps/ptlaunch/main_menu_manage_light.png diff --git a/apps/ptlaunch/manage_patterns.png b/apps/ptlaunch/manage_patterns.png deleted file mode 100644 index 82b10ad43a60ea3b38c39c2bb1f4491235f0dabc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2670 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 aeV|ihqCHlzjQt}A082A8^66P@^#1^?Kzw)r literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/manage_patterns_light.png b/apps/ptlaunch/manage_patterns_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5e4b27131e5531a7b3191c7664543c5e542d3607 GIT binary patch literal 3027 zcmb`Jc{tSD8^FKwWirOjBqmEt%35lW$Pi-&*|!*L_LynNa)+PGSP~IQu|$nw*b_1#$c%>bkg?Ga5sKqXJt%j$V9%IeA3Qk^X&sw%58bTYEA zGOSP63sqMV%nS2N&&)Dgk{yu}n-`P^>Gs-io_c&I{^Vw6NJeUSiU`EL;tLO`SC08> zxYxODqW&xi{oov$cNT`stV=Qm_RV3w!&YD}% zxIkQEwKNC1+KwDul37lj1goA*yxwU7aKI-*(nz#D?N zN5W!SIJB-r53F{IC-7%vWTHqY5(Q+~jUbppO0K|Y{uaZs-E*BO6%JVrYB!4gLP5hf zUv^#8aBEB3vvUGwtk0yk!(puUZo42C2qZ)MzNrtCH}vbQvQ`xp=sOjT(U8b|u7k&GfXYGQ;28oLW?p%kv@7iiz z=6c#zGjHDB2$=tHyOdw`1T`tK`%*5rq4h;N%Al~!HPxMeQUeKLxOE&0sogsz{OYI` zsbuC=d`Hnsm3yszl zdwrYhyeEZNj~cb>41k7d`s$G!amv{vY?myrA#1t!m@9O-onI;rWTqj+tRs>Afp5lH zZ<%Mt{b-!XM(0+S=|?!_m!DzFoSzuq-q~&9_Ct5P_JKoGsa4^;NzSnG!s*HondR|)+iF*52%C+Spb*cn|S`~wki{a+sdXY zdX1A+jBWcsMbN)J%9$bd8>}U}6IzFE^%?#)m2`!-v1zP~ZzuNgwHpf6Uvi_R)??(? zA9svW=ByAOQhznb@2|*h(Vy7wBu~H!#4kmul+ES1TBZ2pDOANyJz=6~dTrU0Nmjr#&wEl=E~$fA4s5^b1LkE!}tXm1uhOYN%TqlC(-^Koh443C61d!&t(B}>+i zj2BB4U-1iF$6W&J_-eIFn+^iztWm3;*lFQV8*_2UPB7o7+WrceQw^Y3aS*=%g;H78 z{`JXn=!O;{M6Ws!S^X%tP++TOm>pj1SUdKI5`e*v&K#;a#DtVlIL_DI_P^|Uyon?T zyo|jwa^tb{lj_3hIk)mnW=}bVb0iqw@sAp$>>_F>jUbGuxLk5!Fe_f=^_yE0`Bwuf zjMCGk<)1te|?lXZX|FAbqJl&U}Jh;-|2aYs2f= z@$8+hkj#zYLCFZ={ZnUJ_UGxEgm-Ryoug=-XI_3;;>npN35K1WS<6=^7AB@jalKE>uNL`E&_A);dgprfkOQf7?IWWCu!AS-c1HX-jvm9|eGm6X!& zNo~`kw8Jh*u*{atMm^>DiZgRWDbma356D7hA2^PqJx9= zpPAWWrwPZlFL|2=vx-K&cw%^loVKRe6^1K@JsuaryPR;M2R0$m3LNB>2<%HR z4bM{htcQ6#ZOWV33O8nXCRR+`+1CWKZ{x5L6UaF`p1|Ek+@H!Yu|1e(MXax!%zyBM zMZ$g_0=t*1nnl7kH6$*#Kad%)7K7xx^5; zHxQ*>D{6*l6R;X%We!H{gu!Q6h$-SzW=1NZ-m0A2M&yb^5q3rZe&{|)k6Rd99wPSMp+uE2t({1jV9sO7iWBwL^$$twRgN&|?y(p9hP)b%)jmqbpAv}dU0qTJe;zCg*^pVHK#H>yAB#e69j>J>!C_>9Yr;8E)ON#7&R zN9@zVjd>@H5tv{EW2>7R2kQ?hd))FM ucK=Gp7($decD|Hi%xyXDxu5SVW5%~*$4A3zqPMwSI$&;Ujjb{EPW&&J#d#wD literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/select_app_dark.png b/apps/ptlaunch/select_app_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..422f2b5e2ef60255a751c81fd8599eaa70d2fa0b GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/select_app.png b/apps/ptlaunch/select_app_light.png similarity index 100% rename from apps/ptlaunch/select_app.png rename to apps/ptlaunch/select_app_light.png From c52f57f5bad9a50cae8931ec56ebf160eacf4f49 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 14 Dec 2021 20:59:06 +0000 Subject: [PATCH 055/105] ptlaunch: fix setup for screenshots --- apps/ptlaunch/app.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 06c38e391..d3b4dd1aa 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -323,9 +323,12 @@ var getSelectedApp = () => { }, }; - [].forEach((app) => { - selectAppMenu[app] = () => { + var appList = getAppList(); + appList.forEach((app) => { + selectAppMenu[app.name] = () => { log("app selected"); + log(app); + resolve(app); }; }); @@ -537,12 +540,12 @@ var drawCirclesWithPattern = (pattern, options) => { drawBuffer.setColor(1); drawBuffer.setFontAlign(0, 0); - drawBuffer.setFont("Vector", scale === 1 ? 40 : 20); + drawBuffer.setFont("Vector", 40 * scale); pattern.forEach((circleIndex, patternIndex) => { var circle = CIRCLES[circleIndex]; drawBuffer.drawString( patternIndex + 1, - (circle.x + 5) * scale, + (circle.x + (scale === 1 ? 1 : 5)) * scale, circle.y * scale ); }); From eeed392782d92a6f10c9d0083de8e92d584fa19e Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 15 Dec 2021 20:12:30 +0000 Subject: [PATCH 056/105] ptlaunch: remove now redundant draw call, and also remove all setColor calls since we now only need the fg color which is the default anyways --- apps/ptlaunch/app.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index d3b4dd1aa..062cc3c62 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -488,9 +488,6 @@ var drawCircle = (circle, drawBuffer, scale) => { log("drawing circle"); log({ x: x, y: y, r: r }); - drawBuffer.setColor(0); - drawBuffer.fillCircle(x, y, r); - drawBuffer.setColor(1); drawBuffer.drawCircle(x, y, r); }; @@ -538,7 +535,6 @@ var drawCirclesWithPattern = (pattern, options) => { CIRCLES.forEach((circle) => drawCircle(circle, drawBuffer, scale)); - drawBuffer.setColor(1); drawBuffer.setFontAlign(0, 0); drawBuffer.setFont("Vector", 40 * scale); pattern.forEach((circleIndex, patternIndex) => { From 32af21245475b38f1014c13fe7e55b9d968fc864 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:18:07 -0800 Subject: [PATCH 057/105] Update README.md --- apps/pooqround/README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/pooqround/README.md b/apps/pooqround/README.md index 3c651ed67..d413fd88e 100644 --- a/apps/pooqround/README.md +++ b/apps/pooqround/README.md @@ -10,16 +10,18 @@ Either you'll like that, or you won't. ## Options -Because sometimes I don't want to burn what I'm cooking and others I'm lazy and just want to know if it's afternoon yet, -you can alter the number of ‘hands’ on the display. When the watch is unlocked, slide up to add dots representing the minute and second, -or down to remove the distraction. There's also a setting that displays the second hand, but only if the watch is perfectly face-to-the-sky, -in case you want the ability to check the _exact_ time, hands free, without the impact on battery life this usually entails. - Although we generally obey the system-wide theming, you can long press on the display for a menu of additional options specific to the face. We don't observe the system 12/24 setting, since it the design of the face is equally good in either interpretation. -By default, there is a backlight that comes on when you twist your wrist. This, of course, somewhat increases power draw and could be -annoying in an intentionally dark environment, so there is an option to disable it. +If you like an uncluttered display style, you can still bring up the day, date and minute hand transiently with a tap on the watchface (when unlocked). + +Similarly, because sometimes I don't want to burn what I'm cooking and others I'm lazy and just want to know if it's afternoon yet, +you can quickly alter the number of ‘hands’ on the display. When the watch is unlocked, slide up to add dots representing the minute and second, +or down to remove the distraction. There's also a setting that displays the second hand, but only if the watch is perfectly face-to-the-sky, +in case you want the ability to check the _exact_ time, hands free, without the impact on battery life this usually entails. + +In some versions of the Bangle.js firmware, the backlight doesn't come on automatically when you twist your wrist. There's currently a workaround +for this integrated into the watchface; you can disable it in the menu, if you prefer. ## Limitations From 030eddba5c464eb669a56bb508cf8923fd194757 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:47:45 -0800 Subject: [PATCH 058/105] Update app.js Fix broken variable update. Fix excessive screen clearing. --- apps/pooqround/app.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/apps/pooqround/app.js b/apps/pooqround/app.js index 744828ca7..22cf5ff79 100644 --- a/apps/pooqround/app.js +++ b/apps/pooqround/app.js @@ -83,7 +83,6 @@ class Options { Bangle.removeListener('drag', this.reactivator); this.emit('done'); } - g.clear(true); E.showMenu(m); } @@ -309,7 +308,7 @@ class Round { buffer: this.c.buffer, transparent: 0 }; this.options = new RoundOptions(); - this.timescales = [1000, 0, 60000, 900000]; + this.timescales = [1000, [1000, 60000], 60000, 900000]; this.state = {}; // Precomputed polygons for the border areas. this.tl = [0, 0, 58, 0, 0, 58]; @@ -323,7 +322,7 @@ class Round { this.r = this.xc - this.minR; } - reset() {this.state = {}; this.g.clear(true);} + reset(clear) {this.state = {}; clear && this.g.clear(true);} doIcons(which) { this.state[which] = null; @@ -478,7 +477,6 @@ class Clock { this.timescales = face.timescales; this.options = face.options; this.rates = {}; - this.faceUp = null; this.options.on('done', () => this.start()); @@ -488,7 +486,6 @@ class Clock { lock: () => {face.doIcons('locked'); this.active();}, faceUp: up => { this.conservative = !up; - this.faceUp = up; this.active(); }, twist: _ => this.options.autolight && Bangle.setLCDPower(true), @@ -529,7 +526,7 @@ class Clock { redraw(rate) { const now = this.updated = new Date(); - if (this.refresh) this.face.reset(); + if (this.refresh) this.face.reset(true); this.refresh = false; rate = this.face.render(now, rate); if (rate !== this.rates.face) { @@ -544,7 +541,7 @@ class Clock { this.exception && clearTimeout(this.exception); this.interval && clearInterval(this.interval); this.timeout = this.exception = this.interval = this.rate = null; - this.face.reset(); // Cancel any ongoing background rendering + this.face.reset(false); // Cancel any ongoing background rendering return this; } From a72974110ca0f751c3ad9417d8bced4fed89f220 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:48:13 -0800 Subject: [PATCH 059/105] Update ChangeLog --- apps/pooqround/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pooqround/ChangeLog b/apps/pooqround/ChangeLog index bad8933d0..8eb91cf97 100644 --- a/apps/pooqround/ChangeLog +++ b/apps/pooqround/ChangeLog @@ -1,2 +1,2 @@ 0.00: Initial check-in. -0.01: Add tap-to-decorate feature. +0.01: Add tap-to-decorate feature. Bugfixes. From 6f32b9cbcd7d6444755a2f65d389a840d1affc5f Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:21:15 +0100 Subject: [PATCH 060/105] Delete app-icon.js --- apps/showimg/app-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/showimg/app-icon.js diff --git a/apps/showimg/app-icon.js b/apps/showimg/app-icon.js deleted file mode 100644 index 1c73a2f72..000000000 --- a/apps/showimg/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAf////AHP/////AH//////AP/8AAAHAP4AAAAHAOAAMAAHAOAAeAAHAOAA+cAHAOAA/+AHAOAA/+AHAOAf/+AHAOA//+AHgOA///AHgOA///gDgOA/z/gDgOAfz/gDgOA///gDgOA///gDgOA//uADgOAf3+ADgOAP/+ADgOAD/8ADwOAB+4ADwOAA8AABwOAAAABBwOA8DgPxwOB/Dg/xwOB/jh/xwOB3zj5xwOB57nzxwOA4/njhwOA4/vHhwOA8f+PB4OAef+PB4OAef8eB4OAPP58A4OAHv/4A4OAH//wA4OAD//AA4OAA/8fn4PDgP///4P//////4P////9/wD///4AAA")) From 562b44279cad48619a3da4e837edec33ebd0cb7d Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:22:11 +0100 Subject: [PATCH 061/105] Create app-icon.js --- apps/showimg/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/showimg/app-icon.js diff --git a/apps/showimg/app-icon.js b/apps/showimg/app-icon.js new file mode 100644 index 000000000..abb1eb434 --- /dev/null +++ b/apps/showimg/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBIf4Aah//BRQAMDowUNC5AARC4YKKL5gTC+B3TCpAyIC5oNBEA4XNJwS4GC55pHC8TEHC57QHC4wSEC5YpEC6YwEC5oEEC5x3DC6ZHbC7PwcYxfNAYYXPJA4XQDAwKEBYQXJIoReHC5gMFAAojBC5QUIC5Y5JMgYXIUQYJFPggXMAwICCBAYXMCAQJDDwQUCC5QOCUwQdEC5QqFDghNFC5wrEC5gQDPgoTCDYYXFMAgXaCQoXJEwZ4FLQbhFC4imDAAglFC5QAGBgYXKIoYWIC5YYFG4ZkDC4YjCYYwAJC4gASC6THFH5pqGAAY")) From fdb4a8835b6fd16d128b2a04e2dcee3d5f5bf29b Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:24:27 +0100 Subject: [PATCH 062/105] Create ChangeLog --- apps/showimg/ChangeLog | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/showimg/ChangeLog diff --git a/apps/showimg/ChangeLog b/apps/showimg/ChangeLog new file mode 100644 index 000000000..296bc78d0 --- /dev/null +++ b/apps/showimg/ChangeLog @@ -0,0 +1,2 @@ +0.1: Initial release +0.2: Fixed launcher image From 108c12d3ec5a3a441b0865596e168918ce8e48b9 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Wed, 15 Dec 2021 19:31:39 -0500 Subject: [PATCH 063/105] widpedom: Save lastUpdated as a unix timestamp Fixes #961 --- apps/widpedom/widget.js | 2 +- core | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widpedom/widget.js b/apps/widpedom/widget.js index 3c861cf54..0ec0780c9 100644 --- a/apps/widpedom/widget.js +++ b/apps/widpedom/widget.js @@ -53,7 +53,7 @@ E.on('kill', () => { if (!settings) { loadSettings() } let d = { - lastUpdate : lastUpdate.toISOString(), + lastUpdate : lastUpdate.valueOf(), stepsToday : stp_today, settings : settings, }; diff --git a/core b/core index 2a8e872ec..b033af017 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 2a8e872ecb143a10e53273b4d3473164e104e1d3 +Subproject commit b033af017f6789a6a7777e6ef1428d94995a9b8b From 029bfd2bc5f0dde466dc8e0a0294d3f3e2ad98cc Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:32:38 +0100 Subject: [PATCH 064/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 354067f70..d1e1947a1 100644 --- a/apps.json +++ b/apps.json @@ -4977,7 +4977,7 @@ "name": "simple image viewer", "shortName":"showImage", "version":"0.1", - "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", + "description": "Displays the image in \"showimage.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"], From f044f36aaa793a853a22702c9ac93b2aa2771f06 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:49:02 +0100 Subject: [PATCH 065/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index d1e1947a1..50019d877 100644 --- a/apps.json +++ b/apps.json @@ -4976,7 +4976,7 @@ "id": "showimg", "name": "simple image viewer", "shortName":"showImage", - "version":"0.1", + "version":"0.2", "description": "Displays the image in \"showimage.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", From c9fd252ec96983837970e26a5704af01dff86c17 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Wed, 15 Dec 2021 19:53:39 -0500 Subject: [PATCH 066/105] widpedom: update changelog --- apps.json | 2 +- apps/widpedom/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c379a1de4..ae91d7995 100644 --- a/apps.json +++ b/apps.json @@ -1590,7 +1590,7 @@ { "id": "widpedom", "name": "Pedometer widget", - "version": "0.19", + "version": "0.20", "description": "Daily pedometer widget", "icon": "widget.png", "type": "widget", diff --git a/apps/widpedom/ChangeLog b/apps/widpedom/ChangeLog index 2f36c7647..c033ea505 100644 --- a/apps/widpedom/ChangeLog +++ b/apps/widpedom/ChangeLog @@ -19,3 +19,4 @@ Stop goal drawing outside widget area Fix issue with widget overwrite in large font mode Memory usage enhancements +0.20: Fix issue where step count would randomly reset From 49136a1ca7c4a3290c3e75424f9cb3515a7fd514 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 16 Dec 2021 08:06:53 +0100 Subject: [PATCH 067/105] Initial version of circles clock --- apps.json | 25 +++- apps/circlesclock/Changelog | 1 + apps/circlesclock/README.md | 19 +++ apps/circlesclock/app-icon.js | 1 + apps/circlesclock/app.js | 218 +++++++++++++++++++++++++++++++ apps/circlesclock/app.png | Bin 0 -> 3576 bytes apps/circlesclock/screenshot.png | Bin 0 -> 3576 bytes apps/circlesclock/settings.js | 33 +++++ 8 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 apps/circlesclock/Changelog create mode 100644 apps/circlesclock/README.md create mode 100644 apps/circlesclock/app-icon.js create mode 100644 apps/circlesclock/app.js create mode 100644 apps/circlesclock/app.png create mode 100644 apps/circlesclock/screenshot.png create mode 100644 apps/circlesclock/settings.js diff --git a/apps.json b/apps.json index c379a1de4..e0bab5917 100644 --- a/apps.json +++ b/apps.json @@ -4981,7 +4981,7 @@ "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", "icon": "app.png", "tags": "tool", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS2"], "storage": [ {"name":"showimg.app.js","url":"app.js"}, {"name":"showimg.img","url":"app-icon.js","evaluate":true} @@ -5003,5 +5003,26 @@ {"name":"lapcounter.app.js","url":"app.js"}, {"name":"lapcounter.img","url":"app-icon.js","evaluate":true} ] - } + }, + { "id": "circlesclock", + "name": "Circles clock", + "shortName":"Circles clock", + "version":"0.01", + "description": "A clock with circles for different data at the bottom in a probably familiar style", + "icon": "app.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"} + ] + } ] diff --git a/apps/circlesclock/Changelog b/apps/circlesclock/Changelog new file mode 100644 index 000000000..af119ab59 --- /dev/null +++ b/apps/circlesclock/Changelog @@ -0,0 +1 @@ +0.01: New clock diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md new file mode 100644 index 000000000..87edd5981 --- /dev/null +++ b/apps/circlesclock/README.md @@ -0,0 +1,19 @@ +# Circles clock + +A clock with circles for different data at the bottom in a probably familiar style + +It shows besides time, date and day of week the following information: + * Steps (requires [pedometer widget](https://banglejs.com/apps/#pedometer)) + * Heart rate (when screen is on and unlocked) + * Battery + +## Screenshot + +![Screenshot](screenshot.png) + +## TODO +* Show weather information + + +## Creator +Marco ([myxor](https://github.com/myxor)) diff --git a/apps/circlesclock/app-icon.js b/apps/circlesclock/app-icon.js new file mode 100644 index 000000000..ad727251a --- /dev/null +++ b/apps/circlesclock/app-icon.js @@ -0,0 +1 @@ + require("heatshrink").decompress(atob("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")) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js new file mode 100644 index 000000000..8474b7f4e --- /dev/null +++ b/apps/circlesclock/app.js @@ -0,0 +1,218 @@ +const locale = require("locale"); +const heatshrink = require("heatshrink"); + +var shoesIcon = heatshrink.decompress(atob("h0OwYJGgmAAgUBkgECgVJB4cSoAUDyEBkARDpADBhMAyQRBgVAkgmDhIUDAAuQAgY1DAAYA=")); +var heartIcon = heatshrink.decompress(atob("h0OwYOLkmQhMkgACByVJgESpIFBpEEBAIFBCgIFCCgsABwcAgQOCAAMSpAwDyBNM")); +var powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbBIUN23AAoYOCgEDFIgODABI")); + +const SETTINGS_FILE = "circlesclock.json"; +let settings; + +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE, 1) || { + 'maxHR': 200, + 'stepGoal': 10000 + }; +} + +const colorFg = '#fff'; +const colorBg = '#000'; +const colorGrey = '#808080'; + +let hrtValue; + +const h = g.getHeight(); +const w = g.getWidth(); +const hOffset = 30; +const h1 = Math.round(1 * h / 5 - hOffset); +const h2 = Math.round(3 * h / 5 - hOffset); +const h3 = Math.round(8 * h / 8 - hOffset); +const w1 = Math.round(w / 6); +const w2 = Math.round(3 * w / 6); +const w3 = Math.round(5 * w / 6); +const radiusOuter = 22; +const radiusInner = 16; + +function draw() { + g.reset(); + g.setColor(colorBg); + g.fillRect(0, 0, w, h); + + // time + g.setFont("Vector:50"); + g.setFontAlign(-1, -1); + g.setColor(colorFg); + g.drawString(locale.time(new Date(), 1), w / 10, h1 + 8); + + // date & dow + g.setFont("Vector:20"); + g.setFontAlign(-1, 0); + g.drawString(locale.date(new Date()), w / 10, h2); + g.drawString(locale.dow(new Date()), w / 10, h2 + 22); + + // Steps circle + drawSteps(); + + // Heart circle + drawHeartRate(); + + // Battery circle + drawBattery(); +} + + + +function drawSteps() { + const steps = getSteps(); + const blue = '#0000ff'; + g.setColor(colorGrey); + g.fillCircle(w1, h3, radiusOuter); + + const stepGoal = settings.stepGoal; + if (stepGoal > 0) { + let percent = steps / stepGoal; + if (stepGoal < steps) percent = 1; + drawGauge(w1, h3, percent, blue); + } + + g.setColor(colorBg); + g.fillCircle(w1, h3, radiusInner); + + g.fillPoly([w1, h3, w1 - 15, h3 + radiusOuter + 5, w1 + 15, h3 + radiusOuter + 5]); + + g.setFont("Vector:12"); + g.setFontAlign(0, 0); + g.setColor(colorFg); + g.drawString(shortValue(steps), w1 + 2, h3); + + g.drawImage(shoesIcon, w1 - 6, h3 + radiusOuter - 6); +} + +function drawHeartRate() { + const red = '#ff0000'; + g.setColor(colorGrey); + g.fillCircle(w2, h3, radiusOuter); + + if (hrtValue != undefined) { + const percent = hrtValue / settings.maxHR; + drawGauge(w2, h3, percent, red); + } + + g.setColor(colorBg); + g.fillCircle(w2, h3, radiusInner); + + g.fillPoly([w2, h3, w2 - 15, h3 + radiusOuter + 5, w2 + 15, h3 + radiusOuter + 5]); + + g.setFont("Vector:12"); + g.setFontAlign(0, 0); + g.setColor(colorFg); + g.drawString(hrtValue != undefined ? hrtValue : 0, w2, h3); + + g.drawImage(heartIcon, w2 - 6, h3 + radiusOuter - 6); +} + +function drawBattery() { + const battery = E.getBattery(); + const yellow = '#ffff00'; + g.setColor(colorGrey); + g.fillCircle(w3, h3, radiusOuter); + + if (battery > 0) { + const percent = battery / 100; + drawGauge(w3, h3, percent, yellow); + } + + g.setColor(colorBg); + g.fillCircle(w3, h3, radiusInner); + + g.fillPoly([w3, h3, w3 - 15, h3 + radiusOuter + 5, w3 + 15, h3 + radiusOuter + 5]); + + g.setFont("Vector:12"); + g.setFontAlign(0, 0); + g.setColor(colorFg); + g.drawString(battery + '%', w3, h3); + + g.drawImage(powerIcon, w3 - 6, h3 + radiusOuter - 6); +} + +function radians(a) { + return a * Math.PI / 180; +} + + +function drawGauge(cx, cy, percent, color) { + let offset = 30; + let end = 300; + var i = 0; + var r = radiusInner + 3; + + if (percent > 1) percent = 1; + + var startrot = -offset; + var endrot = startrot - ((end - offset) * percent); + + g.setColor(color); + + // draw gauge + for (i = startrot; i > endrot; i -= 4) { + x = cx + r * Math.sin(radians(i)); + y = cy + r * Math.cos(radians(i)); + g.fillCircle(x, y, 4); + } +} + +function shortValue(v) { + if (isNaN(v)) return '-'; + if (v <= 999) return v; + if (v >= 1000 && v < 10000) { + v = Math.floor(v / 100) * 100; + return (v / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; + } + if (v >= 10000) { + v = Math.floor(v / 1000) * 1000; + return (v / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; + } +} + +function getSteps() { + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } + return 0; +} + +Bangle.on('lock', function(isLocked) { + if (!isLocked) { + Bangle.setHRMPower(1, "watch"); + } else { + Bangle.setHRMPower(0, "watch"); + } + drawHeartRate(); + drawSteps(); +}); + +Bangle.on('HRM', function(hrm) { + //if(hrm.confidence > 90){ + hrtValue = hrm.bpm; + if (Bangle.isLCDOn()) + drawHeartRate(); + //} else { + // hrtValue = undefined; + //} +}); + +g.clear(); +Bangle.loadWidgets(); +/* + * we are not drawing the widgets as we are taking over the whole screen + * so we will blank out the draw() functions of each widget and change the + * area to the top bar doesn't get cleared. + */ +for (let wd of WIDGETS) { + wd.draw = () => {}; + wd.area = ""; +} +loadSettings(); +setInterval(draw, 60000); +draw(); +Bangle.setUI("clock"); diff --git a/apps/circlesclock/app.png b/apps/circlesclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..94ff885faba99f8be0bed9a3dc9c3523e32de816 GIT binary patch literal 3576 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 literal 0 HcmV?d00001 diff --git a/apps/circlesclock/screenshot.png b/apps/circlesclock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..94ff885faba99f8be0bed9a3dc9c3523e32de816 GIT binary patch literal 3576 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 literal 0 HcmV?d00001 diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js new file mode 100644 index 000000000..2de278b47 --- /dev/null +++ b/apps/circlesclock/settings.js @@ -0,0 +1,33 @@ +(function(back) { + const SETTINGS_FILE = "circlesclock.json"; + const storage = require('Storage'); + let settings = storage.readJSON(SETTINGS_FILE, 1) || {}; + function save(key, value) { + settings[key] = value; + storage.write(SETTINGS_FILE, settings); + } + E.showMenu({ + '': { 'title': 'circlesclock' }, + 'max heartrate': { + value: "maxHR" in settings ? settings.maxHR : 200, + min: 20, + max : 250, + step: 10, + format: x => { + return x; + }, + onchange: x => save('maxHR', x), + }, + 'step goal': { + value: "stepGoal" in settings ? settings.stepGoal : 10000, + min: 2000, + max : 50000, + step: 2000, + format: x => { + return x; + }, + onchange: x => save('stepGoal', x), + }, + '< Back': back, + }); +}); From 8fd06d710b68131363ebeabae61340c6a7f2b694 Mon Sep 17 00:00:00 2001 From: Marco H Date: Thu, 16 Dec 2021 08:46:49 +0100 Subject: [PATCH 068/105] Fix missing app.js defintion of clicompleteclock --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index c379a1de4..3f1b9ac60 100644 --- a/apps.json +++ b/apps.json @@ -4918,6 +4918,7 @@ "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"} ], From c852e1a215e3606a9f06a35ddb42cf72d213374a Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 10:52:47 +0300 Subject: [PATCH 069/105] fix: dark theme color --- apps.json | 2 +- apps/pebbled/pebbled.app.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e2501dbcb..6f249171a 100644 --- a/apps.json +++ b/apps.json @@ -5008,7 +5008,7 @@ "id": "pebbled", "name": "Pebble Clock with distance", "shortName": "Pebble + distance", - "version": "0.02", + "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", diff --git a/apps/pebbled/pebbled.app.js b/apps/pebbled/pebbled.app.js index 14cc9e398..bbe98823f 100644 --- a/apps/pebbled/pebbled.app.js +++ b/apps/pebbled/pebbled.app.js @@ -80,6 +80,12 @@ function draw() { g.setColor(settings.bg); g.drawImage(img, w/2 + ((w/2) - 64)/2, -2, { scale: 1 }); drawCalendar(((w/2) - 42)/2, 11, 42, 4, da[2]); + + // distance + if (settings.color == 'Blue' || settings.color == 'Red') + g.setColor('#fff'); // white on blue or red best contrast + else + g.setColor('#000'); // otherwise black regardless of theme g.drawString((stps / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); } From 676de1775ccc72ea60567228ba18c28461fc7ddb Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 10:54:35 +0300 Subject: [PATCH 070/105] fix: update step length setting --- apps/pebbled/pebbled.settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/pebbled/pebbled.settings.js b/apps/pebbled/pebbled.settings.js index 3d82f0700..d6c84d5d1 100644 --- a/apps/pebbled/pebbled.settings.js +++ b/apps/pebbled/pebbled.settings.js @@ -24,7 +24,7 @@ E.showMenu({ '': { 'title': 'Pebble Clock' }, '< Back': back, - 'Colour': { + 'Color': { value: 0 | color_options.indexOf(s.color), min: 0, max: 5, format: v => color_options[v], @@ -38,7 +38,7 @@ value: 0.75 || s.avStep, min: 0.2, max: 1.5, - step: 0.05, + step: 0.01, onchange : v => { s.avStep = v; save(); From 6e9611b913f0a072354eda812eb87349276aaa59 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:04:47 +0300 Subject: [PATCH 071/105] feat: add photo --- apps/pebbled/README.md | 1 + apps/pebbled/photo.jpg | Bin 0 -> 57580 bytes 2 files changed, 1 insertion(+) create mode 100644 apps/pebbled/photo.jpg diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index 7b393d0fc..8e87525f4 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -5,6 +5,7 @@ - Battery warning changed to 15% instead of 30% ![](pebble_screenshot.png) +![](photo.jpg) Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/pebbled/photo.jpg b/apps/pebbled/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d3635ff4dc22e970fa823cf9156b08303ce38690 GIT binary patch literal 57580 zcmb@tc|26%`#*eU3=NTqid1&8WGN*3WKTqvkTtSz*^+%omLz1&Hpos?_N77Ah_TCF z7-JVRgBeTD>HB@Yug~v~@AG>8c%J*1nah37oVm_@UH7%!@B8o1zrO&4mij$)00Myk zn&1KaU4#nUQ&F+f)7MqMr>zE_001Z}05&KB0NmVty!17cIZaF-bN=i5pZ3Jo``Q1{ z|H~(MkNpV%d89z-xN{U2pr$>mNM}((-PuzW;vfU;D=~y`8&}0r+VG zzODk^fIgrBD1-F>ukAnM>5&frcSrz0mGGZFoA&@v{|W$Dr~lK(n+pJp5dct!efGrb z$$v2e1K*+c_5iR~3;+zK0Khy10CZ;m!{~p$`yW~SKRhcZ_?@fZb9#V>1K%>_l{F0c|9XSJ-+=RQYJjSZ3c?LQ&qJurL;iLG zQs4lBD*aEZ|EEEqR4{6qGw}cJ{$I}god)QsAfTF4fr<{CARG7m-euptD^ZYOqT-ks z&I)j|^0w>S2tMYAvnD-_;{yzuyYGxV4VW{cmgoiBS&MJ+9?w8#$wSAKI@o*eSlx%KC5 zNS5>ftCr`!f71X(e$EU#8aVs)u*oB*p~>g>Xq-!3Al|pm3~w=mFII??IvD?G|LC1& zr&dDIFcr5}BB%h47rDgQ=-6y7-wWf>i{!qnWfCo@`VG`xZb%_B5`gBybO01{G7Rp0 z55}7;;LnkL`eZw(zB!KaV&gT}*u`*;Pshv-;{hcS&v82U?NTy&1Hncf}L9 z==tnJUyaa9Dqskb22}a47bV4qf&(f0BtI_j$wIpdQJ77 zmFXc~`#36TGNjVtv%z35HBnx8aCzYiRw`K4Md=nM>T=M1qRga-cfXj1r6LL6ao5K- z0=_i!a&+GBh$HE!Zz1Sl`Rm>c+l*^~ea(!5XW7Q`R$AE#c@v63<@W*!=OF+L1%Ep5 z{RToC6gkA1m6Il&6W|5zii2hYCIgxeB%q@yNso+#rvedWg8j;oxhQ#T`(Hr)xN5u~ zyC2m0_GO6 z@$=S&i6a?+bOCBwDrP3@uzWUZO%)h5Z7#qJlex?ZP$d?{0FF@QcV5-fi2PGqgFS3A zN#4qVQ8)07GxF73&vaHu$h@1+Mko6#vNkDR*kI_+=9{ZTluGL$! z3u}rV+c!wJu@9c_V_i3Nb{C}Gyl3Q^jILd4$)2rM;X`t0$Bbzep4Ze0SC28wJE!`Q zi5kL5OA}T^E13(utjU_Be1+E$KvE<1(!(K8)>kT;oHQsELrx?t_o04)jBfaG@#?AE zOoy1?%PP(bUlfxo%~mYXQkn8E%R^<|gE3VZW@zK$zV)kpH!Gw%${yzHi{%V*xbzVZ zvi|~i$zq?xOeQbw$9aDA?a#OH?KgMcmP#wHLVrlDxSH=sF=?E5n)@!?2v!t>;L3&a zJ=BM*ATtp|kr9%#$?4!|wga3h08B3fi5LRtl3+j*jE>FuU4gb?gt_3az=bpqC92;6 zcLELrUN7Y&K)1hDEba!9>0L$xa-KJJD)@5+3-4)?uySK2J(iw3ISCMK?J_Ml55Pmo>EZmvvx-j-oX>B1spn)8MP9(|> zI`Soas7k7Sik*qdRwpP5nlMi#f=IGTg9VNaLwp$Y1x69j#7kmUfQqjtq+_9xs0rv7GWyRZ4YCAPfOv z0n+*O0k|XRPpnHW-!KGFpk2{JF+(KbNKTtGA^=2+J2sL2l@xcPAQ`*b8bRtABu~z) zF3m95Dytc5Hz=(^bslb&*glu zUrDFZwO7ntVv7a z#P5Z(A%^bLvPuGBdLw{d77EJB2_SI)dav_jAW=}|#|X~Xs`s_-)__$)rkk9R32OE4GF&byaY7gI5-H**7`#;CBtv(UR;2GHL zFc_IuaDPwPP6;9fs=s%t48T9$$~hc&$tffCJFc(yxSJILw5%^TnX^odFDd6wy-vt@ zXT-%%=VmGx@e;A@)y@gfvatc61A(guf<6L~K@%b4MWuEh$*HNV3@AUK$}C=zQW7Pj zZ9Dd#?e9-sbvEi0omU)vhXi;Xc?D)*0SX~ktB1qcRw|m*VUj#iA7aPmJvJ3JcFLPI zXION&3BEHT1m8&o`^s_qi9=u9XkEaPjVqE9Li+XD-q~6G6$|e`7i}H`029(o(Tw7x z=1SxVkN8fF1OQIhvW+z-tpLCmksQI#)eB|!PX5x*R1Yv8;HCSE>0-LRe0 zCnG^(gOs3C4Exv`T10c%VzznRi@#d$0)K9XVPpgfnU;?AsbNCBHHr_ZZfzwjI5lp$ zrOs|=;4A7eaw}^UZn1^J83DKoUte#ZrAM&bOOimDZspa*TxDpXxc)a9I%idCOGURC{R_Mb$s{v=NQ>EcVP!OW zt4!i)scd859bedlvkh!WhwC~gHS5+7+tIfjcLj5@>bwHkJqlYkC}(06 z!sgaLWpDCb01jb*GsCi?>2ega7;bPP%U{+HR=4IkO)41?uYR4~a$&RIsBp=woN^Ow zwyX46cNVM4Y-X|G!)qHUTLb59f}PL#-hWya%lkwy9H~r)5ERj8gAMV=2tCPVLO|K* zVDM|aTzQ=Qa84LpC5;Ecb&*HwY{KypuI|@?e*=@u+I?7?+C4rl$xBG5Td|xsPz5OE zN-wD!s&IOl@<6%3mcKy32D*4bq|rskd&I&wb70c7K9v+Zm@OO!>a=H>ojpnqjQOI* zU#@5+(hfuek>P@Hx_5jn+p(pk7L` zM@qc`OPzbcj2xrwZ@P!*;CIE5Ol`_GU=$+B)CJY{DTonI-mMff9w3oeW`q0|ijI~r z?imiCjkIf-Xtu3mGoKwUaJ!};kggS8$mAjfw z0E|8X30hegAOs*Hpn|1^-nWA}eg>VH?Qu`6u$@6_q@$fddb` z%IX5vO{}J6&i1oiE)!x{O4~LlI;a%u05H?6J1MHL4Wz%!eJTbi=3fu2(Mi*f1Zp+u(;*4_<|)KV=Hl z->1LQc4*eLGe99iDX>KK1kH=BKZB~~?2r6%BB${+6U`2FqH*R$Q@$DxMvE0bzeE^h z++)itg7Z;4xpI*S%!&P6a9S@uFWxR?7#&~;%jIOIbyw#EOm&nU0T`!Odmgi_&DoA! zX>@%&R(@+B^bYCE0eN?maL3l|`NG@dpTrd_Q3dk~g08XwYAfS+yt=MpFsqef;IAcF z>&^*U8U;^{=NMD=uP>%^3U)WH6nw{Oub!3r3#c7dHFu4=N=q$V%UE!&>#kvr-CWrm zSRHZ6X}jTW(rEwz^3^}A(a?4=Ffn`a_A1j_pTA3W$$;yesw7=e1P){lAwY)+>(>I{ z1*t8RojpaKMFn}x!P2PecJY;$9Vs! z6z2HIW_{^ifSf<5YQSK627?hlkS?ytz@Zrq$<={HaD_hr5S_^eo;(Q;==k26Xx@Z> z7K(Wcx{qZrX!^#8l~xEHe1Y*>_4g1fBfo9=oJ|RuI~@E`jWJn^Sbke;=|9JYH871>v9NX!va^P2Z-?(G_1!F>_nK`wWUXk;q9c;s1AEak*h z7Du&)vE8<#d?ZYWnb)Pc{h5}%jhl7}ZVadn3?Ng;Zs93o<0vjCKD~5)Zr0$l^e7}k z5=a+xgeB7mdNaVih9u8DMl2)X5Kb6ZG}o}GY-?=w;9o z(h=8lAp*j40G{U)y!jt0p}1dHZaydeF|ym;Lj zo|jw-NTSXROFq5Mb1xc52DHLy_<6O#tkDL^bdxhfwVo#pWVP=Tqr}opv@yq^SG;$< z;%2DMaWg)^U%m;y6B#}4d~d8EQ4>tw^>yG79d7%TUXjZVjimz$&W$c6T!p2>!*~T< zy}haz8+`#cx|^1?cW#h3im`Jmd%E@x?UZ>Sp z_pNn*Wy4RhP2ttx#ZIVu$YHo*1U*V6l?l%GItH4+^bLth0FyN)APgv|h12nsusy*a z1YLIz3B@Y~lP8-8R!?93QK}^S?Q&e(3YyFuO*RaWd1qygyj-FskdS{_(~wRpk%2A) z0ft-vpIVZvP?!64q4f-WPP9Z##p*(sbHHrNT=vZ(i#d&$g=;SR^Yuy^NwsS%ECo|$ z4mC}d0r!2SM8C>Qi>`f znz$b~fehGG{K|sv-syr^=i1`Y{DP9-Pk)T`H;N)l(s2LUx7eJ<)q{p3C2#VqzXHp~ z?_ZuLK0#QkUbIHnp2GaS(E&nmcv9rL38+^*=UtFoz|b2tupq&zRg)x}g1sg*Xb@CN zu{5Y&Bi}jss9UoC7Z5obG~4&hmf5a!7c(cNZu`9EPxW~%D|^_q`;nNDGWN5SDwUfx zu7BM2qs5!}cDhO@>&IcaK{}0tPO764q8L9pA?MBJnre`Pvfn730VF2~WnfCR^R@ z*bBxuVK}5GXuWF+%OK3iwxXfiVbQGV0By|8f{F8(=NiQ;Yo#PhU5$H`Gaf6gg&(Fz=tLBc45yh=2cK}`I2o#e&Fw5j>MhQ`bA|Iq7@g@ zNBogh!imSyiBjBQ{4~avg|MY$wo6$eR1DTXNWm|Rk-rw?RNWjH@!D8^b|Os1VBexY z;mC>$X$qB$DO-z@@#s}H{||RnKOy3JO}UhPbYQr;=TG6=6vpHO(j6tuLpSW057tWB z!UucLd1X9WlrXkXoLR-zl$n}9&FP4s33R)Blk;k{7g&&hCzM*FXuSXd;JP^Hg)xAu z_rfnlD}2By$Hoi!zd*yUZK8j1=k{)^^nS}*Gwe*ack>SR=N1dms!z*v=Ipt*O41)T zPIKbX>no&IzLUom#@_n1Tg|JRREw~)p;<0R$TZxlozk^S!8ZR6#Hgby{J=sNnKCiulIeF* zgr4EcwDelfhbz99xP}0IC)Ss<=M(rjZ4jJ%NH~DtL~`kII(6c6x!Rxzh~$~5?I4Hh zfgW<`Pp_kv`TF|3R$szVh|5xdrC8cjYJlA;PO&PDhz?!ZO6l3eKv?*LPc>Fs#a2(w z^dAJBxfXc(7vKn!8rWYDZfkYf=)vy9kLT{MW#RHaMN#GYY1 zA^7BH@L!;3F<4`zwfs~&D_CBk)wZ+q=o#CMJaNa*$M~;%t!PTa*yJK+!&_}9=ffq^ zD2@_xUHe3O%_=J-t|xFUjxaxM>qVj=KbYFd_AxXs>_TyOQrU1tePQH9(a<@XLJ>o7 z0LiJ}rXxT{>v%6BPTBSPIW+TVN9S?J7DjjDQ0e|5<8UiK9{u@n!5fERocgA=z9fzQ zNIag;nhiN3FlBsk4(Z7`6-E*T^`-+M#T`-kNtgN3TYd+~uKVjzq;L94M-69E0VZs)1Ig zgTvFaKmK4cf1g;1b#5#zP1|A3l|JmA?EDPUH0H=9OI+k4S&2|I(Dj-9zk@?Xbg?Ha z+O0Qxh-_eCE^YkU?(PYLZ?sFXq&QGSjXJ~f^LUb_k7DIt|9Mw2I3(>?pt&^q`>}C| zLjBJ((`0SybeK~|PjOhR)j;c`Zm*FUg}B>knPc)42W-WO2%gAz|Johj`7bSV^8suD z^BT{kR_8Bb0~_rm`&bzON!plA@m>HX0Ne+Yqp_P%BokLO3}=!o13+n7PT&9e3&?|6 z<3PwxA7$tM!f|mGI;67oEP*2w+r2b8aQ`5XKp>v@wVfFE9|kucTN#TI`Y^`|Rpo~a zfu2OAyT_AF_-P7b60w0u46)q`F#-kk=16IvY4L903);Leom+3Dd(c{wk#|T$e;zH0 zQtoj-37fY0M-jiMAmWV&qmy_g57f-d;`JB%RHG|E@$bM;kw2KUI}5-6f^~JvsjX{Q z2$UC-EYeo*S648_IIw`4HdBHz`zp~eg|BGZ=`X;H?>_gMuTAOysP^)%rcJ@{1@>xn zZ6sU|YQz;okHjHxy^9H@5GnENLd%eI1}lm$e`AWV%ibv*VsN4cB zXdw?V8RAJv!=r11tIlZ0ZUy1KU)c`&3k;sV(K(grI5JL@4KZsSf5Dbc^cQXw`?#;9 zxKPDWPA&~;6}~&kDGqHf&K-8p&Fi8_r`6+*Lrvcu#}^XkrO%z>8_AXOJL_4k=s@%O zP~n3G>hjf?6KpcX;rfq&Q?W%QHJhq1qF{GQ(eSf?Ah}Z9^WA;?B*nP%WKzN6d)%78 z3)=>^qQ367ub;og9ZdEf(KcXhprZLs-s?!sWd4A*rvUU~FAx^ao6D6@7!L3k0O8IT z`#Bq86$6(Ql){b{gri7eDKnExWTjkO4}l|(Kz5f-H?r{F5B+d>TE7v(GkAF9bzIM= z(zUcj(fx2dIy(`ndw!vpPxUEf!!gF(%SAEG?;znaU02hTBgy5 ze5zwhu3wK-yds75*3$R!VDrJECF+WQp0IE@oQoR}nRT>mG4q|Ry9g#ff=01}0OfT8qT6HeHz3!n8?I9~3Y25#@|p89Qjo+vS{DWwM2 z_j?C~uoNyHD}ByLS;(Y_WuF+Vkwen&6GM4<3&{?vR*9g0F9>4UaL+7wzULpBd>Z#B zDELa?Ux3Mbi!%A~&w}UrF5tmRR-8%utr$vb=>7{_h@Wh^K|0hq5#uNdls#q$Hdn+? z9M60xW^6bJl_HVQftI0+VpoO;Aq@tdtiqS_K1_ARjP9PqrytIrK0^OiQl?@j zyXyyJTpSpc#}sFiq)0Vs>?xjhv!=$8hc?3BDksp2Z$HGNFF2|vASdVQ>CVfIW8Knr{LVo3kH$5$ z!M;+=QRwJ#nuOwlRALI6Wp~beKGbhAcp+&$Kt8!(LAqm#z;sOSuuTSMaqya2V2C$M zbYL-~TMFY++NSVcRp^x?_XoNf#Y$B8R&|N0o;#t=gqxFlZ{sWfNc$fUB#68FA@Pd= z!HOPvdtRgCcx#`w(aO;D{TAKs;Ju>1fC5pk!@_&a;_BSk@%E0Ae^u)tdbn_^80$XH zX!2>oU376`M=nm(6^y6nFrn%mzW5?ZLlbd@yYdgknP@n@4FEds`w6tA5Gp1F;yP7F z`HI3-MY-RYp5Gz$QPnSpdLmCSmJ2+~!J@9cI|Ex-5(Z-xI%;xSyo3pEl}#gZP%U1+ z_TmK1vb{UGaZe$HjhAI5)Q@b;zDwcg2r19rX9_qDYE23${Bx|p?zg@Gq44LCbyqo3 zRIhPp;EBhrh3vk;X~Q88gJnYITCqo`Ro5JFq^bB}QX*R(xRBk*C zy^7z;5uwN*%cpTf91(}{Go?eLnj?=V&t>D$X_~VKA$YuEY|eH*;eMtNp;{}BZc;dP z+g-9{%gkMLue!PTWphqxz8Ot`rul|psW_7}SlP~n0=y7$Wf%-t4B=S|k=Q(5c(t?p z7r4Lg-zvFA_*xZD{Io}DXqj7~o)jas_O)sstjlPOFiK3T4Z3$aAd{xJ?yT8COV zLMIpdahPVpk)ld7s9ZTan6L6mp##SUNjdUXx~r%0gd{L(B(~C%nx36RA2NQK6bY)z z6%AE5teOL7%r52h>4=g93E-~9+Dt^$R`h6lZlLo@_fI|-v)B4h8A}>yk3_MVH%zRI z59>E;=Q0EyZ~vJ8{7BNUdicz1eiVeB=_yw)Q1B)3A@H6L+4(E(P5@!ARr1JcAmlI5 zM+r4p{|j83WLNA+BcS~<8E&n;SM$M|kv{BOU5Wj<*Vu4ywBxX+P;lZK;-(LWrXWHEP3ztNzcbxi0ZD>;hO+HT18j)Mg%{Jzze zQu^svjO@#W%pb=R#J|AzQ>7sTm!)7@VAOHUH{K|%XR5uWs(_4buyQKy@$*{$xmf95 zIU3tAVOIJj9ak6r^WyM8i=R`9_goEDP2vKeEx;CWpAE=JfapO)pY+4TEtQH19A@~S zD3%mTeQS?ZY_Qc}(2o6S$g!2&d|r>Xmn^W6@Ra69zpYn=khuATBj{MQgJ#5`EA$5be@I&F8 z#b4mDBID%#VUSqbI(|1Wq;;o7$zyJDS4oW0nz*!3zpsQ zDW|bZlbco&D?9NkCoPkI6bG+PW)(zcE8?$fY@O1p=~ki68Fm!G@TOEV1AjiBFn8i6 zm%i+i8%e)NGU9}TBPGAR*Z5G|s{XI1Eg_wRUBycN`nLFLpgD^hf;1KMl_b zC%V#`8(Wt!XNJhFRBZ=;g2hHKX}u)HsKJ@V5bR#i!kM{0t;%3RLwHCcR%EW+mx)2 zjlWNpXIgqB5ecue?-rJBZ4nMA9NF7d5>*>7>dzkd|Eey&fj7CneX6@1bkf4%w-nOP zM)sh}Kap>4z#OH$1%ty5qEd!cM$hVtJAQ<(ib3+2_>W+=A}SGTJGzGst>UQd!4jKx z_nMCc(AZX$J=}5fQ7F~-?dAPbcNQY!tIi3J{m}lufXxDXl&s4@&!NT!N8B;?IlUF* z>djmGaq4tUm$GJlJZWVw7MnTtSd*6xGdB{dmdlgWwy(&za~%KXTtjzg)NSWAA0s@2Y=A5Xr(b0%!2Fo*qk|4BZ3}f^Tlbs zyS(L@8N=3hWRCi0dt0D@^PU~d%bMF}oj&=KQDf>5R-1qXR`x< z_d>Z(?(=XPaNWPi0C-Q4>-)vzwvIPX#L|O&D`$^hoLr!}jiQC}r|{BJ38^!Dt1hnU zS2zvLUnK`)CSR_Hq!BRK(xnqo&>ydF#Fv8=1lyeQ-UG~qyyDfn+Mmvi9%6?*;#Vm_ll7ILL69L@ zrISg2WX|9)KWUsBheisFN8{BA1F7#l6sC_9{{rkujV6^VA3t)BY)ic^8Ft3&4LcSN zbkG=R3psxMGcP?O(zy26>i|S3Sx1J^>j;{h7mSd-FSIQ0;jmJV{vL!i=%rxT?~E!* zKb~P|^ckXe0yI|&U7u=%;t-b9_*f6NKaH1krAuF zp&{B@dKh1Ye{mYsx88l6t>B_T#!d%uxIdFxTLx~_-^9=>#OzUm&^k|6h{49)IDC+< z-JPnKO?T7B_`HV&lWON%eqF02%}1J%DYq+%EZDkVnVZ)am_F|MIPGazq4Nrmiv!%EbknxD(|cEL$3xZ8hbPnFiZ7|ff(#dqIrnK@CMc+ zXLDui&3Iv02^-DI=11-(+wXslUbIqCoV`x1N*k-qG7+_7s~whZ-ziGjN3LJZUN23o z$qB8*Hq@49#x_>p&#(}6zLuN&nf`<3gyd?!tAz={EaUB`iztBp0k2JOI|N)=i;#qL zO~>P{RM7S7hapPm7UbBrwU?S&%4NsWB!>!=1);EZPS`M?8p`qV777J}LQ$~J6#pyP zr%|ZW;-vKhGJ6%s`RhBfr#-I*KTjg0GR!S3ACt5Emh8dXmiS6%m^-?7>NUww4&JZK zFf=J1En~2$6=FHrI-`wWDxKUH7m2ZEBktg|D59nZ^0rcki`6YyD`*`b$iXDrbMHLX zj^MP>yD2Cckwvd6L$$|&KGEI9e!x|6Y$_V)`5byM<$qkcUwZB_ZzKpc0<(p&pZwt_ zaEO$qbtE_R9k|XkY_~B;aTwbAQ@-XOl6vZ0y!9fujL@uD6&s4)5Aj|;dggi@Kb3D@ zTW6+L6zA7RS-QGjzJ9X(0IOtdP#`Om-Nkk*wI=S#Moz5XB{O${Oqz6k-#}Z8*;Y=& z&^Lg&hBhx3T$|7ug2T@Ur9|+@0KoM>9IG5rJ6M8yh==iH2QE;W&^X^xE3=cn+LxDi zCAp5^wPpICx>82?c2?i8y;{q+m>b0qXU%-NTF%aMNFXoTQ3d((T`k78DDYWlc}m)~ ziP`MN`pSR~H4t_3yJcw=%yI8?=sauiomjd%Yhl!D*|=Gy+3=M|EugDwOm8~x6WxQ_ z1(Dt7jV*?4z=I)gO)nv^(D<~(I^$`aYEg1V0uA!aB0J*_M`U2oT#kB9l=dOp0r|z( zGkk=3@=RKe?BbxGr%HGa8{43o4p%OK0K#$s06Ka>58;p4fkLj5n5?vE!GwDS5NRfuX9%!xa?$o`iVb~7(21b9Bd5kl4=;2DIO z@WZ5%hjh3#cseZUj#awWaTH4(CVyMUj2X*oe4Dsfo;!nh?Rp8%Y+G5ZXo}PiQrGiJ z36o9n@zm?cbbbH@u-SlBN`MWZVrb-6)$-l*o5)aqZ}`Y)%4Y4&x&j^Lv|$oEo!-}2 zE?TTvB-NZ5C#GOGLTD&|eXU>c)x{fMKTk`~D10_y8bvZ(Q{e(160QdT$yBD!l0X(p zo3{&{MX^Gyq5HfV4#=oMdFSp%kJfQ=P2li~&)UTO3h}Lb*x^Xo>_cz23(mV0{Kc}} zvW8D;gnkZ^QlS8FQ~aMefg!-IzsM_Qi?LF&yw=pg08^|kYuADu4Z_b11Q=cHDV(*C zdn9LkZb`q=U1;J>ftWaDjhK>~ zYHioW!GeoYQsdz{%PRCX!LEPumB+Q_KMOy+Pgv3{z1AaoiUsONXS&MvSy+r7TuUlu zUTx2=`z2g{5#uf~p6YIVKHGJ-{I&#B+b2iX^bBhN5DkgGLtOX5=RJ~pY%`{?@_Fs` z#-P1rao&L<%h2xnPl9vGXsvDj>&8hQbCO_0y;gpu$rO@W_L1cw5%=lGdIndR=997a zAYc)oiwpw*rgnzQ8OpWU(5Kw0i-#V={H@S`-o5oI(ThB+q3zehVc2pNgO_?Syyk7% zS)bnSTv(ZN(Xx6^dbE<^2F}9NG1V&mJAtnB z-v4NJ>dzbXoQ&04@_edJuxLSBiB&Zm67!lQA1UxhIWPO&uJ`sdtkfTG*Sw;gdjqUQ zyT6gGc4c=#Jd{G7(R`!{IMxCn+UNoV)Nx)ue5tv&Q~#-eJ6ZROWxqX7y6$9HQt)!j2p{SPx(su%0{bA%|vR`-Xd2?Z>uW%KcuO77kn^&FqEPHrOe&fIls1F zMZL_})6?e3LltkM$G94o@wY!K^ZIq=0Km={nu6l~1+ei8-qeG|0n4f;DVnHDvL$_= z@zsR*!H}1@kf_WlG|wd7`v$k~`)BJ?W8Zl$-CRq0C;Mx;ztZKk9CzcTUDm-8tZ7pD zgKG!3-;l;$=9#{9TySS<`jhjfv3SIbtWkD<#VUVLXWuCskF~hk=;+oGxWZvWc|kOs zEi5lAn7;6H>lUb`D>x}EsIB@dxuw3UG45_Iu66xx_PfQN${_l9cmf&+&P^tpqI;U0 z+OR}@h!hnkEpUjgKK82@OCwhq4-ohE1EdCdOH+jOiN7cD8{G7ce3uGdvC-UY$=V&h zE^0xZq}%AlOBuZzd9s!~_4BZ1cFo|q+O4|D)WNj=TL(S2Jx6mOn%kBf8Vi&gR@WDV zulU@G?ACjWzxzqFsK@!&=YGFSa>n#`wQX##sfkYGFjpE!Wv!`@qcHJxrxG}qofoI8>si}LXoOX@%Y#I3vi+%|oK zx6i#;*MJ3Fp6YD+B7QriYmMgM`)Fy+$e4lk_DRKp^av&HbCuXw^I&%Q#W#5)vX5z# zS#Ap(vZY%BL zp+jiW*e-1yW-k%2DWp@6IsE#8jO=H7^FIC$IzObv&&SEYk#GdKZ~|vW;(ob$N_@ic z_)3{}|L(u0)zGwf0PE+>U8A70k3<7DCp_4mTNvDUB%a@%LQQ|!y8rAW`Vv2B;l@v; z4TkBGea@*>3Opfi{JM-KYqC0^uT$aY+AqU>WB{j!`n0)%LaDU;w7ptf_=3wI<$dOFHH$8Yq; z*^3|J4K`0h*BUpAO$$@cRb=?cUKM^M419id;lbBmN8GS5VMtmw@g@7tCY4 zHZ%fmJqqKJd+J|ejVg+HjFjZ+(ge8r3N=+r_*>?5u}Vs$Q>#^ff5o)k{l=eBLbwt+ z8QIO{?-i@cktn`gZ3HY1PRAVGbNf+TLL?k8y;zRcB1wZ8wcQTFXH6x0!l==dlh z2_&MZWo-IEJf{&A(}h`p^Y|~Y-FjiCzYPo>G~$P`Kj*qNnR?HUr|F_?sI%dmNKVij zgaP*j)vVRJKR^NM)Y%jv%H}dh6QW^2aM*FTPDJGp%rVj$FrOvR0Nc7pdJA%DemN8nbOg_r=>nhWrRggHkY> z9NEB_*~B&4yw{4LM=YT%!UB&JhS7w1OtG({ige-!~PTt38H1B!ksxM>5I-i z`Qw&JMb1qvQ|_JX`EGjI;X*M2G;ORGfKi$@An%TLnc;gg2Mh?#EfUlhp@)r2bL#`C z*KA~l=yZTvW8glCM;QnjYi?_=Q!Y@4PY2okZXE2ezrN(eaDzJAJUB=*$#e+#g#@55 zAOoO&o6cO|3@)NPX}zfXp=aS=dFe0kS*{jqzFv#9dtNDQIw5S@vR*oWZ|L@FM((@x zNP1TlI>b$CdS)1Z#^;2#v)M*lIa5xa{=+&9y@n%SZa}2H<2kuEyh;#b7b2RsY7XJHnG)$UozRI=OSc`lr}P;%G^2UcZvY)V$jBMlA>a}SvH(*&3JkS|;wl?S>D1XkuCl%p+zX6t9%zV3NLGB}1fVXdUp93PIz~6p1=~Hv z==%-LqT~I3(rhj{_i=qgSHo>XW|fAg(cY% ztJRhY zmfnMid)kn)f?E;ox72UdpYQujN1w~f3=0PgRj8K(TC;t6@bip?OGgcE8(zfSGH1h# zgbnp(80cdq3{ zQ$4&|)5fX;<(E_dp&S^cH)m>d}jOc09`~e5A5yI7lIF)R(-u-#Q=i7s+w0C}A2scJ z?c415Pe>W@>B9iJ49JB}>hJUb!~kB9ZV008uRk5q8_jp7`H4!GM52by1=^h9VMeO8 z>1akK99q>JyVNOqbQ8fsjsyE?1IF;KWPU-gOse%O1{l*gZ6O3srwo%R;=8PJ?|BBQ z(1xCTdk|m$a66#Y02j#Wty(D2mhQe)K-=tkSKVaUKQW~x6>&g00!N5&& z0JyJ#3U(gB#CemNnd>gMIP&2wy(gX*l&!;fB=i$MtJvhxT;y$+^a?isx7C4r?f{4q zWY3Ml{2Dt@!c%S7^Chg6xu*Wxw}(?^WlyP(TwCdh)}dc;9CnFMO&{r3tMRGjZ!=-n*H_m3o0C<(={8Z7y=t^|yh{&-bG_6%;p$#j zWR03FwXn`}n|&J{Wp>2v?ood8+EB_;)5UYjc_msMbK1W&Rp(?F&g8b8rFli=tx)0! zw-$Hi_%Ofu@%ogJw*C7ZN~z9lzT5kQ(LdGOSsOfp<|B=*YCq22F`fv>zI8=PU3B-= z71^ZdyD&so3AmCreznYNep~l8?FWg(wNVwdz68>j_WL4^ zUQ<`f$5ljsR(bXdy?dR1Z8o{x9@g&twA~uYN>4*|=`_A9Gl^_~zcGZ~%p8VT$-&gRDY~=EUdwhf#zg!eiew4HBfa)L_uY%*B zym^7AE7Vosy}i{Oy)v9DTIb~IQZiFHKmNhNeyf^bqh8$)(Gl!fTGbCicu_~wZv)HB zPv=CXJs-wOY=^&UG#Sq2j6`Kpn2K}7ZlmAqw&NRM> zQ8>Lif?-#{QSM1?c(J`hEdvB52~*PWeEs$*nP$L1?n@X(_{b^Ryg2h+!JPWHCA&kb zGRZF1YnyL0ro0m4o|@{d#($#|@F-IGr-2bh%+g9<*p%6>P-OG(UI4L~7pla(a{@^Z zq`j#tMST9Af2;XYLTxJdAdGIYxY+N?G(#|I_pLs<>jo> zExdfJwcaTI_wa4VMb&=H>2xF&C@<+~?Dr!7?Eu(;Pt#!*s;^D5`CI?>OqkA}_3AsK zwrSF0FEjB?3Pq&v3Ot=;Wh(MqtbnOIihe6Y~t?ULVqTa?gF{{^T_}TlO z(`4l-6^47czh|_AH&<=FI;+TYkE3}W6&sSp^?{FrnIeT{RxX3HO1(6?r6iXZ4D6>J~Az_NfSJ1zsIZDA9 zqdq$bxdxb*GTI5QMH<<;iUv>K?9Twl{|pOPk;S-Y;ICg56~Or@d-P)>L7R+M&CZryyl3M#O);F}+=t#nAMNX6c7J5OyWqWZX$gz_hhF;Qz_IwJ%> z0S)D61$G}e3=y3!9;<_bN<#1Fw^wrlMEau?3m6B>n7`~RFZ(GQM+oUYdv%{V+mA)Kn19W`Q7>-rf=Kn*uf#Vr z2~n#U2}Mnqt)HNUb%rSJ6V=RpiXXqEK-?L72PGO=~Z{@)^WiQ?O%Oh3&TP7t_1jz)B_xqggm!LUN}xO zU}k2B;h&v6E14xQ<+!sQiHf8`-enxVC9mEizX{FJ-U-C|@>JrqXT+Nqw1Xi6Xqg#j z&$U+-L(J5DZ%lKoZ^E77A+Hw+%P4VooJ0j;J!F0A@s+K@(@SCamb@a>c0ZU_f!#8P zHVu!7jtWsmNUQI~K(?^*#ZT9YJPypYK4j}}u*a=lSXqCc7JQO8e8t^hU=E*C$RM_k zgU|j}#?ty>co5*k!K1Sb4R6ud2b3;K3_M#nYZ$rRJ-HbbWtU#jf2+v}(oEh~xwrOG zEghj(&FkjO`Uc8|R3R!|K)-*O!2aehAlTh8(A3nLye!!pz#p4%9+V%C9%!GyQDl_Q zD#`f^SZ6KbS*~G?1lK(D_5Mry^@Bgn&7?e>ifwQ?Q>D$ zmO5etR7s815H9K4rKba{%mYzXA-!jbYRa=%M@kWqjRrzb!^Jo>?(OBY9QtW3qNl$1 zjEb-CKfBs%jcBv}zj*q}s3^PdZB&qkA*5@hJEcR0l1_9{? zNkJHK=n`p$^u3?of35ed`7|Hyxo4jp*FO8&`v?HR`JQmd_Q724A%R#-?s-M!7DFe; zFFHQa?*f1t2E%GI^7NT+Es8_>Pt`cpZ3qr^zS;lhh~Dq{8O$>56!tlXj;%45P-a!W z6Tor6369(liXEoEJbA`yMjhCt_ClL&*C2>eCN^{0%k32J=|2phgV+I3Z`#D|XFZT_ zb)IHUH+=c%)xxX9iH^UJlHKq>=0gnozppO9x}GU(niQHekoSy5J^QNvFwm#>KVd3Q zJl9|CyLA{F-|*u#UYQyuP_IhWd;E~w4X@)CxH^xcT?8DCJgRRv9~xUUW=4>T^ZCqp(6oqLooyT$(mLV00-h^e z4&o-uagbT$1?xfZv8;AhL*FQd5KJ*5LY~#}c+eehCtJG~LXXZ?pm3@mtiQ(7{zAvO z(~WrnBxndXg&G2GCFmBw+!278W!OT!G(vrk`vx3VD z?G4R;7+Tl`XqDK7g2<In3c-bJcQ?g|?1GJu*d^!k^#%S1eN3k- z_v}*fe;5>Ysv#(vLRkuoc=Mix`wUqH6oRVD3sD_>?fR{xe0sCx3z~WNT>rn@LgRxG|OVVna8NLtMTa| zL|9VvHcbG4mf#m=Z@QH3jmFxdy6vbOreS9?nmSAJjsaJkJp*Ds{Yadu4(eYAVy7Qt zJH6$@Ytv78nj_#QxAq8PSBQmIR^FU@z~g4o+vk16N(<(-V-K3iR^lt9p~cX(oFxGB zU<%+?^@w*hHq?44OiE+-$+B}*t>F9VK5V_{xYI(1jJdH_K&^5J5glYU+F8&vp6Z`` zVIxPzFK{6e7K;bzxzkSY+WHorpQlI)ZfiwPY)8Ls6Nu;aSOe3&2yf<1EFrp zf!G@6@9zuRb=LQFkcxn7W5!QisF!@+&$F^|G^JX4Y-XPgf(ue{!nh zXRqO#x$9F~x|jO1&n-iZhPFu6h+L1t%WxmPecX(dN>shSj~3r{Z*DI3bQ{mw5vf5*Edq8l?D*st2tL~U_$#aXQ8T$b-d>le7Saso?Y86}F3O#E-c3>RBT}??W94r( zh(j(7cu!>Qf-O#KY`rvfZ}MY#v;JW`3Yq)-XQ#VZJCXuvII#y!w>w%d^_sc3G%_;! z&L>&k)sG;}skbwGW}6a=Bi|9qYor^Y%!{)q5*pU+FlgJk0{VlfOFjM!k(>ClAnYMA zbsrl18!O}3oI3d*MwM>QvVny7E)R3t2oE6VVWqcIfbh<>?1dq~C# zMt9^Qn8}E3_Fb&vi19h;yXB!!M}=H6#^9nCz3Zcsp3V~suMC!R4pH4rrSHgs6}1Zn zwpwVZ?p7)o`)9g#*8QWX+4yAAeo;i$(}ZBF$QbX0gvue+f5(X-{ARRPL~q=~mL;E( z@4MJoxgJIV0_nTd@S3Azp*YHABs&vxt>Owl{Dz1jA z3@wIn^M%|#OPdydcjQGBPn6O9Lbpv+=^o@%_zh zb<7x!ng1{*C|^-~4tMA4TvoC=))Kpf2!J=qT+)oxQ)mg1GXhad*VVI_H za>_+$2Ok;mZmIC<_i(fXZ;AC1P95zV)OXAPAb57;U3diUmf*kZX{Vk)CxS?Mh4D{>HLv0p-jCmr_(%twSo8Y zrA(J&c-7x_4N6HzJb}hbt+Gqb@6z5%rT$5dnFp~x8qy=(MXD>$E+s?a-{K7DX-XkJiMfiJb`$= zpv@@h9X|68yZQP0=$(+zL1+gF6yq~zdmvWnVeT6BqhJc}*e%n1WFP4Puft&+0q1=8 zNZ-jalTFwy3MNMJ*vfhXMA}Cyom|A4hqZ&us)Q88;d+P+CaaeDX*xrL$MdAZ$5CaH}y#Fwu#$xL= zWf`Z5_`$te=Wf={zd;lfv&ue^)%Mq}U#g3eJHo#@7TF1vPyRgkZMQ5H-PIxvZPz^! zPaK?4k#-N{>yOp+iNvBhoA^KVa9AaY?=_orCPdT8#L!ziXfd$%75J)$lwO0yHoNYU zY6@(>6f7Vnm}5+}7I%xD`lnnuN-N3y!+?DnJ~MkzD@i;Kq$n=Db5A_Y`W>%&uv=lb z4X9$fr}SvUlI6hmDAC(3*G!+J>b(w~4%gkK>sS6kbi{{+#WwsCc*)Bq>lGnFb`p;) zccZYVUh7wNC0DpAg>(BcKYj3GJPi#QXxIPh{(|6XA#8j*L~zQdV{Bn?hakF9totBx z4lOTpr=&V(X!=b2p}r5Aicx>JU|$wF3=Ia^G=Aukn#>xL<*@tuz&_JjZ9-0%c9RL$H*_4T#E<=wP7Ux8TS%_M9Eu|aBM;|dTAQOY5>y-U3(lMhl=@u>+> z)V2=6WBDFW&P-JXt>q{c$1)3A;JpJMeQ=bAaz0kGYz?eOPn`zc6|ZZiird=SB8or1 zz^d1BB|wzZ?N`V(zR3W62p<-TM}DoK#XR$!A6U1q2j@{uu6sAAAj$@dyYPW+=msZ$0))zk#cwLOm7 zob~;kx4%m@>cl4Ie(KrhP`5cRcA~5t?vC=&$c>S_#rKj=3AIjSiURfCsOsQHhz*@p zWtweWUK`yPzqU@X2+AOc8s#o)T?twUEC@x_w+*0@dk`N%E5y9o?j$-i-%jIhP{hPfixMwipWxf2 z@?8Iwc`h6b`%rmE#T#MMJZv@N^$)|HS~bAYAYmFTyI0&lQt37MIqvD8qO91hCvI5T zJdB8DTv@9;zcTP^(j&LSvXD>1UnAT&oy|ap?Mk9L(-l$oV;f(j_sjc;Bl%COa^`zl z{IR5t)WkozXRg*Q^cNpw8EaW%h!Zfph|dDS`whNkZd)& zt-8>+@9#bh9jH2zh)24Pj&HQI;T*=>C~mp0^L-pfA(i?5f`@vgkw1|$)yqupj*fbe zj%0{5$)u{B6pDCxfxCRPOLgTrN&IRx3w7?_v0kXwoUU=!3Q?J0UrO|8XXE5;4dNC4 z^uUJKU3-{8LdOh7=a)ww&?geE5e5%7!@HFwqcl|&J3cx}qY0xugOxq+YD!0`@ggxE z>J4XxCfm+b+jYP8bDNiV*ujn{V^S*a%LIG>AW~A;FAd{HIbEQjy-lqHF*BtxW~rZR z?)e_l#5QMhc(!)%BBC&oBG{vY*0ZgQ+LV77*YDR!H{*mmkgnOz@jcu7!M$$#Iiix5 zYXe)a=%-wuQmLPxc66oN1r%{YUK$R8+F$&J^L~&}9(!t+#NMt%xvX!X&XRsu&6pxo zWeU$q^m=`Fx@j=6HBiGc&A&1>4b6NuhfCA`MoWL3J4*kId4iItn&otD1@Gr0CO+rA zi4=weO|c((M+gXRCuyP6FQ9n#5=f!DUU5M}Q4^glegqucMW=`?A(c6g=G+x-83Y{s z;)N0I8=a=6p|{@uFuofK(_~k%K9tNIW=ptLy$K=*dDt?H&Nn7IR==g_KdurFoLH7* zZ}YB63L7Kk=@o+XdslIlCTFP?C&wW*IpBZnWhgfrHOoSz1h4daGDz7r3pg5|jdKrB z3e^5CJWM2_hl|wZliy&AYFUeERwd`r&HrpiB5FbAPSyNzjr%lJ2H#Ct z6SDGbnJbwW``3zdyc-=Q*&W-sM7Mo$Lnoh%Vm*m}&=tvTU)?;j|8{g#X8dY0Q^1ju z09JY9X>L?fVDej*!uNHNv+8_;3XSh|iU@~kif9|i%PDSg zUd6F(XY=}`-85#K=^{jkTEYbpy}X2Lc;p-$lb(~!SBlznEKoaHmSlx*SY_!;2h9iS z_ODx9sh&QJ{+$+edcpUn(vsK|)}pldmsPs3(lp!b*6&@RYtI-rW4^MYlyh~(7*Jt3 ztTN5lJ6pEBdxn|v@WHglz0ldGiZCK|DuE0OnY+GW>18Y?l~v zd*fr=-pyKgsa+QR4+H+HpT=9y_1di2Q%}shz6iVUB4;!rYt!ChJX+)M6#j}qwJ)Xd z#kCG$fHOp(_01rfaf7QdITlg^h*W|f2`(cX?gNd<~s@wz~>fFc0u^Bi+ zwjC4T&MFQzmj#Kk@+m4ErF_Fy%w@c&(J$X!WsZ@OPoE(-4+Wxk?%_Zu^5w*-2**nD zN9#BETTY=tJhguk31ZJa06@Axo%WW~*IH{#i;>w|D^mGr!5!oWQDn&C&S}!9_eH9_ zokP?VWFCq;26P#Z!qXR))ebsUhxjjm6OJuGRaeyE{+r#$*qdK@nc)+_J*8XlGXMwz|7bveGiRG%gu3zA;?Mq1hq)_U} za36v=%9BvcfT zwkg#t+iE*Zd@l`>Pf;|!am&oDY=c9R&nU>!!(Wk{#v5X3d3V}PPrsk`_9aM)~ca=QM6a%{+1CqQe^4YyfQ zrJG#WE{zvq&oK=0ll%K!>aHpltqsOX~eft#d;g!-rV9N9HBMEfzIZr&z z&UY<>ZuYblQDM%V(p>Y~FDPbFtrxlo>1`})&lN|sxw|!LNs8M@tYy)C*q-G5v@BF? zHtGEgIzAtiFz2Djg%8u{4 zESq8!Y-mR`A{`FhO?(r8IlYy5MXIw)b_KW_2cOdS3|&Kg`#zo?Q#()#wh6qH>m|$tjE{(Wo2yx3+_ABJkXZ4Ei>kEQaU5*EPmC71dj%(v zL+rXX2ND1dh}gQ5>%FsDou8u}o{?P|8@>pq1w2CQ?vxa!SJ|&frmYI#5Fv%OG5R5TZC^nn%7h9(&7~ef6d$$%~#}7@j+sGKl+7@ z;rNfz+g4XV-`OE*-O{~>MDZi_q2q^-H{j+swI9(YB^0=W^dxb$r#vL@lwwAkWjdeH zd&cRWP~^>VS%qvHV^a?OI4UiSN5Wq)axMX(DqZEN!N?#biOi3UOq23ppOlXsk93Dq z1YxAx-0d9%Tx%)M^AD$4Uv%Uy-d3xgDn5O|KZ+ldcU|gsO52%um|YN-2UpNL zRxy~WWAOSCE@ORzK!(=lY=m5zi}E=Rsc^pKsAM?nf{*`twOSYIHbdsT8Q2Vn(TGFl z&r;=q4IsuR2&jR}(I;%h^FBj%B3HEj-j*$jA)Avr-|}38!X8frYROf0y(zAvlp>f& zo>A6_IyvLQZq%TlI`L~Bw$Z%E|MbWEtA%3*iK{ZLfhxvVw!-HY>+cu6tE(i=vu1fK1^^QO+`AY4Yg6!sP`8kQ|vB4 zbT;w2Zv38O?MNiH$f293lMDbKIsxbtqV~TC2thRkJ92N1jX!rTY7=bJQD=C`_epW- zjqzx{hPa}rZAcK^YsXoVO{qETKbC$>BjCe$=??tO_R z!(HanT$MR3ox-q1^ogvHZDfTzEaJ;i74yh=bxi0o1|B7)(2?PEM=N28N0#S}AN4Y* z87mnCA$DCVH&R_-B)I}S--tv-H=Ahw=((d0lmH@V2_s24YURmSzS4E0Z1X%~nWNVB zwj<3J7AN*nVdP_rvkO)=H`G5H`O6e&@h&qjJhGpNkugLIbS`S60wn97M zy;XeJ9Tpda+H6nf+T3#xtn^~0F{DZ1g*9Q-d0F{ncO>ORj#nyZw^6QRx<9zX{1hmU(&f zj38*iCd;HU%fn0OC|&3CiwyIT=rO=wMjV#Evpy7P=2eR2l%JxX<0^e08y!%2K(+a! z@z9M2yE%xN9tej3Sl3ZQCR?v`8sox>Lb?<9U;I)|jlv_tB_M?wU7ON2NwId{K(UhtooJLMakf9 zx-UjH!!*0h)^g_6lkkskAS(h~e^RN;9mzeNM&~(~sE#sCZGf$P*$#*Zo;NS8jZ}I& z%%(Q%BkvZCNZuru#1IhIZRrnEcvSsM=bJyo^Mn#wl5tpdWhi6bX(hwE@ZArh2mG?S zqfS*&o#%#!XRi+yh%jEAJFXRvKdc(Ptx#M?xm)FMnoy+b-dL5FwF8vq1ZyK6Z(r#y zj7{z3>O@voT~GHU`8*<=Yjn{objp+g=m+{k#1CW(l2z!KRVx`ld;Lj^IOLIi&-lNj zIX|$D2@j7OOdJ8_Qu@^53FijuG_K+0{Qn-z{yCAwS?#?yNKClT{^Aj_;gB3!k1J?F zXMc05kR6}V%*&Gj;y9uP3c9VVHXnSZwB}w~{mw;6bN%Gm>s!PxsQjt&c(b^!aNRxo z8-)co(e2`#!$KKIt&2hb++p-d(7nvpoSMQ@GCR$*XW932Ty(uq=Ge)*(L9e*D;*@c zjzL|E>_g1M%L_xEY0UV4K&QdE7hLtLllzxwr4`!Jge7-$z7@uZ z>$dhiygP%{Ziw9NLzEBqGY>$eEYrdkfw7K|Uxb!Cyy6hkr{byy>Z9aT?TM7)*$TmrN|VBKpje0LWj zZHPZl*mX=GKb$y*$$vcW#guWODcSCyvOf{NW72<<)yid3_x&)e8T}?6{sqaHDqj9u zkcy5YYmKDRpJdBomX^f2dEL`C+r#p=_h^0d?uk`d%xIg7LUX$~Q0%Sf{iOO7Uq!b?+}qk0IDao^ZT9ACrf zV>f_^!5qO1v`6cK6gH(zQ48YRrtn3bkFD!_htN9?7$#naY5Iqfh_T6ogvj55GywZ; z&Ey;?G`-xgO{uZS_9I@fpa+WIwq|u1;kEgrYtSImn8|%)5kjhbz1O|S*@#%guVnKD z-{_O+8CBub{v zrVQ_&Z8zhsGR~iLfl9b^pd6%d#`mM#!Fi_BuwEl9sO!wT=K3OAc$4Q=87U{CNY%#h~C)Y2@x~!!2U9zI@=}7C?(rP#>hfIY$J|A@yM9DkN z?C`5X^IpVBPoYPrCBRd4kVP)k%{avoOdMzP$l#nlW_(^(_DrB7@0PP_GkUARDdzdo z>%aIy?VKkSLSw*M!UlzR@5)r*bMsU$VW%-X%hpX?hPw6xm2=}W_XsD&WdSI4!WOZo zTWMlXru51Fi17~*5)Gcq$JM_4zKMqh^UVW+8sOK%7za$wxhus3uj?wM!&yx~^#RX* zgALCmH<^vaS$3>%h+nvWIwt;iBN!R#Hes~XH!+1L3bki2IqPF+9ibOFl`}tl`6lO(b|)evtZ+Mb6dNE{M$K(NGz$|yfJlb*n9&lZ0>S_K<$-A zZ9o5IvX7Kp>D>4?jj(#~+m$^QkvH0Jhn{3qT^f>QvAE6Bf5Hie@R}Nac?==t`O!D_ z^GTHaL7y=%#R@(O>g5%}+5mer&9VGZ8lh)Xx z=j|NLyNxv@CEQ&})=7y-jHkV(CYWzy>p%A4;E&l@hW0PSVb{v4ENk2~iB}b59dX&2 zSG#(=f4n7Co&!)QxOr;$>fpV%g%_R}GIQB73!iPl*fkrDJVxgD$!_1k3-W4j=F0`^ z=w)!u9y5Z)m)#tiTR8NjirKaxKn*mLY;rmo>gd>9^8qo{5JaJ%w6HMaKhY59+J#IL z`536ScviQIJrc0X_6(pQKTGf^mU~zkS=?H14bME-+_T0+x80Y_j3&>aroaOD zPeucKcu$eNBA(YA*X*F23|u`a_foI13YQ>Fdj08Q?w)j?*#*_9wrj%An6j@1?WWmu zmo<)}yf{m^mCMg@hZ~C7Cj>iJ)E}2ab9O(TTW`XJ+}GXod!$ykgzF6mfD91g*LV&k zgaQn_Pi-6`0qlB152NSUr)f71)Ym#z>B@jArHNUl~=koCexXtN5TU|7&bEfvOQ1P&*`wtN2x=D z+N>(HZ*OR4h7pV=3d6I#S`;yxO%w=BXnt$X0;uL@6<1?3yzNvgpI`TyY&B7@*eRzfbZ=*d?rBMwz^69O;t{_`W}D2L9@2v0)g68* zDP``~&VQ^6RkXE5u8F_l6L99#2Brlj#%QNV1yrP+xfju2hJ5_rBmmQVwCXO>XqDFNq-4^w2(sr5sOJGy| z*snt3v$V^CuXf_swH~BjC0Km}ri?TNrhxLXMQ=1=8W1#7Z5S6f~J+ z_e_g_=CIAF_!_2RaKC8#04p#_e%K0s2CU) zhSgZ%G=}5%h)@Dier;rG2#0@-<>n4dtLN37<8o`3QHwHpPg}A()j&kd0ge#n0i7xr zlIaJI|Id~DXE|-7+rdVpHD%MBdgQ$xbydR)d2>%mTDO#WWH5kuwPdyxs1}%E$4q<|E5T)eW?*2(OWr3?9V_NuCeX9~cBFEF1;Ilf5bV7u!CdSy647*Bx9 zr~dmqe*C{ns4yOpfWU(COuCkC0-utLUN-g4ppH-ee_sqJ91JGGQB`wlwgp97m$LUg zCj+I0PYk~j6ciN3frLaS%~F`0@X1CWTmN3wi0Q0*h8K78;i7r&*wDYIzui!Sl znB9~JOw=7&-wnIcze(J6jx3T4q=nSUNKN;Cj*rp(@GDhF@#643eKa?1{e2VupZ1<8 zlki>~&ZptEs^RaG@008kffo@hrW-&*tjLOY&}_!C{2c}S!NQyEf~lKpy@_FcnO-6f zXbHj=r+*k~PC>iroOMat&q&`kq2BT)%igd^CMEHCYD=T`6CZ}#=Yu&^Z+?H_bShiJ zy45_iNANb(LXw)qKWo;_D<$LJX+|+6bw~GN-ZSM$D6*a4s%po91#!=|DL!`AN9OpkndFWSBYuhB`J75^TeilU)mGb0Nfe8Kme!hDvr?)gRCA!{!tsZ=jk zFY_cR1sF$uqrF6Bo0C(Ph8-;zEIsiLqqhV-*Mn!?T~IQ<_Y2kW3cn`mcdpG!2+c#D zxH*@K?`MfW7cpz6!{dXCasqdm`9NuIt#Q3wj4C|y^UvbaQTN>t%;=t;FemPFG5udd z_mR8Th@TdxLEU=5+ncrHc2ji<|M69!XX|`Ze9sswOO7bX z*n(P)jX%RY=j}KZXT5fdaDUYOMF-19l;n{`*PAyrmUuBj= zXTk?4mKB@NNhOt<2W04hxH6HcmWyXM(=&ThIgTOt#1$oez)0^B@4~cL2QV1SL)wc~ z$pW^|CXGOUmazi)1`cCSr=f2jfUUF)i6_1@ux0>_yN(H^fT9OgZkg7#|2oA}xB)~j z?XUa%$G*RKlOq<5aavWsR61iO6(|<_=2H_9{)8D3Ui_AiZjND!JnZ)wZl-J?(}UCio5kcmj0B$A+t>`) zNk^ch;BmV@EnB9@WXt>4K5-UnyRign?W`8G_J26->%AO6_hRQ}G(ikuZ_=3l^3?q_ zXPSL4h6C#h3uk~98nB`*?yzTeDohx9)>+0EVJuxX6_lj23{(qc2jtmWfa+llvJZ)WVtdmI z%s~5xv7TDi3^jyT2Hpjw=ebm9`4y*(R30)hV@I zkG+LOa>|tvn_f2cYesiRGg7loSSaOe+}Tk_Zms$MP#c=*6wm10?s9Zl0Vs9=X^R9a zJ>y{sPD)BjdHkBCQ5}zmm1Ra?G%D&jXqy4t6lFcW&8VtjkvB1pzImV|2$zVFwX&ro zCdjn@^-K*6+;k_O_2)igu0bVBw1z?4`#C889PuNF?jpIaNMyq*)e9H0-p{{V(5vP% zAp*HVskEH)I7g4Lw_xvj|Ui536}NQkPR9@>))edH^=l#hDnoK8Ye<_1OMXN`AQv|VwG3EMY~ZJYaWGH$^^o|u9?s(saY%-Y#7Vbh zASaR4wiODPWZ2MK#jcO_To&%LPU!vctPKlg%Ll$>Jqdrz^uyf7-^!p}&Ql`(BGDWo z(#;6%gDwA^C9Oc&9Ijm)LVhP@V1@(Qgu{_)HON`1Cd=4BN6T@M8KoShu{xpt!2Up` zojox~9gtwTejVe(^E(}>Dc4PGb0E5M&#x`cf9MF@wZx!Tcm7JZsxQiH%hB0Ynx_U+GcSQWjQ!bdp1aHmnL$yiqU1Q+=FM)nK_ zOQKaj&<{?_iu7#uU^eci-&jO&5(Z6TrFFvuE)M-?&0hgVpVGa|Q41Lou+k2%rHL0(cqzrZ1U;Q`WLi=OK%IY1R`R<|NnojJ7uOzG| z8z-)?wOLkZ%hB}xu~La8m@^atAq6F+~_pm3u!Gj8Xfss zu@lyNCL@t4cPtdhh_>iGBkz%V%OEqYE*wm;rS%V^_Pr)`yPK!~%02qUtD5GcuO=D& z8Z&~-o#YoVNjH!>i{YOB_x&0Vz<6{C$tmu%)H1qcGhIS@=WLXrdSVa1k|m@`Nkb_G z^l;2TK!f*;3%4s;mTWF;20z|%o!I6Ih5JCcstxPGT5TeendGCM5DnUnk1LBjQOP2s zExD@`i~NxaI}To-;PP57YQ4O9AP7VCdI;8k)?-TV?1L|!!?e2NP4dvA>QS*FG5iOT z7YC$g4GrtRTX}JDR_5~SmdC$G)E{skOoc9D zWTBQ9lqmI|=G}C(gP$0IL2PA$G3s^ktPc{me|x#sFS0Fy(9>b)HZtp#9xIkKlQJ6q z-#~;kZSk>X_V?-K^i2WD|2NW43VAJ8_A*ccz z5&rmbbrpOE21&;Zl$)|aye`t>Vm3}UCra3|(E9Q3+xeq4tIdE=1znww&0Pa{8>d+r}tsTx_O85|g)~zlZ zFkAt6Al55T$BwcGz#RZl96*8cjJlSDX>DZW@w(|V$zOY8!vm`lmka5bFoelg+&EicfVU8v`m|FfJiiE@HR$dk*;f zl_YOtT!;%8CxlQncaVS>z4Rz2y5)E?jB<$Y-XVc-K8N-B{$m~N0kQm=wr!VjF|h z^uZYh>mh4s20lL8=qAKJjHLo1#zU;>x&t(;#YNJxQ;t- zja8Xr-#pddXi=4XD`--tUuGx@J5$YQr#I>>=rjw=?8aVoR!y z5*R787Rp{i>vS`XeNrI$iEAp537FFo_rU4+e)hnD^`3q86@ITAW_aO$dSb~n*k}?F z8#sVob^W205i)Te(q97H;=<_qpuK(~%NSLDWb8ViG1ob)l_54EBrR&Dd;7qL(yjCU zN}2Mi=Wof8Uc*K5iP>=ojgHY}H($!D`^47{KvGI#*VDW<&~Q7zs~AqHlavceN(vA6 zWa-bPMVsqcb`%|d=>6aWa!w)G89jcxZds{uuHd`Zo%O(L1FtHzOghYmHXTf)pY`tMC`9y5}u)jBc`IzZ;Ly=021t==kq~{+Xoq&#|a??XHaW?2pBqOScQN} z!E!j=F=*pUy}i36J(SyeTzgO{BIrTD@N&9=mR@v+pFDJS`@0a(8;Q*=ZVRZ=pJ zQ?69PMhScQ3PZV>oa>1S0-^^h(NTs)2^UD@Y@7D2)1hU_1I1;WD3y56k0_r4c?!eT z)jCy~wcX{ig#XoXIQZPPv7m>KmYY*OMvNl9;Ff~NEL~wh_ksOBk7xDEU??f6ca$1a zQo0^#v^;0tSEt=O&b44thP1Vz#P;n-Sx^`o!&^@G6HAqFb8|$@@PrRPJ$vt#y5z+_ zj3<0|Ux74VA$tI})1O&J>!dV|NBZISs>SY?wx6Rub&5als0!+g@2zn0Lya9(#;$d(2j>bqLvbA?yTCOrPi09_*`A1@W^I!yrFE5BgPwusY8DVZ97r^7 z=-cT0!BCz2^+0}9OQw~|!?Jq1D@;~2@%LmZ@A^jB1jF}8K7wFSAfuqrD(HMf);gTd zQyZrQn9Jj@;MDqSB_O2Yt|1OwsvX8=jSjLr4?=g}k+4$SiTza+L?a%WIFdr~mHQ|| zRg_d$b*+@sr&7t=Re>_k3g=hP29XMZU#98+2oolwoG^KQZpP=#aT{-&ROvz-3K+&K zn3nz@%Ho3?f8OH`8<8&AZtb05F_iXKM1a)V&--VlruOPH_?Yp9#U@L|im;|?Mjmv-Wwa788bX00uD7{_L5 zgcj86U>g5hz5g^4h zRBowKUDT0rPX|zZQCcAQst*lvSVS(aLTnG!(r9_V&#MS3uBIj4 z$l{ZPSYX>;_5b0_E4I|y&^Y>mqv1o=0b3g$jFgKVoa__za1j24i?6(HpsM;C9^1qs z+PG|cf|vXdlM{Z0!i&`+%;VghvfT05!j8?S8zx?5F2E z9HVGV!WK^gspoS0ZGXZP_QQGU>*F3>B{FT9jWaZrrt%0G;Z8SWy|_3sF#Tu@_*)e@H)KFm!iBP!X$P0d^=IPRClarud$re!`k zOc2GWs@!^}p4eaNmDbYU-ldvTVr||(cMgGB#Y?d|G=pt*l>~dw`Kx`A$Uu?ZQC8 z4?pe>q7=Cwl%63Iwf~`J5&AyuO&yER!dvjtKa3Bcp6iRuKgCWZTC}Zo_j6XuFZh-&Cw<@~V1=0Lmt*HK|cX9g#Wgdkn6ST>B7!1S=xDE3lh)OTb?J=A}na@k&k z^#rx+`?{c3-L9Ff*G!?e~fC?o<+NUF6(pj=b^-fQTC-}+Azf? z1~YtU&&&*XKFG`2W8}z3s@et|UU1%D&EUUst6MvUP+k&F1xsB+2`AX|bgRxEmdsNNEpDPZH z>1%HNKaSozknOeoAMbM>)r6`@h?W{5MvSPIP%R!2M69Ak&12RchnAY(hlIo)v8#^Q zwHj4ajSqrWDTzH=qNgoIMH{15fA8n_NAhp(yzl#c-Pd)!#+4_kmW1}JbORZblVDa! z-=#;*+O-5(U%=xY>}S3|H&ojJ(7xrkT44X!$;mUm?e{ri8qoFu?#whs$o6(>lm6l4 zQh+KqYYSNLrpLp!+Haws^g6R2)a!rJ>pELZafbafKQ&@>HtAx*ym`f*m^QbQs1;0` zZPHP$Mj4xSe(QQB$_5o}(Tmq0zR6543!3BP+2e1bt zcLh)V!lD$~ZdG6YFs^oldNsRnm@=gj_)T&?<*JujWid@`5Bzd??!dzWlQ$je{JwDN zZa|Qs?ZoeMe0E_EKf`!NZyss=NHFb9aM(0ZKjBLwxCmFHLTAKUmki@`)Ol%M8q-{h z=d5Y&UxIf@XR2vX498LsHw;siO61fk=ps?N?>sg-zLT-;YgMU{a5$5*v66Nxxu|6L zrH&23u*94o+;J5>8dEk!8)U0j6pmqX+Skkyhyv)GokjD9_lCrl_nRIKNoc7#h3p;O ztZ8=5dB=ioeefxS%Vgsce@`^PgC^8SX^@p1t<)-MMd`YNb5On#v5ipy2G2CRrlvYXmGcz7b(DWb90~& znA&v}nJ`~!r~f5&#zKS34#%~$${Ls7_$SPnC#Eg z;-cpp1Hhlr4;j7G9Nw+3-&pqzgPHuieM(pTOZJZWTe;TNhKFTPC9Sj-&H#kyDR6mZ zSj)v>b;%(?L3}m(K_>~NZpNXqLp${z zkg5=JAuD{G& z;A<4Yrcm&ow`43N$#f5jQH8oI#b`fe>5ShTBn#!s`!CA3t@UkveGF8uUK(?We)Riw z`A3fG8DXK5l{j@H`^IiUygKm&##HM^0t4N_@6|`)+~*e5lObTYQ$+#}2532_?qaC3 z_a4>B4i1jE&T)56XL->V$xL@@V`pG(Esc9R*0^+?vghW|E4Lb0>j~Oz*qsI;%EbE?t}cX8yC}qu?^b&9o0`vVkQql>rgbA4 z)DQs;4nH!|Fk5sch z6S@>I-Ipjibt_)p&x6}rn06}jMcw$_nRrTRTHy~O;`#J6Et_=ble4EznJancCEl`V zE)Hh0=_v8Br7gr}aa-ZgCRUmE`Dt*%dq_5MXzIU+gvkQg%ES=tN5zVIa+fnk{%NjQ zFbpob?HM2r7HqU zx@N|`x{!CR#f;Zl8cHchy zA`y)O*&JxiF8)5JXi3d*YZ2I1UD=E^B!pG>?Nr<59jjIPKhipIyKl$YweDFxPBoah zvnrpgN{??(Zm#qmSL^S~2io8a=^2b+x_t7}$qxl3fPHL!TN$+M3e)MmU;+(`z3X7= zYbN5lvkBJtpmZnZas|Q?Ci-c>EyeGQVkumW7DI#~4t?jsY$f-=VOG<_^?WuR?64zi zjkY&$F!{~M_TT3&Ko`q7+_;*y{}_Kxa1(;twUvLM|MIIUyt~MHZNdJX<0bVC-*w>Q{krrpv=ho@3yT0;{usk+l-^8b^ zQ~xT*Yk$YM~k6OK` zKt_d5F~JtU!EjWtRcnX7t@PaAJJtsX)(Y0ceP0=}n~rfo6I>!vPbRCE-HKV`+6XT> zUH9o*Bv2v$F7bv2)EZ0uAYcj6_6D0 z@A(EjgZbWbJ%TRoq#s==-&iMgs`5uY>7 zMZu-FQhi^OiN1YDw>FTN@CPPMu$2n_;QfL=Cw5D#Q-ZVMW@+C>^lheVJaFKbw6AJ) z&xsyC2$!&0_k5&IrNjayFo3DAg{*s7xcolH)3k;p>6YIq-)?+Sk3{>ky!QRH`-~Hr z%~^G}+wgp2n?m8bb=jMv7rBv!_CVIJHhSU>G@6XN#T1CMuOd%Wd-Ga0biSNiE(muz zJN(ZR{qrXn^Wd}#D*{l2wr^GEhCb-S^!?7-N8uteUABjmf_Hpw0sQGK z{JrjUIs1?rf1^^a*C(0BZOuFvF!r)28=_O;cO ze&G{|=q7DfleK#l@6|0_URIWv4L|0dP3~2!iN2*|gdXjkAk}u=NQV(ZOIV3YYG$iA zn&v^hPiQ-Pj{OjqG_A=%zvh&GG_80B8=xFM5|Pj2);!M%B^-tbT>olbJ*4b~3U^HM zx@n4!@CPN>K#Zh7d)l~U1yt}PD@N|t4xj7VP%C3IuPNQ6$K-3{U!_L19?~5Noc|r{ z^I|s_#*1p#rVS(!o1T~Rt>~cmzz}vEW}&Z6)nDVF<-#X3e9pUX?Kjd5F>B~OOJm>9 zF9&jas!$1TpPv6`zeFn3{g246lalTSZ6`{;-?`XPFt|p>ugAjRo#Lq_#H%Mv{T2_~ z;TbG?;I1)R>x;X(kG%H-J_o0v%;erDYK;ci^245$(<}b7{~rBDi1TV2s_$;^ z^DlQd4tlff-bM8NGjJ3KFoUWT?gRk1L_0J`I7C!jVOE`;KHJ_$`*)C7TLrq%=*^GP zitAIy*!jbvx#lTo+OIR-)dm;OvtN8IE;GmCYBpI9+Wj(anQa;>q*b~^0rSy>-I$Sa zQ4TIp5ya+(SjSAltX@7>69B{VxsalwVy+YH$3r#H$d zwHP`muBomLQ>lfuRPB|9)V|p2(VW+qsugmA|E%|m&k9=s=m7j<_1fhhDBb1T5*{AF zq{_cL*0IiI`uhvEhLPTvxoIo|G*X>S@vld(JAEH;A?1I&1Yhs=EJ%)~E{qY1dED;z z{yvv1d^d3MlJjE3U9@@HmWR_;!d7DV1Fw-|FW@8qsfG9eG1*;~(QUMfD{aQb~6MJNGs2SgDFs8|L=}A{9om%1A-^l5J&;R`!81z5GruE8-JiV}?79o$vv_H=Nr|H;ll8{>3@=s| z_Vz@rETYfteB+!l*SPS=_;Zfb%r-R)m(Vf$$dH*;33=^6R5ME{d65OZA!={@=7Qto zUad)tc*^eX%w+A%6-|w|`om{5?v|z>*(OGsSL6OnP`o^n?U#ewa0@UUpPaOy2+usz# zh3rwU9ja@_i|Ab!th~HOYoZfkFnU@wWJjPg@pV*qc$aT!3SaA}qKy6EsTW)LJ`pAe zG&U2@zVYlk|JnM)cV6=~LZB^J{;mBuC}BywDGg;U^M@g|H{cX%DPPFK!oYSb^Apf# zN(5JgD9;Yf*GeL!Or&}HOt=sND=o7QqVpm4iUinA}` zLuEBk>o;aHj(pwNv8IKC2HQE z@sortxw)bLbr(me=NakFCvGknGw zzGC{;_cRgXVjRbowBZCp=arQqS%XfXiSbsoskP?`!ZUh=MeLNj6zCjJ2EvmZBNy`I z@>+rs{O_VCBk_T+guc)i}@1n;cZ zeOY3Odd}`}!xhB7?q&o$Y}nf$YNEIHJbe+rCR4$wj8R+=C*#K3fULk7)z6f`zuU9X z;Z1p9>&A>G+Ui2~MXUI>G#u&Y7vs(na?COQ*|WJ1Sc)osU8_vh$acoJp1NmsrJszq zS14HkgU6+CID4jDrI`Y9l5GTa#bYJrb@xaBcdH*UaF?Xv-J_G z#q%z|(megu^Y3aY$H;0_b*4ZCUHz4Dc(p^#@OnO4IiimgX!hcLC#u$lb$WFqq~){N z+ap(Z@9c`{qHEVr6Cg)Ce2HkVU?Ov|HNGemhqrXSckge@8W0jn!hsJ zf4xvKKR@bB8T}Ks@azX7Gp>`Uc6{ebpNX-|?UTPIT=7KKo5o4M zq7pB+ef;N)r+mRUn~Hz6-R;maSrP;1szxjHgC8a zmpu@bz?pS!-_%J7d*}k4kP(k$YzlAhNcUuxqC0ROf_}4osI7txQ z%Is*A>%t%yAHKzWP-Q&m5KYm=SR9-RI_ZS(<=+zx`;f)F@`{TN$x+*(X?0b$9EJ{B zofTf_42c(@?}hbm)4SC(;6()R8j4_nc_s;Ku3hMr4R8{sUD3Zn(+OgESIL@!>Kn$a z>gF_WzPtaSRKUitril38cjo^oUN4x!(*h19ph|luS8V&!@~6yVeD^YJ{2Jf~tjT@L zxgT9>)w@`nUI9QreHgNp>yc?j-!heJmZ6xPLZ!(_H=LZ=&@h_%xIbEKFc!hnqn}q85H~9=Wr!0aRM=_Kz2bPM`pPV zg~2~aKs`&NXcoCnw7Z)@!kx5_`j>}4_{{HhzlLUnDLLE9rTIl`UiH^p*0DC@_|S>( zo5yoY`xl@NrsV+;bzRrncC}Tzci(rktZ5d`{0Ij4LFM1!ckr>W-BkUL^Ccm(6LRa+ zq|&rBtYVvkb)b1Sjs_DMB}a{K7-$TQ-PaTDt9cqUG&B}<;#+f;wUDMEzqrUKl^!|O z?sLf740Z0BEV)uqa<6X#)RPc@>3dqsVNTmPKlceX=YYRxHX}X3U4hOwO%AM9QL}gb zeJ%}t$A&s3k{AVW&H5>G4rOs|ZmDwZXbt6%-4sXUWS7R_Tsby;WG8r+ioD#Tw-_``GL3ZP z-KB!W;NEn56<0^KPh1jceGvks$gvO8j*Mon2PZXiew6oEvm{n@rctJ?? z)sTyXuF2}nFac^5wSN4*N(?@W&vclWi`*6NBw!A+PmiDjvMv0i=POCQ{hjEwsTf23 zHLlqvIp*GE=W^R|1zcg4c<&j5xnNlJ8uN~SA}XRRhQFSI?a^gpxY3FUX7OM!tdD$m zAwJ-^;zclE$9kEH7|t$QZ&M)Hkdqnm2!Zz(zi@s~qR}d<4%OahU8M*71ah(TGUlhH za6LXPbtbUsXOeGDXZz5dw>Q_T`m6=mn7}A!%-fkTN-C#wepK&el?H29IM|7ypS*2C?V)b;HAG-`BZV|MAc z9ORMV5btJ!k?4Ge652f+#!n1tN@GS~jo?G27v^U?#W4jf_WJ+qo$sAO)84&oHyd)89%k3xXGRQF{`&ss*UKW;5PjkezDC+q|}f!ZCtBNq;QsyLJ_Md5N@oIW`aVk2JA zSd88hBf}s{T1lzzw~+bvJC#Dzk!qfUva)xXfg}oOyrA< zXuP*w*R^V2PUfems&7EZNQFEzdSXvALv@d>u%XMZg!TQ~Ss&s?JcAoi!#i@QF_7lD0Gr(uG9k{Ml)k_>fFB9M(KkAoz2*?BJ)0 zi%wojobMD}srE%AOO|PhajSOKC`caaSwoA#iy>{Z+`^+Pb&L8(hHJUzR=W=~>+Pf% zGLBJ>v)1%_w?M}px$eJ~CP}i8&1UG-G{yAKVhy03UG_V8=c{IC4|;RM^mZgg3}(QxX{B{BxbiTGPiAi&Gw!KI0I3 zEAKlzAXka91~entL48p~>FhMM{^2P5<5^wllPI}F_+kceXc^50nWssJd0?^RBGcy6 zJa7iRmZvOaXMpO>FnkazJ@KMiwXM#tH&>?H5wjx1sv_9P`e_gKy4N1v++6(139wtj zE*>U+Ka}I?VA8uooDBsE1wLRM{wwxFKtxz>&eS*T7Hqkgx24YbTYkxZBUJ1sKLqd5 z$Ivo2HuxU)@xczTL$0ltp9qT~mv%1|?g$4J-XG`lw+amxZ^|h2Y_tJ~xrb=yh(tV9 zY+cF*m@^5+V>364kVvSE_dB!Qzz6n=2-PSASXX{B)dH8@MpjbmMw77{=NlnJW@u|g z<5dd}&rMEWh>)0O>RD#4C(E^aYO7a9-`Pk`<27k>b9L{%)(XdeCfgB7f%~&Evs~Y0 zB+EIw=BYW%FA!|X#Je;!9kg6bIty*L#t+ zDZIM~8_D6-vN}U6%Iw?aV~d?=Q`*dEp61xLzLVq!di&WDz>dTYEQHPkOj)3j7@HG7 zI|N%#)(j2cJbo$h2yZN$95lrQlXfek1|PhPtI!S*X}%qD+arvND*SW!C=c2sw{ccW zR}X!%k|;S=DI&+_$q@PFs1o$O4`8~A6*5eFd-^tSC-C-B$@e8`yA;HlG>K*n=C6K& zg~~vRsAwS?zo3jTKv^&%DWS|vTU`$zO`hJW+FArH!GV0FLkOH=S5Dh5Yi~S-JlVbW z^S@Vup32VJlxYQL7-M6nY-V-Co{v~peuE5eCdKD;`=_{&qyLf+pVmyy`)1serKf9O z!D{O|@@v{46L`k^zR1}8*yQ`=u;2CuFfw0U#-!Qg&yilVSzCe!KR}?ts z^p$FPks`qyhdx;oU*AjEIn-znzTUoI;fS1wM`ldBhLC4e^t;zLKg-MSXENRbkm)5b z#`GZ_oYAHyv2r*Hk*U8B`Cu?t)@5TRp_|Tl`69n1Rq4*{zSC0=V`;~mL>=BifLx42&ozlHE>yoc) zJWa9w$M7{FdkSw6Q`dQY%CixEqEK1u8$D%xs)0BJ&ek`{EnL^ghWbK`&#ufdLM;wM z4oaV^H+_cRQalEN$iv1I@u51YW7(R-I6muvlE+S(Km1X z&B3hcQcFhOy-mdrapLXk-xdw>k`WZoSh3rf`aH=4W~$mTY{!9W4cnN7e-jZKSi#S# zV=YymQz1_jvS9o?2taB>XqGW#7}_z?u1#-dz&@E?Tui)^2hKLZVpq!(CnXxMo$jxfmkmX z74Mksdm{F#zo9?FJoBfW#5{Z8KOUZ` z8#G_0MbTXR)LXm7#`ZEJ#%+V0lH2x&&4cb19a=S|OWZ&BJ8nw|PcA3YFaE!o)e-X& zsSunV4AvlL)M%k;3%sc6y%jyF?>MVwth9s&Eo*Sw%QW7nO@&4pALpwNGkLmH!PYoA zJQdD(o(J=z=skro<%;4!=Ic%%V#T#N0mRNFy1%{a{pxBrvgJXg0=p`;*myPb&}n^s z*7e$O3xLeDX7-XEY?Lq~Pf%xkHl3&g;Wmq`2>+yrJnzdcjsPdf#y8fMve~W$<7x;XE^{HzkgL*B_DTEOueh8(fepnHQ6^evC##p^%vnpim?) zYluTpaXCBdcyqt&fKJcBfj|M_5SMT&2n~jGff$HdjX{@5szNmimimljWPLK=5=f1= zM|T$vbN=o1!L{;^*#ov%VC9LsUZ~gDA&Yd|6T;PH-iyHIMvEMeWBo9lHU~IOuwj&( zNs5KmRf*uNFEfX7=^QtDPq%ZGEUB-NCRBxy7n_l;IJ8Q{LWp&32m}~XE=(k*JD{yW zUk3*;(Y6of-*K@XtPgpTtzb*Og{afKj>+AlQSf$+wYI!-$C>@lg)vz3?SBh5S1d%_ z)UakKGb=~E|9pQc;JM{XJZ!8$O$?j>2dcAtP1I;}fgvS)1f6`zKX4VgR{_F7;S8c2 zu9(jmlN-ie5Tx;?%JF5FF-Y>;-lX_4g-+iM-V@me>ZVyt&Iz*iYB6?BOn#J$>igt2 zt*Omme3w-F<>Qz4*^Ebc_sOu<9DXUirTd{(1qq?#f07)zQ(-3!J?@N zDL5ki!(nz;FMWjNSkNYSZ*8E6kd|o52A(h&gvS$2@PQ``Uji8^drBr@oFlxO4U-ot zxg8I}y6!sKR^ds!F6Ifduib`+T;vOgi?coA`&t+9yA?DFwNK$kId~J!?Ur;q^dn$H ztRw~~<9Y(IaN(C+%@7y}@8HuEOq3g z1FHwf9cn2WUCxe<*Do*n6fDFdj*M4)PK4JWTE}~!Z!GTC6E8&D4R4g$ z8OSP0;TJ*=LR2iu*}3{`$f9F)<^@hVn{qEMh%&4F0a?9o6c146eI3mBA!bxlu)&{1 z3W>CgD1QE`n1~?6w+=qgaD&us(ANn9nBkgQFz#jFdi&j1108g~8Ci38>W7nFv9X~V zW=#Bz<&l;Vae{8QfaoUaCUDBSQnPF)|W#HNsE-M>`W1Xtg&laaxy z3Z4cSM`~6d`62OHwa3XriLQtqME4M!Q|y~fR3#^3!!Npd94H#VN%FENJ<$!}CN`^s zZMJrc*1BvoJDdZRjqs-!=D3eGS)S5$YcKb;Vi&f8^(!XW5es{lGKV(@G#nhsqt)Nzta~SM&CQD(7^o4nGN8^=Bj)P>WFj6|2WJR2%F8SvZ3w?9OlTO z24Y>D6$uv(YV427XZB5&8K2vbnPQ)AyToM-m*i{(AnSKmXLcbwe9u$rtWJLYtbE8; z#^aHQP6g5V97NsQi;ilv2vd*?5G|f}A?0`|J!};we+iq@*b-C1_o2?QiYb$U>LuH3_sXihy`QIzt6@S z55e7Iqp?+)&c<1LmLkfPAwdZh9ufGsciNG-5vxk_Ph{SeFBswLH5!5PjvoJ*?PKyh zBVSs_H)TFzCQQDUKX3_PNmZR*fiTFd>|IbR>wNLOYAC&=ZuJjiYvcr>HmOXXY_0x$CJXzPbhbOEA+6)e-xm`&}7A z5#^OC@61{{9~kR5qbANS=O3gHjGA>)q8*R%O9=-_6t$KDHgH?# zfMmd`V1C+N989q!0ZD}N3(vjH^%EU96KLQqMGOef<r%>m|X=lgs(Kje6a?@ps9m z?Gfry8@x;UiK+YMJAwy&4}_Ys0g|YowLml2kd;ml5Sz_8;_1=VpUI5EMA<}pB>48R z6WGCaqdjnTrnPi-PQOwJBj%!(DgSnpxK!D!TaCRmiuRIZpK=R*waAQv9hGXBvlO! z4Xj4Y5&VcW_NHj3e}eZ733a*8p-bl|STug3O+YWZI0!mgUaKq2mzK~Uj{=LxdVB(y zMz6Us56U^1>|pk@I69xOAHSD$&iNJ)5+MN=qJ)wrI}z8{yb+zG6|g2T+`E%oe1eIy zi(p%(FHPJ4>1O6xvDBQ*`T?8Y5;3H>DmTtLZN>yQD*&-* zR+r2}*>e50u6oeJuj^uWt~CAG;9{f-8Sj)oV#`@&X$n_sXbf`*7QHenS^%Hf)8aZ3 zMVWkZ8il7O;u5h?=^RKQZB!m{z1@KS&lhkBNqDfIN;gtm1uYgxh&F4D$=r&vQ11if z!hf|)KTdel;Wur=B4~GrTHafq*L0n7GK>@|b+WvE6sP3dEKF| zh&SVuYekk}x#y=z08DiPzn8j!%|+yL0+T;0R--!JA7(vMYcVp%zK(vXPUG`cdZRSc z&@Myc(ClFzSQ8qcVn^Is?Msx-6AewSVSIaq4Zq~melRvF2bUX(8MsJtIuK?W zUx)aYaWyQY>`hEd|5-qwrX29=1?Z|F#fNCk4G=a}9Wx~%JxKw@UmE#$gt|Tm3lGHa z@I?6KsFTeVoIMMpBK3{#?tFqRe0LO&E!7&a=&73cTXRNq$z#s`EJM`b)+TkA&+x)) z1xVM5?g`wwUqudtL}w@3xFcjhW}wLewSJI6)FWSN_A#;chLQDm*|=~H-RB0;<4$n7 zaq`>a!g!&IhSc%uyZ zA{t{>1u&5@)BdjDh=NCzhjmG*h2M&>;@JI5Vd}D+v~|iaV!X^pv4{C+2y3|MNP*UA zdI>5co$VxxQy@wgK%=k&9`ax;zvQRQ)jTXycYqmEety8Z4xj?lugi6->x%FL>Ed^> z+cFH2o%@j^7FrmTYN=E6d7XLf7bWOa*mG9fW`ODk@mpo`Hio?FZ*5=+!8p{MbW76y zdNvO0@gmTIV_uhJ&~=63v~$6Mu*uw++CZmHfuV9j=gGzf4*@sKJTE}_35GbL;;&_> z^V1wuWX+Oy33Ej;Blk`EWe!ssw_mL?QuQR519bZRcD+U|o~IuTT04=b8k&@VdP#{T z^DWNQj3RIXZ5C|U7TD_a9#Un985$ZiEM0KW7FPq=B0xdlKO#xh82RzA>AnkFqju_T zEgVniPU554htYs|x)?1nfeg~dsemLr9qn{%WKdFVI7{Xn6$`0Ny- zy5rr{nX{iz6`g3mvdIrpvtl)cG_C#Fl=jmRl4@`qJR=YWhI%ml7^;`c{buffQ${t*|7VG?UMBgK+1ctja$!3C0Ky7^rGY2ybxhH9&&)tR4zvGn?TeFA^ht^Mp5~Id6HFr1;h<4RNAx zC|Q+zTLCv79VU~c21I$ZQr&i$9{Hk>B>UCjPhka6WG~EvS#Q6OL<6#L2%ab}j{va{ zTvOHm)nkb`Y5JIh0*MZ?Mi#*Rbg-3G(r+Ssj+ZjQdKp&-z2V8x$>TlU9eg$tK2MTa zOVULnD|C^7z?jZgWhWxBQvD~dzoWo;sEAXUD`~p!;rcHMvj)oSN7N-5pbJgx z0f2J@nTt5YHL{9fqRF*XoOy)Rm?|JphdK~E)~H_)h-EuQg^Pqk@YY7BVTdWDmao{9 z@<<~z`lrWo7$V(8-pVw`egg`l2*1kc|8Z;>3BXmaOd9dy0Pc%yzU?(=?3Or7uA(#p zSG6DT9|_q+U}ph8fkZi|bWs-py>@7=NkytK(C*9nBt7EfJBCw*JB`x2RS8~X~zB!@YqhE zP$b|3jE3OzK(4uvML*T40HDWf?n}i}h`r|z&283vJkDZK@d8g(jCJxA-$6$A9ZKWH z`LPJc=}lRE-ZN#pyEb1w86NhLRFFt3jvQbUhTZGPnm3&((rwG#kZjH-KoWt|Umz>P zfNE$)kU_-Z`NGj<78y&&8F&Dqy9CwrAm{c#cGbO1aP+}dvHrayKU+Xn z^m%Atws7OTT2rCm$u?tsE%p<`?3)O`lYiAP%QDA*2)1(M`o8cOF+NPxhP25s0IdYz z&;jUv0hb#ODC7$i4HQB?a2*+FB3&))ih7kBE?iL9J}6(&#-)%aftV4FPEj z6R@1g;i20gK*nS_GExzH%lg{ud@9nw*Brm??iu027?a)^u8?gJg)zIvFLuu9?_3qH zDpj28%#FL6mp`}-MOCGdI|FGz#&=u1Gfu64O}03JS34hi$O#XLy*;shMwA~KM!EXp z34C#2NGWh84Acg|VhF(jND&cu#bICwj?t2Ug!ao62-6~}0o6RY9{!1D?Q@uH`x@c< zgBvvdgh=;4N_CYS#vB^iKLLIQt&%itCJIbxr4xVMzWcI|=@A&5iE~Xey+=nN)cR$C zErWUhAEZLnYK}S>FL#L|zz33>AdX9gpQoRPOiAZ8{~Wlg*ku)FLW{{75TuO-&5T8S zgO-dBBqVu!6zejS?^wI~Ia=u9Be~-_I?By+=n6VjB~9>Cc)X-f=^#6{L~T7k`dGvd zyCjosmWaigfRKPSk?|N2!BY6(-^o&eP?QNW46RsEq`AXn>PJ_ymc81%#bSSP-&brVucd z5!Dk@mY=!;Q&t%fATD(cRbK&Fr)3CyI~6v)!ZYlN`jK&wc%}touOwX#rtG|3 zlL%^4xxYulg7Bs`U?h@Al%pVxt#I|%@(`D@fqlCIGEh`mu3E7S0OHw^9RJu@>+-U> z-#XAG+*tphKl?beUFZ2vr<=@_UG<4_@k9x;#^?-Wj0x1QJCUSU@NzhXw)a6gJu&M@hBzNaOGHNZ?af zVFI>QNt0h(Y->_zi&hPWWxcI$is=c=K3*HPl6JdRSlF=R5a244_nbJm=>Gxc0-+?&xYG24&>5jZzj979q+FvFXNXM zt7dy7yNJ2CLO2?Ao_c?URj5{}*LoHsk^jF(wme6efBHV_?;NB&6pF=SMenpDXZiU- zN`r5e2ju8Aha{e)jVr)iaysS}n25v4Yuv1?D)M4zJ3E_C^$KFx5&m$=yy=KoSjd~V z6kJS`dUMCZ-Q;&E%X(>!lRqxZaXJ$&tYp$nbkH6rS9ZY;+1U*otZ5rUh>k!i0ynaQ z91jw~xko0Z8BBOs&%u2(5bfe(Fc8)X1hjIgbvai#Sn=bi=ay6^n6g{+``m;7*(0S_ zqfvfwr-=M0Momk<;@OKceI3%t5avW|ldTuR{)?;SOFCpW2v4164W6z(&Hd>C90)LQ z+5l@92;Pj};_Vjxd1m?BlafquGSM7|b%&x<5pJ%cKe42YG@{h`(7eyrHsl?KBd__> z#9XseHe#r^ye$R&j{x$XZo}1|`cY;go8N6DUA2;LM?4OvDGaTJm913W<5tpZ5txbQx-Ci`W}dJdA< zU<#`0m*EE@E^yL74(p};i2utG=$B7>%HK&8u*j+#w43r>Ce;IR5<>I(E)VUIcX-W- zl|O?%nUzFr8rDar{6uLpUmm zuzx*AuupJ5;KW{#Nyf(dRRmzI5z2`+>WWlRoDAT&mWUli*sperRKVfv@K23~NglNV zv5w~WdN{=+R@5xj`99k$)q2gqs0<4jdl~(@wnFy&8d;IBow~G2wcQlFcmh?@jY<&Y z=OiGn&G({QGZ>nI3-^aE)E@l@Yk)97_+laXkRmb`^aCvt*88BixTy0B`cb&J5W#s7 z%a##QjJ&0werQ;QBG}1fB^A%A%-1S^)9IMKHe_GmXf5s={oigq!1(MiI0B#0N37K7 z(s}b|K}O|WGFsdOgoBu-jUn4qA`MJ>X=94D>j>0c*!J-VdJFw$>&cGg(x4o=D!6h#*Eg~KVEi! z+jptbx{d9w^(H94x&q2Ny$y0tzFKr9nYt4-aziv+mMuOHVV%7+1l#1D)j}fCW`p}}H zRMl2}e(C4?$M5|0zV7S&zR$VOb*}Ti&wbAQI)D4A2=6O26+Fpz_BI5yeZ4jWxhjkt z!Nqd0P~oHAK_{DBrWB-RG8p?5bFFZf;;*2Oj~^Ys1O^V7|S zTr56qR@I*GcK-W1$uVO;HPwFnFMu*V&6fB{YC4iY3dE&pV)4l`$38OK!W%zkrAEv| z5ui`%Jl4neTopxSg;ZbsD!p;#1Q+Ca4EGHi`JO!=DRH%7UGpjqiIE^px^R+${W}M= z*vcSY*HV8;Pv6HpJumy#mMps-Jgd&@Cx!W=FIE=n1ULJ)3(KI!k$xV(*o$VN8iW|# zAA%5b;ULwMgoTya(O4>|NE{`5jcWJ`D~&|{tZfbRsy(T(FQ)CCB?U`?1C?NP`~NP?dK58L9pnri#mfRR zm8%I#(hCxhz1?e1{>P9@ZZdP?JAN!Bdi<|R%kyQ1vf@K>CZff{qhFa!O1oi3DQr)( ze}`0zBD|_UH!wPSb&3k;ADmhex?7ETZS`@p^JFgnJ$ykp>~qSf|Iq!Cv$R`?ve(;; znA&#s6&&@&lAa9SI$*-)Lw~_>jqi^O9BsTe2ka`TaEM%X<(Q~_*=UO8TP?Si2Le2K z*0L3Wn}a%2we+jw_49AYZq{xK;@EqTkm(8C3Sa*l5M6T@VdPi+&m5f&wBl`NOqKhq zF;u`|S1hLjFp;nELFeUK&4tO_?QXBR+eB1%m0g+NYr$HPrO(Giazv+XTP?~i2@wB} zH5Yw$K(})7c5ZK#aG=@u^QrcGpV2`D<**RQz3H_Vv#OmYQ_*j@;3RZY)vf5q)*t~h zF7@_pe!=M&mqDRaV|*?2a?CXMEoiw7?sP3Jn!irVyNsmJ&1Hb^E-RoB&grJKwpX20 zY7ei_K)Wr@~?lY5y20Y#!=l%~Q`IsHm6n&S0kM{l?<4lMzKba*hnSSydx>4<1Icl^O=lD&l z5%so*yzoWKV>ogV4Bp&6CF7zcfD>K0=@K&&w(X>;@4oW7W@6ip27E+cbj1?A%8@?r z_aEN9oU7gta)mY1G#FVEm3K{~ZJ!De?~ElQmP^qX>(JK6DmK#jk=DJqUdhpymj)21 zdDSVZRaLa~$q$|2%gY`_9zJy;ZyC{|g+(O#C?c$S@3%nC9Sa}aX#vg2!WWtEzA_^Z zHW|I2>I>}kCRdxrO!}~tBWdXleGW;RE#8VXvS3?_1CLGbnB51+-yZY9^2(iCu?_T0 zhmlS0O#^2{X*ImOxGffB#1s+sH89WuUk&ArE|*u%nM>RqvrN+nAq`bHdNY^anyIOg z18-E|^$?(&S zmpZh6-c?q+x2#|tACWOgQL&RGGP=tjg$Vv?^P?6>HjWf3F~JO#8nY!e6XTRUW?&3X zP}^A%gIcp{L@~F*=Xt*^R=Fgk2TG5@ujBByjB9A6eh01zW&2l_XHv!TEc6G@Ht15R z$8o_rgKAC}mE6b)O!S(Pv1j&INN)=*AWfw$egcrk2g-!G*TNc!_Fjv&B4!PrK-PnM z20LY^}6|~X}wkIU%zqY-ULt$;#Ww9D@1eD%ACj!@5 zP(YHV8$u;x%gZ1XH@EbSJd|1?NJza$D3e-X=b~a}PMLc45oO8ZOZKhKu@MyVnDl9k zufee$t3z>9y({xSF4@kF2I?oNJJwWf3v*V0S01bLuD%eH2F=dJS%i#s%AZ+8zf_oX za9joh-m@5MIkobCK(#eu4M}xc&erpy<`16U)gVwEDnQjGxa9r1{`wEq4#c`w?cT=X zri4!8NHe~Ld6zlk^frsU*@1s~vOm51s19xGks^OY4D6K?H5 z@^By1rZ+|LI?BcozrjlD7en%A98s{7~zOD+oLnbG8S;ijb;@;k(Z*W>3oDW?M95u;) zUwEsVj&FW$Dau^mso|&R^VrBCpVH)09aoLDcFVi*>4RKBoYSY-0}w^Jl797{6$p8XrL$);8?%H0cin{WUXc+~R4A+;o3zQI`c`hSz*Ae41o->Kh>9JjL;hA9C0zJaRr<2jvfr8&1BK1^`cR7&dgZAV zn~^5%fvxv)K=T$odBhNv&0K}2uUIma{lQ||ru_|$Sc}5F=1LaP=@o23LvsJ>iwZ

i|Xrq$n|1K-i#n(Y%-3hngw>we<&Z8CzrL1>P)`q`nYo9B1&*fQ0CXcg@N5EI$sv}wMtzz6W`(v7Z9$(K}*^_^ll$|-as=ZX< zc5(%nk657)Tino!o60-GrREbBg~h7<8&Lm{`qQB$)Y{6GWzr11@3No7qui9VZe=*#kN=r#t35t%9FM4lW6oKi<$)QtdGc9pnv#3ndD0yBuIxW4ms=`ld0h}Cr!(3+_IkN9Ira#P+ubnju zTE2EH{y<3Ydd=S6-g)>)G0HmRuj{JHo)TJ~4=0dgB&6Ez)yLmeRPg%bf-ThL-jrY` zI$!-LE-hSCpvoWGRvmR87ycBJd9kRweHRId#Alb-{AByyl zfd$1k{Vz18H}WyKaO{KOF=w5Q5V?o?m(pJn&!+#^PGmh0gxhCLSiLrHsKrhkvq~JX z+!J=^_12K!9a`r$Rg63wcsF*duy16-N5d_lU25K2LmPoWxRo)BsPt2G;5;V8jyU{N zykX$T{qIoLgq8WlzS0Csr2#81IR<|#Z^?M>oBdji3HegWvTJKA2{2|}BLZEL^$8y- z)@eSa2}3K z0r#{dJ;r22>munn@}lwdW!4FwM@IA%Z1u4=hJmn&)1nK4`y)sLSb}4{|M}9is*fb) zG0=Q@g8QbSH!{vga^kU!suLh~_HuBvEk^&!iDnvD;^OU(9$6RqM(9uWi&Ta{#;L^w zquqPds6x`U{(osv?t=OG`CC}?@_*;=qGQ?UN@8@r*%|##Mo{jjocLEAOLim>xRQ0F zFu>D+iKsjdqK7|2a9*nx_UCK>!*>Uma_D*sOUAb$#k)ifs{t$1Ax|JsmA9^iO*r*P z5~=b&07{5w($>aQwj7qin+Mu+idJafZO~ar zu4xsF@5G`QJ^oRuGCos&maNI?5W5bSg{N*lvWUIi@Zu=vH=$~_Ep>1r*76b^A&yVr~ZC}2Q~L|Bp9eaDUFVZQ?HCmgEcI8O*a zXDl2JcQJkKtf!)IZc%gEp7Xov@3)p22)XoA1mc`E;o*pGrtG&jJln?~q>{9K${uJm zS!IP~RZ)DAmJCa+C2ydkhf@WMi$iuZo?Ht*&|Tmv!Lu~ag;DQru(=Q;SO~FtnL&nV zBi9@jX-f-$gwmCY75sio4z2F3=-@gx+aA%)_}TE!sqK)1r(DT==knaBOOM5cQAu)N~-f7MlsuN{aWfi8W*f8}g(ZHORoKR$I z>uIR20_r@7uPvQ?DeV?#gm9Oh$xhzcFN@ckC@`r=jt|vc57Wk$oj3E}tjy~v#Xr)3 ze+kD!W9^1k6!d9RRjgYJ5zzcM6Ku6TQ(W9C|?QSzD3z-8GT2(x$wdbk7+eX6xNANNh0+LyQZhAV2Nl zC!_J64|0k_(Z2=m*2(@wDrhJZ_BhZ)0kUNv6T#+} zd$g%$f{tzT00MSbaH`g|LqSwr-@gNg4qPzM^TE+}UsHF~|jT8qb1AMLY>>&jgpWZNC4 z-ei}>d(mG%%A<}g+8Z!G{~HGLqj%%7j# zFH|W>d&*0bhFaR2YZDBSL@qu7nk;-J=KRDyAcC{Cm%%)8r#8}Bh&4(s;eSg18G zTjlNVhG)DeP~kgQf~PERLhI_>uWCTk$ccF#D1rC0_I^;}s}738hM3VmF#(WDg}9x` zOpUth>^4Iib}E3~3x%~eS8A`fK}@=VOct>_3O(lG=#(cksgGq3{UE4xczU`pMWEdg zYh043N?%pZyv*Ifn&c&s7n+9yuc~k4?bq=oSmwo;T=LfGqlm%Bk8WV-o>4S>VS!$Y zTGoc}$x$$I~iRdqVXxz zd;gkooiqhS*J+-3MXo5s>qQmU8#@HuX%c7>R`yIX=eEu5WaTB1BCyEIid_9Xo_(q& z_W<Wv^hvx5^f=0v<_z2Hr%Ty?$9875O>dRRIsre*6^(W*SMlV-KBO)4020zQ zRyOT=d`CifLoYhK1+uOxXvXtY3+3MMvE9y%DR?xEw#&L~_1lt#jz1_5-^ku1$?@OG z?&l9>7K8D-$flR*GjKd2cMEX5{CHp%y*E=i?(wnIBSPJ4y)5Z2aL3>{4#pnX+TTAARYIdRqepwc_OFH_lpNvnYsXMaDc;>u>Q3|_Qg+6OSXiyF80m%avEysylnc4^#@Kdk%Gg% zsM5g-7~Th11})IPOvpZFD$%M3R?w+i8?(MxUKb+9u)&93dd*tN)0B`Ml%-wT7|-sn Pw-kI)a!uUezmNY9M3zbm literal 0 HcmV?d00001 From bcf9f07d17418f8b2560bbac6059a5d6009a4a64 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:10:18 +0300 Subject: [PATCH 072/105] fix: set width to images --- apps/pebbled/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index 8e87525f4..fc41f13ec 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -4,8 +4,10 @@ - Added distance in km (kilometers) based on step length (can be changed in settings and is equal 0.75m by default) - Battery warning changed to 15% instead of 30% -![](pebble_screenshot.png) -![](photo.jpg) +

Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) From 6ef60ff6c5eed6c9ca23755750cad25cd6dcbf08 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:17:37 +0300 Subject: [PATCH 073/105] fix: reset width, update image --- apps/pebbled/README.md | 6 ++---- apps/pebbled/photo.jpg | Bin 57580 -> 165060 bytes 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index fc41f13ec..8e87525f4 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -4,10 +4,8 @@ - Added distance in km (kilometers) based on step length (can be changed in settings and is equal 0.75m by default) - Battery warning changed to 15% instead of 30% -
- screenshot - photo -
+![](pebble_screenshot.png) +![](photo.jpg) Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/pebbled/photo.jpg b/apps/pebbled/photo.jpg index d3635ff4dc22e970fa823cf9156b08303ce38690..d9590bd181210dfae7828a5c48b33176c1c080bd 100644 GIT binary patch literal 165060 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%0D;9@-K8xXZ8fI-^hfJQ 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 GGyey8I$%@) literal 57580 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

J`x+vYx@wLq< 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 diff --git a/apps/mmonday/manic-monday-icon.js b/apps/mmonday/manic-monday-icon.js index feba5fe86..2b1ee7f79 100644 --- a/apps/mmonday/manic-monday-icon.js +++ b/apps/mmonday/manic-monday-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("MDABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) +require("heatshrink").decompress(atob("mEwwIHEgPAAocP+AFDv4FDgf/Aoc/AocB/4FDh4FEv4FEAgIFIDgQFR+FwAoeAAof8gAFDLoIFC/wyBAoQ4CAoXgAoh0CAtybCAoJPBAoahDAoMHAoicBAoM54EfAoJqCAoQUBAoYUBAoYCBAoXgZAIFC4AFCCgOAYYI1CZIRHB/AFDcwmAAoj9Dj6mCdoQaBAAYWDgA")) diff --git a/apps/speedalt2/ChangeLog b/apps/speedalt2/ChangeLog index bd338f8b2..fa2e32f5b 100644 --- a/apps/speedalt2/ChangeLog +++ b/apps/speedalt2/ChangeLog @@ -1,3 +1,4 @@ 0.01: Initial import. 0.07: Add swipe to change screens. 1.06: Misc memory and screen optimisations. +1.10: ... diff --git a/apps/tapelauncher/icon.js b/apps/tapelauncher/icon.js index bf323e5bf..25ca0a4c6 100644 --- a/apps/tapelauncher/icon.js +++ b/apps/tapelauncher/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AH4A/ACXd7vQC6vUpoBBDaQXEDaQXIDZwXMAIQZHC4R6BAAIZJDAwXIDY4XHAAodJ7oXMDpQXSAAiRHhoWN7zFLDY/e9ve9zeMhvQCIIBFC5ARIC5oVNC5EOCpwABC4vuCZYXPCIwXOCJAAFC5gAJ8AXFCpwuHgDjCFqQXC6lN6gbFf5gXEAInd6AXVDYndhoXKBoIbMC5QZLC44AFDpIXNDpQXdhoYMAAbwIC6oZQbxhOKC5gbKC6BUGC6oA/AHgA==")) +require("heatshrink").decompress(atob("mEw4UA///sH8ov+8GyJf4AIgt8BZV9voNIBYQNIBYgNGBYwMEBYNVqoMEoALGBoYLDBQILCAQVQBYoOEBZIABBYUAgILGsBiEBodWy2gN4soywACBYcI1QJDBYoJFBYkCBQ2qBYUKBIoLHBAQLHBAYACBYwAEwALBgwKG1S/DC4wWCa4Y3Efa19mALKvrLDfY7XGBwjvVBYjuHfYgLLBg4LEAAMVBZQNEBZBPCBZQA+A")) diff --git a/apps/vectorclock/ChangeLog b/apps/vectorclock/ChangeLog new file mode 100644 index 000000000..8addc7170 --- /dev/null +++ b/apps/vectorclock/ChangeLog @@ -0,0 +1,3 @@ +0.01: New watch face +0.02: Use Bangle.setUI for button/launcher handling +0.03: Bangle.js 2 support diff --git a/apps/vectorclock/Changelog b/apps/vectorclock/Changelog deleted file mode 100644 index c2a6fbcf4..000000000 --- a/apps/vectorclock/Changelog +++ /dev/null @@ -1,3 +0,0 @@ -0.1: New watch face -0.2: Use Bangle.setUI for button/launcher handling -0.3: Bangle.js 2 support \ No newline at end of file diff --git a/apps/widclkbttm/Changelog b/apps/widclkbttm/ChangeLog similarity index 100% rename from apps/widclkbttm/Changelog rename to apps/widclkbttm/ChangeLog From 81169b41108c32bdc50e5c4737375d7883bbca47 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 08:55:30 +0000 Subject: [PATCH 099/105] updated core --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index b033af017..2a8e872ec 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit b033af017f6789a6a7777e6ef1428d94995a9b8b +Subproject commit 2a8e872ecb143a10e53273b4d3473164e104e1d3 From 9b429fff228761d79492dd85afc483cf31451d64 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 09:09:33 +0000 Subject: [PATCH 100/105] health 0.09: Fix file naming so months are 1-based (not 0) (fix #1119) --- apps.json | 2 +- apps/health/ChangeLog | 1 + apps/health/boot.js | 2 +- apps/health/lib.js | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index ee6660db7..2e4b97259 100644 --- a/apps.json +++ b/apps.json @@ -132,7 +132,7 @@ { "id": "health", "name": "Health Tracking", - "version": "0.08", + "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", diff --git a/apps/health/ChangeLog b/apps/health/ChangeLog index bde4f8ab8..c65cc3ab4 100644 --- a/apps/health/ChangeLog +++ b/apps/health/ChangeLog @@ -7,3 +7,4 @@ 0.06: Fix daily health summary for movement (a line got deleted!) 0.07: Added coloured bar charts 0.08: Suppress bleed through of E.showMenu's when displaying bar charts +0.09: Fix file naming so months are 1-based (not 0) (fix #1119) diff --git a/apps/health/boot.js b/apps/health/boot.js index 386d75833..c72e62b41 100644 --- a/apps/health/boot.js +++ b/apps/health/boot.js @@ -27,7 +27,7 @@ Bangle.on("health", health => { const DB_FILE_LEN = DB_HEADER_LEN + DB_RECORDS_PER_MONTH*DB_RECORD_LEN; function getRecordFN(d) { - return "health-"+d.getFullYear()+"-"+d.getMonth()+".raw"; + return "health-"+d.getFullYear()+"-"+(d.getMonth()+1)+".raw"; } function getRecordIdx(d) { return (DB_RECORDS_PER_DAY*(d.getDate()-1)) + diff --git a/apps/health/lib.js b/apps/health/lib.js index 70305bff8..2e3e0c002 100644 --- a/apps/health/lib.js +++ b/apps/health/lib.js @@ -6,7 +6,7 @@ const DB_HEADER_LEN = 8; const DB_FILE_LEN = DB_HEADER_LEN + DB_RECORDS_PER_MONTH*DB_RECORD_LEN; function getRecordFN(d) { - return "health-"+d.getFullYear()+"-"+d.getMonth()+".raw"; + return "health-"+d.getFullYear()+"-"+(d.getMonth()+1)+".raw"; } function getRecordIdx(d) { return (DB_RECORDS_PER_DAY*(d.getDate()-1)) + From 62900059ad87ee8efce0ae9306dd91da41243bdb Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 11:24:46 +0000 Subject: [PATCH 101/105] thermom 0.05: Use temperature from current locale + Update every 10s, average last 5 readings + Changes based on #1092 --- apps.json | 6 +++--- apps/thermom/ChangeLog | 3 +++ apps/thermom/app.js | 29 +++++++++++++++++++++-------- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/apps.json b/apps.json index 2e4b97259..cf948ed48 100644 --- a/apps.json +++ b/apps.json @@ -4014,8 +4014,8 @@ { "id": "thermom", "name": "Thermometer", - "version": "0.04", - "description": "Displays the current temperature in degree Celsius, updated every 20 seconds", + "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"], @@ -4080,7 +4080,7 @@ "id": "thermomF", "name": "Fahrenheit Temp", "version": "0.01", - "description": "A modification of the Thermometer App to display temprature in Fahrenheit", + "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"], diff --git a/apps/thermom/ChangeLog b/apps/thermom/ChangeLog index 6183ac17b..6d3a966e3 100644 --- a/apps/thermom/ChangeLog +++ b/apps/thermom/ChangeLog @@ -1,3 +1,6 @@ 0.02: New App! 0.03: Improved messages and added Celsius sign 0.04: Make temperature value readable on smaller screens +0.05: Use temperature from current locale + Update every 10s, average last 5 readings + Changes based on #1092 diff --git a/apps/thermom/app.js b/apps/thermom/app.js index 145854765..0e45ed3e7 100644 --- a/apps/thermom/app.js +++ b/apps/thermom/app.js @@ -1,13 +1,27 @@ +// history of temperature readings +var history = []; + + +// When we get temperature... function onTemperature(p) { - g.reset(1).clearRect(0,24,g.getWidth(),g.getHeight()); + var rect = Bangle.appRect; + g.reset(1).clearRect(rect.x, rect.y, rect.x2, rect.y2); g.setFont("6x8",2).setFontAlign(0,0); - var x = g.getWidth()/2; - var y = g.getHeight()/2 + 10; + var x = (rect.x+rect.x2)/2; + var y = (rect.y+rect.y2)/2 + 10; g.drawString("Temperature:", x, y - 45); - g.setFontVector(g.getWidth() > 200 ? 70 : 40).setFontAlign(0,0); - g.drawString(p.temperature.toFixed(1) + " °C", x, y); + g.setFontVector(g.getWidth() > 200 ? 70 : 50).setFontAlign(0,0); + + // Average the last 5 temperature readings + while (history.length>4) history.shift(); + history.push(p.temperature); + var avrTemp = E.sum(history) / history.length; + // Draw the temperature + var t = require('locale').temp(avrTemp).replace("'","°"); + g.drawString(t, x, y); } +// Gets the temperature in the most accurate way (pressure sensor or inbuilt thermistor) function drawTemperature() { if (Bangle.getPressure) { Bangle.getPressure().then(onTemperature); @@ -18,11 +32,10 @@ function drawTemperature() { } } - setInterval(function() { drawTemperature(); -}, 20000); -drawTemperature(); +}, 10000); E.showMessage("Reading temperature..."); +drawTemperature(); Bangle.loadWidgets(); Bangle.drawWidgets(); From df810fc7bbf5980a47bfec01b7d506a7b392f035 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 11:26:34 +0000 Subject: [PATCH 102/105] screenshot --- apps.json | 1 + apps/thermom/screenshot.png | Bin 0 -> 2466 bytes 2 files changed, 1 insertion(+) create mode 100644 apps/thermom/screenshot.png diff --git a/apps.json b/apps.json index cf948ed48..836840ac5 100644 --- a/apps.json +++ b/apps.json @@ -4019,6 +4019,7 @@ "icon": "app.png", "tags": "tool", "supports": ["BANGLEJS", "BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], "allow_emulator": true, "storage": [ {"name":"thermom.app.js","url":"app.js"}, diff --git a/apps/thermom/screenshot.png b/apps/thermom/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a12bbef1c7b448624a952f53ac9e9b75cd5a3baf GIT binary patch literal 2466 zcmds3`#;kS8{WQ+<`{c;B8ME4bMz=|NtuKYik#0WVpEwJ%C{53oI*~msASBH7&7+M zyh5dvO~V{k&vG7W=;Yb^PrN_8_vdrp*Du%Sx_`Lu`*Yn{C*7Uoq<2X}AP_m{<7h82 zHvKo@lHy9Ge+m`@^pcm;QApz(^;rl+D$p5y z^@%gX?JZx(*D(e{j_Qw*wV~m|S4BV9SJqQzo7Q7o3;iUz$IMA|?QctI3p?Uf{Mr

BvF?UvY81AgTY3UFxM^{ez*@^J&WwPYrUp$hbf2 z=t}LPvl5u_1;eeEYN{O5z7^I{hQs<;2XgY|lS4OE7MZQJa;Tf5-aLOF$}+2N$hp0z zKygKdBEnfjJ|_9Pykb~E;OUPkkZ0hhwsVMOBZWqX}Ckc7mE9j=s{t`hpr1)0Ip8F zE2Sgm=mmvm{9!+ZWt~uPhJd=W2xKJ$$k07|?YNlZTsk@}mQ%O*1C6ksI^M~WH%Mnr zXO?LdLI9^>eVjEEChznL_CIeqZU+r%4uCI{LOD(3h1zTZq19CBx zMh>aoxPD~&v&JnVda7dC!23B~<}Cp*I?_nx{7yUf!2Je&=cr8k++MN*xhRARVH4}w z(Ts3E{*wgCbE9d>CTAn}GM7v9MqQwr`PH?C^voAw6T1{2nq6Yk#uZT z58HEu=iN)iWv!LU?Ubye+`c`Z*h^bV3!o#&JYA~!EYm0qb|qD37sEMb0-+^Ls-@vz z`prh^ooKTAJFX|Ak2B*Z@Z>A?`23FPO3ePSOA!CFP`<%7yEDs6!#_^Kf4$t3uZR!) zTnB_Wo~*8uuMVcq(CoUsG&~khj}R!OLY`oifuZX^Ilsan6^ zMA(Oh+(TEKfPeLt$h-ru^Ni$H;+kc{TaZH z>z}+{&&?~~H)iGO+q`cv9J7O*!mM~jmU5 zNu?{E`E&T}$`T7sveMu@eq?jRRw*K}Ykhu9>H_q`50#jmU~HAGS7`6)D)<~8V?kMY zEHiFQYF+z!d0DmBGXVaLP^XS^X-o2J2N-d68) z4Su11`t4qQ;gaL1-&EC-@-00J^{$88sD&KY&Y<|}YHK_G63cn<1w_1P#`1b$b)UCs6!!qaHHaB77rwiij=#FkY8hY(t{n428 literal 0 HcmV?d00001 From 20c2491f1a59ef1fcaf8837223b5680875a99664 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 14:09:52 +0000 Subject: [PATCH 103/105] sanitytest fix --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index ffccf8ac4..0fc049614 100644 --- a/apps.json +++ b/apps.json @@ -5049,6 +5049,7 @@ { "id": "ltherm", "name": "Localized Thermometer", + "shortName": "Thermometer", "version": "0.01", "description": "Displays the current temperature in localized units.", "icon": "thermf.png", From ff13a72b27d9f4f97bddfd6cc0c3205b1fd32c65 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 14:11:38 +0000 Subject: [PATCH 104/105] link in readme --- apps.json | 1 + apps/ltherm/{readme.md => README.md} | 0 2 files changed, 1 insertion(+) rename apps/ltherm/{readme.md => README.md} (100%) diff --git a/apps.json b/apps.json index 0fc049614..4a333cdbd 100644 --- a/apps.json +++ b/apps.json @@ -5056,6 +5056,7 @@ "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} diff --git a/apps/ltherm/readme.md b/apps/ltherm/README.md similarity index 100% rename from apps/ltherm/readme.md rename to apps/ltherm/README.md From a8ccc840b7f267fe2c98750a442d0c05c78635d1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 14:16:35 +0000 Subject: [PATCH 105/105] allow slightly lower than 48px icons before erroring --- bin/sanitycheck.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index 104fc4c1f..fe59baa25 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -60,7 +60,7 @@ const STORAGE_KEYS = ['name', 'url', 'content', 'evaluate', 'noOverwite', 'suppo const DATA_KEYS = ['name', 'wildcard', 'storageFile', 'url', 'content', 'evaluate']; const FORBIDDEN_FILE_NAME_CHARS = /[,;]/; // used as separators in appid.info const VALID_DUPLICATES = [ '.tfmodel', '.tfnames' ]; -const GRANDFATHERED_ICONS = ["hebrew_calendar", "fontclock", "slidingtext", "solarclock", "sweepclock", "matrixclock", "speedo", "s7clk", "mmonday", "bclock", "snek", "dane", "fclock", "digiclock", "astral", "alpinenav", "slomoclock", "tapelauncher", "arrow", "doztime", "swiperclocklaunch", "pebble", "rebble"]; +const GRANDFATHERED_ICONS = ["s7clk", "snek", "astral", "alpinenav", "slomoclock", "arrow", "pebble", "rebble"]; function globToRegex(pattern) { const ESCAPE = '.*+-?^${}()|[]\\'; @@ -188,9 +188,9 @@ apps.forEach((app,appIdx) => { else ERROR(`JS icon ${file.name} does not match the pattern 'require("heatshrink").decompress(atob("..."))'`); } if (match) { - if (icon[0] != 48 || icon[1] != 48) { - if (GRANDFATHERED_ICONS.includes(app.id)) WARN(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); - else ERROR(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); + if (icon[0] > 48 || icon[0] < 24 || icon[1] > 48 || icon[1] < 24) { + if (GRANDFATHERED_ICONS.includes(app.id)) WARN(`JS icon ${file.name} should be 48x48px (or slightly under) but is instead ${icon[0]}x${icon[1]}px`); + else ERROR(`JS icon ${file.name} should be 48x48px (or slightly under) but is instead ${icon[0]}x${icon[1]}px`); } } }

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 Pw-kI)a!uUezmNY9M3zbm From 2b8bcf55b9245e79654e3b1dddccf122d5fe9844 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:27:43 +0300 Subject: [PATCH 074/105] chore: update readme --- apps/pebbled/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index 8e87525f4..166a77963 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -11,6 +11,10 @@ Written by: [Hugh Barney](https://github.com/hughbarney) For support and discus Forked and changed by [RomanistHere](https://github.com/RomanistHere) +## How to measure step length + +It's much easier than you think. When you're walking, just note number of current steps at two points and then see the distance in any map service. For example, your route from bus station to home. Write number of steps at bus station (let's say 3451) and when you entered your home (3921). You passed 3921 - 3451 = 470 steps. Then see the actual distance in Google maps. Let's say it shows 300 meters. So your step length (in settings) used in app should be 300 / 470 = 0.64. After you have set it, the displayed distance at the main screen should be more accurate. + ## Plans -Make step length depend on height/sex/age. +Make step length depend on height/sex/age for lazy ones who don't want to measure it. From 040c3eeaa5500332decc903ff9a1f9240007c713 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:29:23 +0300 Subject: [PATCH 075/105] fix: update readme [2] --- apps/pebbled/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index 166a77963..0d587ade8 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -7,10 +7,12 @@ ![](pebble_screenshot.png) ![](photo.jpg) -Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) +Initially written by: [Hugh Barney](https://github.com/hughbarney) Forked and changed by [RomanistHere](https://github.com/RomanistHere) +For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) + ## How to measure step length It's much easier than you think. When you're walking, just note number of current steps at two points and then see the distance in any map service. For example, your route from bus station to home. Write number of steps at bus station (let's say 3451) and when you entered your home (3921). You passed 3921 - 3451 = 470 steps. Then see the actual distance in Google maps. Let's say it shows 300 meters. So your step length (in settings) used in app should be 300 / 470 = 0.64. After you have set it, the displayed distance at the main screen should be more accurate. From d5b3bdc0d52ff6486e71016c924ba5e88a5fffb2 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:39:58 +0300 Subject: [PATCH 076/105] fix: remove semicolon from the image --- apps/pebbled/pebbled.icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pebbled/pebbled.icon.js b/apps/pebbled/pebbled.icon.js index ea59dd1cb..646e242b5 100644 --- a/apps/pebbled/pebbled.icon.js +++ b/apps/pebbled/pebbled.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4kB78A/4ACj/fn8Rz/Or987+M38hv8Rn++z9Cn8y/9rj9Tr+diIAHiAxDgIOICpYADCywyNCxQYMSxouVGBIWODBDgRC7hGQJAwWRGAguSC7JICCyYXYJAQXWLyhICC94LKu8Gqk1gGD+AjQ//C6Ei2HS0AXQ/U2gEquFVC6Pyk8AlssmwXK3oGF+fi2Et0v2C4ONoAPFhsiwBfFhU0lvS2wXBsVUC4vSkwHF90Etlso0L6CSBkowEFwNgM5sImQwEFw4AJGAguQGAsQ6UvxAAQ2UloMYkQAU0MZmUjmYAQmUi+MRSowAM4UmiMRSowALhiKBC4MQGCIuBgAXCGCAuCgIXBiLGCFyQXCGAJINsToBC4cQgGMI50AIwYwCACAWEGAQAOFwowRCwwwPFw4wPCxAYNCxRJLCxYxKCxwyGORI")); +require("heatshrink").decompress(atob("mEw4kB78A/4ACj/fn8Rz/Or987+M38hv8Rn++z9Cn8y/9rj9Tr+diIAHiAxDgIOICpYADCywyNCxQYMSxouVGBIWODBDgRC7hGQJAwWRGAguSC7JICCyYXYJAQXWLyhICC94LKu8Gqk1gGD+AjQ//C6Ei2HS0AXQ/U2gEquFVC6Pyk8AlssmwXK3oGF+fi2Et0v2C4ONoAPFhsiwBfFhU0lvS2wXBsVUC4vSkwHF90Etlso0L6CSBkowEFwNgM5sImQwEFw4AJGAguQGAsQ6UvxAAQ2UloMYkQAU0MZmUjmYAQmUi+MRSowAM4UmiMRSowALhiKBC4MQGCIuBgAXCGCAuCgIXBiLGCFyQXCGAJINsToBC4cQgGMI50AIwYwCACAWEGAQAOFwowRCwwwPFw4wPCxAYNCxRJLCxYxKCxwyGORI")) From cb32ad6121e347f5a92be5e6c2c160c167dbd9f8 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 11:20:37 +0100 Subject: [PATCH 077/105] Update app.js --- apps/toucher/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/toucher/app.js b/apps/toucher/app.js index 8ac198f52..aab50fbda 100644 --- a/apps/toucher/app.js +++ b/apps/toucher/app.js @@ -293,9 +293,9 @@ Bangle.on('swipe', dir => { else next(); }); -// close launcher when lcd is off -Bangle.on('lcdPower', on => { - if(!on) return load(); +// close launcher when screen is locked +Bangle.on('lock', on => { + if(on) return load(); }); if (process.env.HWVERSION == 1) { From 16cba6794f1840bcdc8fbb84dc37b20062c01a1a Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 13:04:15 +0100 Subject: [PATCH 078/105] Update README.md --- apps/showimg/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/showimg/README.md b/apps/showimg/README.md index 9d7c0067a..0624fd962 100644 --- a/apps/showimg/README.md +++ b/apps/showimg/README.md @@ -1,3 +1,3 @@ Displays an image. I use this app to show my vaccination certificate. -The image is read from the file "showimage.user.img". +The image is read from the file "showimg.user.img". Returns to watch face after 60s/button push. From 6802e28e3007ae9886178b7245b7b7395bb61bd7 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 13:05:00 +0100 Subject: [PATCH 079/105] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8b4e86d52..109324fb6 100644 --- a/apps.json +++ b/apps.json @@ -4980,7 +4980,7 @@ "name": "simple image viewer", "shortName":"showImage", "version":"0.2", - "description": "Displays the image in \"showimage.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.", + "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"], From 2fbffb3a44f4bc9cb9cd6cc9e41a2b12179b8e53 Mon Sep 17 00:00:00 2001 From: Marco H Date: Thu, 16 Dec 2021 16:03:50 +0100 Subject: [PATCH 080/105] Update locales: de_DE, de_AT and es_ES --- apps/locale/locales.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 2e3fa8713..fd6554f70 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -154,7 +154,8 @@ var locales = { month: "Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", abday: "So,Mo,Di,Mi,Do,Fr,Sa", day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag", - trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", "< Back": "< Zurück" } + trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", + "< Back": "< Zurück", "Delete": "Löschen", "Mark Unread": "Als ungelesen markieren" } }, "en_US": { lang: "en_US", @@ -333,7 +334,8 @@ var locales = { month: "Jänner,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", abday: "So,Mo,Di,Mi,Do,Fr,Sa", day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag", - trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus" } + trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", + "< Back": "< Zurück", "Delete": "Löschen", "Mark Unread": "Als ungelesen markieren" } }, "en_IL": { lang: "en_IL", @@ -369,7 +371,8 @@ var locales = { month: "enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre", abday: "dom,lun,mar,mié,jue,vie,sáb", day: "domingo,lunes,martes,miércoles,jueves,viernes,sábado", - trans: { yes: "sí", Yes: "Sí", no: "no", No: "No", ok: "ok", on: "on", off: "off" } + trans: { yes: "sí", Yes: "Sí", no: "no", No: "No", ok: "ok", on: "on", off: "off", + "< Back": "< Atrás", "Delete": "Borrar ", "Mark Unread": "Marcar como no leído" } }, "fr_BE": { lang: "fr_BE", From fa77a67e31bae8ee4f8c084665fb552b1a30cb64 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 16 Dec 2021 15:07:06 +0000 Subject: [PATCH 081/105] now recommend 2v11 --- loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader.js b/loader.js index 680cd0f94..768f5f38f 100644 --- a/loader.js +++ b/loader.js @@ -11,7 +11,7 @@ if (window.location.host=="banglejs.com") { 'This is not the official Bangle.js App Loader - you can try the Official Version here.'; } -var RECOMMENDED_VERSION = "2v10"; +var RECOMMENDED_VERSION = "2v11"; // could check http://www.espruino.com/json/BANGLEJS.json for this // We're only interested in Bangles From e3e2ee9ea001e6b6dc91d16ac7d1b4dda48fadec Mon Sep 17 00:00:00 2001 From: Marco H Date: Thu, 16 Dec 2021 16:19:00 +0100 Subject: [PATCH 082/105] Fix missing ampm in de_AT --- apps/locale/locales.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index fd6554f70..b607998a0 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -328,6 +328,7 @@ var locales = { speed: "kmh", distance: { 0: "m", 1: "km" }, temperature: "°C", + ampm: { 0: "", 1: "" }, timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" }, datePattern: { 0: "%A, %d. %B %Y", "1": "%d.%m.%y" }, // Sonntag, 1. März 2020 // 01.03.20 abmonth: "Jän,Feb,März,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez", From 3ce407caf4a9470a4cf131948441ae3db7330445 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 16 Dec 2021 17:26:52 +0100 Subject: [PATCH 083/105] Add setting for battery warn level and color battery text red if below level --- apps/circlesclock/app.js | 11 ++++++----- apps/circlesclock/settings.js | 10 ++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 8474b7f4e..a7ec05868 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -11,13 +11,15 @@ let settings; function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE, 1) || { 'maxHR': 200, - 'stepGoal': 10000 + 'stepGoal': 10000, + 'batteryWarn': 30 }; } const colorFg = '#fff'; const colorBg = '#000'; const colorGrey = '#808080'; +const colorRed = '#ff0000'; let hrtValue; @@ -89,13 +91,12 @@ function drawSteps() { } function drawHeartRate() { - const red = '#ff0000'; g.setColor(colorGrey); g.fillCircle(w2, h3, radiusOuter); if (hrtValue != undefined) { const percent = hrtValue / settings.maxHR; - drawGauge(w2, h3, percent, red); + drawGauge(w2, h3, percent, colorRed); } g.setColor(colorBg); @@ -106,7 +107,7 @@ function drawHeartRate() { g.setFont("Vector:12"); g.setFontAlign(0, 0); g.setColor(colorFg); - g.drawString(hrtValue != undefined ? hrtValue : 0, w2, h3); + g.drawString(hrtValue != undefined ? hrtValue : "-", w2, h3); g.drawImage(heartIcon, w2 - 6, h3 + radiusOuter - 6); } @@ -129,7 +130,7 @@ function drawBattery() { g.setFont("Vector:12"); g.setFontAlign(0, 0); - g.setColor(colorFg); + g.setColor(settings.batteryWarn == undefined || battery > settings.batteryWarn ? colorFg : colorRed); g.drawString(battery + '%', w3, h3); g.drawImage(powerIcon, w3 - 6, h3 + radiusOuter - 6); diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index 2de278b47..ffda51538 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -28,6 +28,16 @@ }, onchange: x => save('stepGoal', x), }, + 'battery warn lvl': { + value: "batteryWarn" in settings ? settings.batteryWarn : 30, + min: 10, + max : 100, + step: 10, + format: x => { + return x + '%'; + }, + onchange: x => save('batteryWarn', x), + }, '< Back': back, }); }); From ace239047be095330b6a61ff55219bc981f4926d Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 16 Dec 2021 17:55:39 +0100 Subject: [PATCH 084/105] Resize icon to 48x48 --- apps/circlesclock/app-icon.js | 2 +- apps/circlesclock/app.png | Bin 3576 -> 18474 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/circlesclock/app-icon.js b/apps/circlesclock/app-icon.js index ad727251a..a5a7fdfed 100644 --- a/apps/circlesclock/app-icon.js +++ b/apps/circlesclock/app-icon.js @@ -1 +1 @@ - require("heatshrink").decompress(atob("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")) + require("heatshrink").decompress(atob("mEwwcCIf4ALv///gFCv0Agf+CJP/wAODAwPAEpAjCCIX8h4RMj/+g/8gP4CA4LBDoP/GpkH8EP4/8LIIRMAQIOCCJU/CgQOBEwMPI5ARCR4YRJgP/gB3CI5Z0CCIiABfHRfEj+BAoN+n4FBLIkP/8chwRBx5cC//8v4REhytDgYRCv//8fxEYwRFgfxA4I1FRgI1D+JHE/7FINZzCBAAc4CRU4/kB44FCjgRKLQRlBPQ4RHgYCB/jpBABB6BPoKzBCJYAGuD/vAB1JkgLJm3bAgUCpMnwDdCPwIFChu27dgAoMSCIP+FAQRB+AFBtoRBtgFByQCBRIIoBAocDtonBAQWQdgXAgVIAocDEAUNwEEyEHBYUSoE//gRCsI7BxvACIILDCIcBCIYFCCJ3/wIRCIIYRBI4h6CAoJrDLJYRDDwJ9LAoKhBoMDUIcEgFwUIQREgUBaAcIkhPCAAQzBAAUBdIhhDAAMGCIkAkAFEdAQAFA==")) diff --git a/apps/circlesclock/app.png b/apps/circlesclock/app.png index 94ff885faba99f8be0bed9a3dc9c3523e32de816..493bfa5675a3856adeeed89b12a0dcde79679d66 100644 GIT binary patch literal 18474 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 literal 3576 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 From 696d46e7172d67abaef90a253bd741d4624961fa Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 16 Dec 2021 17:56:31 +0100 Subject: [PATCH 085/105] Bump version to v0.02 --- apps.json | 2 +- apps/circlesclock/Changelog | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 8b4e86d52..ee3e164b1 100644 --- a/apps.json +++ b/apps.json @@ -5009,7 +5009,7 @@ { "id": "circlesclock", "name": "Circles clock", "shortName":"Circles clock", - "version":"0.01", + "version":"0.02", "description": "A clock with circles for different data at the bottom in a probably familiar style", "icon": "app.png", "dependencies": {"widpedom":"app"}, diff --git a/apps/circlesclock/Changelog b/apps/circlesclock/Changelog index af119ab59..fa2139fff 100644 --- a/apps/circlesclock/Changelog +++ b/apps/circlesclock/Changelog @@ -1 +1,2 @@ -0.01: New clock +0.01: New clock +0.02: Fix icon & add battery warn functionality From 47706cf1724a06ae80e2901cca777318f12b06a6 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 16 Dec 2021 18:08:12 +0100 Subject: [PATCH 086/105] Fixed name of ChangeLog file --- apps/circlesclock/ChangeLog | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/circlesclock/ChangeLog diff --git a/apps/circlesclock/ChangeLog b/apps/circlesclock/ChangeLog new file mode 100644 index 000000000..fa2139fff --- /dev/null +++ b/apps/circlesclock/ChangeLog @@ -0,0 +1,2 @@ +0.01: New clock +0.02: Fix icon & add battery warn functionality From a49513d18a5a252cfa3eea36ae473d6c57f6fd0e Mon Sep 17 00:00:00 2001 From: Marco H Date: Thu, 16 Dec 2021 20:03:00 +0100 Subject: [PATCH 087/105] Delete Changelog --- apps/circlesclock/Changelog | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 apps/circlesclock/Changelog diff --git a/apps/circlesclock/Changelog b/apps/circlesclock/Changelog deleted file mode 100644 index fa2139fff..000000000 --- a/apps/circlesclock/Changelog +++ /dev/null @@ -1,2 +0,0 @@ -0.01: New clock -0.02: Fix icon & add battery warn functionality From b192f75b55bc99f7b5f41c448d58c1bef9fe3e45 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Thu, 16 Dec 2021 14:44:52 -0500 Subject: [PATCH 088/105] Have it average readings After 10 consecutive readings it starts averaging the temp displayed from a FIFO cache. It slows down the responsiveness but delivers better figures over time instead of jumping degrees +/-. --- apps/ltherm/app.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/apps/ltherm/app.js b/apps/ltherm/app.js index 06ff92e18..7accae2ed 100644 --- a/apps/ltherm/app.js +++ b/apps/ltherm/app.js @@ -1,26 +1,25 @@ -function onTemperature(p) { +function drawTemperature() { g.reset(1).clearRect(0,24,g.getWidth(),g.getHeight()); g.setFont("6x8",2).setFontAlign(0,0); var x = g.getWidth()/2; var y = g.getHeight()/2 + 10; g.drawString("Temp", x, y - 45); g.setFontVector(70).setFontAlign(0,0); - var t = require('locale').temp(p.temperature); + var h = E.getTemperature(); + if (avg.length < 10) { + avg[avg.length] = h; + } else { + avg.shift(); + avg[avg.length] = h; + h = ((avg[0] + avg[1] + avg[2] + avg[3] + avg[4] + avg[5] + avg[6] + avg[7] + avg[8] + avg[9]) / 10); + } + var t = require('locale').temp(h); g.drawString(t, x, y); } - -function drawTemperature() { - onTemperature({ - temperature : E.getTemperature() - }); - -} - - +const avg = []; setInterval(function() { drawTemperature(); }, 2000); -drawTemperature(); E.showMessage("Loading..."); Bangle.loadWidgets(); Bangle.drawWidgets(); From 0984dfb463e95a1d6202decc163934feee453c8b Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Thu, 16 Dec 2021 12:22:34 -0800 Subject: [PATCH 089/105] Update README.md Clarify that the autobacklight is only needed for older firmware. --- apps/pooqroman/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/pooqroman/README.md b/apps/pooqroman/README.md index 87acea9ca..f88cc4fbd 100644 --- a/apps/pooqroman/README.md +++ b/apps/pooqroman/README.md @@ -16,8 +16,8 @@ the ability to check the _exact_ time, hands free, without the impact on battery Although we generally obey the system-wide theming, you can long press on the display for a menu of additional options specific to the face. You can also override the system 12/24 hour setting just for this face here, since it's, well, a rather different experience than with numeric displays. -By default, there is a backlight that comes on when you twist your wrist. This, of course, somewhat increases power draw and could be -annoying in an intentionally dark environment, so there is an option to disable it. +In some previous versions of the Bangle.js firmware, the backlight doesn't come on automatically when you twist your wrist. There's currently a +workaround for this integrated into the watchface; you can disable it in the menu, if you prefer. One other thing: there's some integration with system timers and alarms; they will show as small pips at the appropriate places in the day around the display. When they come within an hour, the pips turn to crosses relating to the minute hand, and the minute From aa365bc1de6de1e816f3cb50e16fd8a55f8eb7d6 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 16 Dec 2021 21:11:51 +0000 Subject: [PATCH 090/105] Setting: restructed menus as per forum discussion --- apps.json | 2 +- apps/setting/ChangeLog | 1 + apps/setting/settings.js | 59 ++++++++++++++++++++++++++++------------ 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/apps.json b/apps.json index 8b4e86d52..876b95d7f 100644 --- a/apps.json +++ b/apps.json @@ -167,7 +167,7 @@ { "id": "setting", "name": "Settings", - "version": "0.37", + "version": "0.38", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 64844dcbc..143144d51 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -40,3 +40,4 @@ 0.35: Change App/Widget settings to 'App Settings' so it fits on Bangle screen 0.36: Added 'Utils' menu with helpful utilities for restoring Bangle.js 0.37: Going into passkey menu now saves settings with passkey +0.38: Restructed menus as per forum discussion diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 9cba09d6c..1a9463858 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -61,6 +61,37 @@ if (!settings) resetSettings(); const boolFormat = v => v ? /*LANG*/"On" : /*LANG*/"Off"; function showMainMenu() { + + const mainmenu = { + '': { 'title': 'Settings' }, + '< Back': ()=>load(), + /*LANG*/'Apps': ()=>showAppSettingsMenu(), + /*LANG*/'Bluetooth': ()=>showBLEMenu(), + /*LANG*/'System': ()=>showSystemMenu(), + /*LANG*/'Alerts': ()=>showAlertsMenu(), + /*LANG*/'Utils': ()=>showUtilMenu(), + /*LANG*/'Turn Off': ()=>{ if (Bangle.softOff) Bangle.softOff(); else Bangle.off() } + }; + + return E.showMenu(mainmenu); +} + +function showSystemMenu() { + + const mainmenu = { + '': { 'title': 'System' }, + '< Back': ()=>showMainMenu(), + /*LANG*/'Theme': ()=>showThemeMenu(), + /*LANG*/'LCD': ()=>showLCDMenu(), + /*LANG*/'Locale': ()=>showLocaleMenu(), + /*LANG*/'Select Clock': ()=>showClockMenu(), + /*LANG*/'Set Time': ()=>showSetTimeMenu() + }; + + return E.showMenu(mainmenu); +} + +function showAlertsMenu() { var beepMenuItem; if (BANGLEJS2) { beepMenuItem = { @@ -91,12 +122,9 @@ function showMainMenu() { }; } - const mainmenu = { - '': { 'title': 'Settings' }, - '< Back': ()=>load(), - /*LANG*/'App Settings': ()=>showAppSettingsMenu(), - /*LANG*/'BLE': ()=>showBLEMenu(), + '': { 'title': 'Alerts' }, + '< Back': ()=>showMainMenu(), /*LANG*/'Beep': beepMenuItem, /*LANG*/'Vibration': { value: settings.vibrate, @@ -119,23 +147,18 @@ function showMainMenu() { updateOptions(); if ("qmsched" in WIDGETS) WIDGETS["qmsched"].draw(); }, - }, - /*LANG*/'Locale': ()=>showLocaleMenu(), - /*LANG*/'Select Clock': ()=>showClockMenu(), - /*LANG*/'Set Time': ()=>showSetTimeMenu(), - /*LANG*/'LCD': ()=>showLCDMenu(), - /*LANG*/'Theme': ()=>showThemeMenu(), - /*LANG*/'Utils': ()=>showUtilMenu(), - /*LANG*/'Turn Off': ()=>{ if (Bangle.softOff) Bangle.softOff(); else Bangle.off() }, + } }; return E.showMenu(mainmenu); } + function showBLEMenu() { var hidV = [false, "kbmedia", "kb", "joy"]; var hidN = ["Off", "Kbrd & Media", "Kbrd","Joystick"]; E.showMenu({ + '': { 'title': 'Bluetooth' }, '< Back': ()=>showMainMenu(), 'Make Connectable': ()=>makeConnectable(), 'BLE': { @@ -190,7 +213,7 @@ function showThemeMenu() { } var m = E.showMenu({ '':{title:'Theme'}, - '< Back': ()=>showMainMenu(), + '< Back': ()=>showSystemMenu(), 'Dark BW': ()=>{ upd({ fg:cl("#fff"), bg:cl("#000"), @@ -335,7 +358,7 @@ function showWhitelistMenu() { function showLCDMenu() { const lcdMenu = { '': { 'title': 'LCD' }, - '< Back': ()=>showMainMenu(), + '< Back': ()=>showSystemMenu(), 'LCD Brightness': { value: settings.brightness, min: 0.1, @@ -447,7 +470,7 @@ function showLCDMenu() { function showLocaleMenu() { const localemenu = { '': { 'title': 'Locale' }, - '< Back': ()=>showMainMenu(), + '< Back': ()=>showSystemMenu(), 'Time Zone': { value: settings.timezone, min: -11, @@ -551,7 +574,7 @@ function showClockMenu() { '': { 'title': 'Select Clock', }, - '< Back': ()=>showMainMenu(), + '< Back': ()=>showSystemMenu(), }; clockApps.forEach((app, index) => { var label = app.name; @@ -578,7 +601,7 @@ function showSetTimeMenu() { '': { 'title': 'Set Time' }, '< Back': function () { setTime(d.getTime() / 1000); - showMainMenu(); + showSystemMenu(); }, 'Hour': { value: d.getHours(), From 89f385c68ada36acd50f313476790409fe31674d Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Thu, 16 Dec 2021 18:10:18 -0500 Subject: [PATCH 091/105] Update apps.json Merged upstream --- apps.json | 86 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 70 insertions(+), 16 deletions(-) diff --git a/apps.json b/apps.json index 5813561cf..4e79025be 100644 --- a/apps.json +++ b/apps.json @@ -16,7 +16,7 @@ { "id": "boot", "name": "Bootloader", - "version": "0.38", + "version": "0.39", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "icon": "bootloader.png", "type": "bootloader", @@ -100,7 +100,7 @@ "name": "Android Integration", "shortName": "Android", "version": "0.05", - "description": "Display notifications/music/etc from Gadgetbridge on Android. This replaces the old Gadgetbridge widget.", + "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"}, @@ -167,7 +167,7 @@ { "id": "setting", "name": "Settings", - "version": "0.36", + "version": "0.37", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", @@ -304,7 +304,7 @@ "id": "gbridge", "name": "Gadgetbridge", "version": "0.25", - "description": "(NOT RECOMMENDED) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", + "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", @@ -1590,7 +1590,7 @@ { "id": "widpedom", "name": "Pedometer widget", - "version": "0.19", + "version": "0.20", "description": "Daily pedometer widget", "icon": "widget.png", "type": "widget", @@ -3478,8 +3478,8 @@ { "id": "speedalt2", "name": "GPS Adventure Sports II", - "shortName": "GPS Adv Sport II", - "version": "0.07", + "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", @@ -4209,10 +4209,10 @@ "id": "pastel", "name": "Pastel Clock", "shortName": "Pastel", - "version": "0.08", + "version": "0.09", "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", - "dependencies": {"mylocation":"app"}, + "dependencies": {"mylocation":"app", "widpedom":"app"}, "screenshots": [{"url":"screenshot_pastel.png"}], "type": "clock", "tags": "clock", @@ -4723,8 +4723,9 @@ "id": "pebble", "name": "Pebble Clock", "shortName": "Pebble", - "version": "0.04", + "version": "0.06", "description": "A pebble style clock to keep the rebellion going", + "dependencies": {"widpedom":"app"}, "readme": "README.md", "icon": "pebble.png", "screenshots": [{"url":"pebble_screenshot.png"}], @@ -4858,10 +4859,10 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.10", + "version": "0.11", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", - "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], + "screenshots": [{"url":"manage_patterns_light.png"}], "tags": "tools", "supports": ["BANGLEJS2"], "readme": "README.md", @@ -4876,11 +4877,11 @@ "id": "rebble", "name": "Rebble Clock", "shortName": "Rebble", - "version": "0.02", + "version": "0.03", "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"}, + "dependencies": {"mylocation":"app", "widpedom":"app"}, "screenshots": [{"url":"screenshot_rebble.png"}], "type": "clock", "tags": "clock", @@ -4918,6 +4919,7 @@ "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"} ], @@ -4941,7 +4943,7 @@ { "id": "pooqround", "name": "pooq Round watch face", "shortName":"pooq Round", - "version":"0.00", + "version":"0.01", "description": "A 24 hour analogue watchface with high legibility and a novel style.", "icon": "app.png", "type": "clock", @@ -4973,6 +4975,58 @@ {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] }, + { + "id": "showimg", + "name": "simple image viewer", + "shortName":"showImage", + "version":"0.2", + "description": "Displays the image in \"showimage.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": "circlesclock", + "name": "Circles clock", + "shortName":"Circles clock", + "version":"0.01", + "description": "A clock with circles for different data at the bottom in a probably familiar style", + "icon": "app.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": "ltherm", "name": "Thermometer", @@ -4987,4 +5041,4 @@ {"name":"ltherm.img","url":"icon.js","evaluate":true} ] } -] \ No newline at end of file +] From 45521e9fe5e6cc05e3fa52c13bd2e32b178ecec3 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Thu, 16 Dec 2021 18:15:43 -0500 Subject: [PATCH 092/105] Update readme.md Added content about new revisions. --- apps/ltherm/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ltherm/readme.md b/apps/ltherm/readme.md index 477c51bd6..b68cb1fc1 100644 --- a/apps/ltherm/readme.md +++ b/apps/ltherm/readme.md @@ -1,3 +1,3 @@ # Thermometer -Localized Bangle.js 2 thermometer app. +Localized Bangle.js 2 thermometer app. It also starts maintaining an average of the temperature to help lower the margin of error after 10 consecutive readings; due to the low quality die-thermometer. From 66e75055a4a3c707b046b7e333b709e1293bbde6 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Thu, 16 Dec 2021 19:39:45 -0500 Subject: [PATCH 093/105] messages: Hide widget when all unread messages are dismissed --- apps.json | 2 +- apps/messages/ChangeLog | 1 + apps/messages/lib.js | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c379a1de4..211c4749b 100644 --- a/apps.json +++ b/apps.json @@ -77,7 +77,7 @@ { "id": "messages", "name": "Messages", - "version": "0.13", + "version": "0.14", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 16d0010cc..94848a26c 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -20,3 +20,4 @@ 0.13: Add /*LANG*/ comments for internationalisation Add 'Delete All' option to message options Now update correctly when 'require("messages").clearAll()' is called +0.14: Hide widget when all unread notifications are dismissed from phone diff --git a/apps/messages/lib.js b/apps/messages/lib.js index 63f55dd03..b3cb7d9d4 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -30,6 +30,10 @@ exports.pushMessage = function(event) { require("Storage").writeJSON("messages.json",messages); // if in app, process immediately if (inApp) return onMessagesModified(mIdx<0 ? {id:event.id} : messages[mIdx]); + // if we've removed the last new message, hide the widget + if (event.t=="remove" && !messages.some(m=>m.new)) { + if (global.WIDGETS && WIDGETS.messages) WIDGETS.messages.hide(); + } // ok, saved now - we only care if it's new if (event.t!="add") { return; From a588280af738516a7bd6c1adf72863eb1a40ac92 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Thu, 16 Dec 2021 21:52:48 -0500 Subject: [PATCH 094/105] sanitycheck: Warn about incorrectly sized js icons --- bin/sanitycheck.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index 572364224..9a9986fd4 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -3,6 +3,7 @@ */ var fs = require("fs"); +var heatshrink = require("../core/lib/heatshrink"); var acorn; try { acorn = require("acorn"); @@ -175,6 +176,20 @@ apps.forEach((app,appIdx) => { for (const key in file) { if (!STORAGE_KEYS.includes(key)) ERROR(`App ${app.id} file ${file.name} has unknown key ${key}`); } + // warn if JS icon is the wrong size + if (file.name == app.id+".img") { + let icon; + let match = fileContents.match(/E\.toArrayBuffer\(atob\(\"([^"]*)\"\)\)/); + if (match) icon = Buffer.from(match[1], 'base64'); + else { + match = fileContents.match(/require\(\"heatshrink\"\)\.decompress\(\s*atob\(\s*\"([^"]*)\"\s*\)\s*\)/); + if (match) icon = heatshrink.decompress(Buffer.from(match[1], 'base64')); + else ERROR(`JS icon ${file.name} does not match the pattern 'require("heatshrink").decompress(atob("..."))'`); + } + if (match) { + if (icon[0] != 48 || icon[1] != 48) WARN(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); + } + } }); let dataNames = []; (app.data||[]).forEach((data)=>{ From 0944f732818814b07ac957b4892013c354659ecd Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Thu, 16 Dec 2021 22:11:29 -0500 Subject: [PATCH 095/105] sanitycheck: error for newly added mis-sized icons --- bin/sanitycheck.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index 9a9986fd4..104fc4c1f 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -60,6 +60,7 @@ const STORAGE_KEYS = ['name', 'url', 'content', 'evaluate', 'noOverwite', 'suppo const DATA_KEYS = ['name', 'wildcard', 'storageFile', 'url', 'content', 'evaluate']; const FORBIDDEN_FILE_NAME_CHARS = /[,;]/; // used as separators in appid.info const VALID_DUPLICATES = [ '.tfmodel', '.tfnames' ]; +const GRANDFATHERED_ICONS = ["hebrew_calendar", "fontclock", "slidingtext", "solarclock", "sweepclock", "matrixclock", "speedo", "s7clk", "mmonday", "bclock", "snek", "dane", "fclock", "digiclock", "astral", "alpinenav", "slomoclock", "tapelauncher", "arrow", "doztime", "swiperclocklaunch", "pebble", "rebble"]; function globToRegex(pattern) { const ESCAPE = '.*+-?^${}()|[]\\'; @@ -187,7 +188,10 @@ apps.forEach((app,appIdx) => { else ERROR(`JS icon ${file.name} does not match the pattern 'require("heatshrink").decompress(atob("..."))'`); } if (match) { - if (icon[0] != 48 || icon[1] != 48) WARN(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); + if (icon[0] != 48 || icon[1] != 48) { + if (GRANDFATHERED_ICONS.includes(app.id)) WARN(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); + else ERROR(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); + } } } }); From 622c94b1e87905602628d3dec9150d2e7ebd73ee Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 17 Dec 2021 08:34:28 +0100 Subject: [PATCH 096/105] Color battery text and icon in green when charging Color battery icon in red when battery low --- apps/circlesclock/app.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index a7ec05868..7607fa71f 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -1,9 +1,11 @@ const locale = require("locale"); const heatshrink = require("heatshrink"); -var shoesIcon = heatshrink.decompress(atob("h0OwYJGgmAAgUBkgECgVJB4cSoAUDyEBkARDpADBhMAyQRBgVAkgmDhIUDAAuQAgY1DAAYA=")); -var heartIcon = heatshrink.decompress(atob("h0OwYOLkmQhMkgACByVJgESpIFBpEEBAIFBCgIFCCgsABwcAgQOCAAMSpAwDyBNM")); -var powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbBIUN23AAoYOCgEDFIgODABI")); +const shoesIcon = heatshrink.decompress(atob("h0OwYJGgmAAgUBkgECgVJB4cSoAUDyEBkARDpADBhMAyQRBgVAkgmDhIUDAAuQAgY1DAAYA=")); +const heartIcon = heatshrink.decompress(atob("h0OwYOLkmQhMkgACByVJgESpIFBpEEBAIFBCgIFCCgsABwcAgQOCAAMSpAwDyBNM")); +const powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbBIUN23AAoYOCgEDFIgODABI")); +const powerIconGreen = heatshrink.decompress(atob("h0OwYQNkAEDpAEDiQEDkmSAgUJkmABwVJBIUEyVAAoYOCgEBFIgODABI")); +const powerIconRed = heatshrink.decompress(atob("h0OwYQNoAEDyAEDkgEDpIFDiVJBweSAgUJkmAAoYZDgQpEBwYAJA")); const SETTINGS_FILE = "circlesclock.json"; let settings; @@ -20,6 +22,7 @@ const colorFg = '#fff'; const colorBg = '#000'; const colorGrey = '#808080'; const colorRed = '#ff0000'; +const colorGreen = '#00ff00'; let hrtValue; @@ -130,10 +133,23 @@ function drawBattery() { g.setFont("Vector:12"); g.setFontAlign(0, 0); - g.setColor(settings.batteryWarn == undefined || battery > settings.batteryWarn ? colorFg : colorRed); + + let icon = powerIcon; + let color = colorFg; + if (Bangle.isCharging()) { + color = colorGreen; + icon = powerIconGreen; + } + else { + if (settings.batteryWarn != undefined && battery <= settings.batteryWarn) { + color = colorRed; + icon = powerIconRed; + } + } + g.setColor(color); g.drawString(battery + '%', w3, h3); - g.drawImage(powerIcon, w3 - 6, h3 + radiusOuter - 6); + g.drawImage(icon, w3 - 6, h3 + radiusOuter - 6); } function radians(a) { From 1a6ff78b7107468223c615744b56c1cb40ba1088 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 17 Dec 2021 08:37:59 +0100 Subject: [PATCH 097/105] Update README --- apps/circlesclock/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md index 87edd5981..27c0566d3 100644 --- a/apps/circlesclock/README.md +++ b/apps/circlesclock/README.md @@ -5,7 +5,7 @@ A clock with circles for different data at the bottom in a probably familiar sty It shows besides time, date and day of week the following information: * Steps (requires [pedometer widget](https://banglejs.com/apps/#pedometer)) * Heart rate (when screen is on and unlocked) - * Battery + * Battery (including charging and battery low) ## Screenshot @@ -14,6 +14,8 @@ It shows besides time, date and day of week the following information: ## TODO * Show weather information - ## Creator Marco ([myxor](https://github.com/myxor)) + +## Icons +Icons taken from [materialdesignicons](https://materialdesignicons.com) under Apache License 2.0 From 70924cb17ae7744ba515a240d39889a54e01c465 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 08:55:09 +0000 Subject: [PATCH 098/105] trying to fix the worst sanity check errors that have crept in --- apps.json | 2 +- apps/authentiwatch/ChangeLog | 6 +++--- apps/bclock/clock-binary-icon.js | 2 +- apps/clicompleteclk/ChangeLog | 1 + apps/coretemp/ChangeLog | 2 +- apps/digiclock/digiclock-icon.js | 2 +- apps/dtlaunch/ChangeLog | 2 +- apps/fclock/app-icon.js | 2 +- apps/hebrew_calendar/app-icon.js | 2 +- apps/hebrew_calendar/app.png | Bin 32788 -> 3416 bytes apps/mmonday/manic-monday-icon.js | 2 +- apps/speedalt2/ChangeLog | 1 + apps/tapelauncher/icon.js | 2 +- apps/vectorclock/ChangeLog | 3 +++ apps/vectorclock/Changelog | 3 --- apps/widclkbttm/{Changelog => ChangeLog} | 0 16 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 apps/vectorclock/ChangeLog delete mode 100644 apps/vectorclock/Changelog rename apps/widclkbttm/{Changelog => ChangeLog} (100%) diff --git a/apps.json b/apps.json index 04004f5b1..ee6660db7 100644 --- a/apps.json +++ b/apps.json @@ -554,7 +554,7 @@ { "id": "impwclock", "name": "Imprecise Word Clock", - "version": "0.03", + "version": "0.04", "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.", "icon": "clock-impword.png", "type": "clock", diff --git a/apps/authentiwatch/ChangeLog b/apps/authentiwatch/ChangeLog index e1b8ed5bc..7a902a731 100644 --- a/apps/authentiwatch/ChangeLog +++ b/apps/authentiwatch/ChangeLog @@ -1,4 +1,4 @@ -0.04: Fix tapping at very bottom of list, exit on inactivity -0.03: Add "Calculating" placeholder, update JSON save format -0.02: Fix JSON save format 0.01: First release +0.02: Fix JSON save format +0.03: Add "Calculating" placeholder, update JSON save format +0.04: Fix tapping at very bottom of list, exit on inactivity diff --git a/apps/bclock/clock-binary-icon.js b/apps/bclock/clock-binary-icon.js index 1c167ff57..2e5cb31c1 100644 --- a/apps/bclock/clock-binary-icon.js +++ b/apps/bclock/clock-binary-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAMGAAAAAAYDAAAAAAwBgAAAABgAwAAAABAAQAAAABAAQAAAABAAQAAAABAAQAAAABAAQAAAABgAwAAAAAwBgAAAAAYDAAAAAAMGAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAP+AAAAAAf/AAAAAA//gAAAAB//wAAAAB//wAAAAB//wAAAAB//wAAAAB//wAAAAB//wAAAAB//wAAAAA//gAAAAAf/AAAAAAP+AAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwgIurg/wAocMjAFDjEMIAkGAodggYFDoBLEAq4jFF4o7FI4pTFOLsP/AFDj/8Aoc//wFDv//As4vFHYpHFOLoAPA==")) diff --git a/apps/clicompleteclk/ChangeLog b/apps/clicompleteclk/ChangeLog index ee05bd582..50c84593e 100644 --- a/apps/clicompleteclk/ChangeLog +++ b/apps/clicompleteclk/ChangeLog @@ -1,2 +1,3 @@ 0.01: New clock! 0.02: Load steps from Health Tracking app (if installed) +0.03: ... diff --git a/apps/coretemp/ChangeLog b/apps/coretemp/ChangeLog index c7b309a74..115067b80 100644 --- a/apps/coretemp/ChangeLog +++ b/apps/coretemp/ChangeLog @@ -1 +1 @@ -0.1: New app +0.01: New app diff --git a/apps/digiclock/digiclock-icon.js b/apps/digiclock/digiclock-icon.js index 737561863..da6305724 100644 --- a/apps/digiclock/digiclock-icon.js +++ b/apps/digiclock/digiclock-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("/wA/AH4A/AH4A/ACmsAEQuMlcAAD0rGBQKBFr4ADGBOsqwvjqwvJRsCRFF/8Gg4ADEZYQEgwvWg8+AAgwKCJgvQDgoABF5IRMF5xEBJpBhGCJwvNDQM4AYMNAAQaBnCAFCJ4vNIwQeBAAkxQAwGCmIRFFwIRDF64dDgwGBgwRNF/4v/F/4v/F/4v/F/4dJmIdECIkxF7MHFwUHhoACg4eCAYIACCJ4vNDQIgCAAgICKwoROF5yAEAAgtFCKAvQJpAAICJgvQgEGg4ADFxIwCAAcGBYovRADov6qwvjqwvJ1gvjEoIvHGASRgRoIuJGAYAhFxQA/AH4A/AH4A/ABQ")) +require("heatshrink").decompress(atob("mEw4UA///A4N551ulxL/ACkK1QAG0ALBlNVAA1oBYOlBY9aBYO1BY9eBYOVBY9WBbf/+oIBr//BYlX//9BYN///VC599qtX6oBBqt9BYYRBr/1AIIdBBf4L/BY6bLZcb7MBau1BY9eBYOlBY9aBYMpBY9oBYMK1QAG0ALBAH4ASA")) diff --git a/apps/dtlaunch/ChangeLog b/apps/dtlaunch/ChangeLog index c414c1ddc..62a0cab9f 100644 --- a/apps/dtlaunch/ChangeLog +++ b/apps/dtlaunch/ChangeLog @@ -4,4 +4,4 @@ 0.04: reset to clock after 2 mins of inactivity 0.05: add Bangle 2 version 0.06: Adds settings page (hide clocks or launchers) -0.06: Adds setting for directly launching app on touch for Bangle 2 +0.07: Adds setting for directly launching app on touch for Bangle 2 diff --git a/apps/fclock/app-icon.js b/apps/fclock/app-icon.js index ba506d3ac..b9075b857 100644 --- a/apps/fclock/app-icon.js +++ b/apps/fclock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("7OwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAAAAB//AAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAB//8AAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAB///wAAAAAAAAAAAAAAAAAAAAAAAAB//8AAAAAAB////AAAAAAAAAAAAAAAAAAAAAAAAB///AAAAAAB////8AAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAB/////wAAAAAAAAAAAAAAAAAAAAAAA///8AAAAAB//////AAAAAAAAAAAAAAAAAAAAAAAf///AAAAAA//////4AAAAAAAAAAAAAAAAAAAAAAf///wAAAAAP/////+AAAAAAAAAAAAAAAAAAAAAAP///8AAAAAH//////wAAAAAAAAAAAAAAAAAAAAAP////AAAAAB//////8AAAAAAAAAAAAAAAAAAAAAH////wAAAAA///////gAAAAAAAAAAAAAAAAAAAAH////8AAAAAP//////4AAAAAAAAAAAAAAAAAAAAB//9//AAAAAH//AAH//AAAAAAAAAAAAAAAAAAAAAf/+f/wAAAAB//gAA//wAAAAAAAAAAAAAAAAAAAAH/+H/8AAAAA//wAAH/+AAAAAAAAAAAAAAAAAAAAB//B//AAAAAP/4AAA//gAAAAAAAAAAAAAAAAAAAAf/Af/wAAAAH/8AAAH/8AAAAAAAAAAAAAAAAAAAAH/gH/8AAAAB/+AAAA//AAAAAAAAAAAAAAAAAAAAB/gB//AAAAAf/gAAAAAAAAAAAAAAAAAAAAAAAAAAfwAf/wAAAAH/4AAAAAAAAAAAAAAAAAAAAAAAAAAHwAH/8AAAAB/+AAAAAAAAAAAAAAAAAAAAAAAAAAB4AB//AAAAAf/gAAAAAAAAP4AAAAD8AAAAAAAAAAYAAf/wAAAAH/4AAAAAAAAH+AAAAB/AAAAAAAAAAEAAH/8AAAAB/+AAAAAAAAH/gAAAAfwAAAAAAAAAAAAB//AAAAAf/gf/wAAAAD/4AAAAP8AAAAAAAAAAAAAf/wAAAAH/4f//AAAAD/+AAAAH/AAAAAAAAAAAAAH/8AAAAB/+f//8AAAB//gAAAD/wAAAAAAAAAAAAB//AAAAAf/v///wAAA/34AAAA/8AAAAAAAAAAAAAf/wAAAAH/7////AAAP5+AAAAf/AAAAAAAAAAAAAH/8AAAAB/+////8AAD8fgAAAP/wAAAAAAAAAAAAB//AAAAAf/v////wAA8H4AAAD/8AAAAAAAAAAAAAf/wAAAAH/7////+AAOB+AAAB+/AAAAAAAAAAAAAH/8AAAAB/+/////gACAfgAAA/vwAAAAAAAAAAAAB//AAAAAf/v////8AAAH4AAAfz8AAPAB/AAAAAAAf/wAAAAH/7/////AAAB+AAAH4/AAPwA/8AAAAAAH/8AAAAB/+/////4AAAfgAAD8PwAH8AP/AAAAAAB//AAAAAf/v////+AAAH4AAB/D8AB3AHB4AAAAAAf/wAAAAH/7wAB//wAAB+AAAfg/AARwAAOAAAAAAH/8AAAAB/+4AAP/8AAAfgAAPwPwAAcAADgAAAAAB//AAAAAf/sAAB//gAAH4AAH4D8AAHAAB4AAAAAAf/wAAAAH/6AAAP/4AAB+AAD+A/AABwAH8AAAAAAH/8AAAAB/+AAAB//AAAfgAA/APwAAcAB/AAAAAAB//AAAAAf/gAAAP/wAAH4AAfgD8AAHAAfwAAAAAAf/wAAAAH/4AAAD/8AAB+AAH///4ABwAA8AAAAAAH/8AAAAB/+AAAA//AAAfgAB///+AAcAAHgAAAAAB//AAAAAf/gAAAP/wAAH4AAf///gAHAAA4AAAAAAf/wAAAAH/4AAAD/8AAB+AAH///4ABwAAOAAAAAAH/8AAAAB/+AAAA//AAAfgAB///+AAcAcHAAAAAAB//AAAAAf/gAAAP/wAAH4AAf///gB/+D/wAAAAAAf/wAAAAH/4AAAD/8AAB+AAAAA/AAf/g/4AAAAAAH/8AAAAB/+AAAA//AAAfgAAAAPwAH/4D8AAAAAAB//AAAAAf/gAAAP/wAAH4AAAAD8AAAAAAAAAAAAAf/wAAAAH/4AAAD/8AP///wAAA/AAAAAAAAAAAAAH/8AAAAB/+AAAA//AD///8AAAPwAAAAAAAAAAAAB//AAAAAf/gAAAP/wA////AAAD8AAAAAAAAAAAAAf/wAAAAH/4AAAD/8AP///wAAA/AAAAAAAAAAAAAH/8AAAAB//AAAB//AD///8AAAPwAAAAAAAAAAAAB//AAAAAP/4AAA//gA////AAAD8AAAAAAAAAAAAAf/wAAAAD//AAAf/4AP///wAAA/AAAAAAAAAAAAAH/8AAAAAf/4AAP/8AAAAAAAAAAAAAAAAAAAAAAAB//AAAAAH//AAH//AAAAAAAAAAAAAAAAAAAAAAAAf/wAAAAA//4AD//gAAAAAAAAAAAAAAAAAAAAH///////8AAP//////4AAAAAAAAAAAAAAAAAAAAB////////AAB//////8AAAAAAAAAAAAAAAAAAAAAf///////wAAf//////AAAAAAAAAAAAAAAAAAAAAH///////8AAD//////gAAAAAAAAAAAAAAAAAAAAB////////AAA//////4AAAAAAAAAAAAAAAAAAAAAf///////wAAH/////8AAAAAAAAAAAAAAAAAAAAAH///////8AAA/////+AAAAAAAAAAAAAAAAAAAAAB////////AAAD////+AAAAAAAAAAAAAAAAAAAAAAf///////wAAAP///+AAAAAAAAAAAAAAAAAAAAAAH///////8AAAA///+AAAAAAAAAAAAAAAAAAAAAAB////////AAAAD//+AAAAAAAAAAAAAAAAAAAAAAAf///////wAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8P4DDwDAMPB4PAwAAAAAAAAAAAAAAAAAAAAAAAAfj+Ax+BwDH4/H48AAAAAAAAAAAAAAAAAAAAAAAAGMgAYYwcBhjMZjLAAAAAAAAAAAAAAAAAAAAAAAABDIAGEMPAYAyGAwwAAAAAAAAAAAAAAAAAAAAAAAAQx8DBDGwMAYhgYMAAAAAAAAAAAAAAAAAAAAAAAAEM/AwQzMDAOIYODAAAAAAAAAAAAAAAAAAAAAAAABDAYYEM/hgHCGHAwAAAAAAAAAAAAAAAAAAAAAAAAQwGGBDP4YDAhjAMAAAAAAAAAAAAAAAAAAAAAAAAEMhjAQwMMBgIZgDAAAAAAAAAAAAAAAAAAAAAAAAB+PwwH4DDAfz8fz+AAAAAAAAAAAAAAAAAAAAAAAAPB4YA8AxgH8eH8/gAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwgRC/AH4AfgkBBA0BqADBAQQAEhfwAQP+BY1/BYM///ABQkC//wgm///gBYkT+4XB/sDAYIXEwfwgP4qFQlMAlBGCCYMB/47B/sA3gYCoYLC//R90R/kUikAC4f/8Mdifslm9BYf9g/wl0LnkYloLD/FC+kdh/+jttF4PxiP4qX0t1G3suvAXD/kC+v/6E8KYWn+2Q/1b+OqyMYO4REB8F/CoKDFKAUv/+AqtAXweq1WQgWof+IA/AE0GsNRiqnEBYe21Vq1WABY2p1WKXAILFgNUqFFqtQHBw")) diff --git a/apps/hebrew_calendar/app-icon.js b/apps/hebrew_calendar/app-icon.js index b6b0a53ae..372033d58 100644 --- a/apps/hebrew_calendar/app-icon.js +++ b/apps/hebrew_calendar/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("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/4ABIn4C/AXWQX/4C/X/6/DghH/AX4C5wC/DgBH/AX4C5Xwi//AX6//gESI/4C/AW8gX4sCI/4C/AW6+FAAMJJX4C/AWtAX48BJX4C/AWq+HAAMEJX4C/AWeAX5MAgRN/AX4CxXpQADn//AH4A/AFn8Xxy//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X7n7tu/CaH27YnRE3d/EyO3X/4AG/3btu2CZ/t23bt4mS74mRtom1/4mSX+32JQXbCZwRCtu/E34mvX+xcCAQN/CRn7OIe3E34muX+39JSQRDTH4mO2wmSt6//X5JKNX4hxNE34mhX/6Y/E36/29qY/E3NtX/6/W/yY/EyffX/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X7hKMX4xxME34mgX+RZGARBiDLIwCIE34mkX+xcOAQISB/YROtu3EyV/E34mOX+39JSFv/4RPAQIm/E0S/29pKR/xxSE0vfTCNtX6QmUX/4CJTCYm/E0C/3LiACB+xxSE0vbTCW+E0u/X/4C/AXy//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//ARX2L6PfTHO+CiXtX/6/wOKX+E3C//ABaY/E34CHTSS//TH6//X+1vOKQmm7/9TCQmmX+xKRt5xSE34miX/6Y/E36/2/5KQv///ZxP24m/E0S//TH4m/X+/2JR4TCOJ+/E34mjX/4CG75xSE0yYC/yYS9omlX+xKPTAZxPE34mkX+3/JRwSD/pxNt4m/E0i/3/ZKM24TEOJt/E34mlX+3/JRm/CQn2OJgm/E0y/39pKLCQv+OJffE3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")) \ No newline at end of file +require("heatshrink").decompress(atob("mEw4cBz3v///s/immVkf27Xu+ec5PikmSpMt21JAoNbtgIBkm27IOCAQVt23JkmW7dt2VJku27YREpdkyQaBy3JkoRBloLDF4YCDHAQCBHAQ7DyVeAQN2km8BAPsBwfYAQMlDwYbGK4VdkmJlMk2fpCIVn6QRC5+kC4WRCIO774ICu+/CIXvvwRDAQOXt5gCl3eQIIyB3qNEAQP7CIUl+wRCpftCIwCglbmBABvRkzQBZoICLEoMAAB0JCIUUgNogXQgughdAi2AlARF2WBsEC4EEwEJoESwNlCLGLssW5UsylZtGy6IRFgiNLwARXrMk2VJbYPJkrYBCIsFyWLksWpRHClGyqNk0BrIoBrCgB9KssC5QRBrNABAQRIgFJomC5AIECIkSgAEBrMsy1KgGQgMgCI8sagJ6BqEFygRHi1QgmUCgICCwELdIxoBQAOALIMBPQJuBCI3KKYImBEAMlJoNACIpoBoEWpJZBpMogRuBCI0JHwLIByRrBiwiCCIovCLIY7CCI5TBBwJHBCgJfBCI7+CLIb4CCJAvBLIY7CCJMC7JZBpZXDCJA4CGQgRbgXbtmW7Y1MLIJHBLIkC6ARGBwIRCBQYRigu2CI4AHCIOACJxrEQ44AHpIA=")) diff --git a/apps/hebrew_calendar/app.png b/apps/hebrew_calendar/app.png index 0dae731cddda69ecfca2d3de516546061c63103d..ad9ec9af7df269fec2c89df6f1a00877f0ed4372 100644 GIT binary patch literal 3416 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