# \#plugin-guides

**URL:** https://meta.discourse.org/tag/plugin-guides/274.md

[Latest](https://meta.discourse.org/latest.md) · [Categories](https://meta.discourse.org/categories.md) · [Tags](https://meta.discourse.org/tags.md)

---

## [Developing Discourse Plugins - Part 6 - Add acceptance tests](https://meta.discourse.org/t/developing-discourse-plugins-part-6-add-acceptance-tests/32619)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 32\
**Last updated:** [June 2, 2022, 11:06am UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-6-add-acceptance-tests/32619 "2022-06-02T11:06:38Z")

</div>

Previous tutorial: Developing Discourse Plugins - Part 5 - Add an admin interface Did you know that Discourse has two large test suites for its code base? On the server side, our Ruby code has a test suite that uses rs…

---

## [Developing Discourse Plugins - Part 5 - Add an admin interface](https://meta.discourse.org/t/developing-discourse-plugins-part-5-add-an-admin-interface/31761)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 46\
**Last updated:** [September 24, 2024, 11:10am UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-5-add-an-admin-interface/31761 "2024-09-24T11:10:58Z")

</div>

Previous tutorial: Developing Discourse Plugins - Part 4 - Setup git Sometimes site settings aren’t enough of an admin interface for your plugin to work the way you want. For example, if you install the discourse-akism…

---

## [Developing Discourse Plugins - Part 4 - Setup git](https://meta.discourse.org/t/developing-discourse-plugins-part-4-setup-git/31272)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 10\
**Last updated:** [January 30, 2024, 11:12am UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-4-setup-git/31272 "2024-01-30T11:12:28Z")

</div>

Previous tutorial: Developing Discourse Plugins - Part 3 - Add custom site settings Now that your plugin is getting more sophisticated, it’s time to get more sophisticated about how you develop it. We suggest that you…

---

## [Developing Discourse Plugins - Part 1 - Create a basic plugin](https://meta.discourse.org/t/developing-discourse-plugins-part-1-create-a-basic-plugin/30515)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 32\
**Last updated:** [July 8, 2025, 8:52pm UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-1-create-a-basic-plugin/30515 "2025-07-08T20:52:10Z")

</div>

Building a plugin in Discourse can be really simple, once you learn a couple of quirks. The goal of this post is to create a skeleton plugin and introduce you to the basics. Your development environment Make sure you ha…

---

## [Developing Discourse Plugins - Part 7 - Publish your plugin](https://meta.discourse.org/t/developing-discourse-plugins-part-7-publish-your-plugin/101636)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 4\
**Last updated:** [July 29, 2021, 2:01pm UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-7-publish-your-plugin/101636 "2021-07-29T14:01:04Z")

</div>

Previous tutorial: Developing Discourse Plugins - Part 6 - Add acceptance tests You’ve created your plugin, you’ve uploaded it to GitHub and you’ve added tests. Great! Problem is, no one else knows about it. Documenti…

---

## [Developing Discourse Plugins - Part 2 - Connect to a plugin outlet](https://meta.discourse.org/t/developing-discourse-plugins-part-2-connect-to-a-plugin-outlet/31001)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 38\
**Last updated:** [November 23, 2025, 9:35am UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-2-connect-to-a-plugin-outlet/31001 "2025-11-23T09:35:13Z")

</div>

Previous tutorial: Developing Discourse Plugins - Part 1 - Create a basic plugin Getting Started: Templates Discourse’s client application is written using the Ember.js Javascript framework. Ember uses Templates to gen…

---

## [Add a new provider to discourse-chat-integration](https://meta.discourse.org/t/add-a-new-provider-to-discourse-chat-integration/68156)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 0\
**Last updated:** [August 16, 2017, 1:28pm UTC](https://meta.discourse.org/t/add-a-new-provider-to-discourse-chat-integration/68156 "2017-08-16T13:28:28Z")

</div>

discourse-chat-integration abstracts away the boilerplate for integrating Discourse with external chatroom systems. There are three features which a provider implementation can support: Notifications, Slash Commands and T…

---

## [Add a new locale from plugin](https://meta.discourse.org/t/add-a-new-locale-from-plugin/78962)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 1\
**Last updated:** [June 11, 2019, 1:51pm UTC](https://meta.discourse.org/t/add-a-new-locale-from-plugin/78962 "2019-06-11T13:51:24Z")

</div>

Usually the best way to add a new language to Discourse is by creating a pull request as described in “How to add a new language”. The following guide is for you, if you want to use a language that can’t be added to cor…

---

## [Override existing Discourse methods in plugins](https://meta.discourse.org/t/override-existing-discourse-methods-in-plugins/83389)

<div class="topic-metadata">

**Author:** [@gdpelican](https://meta.discourse.org/u/gdpelican)\
**Replies:** 8\
**Last updated:** [December 10, 2025, 5:36pm UTC](https://meta.discourse.org/t/override-existing-discourse-methods-in-plugins/83389 "2025-12-10T17:36:56Z")

</div>

I’ve been running into a bunch of instances recently of needing to override existing ruby methods from plugins, and thought I’d share my best practices here. Overriding an instance method class ::TopicQuery module Bab…

---

## [Repackaging a markdown-it extension as a Discourse plugin](https://meta.discourse.org/t/repackaging-a-markdown-it-extension-as-a-discourse-plugin/84614)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 0\
**Last updated:** [April 5, 2018, 2:05am UTC](https://meta.discourse.org/t/repackaging-a-markdown-it-extension-as-a-discourse-plugin/84614 "2018-04-05T02:05:44Z")

</div>

markdown.it the CommonMark engine used by Discourse has a wide array of plugins Header anchors, definition lists, smart-arrows and the list goes on and on. First a warning :warning: CommonMark is meant to be… Common. …

---

## [Developing Discourse Plugins - Part 3 - Add custom site settings](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 39\
**Last updated:** [March 15, 2025, 11:08pm UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115 "2025-03-15T23:08:09Z")

</div>

Previous tutorial: Developing Discourse Plugins - Part 2 - Connect to a plugin outlet Site Settings If you visit /admin/site\_settings on a Discourse you have administrator capabilities on, you’ll see a list of configur…

---

## [Add a custom per-user setting in a plugin](https://meta.discourse.org/t/add-a-custom-per-user-setting-in-a-plugin/94048)

<div class="topic-metadata">

**Author:** [@gdpelican](https://meta.discourse.org/u/gdpelican)\
**Replies:** 27\
**Last updated:** [December 20, 2023, 6:49pm UTC](https://meta.discourse.org/t/add-a-custom-per-user-setting-in-a-plugin/94048 "2023-12-20T18:49:07Z")

</div>

I just went through this process and experienced a bunch of trial and error, so I thought I’d document my findings to help the next developer to come along. The things I needed: Register your custom field type (mine …

---

## [Structuring a plugin for Rails autoloading](https://meta.discourse.org/t/structuring-a-plugin-for-rails-autoloading/256092)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 10\
**Last updated:** [January 9, 2024, 10:13am UTC](https://meta.discourse.org/t/structuring-a-plugin-for-rails-autoloading/256092 "2024-01-09T10:13:30Z")

</div>

Many plugins include lots of class definitions inside plugin.rb, or use require\_relative to load ruby files. That works, but it comes with some disadvantages: No auto-reloading of changes in development. Any changes re…

---

## [Package a Discourse plugin as a gem](https://meta.discourse.org/t/package-a-discourse-plugin-as-a-gem/273036)

<div class="topic-metadata">

**Author:** [@angus](https://meta.discourse.org/u/angus)\
**Replies:** 4\
**Last updated:** [July 27, 2023, 4:59pm UTC](https://meta.discourse.org/t/package-a-discourse-plugin-as-a-gem/273036 "2023-07-27T16:59:01Z")

</div>

Pavilion has started to package some Discourse plugins as ruby gems, starting with our subscription client. Our subscription client is still a separate plugin which now loads this gem, but it’s backend is now entirely…

---

## [Add translation to a plugin](https://meta.discourse.org/t/add-translation-to-a-plugin/54748)

<div class="topic-metadata">

**Author:** [@Pad\_Pors](https://meta.discourse.org/u/Pad_Pors)\
**Replies:** 0\
**Last updated:** [December 24, 2016, 4:14pm UTC](https://meta.discourse.org/t/add-translation-to-a-plugin/54748 "2016-12-24T16:14:13Z")

</div>

go to the github repository of the plugin, e. g. discourse-canned-replies. go to /config/locales folder of the plugin. you should see some yml files, like client.en.yml and server.en.yml. the client file is for th…

---

## [Making Plugin Templates Localization friendly](https://meta.discourse.org/t/making-plugin-templates-localization-friendly/40952)

<div class="topic-metadata">

**Author:** [@Mittineague](https://meta.discourse.org/u/Mittineague)\
**Replies:** 0\
**Last updated:** [March 13, 2016, 3:04am UTC](https://meta.discourse.org/t/making-plugin-templates-localization-friendly/40952 "2016-03-13T03:04:20Z")

</div>

If you are familiar with WordPress plugins, you may have noticed that the more popular ones take advantage of gettext so that their text can be translated. It takes a little bit of effort to wrap text inside of function…
