Add Profiles page, update sidebar nav

2026-06-28 16:06:21 -04:00
parent 4890caf4d3
commit 07aa57eeea
2 changed files with 80 additions and 0 deletions
+79
@@ -0,0 +1,79 @@
# Profiles
Dumpster profiles are customizable per-user. Each user has a profile with the following fields.
## Fields
| Field | Type | Max Length | Notes |
|-------|------|-----------|-------|
| `username` | string | 32 | Set at registration, unique, immutable |
| `display_name` | string | 32 | Nickname, defaults to username |
| `email` | string | 255 | Used for auth and Gravatar |
| `avatar` | URL | text | Custom upload or Gravatar fallback |
| `bio` | string | 250 | One-liner shown on profile popover |
| `accent_color` | hex | 7 | Overrides default username color in chat |
| `status` | enum | - | online / idle / dnd / offline (set by presence) |
| `status_text` | string | 128 | Custom status message |
## Avatar System
### Custom Upload
Users can upload a custom avatar via `POST /api/v1/upload` (multipart form). The uploaded file is stored in minio and the URL is saved to the user's `avatar` field.
### Gravatar Fallback
If no custom avatar is set, the server computes `md5(email)` and serves:
```
https://www.gravatar.com/avatar/{hash}?d=identicon&s=256
```
This happens automatically. Users with Graccounts get their Gravatar. Users without get a generated identicon.
## API
### Get Current Profile
```
GET /api/v1/auth/me
```
Returns full profile including all fields above.
### Update Profile
```
PATCH /api/v1/auth/me
{
"display_name": "New Name",
"bio": "Hello world",
"accent_color": "#fe8019",
"status_text": "brb"
}
```
All fields are optional. Only provided fields are updated.
### Upload Avatar
```
POST /api/v1/upload
Content-Type: multipart/form-data
file: <image>
```
Returns `{ "url": "/files/<uuid>.png", "size": 12345 }`. Set this URL as the avatar field.
## Settings UI
The profile editor is at `/settings` in the web app. Terminal-styled form with:
- `DISPLAY_NAME:` field
- `BIO:` textarea with char counter
- `STATUS_TEXT:` field
- `ACCENT_COLOR:` field with color preview swatch
- `AVATAR:` current avatar display + upload button
- `[SAVE]` button
+1
@@ -4,6 +4,7 @@
- [Getting Started](Getting-Started)
- [Architecture](Architecture)
- [API Reference](API-Reference)
- [Profiles](Profiles)
- [Frontend Design](Frontend-Design)
- [Self-Hosting](Self-Hosting)
- [Roadmap](Roadmap)