In 2024 I was looking for work. I decided to offer my services as a community consultant. Mostly, though, people were interested in technical help getting their Discourse sites fixed or updated. One potential client asked if I could add a contact form for people who didn’t have an account to send feedback. I looked around and concluded it wasn’t possible. But I had plenty of spare time and followed the plugin developer tutorial to see what I could do. Eventually I got a contact form plugin developed and signed the client.[1]
Just so everyone is clear on this: I’m not a frontend programmer! It’s been 13 years since I was a professional programmer of any type. I know how to make an HTML form and that’s pretty much the extent of my knowledge. So I struggled through the Ember and Handlebars section of the tutorial and cobbled together a hack that worked well enough. Fortunately I was comfortable with templating systems having used them on a previous job.
I found a job with the OpenSSL Foundation[2] and mostly gave up my clients. But the client I built the plugin for kept me on retainer because he really appreciated my work. (I’ve done several unrelated projects for him.) In order to earn my retainer, I decided to upgrade his Discourse server. This is what I saw:
Only this was on my client’s site because I was stupid and had installed, but not enabled, the contact plugin on my staging site. So I quickly entered safe mode and disabled the plugin. Last weekend I spent some time figuring out what had gone wrong and how I could fix it for my client.
After some searching, I found Deprecating .hbs file extension in themes and plugins:
In the latest version of Discourse, using
.hbsfiles in themes and plugins is deprecated. Support for this file format will be removed after the next ESR release.
This was in March and that means I ought to have had until basically the end of September to fix it if I were on the ESR release. But my Discourse configuration uses “tests-passed”[3] and so I got the error a few months early, I guess.
Since I’m going to have to fix it anyway (or disappoint my client) I jumped into the instructions: Automatically updating themes and plugins to .gjs file format. First step was to install a development environment since I’d changed laptops since the last time I tried this.[4] When I finally got Discourse running and verified that my plugin was broken locally, I ran the lint process[5]:
$ pnpm eslint --fix .
/Users/jericson/src/discourse-contact-plugin/assets/javascripts/discourse/components/contact-form.js
1:8 error Use Glimmer components(@glimmer/component) instead of classic components(@ember/component) ember/no-classic-components
3:16 error Native JS classes should be used instead of classic classes ember/no-classic-classes
3:16 error Please switch to a tagless component by setting `tagName: ''` or converting to a Glimmer component ember/require-tagless-components
20:3 error Use the @action decorator instead of declaring an actions hash ember/no-actions-hash
✖ 4 problems (4 errors, 0 warnings)
While it’s annoying to have to change my plugin, at least the lint process helped me clean up and modernize my code. The automated script fell over trying to convert to .gjs, however. So I decided to try out https://ask.discourse.com/
I have 12 questions over there. I would not share them with a human because they are just the flailings of increasingly frustrated programmer. At one point the bot suggested a “more robust modern approach” to one of my subproblems that included . . . a .js file and a .hbs file.
I know why this happens. It’s trained on Meta Discourse discussions and there are still a lot of posts that have Handlebars code, including part two of the official plugin developer tutorial. That stuff will get updated over time, but I worry it will take a bit longer because the official advice for getting help with the upgrade is to ask the chat bot rather than ask on Meta Discourse.
I guess I shouldn’t complain; it did help me sort out my code and probably with less friction than asking humans.
Platform stability
So I work for OpenSSL Foundation now. You probably know about OpenSSL because of Heartbleed. It’s used everywhere. The most popular version to download is 1.1.1 which reached end-of-life in 2023. The next most popular is 3.0, which was released in 2021, but is still supported as a Long Term Support (LTS) release. Next is 3.5, which is our latest LTS. Those three releases account for almost 2/3 of downloads from GitHub.
That’s a bit disappointing because 3.5 has some cool new features. But ultimately the features people care most about are some combination of SSL/TLS and cryptographic primitives. Unless you are excited about post-quantum cryptographic algorithms, you are going to put off the pain of upgrading as long as possible.
OpenSSL is way lower down in the stack than Discourse, of course. But the principle is the same. Unless there’s a new feature, people aren’t interested in breaking upgrades. I know y’all are excited about the new features that have been added to Discourse. I get wanting to change an API in order to get some optimizations later. I just worry that moving too quickly will hurt Discourse as a platform on which communities are built.
Speaking of which, there’s a really useful slide deck called Gardening Platforms written by Alex Komoroske. Slide 90 starts a section called “Platform + Ecosystem” that explains how platforms must coevolve with their ecosystems. In this case, Discourse is the platform which supports an ecosystem of plugin and theme designers, hosting services, the Meta Discourse community and even the communities built on Discourse. An important insight on the speaker’s notes from slide 98:
But they aren’t independent; they’re relate symbiotically.
Actions happening in one influence the other, and vice versa. Think of it as feedback loops connecting them in both directions.
They aren’t rigidly tied together, it’s more like a rubber band linking them. It’s a gravitational pull.
If a platform and an ecosystem move too quickly relative to each other, the bond breaks to disastrous effect. I trust Discourse to do right by the ecosystem. It just for me weekends like last weaken that trust.
I’m moderately proud of my work even though it ended up being a fairly static site. ↩︎
Foreshadowing! ↩︎
That needs to be updated too ↩︎
Redis and Rails were harder to get installed than I remembered. ↩︎
Not before spending a lot of time failing to grab
eslint.config.mjs, however. ↩︎

