Skip to content

Releases

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 11 Nov 11:17

[v1.2.0] - 2026-11-11

Highlights

Two new source formats: GeoPackage and NetCDF.

  • GeoPackage (geopackage) reads every features and attributes table of an OGC GeoPackage as one record per row, with geometries reprojected to WGS 84 and each table routed to its own collection when a file has several. A table that cannot be read, such as a view, is skipped with a warning instead of stopping the run. GeoPackage support needs SQLite, so it is part of the default source build and the Docker image but not the release binaries; see Security below.
  • NetCDF (netcdf) reads the classic CDF-1, CDF-2 and CDF-5 formats and NetCDF-4 on HDF5 in pure Rust, so every build has it, the release binaries included. A gridded file, as Copernicus CAMS, CMEMS and ERA5 publish them, gives the same wide location records as GRIB, so one mapping style serves both formats. A CF timeSeries station file gives one record per observation in all five CF layouts, and times in non-Gregorian calendars are written as the right Gregorian dates.

CSV that copes with real-world files. Cassiopeia now detects a file's character encoding, including byte order marks, spreadsheet UTF-16 exports without one, Windows-1252 and ISO-8859-2, and a server's declared charset. It skips title rows above the table, joins stacked header rows into one name per column, skips a row of another width with a warning instead of misreading it, and reads backslash-escaped quotes and CR line endings. When detection still gets a file wrong, a manifest input can state its dialect, and cassiopeia profile prints the detected dialect in that same syntax.

JSON beyond a top-level array. An input with a mappings list reads arrays of objects nested at any depth as collections, and a lone object on a collection path is read as one item. Each GeoJSON feature's record now carries its FeatureCollection's foreign members and bbox under featureCollection.

Authenticated, resilient downloads. A remote input can send its own HTTP headers, or --input-header on the command line, for an API key. A manifest reads environment variables as ${NAME}, so credentials stay out of the file. A source that answers 429 or a 5xx is retried with backoff, honouring Retry-After.

Richer, stricter NGSI-LD output.

  • An entity can carry an expiresAt.
  • An attribute can declare its valueType, and datetime, date and time values are typed. datetime reads many more real-world spellings, such as basic-format offsets, RFC 9557 zoned timestamps and Unix epochs, and keeps at most the six fractional digits NGSI-LD admits.
  • Entities never carry JSON null, which NGSI-LD does not allow.

New transformations. iri and urn read identifiers, and json reads JSON text as the value it encodes. A ListProperty reads each item with its declared transformation.

Mappings fail fast. More mistakes stop a mapping when it loads, naming the attribute, instead of failing on every record: a transformation the attribute type cannot use, instances below a top-level attribute, an illegal literal scope, and a misplaced valueType. Warnings about a missing field or a failing template now name the field and the attribute by their full path.

