Custom Hamburger Menu Links

That is fantastic, thank you! :wink:
Maybe you can tell me quickly - how to localize the custom hamburger menu text?


I added support for icons, you could try out this fork of the component: GitHub - nolosb/discourse-custom-hamburger-links-with-icons

Two notes on usage:

  • The icon would be the first item in the list:
    Screenshot from 2021-07-01 11-10-15
    If you want a link without icon, just don’t add it, but keep the trailing comma ,
    Screenshot from 2021-07-01 11-10-40

  • If the icon is not included by default, remember to add it to the icon list:
    Screenshot from 2021-07-01 11-11-06


Can you puch these changes to the official Theme component? It’s always better to have the official Theme component installed as it’s going to be maintained with Discourse future updates.


It would be nice to have this merged with the official plugin. I want to add social media buttons in the hamburger menu. But without icons it would not look as nice.

Also, it’s a bit unclear that no space is allowed in the CSV fields.
This works: Footer Link,,f
But with spaces the item gets inserted in the general field rather than the footer, because of the missing space: Footer Link,, f



With the new sidebar, being able to add custom icons to our links would be a nice addition.


I can try to work on this and do a PR in the following days…


Quick question…

I’ve installed the theme component on a new Discourse instance, but for some unidentified reason, the default links won’t appear in the more section of the sidebar:

I didn’t modify the code, it’s a fresh theme component install.

However, the theme component, installed two years ago, works on my other forum:

No error is displayed. Any idea why the theme component doesn’t work on my new install? :thinking:


I noticed this too and it seems to only the external links not appears under More.


I use internal links in this component, for example, I have a link that opens user invites: /my/invited/pending/

When opening the link from the sidebar I get: Oops! That page doesn’t exist or is private.

The link works when accessed from the URL bar.

When entering the full URL ( the URL opens like this:


Yep. Known issue.


This is should work with: Chat,/chat/browse/open :slightly_smiling_face:


Yeah, I know. I sended my comment perhaps a little bit too fast. Well, defenetly too fast, because I should say there must use path instead full url.

Extra link for the chat… well, new sidebar changed the playground totally and it is not needed anymore.


I took a look at Discourse’s sidebar code and @nolo icons addition.

It seems that currently, it’s not possible to customize the icon’s custom links because the hamburger menu decoration method doesn’t take into account the prefixValue constant (which contains the icon’s name) or something like that…

It also seems to me that hamburger-menu decorations with api.decorateWidget are going to be depreciated. See:

Also, the fact that external links don’t work anymore could come from this:

So that there should be some changes in core to make this available.

:warning: My knowledge of how Discourse works is almost non-existent so I could be very wrong.

Am I right about my findings?


I’ve installed this theme component from github repo. running 3.0.0.beta15 on my discourse and even though I appear to have added it, the hamburger menu doesn’t show my link… Any ideas?

1 Like

It may be related to:

To this day, external links still don’t work.
And internal links must begin with a relative path, not a full path.


Thanks a lot for this useful component. I need to add a few important internal links, but now that the hamburger menu is integrated into the sidebar I find that they’re not very visible under the More menu. Users are usually terrible at finding things, so I really need to put them in the top level, ideally right after My posts. Are there any CSS hacks to accomplish this?


Beyond what CSS can achieve I think. The discourse team do have this on their roadmap, but it isn’t happening quickly (I think):


I use:

  const customHeader = document.createElement("div")
  customHeader.className = "sidebar-section-wrapper sidebar-section-community"
  customHeader.innerHTML = `
            <div class="sidebar-section-header-wrapper sidebar-row">
              <button id="ember11" class="sidebar-section-header sidebar-section-header-collapsable btn-flat btn no-text" type="button">
                <span class="sidebar-section-header-text"> Rechtliches </span>
          <div class="sidebar-section-content" id="customNavigation"/>

  $(document).ready(function () {
    // Create the links
    const links = [
      { title: "Impressum", src: "/impressum" },
      { title: "Datenschutz", src: "/privacy" },

    // Mobile
    let hamburger = document.getElementById("toggle-hamburger-menu")
    if (hamburger) {
      hamburger.addEventListener("click", addCustomLinks)
    } else {
    let bool = false;
    function addCustomLinks() {
      setTimeout(function () {
        // Force to wait until navigation has been loaded
        const sidebar = document.getElementsByClassName("sidebar-sections")[0]
        if (sidebar) {
          if (bool) return;
          // Get the customNav Id
          const customNavigation = document.getElementById("customNavigation")
          if (customNavigation) {
            links.filter(function (link) {
              let linkDiv = document.createElement("div")
              linkDiv.className = "sidebar-section-link-wrapper"
              linkDiv.innerHTML = `<a href="${link.src}" class="sidebar-section-link sidebar-section-link-everything sidebar-row ember-view">
                        <span class="sidebar-section-link-prefix icon"></span>
                        <span class="sidebar-section-link-content-text"> ${link.title} </span>
              let linkIcon = document.getElementById("link_" + link.title)
        bool = true
      }, 0)

You can see the result at
The original version of this code is from Add custom links to sidebar. Maybe it could help you.


@hosch Wow, very nice, exactly what I was looking for! Thanks very much.

1 Like

@hosch By any chance is it possible to move it higher up? I’d like it to appear after the Community section, or possibly even before it.

Edit: Looks like it’s possible with a variation on this:
Rearrange Existing Hamburger Menu Items - #3 by awesomerobot

.sidebar-sections {
  display: flex; /* Setup a flex layout so you can reorder things */
  flex-direction: column;
  .sidebar-section-community {
    order: -1;

I wonder about moving it to the highest position?

1 Like

There is a quirk with this method where the custom div disappears when toggling the visibility of the sidebar, for example if the browser window is narrow. This is a problem especially for tablets, which usually get the desktop version of Discourse and require clicking on the hamburger menu to display the sidebar. Any possible workarounds? Thanks!

Edit: Solved here:

1 Like