Files
at-container-registry/docs/APPVIEW-UI-FUTURE.md
T
Evan Jarrett 6758996300 add SBOM package diffing, verify hold-service captain records
- diff view gains a Packages tab with added/removed/changed/unchanged
  package tables and purl-derived type/license/upstream links
- captain records verified against the DID's atcr_hold service before
  caching (processor + batch backfill), preventing forged holds
- fix empty-handle updates clobbering cached handles and colliding on
  the UNIQUE constraint
- move fillPrevCIDs into repo.go; DirectRepoOperator is now canonical,
  repomgr kept as a test oracle
- surface read-only crew status in hold selector
- reconcile docs
2026-06-13 12:49:03 -05:00

18 KiB

ATCR UI - Feature Roadmap

This document tracks the status of ATCR features beyond the V1 MVP. Features are marked with their current status:

  • DONE — Fully implemented and shipping
  • PARTIAL — Some parts implemented
  • BACKEND ONLY — Backend exists, no UI yet
  • NOT STARTED — Future work
  • BLOCKED — Waiting on external dependency

What's Already Built (not in original roadmap)

These features were implemented but weren't in the original future features list:

Feature Location Notes
Billing (Stripe) pkg/billing/ Checkout sessions, customer portal, subscription webhooks, tier upgrades. Build with -tags billing.
Garbage collection pkg/hold/gc/ Mark-and-sweep for orphaned blobs. Preview (dry-run) and execute modes. Triggered from hold admin UI.
libSQL embedded replicas AppView + Hold Sync to Turso, Bunny DB, or self-hosted libsql-server. Configurable sync interval.
Hold successor/migration pkg/hold/ Promote a hold as successor to migrate users to new storage.
Relay management Hold admin Manage firehose relay connections from admin panel.
Data export pkg/appview/handlers/export.go GDPR-compliant export of all user data from AppView + all holds where user is member/captain.
Dark/light mode AppView UI System preference detection, toggle, localStorage persistence.
Credential helper install page /install Install scripts for macOS/Linux/Windows, version API, Homebrew formula (Formula/), self-updating from tangled releases.
Stars AppView UI Star/unstar repos stored as io.atcr.sailor.star ATProto records, counts displayed, starred-repos page at /u/{handle}/starred.
Label service pkg/labeler/, cmd/labeler/ Standalone labeler for takedowns by DID/handle/repo/AT URI with audit trail. Holds listen for takedown labels; GC defers deletion for a grace period in case of reversal.
Helm chart UI AppView UI Chart-aware digest page: Chart.yaml metadata, dependencies, helm install/pull command switcher (handlers/digest_content.go, holdclient/helm_config.go).
AI Image Advisor pkg/appview/handlers/image_advisor.go Claude-powered image analysis (config + SBOM + vulns) for paid users. Gated on billing + ClaudeAPIKey. Suggestions cached in advisor_suggestions table. CLI companion at cmd/image-advisor.
Go vanity import paths pkg/appview/middleware/goimport.go go install atcr.io/... meta tags, browser visits redirect to source repo. Seamark-branded credential helper variant (cmd/credential-helper/seamark) and theme (themes/seamark/).

Advanced Image Management

Multi-Architecture Image Support — DONE (display) / NOT STARTED (creation)

Display image indexes — DONE:

  • Show when a tag points to an image index (multi-arch manifest) — IsMultiArch flag, "Multi-arch" badge
  • Display all architectures/platforms in the index — platform badges (e.g., linux/amd64, linux/arm64)
  • Allow viewing individual manifests within the index
  • Show platform-specific details

Image index creation — NOT STARTED:

  • UI for combining multiple single-arch manifests into an image index
  • Automatic platform detection from manifest metadata
  • Validate that all manifests are for the same image (different platforms)

Layer Inspection & Visualization — PARTIAL

Layer details — DONE:

  • Digest page shows per-layer Dockerfile commands (from OCI config history), sizes, media types, empty-layer toggle (handlers/digest.go, partials/layers-section.html)
  • Layer diff between two tags/digests: shared/rebuilt/added/removed via LCS on layer commands, with size delta summary (handlers/diff.go, /diff/{handle}/{repo}?from=&to=)
  • Multi-arch aware: diff resolves platform children, intersects common platforms

NOT STARTED:

  • Compression ratio display
  • File changes within each layer (added/modified/deleted files)
  • Layer deduplication stats (shared layers across images, storage savings)

Image Operations — PARTIAL (delete only)

Tag/manifest deletion — DONE:

  • Delete tags with DeleteTagHandler (cascade + confirmation modal)
  • Delete manifests with DeleteManifestHandler (handles tagged manifests gracefully)

