Cloudinary image delivery (deprecated)
Status: deprecated for new HASHPASS media as of October 2026.
Cloudinary is no longer the upload or delivery path for speaker/profile media. Do not create new Cloudinary assets, add Cloudinary URLs to database records, or add Cloudinary credentials to repository files.
Current canonical path
BSL speaker media is uploaded to the target AWS S3 event-media bucket and
served through the event CDN. The canonical URL is stored in
bsl_speakers.imageurl in each environment.
The Colombia sync uses immutable, content-addressed keys:
events/{event-id}/speakers/{speaker-slug}-{sha256-prefix}.{extension}
The active workflow is:
pnpm sync:bsl-colombia:dev
pnpm sync:bsl-colombia:prod
The workflow requires the environment-specific BSL database credentials,
BSL_SPEAKER_ASSETS_BUCKET, BSL_SPEAKER_CDN_URL, AWS_REGION=us-east-2,
and an AWS identity that matches EXPECTED_AWS_ACCOUNT_ID. The GitHub Actions
workflow configures the approved deploy role automatically; local runs must
use the hashpass AWS profile and verify the account before any upload.
For the full upload and reconciliation flow, see
SPEAKER_AVATARS_S3_SETUP.md.
Legacy compatibility
Existing Cloudinary URLs may remain in historical records while they are being replaced. The following code is retained only so those records can continue to render:
apps/mobile-app/lib/cloudinary.tscan recognize and transform an existing Cloudinary URL.OptimizedImagemay optimize an existing Cloudinary URL when a legacy caller passes one explicitly.CloudinaryImageUploadandCloudinaryDemoare legacy/demo code and are not the production speaker upload workflow.
The active speaker resolution path is S3-first: it uses the stored imageurl
and otherwise generates an S3-backed event avatar URL. Cloudinary must not be
used as a guessed fallback.
Verifying a published image
Check the database URL and the public CDN response in the target environment:
curl -I "https://bsl-dev.hashpass.tech/events/colombia2026/speakers/<key>.png"
curl -I "https://bsl.hashpass.tech/events/colombia2026/speakers/<key>.png"
Expected headers include 200, an image content-type, and immutable caching.
The response should show S3/CloudFront delivery rather than a
res.cloudinary.com URL.
Retirement plan
When all stored legacy Cloudinary URLs have been migrated and no demo or support workflow depends on them:
- Remove the legacy Cloudinary upload/demo components and URL helpers.
- Remove the Cloudinary dependency and unused environment variables.
- Remove this page or replace it with a short migration note.
Until then, treat Cloudinary as read-only legacy compatibility—not an active media provider.