Surfaces the Artifact Keeper 1.7.0 backend capabilities in the web UI, on @artifact-keeper/sdk 1.7.0. Highlights: reversible age-gate review decisions and per-repo age-gate settings, quarantine release/reject from the artifact browser, a curation Rules editor for publisher-trust and popularity gates, per-repo scanning & enforcement settings, SIEM-ready NDJSON audit export, and WASM plugin layout selection — plus a security-hardening round (nonce-based CSP, runtime HTTPS enforcement, CSRF defense-in-depth) and an accessibility round (page titles, skip navigation, axe scanning in CI).
Sponsors
Thank you to our sponsors for supporting ongoing development of Artifact Keeper.
Backers
- Ash A. (@dragonpaw)
- Gabriel Rodriguez (@injectedfusion)
Become a sponsor to support the project and get your name listed here.
Thank You
- @dvodop — package age policy state persists across navigation (#657) and a scrollable create-repository dialog (#652)
- @ivolnistov — repository scope selector for lifecycle policies (#660) and service-account principals in the permissions UI (#710)
- @nicola-preda — repository picker in the security policy form (#662) and connector-type labels on migration test-connection toasts (#625)
Added
- Age-gate review decisions can be changed after the fact — the queue's status is now a dropdown backed by the backend reopen endpoint: reopen-to-pending re-applies the gate and withholds the version again, reopen-then-decide runs as one operator action with an explicit halfway-state error if the second call fails, reopen requires a non-blank reason, and approving confirms against the version being released. The queue also surfaces the decision metadata it was already receiving (recorded reason, deciding admin, decision date) and moves status filtering to multi-status checkboxes. The reopen capability is detected per-session rather than version-checked, so a backend that predates the endpoint degrades to decide-only with an explanation (#651, #698; backend artifact-keeper#2939).
- Per-repo age-gate settings panel and webhook event wiring (#701, #707).
- Quarantine release and reject from the artifact detail dialog — admins can lift or finalize a quarantine hold from the repository artifact browser (reject takes an optional reason; both hidden for non-admins). The artifacts listing now carries the backend's per-row quarantine state (
is_blocked,quarantine_status,quarantine_until,quarantine_reason— absent, not null, where the server did not look), the previously unreachableQuarantineBanneris finally live, and a blocked artifact's download control is disabled and relabelled with the reason instead of clicking through to a 409 (#650, backend artifact-keeper#2940). - Curation Rules editor — author publisher-trust and popularity/typo-squat gates from a Rules tab alongside the existing review queue (#683).
- Scanning & enforcement settings panel — per-repo scan toggles (
scan_enabled,scan_on_upload,scan_on_proxy), inline scan-and-block, severity threshold, and a fail-open vs fail-closed proxy scan action (#681). - SIEM audit-log export — NDJSON export of the admin audit log in the backend's published audit-event v1 schema (one self-contained record per line), alongside the CSV and versioned-JSON formats (#703, #706).
- npm upstream feed configuration UI (#702, #705).
- WASM plugin layouts selectable and displayed in the UI (#591, #592, #709) — full layout display requires backend artifact-keeper#3070 (backend 1.7.0 line).
- Service-account principals in the permissions UI (#710).
- Read-only UI for SSO-synced groups — edit and add-member actions are disabled on externally synced groups (#629, #711).
- Repository scope selector for lifecycle policies (#660).
- Repository detail defaults to the Packages tab for package-oriented formats; RAW/Generic and container/OCI formats keep the Artifacts tab (#633).
- Accessibility: page titles, skip-navigation link, and axe-core scanning in CI, including accessible names for the repository list filter selects (#671, #687).
Changed
- Consume
@artifact-keeper/sdk1.7.0 (#667); SDK client refactor adds anunwraphelper, removes dead API modules, and standardizes named exports (#678, #694).apiFetchnow throws an exportedApiErrorcarrying.statusand the raw.body(additive, backward compatible) (#651). - Docker tag view uses server-side
docker_taggrouping — true multi-arch-aware image sizes, scan rollup status, and server-side pagination, fixing the empty "No image tags found" state on large registries (#561, #714). - Repository-list queries consolidated into shared hooks (#669, #692).
- Combined dependency bump superseding 12 dependabot PRs (#704).
- Storage reclaim estimate — the panel's reclaim dry-run now uses the shipped per-repo
storage-gcendpoint instead of 404ing (#708, #716); the estimate requires backend artifact-keeper#3074 (backend 1.7.0 line).
Fixed
- Staging release target is read back and honored — the Settings picker shows the saved link instead of always "None", and the Promote dialog locks to the linked target with a "Linked release target" badge (#658, #661, #712).
- Users list and group member picker paginated (#564, #715).
- Package age policy state persists across navigation — the form now seeds from the saved server state instead of hardcoded defaults (#656, #657).
- Quarantine listing badges aligned with the shipped backend contract (#697, #700).
- Silent
per_pagetruncation surfaced on admin list pages (#670, #688). - Security Policies form: choose a repository instead of typing its UUID (#489, #662).
- Scrollable create repository dialog (#652).
- Migration test-connection toast labeled by connector type (#625).
- Accessibility: nested interactive elements removed from repository list rows (#672, #689).
Security
- Nonce-based CSP without
script-src unsafe-inline(#674, #693). AK_ENFORCE_HTTPSevaluated at runtime instead of build time (#679, #691).- Custom header on mutations for CSRF defense-in-depth (#673, #690).
- CI dependency gates — dependency review is now blocking and an npm audit gate was added (#675, #686).
Removed
- SMTP save flow — the backend has never exposed an SMTP save endpoint (SMTP is configured exclusively via server environment variables), so the Email tab's always-404ing editable form is replaced with an informational notice pointing at the env vars; Send Test Email remains (#555, #713).
What's Changed
- fix(security): choose a repository in the policy form instead of a raw UUID (#489) by @nicola-preda in #662
- fix(migration): label test-connection toast by connector type by @nicola-preda in #625
- fix(repositories): scrollable create repository dialog by @dvodop in #652
- feat(quarantine): release and reject a held artifact from the web UI by @brandonrc in #654
- feat(repositories): default to Packages tab for package-oriented formats by @brandonrc in #633
- feat(lifecycle): select repository scope in UI by @ivolnistov in #660
- feat(age-gate): let admins change a review decision after the fact by @brandonrc in #655
- chore(deps): bump @artifact-keeper/sdk to ^1.7.0 by @brandonrc in #667
- feat(repositories): Scanning & enforcement config panel (inline scan-and-block) by @brandonrc in #681
- feat(curation): Rules editor for publisher-trust and popularity (typo-squat) gates by @brandonrc in #683
- test(e2e): adopt backend 1.7.0 grouped-metadata format in maven grouped browser spec (#665) by @brandonrc in #696
- chore(ci): make dependency review blocking and add npm audit gate (#675) by @brandonrc in #686
- fix(lists): surface silent per_page truncation on admin list pages (#670) by @brandonrc in #688
- fix(a11y): remove nested interactive elements from repository list rows (#672) by @brandonrc in #689
- feat(security): send custom header on mutations for CSRF defense-in-depth (#673) by @brandonrc in #690
- fix(security): evaluate AK_ENFORCE_HTTPS at runtime instead of build time (#679) by @brandonrc in #691
- refactor(query): consolidate repository-list queries into shared hooks (#669) by @brandonrc in #692
- feat(security): nonce-based CSP without script-src unsafe-inline (#674) by @brandonrc in #693
- feat(a11y): page titles, skip-navigation link, and axe scanning (#671) by @brandonrc in #687
- refactor(sdk): add unwrap helper, remove dead API modules, standardize exports (#678) by @brandonrc in #694
- fix(age-gate): direct re-decide for decided reviews, fix reopened-row display (#698) by @brandonrc in #699
- fix(quarantine): align listing badges with shipped backend contract (#697) by @brandonrc in #700
- chore(deps): combined dependency bump (supersedes dependabot PRs #636-#649) by @brandonrc in #704
- feat(settings): npm upstream feed configuration UI (#702) by @brandonrc in #705
- feat(audit): SIEM audit-log export UI (#703) by @brandonrc in #706
- Fix package age policy state not persisting across navigation (#665) by @dvodop in #657
- fix(repositories): select and display WASM plugin layouts in the UI (#591, #592) by @brandonrc in #709
- feat(age-gate): per-repo settings panel and webhook event wiring (#701) by @brandonrc in #707
- fix(settings): read back and honor staging release target (adopts #661) by @brandonrc in #712
- feat(groups): read-only UI for SSO-synced groups (adopts #629) by @brandonrc in #711
- fix(permissions): support service account principals by @brandonrc in #710
- fix(settings): remove SMTP save flow that 404s against the backend (#555) by @brandonrc in #713
- fix(admin): paginate users list and group member picker (#564) by @brandonrc in #715
- fix(storage): document per-repo storage-gc endpoint contract (#708) by @brandonrc in #716
- fix(repositories): use server-side docker_tag grouping in the Docker tag view (adopts #561) by @brandonrc in #714
- chore(release): web 1.7.0 prep by @brandonrc in #717
New Contributors
- @dvodop made their first contribution in #652
- @ivolnistov made their first contribution in #660
Full Changelog: v1.6.0...v1.7.0