Every person and agent in Opbox is an actor with a record, a tier, and a presence across the app. User profiles are the surface where that record becomes personal: you see who you are signed in as, set the avatar that follows you through the sidebar and member lists, and tune the preferences that shape your view. The same area is where an administrator manages everyone else - the roster, their roles, the teams they belong to, and the sessions they hold.
What it does
Your own identity, at a glance. The personal settings panel reads your session back to you: your display name, what kind of actor you are, your role, your firm tier, your workspace, and your agent autonomy level. This is a pure self-read of your own actor row, so nothing here exposes anyone else. It answers the plain question “who am I in this workspace, and what am I allowed to do” without a round trip to an administrator.
An avatar that travels. Set a profile image (a data:image/ URL up to 256 KB, or an external https image) and it is stored against your actor record and surfaced back as your avatar everywhere your identity appears. You set your own avatar and only your own; the write targets your row and nobody else’s. A small image is held inline as a data URL, and an external https image is equally valid, so the picture you choose is the picture the workspace shows.
Per-user preferences. Personalisation that is yours alone - the layout of your dashboard widgets, your appearance and theme choices - lives in a per-user preference store keyed to your actor. It is deliberately separate from workspace configuration: a UI preference is your view, not a shared fact, so it is member-writable, non-secret, and scoped to you, never an Owner-gated workspace setting. You set a key and read it back, and the app honours it the next time you open it.
The people roster. Administrators see the whole roster: every human and agent, with name, kind, role, and status. From a person’s row you can invite a new human at a starting tier, move someone between tiers (Member, Admin, Owner), and deactivate or reactivate them. The role-change is the single governed write path for tier moves, and the kernel guards it: you cannot demote the last Owner, and a refusal surfaces inline rather than being second-guessed by the screen.
Teams. Group people into teams, add and remove members, rename a team, and archive one that is no longer in use. A team is a first-class record you can read on its own, list across the workspace, and drill into for its full membership. Teams are how the roster is organised into the working units that matters and agents are assigned against.
Offboarding and session control. Deactivating a human disables them and bumps their session version, which invalidates every session they hold in one move, so an offboarded person is out everywhere at once. Reactivating reverses the disable but does not restore the old sessions: the version bump stands, so the person logs in fresh. An administrator can also revoke one user’s sessions directly without changing their status, for the times you need every session of a single person ended now.
Identifier-key rotation. At the operator grade, an Owner can re-HMAC every global identifier to a new key version in one pass. This is the rotation step that pairs with secret rotation: it rewrites the hashed identifiers used for deduplication and matching to the new key with no multi-version window, and it is idempotent, so re-running it against the same target key is a no-op.
How you use it
Check who you are signed in as. Open Settings and the personal panel shows your display name, kind, role, firm tier, workspace, and autonomy level, all read live from your session. It is the fastest way to confirm the account and permissions you are acting under.
Set your avatar. In the same panel, provide an image as a data:image/ URL up to 256 KB, or an https URL. Opbox stores it against your actor and refreshes your identity so the new picture shows immediately, then carries it through the rest of the app.
Tune your view. Adjust your appearance, theme, and dashboard layout. Those choices save to your per-user preferences and come back the way you left them next time, without touching anyone else’s view or the workspace’s shared configuration.
Manage people. As an administrator, open the people surface to see the roster. Invite a new human at a starting tier, change someone’s tier from their row, or toggle them between active and deactivated. If the kernel refuses a move (demoting the last Owner, say, or a caller without the rights), the refusal shows on the row.
Organise teams. Create a team, add or remove members, rename it, and archive it when it is done. Drill into a team to read its full membership.
Offboard or lock out a user. Deactivate a person to disable them and end all their sessions in one action, reactivate them when they return (they log in fresh), or revoke a single user’s sessions outright when you need them signed out now without changing their status.
The kernel verbs behind it
Each goes through the one front door - permission-checked and audited before it runs. These are the verbs most specific to user profiles, drawn from the identity, session, actor, pref, and team areas.
Your own profile:
session.get- the current session’s own identity (whoami): display name, kind, role, firm tier, autonomy level, status, and your avatar URL.actor.avatar.set- set the acting actor’s own avatar (adata:image/URL up to 256 KB, or an https URL); surfaced back bysession.getasavatarUrl.pref.get- read your own value for a per-user UI preference key.pref.set- upsert your own per-user UI preference, such as your dashboard layout or theme.pref.list- list your own preferences, optionally filtered by key prefix.
Managing people (admin-side):
actor.list- read the roster of people and agents for the people panel.actor.get- read one actor’s record.actor.invite- invite a human onto the roster at a starting tier.actor.setRole- move a human’s tier (Member, Admin, Owner); the one role-change write path, with the last-Owner guard.actor.deactivate- offboard a human: disable them and bumpsessionVersionto end every session.actor.reactivate- re-enable a deactivated human (re-login required; prior sessions are not restored).
Sessions and identifier keys:
session.revoke- end all of one user’s sessions with a human-drivensessionVersionbump.identity.rehash- re-HMAC every global identifier to a new key version (HMAC secret rotation).
Teams:
team.create- create a new team.team.get- read a team, including its full membership.team.list- list the teams in the workspace with member counts.team.member.add- add a person to a team.team.member.remove- remove a person from a team.team.rename- rename a team.team.archive- archive a team that is no longer in use.
See the full set in the actor verb reference.