Skip to main content

Document Revision History

This page tracks the version history of the Visual Asset Management System (VAMS). Each release includes a summary of key changes, new features, and important upgrade notes.


Revision History​

VersionDateKey Changes
2.6.52026-10-16Hotfix: asset export issues download URLs only for files of distributable assets and records every URL it issues in the file download audit log; the shipped AWS WAF policy stops blocking ordinary asset file requests (file names ending .log/.ini/.cfg/.conf, encoded ../, URL-encoded keys over 1024 bytes) and its 429 throttle response carries a Retry-After header, exposed to cross-origin callers, so the web application retries after the server's hint; the asset listings read current-version rows and bucket details in batches instead of two reads per asset; the executable blocklist is case-insensitive, reads the extension from the normalized file name, and is applied to export download URLs; asset file keys over the 1,024-byte Amazon S3 object-key limit are rejected with a 400; the per-user authorization enforcer compiles each policy line once; documentation site dependency security updates (tinypool 2.1.2, shell-quote 1.11.0, proxy-addr 2.0.8, source-map-js 1.2.2, compression 1.8.2)
2.6.42026-10-05Hotfix: search pre-filters by exact database ID and reads the whole database table; permission constraints are found and deleted past one scan page, and four shipped permission templates grant the Physna viewer route; database edits and asset recounts no longer overwrite each other, and a failed recount no longer fails a committed asset operation; metadata schema updates no longer recreate a deleted schema; database delete authorizes the caller before its dependency checks; a direct Amazon S3 write fires its fileUpload trigger once at any size (small direct writes to versioned buckets now launch matching triggers); indexing retries failed deliveries instead of dropping them; file copies made by VAMS keep their content type, and archived files keep their search metadata; archived assets are no longer restored into deleted databases; the Garnet Framework add-on keeps one entity per archived asset and database; metadata schemas reject file-type restrictions no file can match; configuration validation flags FIPS, Amazon Rekognition and presigned URL timeout settings the deployment cannot serve; documentation, OpenAPI and steering corrections; dependency security updates (PyJWT 2.15.1, urllib3 2.8.0, oauthlib 4.0.0, axios 1.20.0, DOMPurify 3.4.16, moment 2.31.0, brace-expansion, fast-uri)
2.6.32026-09-26Hotfix: the non-root 3D thumbnail preview and coordinate-transform pipeline containers normalize read bits after COPY so images built under a restrictive umask start; npm dependency intake requires npm >= 11.10.0 and a 7-day minimum release age
2.6.22026-09-23Hotfix: web/ and infra/ package-lock.json repaired so npm ci installs (full optional native-binding set recorded); CI checks the four package lockfiles against their package.json under npm 11; documentation site image-size updated to 2.0.4 (denial-of-service advisories resolved)
2.6.12026-09-13Workflow orchestration refinements: triggers drafted at workflow creation, one stepped execute dialog with multi-asset inputs and a bulk file picker, per-step sub-process status and log sources across API, CLI, MCP and web (incl. AWS Deadline Cloud jobs), file-to-execution links, recomposed template form; file manager and execute-picker fixes; dependency updates (maplibre 6, SuperSplat 3); MCP server package version aligned with the VAMS release version. Pipeline hardening: the GenAI 3D metadata labeling Amazon Bedrock grant names the configured inference profile; the Fargate pipeline state machines can terminate the AWS Batch jobs they submit; Fargate container output goes to KMS-encrypted /aws/vendedlogs/Pipelines/ log groups; every pipeline Lambda's log output redacts Step Functions task tokens; the Potree viewer PDAL container pins the conda-forge compilers toolchain to <2 so the image builds; FFmpeg (GPL-2.0-or-later) recorded for the NVIDIA container images; app.useFips documented as it behaves; version-roll file list corrected in the root CLAUDE.md
2.6.02026-09-11Cognito OIDC federation with configurable default user role; workflow, pipeline, and execution overhaul — breaking for externally registered pipelines: inputs arrive through a resolved manifest, an asynchronous pipeline returns a task token, sub-processes and logs are registered, and a definition is declared in a vamsSchema bundle; port with the v2.5 to v2.6 pipeline migration guide. New AWS Deadline Cloud pipeline execution type (commercial partition only). API Gateway migrated from HTTP API (v2) to REST API (v1) — breaking: clients registered directly against the old API endpoint must be re-setup (re-run vamscli setup); supports REGIONAL and PRIVATE endpoint types. Physna Sync add-on (Phase 1): one-way synchronization of supported VAMS files and metadata to a Physna tenant; geospatial search and map view across assets and files (new geo_MD_location field); OpenSearch index v3 + provisioned engine upgrade to 3.5 (OpenSearch 2.x in the AWS European Sovereign Cloud); next-generation OpenSearch Serverless upgrade (scale-to-zero, higher performance, better cost pricing); provisioned r7g.large.search default + automatic OpenSearch service-linked role creation; advanced IAM role customization for restricted environments; VAMS MCP server and agent skill for operating a deployment with AI agents
2.5.32026-08-03Fixed web npm install dependency override conflict; npm dependency updates across all packages, rich text editor security upgrade, AWS CDK CLI version alignment
2.5.22026-06-19Security fixes: Casbin authorization expression injection, createAsset S3 key location validation; backend test framework updates, authorization documentation clarifications, dependency updates
2.5.12026-04-23Bug fixes: upload subfolder paths, file version history cleanup on delete, S3 version pagination, authorization error handling, image viewer version switching, CLI download pagination, CLI upload progress display
2.5.02026-04-21Website overhaul (Vite, Amplify V6, dark/light theme), Needle USD viewer, Three.js CAD viewer, SQS/EventBridge pipeline support, 3D preview thumbnail pipeline, database metadata with location maps, enhanced asset versions, Cognito user management, API key management, permission templates
2.4.12026-01-30GovCloud deployment fixes, CloudFront KMS fix, metadata schema navigation fix, file manager UX improvements
2.4.02026-01-16Veerum viewer, NVIDIA Isaac Lab pipeline, Garnet Framework addon, metadata schema overhaul, metadata system overhaul, asset unarchiving, CloudFront custom domains, audit logging, EKS pipeline option
2.3.22026-01-12CLI documentation fixes, NPM dependency updates
2.3.12025-11-21CLI bug fixes, viewer install optimizations
2.3.02025-11-13VamsCLI tool, overhauled search system, plugin-based viewer architecture, CesiumJS/BabylonJS/PlayCanvas viewers, CAD metadata pipeline, Gaussian Splat Toolbox, IP restrictions, asset link enhancements
2.2.02025-09-31Asset/file separation, multi-file assets, S3 presigned uploads, external OAuth IDP, asset versioning, new pipelines, global workflows, VPC improvements

Version Details​

2.6.5​

Release date: 2026-10-16

Major changes:

  • Hotfix release: asset export applies the two download controls the download endpoint applies (the distributable check and the file download audit log); the shipped AWS WAF policy stops blocking ordinary asset file requests and its throttle response carries a Retry-After the web application can read; the asset listings read their per-asset data in batches; the executable blocklist rejects upper- and mixed-case extensions and content types, reads the extension from the file name after trailing dots and whitespace are removed, and is applied to export download URLs; asset file keys over the 1,024-byte Amazon S3 object-key limit are rejected with a 400 instead of a 500; and the per-user authorization enforcer no longer re-parses every policy line on every check.
  • Behavior changes to review before upgrading: an asset export with generatePresignedUrls returns presignedFileDownloadUrl: null for every file of a non-distributable asset, where it returned a working URL — a client that depended on export to obtain download URLs for non-distributable assets must request them through a user who may download them, or mark the asset distributable; and six more AWS Common Rule Set rules are evaluated in count mode, so their matches appear in the AWS WAF metrics and sampled requests without blocking (see the configuration reference, "WAF rule policy").
  • Twenty-six corrections from a v2.6.4 deployment audit (template import naming, route authorization before the request body on create, read-only templates and self-service API keys, CLI hints and masking, deploy scripts, documentation), plus a bounded Amazon Location Service lookup on /secure-config and a repaired GR00T container test.

