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
What's happening
apps/web/app/assets/cover-images/) to S3 under a new random UUID keyasset/v2.py:389:asset_key = f"{workspace.id}/{uuid.uuid4().hex}-{name}"Scale of waste (rough math)
Fix
local_static, skip the uploadgetCoverImageDisplayURL)sha256(bytes)as the S3 key instead ofuuid4(), so identical files dedupeFiles
apps/web/components/projects/create/root.tsx:72-79— upload always runs on createapps/web/helpers/cover-image.helper.ts:189—needsUploadruleapps/api/plane/app/views/asset/v2.py:389— random key per uploadJust 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