One Year of Discourse

Jeff Atwood February 14, 2014

To celebrate our first birthday (a little late, I know) I’m pleased to announce we are now accepting signups for Discourse communities.

So happy birthday!

We’ve made tremendous headway towards version 1.0, and most of that is thanks to our first three beta partners:

Without these three key partners helping us work through all the kinks and bumps and rough edges, Discourse would be a shadow of the open source project it is today. It’s because these folks were willing to take a chance on a very beta project, and launch it in production with real communities, that we can all enjoy the current “hey, this is … not too bad” state of Discourse.

The project has come a long way. We’ve had a lot of Discourse installs:

And Discourse even made it into the top GitHub projects for the year 2013:

We’re now on year two of a ten year plan to improve discussion on the internet, and we’re just getting to the good stuff. I can’t wait to see what happens next.

We love working on this project. We’d love you to be a part of it too, either by signing up for a community, checking out the source code, participating in discussions, or simply spreading the word and pointing people to

7 Replies

The Road to Discourse 1.0

Jeff Atwood January 8, 2014

Discourse launched at version which was my off the cuff estimate of how “done” we were with our first public release on February 5th, 2013 — about eighty percent done, I thought, once you factor in the ninety-ninety rule:

The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time.

As of this week we will be incrementing to Discourse version with an eye on making it to version sometime in the next few months. That’s right, the mythical version one-point oh! I know nothing really gets good until version 3, but we believe this will be the first version of Discourse we can recommend to everyone, for almost any use, without hesitation.

We’ve worked hard to get this far. Some stats on the Discourse project to date:







Pull Requests


Meta Topics


Meta Posts


Team Members


We’ve been a bit shy about producing manual change logs, because so many things are changing in Discourse so fast. And of course the actual history of commits is always visible on Discourse because this is a public, 100% open source project.

It’s difficult to overstate just how far Discourse has come since launch last year. We thought about it a bit and came up with this (rather long!) list of new and notable things we’ve added or expanded on in Discourse over the last 11 months:

  • 3x performance improvement
  • Mobile layout
  • Reply-via-email support
  • Subcategory support
  • Improved digest emails
  • Improved user page
  • Improved single-column category page
  • Sortable topic list columns
  • Automatic large image handling/thumbnailing for posts
  • File upload/attachment support
  • Top topics page as a “quick start guide” for new and long-absent users
  • Category level preferences (watch, mute, etc)
  • Slew of admin page dashboard stats
  • One-click remove spammer support (remembering prior email, IPs, URLs)
  • Functional private forums with user approval queues (see Ruby Rogues Parley)
  • Massively improved version history UI for edited posts
  • Optimized topic pages, UI, and browser load strategies that work well with topics that have 1k+ posts
  • Site settings grouped into categories for ease of discovery
  • Logging of admin actions and admin setting changes
  • Allowing custom HTML at the top/bottom/header of every page
  • Vastly improved plugin support with much greater extensibility
  • Custom local avatars
  • New minimalist UI to make theming easier
  • WordPress plugin to provide Discourse comments and a forum for WordPress blogs
  • Embedding support to provide Discourse comments and a forum for statically generated blogs (see for live example)
  • Several new just-in-time user behavior cues to improve discussion
  • Improved Markdown support (with full MDTest 1.1 compliance)
  • Easier installation with Docker
  • Enhanced oneboxing (URL pasting) support, delivered as a gem for sharing
  • Auto-closing topics
  • Secure categories, visible only to certain groups
  • Improved search that auto-scopes if you are on a user or category page
  • Live update of new and unread counts, as well as post datestamps
  • Run your own authentication via plugin hooks (oauth/openid or custom)
  • Improved flagging support and one-click flag handling
  • Per-user API keys as well as per-site
  • HTTPS support (currently testing on meta)
  • RSS Feeds*
  • ~ 20 localizations in various states*
  • Persona logins*
  • Keyboard shortcuts*
  • Ability to mention Groups as well as users*
  • Favicon notifications*

The items with an asterisk* were generously contributed by the community. As long as this list is, I’m sure we forgot to mention something the Discourse community helped us improve or add in 2013. Thank you.

In addition to hitting version 1.0 in the next few months, we have lots more great stuff in the pipeline for 2014, including news on our hosting story. Stay tuned, because we sure don’t plan on slowing down any time soon.

12 Replies

Localizing Discourse

Jeff Atwood March 5, 2013

Discourse was always intended to be a discussion platform supporting every human language. We launched one month ago supporting only English, but since we used the default Ruby on Rails i18n gem, Discourse can be (relatively) easily translated into the language of your choice.


As of last week, you can now change the default_locale setting in the /admin settings to determine the default language of your Discourse install.

If you browse the Discourse codebase in the /config/locales folder, you’ll see YAML files for each currently supported language, in client and server flavors. Every language is identified by its standard ISO 639-1 two character code.

  • client.cs.yml
  • server.cs.yml

Within each file, there are tokens on the left and translations on the right:

      topic: 'partager un lien vers cette discussion'
      post: 'partager un lien vers ce message'

    edit: 'éditer le titre et la catégorie de cette discussion'
    not_implemented: "Cette fonctionnalité n'a pas encore été implémentée, désolé."
    no_value: "Non"
    yes_value: "Oui"
      topic: 'sdílet odkaz na toto téma'
      post: 'sdílet odkaz na tento příspěvek'

    edit: 'upravit název a kategorii příspěvku'
    not_implemented: "Tato fičura ještě není implementovaná"
    no_value: "Ne"
    yes_value: "Ano"

We tried to be meticulous about calling the i18n functions when displaying strings, but we didn’t always succeed.

With the help of a number of contributors, especially kubabrecka and ZogStriP, we’ve been cleaning up the Discourse codebase since launch and ensuring that all string output goes through the proper i18n functions. It’s not difficult – wherever you see a hard-coded string, you change it into a function that references a token instead:

<div class='alert alert-error'>
    Something went wrong processing your log in, please try again.
    <% t 'login.omniauth_error_unknown' %>

Of course, Internationalization and Localization are complex topics, and we haven’t even touched on date and time formats, number formats, differences in pluralization, right-to-left languages, or dozens of other subtleties.. but ensuring that we’ve at least sent all our strings through i18n is a big step in the right direction.

We’d love your help localizing Discourse!

If you have time to contribute, just start a YML file with the appropriate language code and structure in /config/locales, and translate from the master server.en.yml and client.en.yml files as you can. That’s the main bit, but there’s a bit more work required to get client-side translations and date formatting in place as well.

The more people that can use Discourse, in any language, the more conversations we can have, and the more inviting Discourse becomes to contributions from all over the world!