A Discourse plugin that allows to integrate your website or web app with Discourse. Part of the Docuss solution.
This project is not active anymore. Fixes are provided to existing users, but I stopped working on new features. You might want to check DiscPage, which is somehow a simplified version of Docuss.
See here.
The plugin’s repository url is:
https://github.com/sylque/dcs-discourse-plugin.git
Step by step guide, based on Discourse official documentation:
- Access your Discourse server
- Type
cd /var/discourse - Type
sudo nano containers/app.yml - Arrow down until you see this:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
- Paste
- git clone https://github.com/sylque/dcs-discourse-plugin.gitbeneath that, so that all together it looks like this:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
- git clone https://github.com/sylque/dcs-discourse-plugin.git
-
Hit
control + Othen Enter (to saveapp.yml) -
Hit
control + X(to exitapp.yml) -
Type
sudo ./launcher rebuild appto rebuild Discourse
In the Discourse Admin panel, open the Settings page and set those settings:
tagging enabled→ checkedmin trust to create tag→0: new userallow duplicate topic titles→ checkeddocuss enabled→ checkeddocuss website json file→ one or several urls, each one pointing to a json file describing a website or web app. The structure of the file is described here. If you are new to Docuss and just want to see if the plugin works correctly, enter this url:https://sylque.github.io/dcs-client/demos/mustacchio/dcs-website.json. Important note: if your Discourse instance is accessed through HTTPS, then your json files must be accessed through HTTPS also.
If your Discourse instance doesn't use tags (i.e. if tagging enabled was
unchecked before you checked it as part of this setup), set this additional
setting:
docuss hide tags→ checked
Select a public topic (or create a new one), edit it, and add those two tags:
dcs-commentdcs-discuss
Discourse will ask if you want to create them: answer yes.
Now you can safely delete the topic if you want, the tags will remain. Nope,
sometimes it doesn't work. You better keep the topic.
Now that your website is displayed within Discourse, you might want to reconsider your navigation/menu system. You can keep it in your website, you can move it to Discourse, or you can do a bit of both.
At the very minimum, in your website, you need to update the links to your
forum. Change them to http://www.mydiscourse.org/latest (instead of
http://www.mydiscourse.org).
Discourse custom navigation is out of the scope of this plugin. To learn more about it, see Best way to customize the header. Just use the fact that, whether from a Discourse menu or from your website:
http://www.mydiscourse.org/points to your home page,http://www.mydiscourse.org/docuss/[pageName]points to one of your website's page,http://www.mydiscourse.org/latestpoints to your forum.
docuss hide sugg topics: hide suggested topics displayed at the bottom of Docuss topic pages.docuss hide categories: hide categories everywhere in Discourse. Notice that you can also set "header dropdown category count" to 0 to hide categories in the hamburger menu alone.docuss hide tags: hide tags everywhere in Discourse.docuss hide hamburger menu: hide the Discourse hamburger menu.
When using the url-composer-templates theme component alongside this plugin, category assignment is handled automatically to prevent conflicts:
- Template-based forms (e.g.,
/tags/intersection/*URLs): Theurl-composer-templatescomponent assigns the "Hidden" category before opening the composer - Manual composer opens: Users can select categories normally
- Other Docuss pages (e.g., whitepaper): Standard Docuss behavior applies
By default, template forms auto-select the "Hidden" category. To change this:
- Open
url-composer-templates/javascripts/discourse/api-initializers/z-auto-open-composer.js - Find the section labeled "CATEGORY AUTO-SELECTION FOR TEMPLATE FORMS"
- Modify the category finder. For example, to use "General" instead:
const targetCategory = site.categories.find( (c) => c && c.name && c.name.toLowerCase() === "general" );
To disable automatic category selection for template forms:
- In
z-auto-open-composer.js, find the category auto-selection code - Comment out or remove the "hidden" category lookup block
- Set
categoryId = nullto let users choose manually
This ensures templates work smoothly while maintaining flexibility for different Docuss use cases.
Docuss relies on automatically generated tags to achieve its magic (generated
tags are of the form dcs-xxxxxx-xxxxxx). That is why, to be on the safe side,
it is advised not to use tags in your Discourse community and set the above
docuss hide tags setting to true. To ease your decision, consider that Docuss
is a new way of categorizing topics ("per balloon", instead of "per category" or
"per tag"), so maybe tags are unnecessary with Docuss anyway.
However, if you decide to use tags in your Discourse community, Docuss will try
its best to hide its automatically generated tags. One area where Docuss doesn't
do a good job is the tags page, where Docuss tags will appear blank instead of
being hidden.
As an administrator, when troubleshooting tag issues, press Alt+a to disable
Docuss CSS and thus showing Docuss tags.
When I create a topic for a Docuss page, the
categoryfield is hidden. Why is that?
User cannot select a category from a Docuss page. Categories are applied automatically by Docuss, depending on webmaster predefined choices. The way webmasters define categories depends on the Docuss Client library they use:
comToPlugin.js: see heredcs-html-based.js: see heredcs-decorator.js: see here (search the page for "category")
A cross-origin timing diagnostic tool for tracking communication between Discourse (Docuss plugin) and the embedded iframe. Use this to debug timing issues, identify slow operations, and understand the sequence of events during page navigation.
Open your browser's developer console (F12 → Console) and run:
// Start collecting for 24 hours
window.dcsTimingStart(24)
// Navigate around your site normally...
// Check status anytime
window.dcsTimingStatus()
// When done, stop and download the log
window.dcsTimingStop()
- Persists across page reloads - Collection continues when you refresh or navigate
- Auto-saves every 5 seconds to localStorage
- Saves on page unload - Won't lose data if you close the tab
- Auto-expires after the specified duration
- Caps at 10,000 events to prevent localStorage overflow
- Trims oldest events automatically if storage gets full
| Command | Description |
|---|---|
dcsTimingStart(hours) |
Start collecting for specified hours (default 24) |
dcsTimingStatus() |
Check if active, time remaining, event count |
dcsTimingStop() |
Stop collecting and download all events |
dcsTimingExport() |
Download collected events without stopping |
dcsShowTimeline() |
Show events in console |
dcsTimingClear() |
Delete all collected data |
Discourse Side:
- Route changes - When Discourse navigates to a new page
- Page loads - When iframe content is loaded
- Tag loading - When waiting for topic tags to load
- postMessage sends - Messages sent to the iframe
iframe Side (fl-maps):
- Message received - When iframe receives a message from parent
- pauseVideo - Video pause events
- dcsOpenForm - Form open requests
- dcs-topic-posted - Topic creation confirmations
- Map mount - When the map component mounts
DCS Timing Log - Extended Collection
=====================================
Exported: 2025-12-11T10:30:00.000Z
Collection started: 2025-12-10T10:30:00.000Z
Duration: 1440.0 minutes
Total events: 523
=== PAGE: https://example.com/docuss/home ===
0ms (10:30:00.123) [discourse] Route change detected
15ms (10:30:00.138) [discourse] iframe ready for transitions
45ms (10:30:00.168) [fl-maps] Message received: cycleRoutes
- Run
dcsTimingStart(24)in console - Use the site normally (refresh, navigate, reproduce issues)
- Run
dcsTimingStatus()to check event count - Run
dcsTimingStop()to download the log file - Share the
.txtfile for analysis
See here.