Help us improve
Share bugs, ideas, or general feedback.
From vibefed
Provides reference for FEP-82f6 Actor statuses in ActivityPub: ActorStatus object, profile fields, Create/Remove/Delete activities, expiration, history, and Smithereen sm: namespace. For Fediverse profile status implementation.
npx claudepluginhub reiver/vibefed --plugin vibefedHow this skill is triggered — by the user, by Claude, or both
Slash command
/vibefed:kb-fediverse-actor-statusesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
FEP-82f6 (authored by Gregory Klyushnikov / grishka, received 2025-05-12,
Builds ActivityPub servers and handles fediverse federation in JavaScript/TypeScript using Fedify. Covers builder pattern, dispatchers, HTTP Signatures, vocab objects, key management, and integrations with Hono, Express, Next.js, and more.
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
FEP-82f6 (authored by Gregory Klyushnikov / grishka, received 2025-05-12, status DRAFT — finalization expected ~2026-03-18) describes an ActivityPub extension that allows actors to publish a short status text on their profile, with optional expiration, structured metadata attachment, and history.
The feature replicates a well-known UX pattern from centralized platforms: early Facebook "is..." statuses (2006–2009), VKontakte taglines, Discord custom statuses, and GitHub profile statuses. These are distinct from regular posts — they cannot be interacted with (no likes, replies, boosts), cannot contain media attachments, and have a short character limit.
The proposal originates from Smithereen, a federated social network
modeled after VKontakte, which already implements this feature. The JSON-LD
namespace http://smithereen.software/ns# (prefix sm:) reflects this
origin.
ActorStatus extends the ActivityPub Object type. It represents a single
status update.
| Field | Description |
|---|---|
id | Unique identifier for this status update |
attributedTo | ID of the actor whose status this is |
content | Plain text content of the status |
published | Timestamp when the status was created |
| Field | Description |
|---|---|
endTime | Timestamp when the status expires. If present and in the past, implementations MUST NOT display this status |
attachment | Structured metadata about what the actor is doing (e.g., a song, a video game). If present, content MUST contain a fallback human-readable plain text representation |
{
"type": "ActorStatus",
"id": "https://example.social/users/1/statuses/1747286633",
"attributedTo": "https://example.social/users/1",
"content": "is desperately trying to bring the old internet back",
"published": "2025-05-15T05:23:53.539Z",
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"sm": "http://smithereen.software/ns#",
"ActorStatus": "sm:ActorStatus"
}
]
}
{
"type": "ActorStatus",
"id": "https://example.social/users/1/statuses/1747300000",
"attributedTo": "https://example.social/users/1",
"content": "at a conference until Friday",
"published": "2025-05-15T09:00:00.000Z",
"endTime": "2025-05-16T18:00:00.000Z"
}
{
"type": "ActorStatus",
"id": "https://example.social/users/1/statuses/1747350000",
"attributedTo": "https://example.social/users/1",
"content": "Radiohead — Everything In Its Right Place",
"published": "2025-05-15T12:00:00.000Z",
"attachment": {
"type": "Audio",
"name": "Everything In Its Right Place",
"attributedTo": "Radiohead"
}
}
The content field MUST contain a human-readable fallback so servers that
don't understand the structured attachment can still display meaningful
text.
Two OPTIONAL fields are added to actor objects:
statusThe current status update. Rules:
ActorStatus object (not a reference/link){
"type": "Person",
"id": "https://example.social/users/1",
"name": "Alice",
"status": {
"type": "ActorStatus",
"id": "https://example.social/users/1/statuses/1747286633",
"attributedTo": "https://example.social/users/1",
"content": "is desperately trying to bring the old internet back",
"published": "2025-05-15T05:23:53.539Z"
}
}
statusHistoryA collection of all past status updates. Behavior:
Send Create{ActorStatus} to followers.
{
"type": "Create",
"actor": "https://example.social/users/1",
"object": {
"type": "ActorStatus",
"id": "https://example.social/users/1/statuses/1747286633",
"attributedTo": "https://example.social/users/1",
"content": "is desperately trying to bring the old internet back",
"published": "2025-05-15T05:23:53.539Z"
},
"to": "https://example.social/users/1/followers"
}
Upon receiving:
statusHistory, add the new status to itstatusHistory, the previous status is
considered deleted (as if Deleted)After sending, the status field on the actor object MUST be updated.
An Update{Actor} MUST NOT be sent — the Create already implicitly
updates the status field on remote servers.
Send Remove{ActorStatus} to followers.
{
"type": "Remove",
"actor": "https://example.social/users/1",
"object": "https://example.social/users/1/statuses/1747286633",
"to": "https://example.social/users/1/followers"
}
Upon receiving:
object ID matches the actor's current status, clear itstatusHistory, the status stays in historystatus field becomes absentSend Delete{ActorStatus} to followers.
{
"type": "Delete",
"actor": "https://example.social/users/1",
"object": "https://example.social/users/1/statuses/1747286633",
"to": "https://example.social/users/1/followers"
}
Upon receiving:
statusHistory as well as clearing from profilestatusHistory, this is identical to RemoveOnce published, a status object cannot be Updated. This is a
deliberate design decision — if the user wants a different status, they
create a new one.
Statuses cannot be interacted with. Implementations:
object from non-owner actorsThe spec makes a deliberate distinction:
| Activity | Profile | History | Use case |
|---|---|---|---|
Remove | Cleared | Kept (if statusHistory exists) | "I'm done with this status, but it's part of my history" |
Delete | Cleared | Removed | "I want this status to no longer exist anywhere" |
Remove (no history) | Cleared | N/A | Identical to Delete when statusHistory is absent |
This mirrors the Facebook/VK pattern where statuses accumulate in a timeline. Users can either move past them (they become history) or delete them entirely.
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"sm": "http://smithereen.software/ns#",
"ActorStatus": "sm:ActorStatus",
"status": {
"@type": "@id",
"@id": "sm:status"
},
"statusHistory": {
"@type": "@id",
"@id": "sm:statusHistory"
}
}
]
}
The namespace http://smithereen.software/ns# originates from the
Smithereen project. ActorStatus is equivalent to
http://smithereen.software/ns#ActorStatus — they are the same type
expressed with and without the namespace prefix.
| Platform | Feature | Interactable? | Media? | Limit | History? |
|---|---|---|---|---|---|
| Early Facebook (2006–2009) | "is..." status | No | No | Very short | Yes |
| VKontakte | Status/tagline | No | No | Short | Yes |
| Discord | Custom status | No | Emoji only | 128 chars | No |
| GitHub | Custom status | No | Emoji only | Short | No |
| Slack | Custom status | No | Emoji only | 100 chars | No |
| FEP-82f6 | ActorStatus | No | Attachment metadata | 100+ chars | Optional |
No existing Fediverse platform has a standardized actor status feature. Smithereen is the only known implementation.
The author's design philosophy is distinctive and worth understanding for implementers:
"This FEP serves one particular UX use case and only that. Nothing less, nothing more." The proposal does not try to be a general-purpose mechanism. It captures a specific, well-understood UI pattern.
"A clean compatibility break with all preexisting software is an explicit
goal." Rather than reusing existing mechanisms (like the featured
collection) for partial backward compatibility, the proposal introduces
a new type that servers either understand or don't. This avoids ambiguous
degradation where a status might misleadingly appear as a pinned post.
"I simply translated the actions that the user can take in the UI to AP activities, one-to-one." Each user action maps directly to one Activity type:
| User action | Activity |
|---|---|
| Set status | Create{ActorStatus} |
| Clear status | Remove{ActorStatus} |
| Delete status | Delete{ActorStatus} |
No side effects, no indirect mechanisms (like using Update with
endTime changes to clear a status).
featured Collection?silverpill suggested placing ActorStatus in featured for partial
compatibility. Rejected because:
featured has different semantics (showcase content vs. current state)Update Activity?silverpill proposed Update{ActorStatus} setting endTime to a past
date to clear statuses. Rejected because:
Remove) with a non-obvious one
(Update with a side effect)endTime
to a future dateRemove activity directly and transparently maps to the user
action of clearing a statusSorteKanin asked why statuses can't have likes, replies, images, or long
text. Rejected because adding these features would make statuses overlap
with regular posts (Note objects) and lose the distinct UX identity that
makes them useful.
ActorStatus object with id, attributedTo, content,
published, and optionally endTime and/or attachmentCreate{ActorStatus} to the actor's followersstatus field with the new statusUpdate{Actor} — the Create implicitly updates remote
copiesCreate{ActorStatus}: update the actor's displayed status. If you
track history and the actor has statusHistory, add to it. If no
statusHistory, discard the previous status.Remove{ActorStatus}: if the object ID matches the current status,
clear it. Keep in history if applicable.Delete{ActorStatus}: clear from profile AND remove from history.endTime is present and in the past, do NOT displaystatusHistory is available, optionally provide a UI to browse itThe attachment field carries structured metadata (e.g., a song, a game).
If you can render it richly (album art, game icon), do so. If not, the
content field already contains a plain text fallback — just display that.
sm: namespace reflects this single-origin status. Adoption by
other platforms would validate the design.endTime
and stop displaying expired statuses. There is no push notification
for expiration — it's poll-based on the endTime value.Update: If a user makes a typo in their status, they must
create a new one rather than editing. This is intentional but may
surprise users accustomed to editing posts.statusHistory collection is visible to
"anyone who can see the actor itself." There is no mechanism for
private or followers-only status history.