Posted on

SOOTHSAYER 1.11 released

The first feature release of 2026 brings new MANET APIs with receiver antenna patterns, a major container refactor, offline 3D terrain, high accuracy tree canopy data and simpler licensing.

Multi link API

This API is designed for mesh and MANET networks and has already replaced the points API for the MANET tool on CloudRF. The Points API will endure for modelling an array of transmitters to a single receiver, like a route, but Multi-link takes it up a gear and tests all radios to each other, at once.

By passing in the entire network in a single API request, this is much more efficient than recursive requests and because of this it is able to model hundreds of bi-directional links in milliseconds without a GPU.

In the example below, 10 S-Band mesh radios around the Isle of Wight were modelled using Bullington diffraction with a single API request in 0.14s.

Multi-link can be called with an array of “radios” which have distinct features and noise levels making this well suited to mixed networks with different systems and antennas. Each radio is tested to the others and antenna patterns and orientation are considered for both the origin and destination.

{
  "site": "Site",
  "ui": 3,
  "network": "test",
  "radios": [
    {
      "lat": 50.67579947194087,
      "lon": -1.5873429660824838,
      "alt": 3,
      "frq": 2220,
      "txw": 2,
      "bwi": 2,
      "nf": "-110",
      "antenna": {
        "txg": 3,
        "txl": 0,
        "ant": 0,
        "azi": 0,
        "tlt": "0",
        "hbw": 360,
        "vbw": 25,
        "fbr": 3,
        "pol": "v"
      }
    },
   {...},
   {...},
   {...},
   {...}
  ],
  "model": {
    "pm": 10,
    "pe": 2,
    "ked": 2,
    "rel": "50"
  },
  "environment": {
    "elevation": 2,
    "landcover": 0,
    "buildings": 0,
    "obstacles": 0,
    "clt": "Temperate.clt"
  },
  "output": {
    "units": "m",
    "out": 2,
    "res": "30"
  }
}

Receiver antenna patterns

Receiver antenna patterns are important when working with directional antennas.

Historically we’ve answered this with receive antenna gain only with the assumption that the antenna is orientated toward the transmitter. This worked for omni-directional antennas and directional antennas which move, but most don’t.

By popular demand we’ve added this capability to the Multi link API but will not be adding another polar plot selector to the web interface as it is complex enough. If you are working with directional antennas the MANET tool will now allow you to model the impact of receive antenna nulls which are not obvious even with a clear line of sight.

Multi-azimuth and receive antennas demonstrating alignment and misalignment

Container refactor

We have consolidated 7 containers into 4 to reduce the size, complexity and management of multiple containers. The benefit is immediate from a much reduced download time for only 2GB of packed images (65% reduction) to a faster install and lower overall CVE score when scanned with vulnerability scanners.

The two GPU containers have been absorbed by a new “core” container, which is the largest. It’s logging has had work so you can filter for messages from a component (gpu_engine, 3d_engine, api) like the 3D engine for example:

$ docker logs --tail 100 --follow soothsayer-docker-core | grep 3d

[3d_engine] starting...
[3d_engine] Input path: /data/3D/input/
[3d_engine] Data path: /data/
[3d_engine] Output path: /data/
[3d_engine] Number of CPU workers: 2
[3d_engine] Number of GPU workers: 2
[3d_engine] Checking license...

The two web server containers (API and Frontend) have been consolidated into a single “httpd” container with a single .conf file making configuration changes simpler and improving visibility. Once installed the images are under 7GB.

$ docker image ls

soothsayer-loaded-image.localhost/soothsayer-docker-core:latest             c260a5993051       4.09GB          909MB        
soothsayer-loaded-image.localhost/soothsayer-docker-httpd:latest            e326003d5aff        145MB         36.8MB         
soothsayer-loaded-image.localhost/soothsayer-docker-map-proxy:latest        a1c286f0adb8       1.73GB          388MB   U         
postgres:16.13-bookworm                                                     7858a1a43bb2        616MB          155MB    U  

