@machinesch01ar/n8n-nodes-discourse
v0.1.3
Published
n8n node for Discourse AI artifact, category, post, topic, personal message, upload, and Data Explorer operations
Maintainers
Keywords
Readme
@machinesch01ar/n8n-nodes-discourse
n8n community node package for managing Discourse AI artifacts, categories, posts, topics, personal messages, uploads, and Data Explorer queries, including presigned object storage workflows.
This package is currently optimized for private/internal use.
Included Node
- Discourse Extended (
discourseExtended)- Resource: AI Artifact
CreateDeleteGetGet ManyUpdate
- Resource: AI Artifact Storage
CreateDeleteGetGet ManySetUpdate
- Resource: Category
CreateDeleteGetGet ManyUpdate
- Resource: Personal Message
Add ParticipantAdd Participants (Batch)CreateGet Many (Inbox)Get Many (Sent)Invite GroupRemove ParticipantReply
- Resource: Post
BookmarkCreateDeleteGenerate TTS AudioGenerate TTS Audio + Spaces UploadGetGet Many (All Posts)Get Many (Topic)Get Many (User)Get Revision (Latest)Get Revision (Version)LikePrepare for TTSRecoverUnbookmarkUnlikeUpdate
- Resource: Topic
CreateDeleteGetGet Many (Latest)Get Many (Top)SearchSet StatusUpdate
- Resource: Upload
CreateCreate From Source URLUpload to Object Storage
- Resource: Data Explorer
CreateDeleteGetGet ManyRunUpdate
- Resource: AI Artifact
Node naming note: this package uses Discourse Extended to avoid confusion with n8n's built-in Discourse node.
Node capability note: Discourse Extended is marked usableAsTool: true in node metadata, so it can be used in n8n tool-capable workflow contexts.
Skills Catalog CSV
This repository includes a skills catalog seed file at:
The CSV is designed for workflows that import/sync skill rows into n8n Data Tables (for example, a table named Discourse Extended Skills), with progressive disclosure patterns such as:
List skill catalog(metadata-only pass)Load skill(full skill payload byskill_key)
CSV schema (column order):
skill_keyenabledscopeprioritynamedescription_shortcatalog_linetags_jsoninstructions_mdresources_jsonversionsource_shaupdated_at
Maintenance requirement:
- Keep this CSV in sync with the action surface in
nodes/Discourse/actions/*/index.ts. - Maintain exactly one CSV row per action key using
resource.operationformat (for example,topic.search). - Whenever an action is added, removed, renamed, or behaviorally changed, update this CSV in the same change as the node code and README updates.
Installation
Community-node install behavior depends on package verification and deployment type:
- Unverified npm community packages install from npm on self-hosted n8n.
- Verified community nodes can be installed from the nodes panel, including supported n8n Cloud instances.
Option A: Local development/private package via npm link
From the package directory (packages/n8n-nodes-discourse in this monorepo):
cd packages/n8n-nodes-discourse
npm install
npm run build
npm linkIn your n8n custom extensions folder:
mkdir -p ~/.n8n/custom
cd ~/.n8n/custom
npm init -y # only if package.json does not exist
npm link @machinesch01ar/n8n-nodes-discourseRestart n8n and search for the node name Discourse Extended in the node picker.
Contributor runbook:
- ../../docs/local-dev.md (start with
./scripts/dev-setup.sh, then useuv run --no-editable discoflow ...from repo root)
Option B: Install from npm in n8n UI (self-hosted)
If published to npm, install from Settings > Community Nodes > Install using package name:
@machinesch01ar/n8n-nodes-discourseYou can pin a published version when needed:
@machinesch01ar/n8n-nodes-discourse@<published-version>For verified-community-node installs from the editor nodes panel, refer to the verified install docs in the resources section.
Option C: Manual install in Docker/queue mode/private registries
Inside the n8n environment (for example, Docker shell), install the package in the node extensions directory and restart n8n:
mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
npm i @machinesch01ar/n8n-nodes-discourseIf you use a non-default custom extensions path, configure N8N_CUSTOM_EXTENSIONS.
Credentials
- Discourse API (Discourse Extended) (
discourseExtendedApi)Base URL(example:https://forum.example.com)API KeyAPI Username
- ElevenLabs API (
elevenLabsApi) (used byPost -> Generate TTS AudioandPost -> Generate TTS Audio + Spaces Upload)API Key
- DigitalOcean Spaces API (
digitalOceanSpacesApi) (optional, used byPost -> Generate TTS Audio + Spaces Upload)Region(example:nyc3)Access KeySecret Key
Credential selector visibility in the node editor:
Discourse API (Discourse Extended)credential selector is always shown.ElevenLabs APIcredential selector is shown only forResource: Post+Operation: Generate TTS AudioorGenerate TTS Audio + Spaces Upload.DigitalOcean Spaces APIcredential selector is shown only forResource: Post+Operation: Generate TTS Audio + Spaces Upload.
Auth headers sent on requests:
Api-KeyApi-Username
Credential test endpoint: GET /latest.json?per_page=1
Note for scoped artifact keys: keys scoped only to discourse_ai:manage_artifacts may fail this credential test (because /latest.json is out of scope) while artifact operations can still work.
Credential visibility note for n8n projects/node access:
- Credential dropdown visibility is filtered by credential type compatibility, the current node
Resource+Operation, and credential access within the current project/workspace. - If a
Discourse API (Discourse Extended)credential is created from the global Credentials tab and does not appear in theDiscourse Extendednode dropdown, edit that credential and ensure it is allowed for theDiscourse Extendednode. - Creating the credential directly from the
Discourse Extendednode (Create new credential) is recommended and usually auto-assigns the correct node access.
Operations
AI Artifact
Create: creates an artifact viaPOST /admin/plugins/discourse-ai/ai-artifacts.json.- Requires
User ID,Post ID or URL,Name, andHTML. - Supports optional
CSS,JavaScript, andMetadata JSON. Publictoggle always sets/overridesmetadata.public.
- Requires
Get: fetches an artifact viaGET /admin/plugins/discourse-ai/ai-artifacts/{id}.json; supports simplify output.Get Many: lists artifacts viaGET /admin/plugins/discourse-ai/ai-artifacts.json.- Supports
Return All,Limit,Page,Per Page(capped at 100 by API), andSimplify. - Uses API paging metadata (
meta.has_more) to fetch additional pages whenReturn Allis enabled.
- Supports
Update: updates an artifact viaPUT /admin/plugins/discourse-ai/ai-artifacts/{id}.json.- Supports partial updates for owner/post linkage, source fields (
HTML,CSS,JavaScript),Name,Public, andMetadata JSON. Publicfield overridesmetadata.publicwhen included inUpdate Fields.- Requires at least one update field.
- Supports partial updates for owner/post linkage, source fields (
Delete: deletes an artifact viaDELETE /admin/plugins/discourse-ai/ai-artifacts/{id}.json; returns{ deleted: true }.
For artifact selectors, ID and artifact URLs are supported through an n8n resource locator field.
AI Artifact Storage
Create: creates a storage key viaPOST /discourse-ai/ai-bot/artifact-key-values/{artifact_id}.- Requires
Key,Value, and artifact scope. - Uses strict guardrail checks: fails when key already exists for the current user/artifact.
- Supports
Publicflag andOutput Mode(Key/ValueorRaw).
- Requires
Get: fetches one storage key fromGET /discourse-ai/ai-bot/artifact-key-values/{artifact_id}using key filtering.- Uses strict guardrail checks: fails when key is missing.
- Supports
Output Mode(Key/ValueorRaw).
Get Many: reads storage rows viaGET /discourse-ai/ai-bot/artifact-key-values/{artifact_id}.- Supports
Return All,Limit,Page,Per Page(capped at 100), optionalKeyfilter,Keys Only, andAll Users. - Supports
Output Mode:Rows: emits one output item per returned key-value row.Response: emits one output item containing response envelope (key_values,users,total_count,has_more).
- Supports
Set: writes or updates a key viaPOST /discourse-ai/ai-bot/artifact-key-values/{artifact_id}.- Requires
Keyand stringValue. - Supports
Publicflag for the stored key.
- Requires
Update: updates a storage key viaPOST /discourse-ai/ai-bot/artifact-key-values/{artifact_id}.- Requires existing
Keyand newValue. - Uses strict guardrail checks: fails when key is missing.
- Supports optional
Update Publicoverride andOutput Mode(Key/ValueorRaw).
- Requires existing
Delete: deletes one key for current user viaDELETE /discourse-ai/ai-bot/artifact-key-values/{artifact_id}/{key}; returns{ deleted: true, artifact_id, key }.
For artifact storage selectors, ID and artifact URLs are supported through an n8n resource locator field.
Category
Create: creates a category viaPOST /categories.json.- Requires
Name. - Supports optional fields including
Slug,Color,Text Color,Description,Topic Template,Parent Category ID,Position,Search Priority,Read Restricted, andPermissions JSON.
- Requires
Delete: deletes a category viaDELETE /categories/{id}.json; returns{ deleted: true }.- Supports
Delete Topics Too(maps todelete_topics=true).
- Supports
Get: fetches one category viaGET /c/{id}/show.json; supports simplify output.Get Many: lists categories viaGET /categories.json; supports simplify output.Update: updates a category viaPUT /categories/{id}.jsonwith selected fields.- Supports the same admin-oriented fields as
Create, usingUpdate Fields. - Requires at least one update field.
- Supports the same admin-oriented fields as
For category selectors, ID and full category URL are both supported through an n8n resource locator field.
Personal Message
Create: creates a private message topic viaPOST /posts.json.- Sends
archetype=private_message,title,raw, optionaltarget_usernames,target_recipients,target_group_names, andtags. - Requires at least one recipient username or recipient group name.
- Sends
Reply: posts a reply in a private message topic viaPOST /posts.json.- Sends
topic_id,raw, and optionalreply_to_post_number.
- Sends
Get Many (Inbox): lists inbox personal message topics viaGET /topics/private-messages/{username}.json.- Supports optional
PageandSimplify. Mailbox Usernamedefaults to credentialAPI Usernamewhen empty.
- Supports optional
Get Many (Sent): lists sent personal message topics viaGET /topics/private-messages-sent/{username}.json.- Supports optional
PageandSimplify. Mailbox Usernamedefaults to credentialAPI Usernamewhen empty.
- Supports optional
Add Participant: invites one user to a personal message topic viaPOST /t/{id}/invite.json.Add Participants (Batch): invites multiple users (comma-separated usernames) via repeatedPOST /t/{id}/invite.jsoncalls.- Returns one output item per invited username.
Remove Participant: removes one user from a personal message topic viaDELETE /t/{id}/remove-allowed-user.json.Invite Group: invites a group to a personal message topic viaPOST /t/{id}/invite-group.jsonwith optionalshould_notify.
For personal message topic selectors, ID and full topic URL are both supported through an n8n resource locator field.
Post
Create: creates a reply post viaPOST /posts.json.- Requires
Topic ID or URLandRaw. - Supports optional
Reply To Post Number,Auto Track, andCreated At.
- Requires
Get: fetches one post viaGET /posts/{id}.json; supports simplify output.Update: updates a post viaPUT /posts/{id}.jsonusingpost.rawand optionalpost.edit_reason.Delete: deletes a post viaDELETE /posts/{id}.json; supports optionalforce_destroy=true.- Default behavior is soft delete (
Force Destroy = false). - Returns
{ deleted: true, force_destroy: <boolean> }.
- Default behavior is soft delete (
Get Many (All Posts): lists posts viaGET /posts.json.- Supports
Return All,Limit,Before,Page, optional ordering fields (Order,Ascending,Desc), andSimplify.
- Supports
Get Many (Topic): lists posts from a topic viaGET /t/{id}.jsonplus batchedGET /t/{id}/posts.json.- Supports
Return All,Limit, andSimplify.
- Supports
Get Many (User): lists user post activity viaGET /u/{username}/activity/posts.jsonwith fallback toGET /user_actions.json?filter=5.- Supports
Page,Return All,Limit, andSimplify.
- Supports
Like: creates a like viaPOST /post_actions(.json)withpost_action_type_id=2.Unlike: removes a like viaDELETE /post_actions/{id}(.json)withpost_action_type_id=2.Bookmark: creates a bookmark viaPOST /post_actions(.json)withpost_action_type_id=1.Unbookmark: removes a bookmark viaDELETE /post_actions/{id}(.json)withpost_action_type_id=1.Get Revision (Latest): fetches latest revision viaGET /posts/{id}/revisions/latest(.json); supports simplify output.Get Revision (Version): fetches a specific revision viaGET /posts/{id}/revisions/{version}(.json); supports simplify output.Recover: recovers a deleted post viaPUT /posts/{id}/recover(.json).Prepare for TTS: prepares post content for text-to-speech workflows.- Input supports
Post ID or URL, optionalRaw Text Override, and optional metadata preamble. - Post fetch path:
GET /posts/{id}.json?include_raw=true, with raw-text fallback to/raw/{topic_id}/{post_number}and/raw/{post_id}when needed. - Cleaning pipeline strips Markdown/BBCode/HTML, normalizes spacing and headings, and supports toggles for URLs, images, code blocks, mentions, and hashtags.
- Output modes:
Single Text(default): returns onetextfield.Chunks Array: returns one item containingtextandchunks.Chunk Items: returns one item per chunk with chunk metadata.
- Chunking supports sentence-aware or paragraph-aware strategies with configurable
Max Chunk Length.
- Input supports
Generate TTS Audio: generates stitched ElevenLabs audio from cleaned text, with optional transcript artifacts.Generate TTS Audio + Spaces Upload: runs the same TTS synthesis/transcript pipeline and uploads generated artifacts to DigitalOcean Spaces.- Both TTS operations:
- Require
Cleaned Text,Voice ID, andModel ID. - Use free-text
Model IDplus optional dynamic model-limit lookup (GET /v1/models) for future model compatibility. - Support model-limit fallback, manual override, safety margin, and automatic split retries on text-length errors.
- Support bounded parallel chunk synthesis via
Performance Options -> Max Chunk Concurrencywhile preserving deterministic chunk order. - Support exponential backoff with jitter for retriable errors (
429,5xx) viaRetry Options. - Support final
MP3orWAVoutput. - Support transcript generation with alignment timestamps (
with-timestamps) and output modes:Text OnlyAlignment JSON OnlyText and Alignment JSON
- Apply audio-duration fallback when chunk alignment timestamps are missing, to keep merged timeline offsets monotonic.
- Emit sync guardrail warnings for MP3 transcript runs and include a strict-sync format recommendation in output metadata.
- Support binary output fields for audio and transcript artifacts so output can be fed directly into downstream n8n nodes.
- Require
Generate TTS Audio + Spaces Uploadadditionally uploads generated audio/transcript files to DigitalOcean Spaces with S3 Signature V4 signing.
For post selectors, ID, direct post URL (/p/{id}), and topic post URL (/t/.../{topicId}/{postNumber}) are supported through an n8n resource locator field.
Topic
Create: creates topic viaPOST /posts.jsonwithtitle,raw, optionalcategory, and optional additional fields:Auto Track,Created At,Embed URL, andExternal ID.Delete: deletes topic viaDELETE /t/{id}.json; returns{ deleted: true }.Get: fetches topic viaGET /t/{id}.json; supports simplify output.Get Many (Latest): usesGET /latest.json; supportsReturn All,Limit, ordering fields, and simplify output.Get Many (Top): usesGET /top.json; supportsPeriod,Return All,Limit, and simplify output.Search: usesGET /search.jsonwithq; supports paging and simplify output.Set Status: updates topic status viaPUT /t/{id}/status.jsonwith status + enabled flag and optionaluntilfor pinned status.Update: updates topic viaPUT /t/-/{id}.jsonusingtopic.titleand/ortopic.category_id.
For topic selectors, ID and full topic URL are both supported through an n8n resource locator field.
Upload
Create: uploads n8n binary data directly to Discourse via multipartPOST /uploads.json.- Supports
Type,Synchronous,User ID(required for avatar),Additional Fields, andSimplify.
- Supports
Create From Source URL: downloads source file from URL, then uploads it to Discourse viaPOST /uploads.json.- Source URL must be public or presigned and unexpired.
- Supports filename override, upload type, avatar user ID, additional fields, and simplify.
Upload to Object Storage: uploads n8n binary data to a presignedPUTURL.- Compatible with S3-style presigned URLs, including DigitalOcean Spaces.
- Supports optional content type override and metadata output.
Data Explorer
Get Many: lists saved Data Explorer queries.- Endpoint fallback:
GET /api/query->GET /admin/plugins/discourse-data-explorer/queries.json->GET /admin/plugins/explorer/queries.json. - Supports
Return All,Limit, andSimplify.
- Endpoint fallback:
Get: fetches a query by ID.- Endpoint fallback:
GET /api/query/{id}->GET /admin/plugins/discourse-data-explorer/queries/{id}.json->GET /admin/plugins/explorer/queries/{id}.json. - Supports
Query ID or URLresource locator and simplify output.
- Endpoint fallback:
Create: creates a query withQuery Name,SQL, and optionalDescription+Params JSON.- Endpoint fallback:
POST /api/query->POST /admin/plugins/discourse-data-explorer/queries->POST /admin/plugins/explorer/queries.
- Endpoint fallback:
Update: updates an existing query by ID with selected fields.- Endpoint fallback:
PUT /api/query/{id}->PUT /admin/plugins/discourse-data-explorer/queries/{id}->PUT /admin/plugins/explorer/queries/{id}.
- Endpoint fallback:
Delete: deletes a query by ID and returns{ deleted: true }.- Endpoint fallback:
DELETE /api/query/{id}->DELETE /admin/plugins/discourse-data-explorer/queries/{id}->DELETE /admin/plugins/explorer/queries/{id}.
- Endpoint fallback:
Run: runs a query by ID with optionalParams JSON.- Endpoint fallback:
GET /api/query/{id}/run->GET /data-explorer/queries/{id}/run->POST /admin/plugins/discourse-data-explorer/queries/{id}/run->POST /admin/plugins/explorer/queries/{id}/run. - Uses the non-admin/public Data Explorer run route when available, then falls back to admin routes.
- Supports
Result Onlyoutput mode ({ columns, rows }).
- Endpoint fallback:
For Data Explorer query selectors, ID and full query URL are both supported through an n8n resource locator field.
Usage Patterns
Pattern: S3/Spaces object URL into Discourse upload
- Generate a presigned or public object URL for a file.
- In n8n, use
Discourse Extended -> Upload -> Create From Source URL. - Set
Source URLto that object URL. - Optional: set
Original Filename,Type, andSynchronous.
Pattern: n8n binary to DigitalOcean Spaces
- Generate a presigned
PUTURL for your Spaces object key. - In n8n, use
Discourse Extended -> Upload -> Upload to Object Storage. - Map
Input Data Field Nameto your binary field (defaultdata). - Set
Presigned PUT URLand optionalContent Type.
Pattern: Post to ElevenLabs audio + transcript + Spaces
- Use
Discourse Extended -> Post -> Prepare for TTSand outputSingle Text. - Use a second
Discourse Extendednode withPost -> Generate TTS Audio + Spaces Upload. - Map
Cleaned Textto the prior node's{{$json.text}}, then setVoice IDandModel ID. - Enable
Generate Transcriptand choose transcript output mode as needed. - Configure
Spaces Options(Bucket Name, folder/path, and optional transcript upload artifacts).
Compatibility
- Uses n8n nodes API version
1(package.json -> n8n.n8nNodesApiVersion). - Intended for self-hosted n8n with community packages enabled during pre-release development.
- If this package becomes verified, install behavior on n8n Cloud follows n8n verified community node rules.
- Install/load behavior can be affected by:
N8N_COMMUNITY_PACKAGES_ENABLEDN8N_COMMUNITY_PACKAGES_PREVENT_LOADINGN8N_CUSTOM_EXTENSIONS
Troubleshooting
- Node not visible after install
- Restart n8n.
- Verify you searched for node name
Discourse Extended(not npm package name). - Confirm community packages are enabled in your n8n environment variables.
Discourse API (Discourse Extended)credential exists but is missing from the node dropdown- Edit the credential and ensure node access includes
Discourse Extended. - Create the credential directly from within the node as a fallback; this usually auto-assigns compatible node access.
- Confirm workflow and credential are in the same project/workspace.
- Edit the credential and ensure node access includes
Createupload fails with missing binary- Confirm the binary field exists and
Input Data Field Namematches it.
- Confirm the binary field exists and
Create/Create From Source URLavatar upload fails- Provide
User IDwhenType = Avatar.
- Provide
Create From Source URLfails- Confirm URL is accessible and not expired.
Upload to Object Storagefails- Confirm URL is presigned for
PUT, not expired, and signed headers match request headers.
- Confirm URL is presigned for
- Category create/update fails with
400validation errors- Confirm required fields are present (
Namefor create) and optional JSON fields likePermissions JSONare valid JSON objects.
- Confirm required fields are present (
- Category operations fail with
403- Confirm the API key/user has category admin/moderation permissions on the Discourse instance.
- Category URL input fails
- Use a category URL that includes the numeric category ID (for example:
https://forum.example.com/c/support/12).
- Use a category URL that includes the numeric category ID (for example:
- Post URL input fails
- For topic-style URLs, include both topic ID and post number (for example:
https://forum.example.com/t/topic-slug/123/4). - Direct post URLs like
https://forum.example.com/p/456are also supported.
- For topic-style URLs, include both topic ID and post number (for example:
- Post delete behavior is not permanent
- Enable
Force DestroyinPost -> Deleteif permanent deletion is required.
- Enable
- Post reactions (
Like/Bookmark) fail with403- Confirm the API key/user has permission to perform post actions on the target forum/post.
- Post revision/recover operations fail with
404- Confirm the post exists, revisions are available for that post, and the acting user has visibility to the post history.
Prepare for TTSreturns empty or weak text- Prefer posts with
rawavailable; some cooked-only content may lose detail during HTML cleanup. - If needed, provide
Raw Text Overrideto force your own source text.
- Prefer posts with
Prepare for TTSchunking splits in awkward places- Increase
Max Chunk Lengthand switch betweenSentence AwareandParagraph Awarestrategies based on your TTS model behavior.
- Increase
Generate TTS Audiofails with ElevenLabs auth errors- Confirm an
ElevenLabs APIcredential is attached and API key is valid.
- Confirm an
Generate TTS Audiofails with model/chunk length errors- Keep dynamic model-limit lookup enabled and increase safety margin.
- If needed, manually lower
Max Characters Override.
Generate TTS Audiois too slow for very long text- Increase
Performance Options -> Max Chunk Concurrencygradually (for example from3to4) while monitoring ElevenLabs rate limits.
- Increase
Generate TTS Audioretries are still failing on429- Increase
Retry Max Delay (MS)and/orMax Retries per Chunk. - Keep jitter enabled (
Retry Jitter Ratio) to reduce synchronized retry bursts.
- Increase
Generate TTS Audioreturns weak or missing transcript artifacts- Ensure
Generate Transcriptis enabled and transcript output mode includes desired artifact type(s).
- Ensure
Generate TTS Audiotranscript timing quality is critical- Prefer
WAVoutput and reviewwarningsin output JSON. - MP3 is supported, but chunk-boundary encoder behavior can introduce slight timestamp drift.
- Prefer
Generate TTS AudioSpaces upload fails- Confirm
DigitalOcean Spaces APIcredential values and bucket name are correct. - Confirm the access key can write to the selected bucket path.
- The
DigitalOcean Spaces APIselector is only shown forPost -> Generate TTS Audio + Spaces Upload.
- Confirm
- Data Explorer operations fail with
404/405- Confirm the Data Explorer plugin is enabled on the Discourse instance.
- Verify API base URL points to the forum root (for example
https://forum.example.com). - The node already falls back across API/public/admin route variants for compatibility.
- Data Explorer run/create/update/delete fails with
403- Confirm the API key/user has required Data Explorer permissions for the target query.
- AI Artifact CRUD operations fail with
403- Confirm the API user is an admin. Artifact CRUD routes are under
/admin/plugins/discourse-ai. - If using granular API keys, confirm
discourse_ai:manage_artifactsscope is enabled.
- Confirm the API user is an admin. Artifact CRUD routes are under
- Discourse credential test fails but AI Artifact operations work
- This can happen with narrow-scope granular keys because credential test uses
/latest.json. - Keep current credential config and validate with an artifact operation.
- This can happen with narrow-scope granular keys because credential test uses
- AI Artifact private access behaves unexpectedly
- Confirm
metadata.publicis not set totrueunless global viewer access is intended. - For group-restricted access, ensure backing post/category permissions match intended viewers.
- Confirm
- AI Artifact Storage
all_users=truereturns limited rows- Non-admin users are still restricted by server-side visibility rules.
- Use an admin API user when full cross-user enumeration is required.
- AI Artifact Storage
Createfails with key already exists- This is expected strict mode behavior. Use
Updatefor existing keys orSetfor upsert behavior.
- This is expected strict mode behavior. Use
- AI Artifact Storage
Get/Updatefails with missing key- This is expected strict mode behavior. Use
Createfirst (orSetfor upsert behavior).
- This is expected strict mode behavior. Use
- Personal Message create/reply/participant operations fail with
403- Confirm the API key/user can create and manage private messages on the target Discourse instance.
Invite Groupfails- Confirm the group exists and the acting API user has permission to invite groups into the target PM topic.
- Personal message mailbox list is empty unexpectedly
- Confirm
Mailbox Usernameis correct and has visibility to the target PM threads.
- Confirm
Implemented So Far
- Added
AI Artifactresource withCreate,Delete,Get,Get Many, andUpdate. - Added
AI Artifact Storageresource withCreate,Delete,Get,Get Many,Set, andUpdate. - Added
Categoryresource withCreate,Delete,Get,Get Many, andUpdate. - Added
Personal Messageresource withCreate,Reply,Get Many (Inbox),Get Many (Sent),Add Participant,Add Participants (Batch),Remove Participant, andInvite Group. - Added
Postresource with explicit CRUD (Create,Delete,Get,Update) and practical post features (Get Manyvariants, reactions, revisions, and recover). - Added
Post -> Prepare for TTSwith markup cleanup, optional metadata preamble, and optional chunking for downstream text-to-speech calls. - Added
Post -> Generate TTS Audiowith ElevenLabs synthesis, robust chunk limit handling, chunk stitching, and transcript generation. - Added
Post -> Generate TTS Audio + Spaces Uploadfor Spaces-backed artifact upload in the same TTS pipeline. - Added
Upload -> Create From Source URL. - Added
Upload -> Upload to Object Storagefor presignedPUTuploads. - Added support for S3-compatible presigned workflows (including DigitalOcean Spaces).
- Kept existing
Upload -> Createfor direct multipart upload to Discourse. - Topic operations continue to support ID/URL selectors and simplified outputs where applicable.
- Added
Data Explorerresource withCreate,Delete,Get,Get Many,Run, andUpdate. - Added endpoint fallback coverage for newer Data Explorer API/public routes and legacy admin routes.
Release Policy
- This package is currently pre-release and has no public release history yet.
packages/n8n-nodes-discourse/package.jsonmay contain a development target version, but that alone does not indicate a published release.- Pre-release documentation for functionality lives in this README;
CHANGELOG.mdremains minimal until public releases begin.
Docs Maintenance Checklist
During development and release prep:
- Verify operation list in README matches:
nodes/Discourse/actions/aiArtifact/index.tsnodes/Discourse/actions/aiArtifactStorage/index.tsnodes/Discourse/actions/category/index.tsnodes/Discourse/actions/dataExplorer/index.tsnodes/Discourse/actions/personalMessage/index.tsnodes/Discourse/actions/post/index.tsnodes/Discourse/actions/topic/index.tsnodes/Discourse/actions/upload/index.ts
- Verify endpoint references still exist in Discourse OpenAPI.
- Verify install instructions still match current n8n docs.
- Once public releases begin, maintain versioned changelog entries aligned with published release tags.
Development
Contributor workflow for this repository is managed from repo root through the DiscoFlow CLI:
# from repository root
./scripts/dev-setup.sh
uv run --no-editable discoflow start
uv run --no-editable discoflow watch
uv run --no-editable discoflow ui-refreshUse explicit --no-editable for DiscoFlow CLI commands to avoid editable .pth import edge cases.
Use direct package commands only for package-level debugging or release work:
cd packages/n8n-nodes-discourse
npm install
npm run lint
npm run build
npm run devResources
- n8n community node installation:
- https://docs.n8n.io/integrations/community-nodes/installation/
- n8n verified community node installation (nodes panel):
- https://docs.n8n.io/integrations/community-nodes/installation/verified-install/
- n8n manual install:
- https://docs.n8n.io/integrations/community-nodes/installation/manual-install/
- n8n nodes environment variables:
- https://docs.n8n.io/hosting/configuration/environment-variables/nodes/
- n8n custom extensions location:
- https://docs.n8n.io/hosting/configuration/configuration-examples/custom-nodes-location/
- n8n built-in Discourse node docs:
- https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.discourse/
- Discourse API docs:
- https://docs.discourse.org/
- https://raw.githubusercontent.com/discourse/discourse_api_docs/main/openapi.json
- Discourse Data Explorer plugin topic:
- https://meta.discourse.org/t/data-explorer-plugin/32566
- Discourse Data Explorer API update topic:
- https://meta.discourse.org/t/introducing-data-explorer-api-endpoints-for-query-creation-and-execution/350029
- Discourse AI artifact docs and API discussions:
- https://meta.discourse.org/t/discourse-ai-web-artifacts/339972
- https://meta.discourse.org/t/ai-artifact-user-storage/369822
- https://github.com/discourse/discourse/pull/34193
- https://github.com/discourse/discourse/commit/99207c0d5228be55e9efc0e0b3fd5948bc672666
- https://github.com/discourse/discourse/commit/558389b5f0bb122a5e98a81d7dc28d397d341d98
- Discourse PM API usage and routes:
- https://www.rubydoc.info/gems/discourse_api/DiscourseApi/API/PrivateMessages
- https://meta.discourse.org/t/can-i-update-add-to-allowed-users-via-api/63062
- Discourse post API usage and routes:
- https://www.rubydoc.info/gems/discourse_api/DiscourseApi/API/Posts
- https://www.rubydoc.info/gems/discourse_api/DiscourseApi/API/PostActions
- https://meta.discourse.org/t/how-to-use-api-to-edit-topic-post/210300
- https://meta.discourse.org/t/if-a-user-can-delete-their-topic-and-or-replies-via-the-api/196863
- https://meta.discourse.org/t/retrieving-post-raw-content/115094
- https://meta.discourse.org/t/get-specific-post-from-a-topic-and-get-the-raw/54471
- ElevenLabs API references:
- https://elevenlabs.io/docs/api-reference/models/get-all
- https://elevenlabs.io/docs/api-reference/text-to-speech/convert
- https://elevenlabs.io/docs/api-reference/text-to-speech/convert-with-timestamps
- Discourse category API usage and routes:
- https://www.rubydoc.info/gems/discourse_api/DiscourseApi/API/Categories
- https://meta.discourse.org/t/create-a-category-using-api/242996
- https://meta.discourse.org/t/delete-category-using-api/275641
- DigitalOcean Spaces API reference:
- https://docs.digitalocean.com/products/spaces/reference/s3-api/
License
This package is released under the MIT License. See LICENSE.md.
