dev.idiolect.community

A group of DIDs that declare shared conventions. Self-constituted: there is no central roll and no grading of legitimacy. Communities may be small and many.

Source: lexicons/dev/idiolect/community.json · Rust: idiolect_records::Community · TS: @idiolect-dev/schema/community · Fixture: idiolect_records::examples::community

Shape

FieldTypeRequiredNotes
namestring (≤128)yesHuman-readable community name.
descriptionstring (≤2000 graphemes)yesPurpose, norms, scope. Narrative.
membersarray of did (≤500)noInline membership for small communities.
roleAssignmentsarray of roleAssignment (≤500)noSparse role assignments where the role differs from the default.
memberRoleVocabvocabRefnoVocab the role slugs resolve against.
recordHostingopen enumnomember-hosted / community-hosted / hybrid.
appviewEndpointurinoURL of the community AppView when recordHosting is non-default.
membershipRollat-urinoExternal membership record (for communities above ~200 members).
coreSchemasarray of schemaRefnoSchemas the community treats as canonical.
coreLensesarray of lensRefnoLenses the community treats as canonical.
endorsedCommunitiesarray of at-urinoOther communities recognised as legitimate interlocutors. Not transitive.
conventionsarray (≤64) of structured convention variantsnoDecidable subset of community conventions.
conventionsTextstring (≤10000 graphemes)noNarrative conventions: style guides, norms not expressible structurally.
createdAtdatetimeyesPublication timestamp.

roleAssignment

SubfieldTypeRequiredNotes
diddidyesDID of the member.
roleopen enumyesmember / moderator / delegate / author.

A DID may appear multiple times when the role vocabulary supports multiple roles per member.

The convention variants

Each entry in conventions is one of three shapes:

VariantCaptures
conventionReviewCadenceMaximum business-days expected before a review is posted, with optional scope narrowing.
conventionVerificationReqA verification kind (and optionally a specific property) the community requires before endorsing a lens.
conventionDeprecationPolicyMinimum deprecation notice in days; whether deprecations require a replacement pointer.

The structured subset is what consumers can match on mechanically. Style guides, tone, and norms not expressible as a predicate live in conventionsText.

Field details

members versus membershipRoll

Two ways to represent membership:

  • Inline members is appropriate for small communities. The list lives directly on the community record; reading the community gives you the membership in one fetch. Capped at 500 entries.
  • External membershipRoll is a pointer to a separate record that maintains the roll. Appropriate for larger communities (above ~200 members) where the roll is updated frequently and shouldn't bloat the community record itself.

A community may use both for the transition period while moving from inline to external; consumers union the two sets.

roleAssignments versus the default role

The default role (named on the role vocabulary's top node) applies to every member who does not have an explicit roleAssignment. Only members whose role differs from the default need an entry. A 500-member community with five moderators carries five roleAssignment entries, not five hundred.

The shipped default vocabulary seeds member (top), moderator, delegate, author. A community extends by referencing a custom memberRoleVocab with additional roles.

recordHosting

SlugWhat it means
member-hostedRecords live on individual member PDSes (default ATProto).
community-hostedRecords live on a community AppView, gated by membership (Acorn-style).
hybridBoth. Some records are member-hosted, others are AppView-hosted.

Consumers crawling for community records use this to choose a surface. A community that publishes community-hosted plus an appviewEndpoint is telling consumers to route XRPC reads through the AppView instead of crawling member PDSes.

endorsedCommunities

A community names other communities it recognises as legitimate interlocutors. The endorsement is not transitive: A endorsing B and B endorsing C does not imply A endorsing C. The substrate records the assertion; consumers decide what to do with it. Common patterns: a quorum policy that requires endorsements from trusted communities; a denylist that excludes communities not endorsed by any trusted party.

Example

{
  "$type": "dev.idiolect.community",
  "name": "tutorial",
  "description": "Tutorial community for the idiolect documentation.",
  "members": [
    "did:plc:alice", "did:plc:bob", "did:plc:carol"
  ],
  "roleAssignments": [
    { "did": "did:plc:alice", "role": "moderator" }
  ],
  "recordHosting": "member-hosted",
  "coreSchemas": [
    { "uri": "at://did:plc:tutorial/dev.panproto.schema.schema/post-v1" }
  ],
  "conventions": [
    {
      "$type": "dev.idiolect.community#conventionVerificationReq",
      "kind": "roundtrip-test"
    },
    {
      "$type": "dev.idiolect.community#conventionDeprecationPolicy",
      "noticePeriodDays": 90,
      "replacementRequired": true
    }
  ],
  "conventionsText": "Lens authors review within five business days. Style: terse, factual.",
  "createdAt": "2026-04-19T00:00:00.000Z"
}

Concept references