Skip to content

SharpJS Official Open-Source Release v1.7!

Choose a tag to compare

@DiamondFlight DiamondFlight released this 16 Oct 22:37

1.7.0 — 2026-10-15

Added

  • A BUFKIT station picker in the controls with a searchable, zoomable map. Station locations
    come from the bundled station catalog, while available station IDs are read from the IEM archive.
  • A location inset on the hodograph showing OpenStreetMap tiles around the sounding, with a marker
    for the sounding location and map attribution.
  • A UTC time slider for BUFKIT forecast hours and archived NEXRAD VWP volumes. BUFKIT slider
    selections update the forecast hour from the same file; VWP archives can be loaded for a chosen
    date and hour, covering the preceding three hours.
  • Function documentation throughout the viewer engine and reusable canvas path/line helpers.
  • SharpJS(element, props): one call draws an interactive sounding with its controls. Calling it again with
    new props updates the same chart. Several charts can share a page.
  • Headless sharpjs/core: parseSounding, fromArrays, analyze, levelAt, exportSounding — runs in Node.
  • Remembered settings with a versioned schema (localStorage, cookie, memory or a custom adapter). Presets can
    be pinned or left on automatic.
  • Standalone site (app/) with sample soundings, drag-and-drop, and archive loaders for IEM RAOBs, IEM BUFKIT
    files and Unidata NEXRAD VWPs (sharpjs/sources). It remembers the last sounding.
  • Reading BUFKIT files directly (column order from SNPARM, any forecast hour) and NEXRAD VWP files.
  • TypeScript declarations, unit tests and browser tests.

Changed

  • BUFKIT archive downloads now load and cache all forecast hours together, reducing repeat requests
    when selecting different hours from the same run. VWP location maps are shown in the panel above
    the wind-barb display, and VWP timeline playback is disabled.
  • Bunkers right/left storm motions now use the parcel-based method described by Bunkers et al. (2014),
    with the SHARPpy non-parcel calculation retained as a fallback; related kinematic reference values
    and tests were updated.
  • Updated parcel, layer-interpolation, thermodynamic, SRH, and severe-weather calculation logic as part
    of the analysis alignment and verification work.
  • Updated package and chart versioning to v1.7.0 and refreshed repository links and release guidance.
  • No hosted services, data or branding. Hosts set their own credit with brandLabel, savedBy and
    filePrefix.
  • The map inset in the hodograph is now supplied by the host through mapImage (there was a Mapbox call).
  • ACARS loading and the model/location pickers were removed; hosts pass their data in.
  • Help text: arrow left/right on the Skew-T subtract/add 1 °C (the text had them swapped).

Fixed

  • Corrected ECAPE supporting calculations, including storm-relative wind components and NCAPE
    integration over the sounding's height grid.
  • Corrected parcel and thermodynamic edge cases in LCL, virtual-temperature, layer, and buoyancy
    calculations.
    • The Skew-T skew reset to Default on every full redraw.
  • ECAPE and the custom 0–2 km SRH used the previous storm motion when a sounding was first drawn (often
    showing "--").
  • A custom storm motion was replaced by 0°/10 kt whenever the chart fully redrew.
  • Surface edits ignored zero values: 32 °F / 0 °C kept the old temperature, 0 kt became 10 kt, a north wind
    became 180°.
  • A height-based custom lapse-rate layer was recomputed as if its heights were pressures after a redraw.
  • CM1 export wrote heights above sea level instead of above ground.
  • GetSRH(..., "Hght") threw a ReferenceError; ecape_parcel used Python's True as a default value.
  • Loading a sounding while comparisons were shown passed them as "ghost" soundings.
  • Reading a CM1 file overwrote the chart's parameter state.