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 classifies every AT Protocol record type Sifa knows about into one of three tiers, determining whether and how the record surfaces on a profile. 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.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.collectivesocial.feed.listcollectivesocialAuto-created default Inbox lists are filtered at the consumer layer via isDefault=true predicate.
app.sidetrail.trailsemble
app.sidetrail.walksemble
at.youandme.connectionyouandme
blue.flashes.feed.postflashes
com.whtwnd.blog.entrywhitewind
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.
computer.aetheros.pageaetheros
dev.keytrace.claimkeytrace
forum.barazo.community.memberbarazo
forum.barazo.postbarazo
forum.barazo.reputation.eventbarazo
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.projectsifa
id.sifa.profile.publicationsifa
id.sifa.profile.selfsifaSifa professional profile root.
id.sifa.profile.skillsifa
id.sifa.profile.volunteeringsifa
id.sifa.project.membersifa
id.sifa.project.membershipsifa
id.sifa.project.selfsifa
link.pastesphere.snippetpastesphere
place.stream.livestreamstreamplace
pub.leaflet.commentleaflet
sh.tangled.repotangled
sh.tangled.repo.issuetangled
sh.tangled.repo.pulltangled
site.standard.documentstandard
social.colibri.membershipcolibri
social.grain.gallerygrain
social.popfeed.feed.notepopfeed
social.popfeed.feed.postpopfeed
social.popfeed.feed.reviewpopfeed
social.psky.feed.postpicosky
space.roomy.space.personalroomy

Source: @singi-labs/sifa-sdk v1.0.0 (updated 2026-05-28). 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.endorsement.confirmationsifaConfirmation/acceptance of an endorsement received.
id.sifa.graph.followsifa
net.alternativeproto.vote-Vote 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.0.0 (updated 2026-05-28). 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