├── .agignore ├── .gitignore ├── .ignore ├── LICENSE ├── README.md ├── official.txt ├── reset-all-repos ├── third-party.txt └── update_from_meta.rb /.agignore: -------------------------------------------------------------------------------- 1 | plugins/discourse-math/public/mathjax/* 2 | plugins/docker_manager/assets/docker-manager-app.js 3 | plugins/docker_manager/assets/docker-manager-vendor.js 4 | plugins/etherpad-lite/tests/* 5 | plugins/etherpad-lite/src/* 6 | plugins/etherpad-lite/bin/* 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /plugins/ 2 | /official/ 3 | /third-party/ -------------------------------------------------------------------------------- /.ignore: -------------------------------------------------------------------------------- 1 | !/official/ 2 | !/third-party/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Discourse 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # All the plugins 2 | 3 | A meta repository with links to every Discourse plugin that kind of works and that we know about. 4 | 5 | ### Why this repo exists? 6 | 7 | Occasionally we need to deprecate extensibility interfaces or migrate to newer and better patterns. We use this meta repository to search through all plugins when doing such work. 8 | 9 | ### Getting started with the meta repo 10 | 11 | ``` 12 | git clone https://github.com/discourse/all-the-plugins.git 13 | cd all-the-plugins 14 | ./reset-all-repos 15 | ``` 16 | 17 | ### Contributing your own plugin 18 | 19 | If you have a plugin you would like included in the meta repo create a PR to add the repository to third-party.txt 20 | 21 | Also, please make sure you publish your plugin at https://meta.discourse.org/c/plugin 22 | 23 | ### Updating 24 | 25 | To update your local copies of plugins, run `./reset-all-repos`. The default branch of each repo will be checked out, reset to the latest commit on the origin, and all 26 | local changes will be discarded. Any stale directories under `./plugins` will be deleted. 27 | 28 | If you want a totally clean slate, `rm -rf ./third-party ./official`, and then run `./reset-all-repos` again. 29 | 30 | ### Removing a plugin 31 | 32 | Delete the line from `third-party.txt` and commit your changes. To remove from your locally cloned repos, use `./reset-all-repos`. 33 | 34 | ### Update from meta script 35 | 36 | At the root of the repo we have the `update_from_meta.rb` script, this can be used to pull all the github repos in the #plugins category in meta. 37 | -------------------------------------------------------------------------------- /official.txt: -------------------------------------------------------------------------------- 1 | discourse/ask-discourse-context 2 | discourse/discourse-activity-pub 3 | discourse/discourse-adplugin 4 | discourse/discourse-affiliate 5 | discourse/discourse-ai 6 | discourse/discourse-akismet 7 | discourse/discourse-algolia 8 | discourse/discourse-amazon-sns 9 | discourse/discourse-animated-avatars 10 | discourse/discourse-anonymous-moderators 11 | discourse/discourse-antivirus 12 | discourse/discourse-apple-auth 13 | discourse/discourse-assign 14 | discourse/discourse-auth-no-email 15 | discourse/discourse-authentication-validations 16 | discourse/discourse-auto-deactivate 17 | discourse/discourse-auto-lock-pms 18 | discourse/discourse-bbcode 19 | discourse/discourse-bbcode-color 20 | discourse/discourse-bcc 21 | discourse/discourse-brightcove 22 | discourse/discourse-browser-history 23 | discourse/discourse-cakeday 24 | discourse/discourse-calendar 25 | discourse/discourse-categories-suppressed 26 | discourse/discourse-category-experts 27 | discourse/discourse-characters-required 28 | discourse/discourse-chart 29 | discourse/discourse-chat-integration 30 | discourse/discourse-client-performance 31 | discourse/discourse-code-review 32 | discourse/discourse-codebytes-plugin 33 | discourse/discourse-custom-topic-lists 34 | discourse/discourse-data-explorer 35 | discourse/discourse-deprecation-collector 36 | discourse/discourse-development-auth 37 | discourse/discourse-doc-categories 38 | discourse/discourse-docs 39 | discourse/discourse-email-short-date-format 40 | discourse/discourse-extra-group-classes 41 | discourse/discourse-fingerprint 42 | discourse/discourse-folksy-image 43 | discourse/discourse-follow 44 | discourse/discourse-fontawesome-pro 45 | discourse/discourse-gamification 46 | discourse/discourse-geoblocking 47 | discourse/discourse-github 48 | discourse/discourse-github-user-infos-view 49 | discourse/discourse-github-verification 50 | discourse/discourse-google-one-tap 51 | discourse/discourse-gradle-issue 52 | discourse/discourse-graphviz 53 | discourse/discourse-group-category-banner-ads 54 | discourse/discourse-group-membership-ip-block 55 | discourse/discourse-group-tag-associations 56 | discourse/discourse-group-tracker 57 | discourse/discourse-hcaptcha 58 | discourse/discourse-intercom 59 | discourse/discourse-jira 60 | discourse/discourse-just-chat 61 | discourse/discourse-jwt 62 | discourse/discourse-kolide 63 | discourse/discourse-livestream 64 | discourse/discourse-local-site-contacts 65 | discourse/discourse-login-client 66 | discourse/discourse-login-with-amazon 67 | discourse/discourse-logster-transporter 68 | discourse/discourse-lti 69 | discourse/discourse-marketo 70 | discourse/discourse-math 71 | discourse/discourse-meteor 72 | discourse/discourse-microsoft-auth 73 | discourse/discourse-needs-love 74 | discourse/discourse-newsletter-integration 75 | discourse/discourse-no-bump 76 | discourse/discourse-oauth2-basic 77 | discourse/discourse-onboarding-banner 78 | discourse/discourse-open-graph 79 | discourse/discourse-openid-connect 80 | discourse/discourse-page-visits 81 | discourse/discourse-password-expiry 82 | discourse/discourse-patreon 83 | discourse/discourse-perspective-api 84 | discourse/discourse-pirate-speak 85 | discourse/discourse-plugin-skeleton 86 | discourse/discourse-policy 87 | discourse/discourse-post-voting 88 | discourse/discourse-prepend-tags-in-topic-slug 89 | discourse/discourse-preset-topic-composer 90 | discourse/discourse-prioritize-generic-onebox 91 | discourse/discourse-prometheus 92 | discourse/discourse-prometheus-alert-receiver 93 | discourse/discourse-ratings 94 | discourse/discourse-reactions 95 | discourse/discourse-restricted-replies 96 | discourse/discourse-rewind 97 | discourse/discourse-route-blocker 98 | discourse/discourse-rss-polling 99 | discourse/discourse-salesforce 100 | discourse/discourse-saml 101 | discourse/discourse-saved-searches 102 | discourse/discourse-shared-edits 103 | discourse/discourse-signatures 104 | discourse/discourse-sketchup-3dwh-onebox 105 | discourse/discourse-sketchup-sso 106 | discourse/discourse-solved 107 | discourse/discourse-solved-reminders-plugin 108 | discourse/discourse-staff-alias 109 | discourse/discourse-steam-login 110 | discourse/discourse-subscriptions 111 | discourse/discourse-surveys 112 | discourse/discourse-tag-by-group 113 | discourse/discourse-tag-topic-user-device 114 | discourse/discourse-teambuild 115 | discourse/discourse-templates 116 | discourse/discourse-theme-creator 117 | discourse/discourse-tooltips 118 | discourse/discourse-topic-noindex 119 | discourse/discourse-topic-voting 120 | discourse/discourse-translator 121 | discourse/discourse-tudiabetes 122 | discourse/discourse-unhandled-tagger 123 | discourse/discourse-unlock 124 | discourse/discourse-url-filters 125 | discourse/discourse-user-card-badges 126 | discourse/discourse-user-notes 127 | discourse/discourse-video 128 | discourse/discourse-vk-auth 129 | discourse/discourse-watch-category-mcneel 130 | discourse/discourse-watched-word-exceptions 131 | discourse/discourse-whos-online 132 | discourse/discourse-yearly-review 133 | discourse/discourse-zendesk-plugin 134 | discourse/discourse-zoom 135 | discourse/docker_manager 136 | discourse/folksy-store-name 137 | discourse/twitter-profile-link 138 | discourse/twitter-topic-group-button 139 | -------------------------------------------------------------------------------- /reset-all-repos: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "bundler/inline" 4 | 5 | gemfile do 6 | source "https://rubygems.org" 7 | gem "mass_git_clone", "0.3.0" 8 | end 9 | 10 | if File.exist?("#{__dir__}/plugins") && !File.exist?("#{__dir__}/third-party") && !File.exist?("#{__dir__}/official") 11 | # Automatically migrate to new structure without losing git repo state 12 | # (removed after April 2024) 13 | FileUtils.cp_r("#{__dir__}/plugins", "#{__dir__}/third-party") 14 | FileUtils.mv("#{__dir__}/plugins", "#{__dir__}/official") 15 | end 16 | 17 | targets = %w[official third-party] 18 | 19 | if ARGV[0] 20 | raise "Unknown target #{ARGV[0]}" unless targets.include?(ARGV[0]) 21 | targets = [ARGV[0]] 22 | end 23 | 24 | targets.each do |type| 25 | repos = File.read("#{__dir__}/#{type}.txt").split("\n") 26 | base_dir = File.join(__dir__, type) 27 | MassGitClone.mass_clone(repo_list: repos, repo_base_dir: base_dir) 28 | end 29 | -------------------------------------------------------------------------------- /third-party.txt: -------------------------------------------------------------------------------- 1 | 29th/discourse-user-by-id 2 | acaporrini/discourse-auto-bookmarks 3 | Ahmedgagan/discourse-custom-trust-level 4 | angusmcleod/discourse-authorship 5 | angusmcleod/discourse-events 6 | angusmcleod/discourse-header-search 7 | bolariin/discourse-response-bot 8 | CambridgeDigitalBibleResearch/discourse-small-caps 9 | CERN/msgraph-poll-discourse-plugin 10 | chapoi/discourse-silenced-flair 11 | Codecademy/discourse-codebytes-plugin 12 | communiteq/discourse-anonymous-categories 13 | communiteq/discourse-category-restrictor 14 | communiteq/discourse-delete-unreplied-topics 15 | communiteq/discourse-geo-blocking 16 | communiteq/discourse-membership-indicator 17 | communiteq/discourse-migratepassword 18 | communiteq/discourse-private-replies 19 | communiteq/discourse-private-topics 20 | communiteq/discourse-restrict-pms-to-group 21 | communiteq/discourse-user-response-times 22 | coopcreds/discourse-verifiable-credentials 23 | cpradio/discourse-plugin-vb-emoticons 24 | cpradio/vb_emoji 25 | critcola/discourse-clyp-onebox 26 | critcola/discourse-overwatch-hero-icons 27 | critcola/discourse-playstv-onebox 28 | critcola/discourse-post-abbreviations 29 | crob611/discourse-image-gallery 30 | danskdynamit/discourse-hot-topics 31 | danskdynamit/discourse-links-category 32 | dappy-studio/gitcoin-passport-discourse-plugin 33 | davidtaylorhq/discourse-auto-suspend 34 | davidtaylorhq/discourse-dev-login 35 | davidtaylorhq/discourse-telegram-notifications 36 | debtcollective/discourse-sentry 37 | dsims/discourse-emoji-letter-avatar 38 | dsims/discourse-highest-post 39 | dtchau/discourse-plugin-autoplay 40 | Ebsy/discourse-nationalflags 41 | fantasticfears/discourse-chinese-localization-pack 42 | fantasticfears/discourse-etiquette 43 | featheredtoast/discourse-pushover-notifications 44 | featheredtoast/discourse-pwned-passwords 45 | fokx/discourse-cjk-formatter 46 | fzngagan/discourse-dictionary 47 | gdpelican/mingle 48 | gdpelican/retort 49 | hitorino/group-invitation 50 | HMSAB/discourse-email-extraction 51 | HMSAB/discourse-file-attachment-whisper 52 | HMSAB/discourse-private-topic 53 | HMSAB/discourse-staff-topic-generation 54 | https://gitlab.com/gitlab-org/discourse-omniauth-gitlab.git 55 | iunctis/discourse-formatting-toolbar 56 | jahan-ggn/discourse-notifier 57 | jannolii/discourse-topic-trade-buttons 58 | jericson/discourse-contact-plugin 59 | jonmbake/discourse-ldap-auth 60 | JSey/reply-by-email-TL 61 | jsorchik/changetip-discourse 62 | kasperpeulen/discourse-mathjax 63 | kcoop/discourse-blogger-plugin 64 | Lemon-planting-light/user-autonomy-plugin 65 | LeoDavidson/discourse-directoryopus 66 | leodavidson/discourse-forcemoderation 67 | LeoDavidson/discourse-reset-bump 68 | LeoMcA/discourse-wildapricot-auth 69 | Lhcfl/discourse-chat-bridge 70 | Lhcfl/discourse-post-folding 71 | Lhcfl/email-extension 72 | Lhcfl/replace-translations-global 73 | ligthyear/discourse-plugin-checklist 74 | ligthyear/discourse-plugin-pm-button 75 | liliakai/discourse-chargebee 76 | literatecomputing/discourse-add-new-posts-to-summary 77 | literatecomputing/discourse-google-group-link 78 | marcoceppi/discourse-ubuntu-sso 79 | matthieu-lapeyre/wp-discourse-topic-integration 80 | mcwumbly/discourse-slackdoor 81 | melhosseiny/discourse-nft-avatar 82 | merefield/discourse-ai-topic-summary 83 | merefield/discourse-category-home 84 | merefield/discourse-discord-bot 85 | merefield/discourse-frotz 86 | merefield/discourse-locations 87 | merefield/discourse-onebox-assistant 88 | merefield/discourse-slack-bot 89 | merefield/discourse-tc-bars 90 | merefield/discourse-user-network-vis 91 | merefield/discourse-word-cloud 92 | merefield/discourse-workflow 93 | MiguelAngelLV/steamuser-onebox 94 | Mittineague/discourse-kinder-guardian 95 | Mittineague/discourse-plugin-outlet-locations 96 | mlamarque/algoliasearch-discourse 97 | mlamarque/yammer-connect 98 | moderation-api/discourse-moderation-api 99 | mondiscourse/discourse-formatting-toolbar 100 | mooosu/wechat_qrconnect 101 | mozilla/discourse-auto-email-in 102 | mozilla/discourse-expose-emails-in 103 | mozilla/discourse-post-read-email 104 | mrloop/garmin_connect_onebox 105 | muhlisbc/discourse-custom-activity-summary-template 106 | naveed-ahmad/marvelapp_onebox 107 | nbianca/discourse-favorites 108 | netdeamon/discourse-googlebooks 109 | netdeamon/force-signin 110 | notriddle/discourse-shadowban 111 | Nubebuster/discourse-set-user-ip 112 | nunof07/discourse-mumble 113 | paviliondev/discourse-category-lockdown 114 | paviliondev/discourse-custom-wizard 115 | paviliondev/discourse-journal 116 | paviliondev/discourse-knowledge-base 117 | paviliondev/discourse-layouts 118 | paviliondev/discourse-legal-tools 119 | paviliondev/discourse-linkify-google-sheets 120 | paviliondev/discourse-mentionables 121 | paviliondev/discourse-multilingual 122 | paviliondev/discourse-news 123 | paviliondev/discourse-question-answer 124 | paviliondev/discourse-ratings 125 | paviliondev/discourse-tickets 126 | paviliondev/discourse-topic-previews 127 | paviliondev/pavilion-landing-theme 128 | pfaffman/discourse-allow-pm-to-staff 129 | pfaffman/discourse-avatar-name-first-letter 130 | pfaffman/discourse-doi-resolver 131 | phw/discourse-musicbrainz-onebox 132 | pmusaraj/discourse-onesignal 133 | PoloGT/abbreviation-discourse-plugin 134 | procourse/discourse-full-screen-videos-plugin 135 | procourse/discourse-mlm-daily-summary 136 | procourse/procourse-static-pages 137 | rcfox/Discourse-Webhooks 138 | reallyreally/discourse-mailgun 139 | Regalijan/discourse-codeberg-auth 140 | Regalijan/discourse-mailgun-routes 141 | Regalijan/gcloud-cdn-signer 142 | samsaffron/blog 143 | ScottMastro/discourse-randomized-banner 144 | sekhat/discourse-yuml 145 | shivpkumar/Zendesk-Plugin 146 | singerscreations/discourse-stopforumspam 147 | sirideain/discourse-mark 148 | sman591/discourse-nntp-bridge 149 | snap-blocks/snapblocks-discourse 150 | spirobel/monero-discourse-subscriptions 151 | spirobel/projects 152 | spruceid/discourse-siwe-auth 153 | sudaraka94/discourse-opencollective-integration 154 | sylque/discourse-a2a-bbcode 155 | sylque/discourse-home-page 156 | sylque/discourse-multilingual-post 157 | sylque/discpage 158 | sylque/docuss 159 | techapj/discourse-custom-topic-button 160 | techapj/discourse-topic-group-button 161 | tgxworld/discourse-graphql 162 | thijsbrilleman/discourse-click-to-edit 163 | thijsbrilleman/discourse-publish-direct-messages 164 | thoka/discourse-login-helper 165 | thoka/discourse-send-pdf-inline 166 | thoka/discourse-show-name-mentions 167 | thoka/discourse-turbowarp 168 | ThomDietrich/discourse-plugin-code-fences-buttons 169 | TomGrobbe/discourse-topic-limit 170 | Toxuru/discourse-sidebar-categories 171 | unfoldingWord-dev/discourse-mermaid 172 | unixneo/container-names 173 | unixneo/discourse-container-names-with-gon 174 | unixneo/discourse-priority-action-mailer 175 | unixneo/discourse-remove-canonical 176 | vikhyat/discourse-persona 177 | vinkashq/discourse-bbcode-lock 178 | vinkashq/discourse-facebook-onebox 179 | VinkasHQ/discourse-timeline 180 | VonLion/discourse-menu-icon 181 | whitewatercn/discourse-embed-bilibili 182 | Wolftallemo/discourse-gcs-helper 183 | worldismine/Duplicate-Notification-Terminator 184 | worldismine/pm-auto-responder-for-admins 185 | worldismine/PM-Scanner 186 | worldismine/Restore-PM-Mentions 187 | XertroV/cf-anon-auto-group 188 | xfalcox/discourse-backups-to-dropbox 189 | zh99998/discourse-username-localization 190 | -------------------------------------------------------------------------------- /update_from_meta.rb: -------------------------------------------------------------------------------- 1 | require "json" 2 | require "open-uri" 3 | 4 | $existing_plugins = 5 | File.read("third-party.txt").split("\n").compact + File.read("official.txt").split("\n").compact 6 | $list = [] 7 | 8 | def ensure_repo(title, topic_url) 9 | return if title =~ /about the plugin category/i 10 | 11 | result = URI.open(topic_url).read 12 | json = JSON.parse(result) 13 | 14 | op_body = json["post_stream"]["posts"][0]["cooked"] 15 | 16 | match = op_body.scan(%r{https://github\.com/[A-Z0-9_\-]+/[A-Z0-9_\-]+}i) 17 | github_url = match && match[-1] 18 | 19 | return if !github_url 20 | return if $existing_plugins.any? { |m| github_url.include?(m) } 21 | 22 | repo = github_url.sub("https://github.com/", "") 23 | 24 | puts title 25 | puts topic_url.sub(".json", "") 26 | puts github_url 27 | print "Add? (Y/n) " 28 | text = readline 29 | 30 | $list << repo unless text =~ /n/ 31 | 32 | puts "\n" 33 | end 34 | 35 | url = "https://meta.discourse.org/c/plugin/none.json" 36 | 37 | begin 38 | result = URI.open(url).read 39 | json = JSON.parse(result) 40 | 41 | topic_list = json["topic_list"] 42 | topics = topic_list["topics"] 43 | 44 | topics.each do |topic| 45 | topic_url = "https://meta.discourse.org/t/#{topic["slug"]}/#{topic["id"]}.json" 46 | ensure_repo(topic["title"], topic_url) 47 | end 48 | 49 | break unless topic_list["more_topics_url"] 50 | 51 | url = "https://meta.discourse.org#{topic_list["more_topics_url"]}" 52 | url = url.sub("latest", "latest.json") 53 | end while topics.length > 0 54 | 55 | puts $list 56 | --------------------------------------------------------------------------------