Repository navigation
Releases
v1.2.0
[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 CFtimeSeriesstation 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, anddatetime,dateandtimevalues are typed.datetimereads 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-nulland--validation-skip-nulloncassiopeia map,--skip-nulland--validation-skip-nulloncassiopeia manifest generate, and the manifest'soutput.skipNullandoutput.validation.skipNullare removed; delete them from scripts and manifests. Entities never carry JSONnull(#77): anullinside an array or object is left out with a warning, and an attribute whose value is onlynullis dropped. An attribute whose source holds empty text is now written as"", where the old default left it out. --headeris now--output-header. It still sets headers on Context Broker requests; the new--input-headersets 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
RelationshiporListRelationshiptakes no transformation at all. - A
VocabPropertyvalue must be an absolute IRI. A value that is not is dropped with anextractor-iri-unreadablewarning;transformation: "urn"admits only a URN. objectandarrayread JSON text (#52): text such as[1,2]now becomes the array it encodes. AJsonPropertywhose JSON arrives as text, as every CSV field does, needstransformation: "json". AJsonPropertykeeps anynullinside 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
mappingsis applied to the object they build (#61), where it used to be ignored unless it was a geometry transformation. - A failing
Relationshipsource 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 execinto a shell no longer works; runcassiopeiasubcommands throughdocker run. The image is now also tagged without thevprefix, as1.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,libclangand 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...
v1.1.1
[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
[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
[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
[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
[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
[v1.0.0] - 2026-09-07
🚀 Features
- first cassiopeia version
🧹 Chores
- init