Tag Management — NOT STARTED:

  • Tag promotion workflow (dev → staging → prod)
  • Tag aliases (multiple tags → same digest)
  • Tag patterns (auto-tag based on git commit, semantic version, date)
  • Tag protection (mark tags as immutable)

Image Copying — NOT STARTED:

  • Copy image from one repository to another
  • Copy image from another user's repository (fork)
  • Bulk copy operations

Image History — NOT STARTED:

  • Timeline view of tag changes
  • Rollback functionality
  • Audit log of image operations

Vulnerability Scanning — DONE (backend + UI)

Backend — DONE:

  • Separate scanner service (scanner/ module) with Syft (SBOM) + Grype (vulnerabilities)
  • WebSocket-based job queue connecting scanner to hold service
  • Priority queue with tier-based scheduling (quartermaster > bosun > deckhand)
  • Scan results stored as ORAS artifacts in S3, referenced in hold PDS
  • Automatic scanning dispatched by hold on manifest push
  • See docs/SBOM_SCANNING.md

AppView UI — DONE:

  • CVE count by severity badge (critical, high, medium, low) — handlers/scan_result.go, partials/vuln-badge.html
  • Detailed CVE view: description, severity, affected packages, fix versions, NVD/GitHub advisory links — handlers/vuln_details.go, partials/vuln-details.html
  • Vulnerability diff across tags/versions: fixed vs new vs unchanged, summarized by severity — handlers/diff.go
  • Scan-completion webhooks (scan:first, scan:all, scan:changed) — see Webhooks section

NOT STARTED:

  • Filter images by vulnerability status (in search/browse)
  • Subscribe to CVE notifications for your images (beyond scan webhooks)

Image Signing & Verification — NOT STARTED (concept + examples only)

Consolidated research/POC doc at docs/research/IMAGE_SIGNING.md plus example verify scripts and trust policy template in examples/verification/ (reference an unbuilt atcr-verify CLI). No cosign/sigstore integration or active signing implementation.

  • Sign images
  • Display signature verification status
  • Display signature metadata
  • Require signatures for protected repositories

SBOM (Software Bill of Materials) — DONE (backend) / PARTIAL (UI)

Backend — DONE:

  • Syft generates SPDX JSON format SBOMs
  • Stored as ORAS artifacts (referenced via artifactType: "application/spdx+json")
  • Blobs in S3, metadata in hold's PDS
  • Accessible via ORAS CLI and hold XRPC endpoints

UI — DONE:

  • Package list with names, versions, licenses, package types — handlers/sbom_details.go, partials/sbom-details.html
  • Export: copy as CSV, download raw SPDX JSON
  • Compare SBOMs across versions: Packages tab on the diff page with changed/added/removed/unchanged sections — computeSbomDiff in handlers/diff.go

NOT STARTED:

  • Link to upstream package sources

Hold Management Dashboard — DONE (on hold admin panel)

Hold management is implemented as a separate admin panel on the hold service itself (pkg/hold/admin/), not in the AppView UI. This makes sense architecturally — hold owners manage their own holds.

Hold Discovery & Registration — PARTIAL

Hold registration — DONE:

  • Automatic registration on hold startup (captain + crew records created in embedded PDS)
  • Auto-detection of region from cloud metadata

NOT STARTED:

  • UI wizard for deploying hold service
  • One-click deployment to cloud platforms
  • Configuration generator
  • Test connectivity UI

Hold Configuration — DONE (admin panel)

Hold settings — DONE (hold admin):

  • Toggle public/private flag
  • Toggle allow-all-crew
  • Toggle Bluesky post announcements
  • Set successor hold DID for migration
  • Writes changes back to YAML config file

Storage config — YAML-only:

  • S3 credentials, region, bucket, endpoint, CDN pull zone all configured via YAML
  • No UI for editing S3 credentials or rotating keys

Quotas — DONE (read-only UI):

  • Tier-based limits (deckhand 5GB, bosun 50GB, quartermaster 100GB)
  • Per-user quota tracking and display in admin
  • Not editable via UI (requires YAML change)

NOT STARTED:

  • Retention policies (auto-delete old blobs)
  • Hold service log viewer

Crew Management — DONE (hold admin panel)

Implemented in pkg/hold/admin/handlers_crew.go:

  • Add crew by DID with role, permissions (blob:read, blob:write, crew:admin), and tier
  • Crew list showing handle, role, permissions, tier, usage, quota
  • Edit crew permissions and tier
  • Remove crew members
  • Bulk JSON import/export with deduplication (handlers_crew_io.go)