CVE scan reports

We have integrated automated CVE scanning in our pipeline now to improve security visibility for procurement.

The HTML reports will live in a SBOM folder along with our XML Software Bill Of Materials for third party libraries. We know customers are struggling with approving software so we’re hoping to educate and assist with this process where we can. In the age of AI slop it has never been easier to spin up a 3D map with widgets but it’s much harder to maintain and assure that through the development life cycle.

SOOTHSAYER is built on Linux so it has bugs….but they’re not all ours. Our goal is to detect and fix as many as possible before release and issue regular updates so customers can upgrade their software and remain protected.

For details on CVEs please email support@cloudrf.com

For bug fixes in our own software, see the full change log at the bottom of this blog.

Example CVE report summary

Offline 3D terrain

Go to any industry trade show and you’ll see beautiful 3D maps with 3D terrain and 3D buildings. Very few are running offline and need to stream these layers from a commercial third party service, with third party terms and conditions.

We have invested in our own Quantized mesh generator so we can finally cut the cord with third party providers and offer 3D terrain, on Cesium, offline. We’re able to do this on the fly using local DEM data so if you want to improve the resolution, replace the GeoTIFF data in your folders.

This development is the first of several offline 3D layers with buildings and trees already in production. Keep an eye out for these on CloudRF this year.

Developer console showing terrain files served from localhost

Accurate tree canopy data

Last year we processed 2M tiles of tree canopy data from Meta into CloudRF. This is now available on SOOTHSAYER for Europe, the US and other regions on demand either online as streamed data or offline via a data package.

The precision data improves accuracy in areas which previously had only 10m Land Cover data with a mean height for the tree canopy. The screenshot below is from Scotland where previously trees were sampled at a consistent height eg. 10m. Trees are permeable and using the clutter profiles, users can set the density for species and seasons.

For more information on the tree data and Machine Learning model used see this Meta blog post.

For some bedtime reading about vegetation attenuation values see ITU-R P.833

Tree tiles by country

2600 BELGIUM
4560 DENMARK
60360 France
37640 GERMANY
6780 IRELAND
30100 ITALY
8140 LATVIA
520 LUXEMBOURG
4720 NETHERLANDS
63856 NORWAY
33140 POLAND
1530 PORTUGAL
66480 SWEDEN
27560 UK
918080 USA

Simpler licensing

We’ve enjoyed handing out lots of SOOTHSAYER keys over the last year but our edge customers have had difficulty with the pseudo-random device ID for the host changing. The reason this changes is because it was based upon the physical MAC addresses on the host system. When these change, because the customer added a USB Ethernet adapter, the license must be re-issued which is frustrating when SOOTHSAYER has been prepared in one location then connected to a network elsewhere only to then stop.

This issue was becoming a regular ticket for edge users on laptops especially but not users in Cloud environments with a static NIC so we have taken the decision to relax the MAC address requirement.

Users can now use a license key on different computers without fear of the device ID changing. It is still using public key cryptography so they cannot grant themselves extra time or more seats on a server as we’re not completely daft!

A license key now describes a customer, and expiry and a number of permitted seats for that server instance only.

Changelog

