net.anisota.graph.wordlist
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"main": {
"description": "A named, shareable list of muted words/phrases — Anisota's managed layer on top of Bluesky's flat muted-words preference. Each list is a complete, self-contained record so it can be shared by URL and saved (copied) into another user's PDS, mirroring the net.anisota.spell.custom architecture. Muting is applied client-side by the moderation pipeline: multiple enabled lists combine, a list can be scoped to specific feeds, restricted to a time-of-day/day-of-week window, and softened with a strength percentage (mute only that share of matching posts, deterministically per post). A list can optionally be projected into Bluesky's native mutedWordsPref for parity with other clients.",
"key": "tid",
"record": {
"properties": {
"createdAt": {
"description": "When this list was created",
"format": "datetime",
"type": "string"
},
"description": {
"description": "Optional description of what this list covers",
"maxLength": 300,
"type": "string"
},
"enabled": {
"default": false,
"description": "Whether this list is currently active. Scheduling and spell effects further gate an enabled list.",
"type": "boolean"
},
"name": {
"description": "Display name for this word list",
"maxLength": 64,
"type": "string"
},
"schedule": {
"description": "Optional active window. Absent means the list applies at all times while enabled.",
"ref": "#schedule",
"type": "ref"
},
"source": {
"ref": "#source",
"type": "ref"
},
"strength": {
"description": "Mute strength percentage: the share of matching posts this list mutes (deterministic per post). Absent means 100 (mute everything it matches).",
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"syncToBluesky": {
"default": false,
"description": "Whether this list's words are also projected into Bluesky's native mutedWordsPref (managed entries, removed when the list is disabled or deleted).",
"type": "boolean"
},
"targetFeeds": {
"description": "Feeds where this list applies: feed generator / list at-uris, or the literal sentinel 'following' for the home timeline. Empty or absent applies everywhere.",
"items": {
"maxLength": 512,
"type": "string"
},
"maxLength": 50,
"type": "array"
},
"updatedAt": {
"description": "When this list was last modified",
"format": "datetime",
"type": "string"
},
"words": {
"description": "The muted words/phrases in this list",
"items": {
"ref": "#word",
"type": "ref"
},
"maxLength": 500,
"type": "array"
}
},
"required": [
"name",
"words",
"createdAt"
],
"type": "object"
},
"type": "record"
},
"schedule": {
"description": "A recurring active window. Days and time window combine: the list applies only on the listed days (absent/empty = every day) and only inside the time window (absent = all day). A window whose end is at or before its start wraps past midnight.",
"properties": {
"days": {
"description": "Days of week the list is active (0 = Sunday … 6 = Saturday)",
"items": {
"maximum": 6,
"minimum": 0,
"type": "integer"
},
"maxLength": 7,
"type": "array"
},
"endTime": {
"description": "Window end as 'HH:MM' local time",
"maxLength": 5,
"type": "string"
},
"startTime": {
"description": "Window start as 'HH:MM' local time",
"maxLength": 5,
"type": "string"
}
},
"type": "object"
},
"source": {
"description": "Provenance. An 'original' list was created here; a 'learned' list was saved from another user, carrying a backlink to its immediate parent (originalUri/originalDid) and to the top of its lineage (rootUri/rootDid), modelled on net.anisota.spell.custom so save counts can aggregate across re-shares.",
"properties": {
"originalDid": {
"description": "DID of the user this list was saved from.",
"format": "did",
"type": "string"
},
"originalUri": {
"description": "AT URI of the list this copy was saved from (its immediate parent).",
"format": "at-uri",
"type": "string"
},
"rootDid": {
"description": "DID of the original author at the top of the lineage.",
"format": "did",
"type": "string"
},
"rootUri": {
"description": "AT URI of the first author's list — the top of the lineage — propagated to every descendant.",
"format": "at-uri",
"type": "string"
},
"type": {
"knownValues": [
"original",
"learned"
],
"type": "string"
}
},
"type": "object"
},
"word": {
"description": "One muted word or phrase, matching the shape of Bluesky's mutedWord items so a list can be projected into the native preference losslessly.",
"properties": {
"actorTarget": {
"description": "Whose posts to apply this word to. Absent means 'all'.",
"knownValues": [
"all",
"exclude-following"
],
"type": "string"
},
"targets": {
"description": "What to match against: post text ('content') and/or hashtags ('tag'). Absent means both.",
"items": {
"knownValues": [
"content",
"tag"
],
"type": "string"
},
"type": "array"
},
"value": {
"description": "The word or phrase to mute",
"maxLength": 100,
"type": "string"
}
},
"required": [
"value"
],
"type": "object"
}
},
"id": "net.anisota.graph.wordlist",
"lexicon": 1
}
Metadata
- DID
-
did:plc:lcieujcfkv4jx7gehsvok3pr - CID
-
bafyreidfu5yh2qt5rxzns5p5resoyxtx6xtijfzkycywbr5cgrohf55mgi - Indexed At
- 2026-07-26 20:11 UTC
- AT-URI
-
at://did:plc:lcieujcfkv4jx7gehsvok3pr/com.atproto.lexicon.schema/net.anisota.graph.wordlist
Version History (3 versions)
Similar Lexicons
Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
A record for muting content from all accounts on a list with fine-grained control over content types, duration, and feed targeting
-
A record for muting content from a specific account with fine-grained control over content types and duration
-
An index of the accounts whose reposts or quote posts the viewer has muted through Bluesky's native scoped mute (app.bsky.graph.muteActor with onlyReposts / onlyQuoteposts). Bluesky stores the mute itself, but app.bsky.…