fedipod-server 0.29.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (440) hide show
  1. package/README.md +11 -6
  2. package/dist/door.d.ts +4 -0
  3. package/dist/door.js +31 -0
  4. package/dist/fedipod.d.ts +16 -0
  5. package/dist/fedipod.js +13 -0
  6. package/dist/front.d.ts +3 -0
  7. package/dist/front.js +94 -0
  8. package/dist/handler.d.ts +36 -101
  9. package/dist/handler.js +85 -645
  10. package/dist/handler.jsonld +2 -30
  11. package/dist/identities.d.ts +62 -0
  12. package/dist/identities.js +236 -0
  13. package/dist/mounts.d.ts +43 -0
  14. package/dist/mounts.js +123 -0
  15. package/dist/opt-in.d.ts +46 -0
  16. package/dist/opt-in.js +176 -0
  17. package/package.json +10 -18
  18. package/lib/client/c2s.mjs +0 -636
  19. package/lib/client/localapi.mjs +0 -87
  20. package/lib/client/masto/accounts.mjs +0 -310
  21. package/lib/client/masto/body.mjs +0 -156
  22. package/lib/client/masto/index.mjs +0 -206
  23. package/lib/client/masto/instance.mjs +0 -112
  24. package/lib/client/masto/media.mjs +0 -79
  25. package/lib/client/masto/oauth.mjs +0 -656
  26. package/lib/client/masto/render.mjs +0 -518
  27. package/lib/client/masto/statuses.mjs +0 -372
  28. package/lib/client/masto/timelines.mjs +0 -438
  29. package/lib/client/oidc-auth.mjs +0 -62
  30. package/lib/client/streaming.mjs +0 -154
  31. package/lib/client/webpush.mjs +0 -98
  32. package/lib/connections/acctfeed.mjs +0 -257
  33. package/lib/connections/atproto.mjs +0 -309
  34. package/lib/connections/bskyfeed.mjs +0 -243
  35. package/lib/connections/bskygroup.mjs +0 -162
  36. package/lib/connections/fediacct.mjs +0 -253
  37. package/lib/connections/import.mjs +0 -357
  38. package/lib/connections/tagfeed.mjs +0 -212
  39. package/lib/connections/vault.mjs +0 -114
  40. package/lib/core/as2.mjs +0 -206
  41. package/lib/core/contexts/activitystreams.json +0 -379
  42. package/lib/core/contexts/anno.json +0 -126
  43. package/lib/core/contexts/did-v1.json +0 -57
  44. package/lib/core/contexts/fep-5711.json +0 -36
  45. package/lib/core/contexts/gotosocial.json +0 -86
  46. package/lib/core/contexts/identity-v1.json +0 -152
  47. package/lib/core/contexts/index.mjs +0 -63
  48. package/lib/core/contexts/join-lemmy.json +0 -33
  49. package/lib/core/contexts/joinmastodon.json +0 -28
  50. package/lib/core/contexts/litepub-0.1.json +0 -60
  51. package/lib/core/contexts/map.json +0 -19
  52. package/lib/core/contexts/miscellany.json +0 -19
  53. package/lib/core/contexts/quotes.json +0 -18
  54. package/lib/core/contexts/schemaorg.json +0 -8845
  55. package/lib/core/contexts/security-data-integrity-v1.json +0 -78
  56. package/lib/core/contexts/security-data-integrity-v2.json +0 -81
  57. package/lib/core/contexts/security-multikey-v1.json +0 -35
  58. package/lib/core/contexts/security-v1.json +0 -74
  59. package/lib/core/contexts/webfinger.json +0 -10
  60. package/lib/core/deliver.mjs +0 -387
  61. package/lib/core/graphview.mjs +0 -327
  62. package/lib/core/intake/activities.mjs +0 -649
  63. package/lib/core/intake/activity.mjs +0 -318
  64. package/lib/core/intake/channel.mjs +0 -144
  65. package/lib/core/intake/group.mjs +0 -258
  66. package/lib/core/intake/index.mjs +0 -732
  67. package/lib/core/intake/notes.mjs +0 -367
  68. package/lib/core/intake/verify.mjs +0 -142
  69. package/lib/core/keys.mjs +0 -153
  70. package/lib/core/lease.mjs +0 -206
  71. package/lib/core/place.mjs +0 -82
  72. package/lib/core/polls.mjs +0 -105
  73. package/lib/core/profile-page.mjs +0 -104
  74. package/lib/core/proof.mjs +0 -79
  75. package/lib/core/publisher/collections.mjs +0 -272
  76. package/lib/core/publisher/index.mjs +0 -522
  77. package/lib/core/publisher/notes.mjs +0 -519
  78. package/lib/core/publisher/own.mjs +0 -143
  79. package/lib/core/publisher/questions.mjs +0 -241
  80. package/lib/core/publisher/restore.mjs +0 -224
  81. package/lib/core/shapes/activitystreams.ttl +0 -157
  82. package/lib/core/shapes/index.mjs +0 -132
  83. package/lib/core/shapes/shapes-text.mjs +0 -13
  84. package/lib/core/social.mjs +0 -561
  85. package/lib/core/storage.mjs +0 -176
  86. package/lib/core/store.mjs +0 -578
  87. package/lib/core/wire-quotes.mjs +0 -71
  88. package/lib/core/wire.mjs +0 -925
  89. package/lib/device/account.mjs +0 -87
  90. package/lib/device/admin/index.mjs +0 -13
  91. package/lib/device/admin/origins.mjs +0 -35
  92. package/lib/device/admin/routes/connections.mjs +0 -144
  93. package/lib/device/admin/routes/gateway.mjs +0 -199
  94. package/lib/device/admin/routes/lifecycle.mjs +0 -200
  95. package/lib/device/admin/routes/owner.mjs +0 -322
  96. package/lib/device/admin/routes/setup.mjs +0 -428
  97. package/lib/device/admin/routes/social.mjs +0 -188
  98. package/lib/device/admin/server.mjs +0 -95
  99. package/lib/device/admin/static.mjs +0 -247
  100. package/lib/device/admin/surface.mjs +0 -315
  101. package/lib/device/certs.mjs +0 -281
  102. package/lib/device/cli/commands/account.mjs +0 -586
  103. package/lib/device/cli/commands/run.mjs +0 -278
  104. package/lib/device/cli/commands/service.mjs +0 -221
  105. package/lib/device/cli/commands/setup.mjs +0 -489
  106. package/lib/device/cli/commands/state.mjs +0 -561
  107. package/lib/device/cli/context.mjs +0 -288
  108. package/lib/device/export-collections.mjs +0 -161
  109. package/lib/device/gateway-move.mjs +0 -58
  110. package/lib/device/home.mjs +0 -161
  111. package/lib/device/migrate.mjs +0 -115
  112. package/lib/device/ports.mjs +0 -27
  113. package/lib/device/remote.mjs +0 -54
  114. package/lib/device/setup.mjs +0 -496
  115. package/lib/device/update.mjs +0 -96
  116. package/lib/gateway/caches.mjs +0 -36
  117. package/lib/gateway/directory.mjs +0 -90
  118. package/lib/gateway/front-core.mjs +0 -966
  119. package/lib/gateway/gateway-core.mjs +0 -244
  120. package/lib/gateway/headers.mjs +0 -49
  121. package/lib/gateway/httpsig.mjs +0 -159
  122. package/lib/gateway/notices.mjs +0 -84
  123. package/lib/gateway/quiet.mjs +0 -189
  124. package/lib/gateway/relay-extras.mjs +0 -89
  125. package/lib/gateway/token-claims.mjs +0 -16
  126. package/lib/pod/README.md +0 -61
  127. package/lib/pod/actor.mjs +0 -96
  128. package/lib/pod/collection.mjs +0 -77
  129. package/lib/pod/containers.mjs +0 -140
  130. package/lib/pod/discovery.mjs +0 -46
  131. package/lib/pod/featured.mjs +0 -18
  132. package/lib/pod/followers.mjs +0 -24
  133. package/lib/pod/following.mjs +0 -10
  134. package/lib/pod/http.mjs +0 -74
  135. package/lib/pod/inbox.mjs +0 -166
  136. package/lib/pod/links.mjs +0 -35
  137. package/lib/pod/location.mjs +0 -52
  138. package/lib/pod/media.mjs +0 -27
  139. package/lib/pod/notes.mjs +0 -78
  140. package/lib/pod/notifications.mjs +0 -89
  141. package/lib/pod/outbox.mjs +0 -18
  142. package/lib/pod/package.json +0 -19
  143. package/lib/pod/policy.mjs +0 -58
  144. package/lib/pod/private.mjs +0 -19
  145. package/lib/pod/root.mjs +0 -104
  146. package/lib/pod/state.mjs +0 -40
  147. package/lib/pod/transport.mjs +0 -674
  148. package/lib/pod/type-index.mjs +0 -101
  149. package/lib/pod/urls.mjs +0 -91
  150. package/lib/server/embed.mjs +0 -424
  151. package/lib/session/README.md +0 -137
  152. package/lib/session/demo.html +0 -94
  153. package/lib/session/fedi-account.mjs +0 -417
  154. package/lib/session/fedi-login.mjs +0 -123
  155. package/lib/session/oidc-session.mjs +0 -233
  156. package/lib/session/package.json +0 -49
  157. package/lib/shared/guard.mjs +0 -213
  158. package/lib/shared/links.mjs +0 -9
  159. package/lib/shared/safefetch.mjs +0 -235
  160. package/lib/shared/ua.mjs +0 -29
  161. package/phanpy/dist/404.html +0 -40
  162. package/phanpy/dist/_headers +0 -2
  163. package/phanpy/dist/apple-touch-icon.png +0 -0
  164. package/phanpy/dist/assets/ICONS-DIPJeU0C.js +0 -2
  165. package/phanpy/dist/assets/ICONS-DIPJeU0C.js.map +0 -1
  166. package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js +0 -183
  167. package/phanpy/dist/assets/ScheduledAtField-D-Abfo4J.js.map +0 -1
  168. package/phanpy/dist/assets/Temml-CCjoacWt.woff2 +0 -0
  169. package/phanpy/dist/assets/__vite-browser-external-C7iut881.js +0 -2
  170. package/phanpy/dist/assets/__vite-browser-external-C7iut881.js.map +0 -1
  171. package/phanpy/dist/assets/boosts-carousel-BiOaNdMT.jpg +0 -0
  172. package/phanpy/dist/assets/catch-up-O5q5C75Z.png +0 -0
  173. package/phanpy/dist/assets/chunk-aKtaBQYM.js +0 -1
  174. package/phanpy/dist/assets/compose-CFEx7wb4.js +0 -2
  175. package/phanpy/dist/assets/compose-CFEx7wb4.js.map +0 -1
  176. package/phanpy/dist/assets/compose-ZJN5xSb4.js +0 -35
  177. package/phanpy/dist/assets/compose-ZJN5xSb4.js.map +0 -1
  178. package/phanpy/dist/assets/debug.module-YFQgwnIr.js +0 -52
  179. package/phanpy/dist/assets/debug.module-YFQgwnIr.js.map +0 -1
  180. package/phanpy/dist/assets/dom-p1YcJ5Rw.js +0 -2
  181. package/phanpy/dist/assets/dom-p1YcJ5Rw.js.map +0 -1
  182. package/phanpy/dist/assets/home-mobile-dark@2x-Dc-J8-SM.png +0 -0
  183. package/phanpy/dist/assets/home-mobile-light@2x-Bd3fod8m.png +0 -0
  184. package/phanpy/dist/assets/home-tablet-dark@2x-BgcNI8le.png +0 -0
  185. package/phanpy/dist/assets/home-tablet-light@2x-BW2RV9T6.png +0 -0
  186. package/phanpy/dist/assets/icons/add-circle-line-WD0mwORD.js +0 -1
  187. package/phanpy/dist/assets/icons/alert-line-CpFUMf9s.js +0 -1
  188. package/phanpy/dist/assets/icons/android-2-line-Bzxnrd3S.js +0 -1
  189. package/phanpy/dist/assets/icons/announcement-line-5nwaJFJm.js +0 -1
  190. package/phanpy/dist/assets/icons/arrow-down-circle-line-a7Id9-Iv.js +0 -1
  191. package/phanpy/dist/assets/icons/arrow-down-line-B8uzXzq6.js +0 -1
  192. package/phanpy/dist/assets/icons/arrow-left-line-CGrGT9C-.js +0 -1
  193. package/phanpy/dist/assets/icons/arrow-right-line-CE-HERfX.js +0 -1
  194. package/phanpy/dist/assets/icons/arrow-to-up-line-CvdQjmcy.js +0 -1
  195. package/phanpy/dist/assets/icons/arrow-up-circle-line-DEparSNF.js +0 -1
  196. package/phanpy/dist/assets/icons/arrow-up-line-C7yBeugc.js +0 -1
  197. package/phanpy/dist/assets/icons/arrows-right-line-BtbXmJGP.js +0 -1
  198. package/phanpy/dist/assets/icons/at-line-CF66Bznk.js +0 -1
  199. package/phanpy/dist/assets/icons/attachment-line-BY8It-l9.js +0 -1
  200. package/phanpy/dist/assets/icons/blockquote-line-BS6pU_hm.js +0 -1
  201. package/phanpy/dist/assets/icons/board-line-C0UWXyA6.js +0 -1
  202. package/phanpy/dist/assets/icons/bookmark-line-1CtX5JLF.js +0 -1
  203. package/phanpy/dist/assets/icons/building-5-line-Dd59MzbO.js +0 -1
  204. package/phanpy/dist/assets/icons/bus-2-line-6_dvA0GG.js +0 -1
  205. package/phanpy/dist/assets/icons/calendar-day-line-Crpl_fmu.js +0 -1
  206. package/phanpy/dist/assets/icons/calendar-month-line-vommts2C.js +0 -1
  207. package/phanpy/dist/assets/icons/calendar-time-add-line-BU_DTlQk.js +0 -1
  208. package/phanpy/dist/assets/icons/camera-line-Cv69MEei.js +0 -1
  209. package/phanpy/dist/assets/icons/celebrate-line-B8DvIoi0.js +0 -1
  210. package/phanpy/dist/assets/icons/chart-bar-line-FK-QOmtF.js +0 -1
  211. package/phanpy/dist/assets/icons/chart-line-line-BGcJAFWw.js +0 -1
  212. package/phanpy/dist/assets/icons/chat-3-line-YFK2-hwz.js +0 -1
  213. package/phanpy/dist/assets/icons/check-circle-line-DsAxFr5-.js +0 -1
  214. package/phanpy/dist/assets/icons/clipboard-line-BBp364gJ.js +0 -1
  215. package/phanpy/dist/assets/icons/close-circle-line-CICdiuGz.js +0 -1
  216. package/phanpy/dist/assets/icons/close-line-DYrFWcjv.js +0 -1
  217. package/phanpy/dist/assets/icons/cloud-line-tiQAbah8.js +0 -1
  218. package/phanpy/dist/assets/icons/code-line-fAl8iiV3.js +0 -1
  219. package/phanpy/dist/assets/icons/comment-2-line-CR3g7WeB.js +0 -1
  220. package/phanpy/dist/assets/icons/copy-2-line-CLW69yF5.js +0 -1
  221. package/phanpy/dist/assets/icons/delete-2-line-B8xmbr4n.js +0 -1
  222. package/phanpy/dist/assets/icons/document-3-line-DBGNhAg2.js +0 -1
  223. package/phanpy/dist/assets/icons/document-line-C7mb9sb7.js +0 -1
  224. package/phanpy/dist/assets/icons/down-line-BGqSSThd.js +0 -1
  225. package/phanpy/dist/assets/icons/edit-4-line-DcgGaEhx.js +0 -1
  226. package/phanpy/dist/assets/icons/emoji-2-line-D8YgnM-y.js +0 -1
  227. package/phanpy/dist/assets/icons/exit-line-Dc07BS-x.js +0 -1
  228. package/phanpy/dist/assets/icons/external-link-line-BvpSkmjO.js +0 -1
  229. package/phanpy/dist/assets/icons/eye-2-line-CiWXx-f_.js +0 -1
  230. package/phanpy/dist/assets/icons/eye-close-line-BgTaSJ4P.js +0 -1
  231. package/phanpy/dist/assets/icons/filter-2-line-B_mR2usy.js +0 -1
  232. package/phanpy/dist/assets/icons/filter-line-C_nm-3cU.js +0 -1
  233. package/phanpy/dist/assets/icons/flag-1-line-C2HB05I0.js +0 -1
  234. package/phanpy/dist/assets/icons/forbid-circle-line-D3LTT9yd.js +0 -1
  235. package/phanpy/dist/assets/icons/formula-line-DLrt2d6j.js +0 -1
  236. package/phanpy/dist/assets/icons/grid-line-CgUmEikf.js +0 -1
  237. package/phanpy/dist/assets/icons/group-line-C5fnX0wU.js +0 -1
  238. package/phanpy/dist/assets/icons/hand-finger-2-line-BGgxbuL9.js +0 -1
  239. package/phanpy/dist/assets/icons/hashtag-line-CyTEEXBb.js +0 -1
  240. package/phanpy/dist/assets/icons/heart-crack-line-BZddbO2C.js +0 -1
  241. package/phanpy/dist/assets/icons/heart-line-CJ7K47J4.js +0 -1
  242. package/phanpy/dist/assets/icons/history-2-line-kWWvFzqv.js +0 -1
  243. package/phanpy/dist/assets/icons/history-line-bGQiwbTH.js +0 -1
  244. package/phanpy/dist/assets/icons/home-3-line-fRU1zeLG.js +0 -1
  245. package/phanpy/dist/assets/icons/information-line-iNk6-sOY.js +0 -1
  246. package/phanpy/dist/assets/icons/keyboard-line-DsCyuQNz.js +0 -1
  247. package/phanpy/dist/assets/icons/layout-4-line-CZkOX52Z.js +0 -1
  248. package/phanpy/dist/assets/icons/layout-5-line-B_znt5wO.js +0 -1
  249. package/phanpy/dist/assets/icons/left-line-eUw0tya4.js +0 -1
  250. package/phanpy/dist/assets/icons/lightning-line-DaKoDdix.js +0 -1
  251. package/phanpy/dist/assets/icons/link-2-line-DCqLmMA7.js +0 -1
  252. package/phanpy/dist/assets/icons/list-check-line-BAxosBh9.js +0 -1
  253. package/phanpy/dist/assets/icons/lock-line-CPoaXeUW.js +0 -1
  254. package/phanpy/dist/assets/icons/mail-line-B0P8aa1L.js +0 -1
  255. package/phanpy/dist/assets/icons/moon-line-CEqNAToP.js +0 -1
  256. package/phanpy/dist/assets/icons/more-1-fill-Dw2e5xab.js +0 -1
  257. package/phanpy/dist/assets/icons/more-3-line-BIiVjYTz.js +0 -1
  258. package/phanpy/dist/assets/icons/notification-line-BZZq2Gtu.js +0 -1
  259. package/phanpy/dist/assets/icons/pencil-line-CKh8-A1v.js +0 -1
  260. package/phanpy/dist/assets/icons/photo-album-line-Bnfg2u40.js +0 -1
  261. package/phanpy/dist/assets/icons/pin-line-DpTolyhs.js +0 -1
  262. package/phanpy/dist/assets/icons/play-fill-B0-G_8lX.js +0 -1
  263. package/phanpy/dist/assets/icons/qrcode-2-line-B6SPCaHn.js +0 -1
  264. package/phanpy/dist/assets/icons/quill-pen-line-B6LUrnCP.js +0 -1
  265. package/phanpy/dist/assets/icons/quote-left-fill-hQZ1cj_6.js +0 -1
  266. package/phanpy/dist/assets/icons/radar-line-CKyroTth.js +0 -1
  267. package/phanpy/dist/assets/icons/react-line-CoIKhhtK.js +0 -1
  268. package/phanpy/dist/assets/icons/refresh-2-line-D0mTF97S.js +0 -1
  269. package/phanpy/dist/assets/icons/right-line-B3KWJaqc.js +0 -1
  270. package/phanpy/dist/assets/icons/rocket-line-4KZl537D.js +0 -1
  271. package/phanpy/dist/assets/icons/round-fill-C69NTrZ0.js +0 -1
  272. package/phanpy/dist/assets/icons/round-line-B9k_1uo-.js +0 -1
  273. package/phanpy/dist/assets/icons/route-line-B28ReHcE.js +0 -1
  274. package/phanpy/dist/assets/icons/rows-4-line-CrBniagM.js +0 -1
  275. package/phanpy/dist/assets/icons/scan-line-DSf74YdP.js +0 -1
  276. package/phanpy/dist/assets/icons/search-2-line-B6geIU1z.js +0 -1
  277. package/phanpy/dist/assets/icons/settings-3-line-azJwK47w.js +0 -1
  278. package/phanpy/dist/assets/icons/settings-6-line-C_5zc5YR.js +0 -1
  279. package/phanpy/dist/assets/icons/share-2-line-D5MxWjrm.js +0 -1
  280. package/phanpy/dist/assets/icons/share-forward-line-Cp61fZzZ.js +0 -1
  281. package/phanpy/dist/assets/icons/sparkles-2-line-DYYyXTaW.js +0 -1
  282. package/phanpy/dist/assets/icons/sparkles-line-C2hY1s6I.js +0 -1
  283. package/phanpy/dist/assets/icons/time-line-BF3eet1v.js +0 -1
  284. package/phanpy/dist/assets/icons/transfer-4-line-oisfvTBw.js +0 -1
  285. package/phanpy/dist/assets/icons/translate-line-BFWol2Ce.js +0 -1
  286. package/phanpy/dist/assets/icons/unlock-line-X_x5vwv3.js +0 -1
  287. package/phanpy/dist/assets/icons/upload-3-line-DgzwUJeW.js +0 -1
  288. package/phanpy/dist/assets/icons/user-4-line-BVSynZCp.js +0 -1
  289. package/phanpy/dist/assets/icons/user-add-2-line-BlGS5Q8q.js +0 -1
  290. package/phanpy/dist/assets/icons/user-add-line-BbXdHG4z.js +0 -1
  291. package/phanpy/dist/assets/icons/user-edit-line-BFAHOV0X.js +0 -1
  292. package/phanpy/dist/assets/icons/user-follow-line-BXux0wSd.js +0 -1
  293. package/phanpy/dist/assets/icons/user-star-line-DdYlpHLU.js +0 -1
  294. package/phanpy/dist/assets/icons/user-warning-line-Cj43j0_E.js +0 -1
  295. package/phanpy/dist/assets/icons/user-x-line-DIDgNlPH.js +0 -1
  296. package/phanpy/dist/assets/icons/volume-line-Bs390KQt.js +0 -1
  297. package/phanpy/dist/assets/icons/volume-mute-line-DzlzIqFZ.js +0 -1
  298. package/phanpy/dist/assets/icons/walk-line-yNXfB-md.js +0 -1
  299. package/phanpy/dist/assets/icons/world-2-line-CenkGIwj.js +0 -1
  300. package/phanpy/dist/assets/icons/zoom-in-line-CaENUphf.js +0 -1
  301. package/phanpy/dist/assets/icons/zoom-out-line-BDNk0EWo.js +0 -1
  302. package/phanpy/dist/assets/instances-BNPptnn-.json +0 -333
  303. package/phanpy/dist/assets/locales/ar-SA-CfheRbCu.js +0 -1
  304. package/phanpy/dist/assets/locales/ca-ES-DHRW86Tz.js +0 -1
  305. package/phanpy/dist/assets/locales/cs-CZ-CKoqEuA1.js +0 -1
  306. package/phanpy/dist/assets/locales/de-DE-ByRPMRFy.js +0 -1
  307. package/phanpy/dist/assets/locales/eo-UY-CPC7wLCS.js +0 -1
  308. package/phanpy/dist/assets/locales/es-ES-dJa0Fd9t.js +0 -1
  309. package/phanpy/dist/assets/locales/eu-ES-C3djlPR2.js +0 -1
  310. package/phanpy/dist/assets/locales/fa-IR-DTT490Ck.js +0 -1
  311. package/phanpy/dist/assets/locales/fi-FI-B23MCPuz.js +0 -1
  312. package/phanpy/dist/assets/locales/fr-FR-BcaQsO5C.js +0 -1
  313. package/phanpy/dist/assets/locales/gl-ES-BR-CVKBN.js +0 -1
  314. package/phanpy/dist/assets/locales/he-IL-CfheRbCu.js +0 -1
  315. package/phanpy/dist/assets/locales/hu-HU-CfheRbCu.js +0 -1
  316. package/phanpy/dist/assets/locales/it-IT-C1136UFV.js +0 -1
  317. package/phanpy/dist/assets/locales/ja-JP-CRZmRAhD.js +0 -1
  318. package/phanpy/dist/assets/locales/kab-Cz8xH_TT.js +0 -1
  319. package/phanpy/dist/assets/locales/ko-KR-CG9UiY4o.js +0 -1
  320. package/phanpy/dist/assets/locales/lt-LT-CJcI6sHZ.js +0 -1
  321. package/phanpy/dist/assets/locales/nb-NO-CfheRbCu.js +0 -1
  322. package/phanpy/dist/assets/locales/nl-NL-DxN4Yc1t.js +0 -1
  323. package/phanpy/dist/assets/locales/oc-FR-CfheRbCu.js +0 -1
  324. package/phanpy/dist/assets/locales/pl-PL-DkwGXf6P.js +0 -1
  325. package/phanpy/dist/assets/locales/pseudo-LOCALE-CQ4XxkQ0.js +0 -1
  326. package/phanpy/dist/assets/locales/pt-BR-nGL0HdFS.js +0 -1
  327. package/phanpy/dist/assets/locales/pt-PT-Cp17aj2z.js +0 -1
  328. package/phanpy/dist/assets/locales/ru-RU-0Y8cIoaK.js +0 -1
  329. package/phanpy/dist/assets/locales/th-TH-CfheRbCu.js +0 -1
  330. package/phanpy/dist/assets/locales/tok-CfheRbCu.js +0 -1
  331. package/phanpy/dist/assets/locales/tr-TR-CfheRbCu.js +0 -1
  332. package/phanpy/dist/assets/locales/uk-UA-C5E3dFBf.js +0 -1
  333. package/phanpy/dist/assets/locales/zh-CN-BHJi7_et.js +0 -1
  334. package/phanpy/dist/assets/locales/zh-TW-CfheRbCu.js +0 -1
  335. package/phanpy/dist/assets/main-BdqNbG-a.js +0 -26
  336. package/phanpy/dist/assets/main-BdqNbG-a.js.map +0 -1
  337. package/phanpy/dist/assets/mock-home-DGhR__He.js +0 -2
  338. package/phanpy/dist/assets/mock-home-DGhR__He.js.map +0 -1
  339. package/phanpy/dist/assets/multi-column-ROck0NVt.jpg +0 -0
  340. package/phanpy/dist/assets/multi-hashtag-timeline-DH5INVHi.jpg +0 -0
  341. package/phanpy/dist/assets/nested-comments-thread-hv59kZLc.jpg +0 -0
  342. package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js +0 -2
  343. package/phanpy/dist/assets/polyfill-force-H8sUkLGp.js.map +0 -1
  344. package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js +0 -20
  345. package/phanpy/dist/assets/pwa-viewport-ogKbF51K.js.map +0 -1
  346. package/phanpy/dist/assets/style-B1iLPTPR.css +0 -2
  347. package/phanpy/dist/assets/temml-DuyIQMei.js +0 -97
  348. package/phanpy/dist/assets/temml-DuyIQMei.js.map +0 -1
  349. package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js +0 -2
  350. package/phanpy/dist/assets/tinyld.light.node-DtbBhLYC.js.map +0 -1
  351. package/phanpy/dist/assets/year-in-posts-B2lywqdx.png +0 -0
  352. package/phanpy/dist/assets/year-in-posts-DJv_star.js +0 -3
  353. package/phanpy/dist/assets/year-in-posts-DJv_star.js.map +0 -1
  354. package/phanpy/dist/compose/index.html +0 -20
  355. package/phanpy/dist/favicon.ico +0 -0
  356. package/phanpy/dist/index.html +0 -73
  357. package/phanpy/dist/logo-192.png +0 -0
  358. package/phanpy/dist/logo-512.png +0 -0
  359. package/phanpy/dist/logo-badge-72.png +0 -0
  360. package/phanpy/dist/logo-maskable-512.png +0 -0
  361. package/phanpy/dist/logo-monochrome-512.png +0 -0
  362. package/phanpy/dist/logo-monochrome-maskable-512.png +0 -0
  363. package/phanpy/dist/manifest.webmanifest +0 -1
  364. package/phanpy/dist/og-image-2.jpg +0 -0
  365. package/phanpy/dist/og-image.png +0 -0
  366. package/phanpy/dist/robots.txt +0 -2
  367. package/phanpy/dist/sw.js +0 -2
  368. package/phanpy/dist/sw.js.map +0 -1
  369. package/phanpy/dist/version.json +0 -1
  370. package/run-agent.mjs +0 -899
  371. package/vendor/gate.cjs +0 -138
  372. package/vendor/idp-grant.cjs +0 -394
  373. package/vendor/jfetch.cjs +0 -16
  374. package/web/admin/actors.js +0 -147
  375. package/web/admin/bar.css +0 -126
  376. package/web/admin/bar.js +0 -99
  377. package/web/admin/client/client.js +0 -66
  378. package/web/admin/client/index.html +0 -69
  379. package/web/admin/client-pick.js +0 -79
  380. package/web/admin/common.js +0 -23
  381. package/web/admin/connections.js +0 -112
  382. package/web/admin/gateway.js +0 -133
  383. package/web/admin/group.js +0 -258
  384. package/web/admin/index.html +0 -612
  385. package/web/admin/notices-bar.js +0 -90
  386. package/web/admin/oauth-signin.mjs +0 -37
  387. package/web/admin/record.js +0 -393
  388. package/web/admin/setup/index.html +0 -257
  389. package/web/admin/setup/setup.js +0 -339
  390. package/web/admin/tokens.css +0 -68
  391. package/web/admin/upkeep.js +0 -177
  392. package/web/admin/window.css +0 -55
  393. package/web/admin/window.js +0 -136
  394. package/web/app/README.md +0 -81
  395. package/web/app/admin-facade.mjs +0 -588
  396. package/web/app/agent.mjs +0 -672
  397. package/web/app/atproto-browser.mjs +0 -86
  398. package/web/app/authorize_interaction.html +0 -56
  399. package/web/app/authorize_interaction.js +0 -69
  400. package/web/app/boot.mjs +0 -616
  401. package/web/app/deliver-relay.mjs +0 -129
  402. package/web/app/dist/boot.js +0 -34562
  403. package/web/app/dist/boot.js.map +0 -7
  404. package/web/app/dist/sw.js +0 -73456
  405. package/web/app/dist/sw.js.map +0 -7
  406. package/web/app/fediacct-browser.mjs +0 -146
  407. package/web/app/gateway-move.mjs +0 -60
  408. package/web/app/idb-kv.mjs +0 -35
  409. package/web/app/index.html +0 -258
  410. package/web/app/keys-browser.mjs +0 -71
  411. package/web/app/keystore.mjs +0 -82
  412. package/web/app/oidc-session.mjs +0 -6
  413. package/web/app/pod-auth.mjs +0 -248
  414. package/web/app/pod-remote.mjs +0 -84
  415. package/web/app/shims/_globals.mjs +0 -2
  416. package/web/app/shims/fedify-sig.mjs +0 -77
  417. package/web/app/shims/node-crypto.mjs +0 -113
  418. package/web/app/shims/node-fs.mjs +0 -17
  419. package/web/app/shims/node-path.mjs +0 -19
  420. package/web/app/shims/node-url.mjs +0 -7
  421. package/web/app/shims/prelude.js +0 -58
  422. package/web/app/shims/safefetch.mjs +0 -58
  423. package/web/app/shims/shapes-text.mjs +0 -8
  424. package/web/app/shims/web-push.mjs +0 -14
  425. package/web/app/signup.mjs +0 -357
  426. package/web/app/sw-src.mjs +0 -220
  427. package/web/app/update.js +0 -70
  428. package/web/front/admin.html +0 -55
  429. package/web/front/admin.js +0 -89
  430. package/web/front/install.sh +0 -69
  431. package/web/front/new-account.html +0 -35
  432. package/web/front/new-account.js +0 -13
  433. package/web/front/notices.html +0 -69
  434. package/web/front/notices.js +0 -107
  435. package/web/front/run.html +0 -64
  436. package/web/front/run.js +0 -221
  437. package/web/front/solid-oidc-client.js +0 -6
  438. package/web/icons/forum.svg +0 -11
  439. package/web/icons/gateway.svg +0 -14
  440. package/web/icons/local.svg +0 -11
