# Changelog All notable changes to this project are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project aims to follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.3.0] - 2026-09-26 ### Added - **Versioning tab** on every table: a git-style graph of the snapshot DAG with one lane per Iceberg branch/tag, fork curves, ref pills, the current snapshot and an optional view of snapshots no ref reaches. Clickable counters open the branch, tag (with retention policy) and snapshot lists; the snapshot list (details + rollback) replaces the former Snapshots tab. Nessie catalogs also list their catalog-level references. Backed by a new `GET …/tables/{table}/versioning` endpoint. - **Configurable dashboard**: DB-backed, live widgets (storage overview, maintenance reliability, hot partitions, file-size distribution, catalogs, executions…) that can be added from a gallery, pinned from a table's Storage/Overview tab, removed and reordered by drag and drop in edit mode (Flyway `V10`). - **Storage & Health**: per-file data viewer (data + position/equality delete files) as a third drill-down level, "show all" files with type filter and sorting, typed per-key partition filters, multi-select partitions with a partition-scoped `rewrite_data_files` (Spark, live progress), a maintenance reliability card and "recently active partitions" (Nessie-aware). - **Pipelines**: rerun a whole run or retry a failed task in place (resumes the skipped downstream tasks), per-task retries with a delay between attempts, and a graphical cron builder with a next-run preview. - **Timeline**: clicking a Nessie snapshot fetches its real Iceberg summary on demand. - **Public read-only demo mode**: `ICEGUARD_DEMO_MODE=true` on the frontend container (read at startup, served as `/config.js`, so it works with the published image) shows a "read-only demo" banner and refuses writes client-side with a clear message. `VITE_DEMO_MODE=true` does the same in local dev. Pair it with a server-side guard (e.g. a reverse proxy allowing only `GET` on `/api`). - **Demo video voice-over** (`tooling/demo`, `npm run narrate`): English narration generated locally with Kokoro TTS, muxed onto the demo video with matching `.srt` captions. - **Helm chart** (`charts/iceguard`) to deploy on Kubernetes: frontend + backend against a PostgreSQL you provide (the chart ships no database), pulling the published GHCR images. Ingress, network policy, OIDC, probes, PDBs and a `helm test` check are included, and the render fails fast when no database is configured. Installable without Helm too, via `helm template … | kubectl apply -f -`. CI lints and schema-validates the rendered manifests. - **Configurable database schema** (`iceguard.db.schema`, env `ICEGUARD_DB_SCHEMA`; default `public`). IceGuard can now share a database with another application instead of owning `public`. Flyway creates the schema and Hibernate validates against it. **Upgrading:** the migrations were de-qualified (`public.x` → `x`) to make this possible, so their checksums changed. An existing database fails with `Migration checksum mismatch` until it is realigned once with `quarkus.flyway.repair-at-start=true` (checksums only, no data touched); drop the flag afterwards. ### Changed - The "Lineage" tab is renamed **Evolution**; the standalone **Snapshots** tab moves into Versioning. - The Nessie history call is hard-capped at 12 s, so a slow or hanging Nessie server falls back quickly instead of blocking for about a minute. - Upgrade **Apache Iceberg 1.10.0 → 1.11.0** (backend, bundled Spark image and the default `--packages` coordinates); Parquet moves to **1.17.1** to match what Iceberg 1.11 pulls. `TableMetadataParser.read(FileIO, InputFile)` was removed upstream — the Nessie snapshot/ partition-activity readers now use the `read(FileIO, String)` overload. Added `iceberg-orc` (+ `orc-core`): 1.11's `FormatModelRegistry` registers all generic format models eagerly, so even Parquet-only reads need the ORC classes on the classpath. - Image build stages are pinned to `--platform=$BUILDPLATFORM`. Maven and npm produce architecture-neutral output, so a multi-arch build (`linux/amd64,linux/arm64`) now runs them once, natively, instead of once per target under QEMU. ### Fixed - **Spark SQL literals are now escaped correctly** in maintenance `CALL`s. Quotes were doubled (`'O''Neil'`), which Spark reads as two adjacent literals (`ONeil`), and backslashes were not escaped, so a partition value ending in `\` could break out of the partition-scoped `WHERE` (reported by CodeQL). Backslashes and quotes are now backslash-escaped in both the UI and the backend, and the `WHERE` reaches Iceberg verbatim. - **Frontend image now runs as a non-root user.** `nginx.conf.template` and the assets under `public/` were copied with the checkout's `0640` mode, so the entrypoint died on "default.conf.template: Permission denied" unless the container ran as root (or kept `DAC_OVERRIDE`). A `chmod -R a+rX` at build time makes the image satisfy the `restricted` Pod Security Standard, with only `NET_BIND_SERVICE` for port 80. ## [0.2.1] - 2026-07-03 ### Added - **Full `rewrite_data_files` options**: strategy, sort order, `where` and the options map, each opt-in, in a shared editor used by the table maintenance dialog and the pipeline task editor (filtered per engine; the Java executor now honours `target-file-size-bytes` and `min-input-files`). - **Off-peak detection**: a "Commit activity · off-peak" chart on the table Overview, finding the quietest window from the snapshot timestamps (`GET …/commit-activity`, Nessie-aware). - **Assisted pipeline editor** on a dedicated page (`/pipelines/new`, `/pipelines/:id/edit`): target → tasks → schedule → details. - **Dedicated Edit Catalog page** exposing every field (Bearer/OAuth2 credentials, arbitrary properties, S3 storage modes); credentials are only sent when changed. - `docs/NESSIE.md`, and the demo recorder/renderer (`tooling/demo`). ### Changed - Explorer sidebar shows loaders while namespaces and tables load (slow catalogs). - README demo GIF/MP4 now served from the v0.2.0 release assets. ## [0.2.0] - 2026-06-22 ### Added - **Real maintenance via the Iceberg Java API**: actual data-file compaction and orphan-file removal on small, append-only tables (hard size/file-count limits; refuses above them, pointing to Spark). - **Delete-file maintenance** (Spark): `rewrite_position_delete_files` and `rewrite_equality_delete_files` actions for merge-on-read tables. - **Local Spark tuning** in Settings — driver/executor memory, cores, instances and free-form confs, applied to `local[*]` maintenance runs (registered clusters keep their own config). - Maintenance UI: in-dialog **result + logs** panel, and a **last-run** date on each action card. - `docker-compose.images.yml` to run the published images without a local build, and `docs/CI.md` documenting the pipelines and security bots. ### Changed - Upgrade **Apache Iceberg 1.7.1 → 1.10.0** (backend); the bundled Spark image moves to **Spark 3.5.8 + Iceberg 1.10.0** (fetched from the dlcdn CDN). - Removed the fake "Nessie" REST-fixture bridge from the dev stack; the dev sandbox now ships a single, **real** Nessie Catalog Server. - Split the oversized `TableService` / `TableDetail`; tuned **Dependabot** (grouped, monthly). - README: dynamic **CI**, **release** and **GHCR** badges; documented the no-build images stack. ### Fixed - Table detail page no longer crashes when a table fails to load — it shows a graceful error state. - **CORS**: allow the nginx UI origin (`:8090`) in the Docker stacks, so catalog create/edit from the browser is no longer rejected. ### Security - Added `SECURITY.md`, **CodeQL** and **Trivy** image scanning, and protected the `main` branch. - Stopped leaking internal exception details to clients (opaque error reference IDs). - Removed a stray `key` token file and ignored `key`/`*.key`. ## [0.1.0] - 2026-06-20 Initial release — an open-source web console for Apache Iceberg™ tables. ### Added - **Multi-catalog** support: REST, Nessie, Polaris and **Unity Catalog** (auth: None / Bearer / OAuth2). The catalog **vendor is persisted** and drives vendor-specific behaviour such as Nessie commit-log history. - **Browse**: namespaces & tables tree; create namespaces; create / drop / rename tables; insert sample rows; data preview. - **Schema & metadata**: multi-column schema editor, properties editor and partition evolution, each applied in a single commit. - **Storage**: point-in-time totals, file-size histogram, per-partition aggregates and file drill-down. - **Lineage & history**: schema-version history with column diffs and snapshot-to-snapshot diff. - **Maintenance**: expire snapshots, rewrite data files, rewrite manifests, remove orphan files, rollback — via a Java API executor (analyse) or a Spark executor (real `rewrite_data_files`). - **Pipelines**: chain maintenance actions on a cron schedule with an Airflow-style run view. - **Alerts**: threshold rules on table metrics with optional SMTP notifications. - **Timeline**: snapshots + executions on one timeline. - Per-table override of the Overview gauge thresholds (data files / snapshots). - A real Nessie Catalog Server in the Docker dev sandbox. - Published container images on GHCR (`iceguard-backend`, `iceguard-frontend`). [0.3.0]: https://github.com/adelfardi/iceguard/compare/v0.2.1...v0.3.0 [0.2.1]: https://github.com/adelfardi/iceguard/compare/v0.2.0...v0.2.1 [0.2.0]: https://github.com/adelfardi/iceguard/compare/v0.1.0...v0.2.0 [0.1.0]: https://github.com/adelfardi/iceguard/releases/tag/v0.1.0