1.11.0 03/2026

  • Deprecation: Removed debian:bookworm-slim container for testing GPU. Instead now uses the soothsayer-docker-core container.
  • Deprecation: Prompt to set database password during install.sh removed. Password is now always automatically set to a randomised string.
  • Deprecation: Removes unused and confusing LICENSE_SEATS_LIMIT, LICENSE_EXPIRY and LICENSE_CUSTOMER_ID keys from .env.
  • Deprecation: Device ID has been relaxed.
  • Feature: Added 3D tree coverage data for several European countries (Belgium, Denmark, France, Germany, Ireland, Italy, Latvia, Luxembourg, Netherlands, Norway, Poland, Portugal, Sweden, UK), and for the USA.
  • Feature: Considerably reduced container footprint, reducing to 4 total containers with a total disk size of ~5GB.
  • Feature: All containers, excluding database, adjusted to use common ubuntu:24.04 base image.
  • Feature: Added SHARED_MEMORY_SIZE option to change the DEM tile cache size.
  • Feature: Added optional DB_SHM_SIZE option to allow configurable shared buffer for PostgreSQL database.
  • Feature: Added SKIP_SSL_CERTIFICATE_RESPIN option to skip SSL certificate respin.
  • Feature: Added a check that the core container can reach the database.
  • Feature: Added RAM/disk usage checks to start.sh.
  • Feature: Added scripts/install-custom-dem.sh helper script.
  • Fix: Phase-tracing made non-interactive in install.sh with ENABLE_PHASE_TRACING variable.
  • Fix: Removed dependency for SOOTHSAYER to be installed when executing system-details.sh script.
  • Fix: Automatically set data/license directory permissions during each start.
  • Fix: Added maximum attempt catch when configuring GPU in install.sh.
  • Fix: MapProxy container adjusted to deploy using with production-ready configuration, rather than serve-develop.
  • Fix: Renames LICENSE_MAX_RADIUS, LICENSE_MAX_POINTS_LIMIT and LICENSE_MAX_BSA_RADIUS keys in .env to MAX_RADIUS, MAX_POINT_COUNT and MAX_BSA_RADIUS, respectively. This change was made to better reflect their usecase as they are not tied to licensing.
  • Fix: Improved error handling within database migration files.
  • Fix: Create GPU device nodes by running nvidia-smi in start.sh before bringing the containers up.
  • Update: API 3.33.0, UI 3.26.0, CPU Engine 1.20.0, GPU Engine 1.15.0, 3D Engine 0.2.4, Midgard 1.0.0, Bouncyball 0.4.4, AntennaWizard 2.1.1, Analysis Utilities (QRM2, SuperTool & NoiseGen) 1.1.1, Documentation 2.11.0.
  • Update: Database container updated to postgres:16.13-bookworm.

API

3.33.0 (2026-03-31)

  • Deprecation: Legacy antenna validator and endpoints removed.
  • Deprecation: html key no longer included in calculation responses.
  • Improvement: Improved error logging for analysis utils.
  • Fix: Tilt validation forced as an integer for some calculation endpoints. Should instead be a numeric to allow for floating point values.
  • Fix: Missing noise data should return HTTP code 409 not 500.
  • Fix: Custom clutter tiles not found by GPU engine.
  • Fix: Broken transmitter icon within multisite public links.
  • Fix: Fix issues with null noise names and group names.
  • Fix: multilink API ignoring multiple azimuths.

3.32.0 (2026-02-11)

  • Feature: Added frequency and partial to /noise/clear endpoint.
  • Feature: multilink endpoint includes receiver antenna pattern.
  • Feature: Added new multilink API for scalable mesh networks.
  • Improvement: Replaced public URL Google maps with Leaflet and CloudRF map layer
  • Fix: Set output.mod and output.ber to nullable when saving templates or MANET networks.
  • Fix: When retrieving a template which is not using BER units, set output.mod and output.ber values to null to avoid them being used and causing issues in subsequent requests.
  • Fix: Site and network names with numeric-only values are not being correctly interpreted as string length values.
  • Fix: Handle upper-case and lower-case values for antenna polarity.

3.31.0 (2026-01-23)

  • Feature: Antenna beamwidth (antenna.hbw and antenna.vbw) for area requests extended to lower limit of 1.0e-11.
  • Feature: Improved azimuth validation failure message to highlight both single and multi-azimuth acceptance.
  • Feature: Standardised validation messages of area, path, points and bsa.
  • Fix: BER colour schema is unable to be used correctly for some area calls.
  • Fix: Azimuth validation allows 0 through to 360, when it should be 0 to 359.
  • Fix: Improved noise floor data-type casting for path and points requests.
  • Fix: Improved points inversion to handle multi-azimuth for MANET requests.
  • Fix: Added tilt inversion on points when using MANET requests.
  • Fix: PPA calls not correctly appending _PPA to site name.
  • Fix: Multisite calculations not applying txl.
  • Fix: txl only applied when txg is present fpr path, points, and BSA requests.
  • Fix: Fresnel zone incorrect when using imperial units
  • Fix: Path calcs erroring without output.rad present in the request.
  • Change: Path and points endpoints return an error, rather than a warning, if the receiver is underground.

