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.
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.
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.
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-slimcontainer for testing GPU. Instead now uses thesoothsayer-docker-corecontainer. - Deprecation: Prompt to set database password during
install.shremoved. Password is now always automatically set to a randomised string. - Deprecation: Removes unused and confusing
LICENSE_SEATS_LIMIT,LICENSE_EXPIRYandLICENSE_CUSTOMER_IDkeys 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.04base image. - Feature: Added
SHARED_MEMORY_SIZEoption to change the DEM tile cache size. - Feature: Added optional
DB_SHM_SIZEoption to allow configurable shared buffer for PostgreSQL database. - Feature: Added
SKIP_SSL_CERTIFICATE_RESPINoption 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.shhelper script. - Fix: Phase-tracing made non-interactive in
install.shwithENABLE_PHASE_TRACINGvariable. - Fix: Removed dependency for SOOTHSAYER to be installed when executing
system-details.shscript. - Fix: Automatically set
data/licensedirectory 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_LIMITandLICENSE_MAX_BSA_RADIUSkeys in.envtoMAX_RADIUS,MAX_POINT_COUNTandMAX_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-smiinstart.shbefore bringing the containers up. - Update: API
3.33.0, UI3.26.0, CPU Engine1.20.0, GPU Engine1.15.0, 3D Engine0.2.4, Midgard1.0.0, Bouncyball0.4.4, AntennaWizard2.1.1, Analysis Utilities (QRM2, SuperTool & NoiseGen)1.1.1, Documentation2.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:
htmlkey 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
409not500. - Fix: Custom clutter tiles not found by GPU engine.
- Fix: Broken transmitter icon within
multisitepublic links. - Fix: Fix issues with null noise names and group names.
- Fix:
multilinkAPI ignoring multiple azimuths.
3.32.0 (2026-02-11)
- Feature: Added
frequencyandpartialto/noise/clearendpoint. - Feature:
multilinkendpoint includes receiver antenna pattern. - Feature: Added new
multilinkAPI for scalable mesh networks. - Improvement: Replaced public URL Google maps with Leaflet and CloudRF map layer
- Fix: Set
output.modandoutput.bertonullablewhen saving templates or MANET networks. - Fix: When retrieving a template which is not using BER units, set
output.modandoutput.bervalues tonullto 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.hbwandantenna.vbw) forarearequests extended to lower limit of1.0e-11. - Feature: Improved azimuth validation failure message to highlight both single and multi-azimuth acceptance.
- Feature: Standardised validation messages of
area,path,pointsandbsa. - Fix: BER colour schema is unable to be used correctly for some
areacalls. - Fix: Azimuth validation allows
0through to360, when it should be0to359. - Fix: Improved noise floor data-type casting for
pathandpointsrequests. - Fix: Improved
pointsinversion to handle multi-azimuth for MANET requests. - Fix: Added tilt inversion on
pointswhen using MANET requests. - Fix: PPA calls not correctly appending
_PPAto site name. - Fix: Multisite calculations not applying
txl. - Fix:
txlonly applied whentxgis present fprpath,points, andBSArequests. - Fix: Fresnel zone incorrect when using imperial units
- Fix: Path calcs erroring without
output.radpresent 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
pathandpointsrequests. - Fix: Removes acceptance of
output.radforpathandpointsrequests. Distance between points is used. - Fix: Using
output.outvalue of5(BER) withpathandpointsrequests leads to mismatched validations foroutput.modandoutput.ber. - Fix: Improved validation errors for
pointsrequests when missingreceiver.lat,receiver.lonandpoints. - Fix: Removed support for
output.colonpointsas colour schema is not necessary. - Fix: Removed required
transmitter.lat,transmitter.lonandtransmitter.altvalues withpointsrequests 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, andreceiver.rxsfor 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
TREEtile 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.bsais used as a default. - Fix: Using BSA with an unknown clutter file doesn’t throw a validation error.
- Fix: Give
calculation_adjustedmessage if radius is increased to be able to coveredges. - 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
BSAin 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
frequencyfilter on/noiseendpoint. - 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
/mergeand/meshto 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.modandoutput.berwhen 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.berandoutput.modwhen 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
pathcalls ignores the decimals.







