Three kinds of media reach the app, and they are stored differently.
| Media | Stored under | Read through |
|---|---|---|
| Event media (organizer photos, gallery) | event/<event.name>/files/ in the organization's object storage | GET /client/events/:eventId/media |
| Guest media (photos of one guest) | event/<event.name>/files/ keyed by guest | GET /client/events/:eventId/media/guest/:guestId |
| Attendee uploads (post images, avatar, media library) | The uploader's own space | GET /client/community/media/mine |
event.name is the slug, so the storage path is stable even when the event is edited. Renaming the slug orphans the folder.
Event media and signed URLs
The gallery endpoint lists the folder and returns signed URLs when asked (?signed=true), which is what the app requests. A signed URL expires; the app fetches the list when the gallery opens rather than caching links, so an expired link only shows up if you copy one out of the app.
Sharing photos with a guest (POST /events/:eventId/media/share, staff side) emails and texts signed links using the event-media-share templates.
Cover images
coverImage and images[] on the event are plain URLs in the record. Two patterns are in use:
- A permanent URL (a CDN or a public bucket object). Loads immediately and never expires.
- A signed object-storage URL. Works until it expires, and a large PNG behind it shows as a blank card until the whole file has arrived.
A cover well under a megabyte on a permanent URL renders on the My Events list at once. The demo event's multi-megabyte signed PNG is the reason its card sometimes appears blank for a few seconds.
Attendee uploads
The attendee app's media manager picks from the camera, the device or the person's library and uploads through POST /client/community/media/upload in 64 KB multipart chunks with a progress indicator and a two-minute timeout. Images default to quality 80; videos are capped at five minutes.
| Operation | Route |
|---|---|
| Upload | POST /client/community/media/upload |
| List mine | GET /client/community/media/mine?signed=true |
| Rename | PUT /client/community/media/rename |
| Delete | DELETE /client/community/media/:path |
Uploaded files are referenced by URL from posts and messages. A chat photo is sent as a message whose body is the uploaded URL, so deleting the file from the library later breaks that message's preview.
The server produces xs, sm and md thumbnails, but their paths can be truncated, so the app uses the full-size signed URL for display. Expect full-size loads in the media library.
Practical limits
- Maximum request body is set by the API; very large videos should be shared by link.
- Signed URLs are per request; do not persist them in your own systems.
- Deleting a file is immediate and not reversible.