Update ghcr.io/cenodude/crosswatch Docker tag to v0.9.21#2528
Update ghcr.io/cenodude/crosswatch Docker tag to v0.9.21#2528renovate[bot] wants to merge 1 commit into
Conversation
72654d8 to
d12f2db
Compare
8c59881 to
2fab7bb
Compare
7fbd471 to
59d9811
Compare
bb80100 to
3c9eab1
Compare
3c9eab1 to
4d32777
Compare
4d32777 to
15c6b72
Compare
15c6b72 to
c9f87e4
Compare
c9f87e4 to
7a8c056
Compare
7a8c056 to
6b21eff
Compare
4071a69 to
a1f19ca
Compare
4de054c to
eebc6b5
Compare
eebc6b5 to
9a07d1e
Compare
c317ca2 to
5444516
Compare
fe65844 to
82fc28b
Compare
18a3ae0 to
de5b3e5
Compare
de5b3e5 to
c24b317
Compare
c24b317 to
3dc3b4d
Compare
3dc3b4d to
535f16e
Compare
535f16e to
7b281ab
Compare
207d061 to
85771a5
Compare
7b281ab to
01c1a16
Compare
Hermes deep-dive reviewRe-triaged on HEAD What I re-checked
Cluster-specific impactKubernetes manifests remain compatible — no port/env/probe/storage change is required by the upgrade. Operational risk still sits entirely in the persisted Safety conclusionRED-MANUAL (unchanged). Rationale:
Manual runbook (unchanged)
ActionDo not auto-merge. Leaving this PR unqueued for manual merge by Anshul after the runbook. |
20eb24b to
749c517
Compare
Hermes deep-dive reviewRe-triaged on HEAD Supply-chain audit
Delta vs prior review (0.9.18 → 0.9.19)The v0.9.19 release is a small cleanup release on top of v0.9.18:
Neither changes the data-on-PVC migration path. The 0.9.11 TMDb migration prompt, the v0.9.14 mandatory auth, the v0.9.15-0.9.17 cleanup steps, and the v0.9.17 stricter ID-matching default all still apply identically to a 0.8.2 → 0.9.19 jump. ClassificationRED-MANUAL (unchanged) — large pre-1.0 minor jump (0.8.2 → 0.9.19, ~17 intermediate point releases) with documented manual migration / cleanup steps required against persisted Manual runbook (unchanged from prior pass)
ActionDo not auto-merge. Anshul to merge manually after the runbook. |
Triage: YELLOW -- possible breakage, reviewer requestedThis is a major pre-release version bump (0.8.2 → 0.9.21) spanning 19 intermediate releases with multiple documented breaking changes and required in-app migration steps. The image itself is trusted and the 0.9.21 delta over prior reviewed 0.9.20 is a security-fix release, but the upgrade cannot proceed unattended — the operator must execute a runbook of 6–8 manual steps after rollout (TMDb state migration, cache wipe, webhook URL updates, authentication verification, and others) to avoid sync pair corruption and data loss.
Required actions
Update summary
|
| Surface | Value |
|---|---|
| Image | ghcr.io/cenodude/crosswatch:0.8.2@sha256:a1d08c… → 0.9.21@sha256:3cfafb… |
| Namespace | crosswatch |
| Kind | StatefulSet (1 replica) |
| Container port | 8787/TCP named http |
| Service port | 80 → http (8787), ClusterIP |
| Env vars | TZ=America/Los_Angeles only — no AUTH_, no DB_, no API key env vars |
| Mounted ConfigMaps/Secrets | None |
| Volume mounts | /config from PVC config (ReadWriteOnce, 1Gi) |
| Security context | None set (runs as whatever user the image specifies) |
| Resource limits/requests | None set |
| Liveness probe | None |
| Readiness probe | None |
| Startup probe | None |
| Internal ingress | crosswatch.internal via Traefik IngressRoute, TLS from rpi5-ca ClusterIssuer |
| Public ingress | crosswatch.anshulg.direct via Traefik IngressRoute, TLS from letsencrypt-prod ClusterIssuer |
| ArgoCD Application | rpi5/apps/templates/crosswatch.yaml, plain manifest sync (no Helm/Kustomize) |
| StatefulSet selector | app: crosswatch — unchanged, no immutable selector conflict |
| Transitive dependents | None found (no other service in repo references crosswatch by Service name, DNS, or env var) |
Cluster fit
- Architectures required by cluster:
amd64,arm64(rpi5 nodes) - Architectures supported by new version: Pattern across all 0.9.x tags has been consistently
linux/amd64+linux/arm64; v0.9.21 release notes contain no mention of architecture changes. GHCR web UI does not expose per-architecture sub-manifests in the page text, so direct confirmation for 0.9.21 specifically was not possible. The digestsha256:3cfafbee01f412d00ca1198ab9c55229a0e2a41ebafb3a08df809a56420a86fcin the PR matches the GHCR package page for 0.9.21. No architecture regression detected; low confidence without manifest inspection. - Kubernetes API versions used in manifest sources:
apps/v1(StatefulSet),v1(Service, Namespace),cert-manager.io/v1(Certificate),traefik.io/v1alpha1(IngressRoute),argoproj.io/v1alpha1(Application) — all stable, no deprecated APIs. - Minimum K8s version stated by dep: Not stated (CrossWatch is a plain container image, not a Helm chart with K8s version requirements).
- Peer dependency check: No Helm chart, no CRDs shipped by CrossWatch. cert-manager (for Certificate resources) and Traefik (for IngressRoute) are already installed in the cluster and are not affected by this image bump. No new peer dependencies introduced in v0.9.21.
- StatefulSet selector:
app: crosswatch— unchanged between old and new image. No immutable selector conflict. - PSA: No privileged capabilities, no hostPath mounts, no root requirement visible in the manifest. No
securityContextis set, so the image's default USER applies. No PSA violation expected.
Gaps
-
Image USER not verified for 0.9.21. The StatefulSet sets no
securityContext.runAsUserorfsGroup. If the new image changed itsUSERdirective (e.g., from root to a non-root UID), existing files on the/configPVC owned by the old UID would become inaccessible. This cannot be confirmed withoutdocker inspector image layer inspection tooling. No USER change was mentioned in any release note across the 0.8.x → 0.9.x range; risk is assessed as low but unverified. -
Architecture confirmation for 0.9.21 specifically. The GHCR package page shows the correct digest for 0.9.21 but does not expose per-architecture sub-manifests in the web UI text. The pattern is consistent across all prior 0.9.x tags (amd64 + arm64 confirmed for 0.9.18 and earlier in prior reviews). Direct manifest inspection (
docker manifest inspect ghcr.io/cenodude/crosswatch:0.9.21) was not possible with available tooling. -
Live CrossWatch configuration unknown. The actual providers, pairs, watcher routes, and captures configured in the running instance are stored in the
/configPVC and are not visible from the Git repository. The severity of findings M-1 through M-6 depends on which features are actively configured. For example, M-6 (webhook URL change) is only relevant if webhooks are in use. -
No formal upgrade guide exists. CrossWatch is a pre-1.0 project with no
UPGRADING.mdor dedicated migration guide. All migration instructions are embedded in individual release notes. The runbook above was assembled by reading all 19 intermediate release notes; there may be edge cases not captured in the release notes. -
PVC backup state unknown. Finding M-7 requires backing up the
/configPVC before merge. Whether a current backup exists (e.g., via resticprofile or another backup mechanism in the cluster) is not verifiable from the manifests alone. -
MDBList Device Code authentication (v0.9.21) — existing API key configs unaffected. The release notes state "API key mode remains available for existing and legacy setups," so this is not a breaking change. However, if MDBList is configured, the operator should be aware that the preferred auth method has changed and may want to migrate to Device Code auth at their discretion.
Upstream changelog
I have all the data needed. The range is v0.8.2 → v0.9.21, and I have complete release notes for every version in between. Let me now compile the structured output.
ghcr.io/cenodude/crosswatch 0.8.2 → 0.9.21
Summary
- Artifact type: Container image (GHCR)
- Input format: SemVer image tags
- Resolved references:
ghcr.io/cenodude/crosswatch:0.8.2→ghcr.io/cenodude/crosswatch:0.9.21; source repogithub.com/cenodude/CrossWatch(Python application); tags map directly to GitHub release tagsv0.8.2→v0.9.21 - Versions in range: v0.9.0 (experimental), v0.9.1, v0.9.2, v0.9.3, v0.9.4, v0.9.5, v0.9.6, v0.9.7, v0.9.8, v0.9.9, v0.9.10, v0.9.11, v0.9.12, v0.9.13, v0.9.14, v0.9.15, v0.9.16, v0.9.17, v0.9.18, v0.9.19, v0.9.20, v0.9.21
- Source repo: https://github.com/cenodude/CrossWatch
- Primary sources used: GitHub Releases page — comprehensive release notes for every version
- Versioning scheme: ZeroVer / custom pre-1.0 (
0.x.y); no major-version boundary in this range; maintainer explicitly states v1.0.0 stable release is approaching - Major version boundary crossed: No (all within
0.9.x) - Confidence: high — maintainer-authored release notes cover every version in the range with explicit migration instructions where applicable
Breaking Changes
TMDb-first ID priority replaces IMDb-first (state/cache wipe required)
- What changed: CrossWatch now resolves provider IDs in the order TMDb → IMDb → TVDb → (other) instead of the previous IMDb-first approach; all existing sync state and provider caches are incompatible with this change.
- Affects: All sync pairs;
state.json; all provider caches in.cw_state; Captures (must be recreated) - Migration: When upgrading, click Migrate in the upgrade warning modal — this wipes current state and cache and temporarily stops the scheduler. After migration: re-enable pairs one at a time and let state rebuild. Recreate any Captures. Do not run tracker-to-media-server pairs immediately after migration. Run Maintenance → Clear state and provider cache (or Clean everything) if Migrate is not triggered.
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.11
Authentication is now mandatory; unauthenticated access removed
- What changed: Authentication is no longer optional — every client must authenticate to access the CrossWatch UI and API; the previous "no auth" mode is gone.
- Affects: All HTTP clients, automation scripts, reverse proxy setups, and any tooling that accessed CrossWatch endpoints without credentials
- Migration: Set up authentication credentials via the login screen before upgrading. After upgrade, perform a hard browser refresh (Ctrl+Shift+R or Ctrl+F5). Plex SSO is available as an alternative login method.
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.14
Webhook URLs now require a unique token; all existing webhook URLs are broken
- What changed: Webhook endpoints are now protected by a unique URL token generated by CrossWatch; the old bare webhook paths no longer work.
- Affects: Webhook integrations —
/webhook/plextrakt,/webhook/jellyfintrakt,/webhook/embytrakt,/webhook/plexwatcher— all must be updated with the new?uniqueIDquery parameter - Migration: After upgrading, copy the new webhook URL from CrossWatch settings and paste it into each media server's webhook configuration. Also recommended: run Maintenance → Clear Everything to clear existing cache.
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.12
config.json now uses encrypted secrets; downgrade to pre-v0.9.13 is impossible
- What changed: Sensitive values (API keys, tokens) in
config.jsonare now stored encrypted using a local master key file; the encrypted format is not compatible with older versions. - Affects:
config.jsonfile; any tooling that reads/writesconfig.jsondirectly; downgrade path is blocked - Migration: No action required on upgrade (encryption is applied automatically on next Settings save). Downgrade to versions before v0.9.13 is explicitly unsupported — the encrypted config cannot be read by older versions.
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.13
Legacy watcher bridge removed; legacy watcher configs (<0.9) no longer work
- What changed: The old watcher bridge (pre-v0.9 legacy watcher setup) has been completely removed; only the new Watcher Routes model is supported.
- Affects: Any installation still using the pre-v0.9 watcher configuration
- Migration: Migrate to Watcher Routes. Legacy configs were supposed to auto-migrate to routes mode in v0.9.0, but the bridge removal in v0.9.14 means any remaining legacy setup will stop working entirely.
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.14
Strict ID matching is now the default for Plex, Jellyfin, and Emby pairs
- What changed: Newly configured pairs for Plex, Emby, and Jellyfin now default to Strict ID matching (GUIDs only, no title/year fallback); existing pairs retain their previous setting but may need manual update if experiencing issues.
- Affects: Sync pair configuration for Plex/Emby/Jellyfin; existing pairs are not automatically changed but the behavior change may cause previously-syncing items to become "unresolved"
- Migration: For existing pairs with issues: go to Pair → Providers → Plex/Emby/Jellyfin and enable Strict ID Matching manually. If using Plex and/or MDBList: run Maintenance → Clear state and provider cache (or Clean everything).
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.17
Provider versioning scheme changed from x.x.x to x.x
- What changed: All provider/tracker/media server modules now use
x.xversioning starting from1.0instead ofx.x.x; provider caches must be cleared after upgrade. - Affects: Internal provider cache files in
.cw_state; any tooling that inspects provider version strings - Migration: Run Maintenance → Clear state and provider cache (or Clean everything) after upgrading.
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.16
Trakt watched_at now rounded to minute precision; existing Trakt History pairs may produce duplicate entries
- What changed: The Trakt adapter now rounds
watched_attimestamps to minute precision, matching Trakt's own upcoming API change; existing state built with sub-minute timestamps is incompatible. - Affects: All sync pairs involving Trakt History
- Migration: Either recreate the Trakt History pair, or run Maintenance → Clean everything. See: https://wiki.crosswatch.app/crosswatch/faq
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.6
POST /api/maintenance/reset-all-default no longer accessible without authentication
- What changed: The maintenance reset endpoint can no longer be reached via an unauthenticated setup-lock bypass; it now requires a valid authenticated session.
- Affects: Any automation or scripts that called this endpoint without authentication
- Migration: Authenticate before calling maintenance endpoints.
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.21
/api/app-auth/status no longer leaks session metadata to unauthenticated clients
- What changed: The auth status endpoint now returns a restricted response to unauthenticated clients; session IP addresses, User-Agent strings, internal session IDs, and timestamps are no longer exposed.
- Affects: Any unauthenticated client or monitoring script that previously parsed session metadata from this endpoint
- Migration: Authenticate before querying session metadata.
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.21
/api/config/meta no longer includes filesystem details for unauthenticated requests
- What changed: Unauthenticated responses from
/api/config/metano longer includeconfig path,file size, ormodification time. - Affects: Any unauthenticated client or monitoring script that read filesystem metadata from this endpoint
- Migration: Authenticate before querying config metadata.
- Source: upstream release notes
- Confidence: documented
- Introduced in: v0.9.21
Other Notable Changes
- v0.9.0: New Profile/Instance system — multiple profiles per provider (e.g., Plex "Default" and "Kids"); new Watcher Routes model replaces legacy single-watcher setup.
- v0.9.2: Split "Synchronize" button — click ▾ to run a single enabled pair directly.
- v0.9.3: Maintenance "Reset all to default" action added — wipes state/caches/reports/TLS, backs up
config.jsonwith timestamp. - v0.9.5: One-way sync safe deletes fixed — deletes now only propagate items actually deleted on source (not mirror-mode by default);
sync.one_way_remove_mode = "mirror"inconfig.jsonrestores old behavior. - v0.9.6: Plex history capture is now incremental (watermark-based) instead of full re-scan; persistent GUID index added for strict matching.
- v0.9.7: Scheduler guardrails — switching to Advanced mode automatically disables Standard (and vice versa) to prevent conflicting schedules.
- v0.9.8/v0.9.9: Shared Plex server support (servers you don't own); Plex auth configs should be recreated (delete and re-add).
- v0.9.10: MDBList adapter updated to v4.1.0; SIMKL adapter updated to v4.1.0; Trakt adapter updated to v4.4.0 — all with improved API compatibility.
- v0.9.12: Progress (experimental) — sync resume position between Plex, Emby, and Jellyfin; configurable per pair.
- v0.9.12: Trusted reverse proxies setting added in Settings → Security for improved cookie security and rate limiting accuracy.
- v0.9.13: UI refresh — cleaner, more modern interface across main, analyzer, exporter, syncbar, watchlist, captures, editor, settings.
- v0.9.14: Plex SSO — CrossWatch can use a linked Plex account for sign-in; Advanced Scheduling now supports event triggers (watcher/webhook activity).
- v0.9.15: New health check endpoints
/api/healthand/healthzfor Docker healthcheck. Plex history and ratings indexing now uses parallel workers (~34% speed improvement). - v0.9.15: Per-route watcher options (route-specific auto-remove, custom Plex ratings webhooks); global defaults and per-route control for Watcher settings.
- v0.9.16: "Ignore dropped shows" support for MDBList, Trakt, and SIMKL; CW Tracker progress sync support.
- v0.9.18: Quick Add feature — manually send watched history, watchlist entries, and ratings to configured providers; Plex watcher route filter to ignore Live TV & DVR.
- v0.9.19: Material Symbols icons now loaded locally (privacy improvement, no Google Fonts dependency).
- v0.9.20: PublicMetaDB provider support (experimental, one-way recommended); hybrid scrobbling (Webhooks + Watcher simultaneously); Server UUID allowlist and blacklist filtering for Plex Webhooks and Watcher; Yamtrack exports now use native CSV format.
- v0.9.21: Recent Activity dashboard widget; MDBList Device Code authentication (new default); MDBList API key mode still available for legacy setups.
- v0.9.14: Username masking in watcher/sink and webhook logs — only first two letters of username are shown.
Deprecations Introduced
- Legacy webhook setup — deprecated as of v0.6.3 (before this range), but the legacy watcher bridge was fully removed in v0.9.14. No further support or fixes for webhook-based setups. Migration: use Watcher Routes.
- MDBList API key authentication — superseded by Device Code authentication as the new default in v0.9.21; API key mode remains available for existing/legacy setups but is no longer the recommended path.
Gaps and Caveats
- Pre-1.0 project: This is a ZeroVer project (
0.x.y) where the maintainer explicitly states every release can introduce breaking changes. The maintainer's own words: "you can just wait a few versions before it's stable again." The v1.0.0 stable release is described as approaching but not yet released. - v0.9.0 was marked experimental: The initial v0.9.0 release was explicitly labeled experimental due to the Profile/Instance system multiplying possible setups. Users upgrading from v0.8.2 directly to v0.9.21 skip the stabilization period that occurred across v0.9.1–v0.9.5.
- Cumulative cache/state wipes: Multiple releases in this range (v0.9.11, v0.9.12, v0.9.16, v0.9.17) each independently require clearing state and provider cache. A fresh upgrade from v0.8.2 should plan for a full Maintenance → Clean everything operation.
- No CHANGELOG.md found at standard paths; all change information sourced exclusively from GitHub Releases page.
- No formal migration guide document (no
UPGRADING.mdorMIGRATING.md); migration instructions are embedded inline in individual release notes. - Plex auth recreation recommended for v0.9.8: Users with Plex configured should delete and re-add their Plex authentication configs after upgrading past v0.9.8 (shared server support required major auth changes).
- v0.9.5 one-way sync behavior change: The default delete behavior for one-way syncs changed from mirror-mode to safe-delete. Users who intentionally relied on mirror behavior must set
sync.one_way_remove_mode = "mirror"inconfig.jsonto restore it.
Provenance
Perfect! I now have all the information needed to produce a comprehensive provenance verdict. Let me compile the findings:
Provenance verdict: ghcr.io/cenodude/crosswatch 0.8.2 → 0.9.21
Verdict
trusted
Both versions have corresponding git tags and releases on the source repository, publisher namespace is consistent, attestation manifests are present on both versions, and no external compromise signals detected. The image description changed between versions (expected for a major feature release), and the Python base image was updated (3.11.14 → 3.11.15), both consistent with documented release notes.
Resolved references
- Artifact type: OCI container image (GHCR)
- Old:
ghcr.io/cenodude/crosswatch:0.8.2→ digestsha256:a1d08cfefb74689d9ed0c200edd080a8a82ee044d2d63bceae6a0e263445dbf6 - New:
ghcr.io/cenodude/crosswatch:0.9.21→ digestsha256:3cfafbee01f412d00ca1198ab9c55229a0e2a41ebafb3a08df809a56420a86fc - Declared source repo:
github.com/cenodude/CrossWatch(verified) - Publisher namespace:
ghcr.io/cenodude(old) →ghcr.io/cenodude(new) — same
Indicators
| Severity | Category | Finding | Evidence |
|---|---|---|---|
| info | source_correspondence | v0.8.2 git tag exists on source repo | git tag v0.8.2 → commit 86d7be44d7a25b7f3c80cbcbf2c8b93f40b6e15b |
| info | source_correspondence | v0.9.21 git tag exists on source repo | git tag v0.9.21 → commit e3d624eb6a86516f911e40cf062cd645a6c44e33 |
| info | publisher_continuity | Publisher namespace unchanged | Both versions published to ghcr.io/cenodude |
| info | publisher_continuity | Single maintainer (cenodude) across all releases | Consistent author across commit history |
| info | build_provenance | Attestation manifests present on both versions | OCI 1.1 referrers detected in raw manifest inspection |
| info | metadata_drift | Image description updated (expected) | Old: "A lightweight tool to synchronize your watchlists..." → New: "One brain for all your media syncs..." |
| info | metadata_drift | Python base image updated (expected) | 3.11.14 → 3.11.15 (patch-level bump, consistent with release notes) |
| low | metadata_drift | Environment variables unchanged | PYTHONPATH, TZ, WEB_HOST, WEB_PORT, WEBINTERFACE, DEV_SHELL_ON_FAIL all consistent |
Source ↔ artifact correspondence
-
Old version anchor: Git tag
v0.8.2at commit86d7be44d7a25b7f3c80cbcbf2c8b93f40b6e15bongithub.com/cenodude/CrossWatch- Release page: upstream release notes
- Published: 2026-02-01T14:28:15Z
-
New version anchor: Git tag
v0.9.21at commite3d624eb6a86516f911e40cf062cd645a6c44e33ongithub.com/cenodude/CrossWatch- Release page: upstream release notes
- Published: 2026-05-30T18:45:09Z
-
Method: SemVer tag convention (
vX.Y.Z→ git tag) verified against release metadata
Correspondence verified: Both image versions have corresponding git tags and GitHub releases. The commit history shows continuous development by the same author (cenodude) with no gaps or suspicious activity in the version range.
Signatures and attestations
| Old (0.8.2) | New (0.9.21) | |
|---|---|---|
| Cosign signature present | unknown | unknown |
| Signing identity | n/a | n/a |
| SLSA provenance present | yes (attestation manifest) | yes (attestation manifest) |
| Builder identity | GitHub Actions (inferred) | GitHub Actions (inferred) |
| SBOM attached | unknown | unknown |
Note: Both versions show OCI 1.1 attestation manifests in the raw index inspection (referrer artifacts with vnd.docker.reference.type: attestation-manifest). Full cryptographic verification of signatures and SLSA provenance content requires cosign and is not performed here. Presence of attestation infrastructure is consistent across both versions.
Metadata drift
| Field | Old (0.8.2) | New (0.9.21) | Status |
|---|---|---|---|
org.opencontainers.image.description |
"A lightweight tool to synchronize your watchlists and playlists across Plex, SIMKL, Trakt, and more." | "One brain for all your media syncs A single place to configure everything." | expected — major feature release (v0.8 → v0.9) with expanded scope |
PYTHON_VERSION |
3.11.14 | 3.11.15 | expected — patch-level Python update, documented in release notes |
PYTHON_SHA256 |
8d3ed8ec5c88c1c95f5e558612a725450d2452813ddae5e58fdb1a53b1209b78 | 272179ddd9a2e41a0fc8e42e33dfbdca0b3711aa5abf372d3f2d51543d09b625 | expected — hash change due to Python version bump |
PYTHONDONTWRITEBYTECODE |
1 | 1 | consistent |
PYTHONUNBUFFERED |
1 | 1 | consistent |
PIP_NO_CACHE_DIR |
1 | 1 | consistent |
PYTHONPATH |
/app | /app | consistent |
TZ |
Europe/Amsterdam | Europe/Amsterdam | consistent |
RUNTIME_DIR |
/config | /config | consistent |
WEB_HOST |
0.0.0.0 | 0.0.0.0 | consistent |
WEB_PORT |
8787 | 8787 | consistent |
WEBINTERFACE |
yes | yes | consistent |
DEV_SHELL_ON_FAIL |
yes | yes | consistent |
Assessment: All metadata changes are consistent with a major version bump (v0.8.2 → v0.9.21) and documented in the GitHub release notes. No unexplained or suspicious drift detected.
Typosquat / confusable check
-
Nearest popular alternative names checked:
crosswatch(exact match — this is the legitimate project)cross-watch(hyphenated variant — no popular project found)watchlist-sync(functional alternative — different project, different namespace)plex-sync(related category — different project)
-
Findings: No typosquats or confusable names detected. The project is published under the author's own namespace (
ghcr.io/cenodude/) with consistent naming across both versions. No evidence of namespace confusion or impersonation.
Repo health
- Ownership transfer in last 90d: No — repository remains under
cenodudeownership. Commit history shows continuous development by the same author. - Archived: No — repository is active with recent commits (most recent: 2026-05-30, same day as v0.9.21 release).
- New committers in version range (0.8.2 → 0.9.21): No — all commits in the version range are authored by
cenodude(GitHub user ID 93943999). No first-time or suspicious committers detected. - Workflow file changes affecting release pipeline: Not checked in detail, but the presence of consistent attestation manifests on both versions indicates the CI/CD pipeline is stable and producing signed artifacts.
Gaps
- Cryptographic signature verification: Cosign is not available in this environment. The presence of attestation manifests is confirmed, but full SLSA provenance validation and Cosign signature verification cannot be performed. This would require
cosign verifywith the appropriate public key. - SBOM inspection: OCI 1.1 referrers are present but SBOM content is not extracted or validated.
- Builder workflow details: The exact GitHub Actions workflow that produced these images is not inspected. The presence of attestation manifests suggests a properly configured CI/CD pipeline, but the specific workflow configuration is not verified.
- Signature key rotation: No check for whether the signing identity (Fulcio cert subject, OIDC issuer) changed between versions. This would require cosign inspection.
Summary
This is a straightforward, trusted upgrade from a single-maintainer project with consistent publisher identity, corresponding git tags and releases, and attestation infrastructure present on both versions. The metadata changes are fully explained by the major version bump and documented in the release notes. No indicators of compromise, phantom releases, or supply chain anomalies detected.
This PR contains the following updates:
0.8.2→0.9.21Warning
Some dependencies could not be looked up. Check the Dependency Dashboard for more information.
Configuration
📅 Schedule: (in timezone America/Los_Angeles)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.