# Attachments (Workspace)

> Monitor storage usage and manage files across every attachment surface from Workspace.

**Attachments** in the Workspace side rail opens `/workspace/attachments`. Every authenticated
member of the active organization can see the section; only **owners** and **admins** can select
files and use bulk delete.

## Storage meter

At the top of the section, a card shows how much storage your organization has used against its
quota: the used total (for example `500 MB`), the quota (`of 1 GiB used` on the Free tier, the
default for organizations created after the tier rollout — organizations created before it keep
their grandfathered 5 GiB), and the used percentage with a slim progress bar. All three numbers
come from the server — the meter never estimates storage client-side. If your organization has a
custom storage limit, the meter shows that override instead of the plan default.

The meter always reflects the organization's current usage, so deleting files (see **Bulk delete**
below) updates the used total and percentage as soon as the deletion completes.

## What counts toward storage

Storage measures the **files** your organization stores, nothing else.

**Counts:**

- Images inside texts: descriptions, steps, comments, and other rich-text fields, each listed as
  **Content image**
- Files uploaded to a test case's [Attachments](https://docs.probara.net/en/guides/test-repository/#case-attachments) section
- Result attachments
- Defect evidence
- Project pictures

**Does not count:**

- Text and records: projects, suites, cases, steps, comments, runs, and defects themselves
- Users' profile pictures
- Files uploaded for an import

Records such as projects are limited by your plan's own counts — see
[Billing](https://docs.probara.net/en/guides/billing/) — not by storage.

**At the limit.** Any upload that would take your organization past its quota is refused with a
message that your organization is out of storage, and none of its files are stored. A step,
comment, run step, or project picture save is refused as a whole and stays exactly as it
was; for a test result, only its attachments are refused — the result you recorded is kept. What you
entered stays in the form, so you can retry after freeing space. Saves that add no files always go
through, even when you are already over the quota; so do saves that remove more files than they
add, except when the files they remove stay in storage because an earlier version of their case
still shows them (see **Images only earlier versions show** below).

**Freeing space.** Space comes back as soon as the files are gone:

- Delete files here with **Bulk delete** (owners and admins).
- Remove an image from its text, once no earlier version of its case still shows it.
- Delete a file from a test case's **Attachments** section.
- Permanently delete a test case, a run, or a defect.
- Remove a project picture, or delete a project — which deletes every file inside it.

An image you remove from its text stays in storage while an earlier version of its case still shows
it, so the image still shows when you open or restore that version. That space comes back when your
plan's history retention removes the last version that shows it, or when you permanently delete the
test case or its project.

## The unified listing

Below the meter, a single table lists files across **all** attachment surfaces: test result
evidence, defect evidence, files uploaded to test cases, and images inside
texts (listed as **Content image**), including images only earlier versions of a
case still show (see below).
Profile avatars are not included — this table is only for evidence and file uploads.
Project pictures are not listed either, although the meter counts them; change or remove them from
the project's settings.

The listing shows only the files that belong to projects you can reach: a private project you have
no access to never contributes rows here. **Owners**, **admins**, and requests authenticated by an
**API token** see every file in the organization, private projects included — that unfiltered view
is a deliberate exception, not an oversight. The storage meter above, by contrast, always reflects
the organization's total usage regardless of your own project access — the meter and the listing
can disagree by design.

Files inside a **locked** project are not listed here, and they are not counted in the listing's
total either. A project is locked when your organization holds more projects than your plan
allows — see [Billing](https://docs.probara.net/en/guides/billing/). The storage meter above still counts those files,
because you are still storing them: the meter and the listing disagree here by design, the same way
they already do for private projects you cannot reach. Raising your plan's project allowance brings
the files back, and so does deleting the locked project, which deletes its files with it.

Each row shows:

| Column   | Meaning                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| File     | A file-type icon, the filename linking to the stored file, and a line below it naming the uploader (for an [app token](https://docs.probara.net/en/guides/integrations/junit-xml/), the app's logo and name beside the token name). An image inside a text has no filename, so it is named **Content image**; when a test case holds it, the line below names that case as a link, in place of the uploader. A file uploaded to a test case keeps its filename, and the line below names its case the same way. Files uploaded before this feature shipped have no recorded uploader, so that line is left out. |
| Type     | The file's MIME type (for example `image/png`, `application/pdf`)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| Size     | Human-readable file size                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| Uploaded | The upload date, with how long ago it was below it. Hover the date for the exact time.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |

### Images only earlier versions show

An image you removed from a text still counts toward storage while an earlier version of its case
shows it. The listing shows it once, however many versions show it. It has no case link, because the
case no longer holds it, and its date is when it was stored.

You cannot delete it here: bulk delete leaves it alone. Its space comes back when your plan's history
retention removes the last version that shows it, or when you permanently delete its test case or its
project.

### Search, sort, and pagination

Use the search field to filter by filename or MIME type — for example typing `png` narrows the
list to matching filenames and images. Search runs on the server and updates the URL, so a search
link can be shared or bookmarked.

Click the File, Type, Size, or Uploaded header to sort the whole listing by that column (File sorts by
filename), and click it again to reverse the direction; the arrow on the header shows the order in
force. Sorting and searching both apply across every attachment surface at once, not per surface. Use
the pagination control at the bottom of the table to move between pages or change how many rows are
shown per page.

## Selecting files and bulk delete

If you are an **owner** or **admin**, each file row has a checkbox, and the table header has a
select-all checkbox for the rows on the current page. An image inside a text has no checkbox: remove
it from its text instead. Selecting some but not all of the rows on the page shows the header checkbox
in a partially-checked state; selecting every row on the page checks it fully.

As soon as you select a file, a bar appears at the bottom of the screen with the number of files
selected and a **Delete** action. Clicking **Delete** opens a confirmation dialog — no file is
deleted until you confirm. The **×** on the bar clears the selection.

A file inside a locked project cannot be deleted from here either: it is skipped, reported as
locked, and left where it is, while everything else in the same selection is deleted normally. The
only way to remove those files is to reopen the project by raising your plan's project allowance,
or to delete the locked project itself.

An image inside a text is removed by deleting it from its text, not from this list. Its space comes
back once no earlier version of its case still shows it.

**Deleting is permanent.** There is no trash and no undo. If a deleted file was embedded somewhere
else in the product (for example inside a comment), that reference is not rewritten — it continues
to show the same broken/unavailable state the application already uses for any missing file.

After you confirm, the selected files disappear from the table, your selection clears, and the
storage meter updates to reflect the freed space.

On a narrow (phone-width) screen the listing becomes a card list: each file presents as its own card,
showing the same type, size, and upload time, with the same selection checkbox (for owners and
admins) always visible at the leading edge — never a hover reveal, except on an image inside a text,
which has none. Selecting a card raises the same bar with the **Delete** action. At tablet width and
above the list is the table described above.

## Who can do what

| Role   | Sees the meter and listing | Selects files and bulk-deletes |
| ------ | -------------------------- | ------------------------------ |
| Owner  | Yes                        | Yes                            |
| Admin  | Yes                        | Yes                            |
| Member | Yes                        | No                             |
| Viewer | Yes                        | No                             |

Members and viewers see the storage meter and the full listing, but no checkboxes and no
**Delete** action — bulk delete is restricted to owners and admins, and the server
rejects a bulk-delete request from any other role even if it is attempted directly.
