Mobile Profile Screen
Location: apps/mobile/src/app/(main)/profile.tsx and apps/mobile/src/app/(main)/u/
The profile screen has two views: profile.tsx for the current user (self) and u/[handle].tsx for other users. Both show reputation badges, interests, posts, and circles.
Self Profile (profile.tsx)
Loaded via GET /identity/me + GET /reputation/me.
Sections
| Section | Data Source | Description |
|---|---|---|
| Hero | identity/me | Avatar, name, username, bio, location |
| Persona Switcher | identity/me/personas | Active persona pill + switch modal |
| Stats | identity/me stats | Posts / Circles / Interests / Followers / Following |
| Reputation Badges | reputation/me/detailed | Per-interest level badge (Curious→Lifework) |
| Interests | interests/me | Cards with depth + expertise sliders |
| Posts | posts?authorId=me | Pinned posts first, then chronological |
| Invite Tree | invite-tree/me | Lineage depth + count |
| QR Code | Generated client-side | Deep link to profile |
| Peer Voting | reputation/votes/mine | Votes others cast on you |
| Circles | social/circles | Your circles with member count |
Other User Profile (u/[handle].tsx)
Loaded via GET /identity/users/by-handle/:handle + GET /reputation/users/:id/public.
Shows:
- Public reputation summary: total, level, top 5 interests with peer vote net.
- Posts by this user (public + circles-visible if shared circle).
- Follow/unfollow button.
- Shared circles.
- "Add to circle" CTA → opens circle picker → circle invitation flow.
- Peer vote section (per shared interest).
Reputation Badges
Level names and thresholds:
| Level | Min Value | Badge Color |
|---|---|---|
| Curious | 0 | Neutral grey |
| Reader | 10 | Blue |
| Practitioner | 30 | Green |
| Adept | 50 | Gold |
| Master | 70 | Purple |
| Lifework | 90 | Red/crimson |
Each interest shows: interest name, level badge, reputation value, peer vote net (+/-).
Peer Voting UI
On another user's profile, for each shared interest:
- Current vote state: +1 / 0 / -1 (tap to vote)
- Net community vote: e.g., "+12 / -3"
- Optional comment field (280 chars max)
- Voting requires: voter must have that interest themselves (server-side check)
- Vote impact scaled by voter's own rep:
weight = min(3, sqrt(voterRep / 10))- 0 impact if voter rep < 5 (anti-sybil floor)
Persona Switcher
Tap persona pill → bottom sheet shows:
- List of personas (default "Main" first)
- "Edit" → open persona editor
- "Create" → max 5 total
- Switching persona sets which persona new posts are attributed to
Invite Tree (lineage.tsx)
Visualises who you invited and who they invited (depth 3).
You
├─ @alice (direct invite)
│ └─ @bob (alice's invite)
└─ @carol (direct invite)Shows: total count, depth, contribution inheritance stats.
QR Code (profile-qr.tsx)
Generates a QR code for https://rgls.uk/u/<username>. Share-sheet compatible. Used for in-person invites.
Edit Profile
PATCH /identity/me with editable fields:
- firstName, lastName, username, city, country, phone, about, profilePicUrl
- Profile picture → upload via
POST /media/upload→ presigned URL → commit
Settings
apps/mobile/src/app/(main)/settings/
| Setting | Action |
|---|---|
| Change password | PATCH /identity/me/password |
| Notification prefs | PATCH /notifications/preferences |
| Muted users | GET /identity/me/mutes |
| Blocked users | GET /identity/me/blocks |
| Muted keywords | GET /identity/me/muted-keywords |
| Delete account | POST /identity/me/delete (requires password) |