[enhancement] Image header for events and profile

I don’t know if the lexicon will support it but would be a great addition.

for the profile one we coud just pump the bsky lexicon image.

I think supporting blobs with suggested dimensions is a great feature. I’ve been punting that for the time being because I’d like it to be an optional feature for Smoke Signal operators because it introduces some complexity:

  • What are the technical requirements and constraints for supporting blob (image) uploads?
  • How are images retrieved, cached, and displayed?
  • What tools and features exist for Smoke Signal operators to mask or hide offensive images, or to throttle resource consumption for supporting images?
1 Like

This is a big question indeed.

I am probably over my head in this but for moderation could we use the Ozone layer from bsky ? Or, to stay with rust, rsky?

as for ressource, caching and access, i think intgration of a cloud cdn could be a first step.

Here is a first draft of what could be a move is this direction.

MVP Scope: Event Cover Images

Core Feature: Allow event creators to add a single cover image to events for better visual appeal and social media sharing.

Technical Implementation Strategy

1. Lexicon Design

community.lexicon.event.create
- Add optional `coverImage` field of type `blob`
- Include `alt` text field for accessibility
- Limit to single image per event initially

2. Upload Constraints (Conservative Start)

  • File types: JPEG, PNG, WebP only
  • Size limit: 2MB (?) max per image
  • Dimensions: Max 1920x1080, min 640x360
  • Aspect ratio: Enforce 16:9 only (1.777:1 ratio)
  • Crop tool: “à-la-bluesky” profile image header

3. Basic Content Safety

  • EXIF stripping: Remove metadata automatically on upload
  • File validation: Server-side MIME type verification + aspect ratio validation
  • Quarantine period: 24-hour garbage collection window for unreferenced blobs

Retrieval and Display

1. Two-way simple CDN Strategy

  • Cloudflare images or rustyfiles (self-hosted)
  • Generate 3 standard sizes on first access:
    • Thumbnail: 320x180
    • Medium: 640x360
    • Large: 1280x720
  • Cache transformed images until event ends, request PDS blob afterwards (?)
  • Serve through dedicated subdomain (images.[EXTERNAL_BASE]) with strict CSP

(In phase 2 we could offer others CDN solutions)

2. Progressive Enhancement

  • Events without images work exactly as before
  • Images enhance social sharing and visual appeal
  • Fallback to event text/title and default meta og:image for sharing when no cover image

Moderation Tools (Minimum Viable)

1. Basic Reporting

  • Add “Report Image” option on hovering
  • Manual review queue for flagged images
  • Simple hide/remove actions and maybe automation to blur in case of multiple flags in a set time.

(In a phase 2, we could integrate with the Ozone tool and labelers)

2. Operator Controls

  • Global image upload toggle (operator control and/or emergency shutoff)
  • Per-user blob quota management
  • Bulk image removal tools (per user, last hour)
  • Default meta og:image

3. Rate Limiting

  • 10 (?) images per user per day
  • 1 image per event
  • DID based upload limiting

Resource Management

1. Storage Monitoring

  • Track total blob usage per account
  • Alert operators at 80% of aggregate storage limits
  • Automatic cleanup of orphaned blobs after 48 hours

2. Bandwidth Controls

  • Serve images through CDN only until the event ended.
  • Implement basic image optimization (quality reduction for large files)
  • Monitor and alert on excessive bandwidth usage

Created a thread over in Lexicon Community.

1 Like