net.anisota.graph.wordlist

anisota.net

{
  "$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. Which posts fill that share is decided by match confidence — how many of the list's words hit, whether they landed in the post's own text, a hashtag, or only a quoted post, and how much of the post they account for — so a softened list keeps the squarest matches muted and lets the marginal ones through. Deterministic per post, so a post never flickers. 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"
          },
          "treatment": {
            "description": "What this list does to a post it mutes, overriding the app-wide muted-words handling: 'hide' removes it from feeds, 'warn' collapses it behind a notice, 'show' leaves it visible and only counts it toward impact. Absent inherits the global setting.",
            "knownValues": [
              "hide",
              "warn",
              "show"
            ],
            "type": "string"
          },
          "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
}

Validate Record

Validate a record against net.anisota.graph.wordlist

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:lcieujcfkv4jx7gehsvok3pr
CID
bafyreifnqe2ermfg5wtnxvd4fky3lw47ofjaympt44cjoil3weowdihcuy
Indexed At
2026-08-07 01:42 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.

  • net.anisota.graph.listMute recordnot from the namespace authority

    A record for muting content from all accounts on a list with fine-grained control over content types, duration, and feed targeting

  • net.anisota.graph.mute recordnot from the namespace authority

    A record for muting content from a specific account with fine-grained control over content types and duration

  • net.anisota.graph.scopedMute recordnot from the namespace authority

    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.…

Lexicon Garden

@