Skip to main content
Sifa Docs

Activity taxonomy

The Made / Did / filtered classification for every record type Sifa indexes. Live data from sifa-sdk.

The activity taxonomy sorts every AT Protocol record type that Sifa knows into one of three tiers. The tier decides whether a record shows on a profile, and how. This page renders the live data from @singi-labs/sifa-sdk@<SdkVersion inline />.

Tiers

Substantive records the actor authored: posts, articles, repos, galleries, livestreams, RSVPs, CV entries. Surfaced on the public profile and in the network timeline.

LexiconAppNotes
app.atmobb.discussion.replyatmobbReplies are authored text, consistent with app.bsky.feed.post covering replies.
app.atmobb.discussion.threadatmobb
app.beaconbits.beaconbeaconbits
app.bsky.feed.postblueskyAmbiguous: many posts are casual, but the lexicon also carries long-form posts and threads. Treated as creation; empty quote-posts (no text + record embed) are filtered at the consumer layer, not here.
app.bsky.graph.verificationblueskyDiverges from app.bsky.graph.follow (action) on purpose: verifying another account's handle is a deliberate trust statement the actor authors, not a tap. Sifa renders it with its own card.
app.collectivesocial.feed.listcollectivesocialAuto-created default Inbox lists are filtered at the consumer layer via isDefault=true predicate.
app.mcp.servermcp
app.sidetrail.trailsemble
app.sidetrail.walksemble
app.userinput.discussionuserinput
app.userinput.replyuserinputReplies are authored text, consistent with app.bsky.feed.post covering replies.
at.margin.annotationmarginAn annotation on someone else's text is still authored writing.
at.margin.notemargin
at.marque.domainmarque
at.youandme.connectionyouandme
blue.flashes.feed.postflashes
buzz.bookhive.bookbookhive
com.minomobi.music.compositionminomobi
com.voxport.podcast.seriesvoxport
com.whtwnd.blog.entrywhitewind
community.lexicon.badge.awardbadgesThe award record is authored by the giver, so it is their attestation about someone else.
community.lexicon.calendar.rsvpsmokesignalAmbiguous: RSVPs are reactions to events, but they are public commitments and the only Smoke Signal record Sifa scans today. Classified as creation.
community.nooki.commentsnookiComments are authored text.
community.nooki.membershipnookiJoining a community, classified like social.colibri.membership (creation).
community.opensocial.membershipopensocialJoining a community, classified like social.colibri.membership (creation).
computer.aetheros.pageaetheros
dev.atvouch.graph.vouchatvouchVouching for someone. Authored attestation, same reasoning as fund.at.graph.endorse.
dev.baileytownsend.guestbook.entryguestbookSigning someone else's guestbook is a short authored message.
dev.keytrace.claimkeytrace
exchange.recipe.reciperecipe
fm.plyr.commentplyrComments are authored text.
forum.barazo.community.memberbarazo
forum.barazo.postbarazo
forum.barazo.reputation.eventbarazo
fund.at.graph.endorseatfundEndorsing someone. Authored attestation, not engagement.
fyi.asq.answerasq
fyi.asq.questionasq
fyi.atstore.listing.reviewatstore
fyi.unravel.frontpage.postfrontpage
id.sifa.endorsementsifaEndorsement authored by the actor about another profile.
id.sifa.graph.connectionsifaMutual professional connection record.
id.sifa.meetingsifa
id.sifa.profile.certificationsifa
id.sifa.profile.coursesifa
id.sifa.profile.educationsifa
id.sifa.profile.externalAccountsifa
id.sifa.profile.honorsifa
id.sifa.profile.languagesifa
id.sifa.profile.locationsifa
id.sifa.profile.positionsifa
id.sifa.profile.presentationsifa
id.sifa.profile.presentationDeliverysifa
id.sifa.profile.projectsifa
id.sifa.profile.publicationsifa
id.sifa.profile.selfsifaSifa professional profile root.
id.sifa.profile.skillsifa
id.sifa.profile.volunteeringsifa
id.sifa.project.membersifaDeprecated, never implemented. Superseded by id.sifa.confirmation.
id.sifa.project.membershipsifaDeprecated, never implemented. Superseded by id.sifa.confirmation.
id.sifa.project.selfsifa
io.atcr.repo.pageatcr
io.calabro.watsm.programwatsm
io.kich.recipe.recipekich
is.kevara.directory.speakerkevara
li.plonk.pasteplonk
link.pastesphere.snippetpastesphere
net.alternativeproto.submissionalternativeproto
net.anisota.feed.listanisota
net.anisota.feed.postanisota
one.papili.postpapili
org.v-it.skillvit
os.aether.docs.presentationaetherdocs
place.stream.livestreamstreamplace
pub.leaflet.commentleaflet
quest.atmo.checkinatmorsvpAttendance, classified like community.lexicon.calendar.rsvp (creation) rather than as engagement. The creation tier description names RSVPs explicitly.
quest.atmo.eventatmorsvp
sh.tangled.repotangled
sh.tangled.repo.issuetangled
sh.tangled.repo.pulltangled
site.standard.documentstandard
so.sprk.feed.postspark
so.sprk.story.postspark
social.colibri.membershipcolibri
social.crate.contentcrate
social.crate.notecrate
social.grain.gallerygrain
social.passports.fiftyStates.visitpassports
social.passports.travel.legpassports
social.popfeed.feed.notepopfeed
social.popfeed.feed.postpopfeed
social.popfeed.feed.reviewpopfeed
social.psky.feed.postpicosky
space.roomy.space.personalroomy
st.lifepo.lifeEventlifepo
stream.thought.blipstreamthought
tech.waow.doodl.drawingwaow
tech.waow.doodl.iconwaow
tech.waow.doodl.iconsetwaow
tech.waow.doodl.logowaow
tech.waow.pollz.pollwaow
tech.waow.slides.deckwaow
tech.waow.slides.slidewaowIndividual slides are components of a deck. Both are kept; the consumer decides whether to collapse them.
wiki.lichen.notelichen
wiki.lichen.wikilichen