@@ -1,612 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>FediPod — record</title>
7
- <link rel="icon" href="/icons/local.svg" type="image/svg+xml">
8
- <link rel="stylesheet" href="tokens.css">
9
- <style>
10
- /* Colours are the shared tokens (tokens.css, the front's palette), so the
11
- record, the front and the bar are one visual system; only the layout root —
12
- the base scale and the bar's column — stays here. Controls share one look: a
13
- field is a light well with a drawn chevron, a button is the front's filled
14
- green. */
15
- :root { color-scheme: light dark; font-size: 125%; --bar-col: 1280px; }
16
- /* The page itself never scrolls: the body is exactly the window; the content
17
- column beside the rail is the scroll container. */
18
- html { height: 100%; }
19
- body { font: 1rem/1.5 Arial, Helvetica, sans-serif; margin: 0; height: 100dvh;
20
- box-sizing: border-box; display: flex; flex-direction: column; overflow: hidden; }
21
- /* The bar spans the window; the rail and the content column share one centred
22
- column underneath it — wide enough that the content keeps 960 of its own
23
- beside the expanded rail. */
24
- #page { flex: 1 1 auto; min-height: 0; width: 100%; max-width: 1280px; margin: 0 auto;
25
- padding: 1.25rem 1rem 1rem; box-sizing: border-box;
26
- display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 1.25rem; }
27
- #content { min-width: 0; min-height: 0; overflow-y: auto; }
28
- /* Two cases where the page may grow past the window: the new-account form, and
29
- a group console, whose lists have no bound. Both scroll on the window. */
30
- body.adding, body.group { height: auto; min-height: 100dvh; overflow: auto; }
31
- body.adding #page { display: block; }
32
- body.adding #content, body.group #content { overflow: visible; min-height: auto; }
33
- body.group #page { min-height: auto; }
34
- body.adding #rail { display: none; }
35
- /* The action rail: a raised card of everything you can DO, so the facts keep
36
- the page. Collapsed it is a slim strip holding only the toggle arrow. */
37
- #rail { width: 14.5rem; box-sizing: border-box; padding: .6rem .8rem .9rem;
38
- align-self: start; max-height: 100%; overflow-y: auto;
39
- background: var(--raised); border-radius: .5rem; }
40
- #rail.closed { width: auto; padding: .4rem; }
41
- #rail.closed .rail-groups { display: none; }
42
- #rail-toggle { display: flex; align-items: center; justify-content: flex-end;
43
- width: 100%; margin: 0; padding: .2rem .3rem; border: 0;
44
- background: none; font: inherit; font-weight: 600; color: var(--heading);
45
- cursor: pointer; border-radius: .3rem; }
46
- #rail-toggle:hover, #rail-toggle:active { background: none; }
47
- .rail-arrow { color: var(--link); }
48
- .rail-group h2 { display: block; font-size: .9rem; font-weight: 600;
49
- text-transform: uppercase; letter-spacing: .06em; margin: .9rem 0 .35rem; }
50
- .rail-group button { display: block; width: 100%; text-align: left;
51
- margin: .35rem 0; font-size: .95rem; padding: .35rem .7rem; font-weight: 400; }
52
- .rail-group .apart { margin-top: 1rem; }
53
- /* One column on a phone: the rail becomes a strip of pills above the facts. */
54
- @media (max-width: 47rem) {
55
- #page { display: flex; flex-direction: column; gap: .9rem; }
56
- #rail { width: auto; max-height: none; overflow: visible; }
57
- .rail-group { display: flex; flex-wrap: wrap; align-items: baseline; gap: .1rem .45rem; }
58
- .rail-group h2 { flex: 0 0 100%; margin: .5rem 0 .1rem; }
59
- .rail-group button { display: inline-block; width: auto; margin: .2rem 0; }
60
- #content { flex: 1 1 auto; }
61
- }
62
- /* `hidden` is a UA rule, so ANY author `display` beats it — `dl { display: grid }`
63
- left the facts on screen with the attribute set. Everything here toggles with
64
- `hidden`, so it has to outrank them all. */
65
- [hidden] { display: none !important; }
66
- /* The two status regions are never `hidden`: a live region put into the
67
- accessibility tree in the same task as its text does not reliably announce,
68
- so they stay in it and disappear by being empty instead. */
69
- #say:empty, #fatal:empty { display: none; }
70
- h1, h2, h3 { color: var(--heading); }
71
- a { color: var(--link); }
72
- h2, h3 { font-size: 1.15rem; font-weight: 600; display: flex; flex-wrap: wrap;
73
- align-items: baseline; gap: .6rem; }
74
- h2 { margin: 1.5rem 0 .5rem; }
75
- h3 { margin: 1.25rem 0 .35rem; }
76
- #facts { margin: .75rem 0 0; }
77
- /* They sit after the kind, on that row, so they need a gap from the word and
78
- must not stretch the row's line height. */
79
- #moderation { margin-left: .6rem; word-break: normal; }
80
- #moderation label { display: inline; margin: 0 .3rem 0 .5rem; font-weight: normal; color: var(--muted); }
81
- p { margin: .5rem 0; }
82
- .sub { color: var(--muted); margin-top: 0; }
83
- fieldset { border: 1px solid var(--line); border-radius: .4rem; margin: 1rem 0; padding: .75rem 1rem 1rem; }
84
- legend { padding: 0 .3rem; font-weight: 600; color: var(--heading); }
85
- label { display: block; margin: .75rem 0 .2rem; }
86
- .hint { color: var(--muted); font-size: 1rem; margin: .15rem 0 0; }
87
- .choice input[type=text] { width: 9ch; display: inline-block; padding: .15rem .3rem; }
88
- /* SETTINGS: light wells, unmistakably fields, in both schemes. */
89
- input[type=text], input[type=email], input[type=url], input[type=password], textarea {
90
- font: inherit; width: 100%; padding: .5rem; box-sizing: border-box;
91
- border: 1px solid var(--field-edge); border-radius: .3rem;
92
- background: var(--field-bg); color: var(--ink); }
93
- input::placeholder { color: var(--muted); opacity: 1; }
94
- select { font: inherit; appearance: none; max-width: 100%; min-width: 0;
95
- padding: .15rem 1.7rem .15rem .55rem;
96
- border: 1px solid var(--field-edge); border-radius: .3rem;
97
- color: var(--ink); cursor: pointer;
98
- background-color: var(--field-bg); background-image: var(--chevron);
99
- background-repeat: no-repeat; background-position: right .55rem center;
100
- background-size: .6rem auto; }
101
- select:hover { background-color: var(--field-bg-hover); }
102
- /* ACTIONS: the front's filled-green button, one look for the whole page,
103
- Retire included — the typed-handle confirm, not a colour, is what guards the
104
- destructive ones. */
105
- button { font: inherit; padding: .45rem 1rem; border-radius: .3rem; border: 1px solid var(--btn);
106
- background: var(--btn); color: var(--btn-text); cursor: pointer; }
107
- button:hover, button:active { background: var(--btn-hover); border-color: var(--btn-hover); }
108
- button.primary { font-weight: 600; }
109
- button:disabled { opacity: .55; cursor: default; }
110
- /* Small buttons that sit in a line of text. */
111
- button.inline { font-size: .9rem; padding: .15rem .6rem; font-weight: 400; }
112
- /* One visible ring for everything focusable. */
113
- :is(button, select, input, textarea, a):focus-visible {
114
- outline: 2px solid var(--ring); outline-offset: 2px; }
115
- dl { margin: .5rem 0; } /* grid only above 34rem — see the media query below */
116
- @media (min-width: 34rem) {
117
- dl { display: grid; grid-template-columns: max-content minmax(0, 1fr);
118
- gap: .6rem .9rem; align-items: baseline; }
119
- }
120
- dt { color: var(--muted); }
121
- /* An identity connected under "Other identities" belongs to the row above it,
122
- and the indent is what says so. */
123
- dt.under { padding-left: 1.25rem; }
124
- dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
125
- .rows { list-style: none; padding: 0; margin: .3rem 0; }
126
- .rows li { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center;
127
- padding: .4rem 0; border-top: 1px solid var(--line); }
128
- .rows li span { flex: 1 1 18rem; overflow-wrap: anywhere; }
129
- .muted { color: var(--muted); }
130
- /* The actors dropdown rides the bar, at the bar's own text scale. */
131
- #bar select { font-size: .95rem; }
132
- /* The per-account Options disclosure: only where storage is not a real choice
133
- (the Node agent's Bluesky, cross-post instead) — a summary opening
134
- Show/Hide in Feed, Cross-post On/Off, Connected/Disconnect. Where storage
135
- IS a choice, two dropdowns sit in the row directly instead (admin.js
136
- connectionControls). */
137
- details.opts { display: inline-block; }
138
- details.opts > summary { cursor: pointer; color: var(--link); list-style: none; }
139
- details.opts > summary::-webkit-details-marker { display: none; }
140
- details.opts > summary::after { content: ' \25be'; }
141
- details.opts[open] > summary::after { content: ' \25b4'; }
142
- details.opts > div { margin: .4rem 0 .2rem; padding: .5rem .6rem; display: flex; flex-direction: column;
143
- gap: .4rem; align-items: stretch; border: 1px solid var(--line); border-radius: .3rem;
144
- background: var(--raised); min-width: 11rem; }
145
- details.opts > div select { width: 100%; }
146
- .opt-hint { color: var(--muted); font-size: .9rem; margin: -.1rem 0 .1rem; }
147
- /* The connection and storage dropdowns that sit in the row itself (admin.js
148
- connectionControls) — extra room from the account name before them. */
149
- .conn-controls { display: inline-flex; align-items: center; gap: .4rem; margin-left: 1rem; }
150
- /* The alias row inside the Transfer-an-account-here panel. */
151
- #alias-ctl { display: flex; gap: .5rem; align-items: center; margin-top: .3rem; }
152
- #alias-ctl input { flex: 1 1 12rem; width: auto; }
153
- #alias-chips span { display: inline-flex; align-items: center; gap: .35rem;
154
- border: 1px solid var(--btn-edge); border-radius: 999px;
155
- padding: .05rem .25rem .05rem .75rem; margin: 0 .3rem .3rem 0; }
156
- /* Radios read as one line each: label { display: block } alone drops the text
157
- below the control. */
158
- .choice { display: block; margin: .35rem 0; font-weight: normal; }
159
- .choice input { width: auto; margin-right: .4rem; }
160
- .warn { border-left: .25rem solid var(--warn); padding-left: .75rem; }
161
- .err { border-left: .25rem solid var(--danger); padding-left: .75rem; color: var(--danger); }
162
- .ok { border-left: .25rem solid var(--ok); padding-left: .75rem; }
163
- pre { overflow-x: auto; background: #0001; padding: .6rem; border-radius: .3rem; font-size: .9rem; }
164
- @media (prefers-color-scheme: dark) {
165
- fieldset { border-color: #555; } .rows li { border-color: #444; }
166
- }
167
- </style>
168
- <link rel="stylesheet" href="bar.css?v=4">
169
- <link rel="stylesheet" href="window.css">
170
- </head>
171
- <body>
172
-
173
- <!-- The same bar the client view carries: one thing, two views. -->
174
- <nav id="bar" aria-label="Site">
175
- <h1 class="name">FediPod</h1>
176
- <select id="actor-pick" aria-label="Local actors"
177
- title=" Every actor on this machine; choosing one goes to its record"></select>
178
- <!-- The account group, styled like the client group beside it: one label,
179
- then the places to go. The browser build adds "sign out" to it. -->
180
- <span id="account-pick"><span id="account-now">account:</span>
181
- <a id="bar-fediverse" href="client/" title=" Open the client and read your timeline">visit</a>
182
- <a id="bar-manage" href="./" title=" The record: what this actor is, and what you can do to it" aria-current="page">manage</a>
183
- </span>
184
- <!-- Notices from whoever runs this site. Shown only when the site has any
185
- (notices-bar.js asks /api/notices); the count is how many are new here. -->
186
- <button type="button" id="bar-notices" hidden aria-haspopup="dialog" aria-controls="notices-list"
187
- title=" Notices from the operator of this site">&#128276;<span id="bar-notices-count" aria-live="polite"></span></button>
188
- </nav>
189
- <main id="page">
190
-
191
- <!-- Everything you can DO, in one collapsible card; the facts keep the page.
192
- The buttons are the same ones the two action rows used to hold — same
193
- ids, same floating panels. -->
194
- <nav id="rail" hidden aria-label="Actions">
195
- <button type="button" id="rail-toggle" aria-expanded="true" aria-label="Actions"
196
- title=" Hide the action panel"><span class="rail-arrow" aria-hidden="true">«</span></button>
197
- <div class="rail-groups">
198
- <section class="rail-group" aria-label="Upkeep">
199
- <h2>Upkeep</h2>
200
- <button id="do-drain" title=" Fetch and handle whatever is waiting in the inbox now">Drain the inbox</button>
201
- <button id="do-rebuild" title=" Put back posts this machine lost, from what the pod still holds">Recover posts</button>
202
- <button id="do-log" title=" This agent's recent log lines">Show the log</button>
203
- <button id="do-deadletter" title=" Deliveries that failed for good and were set aside">Show dead letters</button>
204
- </section>
205
- <section class="rail-group" aria-label="Lifecycle">
206
- <h2>Lifecycle</h2>
207
- <button id="do-rotate-key" title=" Replace the signing key and tell other servers the new one" data-confirm="rotate-key">Rotate signing key</button>
208
- <button id="do-transfer-in" title=" List an old account as an alias, so its server sends its followers here">Transfer an account here</button>
209
- <button id="do-move" title=" Your followers go to the account you name; this handle keeps resolving as a redirect" data-confirm="move">Transfer this account away</button>
210
- <button id="do-retire" title=" End this identity for good — a Delete, then a Tombstone" class="danger apart" data-confirm="retire">Retire identity</button>
211
- </section>
212
- </div>
213
- </nav>
214
-
215
- <div id="content">
216
- <p class="err" id="fatal" role="alert"></p>
217
- <p aria-live="polite" id="say"></p>
218
-
219
- <!-- Every actor running on this machine. A stopped one is left out: there is
220
- no page there to open. Plain links — a top-level navigation sends no
221
- Origin, so each agent's own firewall lets it through. -->
222
- <section id="pane-others" aria-label="Actors on this machine" hidden>
223
- <!-- Everything setup cannot work without. The bio, avatar and UI password it
224
- also offers are all changeable afterwards, so they are not asked here —
225
- the fuller form is what the new actor opens on. -->
226
- <form id="new-actor-form" hidden>
227
- <fieldset>
228
- <legend>What kind of Actor?</legend>
229
- <label class="choice"><input type="radio" name="newKind" value="person" checked>
230
- A <strong>person</strong> — an account you read and post from</label>
231
- <label class="choice"><input type="radio" name="newKind" value="group">
232
- A <strong>group</strong> of Fediverse users you manage</label>
233
- </fieldset>
234
-
235
- <fieldset>
236
- <legend>Actor's Handle</legend>
237
- <label for="new-handle">Handle</label>
238
- <input type="text" id="new-handle" autocomplete="off"
239
- placeholder="handle part of Fediverse address: @HANDLE@server"
240
- aria-describedby="new-handle-hint">
241
- <p class="hint" id="new-handle-hint">The name in your Fediverse address. This is permanent.
242
- Letters, digits, hyphens, and underscores only.</p>
243
- </fieldset>
244
-
245
- <fieldset>
246
- <legend>Actor's Pod</legend>
247
- <label class="choice"><input type="radio" name="newMode" value="new" checked>
248
- Create a Solid account and pod for the Actor</label>
249
- <label class="choice"><input type="radio" name="newMode" value="existing">
250
- Use a pod I already have</label>
251
-
252
- <label for="new-issuer">Solid identity provider</label>
253
- <input type="url" id="new-issuer" value="https://solidcommunity.net" autocomplete="url">
254
-
255
- <label for="new-email">Solid Account email/username</label>
256
- <input type="email" id="new-email" autocomplete="email" placeholder="you@example.org">
257
-
258
- <label for="new-password">Solid Account password</label>
259
- <input type="password" id="new-password" autocomplete="current-password"
260
- aria-describedby="new-password-hint">
261
- <p class="hint" id="new-password-hint">Password is sent once in return for a credential which is stored locally.
262
- The password itself is never stored. You may revoke the credential without changing the
263
- password.</p>
264
-
265
- <div id="new-row-podname">
266
- <label for="new-podname">Pod name</label>
267
- <input type="text" id="new-podname" autocomplete="off" aria-describedby="new-podname-hint">
268
- <p class="hint" id="new-podname-hint">The subdomain of your pod address, it will become
269
- https://YOUR-POD-NAME.your-identity-provider</p>
270
- </div>
271
- <div id="new-row-pod" hidden>
272
- <label for="new-pod">Pod address</label>
273
- <input type="url" id="new-pod" autocomplete="url" placeholder="https://you.solidcommunity.net/">
274
- </div>
275
- <label for="new-container">Store your data in a container named fedipod, inside this container</label>
276
- <input type="text" id="new-container" autocomplete="off" spellcheck="false" placeholder="/"
277
- aria-describedby="new-container-hint">
278
- <p class="hint" id="new-container-hint">Leave it empty for your pod's root. This is permanent.</p>
279
- <p id="new-typeindex-text">FediPod records where the account lives in your pod's public type index,
280
- the list Solid apps use to find your things. A new pod has none; setup stops if yours has none
281
- and you have not said yes here. It will be readable by anyone, like your profile.</p>
282
- <label class="choice"><input type="checkbox" id="new-createIndex" aria-describedby="new-typeindex-text">
283
- If my pod has no public type index, create one</label>
284
- </fieldset>
285
-
286
- <p>
287
- <button type="submit" id="new-actor-go" title=" Create the account, the pod and the actor" class="primary">Create</button>
288
- <button type="button" id="new-actor-cancel" title=" Change nothing and close">Cancel</button>
289
- </p>
290
- </form>
291
-
292
- </section>
293
-
294
- <section id="pane-identity" hidden>
295
- <dl id="facts"></dl>
296
- <!-- State documents the agent could not read on its last load, if any. -->
297
- <p class="err" id="state-skipped" role="alert" hidden></p>
298
- <!-- Declared here, and render() puts these on the kind row — the row they
299
- belong to is generated, so this is the only place they can be written
300
- down. Each reads as the setting it would change, so what it shows IS the
301
- current state: changing the word is the whole action, with no save. -->
302
- <span id="moderation" hidden>
303
- <label for="joins-mod">join requests</label>
304
- <select id="joins-mod" title=" Whether each join request waits for you">
305
- <option value="unmoderated">unmoderated</option>
306
- <option value="moderated">moderated</option>
307
- </select>
308
- <label for="review-mod">posts</label>
309
- <select id="review-mod" title=" Whether members’ posts wait for you">
310
- <option value="unmoderated">unmoderated</option>
311
- <option value="moderated">moderated</option>
312
- </select>
313
- </span>
314
- <span id="status-ctl" hidden>
315
- <select id="status-pick" aria-label="Actor status" title=" Whether this actor is receiving mail — parking stops it and keeps the handle; active re-follows the saved graph">
316
- <option value="active">active</option>
317
- <option value="parked">parked</option>
318
- </select>
319
- </span>
320
- <span id="update-ctl" hidden>
321
- <span id="update-word"></span>
322
- <button id="update-go" hidden title=" Pull the latest FediPod and restart every agent on this machine">Update</button>
323
- </span>
324
- <span id="follows-ctl" hidden>
325
- <select id="follows-pick" aria-label="New followers" title=" Whether each new follower waits for you — switch to accepted automatically before moving an old account here, so the whole wave lands">
326
- <option value="approve">wait for approval</option>
327
- <option value="auto">accepted automatically</option>
328
- </select>
329
- </span>
330
- <span id="ident-ctl" hidden>
331
- <button type="button" id="ident-open" class="inline" title=" Connect an account you hold on another network, so its timeline joins the one you read here">Connect an identity</button>
332
- </span>
333
- </section>
334
-
335
- <span id="gateway-ctl" hidden>
336
- <span id="gateway-word"></span>
337
- <button type="button" id="gateway-open-attach" class="inline" hidden
338
- title=" Attach this account to a mail-filtering gateway">Attach to a gateway</button>
339
- <button type="button" id="gateway-open-detach" class="inline danger" hidden
340
- title=" Go back to your pod's own inbox">Detach from gateway</button>
341
- <!-- Shown only when the agent reports the account's standing at the gateway
342
- (the browser build does; a DeviceAgent's admin does not). -->
343
- <button type="button" id="gateway-pause" class="inline" hidden
344
- title=" Stop keeping the posts sent to you until you resume; follows still arrive">Pause my account</button>
345
- <button type="button" id="gateway-resume" class="inline" hidden
346
- title=" Keep the posts sent to you again">Resume my account</button>
347
- <button type="button" id="gateway-close" class="inline danger" hidden data-confirm="close-address"
348
- title=" Close your address at this gateway for good; nothing on your pod is touched">Close this address</button>
349
- </span>
350
-
351
- <section id="pane-group" hidden>
352
- <!-- Both queues are consequences of a moderation setting: with the setting off
353
- nothing can ever arrive in them, so the heading would be a standing
354
- promise of a list that cannot fill. Shown only when the setting is on AND
355
- something is waiting. -->
356
- <div id="block-requests" hidden>
357
- <h3>Follow requests <span class="muted" id="requests-count"></span>
358
- <button id="admit-all" class="inline" title=" Accept everyone waiting, in one go">Accept all</button></h3>
359
- <ul class="rows" role="list" id="requests"></ul>
360
- </div>
361
-
362
- <div id="block-pending" hidden>
363
- <h3>Posts to review <span class="muted" id="pending-count"></span></h3>
364
- <ul class="rows" role="list" id="pending"></ul>
365
- </div>
366
-
367
- <!-- Moderation another server asked for. A delivery does not prove who sent
368
- it, so a moderator's request waits to be vouched for rather than acting
369
- on arrival. Shown only when something is actually waiting. -->
370
- <div id="block-modqueue" hidden>
371
- <h3>Moderation requests <span class="muted" id="modqueue-count"></span></h3>
372
- <p class="hint">Asked for by a moderator over the Fediverse. A delivery cannot prove who
373
- sent it, so nothing here has been acted on.</p>
374
- <ul class="rows" role="list" id="modqueue"></ul>
375
- </div>
376
-
377
- <h3>Members <span class="muted" id="members-count"></span></h3>
378
- <p class="hint">A group cannot force an unfollow. Muting is declining to carry; ejecting also
379
- tells their server it is no longer a member.</p>
380
- <ul class="rows" role="list" id="members"></ul>
381
-
382
- <h3>Carried <span class="muted" id="announced-count"></span></h3>
383
- <ul class="rows" role="list" id="announced"></ul>
384
- </section>
385
-
386
- <section id="pane-inbox" hidden>
387
- <h2><span class="hlabel">Inbox</span></h2>
388
- <p id="inbox-summary"></p>
389
- <p class="hint">Your pod accepts deliveries whether or not this agent is running, so a
390
- machine that has been off collects them. The agent is working through them oldest first
391
- and will get there on its own — this is only here if you would rather not wait.</p>
392
- <p>
393
- <button id="inbox-keep" title=" Keep everything and let the agent work through it">Keep everything</button>
394
- <label for="inbox-before">or discard content older than</label>
395
- <select id="inbox-before">
396
- <option value="7">7 days</option>
397
- <option value="30" selected>30 days</option>
398
- <option value="90">90 days</option>
399
- </select>
400
- <button id="inbox-prune" title=" Discard content older than the chosen age; keep the bookkeeping" class="primary">Discard it</button>
401
- </p>
402
- <p class="hint">Discarding drops posts, not bookkeeping: follows, unfollows, acceptances
403
- and deletions in that period are still applied, so your follower list stays right and
404
- nothing stays up that its author took down. What goes is the timeline you would have
405
- read that week.</p>
406
- <p class="err" id="inbox-warn" hidden></p>
407
- </section>
408
-
409
- <!-- Every form and panel is DECLARED here, inside the window that shows them.
410
- Nothing is built in script — window.js only unhides one at a time, moves
411
- the window and closes it. It floats rather than opening at the foot of the
412
- page, so it never pushes the line you are reading out from under you. -->
413
- <div id="win" hidden>
414
- <div id="win-bar"><span id="win-title"></span><button type="button" id="win-close" title=" Close this panel" aria-label="Close panel">✕</button></div>
415
- <div id="win-body">
416
- <pre id="output" tabindex="0" role="region" aria-label="Output" hidden></pre>
417
- <!-- The inbound half of transferring: the aliases its old server checks before
418
- it will send the Move. The outbound half is its own panel (confirm-form,
419
- warn-move) — additive and reversible here, followers handed away there,
420
- so the two directions never share a door. -->
421
- <div id="transfer-in-form" hidden>
422
- <p class="hint">List the old account here first — its server checks this list before it
423
- will send the move. Then start the transfer from the old account's own settings, and
424
- set new followers to "accepted automatically" so the whole wave lands.</p>
425
- <p id="alias-chips"></p>
426
- <span id="alias-ctl">
427
- <input type="text" id="alias-input" placeholder="@you@old.server" autocomplete="off"
428
- title=" The account you are moving here from; its server checks this list before it will send the Move">
429
- <button type="button" id="alias-add" class="inline"
430
- title=" Resolve the old account, list it in alsoKnownAs, and republish the actor">Add alias</button>
431
- </span>
432
- </div>
433
- <form id="bsky-form" hidden>
434
- <ol class="hint">
435
- <li>Get an account on Bluesky or another ATProto server.</li>
436
- <li>On Bluesky, make an app password (Settings → Privacy and security → App Passwords)
437
- and copy it — it is shown only once.</li>
438
- <li>Fill in this form to connect, pasting that app password into the password
439
- field.</li>
440
- </ol>
441
- <label for="bsky-service">service</label>
442
- <input type="url" id="bsky-service" value="https://bsky.social" autocomplete="off">
443
- <label for="bsky-identifier">handle</label>
444
- <input type="text" id="bsky-identifier" placeholder="you.bsky.social" autocomplete="username">
445
- <label for="bsky-password">app password</label>
446
- <input id="bsky-password" type="password" autocomplete="current-password">
447
- <p>
448
- <button id="bsky-connect" type="submit" class="primary" title=" Sign in to the Bluesky account with the app password">Connect</button>
449
- </p>
450
- </form>
451
- <form id="ident-form" hidden>
452
- <p class="hint">Either kind brings that account's timeline and notifications
453
- into the feed you read here, and acts as that account when you reply to,
454
- favourite or boost one of its posts.</p>
455
- <p>
456
- <button type="button" id="ident-pick-fedi" class="primary" title=" Sign in at a Mastodon-API server: Mastodon, GoToSocial, Pleroma, Akkoma, Pixelfed or Friendica">A Fediverse account</button>
457
- <button type="button" id="ident-pick-bsky" title=" Sign in to Bluesky or another ATProto server with an app password">A Bluesky account</button>
458
- </p>
459
- </form>
460
- <form id="fediacct-form" hidden>
461
- <ol class="hint">
462
- <li>Name the server your other account is on.</li>
463
- <li>That server asks you to sign in and to allow FediPod. It is the only
464
- place your password is typed; this agent never sees or stores one.</li>
465
- <li>Its timeline and notifications then join the ones you already read here,
466
- and a like or a reply on one of its posts goes out as that account.</li>
467
- <li>What arrives is held on this machine for reading. None of it is written
468
- to your pod.</li>
469
- </ol>
470
- <label for="fediacct-host">server</label>
471
- <input type="text" id="fediacct-host" placeholder="mastodon.social" autocomplete="off"
472
- title=" The server your other account lives on — Mastodon, GoToSocial, Pleroma, Akkoma, Pixelfed and Friendica all speak the API this needs">
473
- <p>
474
- <button id="fediacct-connect" type="submit" class="primary" title=" Go to that server to sign in and allow FediPod">Continue to that server</button>
475
- </p>
476
- </form>
477
- <!-- Every consequence is written here rather than assembled in script: the
478
- page asking "are you sure" has to say what it is sure about, and this is
479
- the only record of it. Script picks which block to show, nothing else. -->
480
- <!-- The gateway popups: attach proves the pod with this agent's own credential;
481
- detach republishes the pod's own inbox. -->
482
- <form id="gateway-attach-form" hidden>
483
- <p class="hint">A gateway filters your Fediverse mail before it reaches your pod: each
484
- delivery is verified at its door, spam is dropped, and the rest lands in your pod as
485
- before. Attaching proves the pod with this agent's own credential — no password
486
- leaves this machine.</p>
487
- <label for="gw-front">gateway</label>
488
- <input type="url" id="gw-front" placeholder="https://fedipod.net" autocomplete="off">
489
- <fieldset>
490
- <legend>Your Fediverse handle</legend>
491
- <label class="choice"><input type="radio" name="gwShape" value="pod" checked>
492
- Keep my pod-based handle: <strong id="gw-pod-preview"></strong><br>
493
- <span class="hint">Your address stays tied to your own pod — you can drop the
494
- gateway any time and keep everything.</span></label>
495
- <label class="choice" id="gw-shape-front"><input type="radio" name="gwShape" value="front">
496
- Create a handle at the gateway:
497
- @<input type="text" id="gw-name" placeholder="name" autocomplete="off"
498
- autocapitalize="off" spellcheck="false">@<span id="gw-front-host">fedipod.net</span><br>
499
- <span class="hint">Your address lives on the gateway's domain, but not your data
500
- or key; you can change pods later and keep the handle.</span>
501
- <span id="gw-name-msg" class="hint"></span></label>
502
- </fieldset>
503
- <p>
504
- <button id="gw-attach" type="button" class="primary"
505
- title=" Create the gateway account and point your mail through its door">Attach</button>
506
- </p>
507
- </form>
508
- <form id="gateway-detach-form" hidden>
509
- <p class="hint" id="gw-detach-plain">Deliveries go back to your pod's own inbox — the
510
- actor is republished advertising it. Your name and data never moved.</p>
511
- <p class="warn" id="gw-detach-fronted" hidden>This identity publishes under the gateway's
512
- name. Detaching moves every published id back to the pod — a rename other servers
513
- see, not just a mail change.</p>
514
- <!-- Browser build only: stage-site.mjs renames this id to gw-move-hint-browser,
515
- and gateway.js shows it for an address that lives at a gateway. The
516
- DeviceAgent has no move-in yet, so here it stays hidden under this id. -->
517
- <p class="hint" id="gw-move-hint" hidden>To move this address to another gateway, open that
518
- gateway, choose “create an account”, and sign in with this pod. Your posts, followers and
519
- key come with you, and your followers are told the new address.</p>
520
- <p>
521
- <button id="gw-detach" type="button" class="primary"
522
- title=" Forget the gateway and republish the actor with the pod inbox">Detach</button>
523
- </p>
524
- </form>
525
- <form id="confirm-form" hidden>
526
- <div id="warn-rotate-key" class="warn" hidden>
527
- <p>A new keypair replaces the one in this home and the actor is republished so other
528
- servers learn it. Any other device still holding the old key stops being able to sign.</p>
529
- </div>
530
- <div id="warn-retire" class="warn" hidden>
531
- <p><strong>This cannot be undone.</strong> A Delete goes to every follower's inbox telling
532
- those servers to drop the account and the posts they cached, the actor document is
533
- replaced with a Tombstone, and this agent will refuse to start again for this pod. Your
534
- posts and RDF stay on the pod; the identity does not come back.</p>
535
- <p>Two things that are not this, and can be done from here:
536
- <button type="button" id="go-park" title=" Park instead: keeps the handle, just stops the mail" class="inline">Park it instead</button>
537
- keeps the handle resolving and just stops the mail — setting status back to
538
- active undoes it.
539
- <button type="button" id="go-move" title=" Transfer instead: hands your followers to another account" class="inline">Transfer it instead</button>
540
- hands your followers to another account.</p>
541
- <label for="confirm-handle">Type the handle to confirm</label>
542
- <input type="text" id="confirm-handle" autocomplete="off">
543
- </div>
544
- <div id="warn-close-address" class="warn" hidden>
545
- <p><strong>This cannot be undone.</strong> Your address at the gateway is closed for good:
546
- mail to it is turned away, other servers drop the account the next time they look, and
547
- nobody can take the name. Nothing on your pod is touched — your posts, key and data stay
548
- where they are.</p>
549
- <label for="confirm-handle-close">Type the handle to confirm</label>
550
- <input type="text" id="confirm-handle-close" autocomplete="off">
551
- </div>
552
- <!-- "Move private data" (POST /state-move) had a panel here and no way to
553
- open it: nothing in this page has ever carried data-confirm="move-state",
554
- so the panel was only ever hidden. Removed 2026-09-09 rather than left as
555
- markup that looks like a feature. The route is still there for the CLI,
556
- which is where moving the private half between a directory and the pod
557
- belongs — it is about filesystem paths and credential.json, neither of
558
- which a browser has. -->
559
- <div id="warn-move" class="warn" hidden>
560
- <p>A <code>Move</code> goes to every follower's inbox and their servers migrate them to the
561
- account you name, so they end up following that one instead. The actor left behind
562
- advertises <code>movedTo</code>, so this handle keeps resolving as a redirect rather than
563
- breaking — nothing here is deleted.</p>
564
- <p>Then this identity is parked, exactly as Park would: everyone it follows is unfollowed
565
- and the inbox is closed. Migrating is the far end's decision, so some followers will not
566
- come across.</p>
567
- <label for="move-target">Transfer to</label>
568
- <input type="text" id="move-target" autocomplete="off" placeholder="@you@elsewhere or an actor URL">
569
- <label for="confirm-handle-move">Type this actor's handle to confirm</label>
570
- <input type="text" id="confirm-handle-move" autocomplete="off">
571
- </div>
572
- <p>
573
- <button type="submit" id="confirm-go" title=" Do it" class="primary">Confirm</button>
574
- <button type="button" id="confirm-cancel" title=" Change nothing and close">Cancel</button>
575
- </p>
576
- </form>
577
- </div>
578
- </div>
579
-
580
- </div>
581
- </main>
582
-
583
- <script src="bar.js"></script>
584
- <script src="window.js"></script>
585
- <script src="common.js"></script>
586
- <script src="record.js"></script>
587
- <script src="actors.js"></script>
588
- <script src="connections.js"></script>
589
- <script src="group.js"></script>
590
- <script src="upkeep.js"></script>
591
- <script src="gateway.js"></script>
592
-
593
- <!-- The notices: the list, and one notice open. Declared here and filled by
594
- notices-bar.js from /api/notices; nothing in them is markup from a notice. -->
595
- <dialog id="notices-list" aria-labelledby="notices-title">
596
- <section>
597
- <h2 id="notices-title">Notices</h2>
598
- <ul id="notices-items"></ul>
599
- <p class="row"><button type="button" id="notices-close" class="primary" title=" Close the list of notices">Close</button></p>
600
- </section>
601
- </dialog>
602
- <dialog id="notice-view" aria-labelledby="notice-view-title">
603
- <section>
604
- <h2 id="notice-view-title"></h2>
605
- <p class="when" id="notice-view-when"></p>
606
- <div id="notice-view-body"></div>
607
- <p class="row"><button type="button" id="notice-view-close" class="primary" title=" Back to the list of notices">Close</button></p>
608
- </section>
609
- </dialog>
610
- <script src="notices-bar.js"></script>
611
- </body>
612
- </html>