Skip to content

Improvement: Stop re-uploading bundled cover images to S3 on every project create #9970

Description

@Sahil-Gupta584

What's happening

  • Every project create uploads one of the 30 bundled covers (apps/web/app/assets/cover-images/) to S3 under a new random UUID key
  • Same file, new S3 object, every time
  • asset/v2.py:389: asset_key = f"{workspace.id}/{uuid.uuid4().hex}-{name}"

Scale of waste (rough math)

  • Say 2,000 teams on Cloud
  • Say 3 projects per team = 6,000 projects
  • ~50KB per cover × 6,000 = ~300MB of duplicate covers
  • Only 30 unique files exist — 6,000 objects store 30 images

Fix

  • If cover is local_static, skip the upload
  • Store the static path directly — the app already renders static paths as-is (getCoverImageDisplayURL)
  • Or: sha256(bytes) as the S3 key instead of uuid4(), so identical files dedupe

Files

  • apps/web/components/projects/create/root.tsx:72-79 — upload always runs on create
  • apps/web/helpers/cover-image.helper.ts:189 — needsUpload rule
  • apps/api/plane/app/views/asset/v2.py:389 — random key per upload

Just a small bug i noticed, not much but can save small s3 cost in cloud version

Let me know if this issue can be taken, would like to raise a pr

Activity

  1. manshi-n commented on Oct 9, 2026

    @manshi-n

    Hi! I'd like to work on this issue. I plan to trace the local_static cover-image flow, confirm why bundled images are uploaded on project creation, and add regression tests for the fix. Would you be happy to assign this issue to me once the approach is confirmed?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions