• 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
    2k 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
    435 Views
    No one has replied
  • [Inspiration] Share your app ideas

    Pinned inspiration peer-support
    49
    5 Votes
    49 Posts
    8k 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
    15k 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
    155
    4 Votes
    155 Posts
    24k Views
    J
    @SuuntoPartnerTeam I had my app parat io released beginning of august 26. But since 16.8.2026, v1.3 no updates I ship are not published to the store. The Last deployed App version is v1.8 - but the App which is shipped by Suuntos App Store is still v1.3 The App Deskription will update but the app itself wont. Now I am stuck with an app I cant update anymore. Is there anything I can do, or any service i could contact? Why this matters beyond my one app: Critical bugfixes can’t be shipped in time - if a community app has a real bug, there’s currently no way to get the fix to users. Bad experience for Suunto customers - people are installing and rating outdated builds while the store listing looks fully up to date. Intransparent process for devs - no status, no version info, no feedback anywhere in Apizone about what’s actually being served or whether an update is pending, processed, or rejected. That’s tough after spending hours to elevate the Suunto eco system. p.s. the app ID is zzpara01
  • SuuntoPlus app stuck & no Updates shipped anymore

    13
    1 Votes
    13 Posts
    600 Views
    J
    @Dimitrios-Kanellopoulos for me its IOS
  • 6 Votes
    7 Posts
    786 Views
    S
    The new indoor climbing app looks awesome!
  • app compatibility with different models

    2
    0 Votes
    2 Posts
    142 Views
    Łukasz SzmigielŁ
    @rémiP Baro 9 is UI1, Race S and Race 2 are UI2. UI1 has far lower resources than UI2 devices. But Race S should work with your app.
  • Graph curve missing

    2
    0 Votes
    2 Posts
    151 Views
    C
    Ok, seems like the watch only renders 12 points, not 96… For now I’ll use a stepped line.
  • Is it possible to access currently selected target hr/pace zone values?

    1
    0 Votes
    1 Posts
    112 Views
    No one has replied
  • 0 Votes
    2 Posts
    222 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
    187 Views
    No one has replied
  • 0 Votes
    1 Posts
    135 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
    327 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!

Suunto Terms | Privacy Policy