Subcategories

  • Discussion about suunto plus development

    45 Topics
    481 Posts
    S
    Suunto Vertical 2, FW 2.53.42 (HW 1424B3). (Edited 2026-07-10: cut this down a lot. It now reproduces with Suunto’s own stock apps — no third-party code needed.) TL;DR: disabling a single SuuntoPlus app in the in-exercise menu never runs JS discard. Everything below points to each re-enable leaking the app’s compiled module scope into the shared JS heap. Toggle one app off/on often enough without leaving the menu and the watch UI freezes — for good, until you plug in the cable or reboot. Reproduction Start any activity with a few SuuntoPlus apps enabled. Options → SuuntoPlus → disable Gear Tracker, re-enable it, stay in the menu. Repeat, roughly once per second. Around the 10th re-enable the UI locks up. 2026-07-10, Gear Tracker alone after a fresh reboot: 08:44:33 : EVT APPLICATION : Zapp zzgearen:Enable <- first enable, ~10 in-menu re-enables at ~1/s follow 08:44:45 : WRN UI_FRAMEWORK : JsTotMem 132180/133120 That’s the JS heap at 99.3% (133120 B, shared by all enabled apps). After that line: nothing. The watch never recovers on its own — every “recovery” in my logs lines up with a VBUS state is ON (cable) or a restart. (An earlier version of this post claimed a ~45 s self-heal; that was wrong, I had plugged the cable in.) Leaving the menu between toggles avoids the whole thing. That path disables all zapps together, and there the discard runs: 15:37:14 : EVT APPLICATION : Zapp climbl01:Disable 15:37:14 : EVT APPLICATION : Zapp zzmoveen:Disable 15:37:14 : EVT APPLICATION : Zapp zzwethen:Disable 15:37:14 : EVT UI_FRAMEWORK : JS discard disable zapps A single-app disable inside the menu logs no discard — just Disable, and Load script/Enable again on the next toggle. What leaks I narrowed it down with four ~20-line probe apps, each toggled alone after a fresh reboot: probe main.js module-level fns extras result P0 134 B 1 — 56 re-enables, clean P2 134 B (same as P0) 1 4 templates, each with 775 B of onLoad JS 49, clean P3 233 B 1 2× getObject on a 1015 B store per re-enable 50, clean P1 1446 B 20 — frozen at ~10, twice P0 and P1 differ in exactly one thing: how many module-level functions the dispatcher closes over. So what leaks seems to be the app’s instantiated module scope — the function objects plus whatever they capture — one copy per re-enable that skipped the discard. Templates and localStorage are off the hook, and so is raw byte size: ZoneSense (2166 B, 3 fns) survived ~30 toggles while Gear Tracker (2349 B, 14 fns) dies at ~10. Weather (454 B / 0 fns) did 15 clean, Indoor Climbing (781 / 0) ~25, and Suunto Climb (2941 / 10) froze at ~10 like Gear Tracker. By the way: P1’s freeze leaves no log line at all. The last Load script/Enable pair looks perfectly healthy, the UI just never responds again. Bigger apps fail differently My own app (7.5 KB main.js, ~40 module fns) doesn’t even get to heap-full — re-enable #2 already fails while compiling, because the loader can’t place a ~2.6 KB contiguous block on the fragmented heap. 2026-07-09, activity recording, three apps enabled: 15:21:00 : EVT APPLICATION : Zapp climbl01:Load script 15:21:01 : ERR APPLICATION : Zapp:relMemCb (exec:zapp) 15:21:01 : ERR APPLICATION : Zapp 3:RelMem->unload (x2 - both other apps force-unloaded) 15:21:01 : ERR APPLICATION : Zapp:RelMem->None avail 15:21:01 : ERR DUKTAPE : JSalloc:2636 (x11 within one second) 15:21:01 : ERR DUKTAPE : Compiling js failed: Error: 1 15:21:01 : EVT APPLICATION : Zapp climbl01:Disable <- firmware gives up Looks like the same root cause with a different resource giving out first — big apps hit fragmentation (the JSalloc storm), small apps just fill the heap until JsTotMem, or silence. The leaked contexts also poison later allocations: after a few in-menu toggles, even ending the exercise storms on my end-of-session evalFile (~2 KB, works fine on a fresh heap). Questions Is skipping JS discard on a single-zapp disable intentional, or a bug? Could the discard (or a heap compaction) run on the single-app path too? That would remove this freeze entirely. Is there any guidance on the ~133 KB shared JS heap budget? The apizone docs don’t mention memory at all. Full device logs of everything above plus the four probe apps (source or .fea) available — happy to share here or through another channel. Update, same evening: two more probes to figure out what actually sizes the leaked context. Same layout as P0-P3, but each also parses two small ext files a few seconds after every enable and nulls those references again in onExerciseEnd. P4: 3260 B main.js, 17 module functions — died at ~6 re-enables in all four runs. Fast and slow toggling gave the same count, just a different last gasp: the fast bursts wedge silently, the slow runs storm JSalloc:2095 on the cycle-6 ext parse. P4b: 1516 B, about the same size as P1 (1446 B), but only 8 module functions — ~43 re-enables, then JsTotMem 131712/133120. At roughly equal bytes, 8 functions bought 4x more toggles than P1’s 20: what sizes the leak is the number of module-level function objects, not the source bytes. And the ext files cost nothing — the slow runs parsed + nulled both of them on every single cycle and still matched the fast count. Details that might help localizing it: onExerciseEnd (event 1024) fires on every in-menu disable, exactly once — I counted it into the app’s store: 43 toggles, counter +43. The lifecycle is fine, the context just never gets freed. The wedge only kills the UI/input layer. The app’s JS keeps running underneath: its scheduled ext parse still fires 4-5 s into the wedge, and in one run a failed parse kept retrying every 3 s for 13 minutes while the watch was unresponsive. A short charger pulse un-wedges the watch without a reboot, and afterwards the same app survives a fresh round — whatever the charger interrupt triggers looks a lot like the cleanup the single-app disable skips. On a heap full of leaked contexts even a 1.3 KB ext file fails to eval, asking for a 2095 B contiguous block (JSalloc:2095) — the parse buffer is clearly well above the file size itself.
  • Discussions about S+ WatchFaces

    65 Topics
    1k Posts
    N
    @Inge-Nallsson thank you for the detailed reply. Watch face is the same. No improvement. Will wait for the update. Thank you
  • Discussions about S+ Sports Apps - watch apps which extend functionality of your watch sport modes

    202 Topics
    3k Posts
    L
    @DonTomGot ok thanks! Can it be listed in the app information? Is it just the visual issue? Numbers would be accurate?
  • How/where/who to ask for new suunto+ integration

    3
    1 Votes
    3 Posts
    1k Views
    Michele SellaM
    @Muhammed-Fasil garmin is getting support for bosch ebike from 04/05/2026. I’d also at least like to know if someone at suunto is working on it or users will need to apply to partner program and do their self. I really hope that bosch will transmit data over standard protocol and not a special link to allow just garmin to do it. At today Riva bike fest a bosch guy told me it is standard bluetooth 5.0 but it was not a tech guy so i would not trust that affermation too much.
  • Watchface Updates?

    2
    0 Votes
    2 Posts
    401 Views
    EgikaE
    @Nordic_Panda yes, exactly like this.
  • 3rd party widgets support

    Moved
    7
    5 Votes
    7 Posts
    2k Views
    Ondřej DeingruberO
    @Egika I am looking for a way specifically how to run a 3rd party app outside a activity, it feels silly to open an activity to check your todo-list or other app that might be more connected do casual daily activities.

Suunto Terms | Privacy Policy