Profiles

Profiles

A profile is how an actor is shown: a person, a group, an event or a website. Every actor has an id, a name and a description, and a place in the social graph: who follows it, who has blocked it, and, for a person, whom they follow. Most of all, an actor owns things. The posts and updates on it are its own, and following it is subscribing to them: what it posts comes to its followers' home pages, and what its followers may post on it is its own to choose.

The code and the API say actor; people using Anahita are only ever told profile. This page is what every kind has alike. What only one kind has is on its own page:

Kind What only it has Its page Its API
A person An account, an account type, pronouns, tags in photos, who may quote them People /people/
A group Made by members, rules to agree to, events it hosts Groups /groups/
An event A time, a place, going or maybe, a calendar file, being called off Events /events/
A website A site's feed, its proved domain, replies as the site Websites /websites/

All four are served by actor-service, and kept in the graph as nodes of the types in The graph.

What every profile has

Each is described once, on the page named.

What Said in
A name, a handle, a description and one link; a profile photo and a cover photo Its address; the pictures are identity-image-service's (Photos)
Who may see it: an access level, and whether those it is not open to may ask to follow it Privacy
What may be posted on it, and by whom Permissions
Followers, follow requests, invitations and blocks Permissions, Invitations
Whether its new photos and videos may be downloaded Permissions
Being turned off, archived, deleted for thirty days, restored and purged Account lifecycle
Being featured, for onboarding to offer Registration
Being reported, and removed as spam Abuse reports, Account lifecycle
Being suggested to follow Recommendations

Its address

Every profile has a handle, unique among every kind: ana, ten-forward, warp-theory-seminar. Its page in the web app is /@handle, whatever its kind, and GET /actors/:alias says which kind a handle is and its id. A person chooses theirs when they sign up. A group's is made from its name, and changes when it is renamed. An event's is made from its name when it is made and stays, since invitations and calendars link to it. A website's is chosen when it is connected.

Its admins

A group, an event and a website are looked after by admins: people who change it, choose who may see it and post on it, and add or remove other admins. Whoever makes one is its first admin and its first follower. In the web app an event's admins are called its hosts. A person looks after their own profile and has no admins.

A group left without an admin is listed for the site's administrators to appoint one (Account lifecycle).

The API

Each kind keeps its own address for what every kind has: changing who may see a group is PATCH /groups/:id/access, an event's is PATCH /events/:id/access. The API reference lists them under each kind, after what is that kind's own, as every profile's, and says what each does under Profiles.

What every profile has Route, under each kind's address
Who may see it PATCH /:id/access
What may be posted on it PATCH /:id/features
Downloading its photos and videos PATCH /:id/download-default
Its admins GET, POST /:id/admins/, DELETE /:id/admins/:admin_id
Turned off or on PATCH /:id/enabled
Featured PATCH /:id/featured
Archived POST /:id/archive
Deleted, and what that would take with it DELETE /:id, GET /:id/deletion-counts
Restored POST /:id/restore
Purged DELETE /:id/purge

Not every kind has every one: a person has no admins and restores their account by signing in; a website has nothing posted on it but its own feed, so no features and no access to choose; only people and groups can be removed as spam. Each kind's page in the reference has exactly its own.

What each is sent as: a person as actor.PersonNode, a group as actor.GroupNode, an event as actor.EventNode and a website as actor.WebsiteNode, each what every profile is sent (ActorNode) without what only another kind has. GET /actors/:alias answers with actor.HandleResponse.

Where the code is

What Where
The routes, and which are every profile's actor-service/cmd/api/routes.go (Section, Shared)
Groups, events and websites actor-service/cmd/api/handlers/group*.go, event*.go, website*.go
People actor-service/cmd/api/handlers/person*.go
The shapes sent anahita-libs/responses/actor.go, actor-service/responses/
Who may do what anahita-libs/permissions/actor.go

From anahitasocial/anahita-services, 2026-11-03.

Written by Claude, reviewed by Rastin Mehr · About this