The crew portal offers a camera path and a library path, previews the shot with the job and stage it will attach to, and then requires the person to press one of two differently-coloured, differently-worded buttons. Project, stage, attribution and coordinates are all derived server-side.
Also called: send photo to customer · progress photos · crew photo upload · site pictures
- 1Two separate hidden file inputs — one with capture=environment to force live capture, one without to open the picker.
- 2preparePhoto runs on both paths before upload.
- 3The confirm screen names the project and stage the photo will land on.
- 4POST /api/crew-portal/photo requires destination to be exactly 'job' or 'customer'; anything else is rejected.
- 5The file goes to the Supabase portal-media bucket and a stage_photos row records url, caption, taken_by, taken_by_name, taken_at, lat/lng and visibility internal|customer.
A photo of a mess on site and a photo of finished work look identical in an upload queue, and sending the wrong one to a customer is not recoverable. There is no default destination and no toggle: the crew names the destination — internal or customer-facing — and anything that fails to say is rejected rather than assumed. Two labelled buttons instead of a switch, because a toggle has a state you can misread in sunlight and two buttons have no state at all. Photos are stored on the builder's own file storage, so the screen works the same way for every company whatever else they run.
- Progress photos lost in personal message threads.
- Accidental customer-facing sends with no way to unsend.
- Photos with no job, stage, author or date attached.
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →