• How to get started!

    Pinned Locked
    1
    15 Votes
    1 Posts
    2k Views
    No one has replied
  • [Guide] How to get deploy working on Linux

    Pinned guide linux suuntoplus development
    5
    18
    5 Votes
    5 Posts
    1k Views
    C
    @SyncBypass Perfect, thank you!
  • [Tip] How to save/load persistent data

    Pinned tip settings variables tutorial json manifest
    9
    2 Votes
    9 Posts
    1k Views
    A
    @SuuntoPartnerTeam Hello! I’m currently developing an app and own a Suunto 5 Peak watch to test my app. I have followed the manuals and examples, and everything works as expected, except that it looks like my app crashes (or glitches) as soon as it is uploaded to my watch. After commenting out and uncommenting parts of the code, I discovered that it looks like localStorage is not available at all, so the settings cannot be loaded. My app heavily depends on being able to configure these settings. So, what am I doing wrong? Why might localStorage be unavailable inside onLoad, and how should I access it to load my app’s settings? Thank you!
  • 1 Votes
    5 Posts
    1k Views
    S
    @guderaber There is no way to sync images. Also no information to share regarding limitations either, I’m afraid !
  • Examples explained

    Pinned development
    6
    2 Votes
    6 Posts
    2k Views
    SquirrelS
    @Martin-Lillepuu Exactly, and also keep the custom watchfaces (once available) for personal use without going through the bureaucratic hoops of publishing them to official store.
  • [Tip] Helpful CSS for custom layouts

    Pinned tip css development
    1
    0 Votes
    1 Posts
    416 Views
    No one has replied
  • [Inspiration] Share your app ideas

    Pinned inspiration peer-support
    49
    5 Votes
    49 Posts
    7k Views
    T
    @Horizontal_2 I’ve used waypoints that I’ve added on the route for this purpose. This only works if you have the the route so a separate app might be a good idea anyway. I might take a look at this!
  • [Discussion] Share your projects

    Pinned discussion peer-support
    95
    1 Votes
    95 Posts
    14k Views
    M
    I have previously shared my implementation of a structured interval guide. [image: 1781683549257-interval_recover.jpg] As it was not possible to upload FIT files to the watch I decided to implement the setup of a structured interval run on the watch like this. [image: 1781683569172-combined_setup.jpg] Three different interval profiles are stored on the watch. Initial defaults are: 2 x 12 min @ 101% of LT pace 5 x 6 min @ 107% of LT pace 10 x 1 min @ 113% of LT pace The user can change repetitions, interval duration and pace. The new settings will be saved in the profile for the next interval run. Speed zones are retrieved from the watch and used to set LT pace and reasonable pace for warm-up, recovery and cool-down. Recovery duration is set to match interval duration with a lower and upper limit. The watch did not support creating four separate SetUp screens for the UI. So one screen was used in combination with setText for the label and parameter being changed. To avoid problems with rounding effects in Suunto firmware, pace (seconds per kilometer) was used in main.js which was converted to speed (m/s) only when output.
  • 1 Votes
    11 Posts
    2k Views
    M
    One thing that caused my grief when working with subscribed signals (HR, pace) in main.js or in onLoad is that on the simulator signals are always available. On the watch subscribed signals seem to transition from ‘undefined’ -> ‘NaN’ -> a valid number. I ended up needing to protect any use of these signals by using isFinite(), like this. // Get the index of the the active zone for a 5 zone HR gauge // v current value // zones an array of 4-values defining the 5 zones function getActiveZone(v, zones) { if (!isFinite(v)) return 0; for (var i = 1; i < zones.length; i++) { if (v < zones[i]) return i - 1; } return zones.length - 1; } Inserting systemEvent() was quite effective in pinpointing the point of failure once I understood how to do it. But I do not really get any error message, just something like this. [MR] messages are inserted by me, so I can see something happened after “G4a”, but not what the actual error was. #3251371 26.05.2026 17:44:39 : EVT UI_FRAMEWORK : JS [MR] G1 #3251372 26.05.2026 17:44:39 : EVT UI_FRAMEWORK : JS [MR] G2 #3251373 26.05.2026 17:44:39 : EVT UI_FRAMEWORK : JS [MR] G3 #3251374 26.05.2026 17:44:39 : EVT UI_FRAMEWORK : JS [MR] G4a1-not-supported #3251375 26.05.2026 17:44:39 : WRN UI_FRAMEWORK : JS I am more of a Swift or C# person used to verbose error messages and traceback. But maybe I have been spoiled.
  • [Question] No stupid questions - ask anything here

    Pinned
    154
    4 Votes
    154 Posts
    21k Views
    PrenjP
    @sky-runner yes, basically something like Up ahead app for on-route waypoints. Up ahead shows next 3 waypoints if I’m not mistaken, but my idea is having scrollable list of all waypoints on current route if possible. And I agree that this should be built in feature. But if it’s not going to happen, then this app would be something I’d be using in almost every activity. Unfortunately, at this moment, I think it’s still not possible to do. But I’m going to keep an eye on it because I’m really interested in this kind of feature.
  • Is it possible to access currently selected target hr/pace zone values?

    1
    0 Votes
    1 Posts
    97 Views
    No one has replied
  • 0 Votes
    2 Posts
    185 Views
    omunozO
    Follow-up: I ran the test, and I can answer my own question 5. The eviction path does not release the app’s JS context, and the shared heap is exhausted inside a single four-minute exercise. Method: fresh reboot, one exercise, three apps enabled, triggering the eviction repeatedly by switching screens and opening/closing the map. After each eviction I re-enabled my app from the SuuntoPlus menu without ending the exercise. Four evictions in four minutes # time how long my app survived after being enabled 1 14:48:40 118 s 2 14:49:07 14 s 3 14:49:57 33 s 4 14:50:27 15 s 118 s the first time, 21 s on average afterwards — an 87% collapse. The heap is at 99.5% Two lines from the firmware itself, 16 seconds before the first eviction: 14:48:24 : WRN UI_FRAMEWORK : JsTotMem 129980/133120 (97.6%) 14:48:29 : WRN UI_FRAMEWORK : JsTotMem 132412/133120 (99.5%) This is the only figure the system has ever given me about its own limits, and it is not documented anywhere. An earlier report on this forum (topic 15490) describes the watch freezing at essentially this same level. Nothing is ever released None of the four evictions is followed by JS discard. The first and only one in the whole session appears at 14:50:35, when I stop the exercise. So every Disable → Load script → Enable cycle instantiates the module scope again while the previous one is still held. That also reframes the “three apps” case. It is not that a third app is too big — my own footprint is 12.4 KB, resident main.js plus the single mounted template. It is that three apps cycling through evictions exhaust a shared pool that nothing empties until the exercise ends. One caveat on reading this The intervals between evictions look almost constant (27, 50, 30 s). That number measures how fast I re-enabled the app by hand, not the watch. Survival time is the honest metric. And the last three survival times being similar does not mean it stabilised — it means the pool was already full before I started measuring. At 99.5%, any re-enable trips the release callback almost immediately. So, concretely Is Zapp X:Disable without a following JS discard expected to leak the module scope? If yes, a firmware eviction is not a recoverable event — it permanently consumes shared heap, and the watch degrades within a single session. Is there a supported way to make an app release its context on eviction, or to be re-enabled cleanly within the same exercise? What is the intended budget per app against the 133 120 B shared heap when three apps are enabled, which is the configuration FW 2.50.26 added? I have the full logs and the built blob available if that helps, and I am happy to run any test you would like measured.
  • End to End Test Plus App with Suunto App

    1
    0 Votes
    1 Posts
    165 Views
    No one has replied
  • 0 Votes
    1 Posts
    115 Views
    No one has replied
  • Need help connecting to the watch on macOS

    13
    0 Votes
    13 Posts
    2k Views
    N
    @Starfish2045 Hi, I Had a similar issue, getting an error inside VSC while trying to find the connected watch and found that manually running the SDSApplicationServer did work out, but after an update to the VSC Extension it stopped working because the extension closed the external instance i ran in the beginning. Tried modifying the SDS.js with no success. Would you mind posting the change you’ve made?
  • 0 Votes
    4 Posts
    281 Views
    A
    @brechtvb Thanks a lot for your reply! I really appreciate you sharing your experience and the Bosch eBike project. It looks like a great starting point for understanding how BLE communication works in Open SuuntoPlus. My goal is actually quite simple. I’d like to connect to a GoPro and display information such as: Recording status Battery level Remaining storage or recording time At least for the first version, I don’t even need camera control. I’ll definitely take a look at the project you shared. If I make any progress, I’ll post an update here so others can benefit as well. Thanks again!
  • Is-it possible to use the geoCoordinates with simulator ?

    1
    0 Votes
    1 Posts
    115 Views
    No one has replied
  • 1 Votes
    1 Posts
    200 Views
    No one has replied
  • An error occurred when updating the sports app

    2
    0 Votes
    2 Posts
    246 Views
    mickywickyftwM
    Fixed. “modificationTime”: was wrong in the manifest.json.
  • HR Slope - is it accessible/usable in app?

    1
    0 Votes
    1 Posts
    186 Views
    No one has replied

Suunto Terms | Privacy Policy