From 23b7e65250d16bc237a892817eaa978b6429e9bc Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 19 Jun 2025 10:43:17 -0400 Subject: [PATCH 01/27] Create --- apps/modclock | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/modclock diff --git a/apps/modclock b/apps/modclock new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/modclock @@ -0,0 +1 @@ + From e49cebf3bf2eab04344f5c47ac794b4805be88c9 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 19 Jun 2025 10:44:17 -0400 Subject: [PATCH 02/27] Delete apps/modclock --- apps/modclock | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/modclock diff --git a/apps/modclock b/apps/modclock deleted file mode 100644 index 8b1378917..000000000 --- a/apps/modclock +++ /dev/null @@ -1 +0,0 @@ - From 8e5cd170f9bfc8f2bc748807413a8284d810189f Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 19 Jun 2025 10:44:41 -0400 Subject: [PATCH 03/27] Create placeholder --- apps/modclock/placeholder | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/modclock/placeholder diff --git a/apps/modclock/placeholder b/apps/modclock/placeholder new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/modclock/placeholder @@ -0,0 +1 @@ + From e4836d8117a3e7c49034a855a7bd5c8e2c375fa2 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 19 Jun 2025 10:44:57 -0400 Subject: [PATCH 04/27] Delete apps/modclock/placeholder --- apps/modclock/placeholder | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/modclock/placeholder diff --git a/apps/modclock/placeholder b/apps/modclock/placeholder deleted file mode 100644 index 8b1378917..000000000 --- a/apps/modclock/placeholder +++ /dev/null @@ -1 +0,0 @@ - From 4e9fcd7c28f5c73bb60ceab19b3517a04730511e Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 19 Jun 2025 10:45:21 -0400 Subject: [PATCH 05/27] Create placehlder --- apps/modclock/placehlder | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/modclock/placehlder diff --git a/apps/modclock/placehlder b/apps/modclock/placehlder new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/modclock/placehlder @@ -0,0 +1 @@ + From 26a55f44765247f3466769636c3d0f6d8f721c5f Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 19 Jun 2025 10:45:58 -0400 Subject: [PATCH 06/27] Add files via upload --- apps/modclock/README.md | 24 +++++ apps/modclock/Screenshot1.png | Bin 0 -> 20814 bytes apps/modclock/Screenshot2.png | Bin 0 -> 20384 bytes apps/modclock/app-icon.js | 1 + apps/modclock/app.js | 187 ++++++++++++++++++++++++++++++++++ apps/modclock/app.png | Bin 0 -> 3809 bytes apps/modclock/metadata.json | 20 ++++ 7 files changed, 232 insertions(+) create mode 100644 apps/modclock/README.md create mode 100644 apps/modclock/Screenshot1.png create mode 100644 apps/modclock/Screenshot2.png create mode 100644 apps/modclock/app-icon.js create mode 100644 apps/modclock/app.js create mode 100644 apps/modclock/app.png create mode 100644 apps/modclock/metadata.json diff --git a/apps/modclock/README.md b/apps/modclock/README.md new file mode 100644 index 000000000..48427f6b3 --- /dev/null +++ b/apps/modclock/README.md @@ -0,0 +1,24 @@ +# Modern Clock + + + +A beautifully simple, modern clock with two Clock Infos, and a clean UI. Fast-Loads. + +![](Screenshot1.png) + + + +## Features + +* Has 2 Clock Infos, that are individually changeable. +* Low battery consumption. +* Uses locale for time and date. +* Bold time font, for quicker readability. +* Has Fast Loading, for quicker access to launcher. + + +## Creator + +RKBoss6 + +Github: https://github.com/RKBoss6 diff --git a/apps/modclock/Screenshot1.png b/apps/modclock/Screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..524b5ab0410a518163deaeb0e74e11fd53196e39 GIT binary patch literal 20814 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 literal 0 HcmV?d00001 diff --git a/apps/modclock/Screenshot2.png b/apps/modclock/Screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..bda2a6099bd2d87b095c272f1905c3cf6a16a31f GIT binary patch literal 20384 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 n0yUYRv@W>(-;cCzD4RU-nBS+LSOWfXK { + // itm: the item containing name/hasRange/etc + // info: data returned from itm.get() containing text/img/etc + // options: options passed into addInteractive + // Clear the background + g.reset().clearRect(options.x-5, options.y-5, options.x+options.w+5, options.y+options.h+5); + // indicate focus - we're using a border, but you could change color? + if (options.focus){ + // show if focused + g.setColor(0,15,255); + bRoundedRectangle(10,100,82,170,8); + }else{ + g.setColor(g.theme.fg); + bRoundedRectangle(10,100,82,170,8); + } + // we're drawing center-aligned here + var midx = options.x+options.w/2; + var midy=options.y+options.h/2; + if (info.img){ + g.drawImage(info.img, midx-12,midy-21); + }// draw the image + g.setFont("Vector",16).setFontAlign(0,1).drawString(info.text, midx,midy+23); // draw the text + } +}); + + + +//CLOCK INFO RIGHT DIMENSIONS: 97,113, w:66, h: 55 +let clockInfoMenuRight = require("clock_info").addInteractive(clockInfoItems, { + // Add the dimensions we're rendering to here - these are used to detect taps on the clock info area + x : 97, y: 103, w: 66, h:65, + // You can add other information here you want to be passed into 'options' in 'draw' + // This function draws the info + draw : (itm, info, options) => { + // itm: the item containing name/hasRange/etc + // info: data returned from itm.get() containing text/img/etc + // options: options passed into addInteractive + // Clear the background + g.reset().clearRect(options.x-5, options.y-5, options.x+options.w+5, options.y+options.h+5); + // indicate focus - we're using a border, but you could change color? + if (options.focus){ + // show if focused + g.setColor(0,15,255); + bRoundedRectangle(94,100,166,170,8); + }else{ + g.setColor(g.theme.fg); + bRoundedRectangle(94,100,166,170,8); + } + // we're drawing center-aligned here + var midx = options.x+options.w/2; + var midy=options.y+options.h/2; + if (info.img){ + g.drawImage(info.img, midx-12,midy-21); + }// draw the image + g.setFont("Vector",16).setFontAlign(0,1).drawString(info.text, midx,midy+23); // draw the text + } +}); + + + + + + + +// DRAW FACE +let draw = function() { + var X = g.getWidth() / 2; + var Y = (g.getHeight() / 2)-15; + g.reset(); + var d = new Date(); + var clock = require("locale").time(d, 1 /*omit seconds*/); + var meridian = require("locale").meridian(d); + // draw the current time (4x size 7 segment) + + // align bottom right + + g.setFontBold(); + g.setFontAlign(0,1); + g.drawString(" "+clock+" ", X-10, Y+1, true /*clear background*/); + // draw the meridian(am/pm) and seconds (2x size 7 segment) + + g.setFont("Vector",20); + + g.setFontAlign(-1,1); // align bottom left + g.drawString(meridian, X+50, Y-10, true /*clear background*/); + // draw the date, in a normal font + g.setFont("Vector",18); + g.setFontAlign(0,0); // align center bottom + // pad the date - this clears the background if the date were to change length + var dateStr = require("locale").dow(new Date(), 1)+", "+ require("locale").month(new Date(), true)+" "+new Date().getDate(); + g.drawString(" "+dateStr+" ", g.getWidth()/2, Y+9, true /*clear background*/); + + + + // queue next draw + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +}; + + + + +// Show launcher when middle button pressed +Bangle.setUI({ + mode : "clock", + remove : function() { + // Called to unload all of the clock app + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + delete Graphics.prototype.setFontBold; + clockInfoMenuRight.remove(); + clockInfoMenuLeft.remove(); + + }}); + +g.clear(); +// Load widgets +Bangle.loadWidgets(); +draw(); +setTimeout(Bangle.drawWidgets,0); +} diff --git a/apps/modclock/app.png b/apps/modclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..889531f1efc297e3fdf7794da359554ff529daff GIT binary patch literal 3809 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 A2LJ#7 literal 0 HcmV?d00001 diff --git a/apps/modclock/metadata.json b/apps/modclock/metadata.json new file mode 100644 index 000000000..d59a91756 --- /dev/null +++ b/apps/modclock/metadata.json @@ -0,0 +1,20 @@ +{ + "id": "modclock", + "name": "Modern Clock", + "shortName":"Modern Clk", + "icon": "app.png", + "version":"0.02", + "description": "A modern, simple clock, with two Clock Infos and Fast Loading", + "type":"clock", + "tags": "clock,clkinfo", + "supports": ["BANGLEJS2"], + "screenshots" : [ { "url":"Screenshot1.png" }, + { "url":"Screenshot2.png" } ], + "dependencies" : { "clock_info":"module"}, + "allow_emulator":true, + "readme":"README.md", + "storage": [ + {"name":"modclock.app.js","url":"app.js"}, + {"name":"modclock.img","url":"app-icon.js","evaluate":true} + ] +} From 29e6a3efa0617cfd89b48bd45f2e166b61ef6838 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 19 Jun 2025 10:46:24 -0400 Subject: [PATCH 07/27] Delete apps/modclock/placehlder --- apps/modclock/placehlder | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/modclock/placehlder diff --git a/apps/modclock/placehlder b/apps/modclock/placehlder deleted file mode 100644 index 8b1378917..000000000 --- a/apps/modclock/placehlder +++ /dev/null @@ -1 +0,0 @@ - From 617c5146e8bf53755a31d9cc517bbc0b1a5aeb4a Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 19 Jun 2025 16:04:05 -0400 Subject: [PATCH 08/27] Create ChangeLog --- apps/modclock/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/modclock/ChangeLog diff --git a/apps/modclock/ChangeLog b/apps/modclock/ChangeLog new file mode 100644 index 000000000..d3e2a506b --- /dev/null +++ b/apps/modclock/ChangeLog @@ -0,0 +1 @@ +0.01: App Created w/ clockInfos, bold font, date and time. From c3a4b76aac84ae3a9ce2ac0e172a11b08e3737c6 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Mon, 23 Jun 2025 17:17:32 -0400 Subject: [PATCH 09/27] Update metadata.json --- apps/modclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/modclock/metadata.json b/apps/modclock/metadata.json index d59a91756..474b384fb 100644 --- a/apps/modclock/metadata.json +++ b/apps/modclock/metadata.json @@ -3,7 +3,7 @@ "name": "Modern Clock", "shortName":"Modern Clk", "icon": "app.png", - "version":"0.02", + "version":"0.01", "description": "A modern, simple clock, with two Clock Infos and Fast Loading", "type":"clock", "tags": "clock,clkinfo", From 729af9778133bbe16637f2b4bbb5c03adf6e6855 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 26 Jun 2025 18:42:21 -0400 Subject: [PATCH 10/27] Fix meridian alignment, added proper alignment with meridian --- apps/modclock/app.js | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/apps/modclock/app.js b/apps/modclock/app.js index f8ca038d7..aa64680af 100644 --- a/apps/modclock/app.js +++ b/apps/modclock/app.js @@ -58,7 +58,7 @@ let clockInfoItems = require("clock_info").load(); let clockInfoMenuLeft = require("clock_info").addInteractive(clockInfoItems, { // Add the dimensions we're rendering to here - these are used to detect taps on the clock info area - x : 13, y: 103, w: 66, h:65, + x : 10, y: 100, w: 72, h:70, // You can add other information here you want to be passed into 'options' in 'draw' // This function draws the info draw : (itm, info, options) => { @@ -71,10 +71,10 @@ let clockInfoMenuLeft = require("clock_info").addInteractive(clockInfoItems, { if (options.focus){ // show if focused g.setColor(0,15,255); - bRoundedRectangle(10,100,82,170,8); + bRoundedRectangle(options.x,options.y,options.x+options.w,options.y+options.h,8); }else{ g.setColor(g.theme.fg); - bRoundedRectangle(10,100,82,170,8); + bRoundedRectangle(options.x,options.y,options.x+options.w,options.y+options.h,8); } // we're drawing center-aligned here var midx = options.x+options.w/2; @@ -91,7 +91,7 @@ let clockInfoMenuLeft = require("clock_info").addInteractive(clockInfoItems, { //CLOCK INFO RIGHT DIMENSIONS: 97,113, w:66, h: 55 let clockInfoMenuRight = require("clock_info").addInteractive(clockInfoItems, { // Add the dimensions we're rendering to here - these are used to detect taps on the clock info area - x : 97, y: 103, w: 66, h:65, + x : 94, y: 100, w: 72, h:70, // You can add other information here you want to be passed into 'options' in 'draw' // This function draws the info draw : (itm, info, options) => { @@ -104,10 +104,10 @@ let clockInfoMenuRight = require("clock_info").addInteractive(clockInfoItems, { if (options.focus){ // show if focused g.setColor(0,15,255); - bRoundedRectangle(94,100,166,170,8); + bRoundedRectangle(options.x,options.y,options.x+options.w,options.y+options.h,8); }else{ g.setColor(g.theme.fg); - bRoundedRectangle(94,100,166,170,8); + bRoundedRectangle(options.x,options.y,options.x+options.w,options.y+options.h,8); } // we're drawing center-aligned here var midx = options.x+options.w/2; @@ -138,14 +138,34 @@ let draw = function() { // align bottom right g.setFontBold(); - g.setFontAlign(0,1); - g.drawString(" "+clock+" ", X-10, Y+1, true /*clear background*/); - // draw the meridian(am/pm) and seconds (2x size 7 segment) - g.setFont("Vector",20); + if(meridian!=""){ + //calculate alignment + g.setFontBold(); + //padding in px + var padding=7; + var clkStrWidth= g.stringWidth(clock); + g.setFont("Vector",18); + var meridianStrWidth=g.stringWidth(meridian); + var totalStrWidth=meridianStrWidth+padding+clkStrWidth; + var startX = ((g.getWidth() - totalStrWidth) / 2)+6; + g.clearRect(startX,50,startX+totalStrWidth,80); + g.setFontBold(); + g.setFontAlign(-1,1); + g.drawString(clock, startX, Y+2,true); + g.setFont("Vector",20); + g.setFontAlign(-1,1); + g.drawString(meridian, startX + clkStrWidth + padding, Y-5, true); + + }else{ + + g.setFontBold(); + g.setFontAlign(0,1); + g.drawString(" "+clock+" ", X, Y-2,true); + + } + - g.setFontAlign(-1,1); // align bottom left - g.drawString(meridian, X+50, Y-10, true /*clear background*/); // draw the date, in a normal font g.setFont("Vector",18); g.setFontAlign(0,0); // align center bottom From 68ee49b01ee99c1cc014eac4a33f9e1c6ff774b3 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 26 Jun 2025 21:41:06 -0400 Subject: [PATCH 11/27] add new app icon --- apps/modclock/app.png | Bin 3809 -> 3622 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/modclock/app.png b/apps/modclock/app.png index 889531f1efc297e3fdf7794da359554ff529daff..f275961732864efe3ef605435f9f1135706db954 100644 GIT binary patch delta 3621 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 A2LJ#7 From d188262c9a12530015e2fc83c39d2f59aa4693cb Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 26 Jun 2025 21:41:47 -0400 Subject: [PATCH 12/27] Delete apps/modclock/app.png --- apps/modclock/app.png | Bin 3622 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/modclock/app.png diff --git a/apps/modclock/app.png b/apps/modclock/app.png deleted file mode 100644 index f275961732864efe3ef605435f9f1135706db954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3622 zcmV+>4%zXEP)Px?;7LS5RA@u(n0t_wMS8}6-QVq8=A4;1FkEIB24Tj50TmQPlqf6`qFK#WZM-CE zvTIqjSvPL1RBfzHs#02st7|GrxoRqvC~9_-th>6JK?H%}ei;Svf-nklXBg(fFlXl6 zzFT+d`&f6SfIle8+OmrC&pGGouix(HdAi?z-WGhtKjJGse=Y&|T`PD=flCTpBm(cLd8aM2WAWPr02*goK0d$Lfj6QK}}ZHKZF_TJc%-g%MZoU{9*TFdJ`8=OX{ zn@w#@QHlnH9s@cRAY>>+U?x(5z*iTcrqGXVe1e}K`JDkOd%AwLZWmuAZQ%{`|WQbe#=qR z_QiIK0F;lZK&T|{ug5GCGAw*Np};g4ZJ4ABKB;1!C9_)J_}<+&J=8Kv9E-;LP4tc< zLsL3Bw{6^iM!nHFmIC6bq0WS zeU;{A%a(5~j-04_=|7)iX2Uqt&`DAv#Lxj+fD#ZyY$E|Po|q&+#>|4$V1zPe+0c?u zfG{DDky<+bAH|8XV2EuygyZVk)-HV5LGrqehHmSP|yK}W5)n&Uz1h>;kr1fBz>X6RhpcWAn+>$ z(m+N4N+XD5n!Yf_)z{sOof?1Ykq7>4^1{o+&=~;UKA~s4wQ|Fj(!ieV|GxAL6LZzz z1z5sClobhO;aGyAH;5D!{7M;Z2@<307#tkJ90{nc8bvZyMY-h1o77C(6#Oz?;NsXO zo?FH%6~XsNY74_KFp~*fsW6i%h6hh!S3(@aCQt@}A;{L(GNd(qW|rx5Z$_l*Pi=Vo zzT8=xcy+g))xLWDw#q=469Jf9Q;l>3!cgM~3rAU4DkLcP(KcZ`jmavG_n%fzQ|GntdCXV;!RtU3A#OBUZk3)QUO@jhGC2!+}tC=ZJe zBh+MuhL~q2Sllv|oM}QKPgY2JQ<~NItb1n*cTH+x=9mT&A^{aaM%kP&4PG7YXU&OI z_%)Mhn!AWfYE)t4kMGT#1z=^jzWR-|8#}$;F6;HB&%|sQ5dcHr66IycS^~fC5Vy8X z=eqP5KKWn|n~xk}(Za>FnAL3F(?y3>W*}!nP@u{%v9v|?$vg|S!wu70Ii@Nc+xIC~ zIJIOZHn7Q1tlPSYyC+Rx+Jpx74Gq(C_&C4U&`c?ls<6qsRx?8yR)q{G}9m-7L6wr}0SlIjLpW?aQqE$LXl zmOCyR%ZzDL*wo)o=ay~UKWi@46PtMX)Br0Eo+Me@LfbWq@M}jER{rSDvlUp?qi=e3 z&Bk?J->2gB7ygZDnJUa!0gWD50Ohyu`D(mI?lEV zl&UkJT}(4U7^FxK6}ZVXnSE6=2W*ekE0*!~Ts_mLU&EG?;N9)-@XhA&jBOl6$8dp< zcD&Dn(`VpRXL+SuV&(AxWOWnGa~2Sc9zU}F(R1v9RXzHSSJ!NOrQEkqys`9I+AN0spds8B!P{X&Vn+-paU%6L`6=kJbHo z{Hl7U%vk_qCJcY)yZ1KSIYt!DNTcn&`a5r}+5GRN-n~Qsrf0M0N*N^uA(~=z3LA-v20wYnB6C8Q~0Tjd!hVRS-L!gMR7%RW^V z567$UM|0-W=o-Ac{}6Af0@nCC7B)3vnUXj6?7=7$Sdw(OesVJh2ZwlX(>7*bHi0Q^ zGx(^i*s^g0ch8(ced8E5^yS(0{zu%?I-OiY1Iq?Sczs_tqHzXIvln1gjs5K5hwoan zxLzDN1Hj52{p0qvoByWJyO*CwS*WHK>6S6HLPmy6M;=In@GuETx{wZB-2Ow{^R>l{ zb1k-ic9@l=L6WsOZf~9j2E2A)H-7#U3q$zE)HWPnQW`voW0VQTj%J&%XX+jgVfl1mlDTgEEGbuXVfE^$18?=;9a8Kh4zID2|LD8Z$6sFP{ipYHf#HI>SK!Af-THXHvK$r@)c8rhy0p>Ku!VG!O-aW83&>l;d#H zmz0O|OioCWQZeGYNGVBS;MoZdSr!LN5|tRw)TN-gUMD ztGe|gZ?4_`WZ}feyt?#h+G?t>ydsu)x(ErC5m#oOR2T@7p%d>7Pv|&PmD~!pZDR=w zKid3K#%IWga7mgLwXVPsHsvTrWa2Q82+AYFu|rj6r1I$kMh1`$o!EL085MjdLD@^u zcJ0kna*drGkDW__ZvEh|I(9tQ+r5`JUU-IvniO`WfT`VxAC$0AhKSiWRAjGZ?D@-5 z6GkkH(?Ff5IMEsrRc59jFFn$xMb#;vwCyk$m6cLrU|o+b`AwL^yxqUS;wxWdrytX4Il4xkB= z86`P%yo92&r=$f#hJzOvG>@4={ixB@r1^*TfBgF2pS6kK%j@QiySx8o^Zwr3@_`ix zaSVwQMw3^d3_>BJGCO8k2W4CpVmn#fK;!!!VO)L+QkH?#3gtz0fhL(qP$-rucrLb? zjFW*OjMH(WXIfxKn#8qnblL=XB8;vP2n>hb{y}UnB;gj=^}@H#xQIC8&w*m)_N^Zu zy051sn-1o6%iiO|HQK5n)HW(&I*cYB#*>Nw`j$lrL9geLHY7C(J8pN~$h+#;%=tlp zX&AU(RLNOb(xJat!1EOu+oVeSXwSuuz^iBp{kpym1Hx$e`UPgSO?=|N@4xnM&viF* z-kZ7ScYF6g@X!DC0%KYsOh6FH9IYO8T5=t2h7iILC=bC%A-)KR+k&XBRgiF?;+-Bh zj0$E0f{11b(Mg|76W6CIy5a~T`s0)xAN^>u+GV(V7p#5ayz@M7!;8E81>gSHpRHr^ zwcsbfj|Mid4DiD+E;sS|X&Cw_=zjSxt#h#xJ$v-IbyaTCoNk)-tWc|Qo~N`FSiODy zx3Apt!4+ohG=`llp>0qy1o)9}38+CZP6qTH*v{a($1WT|`@Zr`k39W9>$~#NrcDw1 zf{387a#{t`Bxjbw$M0EC|J^0cedhykzURC9bo2VnJDZi3TJeEWm_CmdfoLxJgN6^6sgb3>`iC#zGbWOX+2 z?)^8m^k3-YKYzc!UuRZ-_)co?(QmlXICNWGwtUwH-oAMO;vi{tK|=l}o!07*qoM6N<$f;&?0WdHyG From 318ada8a6d91669657b7b8c428568636406ccbd6 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 26 Jun 2025 21:41:58 -0400 Subject: [PATCH 13/27] Add files via upload --- apps/modclock/app.png | Bin 0 -> 3622 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/modclock/app.png diff --git a/apps/modclock/app.png b/apps/modclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..f275961732864efe3ef605435f9f1135706db954 GIT binary patch literal 3622 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 literal 0 HcmV?d00001 From f1c4e8e81409d21b34ada71ccc1e337946d5e861 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 26 Jun 2025 21:42:18 -0400 Subject: [PATCH 14/27] Delete apps/modclock/app.png --- apps/modclock/app.png | Bin 3622 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/modclock/app.png diff --git a/apps/modclock/app.png b/apps/modclock/app.png deleted file mode 100644 index f275961732864efe3ef605435f9f1135706db954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3622 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 From 282406df2f8cd7875ec72454e4b73b217148327d Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 26 Jun 2025 21:42:35 -0400 Subject: [PATCH 15/27] Add files via upload --- apps/modclock/icon.png | Bin 0 -> 3622 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/modclock/icon.png diff --git a/apps/modclock/icon.png b/apps/modclock/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f275961732864efe3ef605435f9f1135706db954 GIT binary patch literal 3622 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 literal 0 HcmV?d00001 From f8f7667187323cfb4995abee4f67a095b28cdd6d Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 26 Jun 2025 21:43:14 -0400 Subject: [PATCH 16/27] Update metadata.json --- apps/modclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/modclock/metadata.json b/apps/modclock/metadata.json index 474b384fb..344df0199 100644 --- a/apps/modclock/metadata.json +++ b/apps/modclock/metadata.json @@ -2,7 +2,7 @@ "id": "modclock", "name": "Modern Clock", "shortName":"Modern Clk", - "icon": "app.png", + "icon": "icon.png", "version":"0.01", "description": "A modern, simple clock, with two Clock Infos and Fast Loading", "type":"clock", From ae444cd7c0e7434774e6c6ba9f9394aae4c0d2a3 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 26 Jun 2025 21:44:54 -0400 Subject: [PATCH 17/27] Update app-icon.js --- apps/modclock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/modclock/app-icon.js b/apps/modclock/app-icon.js index 09d3e4086..0870a83cb 100644 --- a/apps/modclock/app-icon.js +++ b/apps/modclock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4UA///ztE79Mz1MB4cDBgPADY/614BBBQ0+34XB/28BYvv/W//2v/YKEh3+34EBAYOwBYc79YFD9fsAoYRFDoIECgX+J4kD3+AAgML/gICBwU/8ADC+AgCEwUPCYXvCYUPB4UDKoW+FgQLDBAQODBYogBhxXDBYk72EPHwQLFhfwhZpDBYkO8E7MQQLFgXsn51DBYkD/kuBZO49wLJ3fuTAYLEgG794LJ/f/BZL1BBZ8O/ALJbYILEHYjzBPof7KYkAl6hDL4L5EhYwCNYKDEGAiDBTYjgCAwKbBWYgABlSzDZYgABhjLDcYgAEcYL7EAAj7Bgf7BY/vHwO+BY4ICBwQAEEAc/V4i3C/g+CAYQADn5QCPwIkEgaqE35tEhzCEnfrAofrM4gRB34EBAYKLF9/63/+15yGn2/eoP+3hxG/WvAIJ9HgYXBK4gA==")) +require("heatshrink").decompress(atob("mEw4kA///00x3u+pPK8+xxXCxHCn+/xO6tO6o0ZjFt+sjw0xudkhHCMf4A/AH4A/ADECkUiuUnBAe7AAm85gAK5YWChYRMAA2wC4Xq1QAQ13gC4cRAA3RBA8RC4/dCYfdAoIADjQXJjvRCYMdAIIFBjuqBAMaD4Ws4AvG6NB6NNGQMdilEokdAQNJjseC40d6lU7FdC4VImc2ptGmc1poXFjoYBC4PZqgXCouEouNo1E+sajxfELAIXIpoXBAYQXHF4U/+2EC4YVBzoXBpIXBL4oYB6lTmwXBSQNIC4lFO4LXIRIJHBUwIXCptIC4NKI5AqB7GU6OIC4ITBR4IXGvYvEC4IvBC4NDn/zxtDskzU4IXGa4JhBwjzC7MztAvBxE4jscF5EROoJfCAoJRCEgMa1wXFFwQYCAYQbCBgQDBC4aPFGAYGFAga/F1Xd1QCD1vRAoXdjUaAoWsC4e85nB5gCD5kc1kRBAXBiMcAoJHCgW7AAu8AYYdCAggWBAAMiCwvLB4YAF5YWDAAMMCBAAG0AXKNIRrChfsBZAXGBQoABC5QA/AH4A/AFgA==")) From 787696ddf2b905a44c5cb9e3619c6e1d0509d94c Mon Sep 17 00:00:00 2001 From: stweedo Date: Fri, 27 Jun 2025 03:50:03 -0500 Subject: [PATCH 18/27] weather 0.28: Fix UV positioning, hide when 0 --- apps/weather/ChangeLog | 3 +- apps/weather/README.md | 8 +++-- apps/weather/app.js | 71 ++++++++++++++++++++------------------ apps/weather/metadata.json | 2 +- 4 files changed, 46 insertions(+), 38 deletions(-) diff --git a/apps/weather/ChangeLog b/apps/weather/ChangeLog index c51459fe0..f7f86fad7 100644 --- a/apps/weather/ChangeLog +++ b/apps/weather/ChangeLog @@ -23,4 +23,5 @@ 0.24: Redraw clock_info on update and provide color field for condition 0.25: Added monochrome parameter to drawIcon in lib 0.26: Expose update function (for use by iOS integration) -0.27: Add UV index display \ No newline at end of file +0.27: Add UV index display +0.28: Fix UV positioning, hide when 0 \ No newline at end of file diff --git a/apps/weather/README.md b/apps/weather/README.md index a90c02b96..5a34b39cb 100644 --- a/apps/weather/README.md +++ b/apps/weather/README.md @@ -7,8 +7,11 @@ It also adds a ClockInfo list to Bangle.js. You can view the full report through the app: ![Screenshot](screenshot.png) + ## iOS Setup -Use the iOS shortcut [here](https://www.icloud.com/shortcuts/dbf7159200d945179e0938c15e64f102). The shortcut uses Apple Weather for weather updates, and sends a notification, which is read by Bangle.js. To push weather every hour, or interval, you will need to create a shortcut automation for every time you want to push the weather. + +Use the iOS shortcut [here](https://www.icloud.com/shortcuts/ae5f3d7d6ed3460c98a3396b267aa1c5). The shortcut uses Apple Weather for weather updates, and sends a notification, which is read by Bangle.js. To push weather every hour, or interval, you will need to create a shortcut automation for every time you want to push the weather. + ## Android Setup 1. Install [Gadgetbridge for Android](https://f-droid.org/packages/nodomain.freeyourgadget.gadgetbridge/) on your phone. @@ -51,8 +54,8 @@ When you first load QuickWeather, it will take you through the setup process. Yo **Note:** at one time, the Weather Notification app also worked with Gadgetbridge. However, many users are reporting it's no longer seeing the OpenWeatherMap API key as valid. The app has not received any updates since August of 2020, and may be unmaintained. - ## Clock Infos + Tap on any clockInfo when focused to directly open the weather app. Adds: * Condition ClockInfo with condition icon @@ -60,6 +63,7 @@ Adds: * Wind speed ClockInfo. * Chance of rain ClockInfo. * Temperature ClockInfo without condition icon. + ## Settings * Expiration timespan can be set after which the local weather data is considered as invalid diff --git a/apps/weather/app.js b/apps/weather/app.js index 4875a3877..557d3cbc3 100644 --- a/apps/weather/app.js +++ b/apps/weather/app.js @@ -9,38 +9,9 @@ Bangle.loadWidgets(); var layout = new Layout({type:"v", bgCol: g.theme.bg, c: [ {filly: 1}, {type: "h", filly: 0, c: [ - {type: "v", width: g.getWidth()/2, c: [ // Vertical container for icon + UV + {type: "v", width: g.getWidth()/2, c: [ // Vertical container for icon {type: "custom", fillx: 1, height: g.getHeight()/2 - 30, valign: -1, txt: "unknown", id: "icon", - render: l => weather.drawIcon(l, l.x+l.w/2, l.y+l.h/2, l.w/2-10)}, - {type: "custom", fillx: 1, height: 20, id: "uvDisplay", - render: l => { - if (!current || current.uv === undefined) return; - const uv = Math.min(parseInt(current.uv), 11); // Cap at 11 - - // UV color thresholds: [max_value, color] based on WHO standards - const colors = [[2,"#0F0"], [5,"#FF0"], [7,"#F80"], [10,"#F00"], [11,"#F0F"]]; - const color = colors.find(c => uv <= c[0])[1]; - - // Setup and measure label - g.setFont("6x8").setFontAlign(-1, 0); - const label = "UV: "; - const labelW = g.stringWidth(label); - - // Calculate centered position (4px block + 1px spacing) * blocks - last spacing - const totalW = labelW + uv * 5 - (uv > 0 ? 1 : 0); - const x = l.x + (l.w - totalW) / 2; - const y = l.y + l.h; - - // Draw label - g.setColor(g.theme.fg).drawString(label, x, y); - - // Draw UV blocks - g.setColor(color); - for (let i = 0; i < uv; i++) { - g.fillRect(x + labelW + i * 5, y - 3, x + labelW + i * 5 + 3, y + 3); - } - } - }, + render: l => weather.drawIcon(l, l.x+l.w/2, l.y+l.h/2, l.w/2-5)}, ]}, {type: "v", fillx: 1, c: [ {type: "h", pad: 2, c: [ @@ -50,12 +21,43 @@ var layout = new Layout({type:"v", bgCol: g.theme.bg, c: [ {filly: 1}, {type: "txt", font: "6x8", pad: 2, halign: 1, label: /*LANG*/"Humidity"}, {type: "txt", font: "9%", pad: 2, halign: 1, id: "hum", label: "000%"}, - {filly: 1}, - {type: "txt", font: "6x8", pad: 2, halign: -1, label: /*LANG*/"Wind"}, - {type: "h", halign: -1, c: [ + {type: "txt", font: "6x8", pad: [2, 2, 2, 2], halign: -1, label: /*LANG*/"Wind"}, + {type: "h", pad: [0, 2, 2, 2], halign: -1, c: [ {type: "txt", font: "9%", pad: 2, id: "wind", label: "00"}, {type: "txt", font: "6x8", pad: 2, valign: -1, id: "windUnit", label: "km/h"}, ]}, + {type: "custom", fillx: 1, height: 15, id: "uvDisplay", + render: l => { + if (!current || current.uv === undefined || current.uv === 0) return; + const uv = Math.min(parseInt(current.uv), 11); // Cap at 11 + + // UV color thresholds: [max_value, color] based on WHO standards + const colors = [[2,"#0F0"], [5,"#FF0"], [7,"#F80"], [10,"#F00"], [11,"#F0F"]]; + const color = colors.find(c => uv <= c[0])[1]; + const blockH = 8, blockW = 3; + + // Draw UV title and blocks on same line + g.setFont("6x8").setFontAlign(-1, 0); + const label = "UV"; + const labelW = g.stringWidth(label); + + const x = l.x + 2; + const y = l.y + l.h / 2; + + // Draw title + g.setColor(g.theme.fg).drawString(label, x, y); + + // Draw UV blocks after title + g.setColor(color); + for (let i = 0; i < uv; i++) { + const blockX = x + labelW + 4 + i * (blockW + 2); + g.fillRect(blockX, y - blockH/2, blockX + blockW, y + blockW/2); + } + + // Reset graphics state to prevent interference + g.reset(); + } + }, ]}, ]}, {filly: 1}, @@ -91,6 +93,7 @@ function draw() { layout.loc.label = current.loc; layout.updateTime.label = `${formatDuration(Date.now() - current.time)} ago`; // How to autotranslate this and similar? layout.update(); + layout.forgetLazyState(); layout.render(); } diff --git a/apps/weather/metadata.json b/apps/weather/metadata.json index ccefac8c0..699cdd627 100644 --- a/apps/weather/metadata.json +++ b/apps/weather/metadata.json @@ -1,7 +1,7 @@ { "id": "weather", "name": "Weather", - "version": "0.27", + "version": "0.28", "description": "Show Gadgetbridge/iOS weather report", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], From 10de699459260429a5fcd9e01ae381597dc44db7 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 27 Jun 2025 10:20:20 +0100 Subject: [PATCH 19/27] Add notes about HRM motion artefact removal --- apps/hrmmar/README.md | 2 ++ apps/hrmmar/metadata.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/hrmmar/README.md b/apps/hrmmar/README.md index 2d9612117..4f512c773 100644 --- a/apps/hrmmar/README.md +++ b/apps/hrmmar/README.md @@ -2,6 +2,8 @@ Measurements from the build in PPG-Sensor (Photoplethysmograph) is sensitive to motion and can be corrupted with Motion Artifacts (MA). This module allows to remove these. +**WARNING:** On Bangle.js 2 this has been found to make heart rate readings [substantially less accurate in some cases](https://github.com/orgs/espruino/discussions/7738#discussioncomment-13594093) (the HRM already has built in motion artefact removal). + ## Settings * **MA removal** diff --git a/apps/hrmmar/metadata.json b/apps/hrmmar/metadata.json index fcb2fac5c..5ff49f3fc 100644 --- a/apps/hrmmar/metadata.json +++ b/apps/hrmmar/metadata.json @@ -4,7 +4,7 @@ "shortName":"HRM MA removal", "icon": "app.png", "version":"0.02", - "description": "Removes Motion Artifacts in Bangle.js's heart rate sensor data.", + "description": "Removes Motion Artifacts in Bangle.js's heart rate sensor data. **WARNING:** On Bangle.js 2 this has been found to make heart rate readings substantially less accurate in some cases.", "type": "bootloader", "tags": "health", "supports": ["BANGLEJS","BANGLEJS2"], From e7d64baee0f1bf5d429a077a5622dd04beeaabea Mon Sep 17 00:00:00 2001 From: stweedo <108593831+stweedo@users.noreply.github.com> Date: Fri, 27 Jun 2025 08:27:24 -0500 Subject: [PATCH 20/27] Update README.md with new iOS shortcut link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds “mostly cloudy” as a filter before “cloud” or “part” to catch that specific phrase and use weather code 803 to drawBrokenClouds which was previously unused. --- apps/weather/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/weather/README.md b/apps/weather/README.md index 5a34b39cb..7e74d9f9d 100644 --- a/apps/weather/README.md +++ b/apps/weather/README.md @@ -10,7 +10,7 @@ You can view the full report through the app: ## iOS Setup -Use the iOS shortcut [here](https://www.icloud.com/shortcuts/ae5f3d7d6ed3460c98a3396b267aa1c5). The shortcut uses Apple Weather for weather updates, and sends a notification, which is read by Bangle.js. To push weather every hour, or interval, you will need to create a shortcut automation for every time you want to push the weather. +Use the iOS shortcut [here](https://www.icloud.com/shortcuts/738171beab944a5caacb4396f473811e). The shortcut uses Apple Weather for weather updates, and sends a notification, which is read by Bangle.js. To push weather every hour, or interval, you will need to create a shortcut automation for every time you want to push the weather. ## Android Setup From 7d56b7d8ab57fcc5a46a921d037f520b8b286e07 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 27 Jun 2025 09:40:00 -0400 Subject: [PATCH 21/27] Fixed clock not clearing with redraw --- apps/modclock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/modclock/app.js b/apps/modclock/app.js index aa64680af..7fbe7b7e2 100644 --- a/apps/modclock/app.js +++ b/apps/modclock/app.js @@ -149,7 +149,7 @@ let draw = function() { var meridianStrWidth=g.stringWidth(meridian); var totalStrWidth=meridianStrWidth+padding+clkStrWidth; var startX = ((g.getWidth() - totalStrWidth) / 2)+6; - g.clearRect(startX,50,startX+totalStrWidth,80); + g.clearRect(0,0,g.getWidth(),90); g.setFontBold(); g.setFontAlign(-1,1); g.drawString(clock, startX, Y+2,true); From af2f861ba7548cbb0d763a48ee2270cd04fb1b6e Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 27 Jun 2025 09:42:59 -0400 Subject: [PATCH 22/27] Fix widgets drawing w/out timeout --- apps/modclock/app.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/modclock/app.js b/apps/modclock/app.js index 7fbe7b7e2..d1154d1c1 100644 --- a/apps/modclock/app.js +++ b/apps/modclock/app.js @@ -165,7 +165,7 @@ let draw = function() { } - + // draw the date, in a normal font g.setFont("Vector",18); g.setFontAlign(0,0); // align center bottom @@ -173,7 +173,7 @@ let draw = function() { var dateStr = require("locale").dow(new Date(), 1)+", "+ require("locale").month(new Date(), true)+" "+new Date().getDate(); g.drawString(" "+dateStr+" ", g.getWidth()/2, Y+9, true /*clear background*/); - + Bangle.drawWidgets(); // queue next draw if (drawTimeout) clearTimeout(drawTimeout); @@ -203,5 +203,4 @@ g.clear(); // Load widgets Bangle.loadWidgets(); draw(); -setTimeout(Bangle.drawWidgets,0); } From fc8ae6db6ae1dc820d5f701ac9eb4f3bedf28dcc Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 27 Jun 2025 10:01:32 -0400 Subject: [PATCH 23/27] Update README.md --- apps/setting/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/setting/README.md b/apps/setting/README.md index bbc724083..8de9c06e1 100644 --- a/apps/setting/README.md +++ b/apps/setting/README.md @@ -12,7 +12,7 @@ See below for options under each heading: ## System - System settings -* **Theme** Adjust the colour scheme +* **Theme** Adjust the colour scheme. Choose between light mode, dark mode, or a custom theme. * **LCD** Configure settings about the screen. How long it stays on, how bright it is, and when it turns on - see below. * **Locale** set time zone, the time format (12/24h, for supported clocks) and the first day of the week * **Clock** if you have more than one clock face, select the default one @@ -44,9 +44,9 @@ See below for options under each heading: * **Rotation** allows you to rotate (or mirror) what's displayed on the screen, eg. for left-handed wearers (needs 2v16 or 2v15 cutting edge firmware to work reliably) * **Wake on X** should the given activity wake up the Bangle.js LCD? * On Bangle.js 2 when locked the touchscreen is turned off to save power. Because of this, - `Wake on Touch` actually uses the accelerometer, and you need to actually tap the display to wake Bangle.js (we recently renamed the menu item to `Wake on Tap`). + `Wake on Tap` actually uses the accelerometer, and you need to actually tap the display to wake Bangle.js. * **Twist X** these options adjust the sensitivity of `Wake on Twist` to ensure Bangle.js wakes up with just the right amount of wrist movement. -* **Calibrate** on Bangle.js 2, pop up a screen allowing you to calibrate the touchscreen (calibration only works on 2v16 or 2v15 cutting edge builds) +* **Calibrate** on Bangle.js 2, pop up a screen allowing you to calibrate the touchscreen, ensuring your touches are mapped to the right place on the screen. (Highly reccomended for new users!) ## Locale From 3a7c17edb207eb71c69035d97c34cfe8483ad990 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 27 Jun 2025 10:05:09 -0400 Subject: [PATCH 24/27] Update README.md --- apps/setting/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/setting/README.md b/apps/setting/README.md index 8de9c06e1..e6d8a64c1 100644 --- a/apps/setting/README.md +++ b/apps/setting/README.md @@ -9,7 +9,11 @@ This is Bangle.js's main settings menu: * **Utils** - Utilities, including resetting settings See below for options under each heading: - +## New Users +These are some settings you should change right off the bat, if you are a new user. +* **Calibrate LCD** Make sure that the LCD touchscreen responds to touches where you expect them to +* **Locale** Set whether you want 12 hour time, and what day of the week the week starts on. + ## System - System settings * **Theme** Adjust the colour scheme. Choose between light mode, dark mode, or a custom theme. From 47a50c8ec8554efe4a58fc678b577e7969bbb867 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 27 Jun 2025 10:09:00 -0400 Subject: [PATCH 25/27] Update README.md --- apps/setting/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/setting/README.md b/apps/setting/README.md index e6d8a64c1..e8baef48f 100644 --- a/apps/setting/README.md +++ b/apps/setting/README.md @@ -14,6 +14,9 @@ These are some settings you should change right off the bat, if you are a new us * **Calibrate LCD** Make sure that the LCD touchscreen responds to touches where you expect them to * **Locale** Set whether you want 12 hour time, and what day of the week the week starts on. +## Apps - App-specific settings +This is where you adjust settings for an individual app. (eg. Health app: Adjust how often heart rate tracking should fire.) + ## System - System settings * **Theme** Adjust the colour scheme. Choose between light mode, dark mode, or a custom theme. From 424e008621388940c4a3de7509d7779452e78804 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 27 Jun 2025 16:10:34 +0100 Subject: [PATCH 26/27] Update README.md minor tweaks --- apps/setting/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/setting/README.md b/apps/setting/README.md index e8baef48f..4ed99edcc 100644 --- a/apps/setting/README.md +++ b/apps/setting/README.md @@ -8,18 +8,20 @@ This is Bangle.js's main settings menu: * **Alerts** - Set how Bangle.js alerts you (including Quiet mode) * **Utils** - Utilities, including resetting settings -See below for options under each heading: -## New Users -These are some settings you should change right off the bat, if you are a new user. +**New Users:** these are some settings you'll probably want to change right away: + * **Calibrate LCD** Make sure that the LCD touchscreen responds to touches where you expect them to * **Locale** Set whether you want 12 hour time, and what day of the week the week starts on. + +See below for options under each heading: ## Apps - App-specific settings + This is where you adjust settings for an individual app. (eg. Health app: Adjust how often heart rate tracking should fire.) ## System - System settings -* **Theme** Adjust the colour scheme. Choose between light mode, dark mode, or a custom theme. +* **Theme** Adjust the colour scheme. Choose between light mode, dark mode, or a custom theme. To adjust themes in more detail you can also use the [Theme Switcher App](https://banglejs.com/apps/?id=themesetter) * **LCD** Configure settings about the screen. How long it stays on, how bright it is, and when it turns on - see below. * **Locale** set time zone, the time format (12/24h, for supported clocks) and the first day of the week * **Clock** if you have more than one clock face, select the default one From 381efdb087bccb075cb47de6831f6cc2e1cc84b8 Mon Sep 17 00:00:00 2001 From: stweedo <108593831+stweedo@users.noreply.github.com> Date: Sat, 28 Jun 2025 17:21:03 -0500 Subject: [PATCH 27/27] =?UTF-8?q?Update=20iOS=20shortcut=20to=20include=20?= =?UTF-8?q?feels=20like=20and=20=E2=80=9Cmostly=20sunny=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/weather/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/weather/README.md b/apps/weather/README.md index 7e74d9f9d..f4b6615fc 100644 --- a/apps/weather/README.md +++ b/apps/weather/README.md @@ -10,7 +10,7 @@ You can view the full report through the app: ## iOS Setup -Use the iOS shortcut [here](https://www.icloud.com/shortcuts/738171beab944a5caacb4396f473811e). The shortcut uses Apple Weather for weather updates, and sends a notification, which is read by Bangle.js. To push weather every hour, or interval, you will need to create a shortcut automation for every time you want to push the weather. +Use the iOS shortcut [here](https://www.icloud.com/shortcuts/73be0ce1076446f3bdc45a5707de5c4d). The shortcut uses Apple Weather for weather updates, and sends a notification, which is read by Bangle.js. To push weather every hour, or interval, you will need to create a shortcut automation for every time you want to push the weather. ## Android Setup