Breaking changes

  • Relative paths in a manifest resolve next to the manifest (#46), not against the directory Cassiopeia is started from. A manifest whose paths were written relative to the working directory needs them rewritten relative to the manifest file, or made absolute. Paths given on the command line still resolve against the working directory.
  • The null-handling options are gone. --writer-skip-null and --validation-skip-null on cassiopeia map, --skip-null and --validation-skip-null on cassiopeia manifest generate, and the manifest's output.skipNull and output.validation.skipNull are removed; delete them from scripts and manifests. Entities never carry JSON null (#77): a null inside an array or object is left out with a warning, and an attribute whose value is only null is dropped. An attribute whose source holds empty text is now written as "", where the old default left it out.
  • --header is now --output-header. It still sets headers on Context Broker requests; the new --input-header sets them on input downloads.
  • A transformation an attribute type cannot use stops the mapping from loading, naming the attribute, where it used to fail on every record or be ignored. A Relationship or ListRelationship takes no transformation at all.
  • A VocabProperty value must be an absolute IRI. A value that is not is dropped with an extractor-iri-unreadable warning; transformation: "urn" admits only a URN.
  • object and array read JSON text (#52): text such as [1,2] now becomes the array it encodes. A JsonProperty whose JSON arrives as text, as every CSV field does, needs transformation: "json". A JsonProperty keeps any null inside its raw JSON as the source has it, and refuses a value that is not an object or an array of objects.
  • A transformation on an attribute built from nested mappings is applied to the object they build (#61), where it used to be ignored unless it was a geometry transformation.
  • A failing Relationship source costs only that relationship (#54): the entity is still written, with a warning, where the whole record used to be skipped.
  • A geometry outside WGS 84 is refused (#66). An attribute whose coordinates fall outside longitude ±180 or latitude ±90, as projected coordinates do, is now dropped with a warning naming it, where it used to be written.
  • The Docker image has no shell. Its runtime is now distroless, so docker exec into a shell no longer works; run cassiopeia subcommands through docker run. The image is now also tagged without the v prefix, as 1.2.0.
  • Building GRIB1 support from source needs different tools. The build compiles a bundled ecCodes and no longer uses a system one: it needs CMake, a C and C++ compiler, git, libclang and OpenJPEG. See Build tools for GRIB1.

Security

SQLite write-ahead logs in GeoPackages: RUSTSEC-2026-0459, CVE-2026-119375, GHSA-72w2-rjgg-q729. Medium severity (CVSS 4.0: 6.8). Mitigated in this release.

SQLite before 3.54.0 can return leftover bytes of the process's memory as ordinary row data when it opens a database together with a crafted write-ahead log, a -wal file beside the database, whose page size differs from the database's. Cassiopeia reads GeoPackages through SQLite, so such a pair of files could make data from Cassiopeia's own memory, which can include other inputs or broker credentials, appear in the entities it writes to files or sends to a context broker. Exploiting it requires someone who can supply both files to a run; the leaked bytes then reach whoever can read the run's output.

GeoPackage support is new in v1.2.0, so no earlier release is affected.

The release binaries and the Docker image are not affected.

How you got Cassiopeia Affected
A release binary from this page No. The release binaries are built without GeoPackage support and contain no SQLite.
The Docker image ghcr.io/vela-tools/cassiopeia:v1.2.0 No. It links SQLite 3.54.1, which carries the fix, and its new distroless base contains no other SQLite.
Built from source without the geopackage feature No. The build contains no SQLite.
Built from source against a system SQLite: geopackage without geopackage-bundled No, as long as the system SQLite is 3.54.0 or newer, or your distribution has backported the fix to it.
Built from source with the bundled SQLite: the default features, as cargo install and cargo build use Only in the narrow case described below.

Run cassiopeia --version to see which build you have. Its features line shows -geopackage for a build without GeoPackage support, +geopackage · -geopackage-bundled for a build linked against a system SQLite, as the Docker image is, and +geopackage · +geopackage-bundled for a build with the bundled SQLite.

How it is mitigated. Every build now refuses a GeoPackage that has a write-ahead log beside it, before SQLite opens the file, and the error names the log. SQLite reads such a log whenever one exists, whatever the GeoPackage itself declares, so the presence of the log is what Cassiopeia refuses. Cassiopeia also hands SQLite the GeoPackage's resolved absolute path, so a symbolic link cannot point SQLite at a log the check did not see. A legitimate log is usually left by a program that still has the GeoPackage open, such as QGIS: close that program and run again. See Write-ahead logs.

What remains for builds with the bundled SQLite. The bundled SQLite is still 3.53.2, because the crates Cassiopeia reads GeoPackages through do not yet bundle 3.54. The refusal covers a log that is present when Cassiopeia opens the GeoPackage, but SQLite looks for th...

Read more

v1.1.1

Choose a tag to compare

@github-actions github-actions released this 28 Oct 10:31

[v1.1.1] - 2026-10-28

🏗️ Build

  • bump docker base images to rust 1.99.1 and trixie-20261027

🐛 Bug Fixes

  • clear clippy warnings under rust 1.99.1

👷 CI

  • check the msrv with cargo msrv every two weeks
  • pin the rust toolchain and let dependabot bump it

📚 Documentation

  • state rust 1.96.1 as the minimum
  • add clippy and cargo deny badges to the readme

🧪 Tests

  • keep reporter and rendering tests independent of the terminal
  • use pretty_assertions across the workspace

🧹 Chores

  • bump version
  • adjust msrv
  • update dependencies

Artifacts

File Platform SHA256
cassiopeia-linux-aarch64-gnu.tar.xz ARM64 glibc Linux c3db8ec00af84b59168f7aa03b27fa49ee53fbe17d97675833ee410c9b4ffe41
cassiopeia-linux-aarch64-musl.tar.xz ARM64 musl Linux 693dbcba500ff2d85ed1f66d55eb49a072ce028febe14d8d39ac635f99cf22d4
cassiopeia-linux-x86_64-gnu.tar.xz x64 glibc Linux b7e9e2fa56e99cc3836b0638a475e42dfeb8a2ea8d668e1100dd9c4b521ecba5
cassiopeia-linux-x86_64-musl.tar.xz x64 musl Linux 84a0301d8708dcf520f404dfe08fde80660e05236a5885a14e8f5116f7172331
cassiopeia-macos-aarch64.tar.xz ARM64 macOS 6a8a6e952ffecf55b811eb13213bc2a16e5fceb03ef587c8d8fae6bbbddcf08e
cassiopeia-windows-x86_64.zip x64 Windows 2d3224ef2a28e4bf22d05770b22ddeed35f2177e034c75eba80bd57befdb013b

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 12:55

[v1.1.0] - 2026-10-02

🏗️ Build

  • add cargo machete override

🐛 Bug Fixes

  • report every dropped geoproperty and honour its geometry policy at every level ⚠️ BREAKING
  • keep the winding of a geometry its geometry policy already normalised
  • convert a geoproperty without a transformation as a geometry ⚠️ BREAKING
  • keep the structure of list and json properties declared without a transformation
  • map a constant identity to one entity and warn when merged records disagree ⚠️ BREAKING
  • read numeric unix epochs and report unreadable non-text timestamps
  • give every template failure a located, actionable message
  • route every non-plain template through tera
  • resolve a composite template with a missing field to nothing
  • reject a mapping whose template does not compile
  • treat separator-only identifiers as no target
  • carry relationship instance grouping and drop unmintable list tokens
  • render arrays and objects as compact text
  • array/object transformations stop treating blanks and text as values
  • do not emit relationships to null synthetic entities
  • union scopes per entity and drop scopes with missing fields
  • move scope out of identity to the top level of a mapping ⚠️ BREAKING

📚 Documentation

  • document template, identity and scope behaviour since v1.0.3
  • move worked examples to the examples repository

🔧 Refactor

  • split attribute assembly out of the ngsi-ld transformer

🚀 Features

  • drop only the attribute when its template fails
  • keep the type of a single template expression
  • temporal properties in kml

🧹 Chores

  • update dependencies
  • bump version

Artifacts

File Platform SHA256
cassiopeia-linux-aarch64-gnu.tar.xz ARM64 glibc Linux 9087d39216c28a418a7102c038eee7d98ca171c540527079f22aeae71f58b26d
cassiopeia-linux-aarch64-musl.tar.xz ARM64 musl Linux 804eb5699a8717d9baea029d0eb26830491df7d4aaa17a614b94b6863ccd7c1b
cassiopeia-linux-x86_64-gnu.tar.xz x64 glibc Linux 87b4466e47fcb9f3963e6f71f0fc8f53857e823bbea97a265b8b05c98a139cb6
cassiopeia-linux-x86_64-musl.tar.xz x64 musl Linux 6c29b05fcb697c083655941e671054a0a136c1a86d8714a2427c5cf3b59eebed
cassiopeia-macos-aarch64.tar.xz ARM64 macOS 35aa1a593e2d8829354d0b3a98470347a1082554006ed6156ce83eee81c6d632
cassiopeia-windows-x86_64.zip x64 Windows 1fbe0afad66cba8548a5e6790456442f7af863ca22f112339375bfca3ad9568b

v1.0.3

Choose a tag to compare

@github-actions github-actions released this 17 Sep 13:47

[v1.0.3] - 2026-09-17

🐛 Bug Fixes

  • eliminate a bug in csv header detection

👷 CI

  • add pages workflow

🧹 Chores

  • bump version
  • update dependencies

Artifacts

File Platform SHA256
cassiopeia-linux-aarch64-gnu.tar.xz ARM64 glibc Linux 8fcb916920e24ed794fbc6e33eb0e5ef3b95356d9bae0e1107cc284b41107092
cassiopeia-linux-aarch64-musl.tar.xz ARM64 musl Linux 0ebd2786279235b014d4e4ed9f0357b688f0bb0b5eddb136ec6ff1cf7a577f37
cassiopeia-linux-x86_64-gnu.tar.xz x64 glibc Linux f50ec91e082449947d3286c87c7c8cfb5981ec0ab95cb8fa21f5579b41c926e5
cassiopeia-linux-x86_64-musl.tar.xz x64 musl Linux 2329f5e4c6f77fb078769f687614b99e30d926d21f87fe5ed85cb0e55e93e975
cassiopeia-macos-aarch64.tar.xz ARM64 macOS 948ca163eeffbfa5ca11ed30273dcdec7d732b974875eb9e1693746d2947a395
cassiopeia-windows-x86_64.zip x64 Windows 9ee35482c434884d5ac8383b7e99319ffdc39427cbcee606cdaa39f016af71cb

v1.0.2

Choose a tag to compare

@github-actions github-actions released this 09 Sep 05:52

[v1.0.2] - 2026-09-09

🔧 Refactor

  • unify user agent handling on both collector and writer

🧹 Chores

  • update changelog
  • bump version

Artifacts

File Platform SHA256
cassiopeia-linux-aarch64-gnu.tar.xz ARM64 glibc Linux 9361c8151392223181003d121f7e7c2c0e19a70fc00775ec7a50111dbcbc1305
cassiopeia-linux-aarch64-musl.tar.xz ARM64 musl Linux e3931a59cac4e0f8d0bbb5007e112beb72bd174be7c46ce379fc1891be8f5a12
cassiopeia-linux-x86_64-gnu.tar.xz x64 glibc Linux 88f242036af73b7e880b0f4ddddfb615954a68a7c8ed37a7bdcdaa1eaad519f1
cassiopeia-linux-x86_64-musl.tar.xz x64 musl Linux 8dd93288301a02bbf71452b9e9d3536f821f8e57ce113d68366d6d38f4bd80cc
cassiopeia-macos-aarch64.tar.xz ARM64 macOS b9f49477c0788a1e75e0b6209d0c1044f54366bc9367b5b699ce383fff5c46c0
cassiopeia-windows-x86_64.zip x64 Windows 7bc3927bf9a5f90df2fb12173701a60d2abe273e39165086752bf14117cbd3db

v1.0.1

Choose a tag to compare

@github-actions github-actions released this 08 Sep 15:11

[v1.0.1] - 2026-09-08

🏗️ Build

  • no need to depend on eccodes dev package in docker image
  • add missing package to docker image
  • use locked build with cargo chef

👷 CI

  • use correct cosign installer version
  • add static musl builds for linux
  • add missing workflow permissions
  • add taplo ci gate
  • add container image attestation
  • add release matrix table
  • add build provenance attestation
  • ship hashes as artifacts
  • integrate cosign into image building process
  • use composite action for native dependencies

📚 Documentation

  • switch to static musl builds as default
  • update prebuilt binary instructions
  • document container image verification
  • fix incorrect link in docs
  • better readme header

🧹 Chores

  • update changelog
  • update changelog
  • add .gitattributes
  • update dependencies
  • bump version
  • reconfigure taplo

Artifacts

File Platform SHA256
cassiopeia-linux-aarch64-gnu.tar.xz ARM64 glibc Linux b6d34120fe71c302caa8daeeabde0be2dfb199e2bbbfb653005484e350b4054c
cassiopeia-linux-aarch64-musl.tar.xz ARM64 musl Linux f5d200f2fe5086128feb6b7dd780a8180c21c91f2070143c42c21ec48ea9dd9d
cassiopeia-linux-x86_64-gnu.tar.xz x64 glibc Linux fa848440dcb0b528bb16ff602cd8a692120e44dd88cc0c38f7304ba96ae98f0e
cassiopeia-linux-x86_64-musl.tar.xz x64 musl Linux 75cae2116a00e3805268eb6754b450d11debd8c166916401122bf81153860933
cassiopeia-macos-aarch64.tar.xz ARM64 macOS fddebf58233918945ee58886b741d95ff9240c7f0964b61fedcbf970aff5c3bb
cassiopeia-windows-x86_64.zip x64 Windows 501980db057521a541b48509c610a7b293aa7f7222ffedcb3767095a4d815f70

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 07 Sep 09:10

[v1.0.0] - 2026-09-07

🚀 Features

  • first cassiopeia version

🧹 Chores

  • init