Source: @singi-labs/sifa-sdk v1.1.0 (updated 2026-07-29). This table is regenerated from the SDK at build time; if it looks stale, the docs site needs to be rebuilt against a newer SDK release.

Engagement records (likes, reposts, follows, votes, stars, reactions). Visible to the actor on the 'What is public about me' page and on the originating app, but not surfaced on the Sifa public profile.

LexiconAppNotes
app.bsky.feed.likebluesky
app.bsky.feed.repostbluesky
app.bsky.graph.followbluesky
forum.barazo.reactionbarazo
forum.barazo.replybarazoShort conversational reply — engagement signal.
fyi.unravel.frontpage.votefrontpage
id.sifa.confirmationsifaConfirmation that a record naming the actor is accurate (co-speaker credit, project membership).
id.sifa.endorsement.confirmationsifaConfirmation/acceptance of an endorsement received.
id.sifa.graph.followsifa
net.alternativeproto.votealternativeprotoVote record on a third-party protocol.
pub.leaflet.interactions.recommendleaflet
sh.tangled.feed.startangled
sh.tangled.graph.followtangled
social.popfeed.feed.likepopfeed

Source: @singi-labs/sifa-sdk v1.1.0 (updated 2026-07-29). This table is regenerated from the SDK at build time; if it looks stale, the docs site needs to be rebuilt against a newer SDK release.

A third tier (filtered) covers configuration records, moderation records, and other infrastructure that we hide from every Sifa surface.

Types

The exported shapes consumers can rely on. Re-exported from examples/sdk-types.ts so any rename in the SDK fails CI before this page can ship stale.

ActivityTier

type ActivityTier = 'creation' | 'action' | 'filtered'

A single union of the three classifications. Use this as the parameter type for functions that take a tier name.

TierMeta

interface TierMeta {
  /** Human-readable label, e.g. "Made". Null on the filtered tier. */
  label: string | null
  /** Sentence-length description of what the tier covers. */
  description: string
  /** True if records in this tier surface on the public profile. */
  shownOnPublicProfile: boolean
}

LexiconEntry

interface LexiconEntry {
  /** Which tier this record type falls into. */
  tier: ActivityTier
  /** Originating app slug, e.g. "bluesky", "tangled". Optional for community lexicons. */
  app?: string
  /** Free-text caveats or rationale notes. Optional. */
  notes?: string
}

ActivityTaxonomy

interface ActivityTaxonomy {
  /** Semantic version of the taxonomy. */
  version: string
  /** ISO date of the last update, e.g. "2026-05-28". */
  updated: string
  /** Tier-level metadata, keyed by tier name. */
  tiers: Record<ActivityTier, TierMeta>
  /** All known record types, keyed by AT Protocol NSID. */
  lexicons: Record<string, LexiconEntry>
}

Functions

The SDK exports a handful of pure helpers around the taxonomy. None touch the network.

FunctionSignaturePurpose
getActivityTier(nsid: string) => ActivityTierLook up the tier for a given NSID. Returns 'filtered' for unknown NSIDs (safe default).
getLexiconEntry(nsid: string) => LexiconEntry | nullGet the full entry (tier + app + notes), or null if unknown.
getTierMeta(tier: ActivityTier) => TierMetaGet tier metadata (label, description, public visibility).
getActivityTaxonomyVersion() => { version: string; updated: string }Diagnostics for version-skew detection.

The full taxonomy is also exposed as the readonly export ACTIVITY_TIERS.

Reading from your own code

/**
 * Resolve a record's tier without touching the network.
 *
 * Compiles against the pinned sifa-sdk version on every CI run. If the
 * SDK changes a name or type and breaks this file, the docs build fails
 * before merge.
 */

import {
  ACTIVITY_TIERS,
  getActivityTier,
  getLexiconEntry,
  getActivityTaxonomyVersion,
} from '@singi-labs/sifa-sdk'

const version = getActivityTaxonomyVersion()
console.log(`Activity taxonomy v${version.version} (updated ${version.updated})`)

// Look up tier for a few common record types.
const examples = [
  'app.bsky.feed.post',
  'app.bsky.feed.like',
  'sh.tangled.repo',
  'community.lexicon.calendar.rsvp',
] as const

for (const nsid of examples) {
  const tier = getActivityTier(nsid)
  const entry = getLexiconEntry(nsid)
  console.log(`${nsid}: ${tier}${entry?.app ? ` (${entry.app})` : ''}`)
}

// Or iterate every known record type.
const creationLexicons = Object.entries(ACTIVITY_TIERS.lexicons)
  .filter(([, entry]) => entry.tier === 'creation')
  .map(([nsid]) => nsid)

console.log(`${creationLexicons.length} record types classified as "Made"`)

For an end-user explanation of which records show up where, see Activity feed.

On this page