net.anisota.graph.wordlist

anisota.net

Schema Diff

+1 -1

From

CID
bafyreifnqe2ermf...
Indexed At
2026-08-07 01:42 UTC
View this version

To

CID
bafyreiaq6akunvv...
Indexed At
2026-08-21 20:18 UTC
View this version

Compatibility Analysis

Backward Compatible

No changes detected.

1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "main": {
5 5
      "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.",
6 6
      "key": "tid",
7 7
      "record": {
8 8
        "properties": {
9 9
          "createdAt": {
10 10
            "description": "When this list was created",
11 11
            "format": "datetime",
12 12
            "type": "string"
13 13
          },
14 14
          "description": {
15 15
            "description": "Optional description of what this list covers",
16 16
            "maxLength": 300,
17 17
            "type": "string"
18 18
          },
19 19
          "enabled": {
20 20
            "default": false,
21 21
            "description": "Whether this list is currently active. Scheduling and spell effects further gate an enabled list.",
22 22
            "type": "boolean"
23 23
          },
24 24
          "name": {
25 25
            "description": "Display name for this word list",
26 26
            "maxLength": 64,
27 27
            "type": "string"
28 28
          },
29 29
          "schedule": {
30 30
            "description": "Optional active window. Absent means the list applies at all times while enabled.",
31 31
            "ref": "#schedule",
32 32
            "type": "ref"
33 33
          },
34 34
          "source": {
35 35
            "ref": "#source",
36 36
            "type": "ref"
37 37
          },
38 38
          "strength": {
39 39
            "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).",
40 40
            "maximum": 100,
41 41
            "minimum": 0,
42 42
            "type": "integer"
43 43
          },
44 44
          "syncToBluesky": {
45 45
            "default": false,
46 46
            "description": "Whether this list's words are also projected into Bluesky's native mutedWordsPref (managed entries, removed when the list is disabled or deleted).",
47 47
            "type": "boolean"
48 48
          },
49 49
          "targetFeeds": {
50 50
            "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.",
51 51
            "items": {
52 52
              "maxLength": 512,
53 53
              "type": "string"
54 54
            },
55 55
            "maxLength": 50,
56 56
            "type": "array"
57 57
          },
58 58
          "treatment": {
59 59
            "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.",
60 60
            "knownValues": [
61 61
              "hide",
62 62
              "warn",
63 63
              "show"
64 64
            ],
65 65
            "type": "string"
66 66
          },
67 67
          "updatedAt": {
68 68
            "description": "When this list was last modified",
69 69
            "format": "datetime",
70 70
            "type": "string"
71 71
          },
72 72
          "words": {
73 73
            "description": "The muted words/phrases in this list",
74 74
            "items": {
75 75
              "ref": "#word",
76 76
              "type": "ref"
77 77
            },
78 78
            "maxLength": 500,
79 79
            "type": "array"
80 80
          }
81 81
        },
82 82
        "required": [
83 83
          "name",
84 84
          "words",
85 85
          "createdAt"
86 86
        ],
87 87
        "type": "object"
88 88
      },
89 89
      "type": "record"
90 90
    },
91 91
    "schedule": {
92 -
      "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.",
92 +
      "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 before its start wraps past midnight; equal start and end means no time bound (all day on the listed days).",
93 93
      "properties": {
94 94
        "days": {
95 95
          "description": "Days of week the list is active (0 = Sunday … 6 = Saturday)",
96 96
          "items": {
97 97
            "maximum": 6,
98 98
            "minimum": 0,
99 99
            "type": "integer"
100 100
          },
101 101
          "maxLength": 7,
102 102
          "type": "array"
103 103
        },
104 104
        "endTime": {
105 105
          "description": "Window end as 'HH:MM' local time",
106 106
          "maxLength": 5,
107 107
          "type": "string"
108 108
        },
109 109
        "startTime": {
110 110
          "description": "Window start as 'HH:MM' local time",
111 111
          "maxLength": 5,
112 112
          "type": "string"
113 113
        }
114 114
      },
115 115
      "type": "object"
116 116
    },
117 117
    "source": {
118 118
      "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.",
119 119
      "properties": {
120 120
        "originalDid": {
121 121
          "description": "DID of the user this list was saved from.",
122 122
          "format": "did",
123 123
          "type": "string"
124 124
        },
125 125
        "originalUri": {
126 126
          "description": "AT URI of the list this copy was saved from (its immediate parent).",
127 127
          "format": "at-uri",
128 128
          "type": "string"
129 129
        },
130 130
        "rootDid": {
131 131
          "description": "DID of the original author at the top of the lineage.",
132 132
          "format": "did",
133 133
          "type": "string"
134 134
        },
135 135
        "rootUri": {
136 136
          "description": "AT URI of the first author's list — the top of the lineage — propagated to every descendant.",
137 137
          "format": "at-uri",
138 138
          "type": "string"
139 139
        },
140 140
        "type": {
141 141
          "knownValues": [
142 142
            "original",
143 143
            "learned"
144 144
          ],
145 145
          "type": "string"
146 146
        }
147 147
      },
148 148
      "type": "object"
149 149
    },
150 150
    "word": {
151 151
      "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.",
152 152
      "properties": {
153 153
        "actorTarget": {
154 154
          "description": "Whose posts to apply this word to. Absent means 'all'.",
155 155
          "knownValues": [
156 156
            "all",
157 157
            "exclude-following"
158 158
          ],
159 159
          "type": "string"
160 160
        },
161 161
        "targets": {
162 162
          "description": "What to match against: post text ('content') and/or hashtags ('tag'). Absent means both.",
163 163
          "items": {
164 164
            "knownValues": [
165 165
              "content",
166 166
              "tag"
167 167
            ],
168 168
            "type": "string"
169 169
          },
170 170
          "type": "array"
171 171
        },
172 172
        "value": {
173 173
          "description": "The word or phrase to mute",
174 174
          "maxLength": 100,
175 175
          "type": "string"
176 176
        }
177 177
      },
178 178
      "required": [
179 179
        "value"
180 180
      ],
181 181
      "type": "object"
182 182
    }
183 183
  },
184 184
  "id": "net.anisota.graph.wordlist",
185 185
  "lexicon": 1
186 186
}

Compare Other Versions

Lexicon Garden

@