mirror of
https://tangled.org/evan.jarrett.net/at-container-registry
synced 2026-08-31 05:07:09 +00:00
- 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
497 lines
18 KiB
Markdown
497 lines
18 KiB
Markdown
# 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*
|