Project Photos - User Guide¶
The Project Photos module allows you to attach, organize, and comment on images related to the work on each project - progress, inspections, damage, completion, etc.
Tab controlled by permission
The "Fotos" (Photos) tab in the project detail only appears for users with the canViewProjectPhotos permission. To upload/edit/delete, you also need canEditProjectPhotos.
1. Where to find it¶
Photos are in the "Fotos" (Photos) tab within each project's detail.
- Access "Projetos" (Projects) in the side menu
- Click on the desired project card
- On the detail page, click the "Fotos" (Photos) tab

2. What you see¶
Photo Grid¶
Responsive grid of thumbnails of photos attached to the project.
- 3-4 columns on desktop
- 2 columns on tablet
- 1 column on mobile
Each thumbnail shows:
- Photo thumbnail
- Tags (if any)
- Upload date
- Name of who uploaded
Empty state¶
If the project doesn't have photos yet, the card shows:
"No photos yet. Click 'Upload' to add."
3. Uploading¶
Click the "Upload" button in the upper right corner of the tab.

Upload methods¶
- Drag-and-drop - drag photos to the marked area
- Click to choose - opens the system file picker
- Batch upload - select multiple photos at once
During upload¶
- Progress bar per photo
- Background processing (you can navigate to another tab)
- Photos appear in the grid as they complete
4. Metadata for each photo¶
When you click on a photo, the Photo Viewer opens in fullscreen. In the side panel you can edit:
| Field | Editable? | Description | Limit |
|---|---|---|---|
| Description | Yes | Photo description | 2000 characters |
| Tags | Yes | Tags for organization (e.g., "progress", "damage") | Max 50 tags, 50 chars each |
| Taken At | Yes | When the photo was taken (useful if different from upload) | - |
| Original Filename | No | Original file name | - |
| Uploaded By | No | Who uploaded (auto-captured) | - |
| Uploaded At | No | Upload date (auto-captured) | - |
Tag suggestions¶
Organizing photos by tags makes it easier to search later:
progress- photos of work being donebefore- initial state of the locationafter- final resultdamage- issues foundmaterial- incoming materialsinspection- inspection photos
5. Photo Viewer (Fullscreen View)¶
When you click on a photo in the grid, a fullscreen dialog opens with:

Elements¶
- Image in high resolution (zoom available)
- Navigation buttons (← → for next/previous)
- Side panel with editable metadata
- Comments section
- Delete button (if you have permission)
- Download button (download original photo)
- Close (ESC or X button)
6. Collaborative comments¶
Each photo allows comments. Useful for:
- Technical discussions: "Here we need to reinforce the structure before drywall"
- Instructions: "Use white joint compound, not gray"
- History: "Photo taken before the customer confirmed the change"
How to comment¶
- Open the photo in the Photo Viewer
- Scroll to the comments section (side panel)
- Type your comment (free text)
- Click "Enviar" (Send) or press Enter
Comment fields¶
| Field | Auto-captured |
|---|---|
| Text | You type |
Author (userId) |
Yes |
Author name (userName) |
Yes |
Date (createdAt) |
Yes |
Who can delete comments¶
- Comment author - can delete their own
- Admin - can delete any comment
7. Deleting photos¶
- Open the photo in the Photo Viewer
- Click the trash icon
- Confirm in the AlertDialog
Deleting is permanent
The photo is removed from Firebase Storage and the metadata from Firestore. Comments are also deleted along with it.
Who can delete¶
- Uploader - owner of the photo can delete their own
- Admin/Super Admin - can delete any photo
8. Cascade Delete (important!)¶
When deleting a project, all photos go with it
If an admin deletes the entire project, all photos (and comments) of the project are automatically deleted. This is an automatic cascade delete.
If you want to preserve important photos before deleting a project: 1. Download the relevant photos 2. Only then delete the project
flowchart LR
A[Admin deletes project] --> B[System triggers cascade]
B --> C[Deletes all project photos]
C --> D[Deletes photo comments]
D --> E[Removes files from Storage]
E --> F[Removes metadata from Firestore]
9. Storage: Firebase vs Google Drive¶
Each photo has a storageLocation field:
| Value | Where the photo is |
|---|---|
storage |
Firebase Storage (default) |
drive |
Organization's Google Drive (if integration active) |
When to use Google Drive?¶
If the organization has the Google Drive integration active (via Settings > Integrations, super admin only), photos can be stored in Drive in addition to Firebase.
This is useful for:
- Additional backup outside Firebase
- Sharing with external stakeholders via Drive link
- Integration with workflows existing in the company on Workspace
See Settings for how to activate the Google Drive integration.
Important Rules¶
Required fields and limits¶
| Field | Required | Limit |
|---|---|---|
| File (photo) | Yes | 50 MB per photo |
| MIME type | Yes | image/* (jpg, png, heic, webp, gif, etc.) |
description |
No | 2000 characters |
tags[] |
No | Max 50 tags, 50 chars each |
takenAt |
Yes | ISO 8601 (auto or manual) |
| Comment (text) | Yes | 1000 characters |
Required permissions¶
| Operation | Super Admin | Admin | Employee with canEditProjectPhotos |
Employee with canViewProjectPhotos |
Standard employee |
|---|---|---|---|---|---|
| View Photos tab | Yes | Yes | Yes | Yes | No (tab hidden) |
| View photos and metadata | Yes | Yes | Yes | Yes | No |
| Upload | Yes | Yes | Yes | No | No |
| Edit metadata (description, tags) | Yes | Yes | Yes | No | No |
| Delete photo (own) | Yes | Yes | Yes | No | No |
| Delete photo (any) | Yes | Yes | No | No | No |
| Comment | Yes | Yes | Yes | Yes | No |
| Delete own comment | Yes | Yes | Yes | Yes | No |
| Delete others' comments | Yes | Yes | No | No | No |
Validations that block¶
Maximum size: 50 MB
Photos larger than 50 MB are rejected on upload. If the photo is too large:
- Use compression (apps like Compressor, ImageOptim)
- Export in "web" quality instead of "original" if it came from a professional camera
- Reduce resolution (2000x2000 px is already sufficient for documentation)
Images only
MIME type must be image/*. PDFs, videos, or documents are not accepted in this tab.
Cascade delete when deleting project
Deleting project = deleting all photos and comments. It is not possible to recover after deleting the project.
Defaults¶
| Setting | Value |
|---|---|
| Default storage | Firebase Storage |
Default storageLocation |
storage |
| Visibility | Restricted to those with canViewProjectPhotos |
| Initial tags | None (empty array) |
Quick summary¶
| You want to... | Do this... |
|---|---|
| View photos of a project | Project detail > "Fotos" (Photos) tab |
| Upload | Photos tab > "Upload" > drag-and-drop or click |
| Edit description/tags | Click the photo > side panel |
| Comment on a photo | Click the photo > comments section |
| Delete a photo | Click the photo > trash icon |
| Download original photo | Click the photo > download icon |
| Navigate between photos | ← → arrows in the Photo Viewer |