Skip to content

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

SectionData SourceDescription
Heroidentity/meAvatar, name, username, bio, location
Persona Switcheridentity/me/personasActive persona pill + switch modal
Statsidentity/me statsPosts / Circles / Interests / Followers / Following
Reputation Badgesreputation/me/detailedPer-interest level badge (Curious→Lifework)
Interestsinterests/meCards with depth + expertise sliders
Postsposts?authorId=mePinned posts first, then chronological
Invite Treeinvite-tree/meLineage depth + count
QR CodeGenerated client-sideDeep link to profile
Peer Votingreputation/votes/mineVotes others cast on you
Circlessocial/circlesYour 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:

LevelMin ValueBadge Color
Curious0Neutral grey
Reader10Blue
Practitioner30Green
Adept50Gold
Master70Purple
Lifework90Red/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/

SettingAction
Change passwordPATCH /identity/me/password
Notification prefsPATCH /notifications/preferences
Muted usersGET /identity/me/mutes
Blocked usersGET /identity/me/blocks
Muted keywordsGET /identity/me/muted-keywords
Delete accountPOST /identity/me/delete (requires password)

Regulus — invite-only social-knowledge platform