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
package/web/app/update.js DELETED
@@ -1,70 +0,0 @@
1
- // update.js — a fedipod.net page notices a newer build and reloads itself once.
2
- //
3
- // The page carries the version it was staged with (a meta tag); the site
4
- // answers its current version at the handle probe. When they differ, the
5
- // worker is asked to update — it installs and takes over at once (sw-src.mjs
6
- // skips waiting and claims) — and the page reloads when the new worker takes
7
- // over, or after a moment if only the pages changed. A page with text in a
8
- // composer is not reloaded from under it: it shows a line with a button.
9
- (() => {
10
- const mine = document.querySelector('meta[name="fedipod-version"]')?.content;
11
- // The build this page was staged from. A version changes when a release is
12
- // cut; a build changes every time the site is deployed, which is what a
13
- // reader with the page open actually needs to hear about.
14
- const myBuild = document.querySelector('meta[name="fedipod-build"]')?.content || null;
15
- if (!mine) return;
16
- const loadedAt = Date.now();
17
- let acted = false;
18
- const drafting = () => [...document.querySelectorAll('textarea')].some((t) => t.value.trim());
19
- const banner = () => {
20
- if (document.getElementById('fedipod-update')) return;
21
- const d = document.createElement('div');
22
- d.id = 'fedipod-update';
23
- d.setAttribute('role', 'status');
24
- d.style.cssText = 'position:fixed;left:0;right:0;bottom:0;z-index:2147483647;padding:1rem 1.25rem;'
25
- + 'font:1rem/1.5 Arial, Helvetica, sans-serif;background:#1d1d1d;color:#fff;display:flex;gap:1rem;align-items:center;justify-content:center;flex-wrap:wrap';
26
- const t = document.createElement('span');
27
- t.textContent = 'A new version of FediPod is ready. Reload when you have finished writing.';
28
- const b = document.createElement('button');
29
- b.type = 'button'; b.textContent = 'Reload now';
30
- b.style.cssText = 'font:inherit;padding:.5rem 1rem;border-radius:.5rem;border:1px solid #fff;background:#fff;color:#1d1d1d;cursor:pointer';
31
- b.addEventListener('click', () => location.reload());
32
- d.append(t, b);
33
- document.body.append(d);
34
- };
35
- const go = () => {
36
- if (acted) return;
37
- acted = true;
38
- if (drafting()) { acted = false; banner(); return; }
39
- location.reload();
40
- };
41
- // A worker taking over a page that has been open a while is a new build;
42
- // in a page's first seconds it is the boot, not an update.
43
- if ('serviceWorker' in navigator) {
44
- navigator.serviceWorker.addEventListener('controllerchange', () => { if (Date.now() - loadedAt > 5000) go(); });
45
- }
46
- const check = async () => {
47
- try {
48
- // The build first: it moves with every deploy. The version is the
49
- // fallback for a page staged before builds were stamped.
50
- if (myBuild) {
51
- const b = await fetch('/build.json', { cache: 'no-store', headers: { accept: 'application/json' } })
52
- .then(x => (x.ok ? x.json() : null)).catch(() => null);
53
- if (b?.build && b.build !== myBuild) { go(); return; }
54
- // A build that matched is the whole answer. Falling through here asked
55
- // the site's function the same question once a minute from every open
56
- // tab, for nothing — a third of everything the site was doing.
57
- if (b?.build) return;
58
- }
59
- const r = await fetch('/api/handle?handle=__probe__', { cache: 'no-store', headers: { accept: 'application/json' } });
60
- const v = (await r.json())?.version;
61
- if (!v || v === mine) return;
62
- const reg = await navigator.serviceWorker.getRegistration();
63
- await reg?.update().catch(() => {});
64
- setTimeout(go, 4000); // a pages-only change: no new worker will take over
65
- } catch { /* offline, or the site did not answer: try again later */ }
66
- };
67
- // Often enough that a reader watching a page being worked on sees it.
68
- setTimeout(check, 5000);
69
- setInterval(check, 60 * 1000);
70
- })();
@@ -1,55 +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 — accounts on this server</title>
7
- <link rel="icon" href="/icons/gateway.svg" type="image/svg+xml">
8
- <style>
9
- :root { color-scheme: light dark; --line:#d9d4c7; --dim:#45443d; --accent:#6a8a5a; }
10
- @media (prefers-color-scheme: dark) { :root { --dim:#c2c0b4; } }
11
- body { font: 20px/1.6 Arial, Helvetica, sans-serif; max-width: 44rem; margin: 2rem auto; padding: 0 1.1rem; }
12
- h1 { font-size: 1.7rem; margin: 0 0 .2rem; }
13
- p.lede { color: var(--dim); margin-top: 0; }
14
- label { display: block; font-weight: 600; margin: .8rem 0 .2rem; }
15
- input[type=url] { width: 100%; padding: .5rem .6rem; font: inherit;
16
- border: 1px solid var(--line); border-radius: 8px; box-sizing: border-box; }
17
- .hint { color: var(--dim); font-size: .95rem; }
18
- .primary { background: var(--accent); color: #fff; border: none; border-radius: 9px;
19
- padding: .6rem 1.1rem; font: inherit; cursor: pointer; }
20
- .primary[disabled] { opacity: .5; cursor: not-allowed; }
21
- button { font: inherit; cursor: pointer; }
22
- [hidden] { display: none !important; }
23
- table { border-collapse: collapse; width: 100%; margin: 1.2rem 0; }
24
- th, td { text-align: left; padding: .5rem .7rem; border-bottom: 1px solid var(--line); }
25
- th { font-weight: 600; }
26
- </style>
27
- </head>
28
- <body>
29
- <h1>Accounts on this server</h1>
30
- <p class="lede">Every name this server answers for: accounts whose identity lives here, and
31
- accounts that only use it as their gateway. Sign in as the server's admin to see them.
32
- <a href="/notices">Notices</a> — what every account sees behind the bell in its bar — are
33
- written on their own page.</p>
34
-
35
- <form id="roster-form">
36
- <p class="field">
37
- <label for="roster-issuer">Your identity provider</label>
38
- <input type="url" id="roster-issuer" autocomplete="off" value="https://solidcommunity.net">
39
- </p>
40
- <p class="actions">
41
- <button type="submit" id="roster-signin" class="primary">Sign in &amp; list accounts</button>
42
- </p>
43
- <p class="hint" id="roster-note" hidden></p>
44
- </form>
45
-
46
- <table id="roster-table" hidden>
47
- <thead>
48
- <tr><th>Account</th><th>Kind</th><th>Identity</th><th>Pod</th><th>Remove</th></tr>
49
- </thead>
50
- <tbody id="roster-rows"></tbody>
51
- </table>
52
-
53
- <script type="module" src="/admin.js"></script>
54
- </body>
55
- </html>
@@ -1,89 +0,0 @@
1
- // admin.js — the roster page's script, in a file of its own.
2
- //
3
- // It lived inline in admin.html until 2026-09-09. Out here the page can be
4
- // served under `script-src 'self'`, which is what stops a stray bit of markup
5
- // from becoming running code; inline script cannot be told apart from injected
6
- // script by any policy. Served by the front at /admin.js.
7
- const $ = (id) => document.getElementById(id);
8
- const note = (text) => { const n = $('roster-note'); n.hidden = !text; n.textContent = text || ''; };
9
-
10
- // The Solid-OIDC client for the sign-in round trip. Constructed once; the
11
- // redirect state lives in this tab's sessionStorage, so the same session
12
- // finishes the login on the way back.
13
- let session = null;
14
- try {
15
- const { SessionCore } = await import('/solid-oidc-client.js');
16
- session = new SessionCore({ redirect_uris: [location.origin + '/roster'], client_name: 'FediPod admin' });
17
- } catch { /* leave null — the "did not load" note fires */ }
18
-
19
- $('roster-issuer').addEventListener('input', () => {
20
- $('roster-signin').disabled = !/^https?:\/\/\S+/.test($('roster-issuer').value.trim());
21
- });
22
-
23
- $('roster-form').addEventListener('submit', (ev) => {
24
- ev.preventDefault();
25
- if (!session) { note('the sign-in library did not load — reload and try again'); return; }
26
- session.login($('roster-issuer').value.trim(), location.origin + '/roster')
27
- .catch((e) => note('sign-in failed to start: ' + e.message));
28
- });
29
-
30
- // Back from the identity provider: read the roster with the proven login.
31
- (async () => {
32
- if (!session) return;
33
- await session.handleRedirectFromLogin().catch(() => {});
34
- if (!session.isActive) return;
35
- const webId = session.webId;
36
-
37
- // Signed fetches build a DPoP proof from the URL, so it must be absolute.
38
- const load = async () => {
39
- let res;
40
- try { res = await session.authFetch(location.origin + '/api/roster'); }
41
- catch (e) { note('the roster request failed: ' + e.message); return; }
42
- const d = await res.json().catch(() => ({}));
43
- if (res.status === 403) { note('signed in as ' + webId + ', which is not this server’s admin'); return; }
44
- if (res.status === 501) { note('this server names no admin — set FEDIPOD_ADMIN_WEBID and redeploy'); return; }
45
- if (res.status !== 200) { note('roster unavailable: ' + (d.error || 'HTTP ' + res.status)); return; }
46
- const rows = $('roster-rows');
47
- rows.textContent = '';
48
- for (const a of d.accounts || []) {
49
- const tr = document.createElement('tr');
50
- const cell = (child) => { const td = document.createElement('td'); td.append(child); tr.append(td); };
51
- cell(a.address);
52
- cell(a.kind);
53
- cell(a.fronted ? 'lives here' : 'gateway only');
54
- const pod = document.createElement('a');
55
- // The pod as a person names it: its host, plus its path for a pod on a
56
- // path of a shared host. The trailing segment is the FediPod root.
57
- const u = new URL(a.podHome);
58
- pod.href = a.podHome;
59
- pod.textContent = u.host + u.pathname.replace(/[^/]+\/$/u, '').replace(/\/$/u, '');
60
- cell(pod);
61
- const rm = document.createElement('button');
62
- rm.type = 'button'; rm.textContent = 'Remove';
63
- rm.onclick = () => revoke(a);
64
- cell(rm);
65
- rows.append(tr);
66
- }
67
- $('roster-table').hidden = false;
68
- note((d.accounts || []).length + ' account(s) on ' + d.host);
69
- };
70
-
71
- const revoke = async (a) => {
72
- if (!confirm('Remove ' + a.address + ' from this server? The name stops resolving here; nothing on their pod is touched.')) return;
73
- let res;
74
- try {
75
- res = await session.authFetch(location.origin + '/api/revoke', {
76
- method: 'POST', headers: { 'content-type': 'application/json' },
77
- body: JSON.stringify({ handle: a.handle }),
78
- });
79
- } catch (e) { note('the remove request failed: ' + e.message); return; }
80
- const d = await res.json().catch(() => ({}));
81
- if (res.status !== 200) { note('remove refused: ' + (d.error || 'HTTP ' + res.status)); return; }
82
- if (!d.removed) { note(a.address + ' stays: ' + d.reason); return; }
83
- await load();
84
- note('removed ' + a.address);
85
- };
86
-
87
- note('signed in as ' + webId + ' — reading the roster…');
88
- await load();
89
- })();
@@ -1,69 +0,0 @@
1
- #!/bin/sh
2
- # FediPod installer. Usage: curl -fsSL https://fedipod.net/install | sh
3
- # Installs into ~/FediPod (or $FEDIPOD_DIR); re-running updates the install.
4
- #
5
- # A signup page may append parameters (sh -s -- --gateway ... --secret ...);
6
- # they are saved for the first start, whose setup opens pre-filled and
7
- # attaches to the gateway when it completes.
8
- set -eu
9
-
10
- REPO="https://github.com/jeff-zucker/FediPod"
11
- DIR="${FEDIPOD_DIR:-$HOME/FediPod}"
12
-
13
- say() { printf '%s\n' "$*"; }
14
- fail() { printf 'fedipod install: %s\n' "$*" >&2; exit 1; }
15
-
16
- GATEWAY= SECRET= POD= ISSUER= HANDLE= KIND=person FRONTED=false
17
- while [ $# -gt 0 ]; do
18
- case "$1" in
19
- --gateway) GATEWAY=$2; shift 2;;
20
- --secret) SECRET=$2; shift 2;;
21
- --pod) POD=$2; shift 2;;
22
- --issuer) ISSUER=$2; shift 2;;
23
- --handle) HANDLE=$2; shift 2;;
24
- --kind) KIND=$2; shift 2;;
25
- --fronted) FRONTED=true; shift;;
26
- *) fail "unknown option $1";;
27
- esac
28
- done
29
-
30
- command -v git >/dev/null 2>&1 || fail "git is required — install it from https://git-scm.com/ and re-run"
31
- command -v node >/dev/null 2>&1 || fail "node 20 or newer is required — install it from https://nodejs.org/ and re-run"
32
- command -v npm >/dev/null 2>&1 || fail "npm is required (it ships with node) — install node from https://nodejs.org/ and re-run"
33
-
34
- major=$(node -v | sed 's/^v//' | cut -d. -f1)
35
- [ "$major" -ge 20 ] 2>/dev/null || fail "node 20 or newer is required (found $(node -v))"
36
-
37
- if [ -d "$DIR/.git" ]; then
38
- say "updating the existing install in $DIR"
39
- git -C "$DIR" pull --ff-only || fail "could not update $DIR — it has local changes; update it by hand"
40
- elif [ -e "$DIR" ]; then
41
- fail "$DIR exists and is not a FediPod checkout — set FEDIPOD_DIR to another location and re-run"
42
- else
43
- say "installing into $DIR"
44
- git clone --depth 1 "$REPO" "$DIR"
45
- fi
46
-
47
- cd "$DIR"
48
- npm install --omit=dev --no-audit --no-fund
49
-
50
- # Put `fedipod` on PATH, the same command an `npm install -g fedipod` gives.
51
- # Everything printed from here on — the docs, the agent's own advice, the
52
- # command a signup page hands you — names it that way, and a checkout that
53
- # skipped this step could run none of them.
54
- if npm link >/dev/null 2>&1; then
55
- say "linked: the fedipod command is on your PATH"
56
- else
57
- say "note: could not link the fedipod command — run it as: node $DIR/bin/fedipod.mjs"
58
- fi
59
-
60
- if [ -n "$HANDLE" ]; then
61
- printf '{"handle":"%s","kind":"%s","pod":"%s","issuer":"%s","gateway":"%s","secret":"%s","fronted":%s}\n' \
62
- "$HANDLE" "$KIND" "$POD" "$ISSUER" "$GATEWAY" "$SECRET" "$FRONTED" > "$DIR/first-run.json"
63
- chmod 600 "$DIR/first-run.json"
64
- fi
65
-
66
- say ""
67
- say "Installed. To start (first run opens setup in your browser):"
68
- say ""
69
- say " fedipod start"
@@ -1,35 +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 — access the Fediverse and ATProto from a Solid pod</title>
7
- <link rel="icon" href="/icons/gateway.svg" type="image/svg+xml">
8
- <style>
9
- :root { color-scheme: light dark; --line:#d9d4c7; --dim:#45443d; --accent:#6a8a5a; }
10
- @media (prefers-color-scheme: dark) { :root { --dim:#c2c0b4; } }
11
- body { font: 20px/1.6 Arial, Helvetica, sans-serif; max-width: 44rem; margin: 2rem auto; padding: 0 1.1rem; }
12
- h1 { font-size: 1.7rem; margin: 0 0 .2rem; }
13
- h2 { font-size: 1.2rem; margin: 1.4rem 0 .4rem; }
14
- p.lede { color: var(--dim); margin-top: 0; }
15
- .hint { color: var(--dim); font-size: .95rem; }
16
- code { background: rgba(120,120,120,.12); padding: .05em .35em; border-radius: 4px; }
17
- pre { background: rgba(120,120,120,.12); padding: .7rem .9rem; border-radius: 8px; overflow-x: auto; }
18
- ol.steps li { margin: .5rem 0; }
19
- [hidden] { display: none !important; }
20
- </style>
21
- </head>
22
- <body>
23
- <h1>FediPod - join the Fediverse from a Solid pod.</h1>
24
- <p class="lede">Welcome to <b>FediPod</b>! Here, you can get a free pod and Fediverse account or link to your existing pod/account.</p>
25
-
26
- <p class="hint" id="current-version" hidden>Current FediPod: <strong id="current-version-num"></strong><br>
27
- — install or update an existing install with <code id="current-version-cmd"></code></p>
28
-
29
- <p>
30
- FediPod is experimental and free to use. See the <a href="https://github.com/jeff-zucker/FediPod">FediPod repository</a> for details.
31
- </p>
32
-
33
- <script src="/new-account.js"></script>
34
- </body>
35
- </html>
@@ -1,13 +0,0 @@
1
- // new-account.js — the sign-up page's script, in a file of its own.
2
- //
3
- // It lived inline in new-account.html until 2026-09-09. Out here the page can
4
- // be served under `script-src 'self'`, which is what stops a stray bit of
5
- // markup from becoming running code; inline script cannot be told apart from
6
- // injected script by any policy. Served by the front at /new-account.js.
7
- fetch('/api/handle?handle=__probe__').then(r => r.json()).then(d => {
8
- if (d.version) {
9
- document.getElementById('current-version-num').textContent = d.version;
10
- document.getElementById('current-version-cmd').textContent = `curl -fsSL ${location.origin}/install | sh`;
11
- document.getElementById('current-version').hidden = false;
12
- }
13
- }).catch(() => {});
@@ -1,69 +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 — notices</title>
7
- <link rel="icon" href="/icons/gateway.svg" type="image/svg+xml">
8
- <style>
9
- :root { color-scheme: light dark; --line:#d9d4c7; --dim:#45443d; --accent:#6a8a5a; --danger:#b00020; }
10
- @media (prefers-color-scheme: dark) { :root { --dim:#c2c0b4; --danger:#ff8a9a; } }
11
- body { font: 20px/1.6 Arial, Helvetica, sans-serif; max-width: 44rem; margin: 2rem auto; padding: 0 1.1rem; }
12
- h1 { font-size: 1.7rem; margin: 0 0 .2rem; }
13
- h2 { font-size: 1.25rem; margin: 1.6rem 0 .4rem; }
14
- p.lede { color: var(--dim); margin-top: 0; }
15
- label { display: block; font-weight: 600; margin: .8rem 0 .2rem; }
16
- input[type=url], input[type=text], textarea { width: 100%; padding: .5rem .6rem; font: inherit;
17
- border: 1px solid var(--line); border-radius: 8px; box-sizing: border-box; }
18
- textarea { min-height: 9rem; resize: vertical; }
19
- .hint { color: var(--dim); font-size: .95rem; }
20
- .primary { background: var(--accent); color: #fff; border: none; border-radius: 9px;
21
- padding: .6rem 1.1rem; font: inherit; cursor: pointer; }
22
- .primary[disabled] { opacity: .5; cursor: not-allowed; }
23
- button { font: inherit; cursor: pointer; }
24
- button.danger { color: var(--danger); background: none; border: 1px solid var(--danger); border-radius: 9px; padding: .4rem .8rem; }
25
- [hidden] { display: none !important; }
26
- ul.notices { list-style: none; padding: 0; margin: 1rem 0; }
27
- ul.notices li { padding: .8rem 0; border-bottom: 1px solid var(--line); }
28
- ul.notices .title { font-weight: 600; }
29
- ul.notices .when { color: var(--dim); font-size: .95rem; margin-left: .6rem; }
30
- ul.notices .body { white-space: pre-wrap; margin: .3rem 0 .6rem; }
31
- ul.notices .actions button { margin-right: .6rem; }
32
- </style>
33
- </head>
34
- <body>
35
- <h1>Notices</h1>
36
- <p class="lede">What every account on this server sees behind the bell in its bar. Sign in as the
37
- server's admin to write, change or remove them. <a href="/roster">Back to the roster.</a></p>
38
-
39
- <form id="notices-form">
40
- <p class="field">
41
- <label for="notices-issuer">Your identity provider</label>
42
- <input type="url" id="notices-issuer" autocomplete="off" value="https://solidcommunity.net">
43
- </p>
44
- <p class="actions">
45
- <button type="submit" id="notices-signin" class="primary">Sign in &amp; manage notices</button>
46
- </p>
47
- <p class="hint" id="notices-note" hidden></p>
48
- </form>
49
-
50
- <section id="notices-editor" hidden>
51
- <h2 id="editor-title">New notice</h2>
52
- <form id="editor-form">
53
- <label for="notice-title">Title</label>
54
- <input type="text" id="notice-title" maxlength="120" autocomplete="off" required>
55
- <label for="notice-body">Text</label>
56
- <textarea id="notice-body" maxlength="4000" required></textarea>
57
- <p class="hint">Plain text. A blank line starts a new paragraph; a web address becomes a link.</p>
58
- <p class="actions">
59
- <button type="submit" id="notice-save" class="primary">Publish</button>
60
- <button type="button" id="notice-cancel" hidden>Cancel</button>
61
- </p>
62
- </form>
63
- <h2>Published</h2>
64
- <ul class="notices" id="notices-list"></ul>
65
- </section>
66
-
67
- <script type="module" src="/notices.js"></script>
68
- </body>
69
- </html>
@@ -1,107 +0,0 @@
1
- // notices.js — the notices page's script: the admin signs in, then writes,
2
- // changes and removes the notices every account here sees behind the bell.
3
- // Served by the front at /notices.js, like admin.js for the roster.
4
- const $ = (id) => document.getElementById(id);
5
- const note = (text) => { const n = $('notices-note'); n.hidden = !text; n.textContent = text || ''; };
6
-
7
- let session = null;
8
- try {
9
- const { SessionCore } = await import('/solid-oidc-client.js');
10
- session = new SessionCore({ redirect_uris: [location.origin + '/notices'], client_name: 'FediPod admin' });
11
- } catch { /* leave null — the "did not load" note fires */ }
12
-
13
- $('notices-issuer').addEventListener('input', () => {
14
- $('notices-signin').disabled = !/^https?:\/\/\S+/.test($('notices-issuer').value.trim());
15
- });
16
-
17
- $('notices-form').addEventListener('submit', (ev) => {
18
- ev.preventDefault();
19
- if (!session) { note('the sign-in library did not load — reload and try again'); return; }
20
- session.login($('notices-issuer').value.trim(), location.origin + '/notices')
21
- .catch((e) => note('sign-in failed to start: ' + e.message));
22
- });
23
-
24
- (async () => {
25
- if (!session) return;
26
- await session.handleRedirectFromLogin().catch(() => {});
27
- if (!session.isActive) return;
28
- const webId = session.webId;
29
- let editing = null; // the notice being changed, or null for a new one
30
-
31
- const when = (iso) => { try { return new Date(iso).toLocaleString(); } catch { return iso; } };
32
-
33
- const send = async (body) => {
34
- let res;
35
- try {
36
- res = await session.authFetch(location.origin + '/api/notices', {
37
- method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(body),
38
- });
39
- } catch (e) { note('the request failed: ' + e.message); return null; }
40
- const d = await res.json().catch(() => ({}));
41
- if (res.status === 403) { note('signed in as ' + webId + ', which is not this server’s admin'); return null; }
42
- if (res.status === 501) { note('this server keeps no notices'); return null; }
43
- if (res.status >= 400) { note('refused: ' + (d.error || 'HTTP ' + res.status)); return null; }
44
- return d;
45
- };
46
-
47
- const startEdit = (n) => {
48
- editing = n;
49
- $('editor-title').textContent = n ? 'Change this notice' : 'New notice';
50
- $('notice-title').value = n ? n.title : '';
51
- $('notice-body').value = n ? n.body : '';
52
- $('notice-save').textContent = n ? 'Save changes' : 'Publish';
53
- $('notice-cancel').hidden = !n;
54
- $('notice-title').focus();
55
- };
56
-
57
- const load = async () => {
58
- let res;
59
- try { res = await fetch(location.origin + '/api/notices', { headers: { accept: 'application/json' }, cache: 'no-store' }); }
60
- catch (e) { note('the notices could not be read: ' + e.message); return; }
61
- if (res.status === 501) { note('this server keeps no notices'); return; }
62
- const d = await res.json().catch(() => ({}));
63
- const ul = $('notices-list');
64
- ul.textContent = '';
65
- for (const n of d.notices || []) {
66
- const li = document.createElement('li');
67
- const head = document.createElement('div');
68
- const t = document.createElement('span'); t.className = 'title'; t.textContent = n.title;
69
- const w = document.createElement('span'); w.className = 'when';
70
- w.textContent = when(n.at) + (n.updatedAt && n.updatedAt !== n.at ? ' (changed ' + when(n.updatedAt) + ')' : '');
71
- head.append(t, w);
72
- const b = document.createElement('p'); b.className = 'body'; b.textContent = n.body;
73
- const acts = document.createElement('p'); acts.className = 'actions';
74
- const edit = document.createElement('button'); edit.type = 'button'; edit.textContent = 'Change';
75
- edit.onclick = () => startEdit(n);
76
- const rm = document.createElement('button'); rm.type = 'button'; rm.textContent = 'Remove'; rm.className = 'danger';
77
- rm.onclick = async () => {
78
- if (!confirm('Remove the notice “' + n.title + '”? Everyone stops seeing it.')) return;
79
- if (await send({ action: 'delete', id: n.id })) { note('removed “' + n.title + '”'); await load(); }
80
- };
81
- acts.append(edit, rm);
82
- li.append(head, b, acts);
83
- ul.append(li);
84
- }
85
- if (!(d.notices || []).length) { const li = document.createElement('li'); li.textContent = 'No notices yet.'; ul.append(li); }
86
- $('notices-editor').hidden = false;
87
- };
88
-
89
- $('editor-form').addEventListener('submit', async (ev) => {
90
- ev.preventDefault();
91
- const title = $('notice-title').value.trim();
92
- const body = $('notice-body').value.trim();
93
- if (!title || !body) { note('a title and a text are both needed'); return; }
94
- $('notice-save').disabled = true;
95
- const r = await send(editing ? { action: 'update', id: editing.id, title, body } : { action: 'create', title, body });
96
- $('notice-save').disabled = false;
97
- if (!r) return;
98
- note(editing ? 'changed “' + title + '”' : 'published “' + title + '” — everyone sees it within a minute');
99
- startEdit(null);
100
- await load();
101
- });
102
- $('notice-cancel').addEventListener('click', () => startEdit(null));
103
-
104
- note('signed in as ' + webId);
105
- $('notices-form').hidden = true;
106
- await load();
107
- })();
@@ -1,64 +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 — turn your pod into a Fediverse account</title>
7
- <link rel="icon" href="/icons/gateway.svg" type="image/svg+xml">
8
- <style>
9
- :root { color-scheme: light dark; --line:#d9d4c7; --dim:#45443d; --accent:#6a8a5a; }
10
- @media (prefers-color-scheme: dark) { :root { --dim:#c2c0b4; } }
11
- body { font: 20px/1.6 Arial, Helvetica, sans-serif; max-width: 44rem; margin: 2rem auto; padding: 0 1.1rem; }
12
- h1 { font-size: 1.7rem; margin: 0 0 .2rem; }
13
- p.lede { color: var(--dim); margin-top: 0; }
14
- label { display: block; font-weight: 600; margin: .8rem 0 .2rem; }
15
- input[type=text], input[type=url] { width: 100%; padding: .5rem .6rem; font: inherit;
16
- border: 1px solid var(--line); border-radius: 8px; box-sizing: border-box; }
17
- .hint { color: var(--dim); font-size: .95rem; }
18
- .pod { border: 1px solid var(--line); border-radius: 9px; padding: .9rem 1.1rem; margin: .8rem 0; }
19
- .pod p { margin: .3rem 0; }
20
- .pod .actions { margin-top: .8rem; }
21
- .primary { background: var(--accent); color: #fff; border: none; border-radius: 9px;
22
- padding: .6rem 1.1rem; font: inherit; cursor: pointer; }
23
- button { font: inherit; }
24
- .primary[disabled], button[disabled] { opacity: .5; cursor: not-allowed; }
25
- [hidden] { display: none !important; }
26
- code { background: rgba(120,120,120,.12); padding: .05em .35em; border-radius: 4px; }
27
- .pod code { background: #fff3c4; color: #1a1a1a; font-size: 16px; }
28
- @media (prefers-color-scheme: dark) { .pod code { background: #5a4a00; color: #fff; } }
29
- pre { background: rgba(120,120,120,.12); padding: .7rem .9rem; border-radius: 8px; overflow-x: auto; }
30
- </style>
31
- </head>
32
- <body>
33
- <h1>Turn your pod into a Fediverse account</h1>
34
- <p class="lede">Users with pods on this server may opt-in below to create a Fediverse account
35
- that stores your data on your pod. You'll be able to interact with Mastodon and users of other
36
- Fediverse services straight from your pod.</p>
37
-
38
- <section id="run-known" hidden aria-live="polite"></section>
39
-
40
- <form id="run-form">
41
- <p class="field">
42
- <label for="run-pod-url">Your pod's address on this server</label>
43
- <input type="url" id="run-pod-url" autocomplete="off" placeholder="https://you.this.server/">
44
- </p>
45
- <p class="field">
46
- <label for="run-issuer">Your identity provider</label>
47
- <input type="url" id="run-issuer" autocomplete="off" placeholder="https://this.server">
48
- </p>
49
- <p class="field">
50
- <label for="run-container">Store your data in a container named fedipod, inside this container</label>
51
- <input type="text" id="run-container" autocomplete="off" spellcheck="false" placeholder="/"
52
- aria-describedby="run-container-hint">
53
- </p>
54
- <p class="hint" id="run-container-hint">Leave it empty for your pod's root. This is permanent.</p>
55
- <p class="actions">
56
- <button type="button" id="run-continue" class="primary" disabled>Sign in with your pod &amp; opt in</button>
57
- <button type="button" id="run-leave">Stop running it here</button>
58
- </p>
59
- </form>
60
- <div class="hint" id="run-note" hidden></div>
61
-
62
- <script type="module" src="/run.js"></script>
63
- </body>
64
- </html>