NEW! Trying to keep your (suddenly) remote team productive? Try Discourse for Teams!

Blog

Updates & community insights

  • Keys to Building a Successful Support Community

    Starting a support community is a great way to involve your customers in the discussion around your products or services. In fact, it’s an easy way to increase the overall quality of your customers’ experience.

    If you’re looking to start a support community, there are five aspects to keep in mind:

    Make it easy to engage and get started

    By design, your customers will come to your community to get support. The key to this being an effective experience is how quick and easy it is for them to get started, and to get what they want.

    Signup modal

    There are three main ways users engage with your support community:

    1. Looking for answers
    2. Asking questions
    3. Answering questions

    To create a community that’s simple and easy to engage, regularly evaluate each mode of engagement by asking questions like:

    • Is it easy to search for common questions?
    • Do I find answers I’m expecting to find?
    • How long does it take to go from having no account to asking a question?
    • How many steps are in the signup process? Can that be shortened?
    • Is our community seeing duplicate questions on a regular basis?
    • Are the number of questions asked at a reasonable ratio to the number of users we have?
    • Are new users asking questions?
    • Are questions getting answered?
    • Are questions getting answered in a reasonable amount of time?

    Evaluating these questions can help you identify possible pain points in your community onboarding and engagement process. Continuing to identify and remove difficulties for your community’s potential and existing members helps improve it’s overall health and long-term viability.

    Help members stay informed

    In addition to getting help fixing issues, support communities are an excellent way to keep customers informed of news around your product or services. Have a new feature release? A super-important security fix? Soliciting feedback on your roadmap? Hosting a conference? Share it with the community!

    At Discourse, we have an announcements category where we share version release notes, new features, and critical updates. Members of our community will see these announcements when they visit the site, but they also can set a notification preference to get an email for each new announcement as they are posted.

    notification modal

    You might be thinking, “Why not use an email newsletter instead?” While newsletters have their place, using a support community for these announcements has some advantages. One major benefit – a community announcement creates a feedback loop. For example, if a user finds a bug on a new feature release, they can report it right in the community within or adjacent to the feature’s announcement. Others may chime in to notify the team they’ve experienced this issue as well, increasing the priority of this bug to get fixed.

    Reward participation

    Participating in a support community by asking and answering questions has inherent rewards. It’s great to feel as if you’ve helped someone with a difficult technical issue! However, every community member goes through a journey toward deeper involvement.

    Special badges granted for Discourse participation

    One way to encourage your community members along this path is to intentionally reward them for valuable participation, and here are a few examples:

    Grow and learn together

    Nobody knows everything, and especially if those joining your community are new to helping out, they might only know a little bit.

    That’s totally ok.

    library

    Your community should be a place to grow and learn together. Sometimes technical communities get a bad reputation when advanced users communicate in a condescending way towards others who might not be as knowledgeable. This is the quickest way to turn off new members from learning anything or even participating.

    Instead, the goal is to invite everyone to the conversation. Encourage more advanced users to explain why things are the way they are, share links to existing topics where solutions are discussed in detail, and point fellow community members to dig in by highlighting where to look.

    Also, don’t forget to get your support team to join in the discussion as well! You have a wealth of knowledge and understanding regarding your product and services that your community does not. Share it, and freely!

    Have fun

    Christmas hats on avatars

    One trap a support community can fall into is being all business and no fun. It’s great to have a place for technical discussions or support requests to land, but your community is full of people who have varying interests and backgrounds. Give them a place to share that! A dedicated off-topic or praise category is a great starting point once your support community starts to get some traction.

    It’s okay to be silly, too. Of course, in some instances this doesn’t make sense, but generally people want to come to a place where they feel they can make friends and be part of something. Sharing GIFs or puns, developing inside jokes, and sharing interesting findings are a sign of a community that’s starting to form a bond together.

    Comments
  • Faster (and smaller) uploads in Discourse with Rust, WebAssembly and MozJPEG

    As of a few weeks ago, image uploads in Discourse are faster AND smaller thanks to a technique that compresses and optimizes the images clientside before they are uploaded. This blog post will describe how this feature works and how we implemented it in Discourse.

    Introduction

    While Discourse, and forums in general, are mainly about ¶ paragraphs of text, the discourse on the internet is increasingly composed of media. Pictures have become a major part of user posts. It’s also worth mentioning that in the 8 years since we started Discourse, smartphone cameras became ubiquitous and can take great pictures in an instant.

    Because of all that, very early into the project we received feature requests about Optimizing images before uploading. This is motivated by staff looking to make it easy for their users to share pictures while being mindful of the time it takes to upload files from spotty mobile connections.

    One of the leading experiments of client-side image compression is the Squoosh.app by the cool people at Google Chrome Labs. It was first announced in this talk and it was definitive proof that it was possible to get quality image compression right on the client side by leveraging new browser features like WebAssembly.

    Our new image optimization pipeline

    When you click on the upload button while composing a post in Discourse, we open the Operating System file picker and then you can select one or more files to add to your post. If an image is detected, the new feature kicks in and performs the optimization just-in-time before uploading the file to the server.

    Here is a 10-foot view of the new flow:

    It can be broken down into 3 main steps:

    • Decoding
    • Resizing
    • Encoding

    Image Decoding

    After we determine that we have a valid image the next step is taking this File object and converting it into a simple array of Red, Green, Blue, and Alpha bytes. The first step is decoding the File, be it a JPEG or a PNG, and luckily for us, all the modern browsers have an incredibly straightforward method that does exactly this: self.createImageBitmap(). It’s an awesome browser API that even does the hard work off the main thread, meaning we won’t have UI slowdowns when decoding larger images on common devices. This method is not available in Safari, so there we must decode the File using an img tag with the async attribute.

    After we decode the image we need to draw the result into a Canvas so we can finally capture the resulting RGBA Array. We considered doing this by using an OffscreenCanvas in a worker, but that is not widely available. (During our internal tests, users also reported completely black images on iOS 15 Beta, i.e. the CanvasRenderingContext2D.getImageData would sometimes return an array where all values are 0. We have added some protections against this, but hopefully Apple will fix this before iOS 15’s general release this fall.)

    (Also, in an early implementation of this feature, the decoding task was done using WebAssembly, but using the browser native APIs is much better, as we can support multiple image types, and the existing APIs are more than enough.)

    Image Resize

    Cameras in smartphones are constantly getting better, and this results in pictures with ever-growing dimensions. For example, a Galaxy S21 Ultra can take pictures that are 12000x9000 pixels in size. An image of that size is useful for lots of applications, but it’s gigantic for a typical Discourse post body, where the available content width rarely exceeds 700 pixels. This led to our first strategy in the image optimization pipeline: resizing the image to a smaller size.

    There are two main configuration knobs here we expose to site admins: the minimum width of an image to trigger the resizing, and the target resize width of an image that will be resized. Our defaults here for both settings are 1920px, which means that we will resize most modern smartphones’ pictures, and full-screen screenshots on desktops.

    As for performing the actual resize operation, we decided to use the same library Squoosh is using:

    https://github.com/PistonDevelopers/resize

    This small Rust library implements fast resizing and allows us to downscale using the Lanczos3 method. On the Squoosh app, they packaged the resize using wasm-bindgen, to allow it to be run in a browser context. Unfortunately, they used the wasm-bindgen target of web, which generates a native ES module that can be imported into any modern browser. This threw a bit of a spanner in our plans because we will be running the resize operation in a background dedicated worker and Firefox doesn’t support running workers as type: 'module' yet. To work around this situation we had to fork the Squoosh packaging of this library and change the wasm-bindgen target to no-modules. It results in an API that is a bit more cumbersome, but it greatly increases the compatibility.

    firefox-rocky-meme

    Image Encoding

    Way back in 2014, Mozilla announced a new project: MozJPEG. It’s an improved encoder for the decades-old JPEG file format, and doesn’t break compatibility with the existing decoders in browsers.

    This library is also packaged as WebAssembly in the Squoosh app, here using Emscripten. And, here again, we had to fork the original packaging as it was using ES Modules and wasn’t compatible with our default strict Content Security Policy (CSP).

    For image encoding, forum admins have yet another knob: the encoder quality parameter. We follow the upstream default of 75, but can be tweaked as needed:

    The quality switch lets you trade off compressed file size against the quality of the reconstructed image: the higher the quality setting, the larger the JPEG file, and the closer the output image will be to the original input. Normally you want to use the lowest quality setting (smallest file) that decompresses into something visually indistinguishable from the original image. For this purpose, the quality setting should generally be between 50 and 95 (the default is 75) for photographic images. If you see defects at -quality 75, then go up 5 or 10 counts at a time until you are happy with the output image. (The optimal setting will vary from one image to another.)

    Results

    Image Samples

    Here is a picture taken from my Pixel 3A XL phone, before and after the default optimization in a Discourse site:

    The original file is 4032x3024 and weighs 3.7MB, while the compressed one 1920x1440 and weighs 416KB.

    Aggregate Statistics

    After enabling this feature on some Discourse instances, we were able to measure the resulting file sizes across different categories of sites.

    Here are the results in a yo-yo Discourse site, where the feature was enabled on 2021-06-29:

    yoyo-median-file-size-over-time

    And here on a gardening enthusiast’s site, where the feature was also enabled on 2021-06-29:

    maconha-median-file-size-over-time

    Extreme examples

    Out of the box Discourse limits user uploads to files under 4MB. This is in place for a number of reasons, and one of those is that storage costs can be the main pain point for administrators in certain types of communities. With this new feature, users can directly upload files that are far larger than that and they will automatically be resized to fit those existing limits, allowing seamless interaction from users without becoming onerous for small communities.

    On a typical desktop, we have reports of JPEGs and PNGs larger than 50MB successfully being optimized and uploaded to Discourse.

    Feel free to try out this feature at our test topic on Meta.

    A note on data degradation

    While this feature has plenty of upsides, we should not avoid talking about its main downside: data degradation.

    xkcd-1683

    We do have quite a few guards against overly aggressive data degradation for this feature:

    • Minimum image size for triggering: we won’t do any change of image with a file size lower than a configurable threshold

    • Minimum image width for resizing: we won’t downscale images that have a width smaller than a configurable threshold

    And, it’s very important to remember that this feature can be completely disabled by site admins. If your community revolves deeply around high-quality image sharing, you can disable this whole client-side optimization feature with a single click.

    Wrapping up

    Discourse, as a free and open-source project, couldn’t exist without all the software that forms “our stack”. With this feature we would like to thank all the software that went into building it:

    Comments
  • Five Ways Support Communities Improve Customer Experience

    Here at Discourse, we utilize a support community to provide service to both our self-hosted and paid hosting customers. Our customers have direct access to the team that makes the software – resulting in faster support and better long-term solutions for reported problems.

    Meta Support Category

    Running a support community may seem like yet another channel to manage, but it’s a powerful way to directly interface with your customers. In this article, we’ll explore five reasons support communities improve customer experience, including how they:

    1. Support communities humanize interaction

    When you’re looking to solve a problem and all you can find is inadequate/incomplete support documents or automated chatbots, that’s frustrating. While self-service support is important, if it’s the only way for your customers get support, they might feel left on their own and without help.

    A support community humanizes the support process. Instead of paging through an endless sea of documents, customers can ask their question in a natural, conversational way, and get help from a wider audience.

    UiPath Forum

    Some support communities are designed for user-to-user support (i.e. Apple’s discussion boards), but others encourage support staff to join in the discussion. Having support personnel available to answer questions not only increases the quality of support received in your community, but also helps your customer base connect with your company in a more personal way.

    Compared to a support chat or phone call, being part of a support community allows one to get to know those helping them through structured conversation. Instead of working with a random support person, they can get to know a group of people with a common interest through every interaction on the forum.

    2. Support communities grow by word of mouth

    While some may not stick around after asking a question, others will. A support community offers these committed individuals an opportunity to take part in something greater than the the single transaction that is their support request. Your most passionate customers will not only stick around, but they’ll help others out by showing off what they’ve learned, and encourage both themselves and others to learn new skills.

    A healthy support community is responsive, resourceful, and welcoming to users of any experience and skill level. The end goal of community is to share knowledge. In this environment, the chance of your customers having positive support experiences increases. It’s a bit cliche, but word of mouth travels quickly. Every positive interaction in the community is an opportunity to share that experience with other potential customers.

    It’s important to note that your support community isn’t just a ticketing system – it’s a community. You’ll need a variety of topics and categories that let people share what they do and how they do it. Communities must be cultivated and curated to keep the quality of conversations high in order to leverage the positive brand image and awareness generated by its existence.

    đź“Ł Discourse has powerful moderation tools to help you in this process.

    Flagging modal

    The best way to grow a support community is through consistent, daily involvement. As you participate regularly, your community will follow your example. A support community doesn’t have to be all technical and work-focused, either! Having a place to chat off-topic and rewarding high-quality participation through granting badges or giving away prizes helps level up the fun factor for your community, too. In fact, it’s one of the keys to building a successful support community!

    3. Support communities reduce repeat requests

    Many companies exclusively use a closed ticketing system where a person emails or sends a message to interact with a support team. This works well when support requests are few, highly specific, or confidential in nature. However, a constant issue is duplicate requests – different users asking the same questions over and over again. If your support processes are all private, your team will end up duplicating a significant amount of work.

    This is not the case with a public-facing support community. If a duplicate question is asked, simply link to the existing answer – no rewriting necessary. In Discourse, the Solved plugin allows the community to select the best solution to a question, making previously answered questions and their answers more visible.

    Solved Callout

    Support topics are also indexed by on-site search, Google, and other search engines. Many people try to find their own answers first, and having these common support issues available publicly will help people find their solution on their own. This creates a community-maintained self-service support portal.

    Google Search Results

    Additionally, if an issue persists after attempting a solution, or if the solution is out of date, customers now have incentive to join and share their experience. Not only does this help others looking for an answer in the future, but it improves the quality of your public facing support information in an organic manner, reducing your company’s manual investment in documentation upkeep.

    4. Support communities scale beyond your hired support capacity

    Community Metrics

    Running closed, ticket-based support systems requires a ratio of staff to the volume of requests received. The more tickets you get, the more staff you need. While this is expected and necessary in some industries, a support community is an alternative approach to scaling your support capacity.

    Growing a support community means you’re inviting enthusiastic users to contribute. While they may not be paid staff, they act as a force multiplier. The more engaged community support members you have, the more support that can be done without having to hire dedicated personnel.

    For example, if you have a free offering, you can provide those customers community support which allows your staff to focus on helping your paid customers.

    5. Support communities create a path to hire

    User directory on Meta

    A support community alone doesn’t replace dedicated support staff. You may still need to run a private support channel in addition to your public facing community. Alternatively, your community may grow so much that your existing team can’t keep up with moderating or responding to the volume of requests.

    Having an existing community makes hiring easier. Your first point of outreach can be your top community contributors. They’re already passionate about your product, they’ve shown the quality of their work, and now all you need to do is make sure they’re a good fit for your company. At Discourse, we regularly hire from our community. In fact, the majority of our current team was hired through direct interaction via our community channels. And guess what – it works. Our team is highly engaged, passionate about what we do, and continues to invest in the community they were hired from.

    Hiring from your community encourages a healthy cycle where passionate contributors can reach the ultimate level through joining the team that builds the product they love. From there, they can continue to invest in the community to make it a great place for others to come get help, learn with others, and maybe even join the team!

    Comments