3.30.1 (2025-12-30)

  • Fix: Path API noise floor not handling strings
  • Fix: Points API noise floor not handling strings
  • Fix: Points API azimuth reversed to align with MANET tool

3.30.0 (2025-12-15)

  • Fix: Reduced upper limit of BSA radius.
  • Fix: BSA units can incorrectly be used with path and points requests.
  • Fix: Removes acceptance of output.rad for path and points requests. Distance between points is used.
  • Fix: Using output.out value of 5 (BER) with path and points requests leads to mismatched validations for output.mod and output.ber.
  • Fix: Improved validation errors for points requests when missing receiver.lat, receiver.lon and points.
  • Fix: Removed support for output.col on points as colour schema is not necessary.
  • Fix: Removed required transmitter.lat, transmitter.lon and transmitter.alt values with points requests as they’re not needed.
  • Fix: HF skywave endpoint always placing receiver in the eastern hemisphere.
  • Fix: Noise endpoint incorrectly applying frequency filter.
  • Fix: Public link layer export not centering on calcs with negative values.
  • Enhancement: Added SNR21.dB colour key in support of ATAK plugin

3.29.0 (2025-11-10)

  • Deprecation: Removes support for output.out, receiver.lat, receiver.lon, and receiver.rxs for BSA. BSA has its own measured units, and the receiver location and some radio settings are not necessary for BSA calculations.
  • Feature: P.1546 replaced with P.1812 model.
  • Feature: Added TREE tile type to support high resolution 3D trees.
  • Feature: Opens up BSA calculations to all propagation and diffraction models, with the exception of FSPL.
  • Fix: Using BSA without a colour schema was returning a received power colour schema. Default schema of BESTSITE.bsa is used as a default.
  • Fix: Using BSA with an unknown clutter file doesn’t throw a validation error.
  • Fix: Give calculation_adjusted message if radius is increased to be able to cover edges.
  • Fix: Latitude and longitude values stored in the archive can lose precision in some circumstances.
  • Fix: Requesting reprojected images with malformed metadata can result in source images being deleted.
  • Fix: ERP is incorrectly calculated on a public link export.
  • Fix: Network name always gets stored as BSA in the archive when running BSA. Now uses the network name.
  • Fix: Return a 500 if there’s an issue with creating custom clutter.

3.28.0 (2025-09-04)

  • Feature: Improved documentation on SOOTHSAYER DEM Manager.
  • Feature: Added support for frequency filter on /noise endpoint.
  • Feature: Default location updated to Ibiza.
  • Feature: SOOTHSAYER system status page now shows services which are online but require a license.
  • Fix: Public link export is returning a HTTP 500.
  • Fix: SOOTHSAYER system status page is slow to load in offline environments.
  • Fix: Increased maximum timeout for /merge and /mesh to be able to handle larger requests.
  • Fix: Refreshed the warning message when clicking “Reset Database” in the administrator dashboard for SOOTHSAYER.
  • Fix: Antenna favourite button is not obvious in the antenna manager.

UI

