> ## Documentation Index
> Fetch the complete documentation index at: https://dench.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Workspace members, profiles, and presence

> Open a Dench teammate's profile for presence, local time, tagline, open tasks, and their CRM activity feed, from the app, CLI, or API.

Click a teammate anywhere — a comment, an `@mention`, an Assignee or Owner
pill, a meeting participant, the members list, a `⌘K` result, a notification —
and their profile slides in from the right.

<CardGroup cols={3}>
  <Card title="Who and where" icon="user">
    Photo, name, tagline, role, email, and their local time relative to yours.
  </Card>

  <Card title="Presence" icon="circle-dot">
    Online, away, or offline with a last-seen time, from a heartbeat while the app is open.
  </Card>

  <Card title="What they're doing" icon="list-check">
    Open tasks assigned to them, and a feed of their comments and record changes across the CRM.
  </Card>
</CardGroup>

## Presence

| State       | Meaning                                                |
| ----------- | ------------------------------------------------------ |
| **Online**  | The app was in a visible tab within the last 3 minutes |
| **Away**    | Within the last 30 minutes                             |
| **Offline** | Longer, with "last seen …" when we've ever seen them   |

Only the web app heartbeats. CLI runs and API calls never count as presence,
so an agent working on someone's behalf doesn't make them look online.

## Editing your own profile

Open your own profile (the rail's account menu → **My profile**, or click your
name anywhere) and click the photo, name, or tagline to change them in place.
**Settings → Personal → My profile** has the same fields plus your timezone.
Timezone also drives the agent's sense of "today" and "tomorrow".

## Assignee pills

In record sidebars and tables, clicking an Assignee/Owner pill opens that
person. To reassign, use the chevron that appears on hover (or click the empty
part of the cell).

## Deep links

`/<workspace>?member=<userId>` opens a profile. The panel's link button copies
it. Mentions in notes and comments are `[@Name](/?member=<userId>)`, so the
same link works inside markdown.

## CLI

```bash theme={null}
dench members list --json                                   # roster + presence + timezone
dench members get <userId|email> --json                     # one profile
dench members activity <userId|email> [--limit 30] [--kinds comments,changes]
dench members tasks <userId|email>                          # their open tasks
dench members presence [<userId|email>...]                  # online / away / offline
dench members me                                            # your profile
dench members me --name "Ada Lovelace" --tagline "Head of Ops" --timezone Europe/London
dench members me --avatar ./me.png                          # png/jpeg/webp/gif/avif ≤ 2 MB
dench members me --image-url https://…/me.jpg | --clear-avatar | --auto-timezone
```

Emails resolve against the roster, so scripts can pass `jane@acme.com`.

## API

```bash theme={null}
curl -sS "$DENCH_API_BASE/members" -H "Authorization: Bearer $DENCH_API_KEY"
curl -sS "$DENCH_API_BASE/members/<userId>" -H "Authorization: Bearer $DENCH_API_KEY"
curl -sS "$DENCH_API_BASE/members/<userId>/activity?limit=20&kinds=comments" -H "Authorization: Bearer $DENCH_API_KEY"
curl -sS "$DENCH_API_BASE/members/<userId>/tasks" -H "Authorization: Bearer $DENCH_API_KEY"
curl -sS "$DENCH_API_BASE/members/presence?userIds=<id1>,<id2>" -H "Authorization: Bearer $DENCH_API_KEY"

curl -sS "$DENCH_API_BASE/me/profile" -H "Authorization: Bearer $DENCH_API_KEY"
curl -sS -X PATCH "$DENCH_API_BASE/me/profile" -H "Authorization: Bearer $DENCH_API_KEY" \
  -H "Content-Type: application/json" --data '{"tagline":"Head of Ops","timezone":"Europe/London"}'

# Avatar: get a one-time upload URL, POST the bytes, then set the storageId.
UPLOAD_URL=$(curl -sS -X POST "$DENCH_API_BASE/me/avatar/upload-url" -H "Authorization: Bearer $DENCH_API_KEY" | jq -r .)
STORAGE_ID=$(curl -sS -X POST "$UPLOAD_URL" -H "Content-Type: image/png" --data-binary @me.png | jq -r .storageId)
curl -sS -X PUT "$DENCH_API_BASE/me/avatar" -H "Authorization: Bearer $DENCH_API_KEY" \
  -H "Content-Type: application/json" --data "{\"storageId\":\"$STORAGE_ID\"}"
```

`/me/*` needs a person behind the token: an agent session acts as its owner;
an organization API key with no bound member is refused.

## For agents

The chat agent has `get_member_profile({ userIdOrEmail })`, which returns the
profile, presence, open tasks, and recent activity in one call — use it for
"what is X working on", "is X around", or to check someone's timezone before
scheduling. Activity excludes edits Dench or automations made on the person's
behalf; it is what they did themselves.