NOT STARTED:

  • Invitation links (OAuth-based, currently must know DID)
  • Invite by handle (currently DID-only)
  • Crew request workflow (users can't self-request access)
  • Approval/rejection flow

Hold Analytics — PARTIAL

Storage metrics — DONE (hold admin):

  • Total blobs, total size, unique digests
  • Per-user quota stats (total size, blob count)
  • Top users by storage (lazy-loaded HTMX partial)
  • Crew count and tier distribution

NOT STARTED:

  • Access metrics (downloads, pulls, bandwidth)
  • Growth over time charts
  • Cost estimation
  • Geographic distribution
  • Access logs

Discovery & Social Features

Federated Browse & Search — PARTIAL

Basic search — DONE:

  • Full-text search across handles, DIDs, repo names, and annotations
  • Search UI with HTMX lazy loading and pagination
  • Navigation bar search component

NOT STARTED:

  • Filter by user, hold, architecture, date range
  • Sort by popularity, recency, size
  • Advanced query syntax
  • Popular/trending images
  • Categories and user-defined tags

Sailor Profiles — PARTIAL

Public profile page — DONE:

  • /u/{handle} shows user's avatar, handle, DID, and all public repositories
  • OpenGraph meta tags and JSON-LD structured data

NOT STARTED:

  • Bio/description field
  • Website links
  • Statistics (total images, total pulls, joined date)
  • Pinned/featured repositories

Social Features — PARTIAL (stars only)

Stars — DONE:

  • Star/unstar repositories stored as io.atcr.sailor.star ATProto records
  • Star counts displayed on repository pages
  • Starred repositories page at /u/{handle}/starred

NOT STARTED:

  • Follow other sailors
  • Comment on images
  • Like/upvote images
  • Activity feed
  • Federated timeline / custom feeds
  • Sharing to Bluesky/ATProto social apps

Access Control & Permissions

Hold-Level Access Control — DONE

  • Public/private hold toggle (admin UI + OCI enforcement)
  • Crew permissions: blob:read, blob:write, crew:admin
  • blob:write implicitly grants blob:read
  • Captain has all permissions implicitly
  • See docs/BYOS.md

Repository-Level Permissions — BLOCKED

  • Private repositories blocked by ATProto — no private records support yet
  • Repository-level permissions, collaborator invites, read-only tokens all depend on this
  • May require proxy layer or encrypted blobs when ATProto adds private record support

Team/Organization Accounts — NOT STARTED

  • Organization accounts, RBAC, SSO, audit logs
  • Likely a later-stage feature

Analytics & Monitoring

Dashboard — PARTIAL

Hold dashboard — DONE (hold admin):

  • Storage usage, crew count, tier distribution

Personal dashboard — NOT STARTED:

  • Overview of your images, holds, activity
  • Quick stats, recent activity, alerts

Pull Analytics — PARTIAL

DONE:

  • Pull/push counts per repository stored in AppView DB (repository_stats), with daily time-series snapshots (repository_stats_daily)
  • Pull counts displayed on repo cards, repository pages, and OpenGraph metadata

NOT STARTED:

  • Growth/time-series charts (daily data is collected but not visualized)
  • Per-tag breakdown
  • Pull count by client, geography
  • User analytics (authenticated vs anonymous)

Alerts & Notifications — PARTIAL

DONE:

  • Storage quota alerts in settings UI (warning states at 80%, 95%, 100% usage) — partials/storage_stats.html
  • Quota threshold webhooks and scan-completion webhooks, with Discord/Slack formatting — see Webhooks section

NOT STARTED:

  • Email notifications
  • ATProto/DM notification channel
  • Hold-down alerts

Developer Tools & Integrations

Credential Helper — DONE

  • Install page at /install with shell scripts
  • Version API endpoint for automatic updates

API Documentation — NOT STARTED

  • Swagger/OpenAPI specs
  • Interactive API explorer
  • Code examples, SDKs

Webhooks — DONE

  • Webhook registration UI in settings — handlers/webhooks.go, partials/webhooks_list.html
  • Triggers: push, scan:first, scan:all, scan:changed, quota (configurable threshold percent) — pkg/appview/webhooks/
  • HMAC signing, retry with backoff, test delivery, Discord/Slack auto-detection and formatting
  • Tier limits: free 1 webhook (push + scan:first), paid per plan, captain unlimited
  • See docs/WEBHOOKS.md

NOT STARTED:

  • Pull-event webhooks (scalability concern, needs batching/throttling — see WEBHOOKS.md)
  • Delivery history UI

CI/CD Integration — PARTIAL

DONE:

  • Example GitHub Actions and GitLab CI workflows in examples/plugins/ci-cd/ (signature verification + deploy; reference the unbuilt atcr-verify CLI)

NOT STARTED:

  • Pre-built actions/plugins
  • Build status badges

Infrastructure as Code — PARTIAL

DONE:

  • Custom UpCloud deployment tool (deploy/upcloud/) with Go-based provisioning, cloud-init, systemd, config templates
  • Docker Compose for dev and production

NOT STARTED:

  • Terraform modules
  • Helm charts
  • Kubernetes manifests (only an example verification webhook exists)
  • GitOps integrations (ArgoCD, FluxCD)

Documentation & Onboarding — PARTIAL

DONE:

  • Install page with credential helper setup
  • Learn more page
  • Internal developer docs (docs/)
  • Signup flow: PDS provider picker with curated list, branded OAuth handoff interstitial — handlers/signup.go

NOT STARTED:

  • Interactive onboarding wizard
  • Product tour / tooltips
  • Help center with FAQs
  • Video tutorials
  • Comprehensive user-facing documentation site

Advanced ATProto Integration

Data Export — DONE

  • GDPR-compliant data export (ExportUserDataHandler)
  • Fetches data from AppView DB + all holds where user is member/captain

Record Viewer — NOT STARTED

  • Browse io.atcr.* records with raw JSON view
  • Record history, diff viewer
  • ATP URI links

PDS Integration — NOT STARTED

  • Multi-PDS support, PDS health monitoring
  • PDS migration tools
  • "Verify on PDS" button

Federation — NOT STARTED

  • Cross-AppView image pulls
  • AppView discovery
  • Federated search

UI/UX Enhancements

Theming — PARTIAL

DONE:

  • Light/dark mode with system preference detection and toggle
  • Responsive design (Tailwind/DaisyUI, mobile-friendly)
  • PWA manifest with icons (no service worker yet)

NOT STARTED:

  • Custom themes
  • WCAG 2.1 AA accessibility audit
  • High contrast mode
  • Internationalization (i18n)
  • Native mobile apps

Performance — PARTIAL

DONE:

  • HTMX lazy loading for data-heavy partials
  • Efficient server-side rendering

NOT STARTED:

  • Service worker for offline caching
  • Virtual scrolling for large lists
  • GraphQL API
  • Real-time WebSocket updates in UI

Enterprise Features — NOT STARTED (except billing)

Billing — DONE

  • Stripe integration (pkg/billing/, requires -tags billing build tag)
  • Checkout sessions, customer portal, subscription webhooks
  • Tier upgrades/downgrades

Everything Else — NOT STARTED

  • Organization accounts with SSO (SAML, OIDC)
  • RBAC, audit logs for compliance
  • SOC 2, HIPAA, GDPR compliance tooling (data export exists, see above)
  • Image scanning policy enforcement
  • Paid tier SLAs

Miscellaneous Ideas — NOT STARTED

These remain future ideas with no implementation:

  • Image build service — Cloud-based Dockerfile builds
  • Registry mirroring — Pull-through cache for Docker Hub, ghcr.io, etc.
  • Deployment tools — One-click deploy to K8s, ECS, Fly.io
  • Image recommendations — ML-based "similar images" and "people also pulled"
  • Gamification — Achievement badges, leaderboards
  • Advanced search — Semantic/AI-powered search, saved searches

Updated Priority List

Already done (was "High Priority"):

  1. Multi-architecture image support — display working
  2. Vulnerability scanning integration — backend complete
  3. Hold management dashboard — implemented on hold admin panel
  4. Basic search — working
  5. Scan results UI in AppView — badges, CVE details, diff across versions
  6. SBOM display UI in AppView — package list, licenses, CSV/SPDX export
  7. Webhooks — push/scan/quota triggers, Discord/Slack, tier limits
  8. Layer inspection UI (was medium) — layer details + diff on digest page

Remaining high priority:

  1. Enhanced search (filters, sorting, advanced queries, filter by vuln status)
  2. Richer sailor profiles (bio, stats, pinned repos)

Medium priority:

  1. Pull analytics charts (daily time-series data already collected, needs UI)
  2. API documentation (Swagger/OpenAPI)
  3. Tag management (promotion, protection, aliases)
  4. Onboarding wizard / getting started guide (signup flow exists)
  5. Crew invitations (invite by handle, invitation links, self-request flow)

Low priority / long-term:

  1. Team/organization accounts
  2. Image build service
  3. Registry mirroring
  4. Federation features
  5. Internationalization

Blocked on external dependencies:

  1. Private repositories (requires ATProto private records)
  2. Federated timeline (requires ATProto feed infrastructure)

Note: This is a living document. Features may be added, removed, or reprioritized based on user feedback, technical feasibility, and ATProto ecosystem evolution.

Last audited: 2026-06-11