3.26.0 (2026-03-31)

  • Feature: Add terrain selection to imagery layer selection.
  • Feature: Noise manager improvements including a refresh button and a filtered delete.
  • Feature: Loading templates with unfavourited antenna patterns will be be automatically favourited.
  • Fix: Clear password field after submitting login form.
  • Fix: Console error from requesting unavailable imagery levels.
  • Fix: Signal tooltip missing for image layers larger than 16MP.
  • Fix: Loading a template with a custom antenna pattern sometimes produces an incorrect antenna plot.
  • Fix: Loading a calculation with a custom antenna pattern doesn’t change the antenna mode.
  • Fix: HF Skywave templates unable to be saved.
  • Fix: Loading calculations from the archive didn’t set receiver sensitivity and noise floor correctly.
  • Fix: Loading AMSL calculations from the archive set the units to AGL.
  • Fix: Very high feeder loss efficiency considered “Good”.
  • Fix: Erroneous receiver sensitivity warnings when changing measured units.
  • Fix: Missing calculations from network when opening archive.
  • Fix: Noise floor and receiver sensitivity are no longer auto-adjusted when bandwidth is changed.
  • Fix: Disabling MANET during calculation can result in rogue layers being left on the map.

3.25.1 (2026-02-25)

  • Fix: Saving a template with a RCS value of 0 when not using RADAR
  • Fix: Elapsed time in console rounded off

3.25.0 (2026-02-12)

  • Feature: MANET links now calculated with a single Multilink request.
  • Fix: Retrieving a layer from archive with the default colour schema.
  • Fix: MANET link sensitivity mismatch when mixing units.
  • Fix: MANET using stale values for reports when links disabled.

3.24.3 (2026-02-09)

  • Fix: Added spin-lock to calculate button for GPU calculations.
  • Fix: RCS value not sent for points API requests using RADAR.
  • Fix: Multipoint links and route analysis imperial ASL logic moved to API
  • Fix: Loading MANET network from archive reporting missing site.
  • Fix: Improved handling of output.mod and output.ber when using BER units

3.24.2 (2026-01-15)

  • Feature: Add automatic validation for noise floor input.
  • Fix: MANET allows adding nodes with broken settings.
  • Fix: API validation failure for output.ber and output.mod when using MANET.
  • Fix: View reset working with D.M.S and MGRS

3.24.1 (2025-12-30)

  • Fix: MANET marker offset when dragging
  • Enhancement: fxaa smoothing applied to 3D terrain

3.24.0 (2025-12-29)

  • Fix: Map resolution uses devicePixelRatio to fix aliasing
  • Fix: FBR and RCS not being sent for PPA requests.
  • Fix: BER and modulation shouldn’t be sent for PPA requests if not using BER units.
  • Fix: Receiver sensitivity not necessary for PPA requests if using BER units.
  • Fix: BER units not using BER colour schemas.

3.23.1 (2025-12-11)

  • Fix: Units other than received power are not allowed with Best Server tool.
  • Fix: HF skywave path profile tool ignore reliability and context.

3.23.0 (2025-11-10)

  • Feature: Throw warning when receiver sensitivity lower than the selected colour schema.
  • Feature: Improved guidance for how to get details of failed calculations during auto-processing.
  • Fix: Auto-processing doesn’t support multi-azimuth.
  • Fix: Auto-processing not correctly validating non-numerical values.
  • Fix: Auto-processing incorrectly attempting to process values which have failed validation.
  • Fix: “Antenna ID not favourited” link during auto-processing doesn’t work when using antenna name.
  • Fix: Removed a phantom path profile legend entry with buildings, but not landcover, enabled.
  • Fix: Separates RSRP and received power in chart as both use dBm

3.22.0 (2025-10-26)

  • Feature: Organic 3D quantized terrain for CesiumJS
  • Feature: Import noise manager.
  • Improvement: Organic Geocoder for CesiumJS
  • Fix: Disabling bounds leaves behind small artifacts on the map.

3.21.0 (2025-10-02)

  • Improvement: ITU-R P.1546 superseded by ITU-R P.1812.
  • Deprecated: Cesium ion data to be removed in October 2025 following hostile ToS update threatening audits
  • Deprecated: Removed Cesium ion imagery for a selection of four including two user defined
  • Fix: Using altitudes with fractional values on path calls ignores the decimals.