Key fixes:

  • Asset export download controls — Asset export issues presigned download URLs only for files of distributable assets (a non-distributable asset is still exported, with presignedFileDownloadUrl null on each file) and records every URL it issues in the file download audit log, the same two controls the download endpoint applies. (issue #399)
  • Asset export executable blocklist — Asset export checks each file's extension and reported content type against the executable blocklist before it signs a download URL, as the download endpoint does; a blocklisted file is still listed but receives no download URL. (issue #406)
  • AWS WAF stops blocking ordinary file requests — Six further AWS Common Rule Set rules are overridden to count in infra/config/policy/wafPolicyConfig.json (SizeRestrictions_URIPATH, RestrictedExtensions_URIPATH, RestrictedExtensions_QUERYARGUMENTS, GenericLFI_URIPATH, GenericLFI_QUERYARGUMENTS, GenericLFI_BODY). They fired on validated asset file keys that VAMS carries in stream-route paths, query strings, and request bodies: file names ending .log, .ini, .cfg, or .conf, encoded ../ sequences the backend already rejects, and URL-encoded keys over 1024 bytes. Every other managed rule keeps blocking. See the configuration reference, "WAF rule policy". (issue #400)
  • AWS WAF throttle responses carry a readable Retry-After — The rate-based rule's 429 response carries Retry-After: 1 and Access-Control-Expose-Headers: Retry-After, so the web application reads the server's retry hint before its single retry, also when it calls the API cross-origin (the Application Load Balancer topology, or a direct call to the API Gateway endpoint). The response adds no CORS allow headers of its own: Amazon API Gateway already attaches them to every WAF block it renders, and a second copy would make the 429 unreadable. (issue #400)
  • Asset listing read fan-out — The per-database and all-databases asset listings enrich a page with batched reads instead of two DynamoDB reads per asset: current-version rows come from BatchGetItem in chunks of 100 (unprocessed keys re-requested with bounded exponential backoff, the remainder read individually) and bucket details are resolved once per distinct bucket on the page. The response shape is unchanged. (issue #389)
  • Executable blocklist is case-insensitive — The file extension and the media-type part of the reported content type are lower-cased before they are checked against the blocked extension and MIME type lists, and a content-type parameter such as ; charset=binary is ignored, so .EXE and Application/X-Msdownload are rejected on every upload, download, stream and workflow-output path exactly like their lower-case forms. The blocked lists hold the same entries as before. (issue #412)
  • Executable blocklist reads the normalized file name — The extension is everything from the last dot of the file name after trailing dots and whitespace are removed, so payload.exe., payload.exe , payload.exe/, .exe and ..exe are blocked like payload.exe, and a folder whose own name ends in a blocked extension cannot be downloaded as a whole; a path that creates a new file (upload, move or copy destination) is rejected when its final name ends in a dot or whitespace, and an upload path is rejected when it ends in a slash. Existing objects stay reachable and dotfiles such as .gitignore are unaffected. (issue #420)
  • Executable blocklist ignores a stream suffix — The extension is checked after any : suffix is removed from the file name, so payload.exe::$DATA is blocked like payload.exe, and a path that creates a new object (upload, create folder, move or copy destination) is rejected when it contains a :. Existing objects stay reachable. (issue #423)
  • Upload completion is bound to the initialize request — Completion applies the executable blocklist to every object it creates, including zero-byte and abandoned uploads, and reports a file whose relativeKey was not recorded at initialization as failed instead of creating it. (issue #424)
  • Over-long asset file keys are a 400, not a 500 — Request validation limits every asset file key to 1,024 bytes of UTF-8 (the Amazon S3 object-key limit, measured in bytes), and the stream, download, upload-initialize, create-folder, move and copy routes re-check the full object key once the asset prefix is added, so a key S3 would refuse is rejected with a 400 before any S3 call instead of reaching S3 and surfacing as a 500; a refused upload batch creates no multipart upload. (issue #407)
  • Authorization check cost no longer grows with policy size per item — The per-user Casbin enforcer compiles each policy line's matcher expression once and reuses it for the life of the enforcer, instead of re-parsing every line on every authorization check. Only compiled expressions are cached, never decisions: every check still evaluates every policy line, and the cache is discarded with the enforcer on the existing 60-second policy refresh and on an MFA state change. List endpoints that authorize each returned item (for example the asset list without OpenSearch) are the main beneficiaries. (issue #390)
  • Permission template import names the template — POST /auth/constraintsTemplateImport reads the template header from metadata, the key the shipped permission templates use, so a template file posted unmodified is named in the response message and the templateName audit field instead of 'unknown'; template remains accepted. The API reference, OpenAPI spec and CLI docstring describe the real request and response shape, and the ROLE_NAME variable is described as the existing role the constraints attach to. (issue #430)
  • Route authorization before the body on create — POST /database and POST /assets run the Tier-1 route authorization before reading the request body, so an unauthorized caller receives 403 rather than schema detail; the database request models report an invalid value once instead of also calling it missing. (issue #430)
  • Read-only templates no longer mint API keys — The database-readonly and global-readonly permission templates grant GET only on /auth/user/api-keys, so a read-only role can view its own API keys but cannot create, extend or delete them. The change applies to roles created from the corrected templates: a role imported from an earlier version keeps its stored <role>-user-api-keys constraint with POST, PUT and DELETE until that constraint is edited to GET only or deleted; re-importing the template adds new constraints rather than replacing the existing ones. (issue #430)
  • CLI hints name real commands — The "setup required" hint reads vamscli --profile <name> setup <api-gateway-url>, the profile commands run without a configured profile so a missing setup can be recovered from, and override-token errors name auth set-override -u <user-id> --token-stdin and auth login --user-id <user-id> --token-override-stdin. The VamsMCP server, the ArcGIS Pro connector and the Isaac Sim connector print the same corrected hints. (issue #430)
  • Location Service key masked in CLI output — auth status and the profile commands mask the Location Service style URL's key query value in human-readable output; --json-output is unchanged. (issue #430)
  • CLI documentation test — The documentation-flag test rejects a root option placed after the subcommand and also covers the developer setup guide, the CLI README and tools/VamsCLI/docs. (issue #430)
  • Infrastructure deploy scripts and synth noise — npm run deploy.dev and npm run deploy.vams both delegate to cdk.deploy.app without hard-coded stack name or Region context; getConfig() rejects a missing app.baseStackName (mirrored in the configuration builder) and the unreachable stack-name fallbacks in bin/infra.ts are removed; the unused adminUserId/adminEmailAddress CloudFormation parameters are removed; the dotenv banner, the adminUserId/adminEmailAddress configuration warning (which fired on the shipped defaults), the pip root-user notice in layer bundling and the aws-sdk external-module warning on the OpenSearch schema-deploy bundles no longer appear at synthesis. (issue #430)
  • Deployment, API and CLI documentation — Deployment docs: install npm 11 after nvm use (Node.js 22 bundles npm 10), Node.js minimum 22.0.0 with .nvmrc pinning 22.22.3, Git and github.com as prerequisites with the three viewer repositories the frontend install clones (needle-tools/usd-viewer, potree/potree, playcanvas/supersplat), the AWS CDK CLI pinned in infra/package.json and run as npx cdk, bootstrapping us-east-1 for the CloudFront web ACL stack when deploying to another Region, both web ACL stacks described, and a note that npm run … --dry-run is a real deployment. API docs: the base URL includes the api stage, both anonymous-route URL forms, discovery through the web domain, streaming as a 307 redirect, and the presigned-URL Authorization note on the stream endpoints. CLI docs: --profile before the command in every example, no --token-override/-u global options, and npx cdk in the Kiro steering documents. (issue #430)
  • /secure-config responds when Amazon Location Service is unreachable — The Location Service API key lookup is bounded (2 s connect, 5 s read, 3 attempts), so a deployment with all Lambda functions in the VPC and no com.amazonaws.<region>.geo interface endpoint receives 200 with an empty map URL and a warning naming the missing endpoint, instead of a 504 from API Gateway. (issue #440)
  • GR00T container containment test — The datasetPath containment test exercises the realpath-containment refusal with a relative traversal to an existing directory, and a sibling test pins the absolute-path refusal, so the container test suite is green and both refusal routes are asserted. (issue #429)
  • A/B deployment data migration documentation — The update guide's A/B step and the migration README no longer reference tools/VAMSDataMigration.py, a config/ directory or MigrationSchema_*.template.json files, none of which ship in the repository. They describe the real procedure: copy each Amazon DynamoDB table from Stack A into the matching empty Stack B table with AWS tooling, reading both stacks' table names from the SSM parameters under ResourceNamesSSMParamPrefixOutput, sync the S3 buckets, and then run the per-version same-stack upgrade scripts when Stack B is a newer VAMS version; the README's template outline is an index of the per-version upgrade READMEs. (issue #453)
  • Group abort warnings — A group abort returns each member's non-fatal sub-process abort warnings, prefixed with the member execution id, in a top-level warnings array; the MCP abort_execution tool preserves them. (issue #445)
  • Sub-process warnings name no ARN — Execution abort and failure-path warnings name a registered sub-process by its registered id or the final segment of its registered ARN (execution name, job id, task id), so the account id and Region in the ARN reach neither the API warnings array nor the pipeline log row; the full ARN stays in the server log. (issue #449)
  • No blank page on a slow network — While the application downloads after sign-in a loading indicator is shown, with a reload offer after 10 seconds; a code-split chunk that fails to download is retried once and then reloads the page once, and the error panel reloads the page for a failed download instead of offering a Retry that could not recover it. The login background image shows behind the sign-in form again, where the page background had covered it, fades into the page instead of ending on a hard edge, and is a 77 KB WebP instead of a 5.1 MB PNG. (issue #450)
  • Full-width pages — The top navigation, page and footer reach the right edge of the window on a page that does not scroll, where a permanently reserved scrollbar gutter left a strip on browsers with classic scrollbars, and opening an orchestration dialog no longer moves the page and header left by a scrollbar's width. (issue #458)
  • Compressed and cacheable web delivery — The CloudFront web distribution serves text files with Brotli or gzip, and the web bundle carries Cache-Control on both the CloudFront and ALB distributions: content-hashed assets/* files are immutable for a year and every other file is revalidated on each load. A deployment uploads new assets before index.html and deletes the previous release's assets only afterwards, so a page loaded mid-deployment never requests a deleted file. (issue #450)

Dependencies:

  • Documentation site build dependencies: tinypool 2.1.2 through an npm overrides pin, because @docusaurus/core 3.10.2 declares ^1.x and no patched 1.x exists (resolves GHSA-5gmw-xhrv-c9v3 and GHSA-85c8-ppgw-ccpr); shell-quote 1.11.0 (GHSA-pqg4-j6r4-53mv); proxy-addr 2.0.8 (GHSA-jqcg-44mw-7w3h); source-map-js 1.2.2 (GHSA-68fv-2mgg-jv7q); compression 1.8.2 (GHSA-vc2v-76pw-4v95). Build-time tooling of the documentation site only; nothing in the deployed stack changes. (issue #405)

Known issues:

  • The documentation site lockfile keeps http-cache-semantics 4.2.0 (GHSA-ch52-4w7c-c8xp; its advisory names no patched version, and the 4.3.0 release of 2026-10-04 is younger than the repository's 7-day dependency intake floor) and braces 3.0.3 (GHSA-vfj7-8cjw-p6xm; no patched release). Both are build-time only. (issue #405)

2.6.4​

Release date: 2026-10-05

Major changes:

  • Hotfix release of bug fixes for search database pre-filtering, permission constraint reads, deletes and updates, database and asset record updates, direct-write file triggers, indexing delivery retries, file content headers and archived-file search documents, the Garnet Framework add-on, metadata schema file-type restrictions, and configuration validation, with documentation, OpenAPI and steering corrections and dependency security updates.
  • Behavior changes to review before upgrading: small files written directly to a versioned asset bucket now launch matching fileUpload triggers, including the auto-registered triggers of built-in pipelines, so narrow or disable those triggers before a bulk direct load if that is not wanted; a metadata schema fileKeyTypeRestriction entry without a leading dot is rejected with a 400, and editing a stored schema that has one returns a 400 until the list is corrected; DELETE /database/{databaseId} answers 403 to a caller who may not delete the database, and 404 for one that does not exist, before it reports active contents; and the Database Admin, Database User, Database Read-Only and Global Read-Only permission templates grant GET /addon/physna/viewer, whose tenant-scoped token reaches every model in the Physna tenant. Roles already built from a template keep their stored constraints.

Key fixes:

  • Search database pre-filter — Search restricts results to the caller's accessible databases by exact database ID, so a database with a similar ID (smoke-db-2 beside smoke-db) no longer takes up result slots or appears in the facet counts.
  • Databases listed after deleted ones — Search no longer leaves out accessible databases listed after a run of deleted-database records in the database table.
  • Permission constraint lookups and deletes — Reading a permission constraint by ID no longer reports an existing constraint as not found once the constraints table outgrows one scan page, and a delete that leaves some of the constraint's rows behind returns an error instead of success.
  • Permission constraint writes — Creating or updating a constraint returns an error when its existing rows cannot be removed, instead of reporting success while a row for a dropped group or user keeps granting access, and the removal no longer misses a row written moments earlier.
  • Physna viewer in permission templates — The Database Admin, Database User, Database Read-Only, and Global Read-Only permission templates grant GET /addon/physna/viewer, so a role built from them can open the Physna viewer.
  • Asset update with null fields — A field sent as null is left unchanged; a null name, description or distributable flag was written to the asset record, and a null tag list returned a 500.
  • Metadata-schema update with null fields — A null name, field list or enabled flag is left unchanged; it was written to the schema, which then no longer read back as a schema and, for a null field list or enabled flag, stopped being enforced on metadata writes.
  • Database edits and asset recounts — Database edits and the asset recount write only their own fields, so neither reverts the other; an edit no longer recreates a database deleted meanwhile, and permanently deleting an archived asset of a deleted database no longer fails at the recount.
  • Asset operations after a failed recount — Archive, unarchive, permanent delete and create report success when the asset recount that follows their committed change fails, and still send their notification and write their history record.
  • Metadata schema updates — An update writes only the fields it changes, and only while the schema exists, so it no longer recreates a schema deleted meanwhile or reverts a concurrent edit; a deleted schema answers 404.
  • Database delete authorization — Database delete authorizes the caller before checking for active workflows, pipelines and assets, so a caller who may not delete the database receives 403, not a message revealing its contents.
  • Authorization function logs — Authorization checks no longer write a Casbin request line (caller ID and the checked object) to each handler's function log; the authorization audit log group still records API-level decisions and data-level denials.
  • Direct-write file triggers — A file written directly to an asset's Amazon S3 location fires a matching fileUpload trigger once at any size (below 8 MiB it fired none on a versioned bucket), and a direct write at or above 8 MiB is indexed once instead of twice.
  • File-upload trigger events — An asset.file.uploaded event that Amazon EventBridge refuses in a normal PutEvents response is re-sent once when the refusal is transient and otherwise logged as an error, instead of being logged as published.
  • Indexing delivery retries — A failed Amazon SNS publish from the DynamoDB-stream queuing Lambdas or the bucket-sync Lambdas is retried instead of silently dropping the change.
  • File content headers — Copy, move, rename, unarchive, revert, set primary type, upload finalization and workflow output ingestion keep a file's Content-Type and other content headers instead of resetting them, so a workflow output keeps the type it was written with. A file written directly to Amazon S3 still has its type reset by the bucket-sync stamp.
  • File change provenance — Setting or clearing a file's primary type records the change source fileMetadataUpdate with the acting user and the version it was copied from, instead of the previous writer's provenance, and no longer starts fileUpload workflow triggers. Archived preview files restored by a file unarchive record fileUnarchive like their base file.
  • File metadata near the 2 KB limit — VAMS file copies omit change-provenance entries that have no value, and set primary type, file version revert and file unarchive answer 400 naming the Amazon S3 2 KB user-metadata limit when the new version would exceed it.
  • Archived-file metadata changes in search — A metadata or attribute change on an archived file reaches the file index instead of being skipped.
  • Archived-file search documents — Archiving a file keeps its primary type and other S3 object metadata on its search document, and an archived file under ten or more stacked delete markers is no longer removed from the index.
  • File reindex of bucketExistingKey folders — A reindex that clears the file index, including the one reindexOnCdkDeploy runs, restores the files uploaded through VAMS to an asset created with bucketExistingKey whose folder is not named after the asset ID, instead of dropping them from search.
  • Unarchive into a deleted database — An archived asset whose database has been deleted is no longer unarchived into it by the unarchive API or by the bucket sync's automatic restore; it stays archived until a database with the same ID is created again.
  • Metadata schema file-type restrictions — A fileKeyTypeRestriction entry no file can match (no leading dot, a bare dot, a second dot or a path separator) is rejected with a 400 on create and update, create no longer caps an entry at 10 characters, and an update rejects a restriction on a schema that is not a file schema.
  • Derived data on permanent delete — Permanently deleting a file or an asset, reverting a file or an asset version, or deleting a file's auxiliary preview files deletes every stored version of the derived previews and viewer data.
  • Garnet Framework entities — Archiving an asset or deleting a database marks its existing entity archived instead of writing a second entity under a #deleted ID.
  • Garnet Framework archived files — An archived file is re-sent with isArchived: true instead of being acknowledged unchanged.
  • Isaac Lab external-bucket keys — The Isaac Lab openPipeline and vamsExecute functions are granted an external asset bucket's AWS KMS key when bucketKmsKeyArn is set, so a launch whose run manifest is in such a bucket no longer fails before the job is submitted.
  • Search page Database filter — The Search page Database filter matches the selected databases exactly, and the vamscli search help shows exact database filters and JSON filter examples the API accepts.
  • Asset page tags before tag types load — The asset page no longer fails with "Something went wrong on this page" when it opens on an asset with tags before the tag-type list has loaded or after that list failed to load; the tag line shows the bare tag names until the tag types are available.
  • FIPS in the EU Sovereign Cloud — Configuration validation warns when app.useFips is true in the AWS European Sovereign Cloud, which offers FIPS endpoints for only four services.
  • GenAI metadata labeling without Amazon Rekognition — Configuration validation flags the GenAI metadata labeling pipeline in the AWS European Sovereign Cloud and AWS GovCloud (US-East), where Amazon Rekognition is not offered.
  • Presigned URL timeout — Configuration synthesis warns about a presigned URL timeout outside 1 to 604,800 seconds, and the MCP download tool descriptions describe the timeout as an upper bound that the signing credentials can cut short.

Other changes:

  • Video Player: .avi, .flv, and .wmv files are no longer routed to a player that cannot open them.
  • Clearing the File Type Restriction field while editing a file metadata or file attribute schema removes the stored restriction.
  • The create-database form states the 4-63 character database ID rule the API enforces, and POST /database refuses an over-long databaseId with a message naming the 63-character limit.
  • Updating a permission constraint keeps its original creation date and creator, and the response and audit record report the write as update.
  • Asset version revert no longer lists the asset's entire S3 version history first, and sets the bucket-owner-full-control ACL on each version it writes.
  • A GET on either stream route answers 404 for a file that does not exist, as documented, instead of 400.
  • Uploading a file through VAMS no longer leaves a hidden copy of the file under temp-uploads/ in a versioned asset bucket.
  • Deleting a database no longer stores the internal object__type attribute on its deleted-database record, and the authorization policy build no longer logs the caller's user ID and role names.
  • Archive, unarchive, preview delete and asset version writes no longer store the internal object__type attribute on the asset record.
  • A metadata or attribute change reaches the file index for an asset whose stored location has no trailing slash.
  • Multipart upload part URLs are signed with the presigned URL timeout as a whole number of seconds, as download URLs are.
  • The file page mounts a new viewer for another file of the same asset version.
  • The NVIDIA Cosmos and GR00T model-cache buckets use an Amazon S3 Bucket Key with the customer managed key.
  • The Lambda layer build pins pip, Poetry and poetry-plugin-export, and the layer pyproject.toml files pass poetry check; every Lambda layer is republished on the upgrade.
  • The storage stack's AwsSolutions-SQS3 CDK Nag suppression covers only the bucket-sync dead-letter queues, the API builder and Garnet Framework suppressions cover only their dead-letter queues, and the Cosmos and GR00T pipeline constructs no longer carry one.
  • vamscli search simple --size help states the 2,000-result maximum that POST /search/simple enforces, and the MCP search_assets and search_files tool descriptions define total as the readable matches in the examined window.
  • The backend test suite runs the package versions the handler Lambda base layer ships (casbin 1.36.0 among them), and a backend test fails when the two drift; the deployed layer is unchanged.
  • The viewer end-to-end spec (web/e2e/viewers.spec.ts) finds its files on the target deployment and skips a viewer with no matching file, rather than requiring one seeded asset. Only the test harness changes.
  • The tag administration end-to-end spec (web/e2e/tags.spec.ts) skips its scope-switch test on a database with no tags of its own, rather than failing. Only the test harness changes.
  • Source comment and test docstring corrections: the bucket-sync publish and its tests, the Physna Pydantic version, the VPC builder's Amazon Cognito endpoint block, a GovCloud validation typo, the REST API stack name, the Cognito hosted UI domain, the HTML viewer's content-type note and the CI marker count. No runtime change.
  • Documentation and OpenAPI corrections to the API references: identifier lengths (3-63 characters, 4-63 for a new database), the OpenAPI asset schema and asset operation responses, timestamp values, the constraint responses and criteria rule, file change history and unarchive behavior, search field types and filter examples, the database delete check order, and the leading-dot rule for file extension lists.
  • Documentation corrections to the guides: the permissions model route tables, external-bucket setup (the CORS sample, reserved folders, the AWS KMS grant, the Step 3b key policy, the bucket-sync path, the auxiliary-bucket prefixes, the bucketExistingKey sync limitation and the bulk-import sample scripts), FIPS and AWS_USE_FIPS_ENDPOINT guidance and the overview pages' FIPS statements, Amazon Rekognition availability, the presigned URL timeout, the Garnet Framework configuration, dead-letter queue, reindex and license statements, the reindex utility and the archived-file documents a clearing reindex removes, the nested-stack dependency diagrams, the Pydantic model examples, the custom pipeline guide for bucketExistingKey assets, the viewer pages, plugin guides and catalog, and the Configuration Builder's Add-ons heading.
  • Steering corrections across the CLAUDE.md files, the Kiro steering and the Claude Code skills: pipeline VPC placement and output paths, 'unsafe-eval' and encryption-at-rest posture, identifier max_length, CLI command groups and MCP pagination fields, viewer registration and the framed-viewer no-referrer shim, route verification, documentation file references, test markers, the e2e fixture helpers, the Kiro REST authorizer and container Lambda examples, the layer build-tool pins, and permission-template counts.

Dependencies:

  • Authorizer Lambda layer and backend test dependencies: PyJWT 2.15.1 (resolves 13 advisories, among them GHSA-ffc3-869f-jxw9 and GHSA-hxm8-2xgr-2p9m). Only external OAuth IdP token verification uses PyJWT; a token whose segments carry characters outside the base64url alphabet is now denied, and compliant tokens verify as before.
  • Backend, base and authorizer Lambda layers, and the RapidPipeline (EKS) Lambda layer: urllib3 2.8.0 (resolves GHSA-8988-9cw3-xx77, GHSA-vxq7-64xx-v4gw and GHSA-gh4c-6fx4-qh6g).
  • RapidPipeline (EKS) Lambda layer: oauthlib 4.0.0 (resolves GHSA-hj66-6f7g-4r5v and GHSA-xpv3-w29h-x7cv, both in OAuth provider code the layer does not run).
  • Web: axios 1.20.0 (resolves 12 advisories), moment 2.31.0 (GHSA-4p3w-j4w9-5jqw), DOMPurify 3.4.16 (GHSA-p98j-92pf-mc4p) and fast-uri 3.1.8 (GHSA-hrr3-gc8f-f4qj).
  • Root, web/, infra/ and documentation-site lockfiles: brace-expansion 1.1.21, 2.1.7 and 5.0.12 (resolves GHSA-6j4f-fj2g-mc7p, GHSA-qhr7-859c-m2p7 and GHSA-q2hr-2g5m-vwhr); documentation site: fast-uri 3.1.8 and DOMPurify 3.4.16.

Known issues:

  • npm audit reports GHSA-vfj7-8cjw-p6xm for braces 3.0.3 in the root, web/ and documentation-site lockfiles. No patched braces release exists, and only lint, test and build tooling uses it.
  • infra/ npm audit reports the brace-expansion advisories for the copy bundled inside aws-cdk-lib, which npm cannot override and which no aws-cdk-lib release yet fixes. The code runs only during cdk synth and is not part of any deployed resource.
  • The documentation site keeps http-cache-semantics 4.2.0 (GHSA-ch52-4w7c-c8xp), which only the Docusaurus CLI's update check loads, until the fixed 4.3.0, published 2026-10-04, clears the 7-day min-release-age.
  • The nested viewer installs under web/customInstalls/* are not governed by the top-level .npmrc min-release-age setting; npm does not propagate it to child installs.
  • web/ npm audit reports six low-severity findings through vite-plugin-node-polyfills → elliptic (GHSA-848j-6mx2-7j84). No patched elliptic exists and every package in the chain is at its latest version; the affected crypto polyfill is not enabled in the web build, so the code is not bundled into the application.
  • File search hits are authorized against the asset name and tags recorded when the file was indexed, with no asset type, so a later rename or re-tag of the asset, and a constraint on assetType, do not apply to them; file contents stay protected.
  • POST /search computes aggregations and aggregationTotal before the per-record permission check, so a role whose constraints deny some assets by tag, asset type or name inside a readable database still sees their facet values and counts.
  • For an asset created with bucketExistingKey whose folder is not named after its asset ID, files written to or deleted from the folder directly in Amazon S3 are not indexed and do not start fileUpload triggers.
  • A reindex that clears the indexes, including the one reindexOnCdkDeploy runs, does not restore the search documents of archived files; the reindex utility page documents this.
  • A fileUpload trigger dispatch batch that runs past the dispatcher's 15-minute timeout is redelivered whole, so some files launch more than once and the last files may never launch.
  • Pipelines that write their output beside the input file write it to the asset's top folder when the input belongs to a bucketExistingKey asset or is an earlier workflow step's output.
  • Bucket sync's stamp on a file written directly to Amazon S3 resets its Content-Type and storage class, and drops object tags from a file of 8 MiB or more.
  • A file version that a newer version replaces before bucket sync processes its upload event has no change source in the file's version history, although its Amazon S3 metadata records one.
  • Auxiliary-bucket versions hidden by permanent deletes on earlier releases, and staged export payloads under assetExports/, are not expired automatically.
  • Staged upload copies that earlier releases left under temp-uploads/ in the asset buckets are not removed; a lifecycle rule on that prefix that expires noncurrent versions reclaims the storage.

2.6.3​

Release date: 2026-09-26

Major changes:

  • Hotfix release: the non-root CPU pipeline containers start correctly when their image is built under a restrictive umask, and npm dependency intake enforces a minimum release age.

Key fixes:

  • Non-root CPU pipeline containers — The preview (3D thumbnail) and coordinate-transform containers normalize read bits (chmod -R a+rX) after each source COPY, so an image built on a hardened host (umask 077/027) no longer leaves the copied Python source root-owned and unreadable to the non-root user, which had caused a PermissionError at import.

Other changes:

  • All .npmrc files set min-release-age = 7 (days) and all package.json files require npm >= 11.10.0 (the first version implementing min-release-age). CI workflows and build sites pin npm 11.19.1 to enforce the 7-day minimum release age for all npm dependencies.

Known issues:

  • The nested viewer installs under web/customInstalls/* are not governed by the top-level .npmrc min-release-age setting; npm does not propagate it to child installs.
  • web/ npm audit reports six low-severity findings through vite-plugin-node-polyfills → elliptic (GHSA-848j-6mx2-7j84). No patched elliptic exists and every package in the chain is at its latest version; the affected crypto polyfill is not enabled in the web build, so the code is not bundled into the application.

2.6.2​

Release date: 2026-09-23

Major changes:

  • Hotfix release for building VAMS from source: the web and infrastructure npm lockfiles install cleanly again, and the documentation site takes a dependency security update.

Key fixes:

  • web/ and infra/ lockfiles — package-lock.json in both packages records the complete set of optional platform-specific native bindings (esbuild, rolldown, lightningcss, @napi-rs/canvas, @parcel/watcher, @unrs/resolver-binding and their transitives), so npm ci installs them instead of failing with EUSAGE (lockfile out of sync with package.json). No dependency versions changed.
  • CI lockfile check — The build workflow runs npm ci --dry-run under npm 11 for the four package lockfiles (repository root, web/, infra/, documentation/docusaurus-site/) before installing, so lockfile drift — including missing optional native bindings for other platforms — fails the build instead of being rewritten silently by npm install.

Dependencies:

  • Documentation site: image-size 2.0.4 (resolves GHSA-w3rx-r6r6-pgpr and GHSA-5p2g-fcmc-qvqq).

Known issues:

  • web/ npm audit reports six low-severity findings through vite-plugin-node-polyfills → elliptic (GHSA-848j-6mx2-7j84). No patched elliptic exists and every package in the chain is at its latest version; the affected crypto polyfill is not enabled in the web build, so the code is not bundled into the application.

2.6.1​

Release date: 2026-09-13

Added:

  • Workflow orchestration refinements — Triggers can be drafted while creating a workflow (written once the workflow exists, with a Retry for a trigger the server refuses); the execute-workflow flow is a single stepped dialog whose first step is the workflow picker, with a compact multi-asset input list, a bulk file picker (folder prefix, name filter, select-all up to the 1,000-file limit, paste keys) and every blocker listed once on Review; each template input shows the {{tag}} placeholder it fills and the tag catalog lists the template's own tags first.
  • Sub-process status and log sources — Execution details report each pipeline step's registered sub-processes with per-stage status (includeSubExecutions=true) and every log source known for the step (availableLogs); the logs API reads one source (logId) or one stage (stageName) at a time. Built-in AWS Batch pipelines register their container logs per stage, and a registered AWS Deadline Cloud job reports its live status and exposes its session logs. Surfaced in the CLI (execution details --include-sub-executions, execution logs --log-id / --stage-name), the MCP server, and the web execution detail page.
  • File-to-execution links — A file version written by a workflow execution links to that execution from the asset file manager's details pane and the file-versions modal; fileInfo and enriched listFiles report changeWorkflowId and changeWorkflowExecutionId.
  • Template form — Create/edit recomposed as Basic, Pipeline overrides, Tags and Config Body, and Review. Declared tags are chips that insert their placeholder with the quoting the tag's type needs, a tag the body never references is flagged, and a JSON body is shape-checked as it is typed.

Fixed:

  • Execute-dialog layout (clipped dropdowns, scrolling footer), workflow-rule error messages, invocation-log scoping, log continuation tokens, subProcessEvents ordering, registration redelivery duplicates, AWS Batch container log reads, and Isaac Lab evaluation labels.
  • Asset file manager: an asset name arriving after the listing was already interactive cleared the file selection, which closed an open Automation menu or execute dialog on large assets.
  • Execute-dialog asset and file pickers return results in name / key order, so the capped first page is deterministic and a file is not hidden behind its derived outputs.
  • Execution-log redaction covers a Step Functions task token wrapped in an AWS Deadline Cloud job-parameter envelope.
  • Execution-log and sub-execution redaction covers a Step Functions task token carried as an AWS environment variable ({"Name": "TASK_TOKEN", "Value": "…"}, the shape a failed AWS Batch task reports in its Cause), and every sub-execution and stage cause is redacted before it is capped.
  • Asset file manager: a ?filePath= deep link opened on an already loaded asset page now moves the selection.
  • Asset edit form: tag types and tags are read for the asset's own database plus GLOBAL only, so required tag types from other databases no longer block the form.
  • The database picker for a new pipeline or workflow marks the GLOBAL scope with the same globe glyph as tag management.
  • GenAI 3D metadata labeling Amazon Bedrock grant — The metadata generation Lambda function's role names the configured inference profile (app.pipelines.useGenAiMetadata3dLabeling.bedrockModelId) instead of every inference profile in the account; the two foundation-model ARNs are unchanged.
  • Fargate pipeline state machines can stop their AWS Batch jobs — The GenAI 3D metadata labeling, 3D preview thumbnail, and Potree point cloud viewer state machine roles hold batch:DescribeJobs and batch:TerminateJob (scoped to the account's jobs), so stopping an execution also ends the running Fargate container.
  • Fargate pipeline container logs — The coordinate transform, Blender renderer, 3D thumbnail, PDAL, and Potree job definitions write container output to /aws/vendedlogs/Pipelines/<Name><hash> log groups encrypted with the deployment's KMS key, under the prefix the workflow execution-service role is granted to read. The groups are explicitly named and removed on teardown; delete any orphaned copy before redeploying the same configuration into the same account. See AWS resources and Uninstall.
  • Pipeline logger task-token redaction — Every pipeline Lambda's log output redacts the Step Functions task token: by key under all of its spellings (TaskToken, taskToken, sfnExternalTaskToken, externalSfnTaskToken, TASK_TOKEN), inside lists and Batch environment name/value pairs, and inside message text where the event or the token itself was rendered into the line. The handlers log their event as a structured field and no longer log the token on its own; the 14 vendored logger copies are identical.
  • Pipeline containers no longer log the task token — The 3D thumbnail, GenAI metadata labeling, and Potree point cloud viewer (PDAL and Potree) containers log the pipeline job name at entry instead of the whole pipeline definition, whose rendering carried the raw Step Functions task token into the container's CloudWatch log group.
  • Fargate container logs reach the execution log view — The coordinate transform, Blender renderer, 3D thumbnail, PDAL, and Potree pipelines register the /aws/vendedlogs/Pipelines/<Name><hash> group their job definitions write to as each Batch stage's container log source (the Potree viewer one group per converter job), and the job definitions' awslogs stream prefix is the physical job definition name, so the resolved container stream falls under the registered <jobDefinitionName>/default/ prefix and is read unfiltered. GPU Batch pipelines (NVIDIA Cosmos, GR00T, Isaac Lab, Splat Toolbox) keep registering AWS Batch's default /aws/batch/job group.
  • Potree viewer PDAL container build — The PDAL build image pins the conda-forge compilers toolchain to the 1.x generation (compilers<2, GCC 13/14) that PDAL 2.7.0 builds with. The unpinned upstream moved to compilers 2.x (GCC 15), which dropped the activation scripts that exported CC/CXX/AR (CMake found no ar at link time) and whose -Wtemplate-body rejects the vendored kazhdan Poisson sources.

Documentation:

  • FFmpeg notice for the NVIDIA pipeline containers — NOTICE.md and the Notices page record the Ubuntu ffmpeg package (GPL-2.0-or-later, installed at image build time, not version-pinned) in the Cosmos Predict, Cosmos Reason, Cosmos Transfer, Cosmos 3, and GR00T fine-tuning images.
  • app.useFips described as it behaves — The Configuration reference states that the flag switches the hostnames VAMS composes at synthesis to their FIPS variants and adds the KMS FIPS VPC endpoint, that SDK clients in Lambda functions and containers are not switched, and that AWS_USE_FIPS_ENDPOINT is a synthesis-time source of the flag rather than a requirement alongside it.

Dependencies:

  • maplibre-gl 6.9 with react-map-gl 8.1.3 (map consumers register a bundled worker); SuperSplat Editor v3.1.1 (renders through WebGPU only — see Troubleshooting); documentation-site, Veerum viewer install, and RapidPipeline EKS Lambda layer updates.

Other changes:

  • The vams-mcp package now reports the VAMS release version as its __version__; it had remained at 0.3.0. The root CLAUDE.md version-roll note names all seven files that carry the VAMS version.

Known issues:

  • The documentation-site image-size findings carried over from 2.6.0 remain without an upstream patch.

2.6.0​

Release date: 2026-08-30

Added:

  • Amazon Cognito OIDC federation — VAMS now supports federated authentication via any OpenID Connect identity provider (Okta, Auth0, Azure AD, etc.) alongside existing SAML federation. Configure infra/config/oidc-config.ts with provider details; client secret stored in AWS Secrets Manager. The login screen displays both native username/password and a configurable SSO button.

  • Configurable default user role — New app.authProvider.authorizerOptions.defaultUserRoleName option assigns a baseline role to authenticated users who have no explicit role assignments. Designed for federated identity provider users who are not pre-provisioned in the VAMS user management system.

  • Workflow, pipeline, and execution overhaul — A ground-up revamp of how VAMS defines pipelines and workflows, resolves their run-time configuration, executes them, and records execution history. Delivered across the backend, the CDK, the built-in pipelines, the CLI, and the web UI.

    • New pipeline and workflow data model — Pipelines and workflows are database-scoped definitions with a typed executionConfig (one block per execution type — AWS Lambda, Amazon SQS, Amazon EventBridge, or AWS Deadline Cloud — replacing the loose userProvidedResource JSON string) and an admin-only systemConfig covering input-file arity, asset scope, metadata inputs, input-file filters, and template requirements. A workflow references its pipelines by composite pipelineDatabaseId:pipelineId, so references resolve unambiguously across databases. See Pipelines and workflows.
    • AWS Deadline Cloud pipeline execution type — A pipeline can run its work as an AWS Deadline Cloud job. Its executionConfig.deadlineCloud block takes the target farmId and queueId (an optional storageProfileId), the OpenJD job template as template with templateType JSON or YAML (up to 256 KB), and optional priority, maxRetriesPerTask, and maxFailedTasksCount. The type is asynchronous only and completes through the Step Functions task-token callback, so waitForCallback must be Enabled. Deployments opt in with app.pipelines.deadlineCloudExecutionTypeEnabled, which is accepted only in the commercial aws partition — configuration validation rejects it for AWS GovCloud and the AWS European Sovereign Cloud — and creating a DeadlineCloud pipeline against a deployment that has not enabled it is rejected. When the type is enabled and Lambda functions run inside the VPC, a deadline.management interface VPC endpoint is created. See Pipelines and workflows and Configuration reference.
    • Pipeline configuration templates and tag schemas — A pipeline defines reusable configuration templates: a named configuration body (JSON, YAML, OpenJD, XML, or raw) with an optional per-template tag schema that declares the typed {{tagName}} placeholders inside it, validates a run's values, and renders the execute form. A template overrides its pipeline's input-file arity, asset scope, metadata inputs, and input-file filters, so one pipeline serves several conversion matrices. Bodies store inline and offload transparently to the artefacts bucket above a size threshold. See Building custom pipelines.
    • Asset-less multi-file execution — An execution takes an array of input files that may span several assets, an output-target asset, and per-pipeline execution parameters (a templateId with its tag values, or a custom template override). A pipeline reads its inputs, output locations, and asset identity from a resolved manifest, and asset, file, and database metadata arrive in one grouped envelope.
    • New execution operations — A global execution list with filters and pagination, execution details and logs, abort of a single execution or of an entire execution group, re-run from the stored execution records, and admin-only permanent delete. See Executions.
    • Workflow triggers — A typed trigger structure (currently fileUpload) fires a workflow when a matching file is uploaded, matched by the workflow's input-file filters and dispatched through the VAMS orchestration Amazon EventBridge bus.
    • Standardized built-in pipeline registration — Built-in pipelines register from a file-based vamsSchema bundle uploaded to the artefacts bucket at deploy time, so registration is idempotent and carries no hard-coded ARNs. An external solution self-registers through the same importer. Per-output-format built-ins are consolidated into single pipelines with one template per format. See Migrating custom pipelines from v2.5 to v2.6.
    • CLI — New pipeline, workflow, and execution command groups covering the full API surface: pipeline CRUD plus pipeline template and pipeline tag-schema; workflow CRUD, workflow trigger, and multi-file workflow execute; and execution list, details, logs, abort, rerun, and permanent-delete. See Pipelines, Workflows, and Executions.
    • Web — New top-level Pipelines, Workflows, and Executions pages plus an execute wizard, built on React 18: category-grouped server-paginated lists, a live-polling executions board with status, trigger, and group filters, a full execution-detail page, and a DAG-preview workflow builder. Existing pages and viewer plugins are unchanged. See Pipelines and workflows.
  • Physna Sync add-on (Phase 1) — Optional one-way synchronization of supported VAMS files, file metadata, file attributes, and asset metadata to a Physna tenant for geometric and semantic 3D search. Enable via app.addons.usePhysnaSync in infra/config/config.json. See Physna Integration.

  • Physna Viewer plugin — New viewer plugin that embeds the Physna-hosted 3D/CAD viewer directly inside VAMS asset pages. Enabled automatically whenever the Physna Sync add-on is deployed. A new VAMS-authorized endpoint (GET /addon/physna/viewer) applies both authorization tiers and returns a Physna viewer token to the browser, which then loads the viewer directly from Physna; the Physna client credentials stay in AWS Secrets Manager and never reach the browser. That token carries no asset scope, so Physna-hosted viewer access is flat across every synced database. See Physna Integration.

  • Geospatial search and map view across assets and files. Asset and file OpenSearch documents now include a derived geo_MD_location field of type geo_shape, populated by the indexers from a location metadata key (GeoJSON or {latitude, longitude, altitude}) or from individual latitude/longitude/altitude metadata fields. The POST /search and POST /search/simple API endpoints, the vamscli search commands, and a new sidebar panel in the web UI accept point + radius, bounding box, and arbitrary GeoJSON filters with intersects/within/contains/disjoint relations. Map view (including mini-map thumbnails) now works for both assets and files, and renders polygon/multi-polygon shapes as well as points.

  • EventBridge orchestration bus — A top-level custom Amazon EventBridge event bus is now created as a foundation for future event-driven VAMS features (email/subscription events, pipeline registration and success/error events, audit event logging). Bus and event-source names are deployment-unique so multiple VAMS deployments can coexist in one AWS Region, and a starter audit rule routes all VAMS deployment events to a dedicated Amazon CloudWatch log group.

  • Advanced IAM role customization — Two optional, opt-in mechanisms for environments that restrict or centrally manage IAM role creation, controlled by a new app.iamRoleConfig config section. useCustomBootstrapRoles replaces the CDK bootstrap roles (or removes them entirely via the CLI-credentials synthesizer), and useCustomVamsStackRoles applies iam.Role.customizeRoles to generate an IAM policy report and substitute pre-created application roles across the WAF stack, core stack, and all nested stacks. The role mappings live in a separate infra/config/policy/iamRoleConfig.json file. Both options default to disabled, so VAMS manages all IAM roles unless explicitly opted out. See Configuration reference.

  • Stable VPC Availability Zone count — The VPC builder now provisions every subnet type across a fixed baseline of two Availability Zones rather than varying the count by feature, which removes a class of AWS CloudFormation subnet-deletion failures that occurred when features were later disabled. Public and private (egress) subnets are still created only when an internet-facing pipeline or the public-subnet ALB needs them. A new networking troubleshooting procedure documents how to recover a stack that hit subnet-deletion or stuck-ENI errors.

  • Configurable OpenSearch Availability Zone count — Amazon OpenSearch Service provisioned domains accept a new app.openSearch.useProvisioned.availabilityZoneCount option (2 or 3, default 2), with one data node per zone. At 2 the domain runs Multi-AZ without Standby; at 3 it runs Multi-AZ with Standby, and the asset/file indexes are created with two replicas (three copies) to satisfy Standby's multiple-of-three requirement. The default of 2 matches the historical domain layout, so existing provisioned deployments are unchanged. A 3-AZ Standby domain must be created fresh (an in-place 2→3 switch is rejected by the service). See Configuration reference and Network architecture.

  • Configurable OpenSearch shard count — Provisioned domains accept a new app.openSearch.useProvisioned.numberOfShards option (default 1) to set the primary shard count per index. Large indexes — as a guideline, those expected to exceed roughly 60 GB (about 3 million asset or file records) — should increase it. The shard count is fixed at index creation, so changing it requires re-creating the index (disable and re-enable OpenSearch, then reindex).

  • Updated provisioned OpenSearch instance type — The default node instance type for provisioned domains changed from r6g.large.search to r7g.large.search (newer Graviton generation) for both data and master nodes, across config.ts and all config templates. dataNodeInstanceType / masterNodeInstanceType remain configurable.

  • Partition-based OpenSearch engine version — The provisioned OpenSearch engine version is now selected by partition. Commercial AWS, AWS GovCloud, and other partitions use OPENSEARCH_VERSION (OpenSearch 3.x); the AWS European Sovereign Cloud (partition aws-eusc, Region eusc-de-east-1) uses the new OPENSEARCH_VERSION_EUSOVEREIGN (OpenSearch 2.x) because OpenSearch 3.x is not yet supported there. The selection is automatic based on the deployment partition and requires no configuration.

  • Automatic OpenSearch service-linked role creation — The AWSServiceRoleForAmazonOpenSearchService service-linked role is now created idempotently during deployment, resolving intermittent "you must enable a service-linked role to give Amazon OpenSearch Service permissions to access your VPC" failures on provisioned deployments. The role is created if missing and left unchanged if it already exists; it is account-wide and not removed on stack teardown.

  • AWS European Sovereign Cloud template and endpoints — Added a deployment template (infra/config/config.template.eusovereign.json) for the AWS European Sovereign Cloud (Region eusc-de-east-1, partition aws-eusc). For now it reuses the GovCloud guardrails (app.govCloud.enabled = true) and sets OpenSearch provisioned availabilityZoneCount to 2. The partition-aware service endpoint table was regenerated from the upstream botocore endpoints file to add the aws-eusc partition, fill in services added to existing partitions (aws, aws-cn, aws-us-gov, aws-iso, aws-iso-b, aws-iso-e, aws-iso-f) over time, and add newly published services.

  • Next-generation OpenSearch Serverless upgrade — Amazon OpenSearch Serverless is upgraded to next-generation Serverless, which brings scale-to-zero (indexing and search compute scale down to 0 OCUs when idle, so an idle deployment incurs near-zero OpenSearch compute cost), higher performance (faster autoscaling and resource provisioning in response to workload spikes), and better cost pricing (configurable OCU ceilings combined with scale-to-zero let a deployment pay for the capacity it uses instead of a fixed always-on minimum). The collection is deployed into a collection group whose generation is set by new app.openSearch.useServerless options: nextGen (default true for commercial partitions, false for GovCloud/EU Sovereign Cloud — sets the generation to NEXTGEN or CLASSIC), allowPublic (default true; false places the collection behind a VPC endpoint), enableStandbyReplicas (defaults to the value of nextGen; required to be true for NEXTGEN, optional for CLASSIC), and OCU capacity bounds minIndexingOcu/maxIndexingOcu/minSearchOcu/maxSearchOcu (defaults 2/16/2/16; each must be one of 0, 2, 4, 8, 16, or any multiple of 16). Scale-to-zero (a minimum OCU of 0) trades an approximately 10–20 second cold start after about 10 minutes of inactivity for the cost savings; keep the minimum OCUs at 1 or greater for consistently low latency. A private collection (allowPublic=false) requires app.useGlobalVpc.enabled and is reached over a VPC endpoint spanning two Availability Zones; as with provisioned OpenSearch, only the OpenSearch-facing Lambda functions are placed in the VPC (app.useGlobalVpc.useForAllLambdas is not required). See Configuration reference.

  • Reindex utility direct-run mode — The OpenSearch reindex utility added a --mode option: lambda (default, invokes the deployed reindexer Lambda — unchanged behavior) and direct (runs the backend reindexer handler locally with no execution-time limit). Direct mode is intended for very large asset repositories where the Lambda would exceed its 15-minute maximum runtime; it requires the handler's table-name and SSM-parameter inputs and local AWS credentials, while --backend-path defaults to the backend source resolved relative to the script (overridden only for non-standard checkouts). New guidance recommends monitoring the reindexer Lambda for timeouts on deployments above roughly 100,000 records.

  • CLI Amazon Cognito password management — vamscli auth login gained a --new-password option so a forced password change (for example, on a new account's first sign-in) can complete non-interactively, including under --json-output. New vamscli auth change-password (change a known password) and vamscli auth forgot-password (self-service reset via an emailed verification code) commands were added. All are Amazon Cognito-only and backward compatible with existing login commands. See Setup and Authentication.

  • VAMS MCP server — A Model Context Protocol server (tools/VamsMCP/) that exposes the VAMS API as agent-callable tools, letting any MCP-capable host search, inspect, and manage databases, assets, files, metadata, versions, tags, asset links, and workflows through natural language. It stores no credentials and reuses the local vamscli profile, so each user runs it against their own VAMS account and receives exactly that user's two-tier permissions. Read and search tools are always available; create and update tools require VAMS_ENABLE_WRITES=true, and archive and delete tools additionally require VAMS_ENABLE_DESTRUCTIVE=true. Both mutation tiers are off by default. See Agentic Development.

  • VAMS agent skill — A portable agent skill (tools/VamsAgentSkill/SKILL.md, invoked in Claude Code as /vams-agent) that operates a live deployment at runtime through the installed CLI. The skill discovers the deployment's current commands through vamscli --help rather than hardcoding them, authenticates per session, scopes itself to the routes the authenticated user is allowed to call, and operates read-only unless the user explicitly authorizes changes. See Agentic Development.

  • API Gateway REST API migration — The backend API moved from Amazon API Gateway HTTP API (v2) to REST API (v1), served under a fixed /api stage and built from a cross-stack route registry materialized into a single inline OpenAPI specification. It supports REGIONAL (default, public) and PRIVATE endpoint types and a configurable integration timeout (app.api.apiGatewayRest.apiGatewayTimeoutTime, default 29 seconds, maximum 300). The custom Lambda authorizer is now a REST REQUEST authorizer that resolves the client IP adaptively — the forwarded IP through Amazon CloudFront or an ALB, the direct source IP for callers reaching execute-api directly. See Configuration reference and Security: Developer Reference.

  • Per-database tag namespacing — Tags and tag types can be created as GLOBAL (available in every database) or scoped to a specific database, so the same name can exist independently in different databases. A name may not be both global and database-specific, so every tag an asset references resolves unambiguously within the asset’s own database plus GLOBAL. The Casbin tag and tagType constraints gain a databaseId field for scoping tag administration, and a database can no longer be created with the reserved id GLOBAL. Pre-upgrade tags are treated as global and copied by the tagsNamespacing migration step. See Tags and Tags and Tag Types API.

  • File preview from search results — Each viewable file row in file search results carries an eye icon that opens the file in a popup visualizer without navigating to its asset, and a multi-select mode accumulates several files and opens them together in one viewer. Per-file asset and database context flows through, so each file loads from its own asset. See Search and Discovery.

  • IFC BIM file viewer — A new viewer plugin renders Industry Foundation Classes building models with the open-source That Open Engine (web-ifc), supporting .ifc and .ifczip with a spatial model tree, element property inspection, hide/isolate, section planes, and measurements. Vendored as a self-contained bundle and enabled by default. It uses the multithreaded web-ifc-mt.wasm build when cross-origin isolation is available and falls back to single-thread otherwise, and is gated on the ALLOWUNSAFEEVAL feature flag because its WASM loader needs unsafe-eval in the CSP. See Viewer plugins.

  • SuperSplat Editor viewer — A new viewer plugin embeds the open-source PlayCanvas SuperSplat Gaussian-splat editor, supporting .lcc (XGRIDS multi-LOD, not previously viewable in VAMS), .ply, .sog, and .splat, and becomes the default viewer for splat formats. It is the first iframe-embedded viewer; its editing and export tools operate in the browser only and are not saved back to VAMS. The editor renders through WebGPU and requires a WebGPU-capable browser (current Chrome and Edge, Safari 26 or later, Firefox with WebGPU enabled). See Viewer plugins.

  • Cesium 3D Tileset viewer no longer requires unsafe-eval — The viewer moved to the widget-less @cesium/engine package, whose load and render paths contain no dynamic JavaScript code generation, so it no longer depends on the ALLOWUNSAFEEVAL feature flag and is available on all deployments; the bundle is also roughly three times smaller. KTX2/Basis compressed textures and .spz splats still require unsafe-eval. See Viewer plugins.

  • Coordinate Transform pipeline — A new pipeline reprojects point cloud files between coordinate reference systems, accepting E57, LAS, and LAZ and producing LAZ, LAS, E57, or PLY through an AWS Batch Fargate container using PDAL and pyproj. Source and target CRS accept EPSG codes, PROJ strings, WKT, or custom named local grids, set as pipeline defaults or overridden per asset through metadata. Enable via app.pipelines.useConversionCoordinateTransform. See Coordinate Transform pipeline.

  • NVIDIA Cosmos 3 (omni) inference pipeline — A new Physical AI pipeline performs GPU-accelerated generation on NVIDIA’s omnimodal Cosmos 3 world foundation models from a single shared container image, where the model variant is selected by checkpoint and the task by model_mode. It supports Cosmos3-Nano (16B) on a four-GPU tier and three Cosmos3-Super (64B) variants — Text2Video, Text2Image, and Image2Video — on an eight-GPU tier, both FSDP-sharded, with metadata-driven prompts. Each variant is enabled independently via app.pipelines.useNvidiaCosmos3. See NVIDIA Cosmos 3 pipeline.

  • Gaussian Splat Toolbox v1.0.0 — The Gaussian Splat Toolbox pipeline is upgraded to the upstream Open Source 3D Reconstruction Toolbox for Gaussian Splats on AWS v1.0.0 release, adding mesh and interchange outputs (.usdz and a collision mesh .ply suitable for simulation and physics) alongside the existing splat, video, and image outputs. The Gaussian Splat Toolbox and NVIDIA Isaac Lab Training pipelines can also build their container images with AWS CodeBuild instead of a local Docker build.

  • Asset lifecycle history — VAMS keeps a permanent per-asset audit history of create, edit, archive, unarchive, and permanent delete operations, capturing the operation, the acting user, the change origin (API versus Amazon S3 bucket-sync ingestion), and a snapshot of the asset fields after the operation. Records survive permanent deletion, and recreating an asset with the same identifier continues the same trail. Exposed through a paged GET /database/{databaseId}/assets/{assetId}/assetHistory, the vamscli assets history command, and an Asset History modal in the web file manager. See Assets API and Assets CLI.

  • Asset file change provenance — VAMS tracks how each file version was created and by whom — uploads, workflow executions, copies, moves, renames, archives, and direct Amazon S3 changes — stamped as S3 object metadata when the version is created and recorded on ingest. File list and detail responses surface the current version’s change source and modifying user, and file version history surfaces the full per-version provenance. Versions created before this release report blank provenance. See Files API and Files CLI.

  • Bulk presigned-URL generation for downloads — The download API accepts a keys array (up to 1,500 keys of one asset per request) alongside the existing single key, returning a per-file entry array and skipping unavailable paths with a per-file report; the request errors only when no URL can be generated. Single-file requests remain fully backwards compatible. The CLI multi-file flows, sync file pull, the web shareable-URL dialog, and the multi-file/folder download page all use it with local paging. See Assets API.

  • CLI directory synchronization — A new sync command group provides vamscli sync file push and vamscli sync file pull, performing Amazon S3-sync-style directory synchronization between a local directory and an asset or asset subdirectory. It compares by size and modified timestamp and transfers only the differences, supports .vamsignore exclusions, and detects conflicts. Downloads write to a temporary file, verify the received size, move atomically into place, and stamp the remote modified timestamp, so interrupted downloads no longer leave partial files. See Sync CLI.

  • User-level (self-service) API keys — New /auth/user/api-keys routes let users manage their own API keys without administrative access. All operations are scoped server-side to the requesting user’s keys, an expiration date of at most 365 days is required at creation, and later edits cannot extend it beyond 365 days from the original creation date. The existing admin routes are unchanged. Exposed through vamscli api-key user list|create|update|delete; the web API Key Management page now offers all-keys (admin) and my-keys modes and moved to a new User navigation section. See API keys and Users and keys CLI.

  • API route and constraint metadata endpoints — GET /auth/routes/api returns the full list of VAMS API routes (paths, methods, categories) from a master route definition file, and GET /auth/routes/api/allowed returns the routes the requesting user is authorized to call. GET /auth/constraints/permissionObjects returns the constraint object types with the fields valid on each, plus the criteria operators, permissions, and permission types, making that metadata API-driven rather than defined in the web client. The per-object-type field matrix is authoritative: a criterion whose field is invalid for its object type is rejected at create, update, and template import. Exposed through vamscli auth routes list|allowed and vamscli role constraint permission-objects.

  • Combined AND and OR authorization criteria — When a constraint defines both criteriaAnd and criteriaOr, access now requires all AND criteria to match and at least one OR criterion to match; earlier releases evaluated the two groups as alternatives. Combined constraints also generate fewer Casbin policy rules, improving authorization-check performance. See Permissions model.

  • Asset archive and unarchive file-state independence — Unarchiving an asset restores the asset record only by default, leaving its files archived. An opt-in (unarchiveFiles API field, --unarchive-files CLI flag, web modal toggle) restores exactly the files that the asset archive operation archived, tracked through new provenance records; files archived individually beforehand always stay archived. Uploading a file directly to Amazon S3 under an archived asset’s prefix now auto-restores the asset record while preserving its older files’ archived state.

  • Metadata API pagination — The metadata GET endpoints (asset, file, database, and asset link) now return a page of records plus a NextToken, and accept maxItems, pageSize, and startingToken, keeping responses under the AWS Lambda and Amazon API Gateway response-size limits. Schema enrichment and ordering are applied to the full record set before paging, so ordering is stable across pages. The CLI and the web metadata views follow NextToken automatically; direct API consumers that do not follow it receive only the first page. See Known limitations.

  • Resource names resolved from AWS Systems Manager — Amazon DynamoDB table names, non-asset Amazon S3 bucket names, and audit Amazon CloudWatch log group names are now resolved from Parameter Store rather than injected as Lambda environment variables. A new ResourceNamesBuilder nested stack publishes the parameters under the deployment prefix, and non-pipeline Lambda functions resolve names at module load with a 60-minute cache. Pipeline Lambda functions continue to use environment variables. See AWS resources.

  • AWS WAF blocks by default and always protects the API — WAF rules are defined in infra/config/policy/wafPolicyConfig.json; the shipped file enables the AWS Common Rule Set, Known Bad Inputs, and Amazon IP Reputation List in block mode plus a rate-based rule for L7 DDoS and brute-force throttling, while the web ACL default action remains allow. A regional web ACL is now always created and associated with the API Gateway stage, for both endpoint types and regardless of front — previously, with Amazon CloudFront enabled the only ACL was CloudFront-scoped, leaving the directly reachable execute-api endpoint unprotected. See Configuration reference.

  • Network restrictions for Amazon S3 presigned URLs — A new app.assetBuckets.presignedUrlNetworkRestrictions option enforces allowedIpRanges or allowedVpceIds (mutually exclusive) as bucket policy deny statements on the VAMS-created asset and auxiliary buckets, applying only to presigned (query-string authenticated) requests. Restriction changes apply on redeploy, including to already-issued URLs. An equivalent manual bucket policy is documented for externally imported buckets. See Configuration reference.

  • Retained AWS KMS customer-managed key — When AWS KMS customer-managed key encryption is enabled and VAMS generates the key rather than importing one, the key uses a RETAIN removal policy, matching the Amazon DynamoDB tables and the asset, auxiliary, artefacts, and access logs buckets it encrypts. Earlier releases removed the key on cdk destroy, which left that retained data permanently undecryptable. Deleting the key is an explicit operator step taken after the retained tables and buckets have been removed. The key carries no AWS KMS alias and is addressed only by its generated key id, so leaving it in place does not collide with the key a redeploy creates. See Uninstall the solution.

  • Interactive Configuration Builder — A new browser-based form on the documentation site generates and validates an infra/config/config.json from a Commercial, AWS GovCloud, or AWS European Sovereign Cloud starting template, so operators can assemble a valid configuration without hand-editing deeply nested JSON. It mirrors the cross-field validation getConfig() enforces at deploy time and is a helper rather than a gate — cdk synth remains the source of truth. See Configuration builder. Key fixes:

The full list is in the repository CHANGELOG.md; these are the ones that change what a deployment or a script observes.

  • Uploads no longer report success for a file the server refused. Completion is where the API runs its validations, and a file it rejects is deleted rather than stored — but both the CLI and the web upload decided each file's outcome from whether their own Amazon S3 part uploads had finished, and neither read the per-file verdict in the completion response. vamscli file upload printed "Successful files: 4/4" and exited 0 for an upload that left nothing in the bucket for one of them; the web summary said "Upload completed successfully" for the same case. Both now reconcile against the response and name the reason the API gave.
  • A .previewFile. companion is no longer lost when several files are uploaded together. A companion is sequenced separately from the file it previews, and the API accepts it only if that base file arrives in the same request or already exists in Amazon S3 — so the companion's sequence must complete after the base file's. The intended ordering existed only as a comment: both groups were handed to a single concurrent gather, so on a live deployment between 2 and 6 of 12 companions per run were refused and deleted, varying run to run because it was a race.
  • Metadata schema validation no longer fails open. Schema conformance, the controlled-list check, the value-type-change guard, and the restrictMetadataOutsideSchemas prohibition ran inside a block that logged a warning and continued on any unexpected error, so a transient Amazon DynamoDB error turned a configured governance control off and answered 200 with off-schema metadata stored. A create, update, or delete whose validation cannot complete is now refused.
  • vamscli assets download no longer reports success for a download that fetched nothing. Files the API declined to issue a download URL for were skipped one by one, so a request in which every file was declined still reported overall_success: true and exit code 0 — an empty output directory presented as a completed download. The most common cause is an asset that is not distributable.
  • Every AWS client the backend builds now carries the adaptive retry configuration, so a sustained burst is smoothed client-side instead of surfacing as throttling on the caller's request. The audit writer was the sharpest case: its CreateLogStream sits under an account-wide quota and its failure path drops the entry.
  • Subscriber change notifications are delivered for assets whose name is long or carries a line break. The Amazon SNS subject was built from the asset name unbounded, and SNS refuses a subject of 100 characters or more or one containing a line break — so an asset name of roughly 70 characters or more made every version-change notification for that asset fail permanently while only logging.
  • Security: AWS WAF now logs requests durably to a CloudWatch log group with Authorization redacted; CloudFront responses carry Referrer-Policy: strict-origin-when-cross-origin and a Permissions-Policy (asset identifiers appear in the hash route, so a full referrer disclosed them to third-party hosts — an ALB deployment exposes no listener attribute for either header and cannot carry them); the HuggingFace token supplied in configuration no longer leaves a cleartext copy on the build host; and the asset export no longer writes token claims or the asset-links response body to its log group.
  • Accessibility: pinch-to-zoom and swipe-to-scroll work on touch devices again. The document root declared touch-action: none, and because a gesture's effective touch-action is the intersection of the values along the ancestor chain, that suppressed both gestures on every page.

Documentation:

  • CLI documentation consolidated into the official site. The complete VamsCLI reference — every command and option, authentication and profile flows, installation, automation, and a new CLI-specific troubleshooting section — now lives under the CLI section of the documentation site (cli/). The legacy in-repo docs under tools/VamsCLI/docs/ are deprecated; tools/VamsCLI/README.md retains basic installation and quick start and points to the official site. See CLI Getting Started.
  • New developer security reference. A new Security: Developer Reference page traces a request from the identity provider through the custom Lambda authorizer to both Casbin authorization tiers, documenting where claims and roles are produced and consumed at each hop, the authorizer's cache lifetimes, and the customizable authentication override hooks.

Breaking changes:

  • The workflow, pipeline, and execution overhaul breaks externally registered pipelines. A pipeline written against v2.5 does not run unchanged: it reads its inputs from a resolved manifest rather than from the invocation payload, an asynchronous pipeline returns an AWS Step Functions task token for the workflow to advance past it, and it registers its sub-processes and log locations so abort and log retrieval reach them. Registration moves as well — a definition is declared in a file-based vamsSchema bundle imported through the schema importer, and a pipeline is referenced by composite pipelineDatabaseId:pipelineId. The data migration reshapes stored definitions but cannot change a pipeline's code, so every externally maintained pipeline is ported with Migrating custom pipelines from v2.5 to v2.6. Deployments running only VAMS built-in pipelines need nothing beyond the update steps. The pipeline, workflow, and execution API is the overhauled shape and is not backward-compatible with the pre-overhaul endpoints.
  • Reading, aborting, or re-running an execution requires the operation's action on every asset the run read — each input file's asset plus each asset named as a metadata source — where earlier releases accepted any one of them for the global listing while requiring all of them for the details, so a listing could offer a row whose details then returned 403. A role scoped to a subset of databases stops seeing cross-database runs it could previously list and stops being able to re-run them; widen its asset and database GET constraints to cover the databases those runs span to restore the earlier breadth. An asset that has been permanently deleted is authorized on the database it lived in, so the history of runs against a deleted asset remains reachable; an archived asset is unaffected and stays authorized on its own record. See v2.5 to v2.6 update guide.
  • The API Gateway endpoint changes. The migration from HTTP API (v2) to REST API (v1) creates a new API Gateway identifier and invoke URL, so any client registered directly against the old endpoint must be re-setup — including the VAMS CLI (re-run vamscli setup) and any external integration or script that stored the API base URL. Clients that reach the API through the Amazon CloudFront or ALB front, including the web application, continue to work unchanged. Existing config.json files must also move globalRateLimit, globalBurstLimit, and endpointType under app.api.apiGatewayRest and add app.api.apiType set to "APIGATEWAY_REST". See v2.5 to v2.6 update guide.
  • A VPC deployment that runs all Lambda functions in the VPC without VAMS-managed VPC endpoints now requires an AWS Systems Manager interface VPC endpoint. With app.useGlobalVpc.useForAllLambdas enabled and app.useGlobalVpc.addVpcEndpoints disabled, the operator must supply the SSM endpoint: every non-pipeline Lambda function resolves its resource names from Parameter Store at cold start and fails without SSM API access.
  • OpenSearch index names rolled forward to vams-assets-v3 and vams-files-v3. The schema-deploy custom resource creates the empty v3 indexes; the previous v2 indexes are abandoned and left in place until you delete them manually. A reindex is required to populate v3.
  • OPENSEARCH_VERSION switched from OPENSEARCH_2_7 to OPENSEARCH_3_5. Provisioned OpenSearch domains will perform a major-version engine upgrade. Serverless collections are unaffected.
  • OpenSearch Serverless now deploys the collection into a collection group and adds nextGen, allowPublic, enableStandbyReplicas, and OCU capacity options. Because the collection is placed in a collection group, the public-access network-policy change is applied, and the group generation (CLASSIC or NEXTGEN) is set, enabling or changing Serverless requires a re-deployment: disable Serverless and deploy, then re-enable with the new settings and deploy, and reindex. A minimum OCU of 0 requires nextGen=true, and nextGen=true requires enableStandbyReplicas=true (NEXTGEN collection groups do not support disabled standby replicas); a private collection (allowPublic=false) requires app.useGlobalVpc.enabled (only the OpenSearch-facing Lambda functions are placed in the VPC, so app.useGlobalVpc.useForAllLambdas is not required). See v2.5 to v2.6 update guide.
  • The authorizer claims context shape changed, which can break customized MFA, claims, and login-profile logic. Deployments that have edited the customization hooks under backend/backend/customConfigCommon/ must review them before upgrading; stock deployments need no action. The REST API (v1) REQUEST authorizer delivers claims as a flat map of string values under requestContext.authorizer, rather than nested at requestContext.authorizer.jwt.claims or requestContext.authorizer.lambda as the HTTP API (v2) did — so custom logic that branches on those nested keys and falls through to an empty dict now silently reads no claims instead of raising. Every value is a string, so JSON-valued claims (vams:tokens, vams:roles) need json.loads and vams:mfaEnabled is "true"/"false". Read claims through request_to_claims(event) instead of indexing the authorizer context directly. Additionally, customMFATokenScopeCheckOverride changed signature from (user, lambdaRequest) to (user, authorizerJwtClaims, lambdaRequest), is now called from the authorizer instead of each handler, and its Cognito default uses admin_get_user with the new USER_POOL_ID environment variable; a hook still written against the old signature is caught and defaulted to false, silently disabling MFA-gated roles. MFA is resolved once at authorization time and delivered as vams:mfaEnabled, so customAuthClaimsCheckOverride should read claims_and_roles["mfaEnabled"] rather than re-deriving it. See Authentication and Authorization Flow and Authentication Override Hooks.
  • Enabling a VPC-requiring feature (ALB, OpenSearch Provisioned, or any container-based pipeline) while app.useGlobalVpc.enabled is false now fails configuration validation with an explicit error instead of silently auto-enabling the VPC. Configurations that previously relied on the implicit auto-enable must set app.useGlobalVpc.enabled to true explicitly. See Configuration reference and Plan your deployment.
  • Provisioned OpenSearch availabilityZoneCount defaults to 2 and the VPC is built with that many Availability Zones. Earlier releases built the VPC across 3 Availability Zones for provisioned OpenSearch while the domain used only 2, so on upgrade the unused third AZ subnet is removed — a VPC downgrade that can fail subnet deletion when elastic network interfaces are still attached. Set availabilityZoneCount to 3 to preserve the existing VPC, or follow the drain-and-redeploy teardown to move to 2 AZs. See v2.5 to v2.6 update guide.
  • Role constraints that scope the pipeline objectType by pipelineType are no longer enforced as written, and a manual audit is required before upgrading. pipelineType is not a constraint criteria field in v2.6 — the value it held now lives in category — and a criterion naming an unrecognized field is dropped when the permission policy is compiled, so the constraint silently widens. See Permission constraint audit for pipelineType.
  • PUT /roles is a partial update, so a client that relied on an omitted field being reset must now send it explicitly. The endpoint previously rewrote description, source, sourceIdentifier, and mfaRequired on every request from the request model's defaults, so an edit naming only description set mfaRequired to false and nulled the source linkage — silently removing an MFA requirement, with nothing in the audit log to show it. Only supplied fields are written now, and clearing one is explicit ("mfaRequired": false, "source": null); description is always present on a role, so null is rejected. roleName is the only required field. POST /roles is unchanged.
  • An external-bucket-only deployment now requires an explicit default asset bucket. app.assetBuckets.externalAssetBuckets entries take a new isDefault field: at most one entry may set it, and exactly one must when app.assetBuckets.createNewBucket is false, or configuration validation fails at cdk synth. The default bucket is where a database created without an explicit bucket stores its assets, and where workflow execution inputs and pipeline outputs are written. A v2.5 config.json with createNewBucket set to false therefore needs one entry marked before it deploys.
  • AWS WAF changes from count-only monitoring to enforcement on a deployment with app.useWaf enabled. v2.5 ran the AWS Common Rule Set in count mode, recording matches without rejecting them; the three rule groups now declared in infra/config/policy/wafPolicyConfig.json are in block mode. A request that previously only incremented a counter is answered 403 by WAF before it reaches the authorizer or any Lambda function, so it produces no VAMS log entry to correlate with the upgrade. Two Common Rule Set rules are already overridden back to count because VAMS traffic trips them (SizeRestrictions_BODY for multi-part upload bodies, SizeRestrictions_QUERYSTRING for the presigned URL the SuperSplat viewer passes in ?load=). Review the WAF blocked-request metrics after upgrading; set "block": false on a group to return it to monitor mode.
  • CLI: bulk transfer commands now exit non-zero when any individual file fails. file upload, assets download, and assets export --download-files previously exited 0 after a partial — or total — transfer failure, printing a warning only a human reads, so a set -e script treated an upload that transferred 900 of 1000 files as complete. They now exit 1 whenever overall_success is false, and sync file push / sync file pull follow the same contract. Any job that branches on the exit code changes behaviour. Programmatic invocation is exempt: the industry commands call these through ctx.invoke() and read overall_success themselves.
  • CLI: profile info and profile delete exit non-zero for a profile that does not exist, and their --json-output shape on that path changed. Both previously exited 0. The response is now {"error": "…", "error_type": "ProfileNotFoundError"}; the success, profile_name, message, and exists keys are gone from the not-found path. The response for a profile that exists is unchanged.
  • CloudWatch log groups and the Isaac Lab training Amazon EFS file system now use the shared VAMS customer-managed AWS KMS key, and the EFS file system is REPLACED on upgrade. Applies only when app.useKmsCmkEncryption.enabled is true. The two resource kinds behave differently and only one loses data: a log group accepts the key in place, while an EFS file system's KmsKeyId is create-only, so CloudFormation replaces it and any cached training data on the old file system is not carried over.
Upgrade Path

Run the v2.5 to v2.6 migration at infra/deploymentDataMigration/v2.5_to_v2.6/upgrade after deploying the v2.6 stack. It runs seven steps by default (--steps all): reindex, assetHistory, workflowExecutions, auxPreviewRelocation, pipelineWorkflowDefinitions, globalListBackfill, and tagsNamespacing. Repopulating vams-assets-v3 and vams-files-v3 from source data is the reindex step alone — the other six reshape execution history, backfill asset history, relocate auxiliary previews, migrate pipeline, workflow, and tag definitions, and stamp the global-list partition attribute, so running only reindex leaves the rest of the upgrade incomplete. pipelineWorkflowDefinitions is the one step that is not safe to repeat. For provisioned deployments, if the OpenSearch 2.7 → 3.5 in-place engine upgrade fails during cdk deploy, deploy first with OpenSearch disabled in config.json to delete the existing domain, then re-enable and redeploy to create a fresh 3.5 domain before running the migration. See the v2.5 to v2.6 update guide for what each step does and the ordered procedure.

Known issues:

  • Two dependency findings remain in the documentation site, both reported against image-size, and neither has a patched version published upstream — every released version of the package is affected, so the findings cannot be resolved by raising the version. The package is a build-time transitive dependency of the Docusaurus MDX loader, which reads image dimensions while the static site is generated, and it is not part of the published site. Both advisories describe a denial of service reached by parsing a malformed JXL, HEIF, or ICNS image, so reaching either one requires committing such a file to the documentation source tree. These will be revisited when a fixed version is published.

2.5.3​

Release date: 2026-08-03

Key fixes:

  • Fixed npm install failing in the web/ directory with an EOVERRIDE error reporting that an override for fast-xml-parser conflicted with the direct dependency. The package was declared both as a direct dependency and as an override, which could prevent dependency resolution from completing when an existing lock file was present. Both declarations were removed, because the web application does not use the package directly and its dependents now supply a compatible version.

Other changes:

  • Updated package dependencies across all npm packages in the repository to resolve reported npm audit findings.
  • Upgraded the rich text editor used by the asset comments feature to address high-severity cross-site scripting and prototype pollution findings.
  • Raised the minimum AWS CDK command line interface version to match the AWS CDK library version, which is required for AWS CloudFormation template synthesis to succeed.
  • Aligned all Docusaurus documentation packages to a single matching version.

Known issues:

  • Pipelines that rely on the Amazon Linux 2 image type for Amazon Elastic Container Service and AWS Batch containers may not function correctly, because Amazon Linux 2 reached end of support on July 31, 2026. A fix is planned for version 2.6.0.
  • Eight npm audit findings remain in the web application (six low severity and two moderate severity) that cannot be resolved without breaking changes. The available fixes for the routing library require React version 18 or later, and the web application currently targets React 17. These are development and build-time dependencies and will be revisited in version 2.6.0.
  • Five npm audit findings remain in the VEERUM viewer installation package. Remediation requires authentication to the private package registry that hosts the viewer, and two findings have no fix available from the upstream maintainers. The VEERUM viewer is disabled by default.

2.5.2​

Release date: 2026-06-19

Key fixes:

  • Fixed a Casbin authorization implementation defect that allowed additional policies to be injected through field values that were evaluated as regular expressions. Impact is low because Casbin policies can only be set by administrators by default. Additional backend tests were added to cover this case.
  • Fixed a createAsset API defect that allowed an optional Amazon S3 bucket key location to be specified without validating that the location belonged to the provided database identifier's default S3 bucket and prefix path, that no asset already existed at that S3 key path, and that the supplied path met validation requirements.
  • Fixed a latent defect in which the backend test framework had not been updated for changes introduced in version 2.5, which caused test failures.

Other changes:

  • Added default GitHub issue and pull request templates.
  • Updated the authorization documentation to reflect the preceding fixes and to clarify existing behavior.
  • Updated several package dependency versions to address npm audit findings.

2.5.1​

Release date: 2026-04-23

Key fixes:

  • Fixed file upload path construction when uploading to a subfolder — files now correctly include the full folder path (e.g., /textures/USD/texture.png instead of /texture.png).
  • Fixed permanent file deletion not cleaning up Amazon DynamoDB version snapshot records — re-uploading a file at the same path no longer shows stale version history from previously deleted files.
  • Fixed Amazon S3 version deletion not paginating — permanent delete now removes all S3 object versions even when a file has more than 1000 versions.
  • Fixed permanent asset deletion not paginating Amazon DynamoDB queries for version files and metadata version cleanup — assets with large numbers of versions or files now fully delete all related records, using batch writes for efficiency.
  • Fixed authorization_error() being raised as an exception instead of returned as a response across multiple backend handlers (assetService, metadataSchemaService, userRolesService, createRole, tagService, createTag), which caused "exceptions must derive from BaseException" errors.
  • Fixed version switching across many viewer plugins — when switching to a different file version — the viewer now correctly fetches and displays the selected version instead of showing the latest only
  • Fixed CLI asset download command capping at approximately 100 files — now paginates through all API results when downloading whole assets or folders.
    • Improved CLI asset download performance — presigned URL generation and file downloads now run concurrently via a streaming pipeline instead of sequentially.
    • The --recursive flag on assets download now defaults --file-key to / when not specified, enabling whole-asset recursive downloads without explicitly providing --file-key /.
  • Fixed CLI file upload progress display erasing terminal scrollback history — progress now tracks and clears only the lines it actually printed.
  • Fixed NVIDIA pipeline CodeBuild Amazon ECR repositories failing to delete when disabling pipelines — added emptyOnDelete to Cosmos and Gr00t CodeBuild ECR repositories so container images are automatically cleared before AWS CloudFormation deletion.

2.5.0​

Release date: 2026-04-21

Major changes:

  • Migrated the web application to Vite build framework with AWS Amplify V6 Gen2 SDK and dark/light theme support (dark default).
  • Added Needle USD 3D WASM viewer for .usd, .usda, .usdc, .usdz files.
  • Added Three.js 3D and CAD viewer for .gltf, .glb, .obj, .fbx, .stl, .ply, .dae, .3ds, .3mf, .stp, .step, .iges, .brep files with optional LGPL-licensed CAD support.
  • Added Amazon SQS and Amazon EventBridge pipeline execution types alongside AWS Lambda.
  • Added 3D Preview Thumbnail pipeline for CPU-based headless rendering of animated GIF or static image previews.
  • Added database metadata management with Amazon Location Service mini-map display.
  • Enhanced asset versioning with aliasing, archive/unarchive, version editing, and metadata versioning.
  • Added Amazon Cognito user management through web UI, API, and CLI.
  • Added API Key management system with user ID impersonation.
  • Added permission constraint template bulk import system with pre-built templates.

Breaking changes:

  • Asset version DynamoDB table changes require migration scripts.
  • Web overhaul causes significant merge conflicts for forked repositories.
Upgrade Path

Run the upgrade script at infra/deploymentDataMigration/v2.4_to_v2.5/upgrade to migrate permission constraints and asset version data.


2.4.1​

Release date: 2026-01-30

Key fixes:

  • Fixed CDK deployment errors for GovCloud environments (storage queue names, CloudFront KMS principals, metadata schema KMS permissions, Isaac Lab pipeline IAM).
  • Fixed metadata schema page blank state when re-navigating.
  • Improved Asset FileManager to remember expanded folders during lazy loading.
  • Added service worker for local WASM debugging.

2.4.0​

Release date: 2026-01-16

Major changes:

  • Added Veerum 3D Viewer (licensed) for point clouds and 3D tilesets.
  • Added NVIDIA Isaac Lab reinforcement learning training pipeline with GPU acceleration.
  • Added Garnet Framework addon for knowledge graph data synchronization.
  • Overhauled metadata schema system: database-specific and global schemas, multi-schema overlay, new field types, CDK-deployable defaults.
  • Overhauled metadata system: multi-entity support (databases, assets, files, asset links), bulk editing with CSV, file attributes, metadata versioning.
  • Added Amazon EKS deployment option for RapidPipeline.
  • Added asset unarchiving, file renaming, CloudFront custom domain support.
  • Added Amazon CloudWatch audit logging for authorization, actions, and errors.
  • Refactored data indexing flow for Amazon OpenSearch and partner integrations.

Breaking changes:

  • Permission constraints migrated to a dedicated DynamoDB table.
  • Metadata and schema DynamoDB tables replaced with new tables.
  • Amazon OpenSearch indexes changed schema for metadata fields.
Upgrade Path

Run the upgrade script at infra/deploymentDataMigration/v2.3_to_v2.4/upgrade to migrate constraints, metadata, and re-index Amazon OpenSearch.


2.3.2​

Release date: 2026-01-12

Key fixes:

  • CLI documentation corrections.
  • NPM dependency security updates (npm audit fix).

2.3.1​

Release date: 2025-11-21

Key fixes:

  • CLI sentinel object check, file upload exception handling, and pattern updates.
  • Optimized web viewer custom installers to skip disabled viewers.
  • Licensed viewers disabled by default in configuration.

2.3.0​

Release date: 2025-11-13

Major changes:

  • Introduced VamsCLI command-line tool for automation, bulk operations, and CI/CD integration.
  • Overhauled asset and file search with new Amazon OpenSearch dual-index architecture.
  • Rewrote the viewer system as a plugin-based, dynamically-loaded architecture with 17 viewer plugins.
  • Added CesiumJS 3D tileset viewer, BabylonJS and PlayCanvas Gaussian Splat viewers, VNTANA licensed viewer, PDF viewer, and Text viewer.
  • Added CAD/Mesh Metadata Extraction pipeline using Trimesh and CadQuery.
  • Added Gaussian Splat Toolbox pipeline.
  • Replaced built-in API Gateway authorizers with custom Lambda authorizers supporting IP range restrictions.
  • Added support for additional asset link metadata types (WXYZ, Boolean, Date, Matrix4x4, GeoJSON, GeoPoint, LLA, JSON).
  • Refactored workflow creation to remove heavyweight step functions library dependency.

Breaking changes:

  • Custom Lambda authorizers replace built-in authorizers (may require cache reset).
  • AWS Batch/Fargate CDK construct naming changes require two-phase deployment for existing pipelines.
  • Amazon OpenSearch re-indexing required for new dual-index schema.
Upgrade Path

Run the upgrade script at infra/deploymentDataMigration/v2.2_to_v2.3/upgrade to re-index Amazon OpenSearch.


2.2.0​

Release date: 2025-09-31

Major changes:

  • Complete overhaul of asset management APIs separating assets from files.
  • Added multi-file asset support with folder structures.
  • Implemented Amazon S3 presigned URL uploads replacing scoped S3 access.
  • Added external OAuth 2.0 identity provider support as alternative to Amazon Cognito.
  • Added asset versioning with Amazon S3 version tracking.
  • Added global pipelines and workflows across databases.
  • Introduced new pipelines: GenAI Metadata 3D Labeling, Potree point cloud viewer, 3D basic conversion.
  • Relaxed naming conventions for databases, pipelines, workflows, and asset IDs.
  • Enhanced VPC support with additional endpoints.
  • Added multiple Amazon S3 bucket support with external bucket import.

Breaking changes:

  • CDK configuration file format changes required.
  • Asset and database DynamoDB table schema changes require migration scripts.
  • VPC subnet changes may break existing deployments (A/B deployment recommended).
  • New Amazon Cognito user pool may be generated (user migration may be needed).
Upgrade Path

Use A/B stack deployment with data migration scripts at infra/deploymentDataMigration/v2.1_to_v2.2/upgrade.