├── LICENSE ├── README-JA.md ├── README.md ├── ai-script ├── README.md └── parser-combinator.aiscript ├── custom-css ├── README.md ├── archive │ ├── README.md │ └── wiggly-cat-ears.css ├── mfm-on-hover.css ├── post-replies-on-hover.css ├── post-replies-slide-out.css └── stop-blinking-notification-dots.css ├── documentation ├── DELETE_UserAccount.md └── README.md ├── patches ├── README.md ├── archive │ ├── README.md │ ├── collapsible-threads.patch │ ├── misskey-truncate-v2.patch │ └── round-time-approximations.patch ├── compact-notifications.patch ├── compatibility-keyoxide.patch ├── emojilist.patch ├── fix-leaky-mutes.patch ├── mfm-search-duckduckgo.patch ├── mfm-search-metager.patch ├── mfm-search-qwant.patch └── star-is-like.patch ├── plugins ├── README.md ├── archive │ ├── README.md │ └── basically-preview-en.plugin ├── catify.plugin ├── de-nyanify.aiscript ├── deepl-translate.plugin ├── note-mfm-toggle.aiscript └── sauce-nao.aiscript └── themes ├── README.md └── dracula.theme /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README-JA.md: -------------------------------------------------------------------------------- 1 | # Misskey-Extras 2 | [English](https://github.com/JakeMBauer/Misskey-Extras) / [日本語](https://github.com/JakeMBauer/Misskey-Extras/blob/master/README-JA.md) 3 | 4 | 人気のあるFediverseソフトウェア、[Misskey](https://github.com/misskey-dev/misskey)向けのTipやトリックやテーマやプラグインなどのコレクションです。
5 | 6 | 7 | ## コントリビュート 8 | 9 | コントリビュートするには、以下のステップに従って下さい。 10 | 11 | 1. あなたのコントリビューションの内容として最も合ってるフォルダーを見つけて、データを加えます。
12 | 2. コントリビューションの内容の詳細を書き加えるため、フォルダーにあるREADMEを修正します*
13 | 3. 最後に、プルリクエストを送ります! 14 | 15 | \* (README内にある、他のコントリビューションの内容の詳細をテンプレートとして利用して下さい) 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Misskey-Extras 2 | [English](https://github.com/JakeMBauer/Misskey-Extras) / [日本語](https://github.com/JakeMBauer/Misskey-Extras/blob/master/README-JA.md) 3 | 4 | A collection of tips, tricks, themes, plugins, and more for the popular 5 | Fediverse software [Misskey](https://github.com/misskey-dev/misskey). 6 | 7 | ## Contributing 8 | 9 | To contribute a patch, please follow these steps: 10 | 11 | 1. Find out in which folder your contribution fits best and put it there; 12 | 2. Modify the README in that folder to add the details of your contribution*; 13 | 3. Submit your pull request! 14 | 15 | \* (Use an existing entry as a template) 16 | -------------------------------------------------------------------------------- /ai-script/README.md: -------------------------------------------------------------------------------- 1 | # Misskey Ai-Scripts 2 | 3 | Interesting and useful Ai-Scripts created by the Misskey community. 4 | 5 | ## List of Scripts 6 | 7 | 1. [Parser Combinator Library](#Parser-Combinator-Library) 8 | 9 | ## Parser Combinator Library 10 | 11 | * **Author**: Volpeon 12 | * **Date**: 2021-08-10 13 | * **Misskey Version**: 12.85.1 14 | * **Description**: A parser combinator library for AiScript. The code in 15 | [`parser-combinator.aiscript`](parser-combinator.aiscript) is an example 16 | which will strip MFM extensions (`$[...]`) from its input. 17 | -------------------------------------------------------------------------------- /ai-script/parser-combinator.aiscript: -------------------------------------------------------------------------------- 1 | :: Util { 2 | @pipe(els) { 3 | #len = Arr:len(els) 4 | 5 | ? (len = 0) { 6 | << _ 7 | } 8 | 9 | #result = els[1] 10 | 11 | @run(i) { 12 | ? (i > len) { 13 | << result 14 | } 15 | 16 | #el = els[i] 17 | result <- el(result) 18 | 19 | run((i + 1)) 20 | } 21 | 22 | run(2) 23 | } 24 | 25 | @merge(obj1, obj2) { 26 | #o = Obj:copy(obj1) 27 | 28 | @step(kvs) { 29 | #len = Arr:len(kvs) 30 | 31 | ? (len = 0) { 32 | << o 33 | } 34 | 35 | #kv = kvs[1] 36 | #kvsCont = Arr:slice(kvs, 2, (len + 1)) 37 | Obj:set(o, kv[1], kv[2]) 38 | 39 | step(kvsCont) 40 | } 41 | 42 | step(Obj:kvs(obj2)) 43 | } 44 | 45 | @not1(fn) { 46 | @(param) { 47 | ? fn(param) { no } . { yes } 48 | } 49 | } 50 | } 51 | 52 | :: Stream { 53 | @resultOk(read, stream) { 54 | { 55 | ok: yes 56 | read: read 57 | stream: stream 58 | } 59 | } 60 | 61 | @resultFail() { 62 | { 63 | ok: no 64 | } 65 | } 66 | 67 | @mk(str, pos) { 68 | { 69 | str: str 70 | pos: pos 71 | } 72 | } 73 | 74 | @of(str) { 75 | mk(str, 1) 76 | } 77 | 78 | @read(stream, length) { 79 | #remainingLength = ((Str:len(stream.str) - stream.pos) + 1) 80 | 81 | ? (length > remainingLength) { 82 | << resultFail() 83 | } 84 | 85 | #newPos = (stream.pos + length) 86 | 87 | resultOk(Str:slice(stream.str, stream.pos, newPos), mk(stream.str, newPos)) 88 | } 89 | } 90 | 91 | :: Parser { 92 | // Constructors 93 | 94 | @resultOk(stream, value) { 95 | { 96 | ok: yes 97 | stream: stream 98 | value: value 99 | } 100 | } 101 | 102 | @resultFail(stream, error) { 103 | { 104 | ok: no 105 | stream: stream 106 | error: error 107 | } 108 | } 109 | 110 | @mk(parse) { 111 | { 112 | parse: parse 113 | } 114 | } 115 | 116 | @ok(value) { 117 | mk(@(stream) { resultOk(stream, value) }) 118 | } 119 | 120 | @fail(error) { 121 | mk(@(stream) { resultFail(stream, error) }) 122 | } 123 | 124 | @anyToken(length) { 125 | mk(@(stream) { 126 | #result = Stream:read(stream, length) 127 | 128 | ? result.ok { 129 | << resultOk(result.stream, result.read) 130 | } 131 | 132 | resultFail(stream, "End of input") 133 | }) 134 | } 135 | 136 | @eof() { 137 | mk(@(stream) { 138 | #result = Stream:read(stream, 1) 139 | 140 | ? result.ok { 141 | << resultFail(stream, "Expected end of input") 142 | } 143 | 144 | resultOk(stream, yes) 145 | }) 146 | } 147 | 148 | // Basic operators 149 | 150 | @then(cont) { 151 | @(parser) { 152 | mk(@(stream) { 153 | #result = parser.parse(stream) 154 | 155 | ? result.ok { 156 | #parserCont = cont(result.value) 157 | << parserCont.parse(result.stream) 158 | } 159 | 160 | result 161 | }) 162 | } 163 | } 164 | 165 | @map(fn) { 166 | @(parser) { 167 | mk(@(stream) { 168 | #result = parser.parse(stream) 169 | 170 | ? result.ok { 171 | << resultOk(result.stream, fn(result.value)) 172 | } 173 | 174 | result 175 | }) 176 | } 177 | } 178 | 179 | // Generic combinators 180 | 181 | @satisfy(condition, description) { 182 | @(parser) { 183 | mk(@(stream) { 184 | #result = parser.parse(stream) 185 | 186 | ? result.ok { 187 | ? condition(result.value) { 188 | << resultOk(result.stream, result.value) 189 | } 190 | 191 | << resultFail(stream, description) 192 | } 193 | 194 | result 195 | }) 196 | } 197 | } 198 | 199 | @oneOf(parsers) { 200 | mk(@(stream) { 201 | @run(ps, errors) { 202 | #len = Arr:len(ps) 203 | 204 | ? (len = 0) { 205 | << resultFail(stream, Arr:join(["All parsers failed: " Arr:join(errors, "; ")])) 206 | } 207 | 208 | #parser = ps[1] 209 | #result = parser.parse(stream) 210 | 211 | ? result.ok { 212 | << result 213 | } 214 | 215 | #psCont = Arr:slice(ps, 2, (len + 1)) 216 | #errorsCont = Arr:join(["(" Core:to_str(Arr:len(errors)) ") " result.error]) 217 | run(psCont, Arr:concat(errors, [errorsCont])) 218 | } 219 | 220 | run(parsers, []) 221 | }) 222 | } 223 | 224 | @many(parser) { 225 | @run(matches) { 226 | mk(@(stream) { 227 | #result = parser.parse(stream) 228 | 229 | ? result.ok { 230 | #step = run(Arr:concat(matches, [result.value])) 231 | << step.parse(result.stream) 232 | } 233 | 234 | resultOk(result.stream, matches) 235 | }) 236 | } 237 | 238 | run([]) 239 | } 240 | 241 | @many1(parser) { 242 | Util:pipe([ 243 | many(parser) 244 | satisfy(@(value) { 245 | ? (Arr:len(value) = 0) { no } . { yes } 246 | }, "Expected at least one match") 247 | ]) 248 | } 249 | 250 | // Specialized string parsers 251 | 252 | @token(str) { 253 | Util:pipe([ 254 | anyToken(Str:len(str)) 255 | satisfy(@(value) { 256 | ? (value = str) { yes } . { no } 257 | }, Arr:join(["Expected '" str "'"])) 258 | ]) 259 | } 260 | 261 | @takeWhile(condition) { 262 | mk(@(stream) { 263 | #matches = [] 264 | 265 | @run(s) { 266 | #result = Stream:read(s, 1) 267 | 268 | ? result.ok { 269 | ? condition(result.read) { 270 | Arr:push(matches, result.read) 271 | << run(result.stream) 272 | } 273 | } 274 | 275 | resultOk(s, Arr:join(matches)) 276 | } 277 | 278 | run(stream) 279 | }) 280 | } 281 | 282 | @takeWhile1(condition) { 283 | Util:pipe([ 284 | takeWhile(condition) 285 | satisfy(@(value) { 286 | ? (Str:len(value) = 0) { no } . { yes } 287 | }, "Expected at least one match") 288 | ]) 289 | } 290 | } 291 | 292 | :: ParserStore { 293 | @mk(parser) { 294 | { 295 | parser: parser 296 | } 297 | } 298 | 299 | @create() { 300 | mk(Parser:ok({})) 301 | } 302 | 303 | @merge(parserFn) { 304 | @(store) { 305 | mk( 306 | Util:pipe([ 307 | store.parser 308 | Parser:then(@(value1) { 309 | #parser = parserFn(value1) 310 | Util:pipe([ 311 | parser 312 | Parser:map(@(value2) { 313 | Util:merge(value1, value2) 314 | }) 315 | ]) 316 | }) 317 | ]) 318 | ) 319 | } 320 | } 321 | 322 | @skip(parserFn) { 323 | @(store) { 324 | mk( 325 | Util:pipe([ 326 | store.parser 327 | Parser:then(@(value) { 328 | #parser = parserFn(value) 329 | Util:pipe([ 330 | parser 331 | Parser:map(@() { value }) 332 | ]) 333 | }) 334 | ]) 335 | ) 336 | } 337 | } 338 | 339 | @store(key, parserFn) { 340 | merge(@(value1) { 341 | #parser = parserFn(value1) 342 | Util:pipe([ 343 | parser 344 | Parser:map(@(value2) { 345 | #o = {} 346 | Obj:set(o, key, value2) 347 | o 348 | }) 349 | ]) 350 | }) 351 | } 352 | 353 | @parser(store) { 354 | store.parser 355 | } 356 | } 357 | 358 | #spaces = Parser:takeWhile(@(value) { 359 | ? (value = " ") { yes } . { no } 360 | }) 361 | 362 | #mfmTagOpen = Parser:token("$[") 363 | 364 | #mfmTagName = Parser:takeWhile1(@(value) { 365 | ? (value = " ") { no } . { yes } 366 | }) 367 | 368 | #mfmTagClose = Parser:token("]") 369 | 370 | #mfmTagText = Parser:takeWhile1(@(value) { 371 | ? Str:incl("`$]", value) { no } . { yes } 372 | }) 373 | 374 | #codeToggle = Parser:token("`") 375 | 376 | #codeBlockToggle = Parser:token("```") 377 | 378 | #codeText = Parser:takeWhile1(@(value) { 379 | ? (value = "`") { no } . { yes } 380 | }) 381 | 382 | #code = Util:pipe([ 383 | ParserStore:create() 384 | ParserStore:skip(@() { codeToggle }) 385 | ParserStore:store("content", @() { codeText }) 386 | ParserStore:skip(@() { codeToggle }) 387 | ParserStore:parser 388 | Parser:map(@(store) { Arr:join(["`" store.content "`"]) }) 389 | ]) 390 | 391 | #codeBlock = Util:pipe([ 392 | ParserStore:create() 393 | ParserStore:skip(@() { codeBlockToggle }) 394 | ParserStore:store("content", @() { codeText }) 395 | ParserStore:skip(@() { codeBlockToggle }) 396 | ParserStore:parser 397 | Parser:map(@(store) { Arr:join(["`" store.content "`"]) }) 398 | ]) 399 | 400 | #mfmTag = Util:pipe([ 401 | ParserStore:create() 402 | ParserStore:skip(@() { mfmTagOpen }) 403 | ParserStore:skip(@() { mfmTagName }) 404 | ParserStore:skip(@() { spaces }) 405 | ParserStore:store("content", @() { mfmTagContent }) 406 | ParserStore:skip(@() { mfmTagClose }) 407 | ParserStore:parser 408 | Parser:map(@(store) { store.content }) 409 | ]) 410 | 411 | #mfmTagContent = Util:pipe([ 412 | Parser:many( 413 | Parser:oneOf([ 414 | mfmTagText 415 | codeBlock 416 | code 417 | mfmTag 418 | Parser:token("`") 419 | Parser:token("$") 420 | ]) 421 | ) 422 | Parser:map(@(parts) { Arr:join(parts) }) 423 | ]) 424 | 425 | #noteText = Parser:takeWhile1(@(value) { 426 | ? Str:incl("`$", value) { no } . { yes } 427 | }) 428 | 429 | #noteContent = Util:pipe([ 430 | Parser:many( 431 | Parser:oneOf([ 432 | noteText 433 | codeBlock 434 | code 435 | mfmTag 436 | Parser:token("`") 437 | Parser:token("$") 438 | ]) 439 | ) 440 | Parser:map(@(parts) { Arr:join(parts) }) 441 | ]) 442 | 443 | @strip(t) { 444 | #result = noteContent.parse(Stream:of(t)) 445 | 446 | ? result.ok { 447 | << result.value 448 | } 449 | 450 | Arr:join(["Error at position " Core:to_str(result.stream.pos) ": " result.error]) 451 | } 452 | 453 | $input <- "Here is $[rainbow $[x2 an example] input]." 454 | $output <- strip(input) 455 | 456 | @onUpdated(name, value) { 457 | ? (name = "input") { input <- value } 458 | output <- strip(input) 459 | } 460 | 461 | MkPages:updated(onUpdated) 462 | -------------------------------------------------------------------------------- /custom-css/README.md: -------------------------------------------------------------------------------- 1 | # Misskey Custom CSS 2 | 3 | Custom CSS tweaks you can apply to your web client to change how Misskey looks 4 | or behaves. 5 | 6 | ## List of Custom CSS 7 | 8 | 1. [Post Replies on Hover](#Post-Replies-on-Hover) 9 | 2. [MFM on Hover](#MFM-on-Hover) 10 | 3. [Post Replies slide out](#Post-Replies-slide-out) 11 | 4. [Hide "You" in Mentions](#Hide-You-in-Mentions) 12 | 5. [Hide Profile Icon in Mentions](#Hide-Profile-Icon-in-Mentions) 13 | 6. [Stop Blinking Notification Dots](#Stop-Blinking-Notification-Dots) 14 | 15 | ## Post Replies on Hover 16 | 17 | * **Author**: Volpeon 18 | * **Date**: 2021-09-25 19 | * **Misskey Version**: 12.91.0 20 | * **Description**: A custom CSS snippet to declutter the timeline, similar to 21 | how Pleroma displays replies. 22 | 23 | - Parent posts are hidden by default 24 | - When you hover a post, the parent post will be shown 25 | - To avoid any erratic behavior, the parent post appears on top of the preceding post, covering it 26 | - For better visibility, the hovered post will be highlighted 27 | 28 | ## MFM on Hover 29 | 30 | * **Author**: Fristi, Volpeon, Robflop 31 | * **Date**: 2021-08-23 32 | * **Misskey Version**: 12.89.0 33 | * **Description**: A custom CSS snippet which stops MFM animations until you 34 | are hovering over the post. This makes it much less annoying to browse your 35 | timeline if someone has made a post with MFM that causes the post's contents 36 | to go outside of the post itself. 37 | 38 | ## Post Replies slide out 39 | 40 | * **Author**: Johann150 41 | * **Date**: 2021-08-23 42 | * **Misskey Version**: at least since 12.83.4 43 | * **Description**: Alternate way to collapse parent posts that does not allow 44 | overflow. 45 | 46 | - Parent posts are shortened to the user name and first line of content. 47 | - When you hover over the parent post, the main post will slide down to make 48 | the rest of the parent post visible. 49 | 50 | ## Hide "You" in Mentions 51 | * **Author**: Amolith 52 | * **Date**: 2021-10-25 53 | * **Misskey Version**: 12.94.1 54 | * **Description**: Hide the tiny text next to your handle that says "You" when someone mentions you: 55 | 56 | ``` 57 | .me { 58 | display: none; 59 | } 60 | ``` 61 | 62 | ## Hide Profile Icon in Mentions 63 | * **Author**: Amolith 64 | * **Date**: 2021-10-25 65 | * **Misskey Version**: 12.94.1 66 | * **Description**: Hide the profile picture icon next to a handle in a post: 67 | 68 | ``` 69 | .icon { 70 | display: none; 71 | } 72 | ``` 73 | 74 | ## Stop Blinking Notification Dots 75 | * **Author**: Liz 76 | * **Date**: 2021-11-23 77 | * **Misskey Version**: 12.96.1 78 | * **Description**: Stop the blinking dots indicating you have unread notes. 79 | -------------------------------------------------------------------------------- /custom-css/archive/README.md: -------------------------------------------------------------------------------- 1 | # Misskey Custom CSS 2 | 3 | Older custom CSS snippets that are not relevant for the lastest vesion of 4 | Misskey any more. 5 | 6 | These might still be interesting e.g. if you are running an older version of 7 | Misskey. 8 | 9 | ## List of CSS snippets 10 | 11 | 1. [Wiggly cat ears](#Wiggly-Cat-Ears) 12 | 13 | ## Wiggly Cat Ears 14 | 15 | * **Author**: Puniko 16 | * **Date**: 2021-09-10 17 | * **Misskey Version**: 12.90.1 18 | * **Description**: Plays an ear wiggle animation on hovering over avatars. Basically 19 | what the pleroma-mod-catify had, but now for misskey 20 | -------------------------------------------------------------------------------- /custom-css/archive/wiggly-cat-ears.css: -------------------------------------------------------------------------------- 1 | .cat:hover::before { 2 | animation: earwiggleleft 1s infinite; 3 | } 4 | 5 | .cat:hover::after { 6 | animation: earwiggleright 1s infinite; 7 | } 8 | 9 | @keyframes earwiggleleft { 10 | from { transform: rotate(37.6deg) skew(30deg); } 11 | 25% { transform: rotate(10deg) skew(30deg); } 12 | 50% { transform: rotate(20deg) skew(30deg); } 13 | 75% { transform: rotate(0deg) skew(30deg); } 14 | to { transform: rotate(37.6deg) skew(30deg); } 15 | } 16 | 17 | @keyframes earwiggleright { 18 | from { transform: rotate(-37.6deg) skew(-30deg); } 19 | 30% { transform: rotate(-10deg) skew(-30deg); } 20 | 55% { transform: rotate(-20deg) skew(-30deg); } 21 | 75% { transform: rotate(0deg) skew(-30deg); } 22 | to { transform: rotate(-37.6deg) skew(-30deg); } 23 | } 24 | -------------------------------------------------------------------------------- /custom-css/mfm-on-hover.css: -------------------------------------------------------------------------------- 1 | .article:not(:hover) span, .wrpstxzv:not(:hover) span { 2 | animation: none !important; 3 | } 4 | -------------------------------------------------------------------------------- /custom-css/post-replies-on-hover.css: -------------------------------------------------------------------------------- 1 | .notes div[tabindex="-1"] { 2 | overflow: visible; 3 | contain: none; 4 | } 5 | 6 | .notes div[tabindex="-1"] .reply-to { 7 | position: absolute; 8 | left: 2%; 9 | bottom: calc(100% - 1em); 10 | max-width: 85%; 11 | box-sizing: border-box; 12 | background: var(--panelHighlight); 13 | z-index: 1000; 14 | padding: 20px 24px; 15 | box-shadow: 0 .5em 2em rgba(0, 0, 0, .5); 16 | opacity: 0; 17 | visibility: hidden; 18 | transition: opacity .2s, visibility 0s ease .2s; 19 | } 20 | 21 | .notes div[tabindex="-1"]:hover .reply-to { 22 | opacity: 1; 23 | visibility: visible; 24 | transition: opacity .2s ease .75s, visibility 0s ease .75s; 25 | } 26 | -------------------------------------------------------------------------------- /custom-css/post-replies-slide-out.css: -------------------------------------------------------------------------------- 1 | .wrpstxzv.reply-to { 2 | max-height: 70px; /* 38px profile pic + 16px padding bottom */ 3 | box-sizing: border-box; 4 | overflow: hidden; 5 | transition: max-height .6s, box-shadow .6s; 6 | box-shadow: 0 -15px 10px inset var(--bg); 7 | } 8 | 9 | .wrpstxzv.reply-to:hover { 10 | max-height: 100vh; 11 | box-shadow: none; 12 | } 13 | -------------------------------------------------------------------------------- /custom-css/stop-blinking-notification-dots.css: -------------------------------------------------------------------------------- 1 | .i, 2 | .indicator { 3 | animation: none !important; 4 | } 5 | -------------------------------------------------------------------------------- /documentation/DELETE_UserAccount.md: -------------------------------------------------------------------------------- 1 | WARNING: THIS IS IRREVERSIBLE AND MAY CAUSE THE SERVER TO CRASH; DO THIS AT YOUR OWN RISK 2 | 3 | ## Initial Steps 4 | Connect to your PostgreSQL with `sudo -u postgres psql` for example. 5 | With the command `\du` you can Check, which databses you have. 6 | 7 | ### Now connect to your Misskey-Database 8 | ``` 9 | \c '{misskey_database}' 10 | ``` 11 | 12 | ## Sort the Data you need 13 | 14 | You can get the userID from the Server Admin UI. 15 | ('Instance' -> 'Users' -> Click on a User and get the ID). 16 | 17 | We will use the "AND id" here, cause we will run into Problems, if there are more Users with the same Username on different Instances. 18 | 19 | It seeems that, there is nothing in signin, when the user didn't logged in for a while. 20 | 21 | ``` 22 | SELECT * FROM public.used_username WHERE username='{username}}'; 23 | 24 | SELECT * FROM public.user WHERE username='{username}' AND id='{userId}}'; 25 | 26 | SELECT * FROM public.signin WHERE userId='{userId}'; 27 | ``` 28 | 29 | 30 | ## Delete the User 31 | 32 | So if we got all the Data together, we need. We can delete the User 33 | 34 | ``` 35 | DELETE FROM public.used_username WHERE username='{username}'; 36 | 37 | DELETE FROM public.user WHERE username='{username}' AND id='{userId}'; 38 | 39 | DELETE FROM public.signin WHERE userId = '{usedID}'; 40 | ``` 41 | 42 | 43 | ## Inspired By @aho@rosehip.moe 44 | https://cirrostrat.org/blog/2021/07/03/Remove-Used-Usernames-from-Misskey-PSQL-Database/ -------------------------------------------------------------------------------- /documentation/README.md: -------------------------------------------------------------------------------- 1 | # Misskey Documentation 2 | 3 | Additional documentation explaining how to do things or highlighting important 4 | things to know which aren't yet well-documented in the main project. Tips and 5 | tricks go here. 6 | 7 | ## Table of Contents 8 | 9 | 1. [ActivityPub Signging](#ActivityPub-Signing) 10 | 2. [AiScript source in pages](#aiscript-source-in-pages) 11 | 3. [Worker Processes](#worker-processes) 12 | 4. [Memory for yarn build](#memory-for-yarn-build) 13 | 5. [MFM Editor](#mfm-editor) 14 | 15 | ## ActivityPub Signing 16 | 17 | * **Author**: Johann150 18 | * **Date**: 2021-08-10 19 | * **Misskey Version**: at least since 12.84.3 until 12.85.1 20 | * **Description**: Resolve some federation issues with other AP software. 21 | 22 | Some other ActivityPub Software can have issues federating with Misskey with 23 | the default settings. This is because especially with Mastodon, signing 24 | ActivityPub requests is necessary. 25 | 26 | Because of this you should enable the `signToActivityPubGet` option in 27 | `.config/default.yml`. This option should already be on the last line of the 28 | example configuration included with misskey. 29 | 30 | ## AiScript source in pages 31 | 32 | * **Author**: Johann150 33 | * **Date**: 2021-08-10 34 | * **Misskey Version**: at least since 12.84.3 until 12.85.1 35 | * **Description**: What to do to embed AiScript source code in a misskey page. 36 | 37 | When embedding AiScript source code in a Misskey page inside a code block as 38 | part of a MFM section, the AiScript code sometimes appears to get modified by 39 | Misskey. 40 | 41 | To avoid this, you can add another section of type "Multiline Text Input" to 42 | your page and put the source code in the default value. This is done through 43 | the "+"-Button at the end of the "Contents" section, and selecting the 44 | appropriate section type in the resulting popup. 45 | 46 | ## Worker Processes 47 | 48 | * **Author**: Normandy 49 | * **Date**: 2021-08-12 50 | * **Misskey Version**: 12.87.0 (likely applies to earlier versions as well) 51 | * **Description**: Setting the number of worker processes 52 | 53 | By default, Misskey uses 1 worker process. If you are experiencing performance 54 | issues, try setting `clusterLimit` in `.config/default.yml` to the number of CPU 55 | cores available to Misskey. Feel free to play around with the number a little 56 | to find one that results in optimal performance. 57 | 58 | **Note:** this isn't recommended by the Misskey developers due to potentially higher 59 | RAM utilization. *Your mileage may vary.* 60 | 61 | ## Memory for `yarn build` 62 | 63 | * **Author**: Normandy 64 | * **Date**: 2021-08-20 65 | * **Misskey Version**: 12.88.0 66 | * **Description**: Deadling with memory issues for `yarn build` 67 | 68 | When installing or upgrading Misskey, the `yarn build` step may run out of 69 | memory on systems with 2GB or less RAM. There's a few things you can try to do 70 | in this case: 71 | 1. If you're running in a VM, you may want to temporarily increase your RAM to 72 | 4GB or higher. This may cost extra if you're renting from a cloud provider. 73 | If you don't want to deal with the extra cost permanently, you can scale back 74 | down after running `yarn build`. 75 | 2. Increase the heap size for NodeJS. Do this by setting the following environment 76 | variable: `NODE_OPTIONS=--max-old-space-size=1536` 77 | 3. Add swap space by creating a swapfile of at least 1GB. A guide on how to do this 78 | can be found here: https://linuxize.com/post/create-a-linux-swap-file/ 79 | 80 | You may have to use both options 2 and 3 if you are on a very memory 81 | constrained system. Keep in mind Misskey itself needs 1GB RAM minimum 82 | to operate well. 83 | 84 | ## MFM Editor 85 | 86 | * **Author**: Puniko 87 | * **Date**: 2021-08-25 88 | * **Misskey Version**: 12.88.0 89 | * **Description**: An MFM editor was created to allow easy experimentation and 90 | crafting of MFM Art. It can be found at: https://mfm.absturztau.be/ 91 | 92 | ## Enabling push notifications 93 | 94 | * **Author**: Normandy 95 | * **Date**: 2022-01-26 96 | * **Misskey Version**: 12.102.0 97 | * **Description**: How to enable push notifications for your instance 98 | 99 | To enable push notifications for your instance: 100 | 1. Run this command on your server to generate the required VPAID keys: `npx web-push generate-vapid-keys`. You can also use an online VPAID key generator instead if you wish. 101 | 2. Enable ServiceWorker in Control Panel > General within Misskey. Copy the generated public and private keys into the appropriate fields. 102 | 3. If you haven't done so already, grant the notifications permission from your browser in Misskey. 103 | -------------------------------------------------------------------------------- /patches/README.md: -------------------------------------------------------------------------------- 1 | # Misskey Patches 2 | 3 | A set of patches you can apply to your Misskey instance to change or enhance 4 | some functionality. 5 | 6 | If you run an older version of Misskey, you might also be interested in the 7 | [archive](archive) of patches that are not relevant for the latest version of 8 | Misskey any more. 9 | 10 | ## List of Patches 11 | 12 | 1. [MFM search feature](#MFM-search-feature) 13 | 2. [Fix Leaky Mutes](#Fix-Leaky-Mutes) 14 | 3. [Compact Notifications](#Compact-Notifications) 15 | 4. [Compatibility Keyoxide](#compatibility-keyoxide) 16 | 5. [Extend emoji list](#Extend-emoji-list) 17 | 6. [Star is Like](#Star-is-Like) 18 | 19 | ## MFM search feature 20 | 21 | * **Author**: Johann150 22 | * **Date**: 2021-08-10 23 | * **Misskey Version**: 12.84.4 - 12.85.1 24 | * **Description**: Patch to change the search engine used in MFM searches. 25 | 26 | Misskey Flavoured Markup (MFM) allows to display a search bar in a post e.g. 27 | like this: 28 | ```MFM 29 | misskey [search] 30 | ``` 31 | 32 | By default, this will open a Google search. 33 | There are two places in the source where this URL is stored, one for the 34 | misskey web client UI and another for converting MFM to HTML for other 35 | ActivityPub software. 36 | 37 | The files which have to be changed are `src/mfm/to-html.ts` and 38 | `src/client/components/google.vue`. 39 | 40 | There are 3 different example patches for more privacy respecting search 41 | engines. If you prefer another, they should enable you to choose a different 42 | one too. In alphabetical order: 43 | 44 | - [DuckDuckGo (`mfm-search-duckduckgo.patch`)](mfm-search-duckduckgo.patch) 45 | - [MetaGer (`mfm-search-metager.patch`)](mfm-search-metager.patch) 46 | - [Qwant (`mfm-search-qwant.patch`)](mfm-search-qwant.patch) 47 | 48 | Note: It seems that there are provisions for a client setting for this, but 49 | this is not currently implemented in the UI. 50 | 51 | ## Fix Leaky Mutes 52 | 53 | * **Author**: Toast 54 | * **Date**: 2021-08-13 55 | * **Misskey Version**: 12.87.0 56 | * **Description**: When you have muted someone, there was still a possibility 57 | to encounter posts by that person or see posts which mention them thanks to 58 | some loopholes in the way that the system checks whether or not to hide a 59 | post. This patch fixes those issues. 60 | 61 | ## Compact Notifications 62 | 63 | * **Author**: Johann150 64 | * **Date**: 2021-08-23 65 | * **Misskey Version**: 12.97.1 66 | * **Description**: Remove text of replied-to posts from notifications. 67 | 68 | The text of replied to or renoted notes is not shown in the notifications bar, 69 | i.e. instead of 'reply RE: post' the notification is just 'reply'. 70 | 71 | ## Compatibility Keyoxide 72 | 73 | * **Author**: sousuke0422 74 | * **Date**: 2021-08-31 75 | * **Misskey Version**: since 12.68.0 76 | * **Description**: You will be able to register with Keyoxide. 77 | 78 | Keyoxide uses application/json for authentication, so add support for it. 79 | It is treated as a mastodon in Keyoxide specification. 80 | 81 | Ported from ayuskey 5.11.0. 82 | 83 | ## Extend Emoji list 84 | 85 | * **Author**:Johann150 86 | * **Date**: 2021-11-24 87 | * **Misskey Version**: 12.97.1 88 | * **Description**: Add some aliases and new emojis to the builtin emoji list. 89 | 90 | Adds the "pudding" synonym to the custard emoji, and also newly adds regional 91 | indicator emojis to the list. These are displayed as letters if alone. Note 92 | that these become the national flags if put next to each other, so the 93 | behaviour might be confusing to some people. 94 | 95 | ## Star is Like 96 | 97 | * **Author**: Johann150 98 | * **Date**: 2022-03-19 99 | * **Misskey Version**: since 12.99.0 100 | * **Description**: Turns Star reactions into ordinary ActivityPub likes. 101 | 102 | ⚠️ Depending on when you read this, you may also need to patch the issue 103 | [misskey-dev/misskey#8428](https://github.com/misskey-dev/misskey/pull/8428) 104 | for this to always behave correctly. 105 | 106 | With this patch, all star reactions will be turned into an ordinary like 107 | activity which will allow you to star a post from Pleroma. Since Mastodon 108 | only understands likes anyway, its behaviour will not change. Star reacts 109 | may be displayed as a thumbs up reaction on other Misskey instances. 110 | -------------------------------------------------------------------------------- /patches/archive/README.md: -------------------------------------------------------------------------------- 1 | # Misskey Patches 2 | 3 | Older patches that are not relevant for the lastest vesion of Misskey any more. 4 | 5 | These might still be interesting e.g. if you are running an older version of 6 | Misskey. 7 | 8 | ## List of Patches 9 | 10 | 1. [Truncate Profiles](#Truncate-Profiles) 11 | 2. [Collapsible Threads](#Collapsible-Threads) 12 | 3. [Round time approximations](#Round-time-approximations) 13 | 14 | ## Truncate Profiles 15 | 16 | * **Author**: Toast, Johann150 17 | * **Date**: 2021-08-03 18 | * **Misskey Version**: 12.84.4 - 12.87.0 19 | * **Description**: Patch which truncates profiles that are too long for the database. 20 | 21 | This problem was resolved in Misskey version 12.88.0 with pull requests 22 | misskey-dev/misskey#7629 and misskey-dev/misskey#7642. 23 | 24 | Especially Pleroma allows for very long profiles. 25 | This can cause issues with federation for affected profiles, 26 | because misskey can not work with such users because they can not be stored 27 | in the database. 28 | 29 | There are multiple ways to fix this and an upstream fix is supposedly underway. 30 | The easiest way for now, which is implemented with the included 31 | [`misskey-truncate-v2.patch`](misskey-truncate-v2.patch) file, is to truncate 32 | display names and bios to a size misskey can store. 33 | 34 | Note however that for security reasons, user names (the `name` part in 35 | `@name@example.com`) is not truncated but federation with such profiles is 36 | still a hard fail. Otherwise, this could lead to malicious actors being able to 37 | impersonate others. 38 | 39 | ## Collapsible Threads 40 | 41 | * **Author**: Johann150 42 | * **Date**: 2021-08-14 43 | * **Misskey Version**: 12.87.0 - 12.97.0 44 | * **Description**: Make sub-threads collapsible when viewing a note. 45 | 46 | This patch adds some JavaScript to the Vue elements that make up the threads. 47 | It allows you to click on the left margin of a thread (e.g. the bar on the left 48 | that makes up a thread) to collapse it and its replies. You can of course also 49 | click in the left margin of a direct reply of the note you are viewing to 50 | collapse it. 51 | 52 | This patch is no longer deemed necessary because Misskey no longer displays replies 53 | at a depth of 5 or more. 54 | 55 | ## Round time approximations 56 | 57 | * **Author**: Johann150 58 | * **Date**: 2021-11-24 59 | * **Misskey Version**: 12.97.1 - 12.103.0 60 | * **Description**: Properly round time approximations displayed in Misskey. 61 | 62 | Instead of flooring the time approximations, they are rounded. This leads to 63 | posts being displayed as "2 weeks ago" instead of "1 week ago" when they were 64 | 13 days ago. 65 | -------------------------------------------------------------------------------- /patches/archive/collapsible-threads.patch: -------------------------------------------------------------------------------- 1 | diff --git a/src/client/components/note.sub.vue b/src/client/components/note.sub.vue 2 | index 899c4b2f1..881792fd7 100644 3 | --- a/src/client/components/note.sub.vue 4 | +++ b/src/client/components/note.sub.vue 5 | @@ -1,5 +1,5 @@ 6 |