En 2024 estaba buscando trabajo. Decidí ofrecer mis servicios como consultor de comunidades. Sin embargo, por lo general, la gente estaba más interesada en ayuda técnica para arreglar o actualizar sus sitios de Discourse. Un cliente potencial me preguntó si podía agregar un formulario de contacto para que las personas que no tenían una cuenta pudieran enviar comentarios. Busqué un poco y concluí que no era posible. Pero tenía mucho tiempo libre y seguí el tutorial para desarrolladores de plugins para ver qué podía hacer. Finalmente, logré desarrollar un plugin de formulario de contacto y cerré el contrato con el cliente.[1]
Solo para que todos tengan esto claro: ¡No soy programador de frontend! Han pasado 13 años desde que fui programador profesional de cualquier tipo. Sé cómo hacer un formulario HTML y eso es prácticamente todo lo que sé. Así que luché a través de la sección de Ember y Handlebars del tutorial y armé un parche que funcionó lo suficientemente bien. Afortunadamente, estaba familiarizado con los sistemas de plantillas, ya que los había usado en un trabajo anterior.
Encontré un trabajo en la Fundación OpenSSL[2] y dejé de lado a la mayoría de mis clientes. Pero el cliente para el que creé el plugin me mantuvo en nómina porque realmente apreciaba mi trabajo. (He realizado varios proyectos no relacionados para él.) Para ganar mi nómina, decidí actualizar el servidor de Discourse de mi cliente. Esto es lo que vi:
Solo esto aparecía en el sitio de mi cliente porque fui estúpido e instalé, pero no activé, el plugin de contacto en mi sitio de pruebas. Así que rápidamente activé el modo seguro y desactivé el plugin. El fin de semana pasado pasé un tiempo averiguando qué salió mal y cómo podría solucionarlo para mi cliente.
Después de buscar un poco, encontré Deprecación de la extensión .hbs en temas y plugins:
En la última versión de Discourse, el uso de archivos
.hbsen temas y plugins está deprecado. El soporte para este formato de archivo se eliminará después de la próxima versión ESR.
Esto fue en marzo, lo que significa que, si estuviera en la versión ESR, debería haber tenido hasta prácticamente finales de septiembre para solucionarlo. Pero mi configuración de Discourse usa “tests-passed”[3], así que supongo que obtuve el error unos meses antes.
Como de todos modos voy a tener que solucionarlo (o decepcionar a mi cliente), me lancé a las instrucciones: Actualización automática de temas y plugins al formato de archivo .gjs. El primer paso fue instalar un entorno de desarrollo, ya que había cambiado de computadora portátil desde la última vez que intenté esto.[4] Cuando finalmente logré ejecutar Discourse y confirmé que mi plugin estaba roto localmente, ejecuté el proceso de lint[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)
Aunque es molesto tener que cambiar mi plugin, al menos el proceso de lint me ayudó a limpiar y modernizar mi código. Sin embargo, el script automatizado falló al intentar convertir a .gjs. Así que decidí probar https://ask.discourse.com/
Tengo 12 preguntas allí. No las compartiría con un humano porque son solo las quejas de un programador cada vez más frustrado. En un momento, el bot sugirió un “enfoque moderno más robusto” para uno de mis subproblemas que incluía… un archivo .js y un archivo .hbs.
Sé por qué sucede esto. Está entrenado con discusiones de Meta Discourse y aún hay muchos posts que contienen código Handlebars, incluida la segunda parte del tutorial oficial para desarrolladores de plugins. Esas cosas se actualizarán con el tiempo, pero me preocupa que tome un poco más porque el consejo oficial para obtener ayuda con la actualización es preguntar al chatbot en lugar de preguntar en Meta Discourse.
Supongo que no debería quejarme; me ayudó a ordenar mi código y probablemente con menos fricción que preguntar a humanos.
Estabilidad de la plataforma
Ahora trabajo para la Fundación OpenSSL. Probablemente conozcas a OpenSSL por Heartbleed. Se usa en todas partes. La versión más popular para descargar es 1.1.1, que alcanzó el fin de su vida útil en 2023. La siguiente más popular es 3.0, lanzada en 2021, pero que aún está soportada como una versión de Soporte a Largo Plazo (LTS). La siguiente es 3.5, nuestra última LTS. Esas tres versiones representan casi 2/3 de las descargas desde GitHub.
Eso es un poco decepcionante porque 3.5 tiene algunas características nuevas interesantes. Pero en última instancia, las características que más importan a la gente son alguna combinación de SSL/TLS y primitivas criptográficas. A menos que te emocionen los algoritmos criptográficos post-cuánticos, pospondrás el dolor de actualizar el mayor tiempo posible.
OpenSSL está mucho más abajo en la pila que Discourse, por supuesto. Pero el principio es el mismo. A menos que haya una nueva característica, a la gente no le interesan las actualizaciones que rompen cosas. Sé que ustedes están emocionados por las nuevas características que se han agregado a Discourse. Entiendo querer cambiar una API para obtener algunas optimizaciones más adelante. Solo me preocupa que moverse demasiado rápido dañe a Discourse como plataforma sobre la cual se construyen comunidades.
Hablando de eso, hay una presentación muy útil llamada Gardening Platforms escrita por Alex Komoroske. La diapositiva 90 comienza una sección llamada “Plataforma + Ecosistema” que explica cómo las plataformas deben coevolucionar con sus ecosistemas. En este caso, Discourse es la plataforma que soporta un ecosistema de diseñadores de plugins y temas, servicios de hosting, la comunidad de Meta Discourse e incluso las comunidades construidas sobre Discourse. Una idea importante en las notas del orador de la diapositiva 98:
Pero no son independientes; están relacionadas simbióticamente.
Las acciones que ocurren en una influyen en la otra, y viceversa. Piensa en ello como bucles de retroalimentación que las conectan en ambas direcciones.
No están rígidamente unidas, es más como una banda elástica que las une. Es una atracción gravitacional.
Si una plataforma y un ecosistema se mueven demasiado rápido uno respecto al otro, el vínculo se rompe con efectos desastrosos. Confío en que Discourse hará lo correcto por el ecosistema. Solo que para mí, fines de semana como el pasado debilitaron esa confianza.
Estoy moderadamente orgulloso de mi trabajo, aunque al final terminó siendo un sitio bastante estático. ↩︎
¡Presagio! ↩︎
Eso también necesita actualizarse ↩︎
Redis y Rails fueron más difíciles de instalar de lo que recordaba. ↩︎
No sin antes pasar mucho tiempo intentando obtener
eslint.config.mjs, sin embargo ↩︎

