App logo upload — vibe.co flow, real S3

Same three wire steps as the live site: POST /graphql RequestAssetUpload → PUT <presigned url> → GET <cdnUrl>. Client validation mirrors the real page: 112–500 px, jpeg/png/gif/webp/avif.
Choose File or drag an image here
112×112 … 500×500 px
// wire log