v2.5.0
Highlights
- Added Gaussian Splat support (SPLAT, SPZ formats) with automatic detection, indexing, build pipeline, LOD streaming, and a full browser viewer with camera management and tour mode.
- Added a Processing Platform task substrate with a dedicated REST API (
/orgs/{org}/ds/{ds}/tasks) supporting async long-running jobs, progress tracking, and downloadable artifacts. - Added LDAP/Active Directory authentication with optional group-based admin role mapping.
Added / Changed
- Added
GaussianSplatentry type (type ID 15) with detection for.splat,.spz, and.plyfiles; build pipeline producesmodel.spz,model.rad(LOD), andgeoref.jsonartifacts. - Added
GET /tasks/tools,POST /tasks,GET /tasks,GET /tasks/{id},GET /tasks/{id}/log,GET /tasks/{id}/result,DELETE /tasks/{id},POST /tasks/{id}/retryendpoints for the Processing Platform task substrate. - Added
POST /tasks/clearendpoint to permanently remove concluded task records and their artifacts for a dataset. - Added admin task dashboard at
GET /sys/tasksfor listing tasks across all users and datasets. - Added
bulk-downloadtool: packages a file selection or whole dataset as a ZIP archive produced asynchronously, served viaGET /tasks/{id}/result. - Added
raster-exporttool: exports a raster entry to GeoTIFF with visualization params using a block-windowed, memory-bounded implementation with incremental progress and cooperative cancellation. - Added
align-rastertool: aligns a source GeoTIFF to a reference GeoTIFF; result is indexed in the dataset in place. - Added
merge-multispectraltool as a heavy task with progress reporting. - Added
rescan-indextool: rescans the dataset index, clears build cache, invalidates caches, and rebuilds derivatives as a heavy task. - Added
archive-extracttool: extracts compressed archives (ZIP, tar.gz, 7z, RAR, and more) into the dataset index, with quota, disk-space, and zip-slip guards. - Added
photogrammetrytool: submits images to a configured NodeODM node, streams progress, and returns the result bundle as a downloadable artifact. - Added
buildtool wrapping the existing build pipeline, enabling it to participate in the task substrate with progress logging and deduplication. - Added LDAP authentication provider (
LdapLoginManager) with service-account search, direct-bind (UserDnFormat) path, admin group mapping, LDAP injection protection, andLdapHealthCheck. - Added
ProcessingPlatformSettingsconfiguration section with concurrency limits, quotas, deduplication, artifact TTL, async download threshold, and NodeODM node list. - Added
IArchiveExtractor/IArchiveReadSessionports andSharpCompressArchiveExtractoradapter (zip, tar.gz, tgz, 7z, RAR, single-file gz/bz2/xz). - Added
ZipArchiveBuilderservice shared by the legacy streaming download path and thebulk-downloadtool. - Added
LogRingBufferring buffer for per-task log tail persistence toJobIndex.LogTailJson. - Added
TaskToolsandTaskStatescatalogs to the/system/featuresresponse so clients derive the task state machine and tool metadata from the server. - Added
BulkDownloadAsyncThresholdBytesto/system/featuresso clients can route bulk downloads to the async path. - Added
idfield toUserDetailDto. - Added
ValidateAlignRasterAPI endpoint (POST /objects/align/validate). - Added
DDBAlignRaster,DDBValidateAlignRaster, andDDBExportRaster2(block-windowed with progress callback) P/Invoke bindings; addedDdbCanceledExceptionfor cooperative cancellation. - Added
HangfireJobRetentionDayssetting (default 2 days) to reduce Hangfire table churn; failed jobs are kept for diagnostics regardless. - Added
BuildLogCaptureFilterHangfire server filter to persist build logs toJobIndex.LogTailJson. - Added
BuildRetrySchedulerFilter: event-driven replacement for per-minute build polling; self-schedules retries with exponential backoff after a build completes. - Changed
SyncJobIndexStatesCrondefault from*/5 * * * *to0 * * * *(hourly). - Changed
ProcessPendingBuildsCrondefault from* * * * *(every minute) to0 */6 * * *(every 6 hours); day-to-day retries are now event-driven. - Extended
JobIndexmodel with Processing Platform columns:ToolId,ToolVersion,ProgressPercent,PhaseMessage,ArtifactSizeBytes,ArtifactSha256,ErrorType,RequestHash,ParentJobId,WorkflowExecutionId,LogTailJson,ProgressUpdatedAtUtc. - Extended
IndexPayloadwithToolId,ToolVersion,RequestHash,ParentJobId, andWorkflowExecutionIdfields (backward-compatible defaults). - Added Hangfire
tasksqueue; server now processes bothtasksanddefaultqueues. - Updated
UserManagementfeature flag to derive from the active identity provider's capabilities rather thanExternalAuthUrl. - Skipped local default admin creation when an external identity provider (LDAP or Remote) is active.
- Updated Docker image to Node.js 24 and added
libldap2,libldap-common,libsasl2-2runtime dependencies. - [CI] Updated CI workflows and Dockerfile from Node.js 22 to Node.js 24.
- Updated
CONTRIBUTING.mdwith full development setup, architecture overview, coding standards, testing guidelines, and PR guide. - [DroneDB] Updated to v1.10.0 (from v1.8.1).
- [Hub] Added full Gaussian Splat viewer with LOD streaming, camera presets, auto-orbit, tour mode, view settings, and keyboard/touch navigation controls.
- [Hub] Added georaster split-view comparison with draggable handles for side-by-side multi-raster visualization.
- [Hub] Added per-raster opacity sliders and layer reorder panel for multi-raster map views.
- [Hub] Added measurement groups with custom names and colors for organizing map measurements.
- [Hub] Added Align GeoTIFF dialog with reference picker, alignment mode, output name validation, and live task progress tracking.
- [Hub] Added Extract Archive dialog with destination folder picker, overwrite control, archive deletion option, and progress bar.
- [Hub] Added admin task dashboard for listing and managing tasks across all users and datasets.
- [Hub] Added per-dataset task history panel with task log viewer and reusable task table component.
- [Hub] Added build confirmation dialog when rebuilding already-ready files, warning about side effects.
- [Hub] Added archive file type icons and improved treeview selection visibility.
- [Hub] Switched plant health GeoTIFF export to use the async
raster-exportheavy task instead of synchronous generation. - [Hub] Added ErrorBoundary component and VirtualScroller component for improved error handling and performance.
- [Hub] Added ESLint and Vitest for code quality and unit testing.
- [Hub] Updated Potree library with DXF generation and height profile fixes.
Fixed
- Fixed
DownloadLimitMiddlewareto also enforce the per-user download concurrency limit onGET /tasks/{id}/result(async artifact download). - Fixed
UserManagerHealthCheckto skip the local user-manager test when an external identity provider is active. - Fixed
JobExpirationAttributeto preserve failed job records at global retention and only expire short-lived success records. - [DroneDB] Fixed potential crash in
Registry::downloadDdbcaused by an uninitializedlengthvariable when extracting the ZIP response payload. - [DroneDB] Fixed STAC thumbnail MIME type incorrectly reported as
image/jpegfor WebP thumbnails; corrected toimage/webp. - [Hub] Fixed treeview selection visibility for selected items in the file explorer.
- [Hub] Fixed Potree height profile rendering issue.
- [Hub] Fixed DXF generation in Potree point cloud viewer.
Breaking changes
JobIndexschema extended with new Processing Platform columns. A database migration (AddProcessingPlatformColumns) is required before starting v2.5.0.- Migration: run
dotnet ef database updateagainst the appropriate migration project (Registry.Web.Data.SqliteMigrationsorRegistry.Web.Data.MySqlMigrations) before launching the new version.
- Migration: run
- Hangfire job expiration behavior changed: failed jobs are now kept at the global retention policy (
HangfireJobRetentionDays, default 2 days) and are no longer expired quickly. Succeeded jobs are expired aggressively to reduce database churn.- Migration: no action required, but expect the number of retained failed job records to increase. Adjust
HangfireJobRetentionDaysinappsettings.jsonif needed.
- Migration: no action required, but expect the number of retained failed job records to increase. Adjust
- Recurring job schedules changed:
SyncJobIndexStatesCronnow defaults to hourly (was every 5 minutes) andProcessPendingBuildsCrondefaults to every 6 hours (was every minute). Deployments with explicit cron values inappsettings.jsonare unaffected.- Migration: remove or update
SyncJobIndexStatesCronandProcessPendingBuildsCronfromappsettings.jsonto adopt the new defaults.
- Migration: remove or update
Merged PRs
- Add processing platform + various fixes and improvements by @HeDo88TH in #345
- Add LDAP support by @HeDo88TH in #346
- Add gaussian splats support by @HeDo88TH in #347
Full Changelog: v2.4.0...v2.5.0