• 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
    855 Views
    C
    @SyncBypass Perfect, thank you!
  • [Tip] How to save/load persistent data

    Pinned tip settings variables tutorial json manifest
    8
    2 Votes
    8 Posts
    1k Views
    H
    @SuuntoPartnerTeam Thanks. Exactly what I have expected.
  • 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
    1k 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
    306 Views
    No one has replied
  • [Inspiration] Share your app ideas

    Pinned inspiration peer-support
    49
    5 Votes
    49 Posts
    6k 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
    90
    1 Votes
    90 Posts
    11k Views
    D
    First of - thanks to Suunto for opening up the possibility to enrich their marvelous watch lines with features that many users have been missing! It is always amazing to see where the combination of ingenuity and a (somewhat) open development platform takes us. Being a road-runner with some sort of ambition to optimize races I have been missing a race pacer that allows for freely defining pace segments. The races I have participated in (Gothenburg area, Sweden) are quite often pretty hilly and I have found that I waste energy in the wrong places and therefore needed an app that could provide some guidance. The requirements were pretty close to “RaceWarden Pacer” - but I was missing the possibility to define the distance for the various segments of the race. And. With age comes poor eyesight, so I needed BIG (and clear) numbers to control the pace. The logic/thinking: You define your pacing strategy based on the elevation profile of the race and potentially other factors - this is all done outside of the app. Example from “Göteborgsvarvet” where I decided to try Jack Daniels’ Running Formula which roughly translates to -8s/km/%-gradient (uphill) and +5s/km/%-gradient (downhill). But that is outside the app, just the background to the pacing strategy. [image: 1780157300180-2026-05-18_19-54-08.png] The pacing strategy is pushed to the app through user defined app settings: Segment Distances (km or mile): 2.45 1.79 1.36 1.36 6.59 7.8 Segment paces (min/km or min/mile): 5:18 5:03 5:37 4:55 5:12 5:14 (Is it possible to have two input fields in app settings?) With the user input the total race length is calculated by summation of the Segment Distances (21,35km) - overall race target time (1:51:26) as well as target pace (general) is also calculated. Then comes the tricky part. What is really needed / what can be displayed to help pacing (remember: poor eyesight)? I removed heart rate as I have found it does not work (for me) during races, and landed in the following configuration: [image: 1780125397727-2026-05-30_00-06-13.png] Segment Target Pace: Derived from user input and displayed once a segment is recognized/completed. In essence this is a pretty static value, that only changes when a segment is completed. Segment Pace: Calculated. Similar to Lap Pace but utilizes the user defined Segment Distances/Segment paces, so it’s dynamic and updates as you run. Total Seconds ahead/behind Race Plan: Defined as the deviation between race plan and completed distance/time; naturally dynamic. Needed Pace: Based on initial user input finishing time and total race length are calculated. This is the pace needed for the remaining part of the race to reach the target What would you see as missing? The remaining challenges: I would like to have (I believe) at least some indication on heart rate - but I am not able to get the standard zone gauge to work and lack the skills to create one by myself with the canvas mysteries I tested to include an additional ahead/behind indicator focusing on ahead/behind per segment - but felt that it became more confusing and the display became to crowded - could this potentially be incorporated as a gauge? Compatibility - I believe maximizing fonts will be problematic for smaller watches but have not really had the energy to investigate what/how to make sure it works also for smaller displays Contrast - to me it seems yellow offers the best contrast, but is it just my eyes or a more common phenomenon? All input welcome! (unfortunately it seems my application for the partner development has got lost in the mail, as I applied many weeks ago) Also - I used the app (very successfully) during a recent race!
  • 1 Votes
    11 Posts
    1k 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
    146
    4 Votes
    146 Posts
    16k Views
    R
    I developed the “PumpFoil” app and I have a problem to solve with the GPS. Actualy, in the app, when the speed is up to 10 Km/H, we consider that we are foiling,.but sometimes, the speed rise above 10Km/H while we are stationary. The only way I found to avoid this problem is not to record any start of foiling in the 20 seconds folowing the immertion of the device. I would like to find another way because this one is not usable for SurfFoiling. Is it possible to know when the GPS precision is poor (not enought satellites for example) ? I tried the “/Fusion/Location/Readiness” but it seems that it remains at 100. another idea ?
  • Issues RestTimer

    6
    2
    0 Votes
    6 Posts
    413 Views
    MantaM
    @Markus-Hornof cheers mate! Thank you very much
  • Debugging and troubleshooting

    2
    0 Votes
    2 Posts
    103 Views
    M
    @DonTomGot I am no JS expert myself. But some tips. The watch runs Duktape JS engine, which is only ES5.1 compliant. The simulator runs QuickJS I think. So code that will work OK in the simulator may silently fail on the watch. There is a pinned thread on the difference between simulator and watch, you can check there for advice on some of the typical stumbling blocks. For instance the missing semicolon on the return statement will work in the simulator but likely fail on the watch. I would also use “View system events” in the “Suunto watch view”. A lot of the failures are silent or not easy to decode, but you may find something. You can also insert your own systemEvent statement to “print” to the event log and get a traceback that way.
  • SuuntoPlus uiView lifecycle — subscription behaviour

    1
    2 Votes
    1 Posts
    118 Views
    No one has replied
  • Precise alignment of text and numbers

    5
    3
    4 Votes
    5 Posts
    377 Views
    Steven HambletonS
    @matram We’re still eagerly awaiting the custom watch face functionality!
  • 3 Votes
    6 Posts
    419 Views
    M
    @Łukasz-Szmigiel No I do not think so, there is only a single output in the manifest and three inputs. It seemed more load related as staggering canvas refreshes removed the problem. Worth nothing, on at least one occasion the canvas went black first then as a consequence of the load resulting in handling of that exception (we think) we got the pool full.
  • Spent a few hours playing with Suunto Plus

    6
    1
    15 Votes
    6 Posts
    890 Views
    M
    @Steven-Hambleton These are the font sizes available. There is plenty of options for larger size … f-d-xxxl: data field font, 85px for medium, 155px for large display f-d-xxl: data field font, 65px for medium, 118px for large display f-d-xl: data field font, 57px for medium, 103px for large display f-d-l: data field font, 50px for medium, 91px for large display f-d-m: data field font, 42px for medium, 78px for large display f-d-s: data field font, 35px for medium, 65px for large display f-d-xs: data field font, 25px for medium, 46px for large display However there is not much room for fine tuning at the lower end. I tried rendering text on a canvas and displaying that. It works but takes a bit more effort to program.
  • SDS service is suspected malware after Mac Tahoe upgrade to 26.5.1

    1
    0 Votes
    1 Posts
    96 Views
    No one has replied
  • [Bug] Maximum SuuntoPlus Apps Reached

    9
    0 Votes
    9 Posts
    930 Views
    M
    Another data point. I am working on app where I have included 12 minutes of actual HR data in main.js in a Uint8 array. This works nicely on the simulator but it fails on the watch. The app can be loaded but not activated, “too many apps”. If I comment out the test data and reloads the app on the watch, the app can be activated without error. It cannot be a memory constraint issue. I have separately verified that I can create arrays with up to 4000 elements and heap memory may be around 28k on the Race S. Some issue with parsing the declaration?
  • This topic is deleted!

    1
    2
    0 Votes
    1 Posts
    59 Views
    No one has replied
  • Asking ClaudeCode to decode Suunto Guide files

    6
    0 Votes
    6 Posts
    500 Views
    Dimitrios KanellopoulosD
    @matram ok right. I was confused. Workouts != activities. I can try to implement a workout upload but I see that ideally you need api access to suunto. for that I suppose you should mail them unfortunately.

Suunto Terms | Privacy Policy