# Developer Guides

**URL:** https://meta.discourse.org/c/documentation/developer-guides/56.md?page=2

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

**Page:** 3

---

## [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 custom content that only appears on your homepage](https://meta.discourse.org/t/add-custom-content-that-only-appears-on-your-homepage/131415)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 10\
**Last updated:** [February 29, 2024, 3:04pm UTC](https://meta.discourse.org/t/add-custom-content-that-only-appears-on-your-homepage/131415 "2024-02-29T15:04:44Z")

</div>

A very common situation you’ll find yourself in as a theme developer is the need to create content that only shows on the homepage of your community. You might add some HTML to the “After Header” section of your theme, …

---

## [Add localizable strings to themes and theme components](https://meta.discourse.org/t/add-localizable-strings-to-themes-and-theme-components/109867)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 22\
**Last updated:** [August 9, 2024, 7:58pm UTC](https://meta.discourse.org/t/add-localizable-strings-to-themes-and-theme-components/109867 "2024-08-09T19:58:55Z")

</div>

For those looking to add custom languages and translations to a Discourse theme or theme component, they can now include localised strings, which are made available for use in UI components. Translations are stored in th…

---

## [Structure of themes and theme components](https://meta.discourse.org/t/structure-of-themes-and-theme-components/60848)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 0\
**Last updated:** [April 12, 2017, 3:41pm UTC](https://meta.discourse.org/t/structure-of-themes-and-theme-components/60848 "2017-04-12T15:41:30Z")

</div>

Discourse supports native themes that can be sourced from a .tar.gz archive or from a remote git repository including private repositories. An example theme is at: GitHub - discourse/discourse-simple-theme: Sam's sim…

---

## [Alternative icons](https://meta.discourse.org/t/alternative-icons/206693)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 28\
**Last updated:** [April 7, 2026, 4:36pm UTC](https://meta.discourse.org/t/alternative-icons/206693 "2026-04-07T16:36:02Z")

</div>

By default, Discourse bundles icons from the excellent FontAwesome library. But there are a lot of free-to-use icon libraries out there. This topic is the home of alternative icon sets. It lists some theme components tha…

---

## [Theme modifiers: A brief introduction](https://meta.discourse.org/t/theme-modifiers-a-brief-introduction/150605)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 19\
**Last updated:** [October 24, 2025, 6:20am UTC](https://meta.discourse.org/t/theme-modifiers-a-brief-introduction/150605 "2025-10-24T06:20:57Z")

</div>

As themes become more ambitious, we’ve been looking for ways to allow them to manipulate core server-side behavior. While they will never be given the same level as control as plugins, we can provide some predefined hook…

---

## [Use Discourse Core Variables in your Theme](https://meta.discourse.org/t/use-discourse-core-variables-in-your-theme/77551)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 0\
**Last updated:** [January 9, 2018, 4:55am UTC](https://meta.discourse.org/t/use-discourse-core-variables-in-your-theme/77551 "2018-01-09T04:55:37Z")

</div>

Discourse is incredibly customizable! The goal of this topic is to show you how make use of all the amazing options that are available to you as a theme developer. You know… so that you don’t have to reinvent the wheel …

---

## [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…

---

## [Set up a local Discourse Development Environment?](https://meta.discourse.org/t/set-up-a-local-discourse-development-environment/182882)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 0\
**Last updated:** [March 11, 2021, 11:33am UTC](https://meta.discourse.org/t/set-up-a-local-discourse-development-environment/182882 "2021-03-11T11:33:53Z")

</div>

So you want to set up Discourse locally to hack on and develop with? This root guide links all the dev-install guides for the various systems to setup Discourse locally on. If you want to add a guide to this list, be su…

---

## [Run Discourse AI evals](https://meta.discourse.org/t/run-discourse-ai-evals/390080)

<div class="topic-metadata">

**Author:** [@system](https://meta.discourse.org/u/system)\
**Replies:** 1\
**Last updated:** [December 1, 2025, 9:12pm UTC](https://meta.discourse.org/t/run-discourse-ai-evals/390080 "2025-12-01T21:12:09Z")

</div>

Overview The Discourse AI plugin ships a Ruby CLI under plugins/discourse-ai/evals that exercises AI features against YAML definitions and records results. Use it to benchmark prompts, compare model outputs, and regressi…

---

## [Replace Discourse's default SVG icons with custom icons in a theme](https://meta.discourse.org/t/replace-discourses-default-svg-icons-with-custom-icons-in-a-theme/115736)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 10\
**Last updated:** [February 24, 2026, 9:24pm UTC](https://meta.discourse.org/t/replace-discourses-default-svg-icons-with-custom-icons-in-a-theme/115736 "2026-02-24T21:24:39Z")

</div>

You can replace a Discourse’s default SVG icons individually or as a whole with your own custom SVG and override them within a theme or theme component. Step 1 - Create an SVG Spritesheet To get started, you must create…

---

## [Adding preview screenshots to Discourse themes](https://meta.discourse.org/t/adding-preview-screenshots-to-discourse-themes/365083)

<div class="topic-metadata">

**Author:** [@system](https://meta.discourse.org/u/system)\
**Replies:** 3\
**Last updated:** [February 18, 2026, 10:41pm UTC](https://meta.discourse.org/t/adding-preview-screenshots-to-discourse-themes/365083 "2026-02-18T22:41:48Z")

</div>

:bookmark: This guide explains how to add preview screenshots to your Discourse theme to showcase how it looks in both light and dark modes. :person\_raising\_hand: Required user: Theme developers Adding preview scre…

---

## [Update themes and plugins to support automatic dark mode](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 10\
**Last updated:** [November 14, 2025, 10:45am UTC](https://meta.discourse.org/t/update-themes-and-plugins-to-support-automatic-dark-mode/161595 "2025-11-14T10:45:01Z")

</div>

Previously, all colors in Discourse were stored as SCSS variables. To support automatic dark mode color scheme switching, we have converted these colors in core to custom CSS properties. You can easily see the full list …

---

## [Controlling site settings with themes](https://meta.discourse.org/t/controlling-site-settings-with-themes/374376)

<div class="topic-metadata">

**Author:** [@system](https://meta.discourse.org/u/system)\
**Replies:** 0\
**Last updated:** [July 16, 2025, 1:01am UTC](https://meta.discourse.org/t/controlling-site-settings-with-themes/374376 "2025-07-16T01:01:37Z")

</div>

Themeable site settings allow a theme (not components) to override a small subset of core site settings, which generally control parts of the UI and other minor functionality. This allows themes to have a greater control…

---

## [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. …

---

## [Discourse Public Data Dump](https://meta.discourse.org/t/discourse-public-data-dump/264748)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 1\
**Last updated:** [May 13, 2025, 8:06am UTC](https://meta.discourse.org/t/discourse-public-data-dump/264748 "2025-05-13T08:06:23Z")

</div>

Given the advent of AI and the need for large datasets on local development machines, we have pulled together a quick pattern for getting a “workable” copy of all public (visible by anon) data from a Discourse forum. Ke…

---

## [Theme Developer Tutorial: 3. CSS in Themes](https://meta.discourse.org/t/theme-developer-tutorial-3-css-in-themes/357798)

<div class="topic-metadata">

**Author:** [@system](https://meta.discourse.org/u/system)\
**Replies:** 5\
**Last updated:** [March 18, 2025, 11:50pm UTC](https://meta.discourse.org/t/theme-developer-tutorial-3-css-in-themes/357798 "2025-03-18T23:50:32Z")

</div>

Technically, Discourse uses SCSS to author its stylesheets. However, we’re increasingly moving towards native CSS features as they mature, so the vast majority of themes won’t need to use SCSS features or syntaxes. We fo…

---

## [Developing Discourse Themes & Theme Components](https://meta.discourse.org/t/developing-discourse-themes-theme-components/93648)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 14\
**Last updated:** [March 18, 2025, 11:33pm UTC](https://meta.discourse.org/t/developing-discourse-themes-theme-components/93648 "2025-03-18T23:33:05Z")

</div>

Discourse Themes and Theme Components can be used to customize the look, feel and functionality of Discourse’s frontend. This section of the developer guides aims to provide all the reference materials you need to develo…

---

## [Theme Developer Tutorial: 5. Building and using components](https://meta.discourse.org/t/theme-developer-tutorial-5-building-and-using-components/357800)

<div class="topic-metadata">

**Author:** [@system](https://meta.discourse.org/u/system)\
**Replies:** 0\
**Last updated:** [March 18, 2025, 3:59pm UTC](https://meta.discourse.org/t/theme-developer-tutorial-5-building-and-using-components/357800 "2025-03-18T15:59:11Z")

</div>

In the last chapter, we explored how you can render Glimmer Components into plugin outlets, and moved our CustomWelcomeBanner component into its own file. In this chapter, we’ll extend the functionality of the banner to …

---

## [Theme Developer Tutorial: 4. Using Outlets to insert and replace content](https://meta.discourse.org/t/theme-developer-tutorial-4-using-outlets-to-insert-and-replace-content/357799)

<div class="topic-metadata">

**Author:** [@system](https://meta.discourse.org/u/system)\
**Replies:** 0\
**Last updated:** [March 18, 2025, 3:59pm UTC](https://meta.discourse.org/t/theme-developer-tutorial-4-using-outlets-to-insert-and-replace-content/357799 "2025-03-18T15:59:10Z")

</div>

Discourse uses the Ember JS Framework for its user interface. On top of Ember, Discourse provides a number of APIs to allow themes to customize the user interface. The most commonly-used API is Plugin Outlets. These out…

---

## [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…

---

## [Split up theme Javascript into multiple files](https://meta.discourse.org/t/split-up-theme-javascript-into-multiple-files/119369)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 5\
**Last updated:** [February 16, 2025, 2:30am UTC](https://meta.discourse.org/t/split-up-theme-javascript-into-multiple-files/119369 "2025-02-16T02:30:16Z")

</div>

Complex theme javascript can be split into multiple files, to keep things nicely organised. To use this functionality, simply add files to the /javascripts folder in your theme directory. These files can not be edited f…

---

## [Create custom Automations](https://meta.discourse.org/t/create-custom-automations/275931)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 16\
**Last updated:** [February 7, 2025, 8:17pm UTC](https://meta.discourse.org/t/create-custom-automations/275931 "2025-02-07T20:17:02Z")

</div>

:information\_source: This is a draft, and may need some extra work. Vocabulary trigger: represents the name of the trigger, eg: user\_added\_to\_group triggerable: represents the code logic associated to a trigger, eg: tr…

---

## [Introduction to Discourse Development](https://meta.discourse.org/t/introduction-to-discourse-development/349939)

<div class="topic-metadata">

**Author:** [@system](https://meta.discourse.org/u/system)\
**Replies:** 1\
**Last updated:** [February 1, 2025, 10:34pm UTC](https://meta.discourse.org/t/introduction-to-discourse-development/349939 "2025-02-01T22:34:35Z")

</div>

Discourse is a modern and highly-customizable platform for building communities. This documentation is intended for anyone who wants to build a customization for Discourse, or work on Discourse itself. Architecture Disc…

---

## [Use the \`navigation\_menu\` query parameter to preview the sidebar or other options](https://meta.discourse.org/t/use-the-navigation-menu-query-parameter-to-preview-the-sidebar-or-other-options/258401)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 1\
**Last updated:** [January 27, 2025, 9:54am UTC](https://meta.discourse.org/t/use-the-navigation-menu-query-parameter-to-preview-the-sidebar-or-other-options/258401 "2025-01-27T09:54:50Z")

</div>

If you are working on a theme for an existing site and want to preview how it will look with the sidebar or other options for the navigation menu site setting, you can use the ?navigation\_menu query parameter. This feat…

---

## [End-to-end system testing for themes and theme components](https://meta.discourse.org/t/end-to-end-system-testing-for-themes-and-theme-components/281579)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 1\
**Last updated:** [January 2, 2025, 7:33pm UTC](https://meta.discourse.org/t/end-to-end-system-testing-for-themes-and-theme-components/281579 "2025-01-02T19:33:09Z")

</div>

Writing automated tests for themes is an important part of the theme development process which can help ensure that the features being introduced by a theme continues to work well overtime with core Discourse features. …

---

## [Include assets (e.g. images, fonts) in themes and components](https://meta.discourse.org/t/include-assets-e-g-images-fonts-in-themes-and-components/62459)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 1\
**Last updated:** [August 23, 2024, 2:04am UTC](https://meta.discourse.org/t/include-assets-e-g-images-fonts-in-themes-and-components/62459 "2024-08-23T02:04:48Z")

</div>

Themes and theme components allow you to handle uploaded assets such as images and fonts. You can control what assets your theme accepts using the site setting: theme authorized extensions Including assets in themes and…

---

## [Designer's Guide to getting started with themes in Discourse](https://meta.discourse.org/t/designers-guide-to-getting-started-with-themes-in-discourse/152002)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 9\
**Last updated:** [April 8, 2024, 9:32pm UTC](https://meta.discourse.org/t/designers-guide-to-getting-started-with-themes-in-discourse/152002 "2024-04-08T21:32:15Z")

</div>

So you’re interested in in designing your own theme for Discourse? You’ve arrived at the right topic :smile: This guide will be more focused on the SCSS/CSS aspects of working with themes in Discourse. If you are also k…

---

## [Migrate Discourse theme settings](https://meta.discourse.org/t/migrate-discourse-theme-settings/287783)

<div class="topic-metadata">

**Author:** [@Discourse](https://meta.discourse.org/u/Discourse)\
**Replies:** 0\
**Last updated:** [January 30, 2024, 10:02pm UTC](https://meta.discourse.org/t/migrate-discourse-theme-settings/287783 "2024-01-30T22:02:00Z")

</div>

Introduction As of Discourse version 3.2.0.beta3, Discourse themes/components can leverage a migrations feature to evolve and alter their settings seamlessly. This feature ensures that updates to themes do not disrupt ex…

[Previous page](https://meta.discourse.org/c/documentation/developer-guides/56.md?page=1)

[Next page](https://meta.discourse.org/c/documentation/developer-guides/56.md?page=3)
