From 0fb87b00e23090a72d11b0518aebb30527ff6404 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 19 Feb 2024 14:52:12 +1100 Subject: [PATCH] FEATURE: new Discourse Helper persona (#473) This persona searches Discourse Meta for help with Discourse and points users at relevant posts. It is somewhat similar to using "Forum Helper" on meta, with the notable difference that we can not lean on semantic search so using some prompt engineering we try to keep it simple. --- config/locales/server.en.yml | 8 + lib/ai_bot/personas/discourse_helper.rb | 48 +++++ lib/ai_bot/personas/persona.rb | 2 + lib/ai_bot/tools/discourse_meta_search.rb | 180 ++++++++++++++++++ lib/ai_bot/tools/search.rb | 2 +- spec/fixtures/search_meta/search.json | 1 + spec/fixtures/search_meta/site.json | 1 + .../modules/ai_bot/personas/persona_spec.rb | 3 + .../tools/discourse_meta_search_spec.rb | 68 +++++++ spec/lib/modules/ai_bot/tools/search_spec.rb | 23 ++- 10 files changed, 333 insertions(+), 3 deletions(-) create mode 100644 lib/ai_bot/personas/discourse_helper.rb create mode 100644 lib/ai_bot/tools/discourse_meta_search.rb create mode 100644 spec/fixtures/search_meta/search.json create mode 100644 spec/fixtures/search_meta/site.json create mode 100644 spec/lib/modules/ai_bot/tools/discourse_meta_search_spec.rb diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 79ab4877..86288151 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -170,6 +170,9 @@ en: dall_e3: name: "DALL-E 3" description: "AI Bot specialized in generating images using DALL-E 3" + discourse_helper: + name: "Discourse Helper" + description: "AI Bot specialized in helping with Discourse related tasks" topic_not_found: "Summary unavailable, topic not found!" summarizing: "Summarizing topic" searching: "Searching for: '%{query}'" @@ -195,6 +198,7 @@ en: schema: "Look up database schema" search_settings: "Searching site settings" dall_e: "Generate image" + search_meta_discourse: "Search Meta Discourse" command_help: random_picker: "Pick a random number or a random element of a list" categories: "List all publicly visible categories on the forum" @@ -209,6 +213,7 @@ en: schema: "Look up database schema" search_settings: "Search site settings" dall_e: "Generate image using DALL-E 3" + search_meta_discourse: "Search Meta Discourse" command_description: random_picker: "Picking from %{options}, picked: %{result}" read: "Reading: %{title}" @@ -225,6 +230,9 @@ en: search: one: "Found %{count} result for '%{query}'" other: "Found %{count} results for '%{query}'" + search_meta_discourse: + one: "Found %{count} result for '%{query}'" + other: "Found %{count} results for '%{query}'" google: one: "Found %{count} result for '%{query}'" other: "Found %{count} results for '%{query}'" diff --git a/lib/ai_bot/personas/discourse_helper.rb b/lib/ai_bot/personas/discourse_helper.rb new file mode 100644 index 00000000..1e40d309 --- /dev/null +++ b/lib/ai_bot/personas/discourse_helper.rb @@ -0,0 +1,48 @@ +#frozen_string_literal: true + +module DiscourseAi + module AiBot + module Personas + class DiscourseHelper < Persona + def tools + [Tools::DiscourseMetaSearch] + end + + def system_prompt + <<~PROMPT + You are Discourse Helper Bot + + - Discourse Helper Bot understand *markdown* and responds in Discourse **markdown**. + - Discourse Helper Bot has access to the search function on meta.discourse.org and can help you find answers to your questions. + - Discourse Helper Bot ALWAYS backs up answers with actual search results from meta.discourse.org, even if the information is in your training set + - Discourse Helper Bot does not use the word siscourse in searches, search function is restricted to Discourse Meta and Discourse specific discussions + - Discourse Helper Bot understands that search is keyword based (terms are joined using AND) and that it is important to simplify search terms to find things. + - Discourse Helper Bot understands that users often badly phrase and misspell words, it will compensate for that by guessing what user means. + + Example: + + User asks: + + "I am on the discourse standad plan how do I enable badge sqls" + attempt #1: "badge sql standard" + attempt #2: "badge sql hosted" + + User asks: + + "how do i embed a discourse topic as an iframe" + attempt #1: "topic embed iframe" + attempt #2: "iframe" + + - Discourse Helper Bot ALWAYS SEARCHES TWICE, even if a great result shows up in the first search, it will search a second time using a wider net to make sure you are getting the best result. + + Some popular categories on meta are: bug, feature, support, ux, dev, documentation, announcements, marketplace, theme, plugin, theme-component, migration, installation. + + - Discourse Helper Bot will lean on categories to filter results. + + The date now is: {time}, much has changed since you were trained. + PROMPT + end + end + end + end +end diff --git a/lib/ai_bot/personas/persona.rb b/lib/ai_bot/personas/persona.rb index 4db8690b..920e24d2 100644 --- a/lib/ai_bot/personas/persona.rb +++ b/lib/ai_bot/personas/persona.rb @@ -14,6 +14,7 @@ module DiscourseAi Personas::Researcher => -5, Personas::Creative => -6, Personas::DallE3 => -7, + Personas::DiscourseHelper => -8, } end @@ -62,6 +63,7 @@ module DiscourseAi Tools::Summarize, Tools::SettingContext, Tools::RandomPicker, + Tools::DiscourseMetaSearch, ] tools << Tools::ListTags if SiteSetting.tagging_enabled diff --git a/lib/ai_bot/tools/discourse_meta_search.rb b/lib/ai_bot/tools/discourse_meta_search.rb new file mode 100644 index 00000000..1be32ca9 --- /dev/null +++ b/lib/ai_bot/tools/discourse_meta_search.rb @@ -0,0 +1,180 @@ +#frozen_string_literal: true + +module DiscourseAi + module AiBot + module Tools + class DiscourseMetaSearch < Tool + class << self + def signature + { + name: name, + description: + "Will search topics in the current discourse instance, when rendering always prefer to link to the topics you find", + parameters: [ + { + name: "search_query", + description: + "Specific keywords to search for, space separated (correct bad spelling, remove connector words)", + type: "string", + }, + { + name: "user", + description: + "Filter search results to this username (only include if user explicitly asks to filter by user)", + type: "string", + }, + { + name: "order", + description: "search result order", + type: "string", + enum: %w[latest latest_topic oldest views likes], + }, + { + name: "max_posts", + description: + "maximum number of posts on the topics (topics where lots of people posted)", + type: "integer", + }, + { + name: "tags", + description: + "list of tags to search for. Use + to join with OR, use , to join with AND", + type: "string", + }, + { name: "category", description: "category name to filter to", type: "string" }, + { + name: "before", + description: "only topics created before a specific date YYYY-MM-DD", + type: "string", + }, + { + name: "after", + description: "only topics created after a specific date YYYY-MM-DD", + type: "string", + }, + { + name: "status", + description: "search for topics in a particular state", + type: "string", + enum: %w[open closed archived noreplies single_user], + }, + ], + } + end + + def name + "search_meta_discourse" + end + + def custom_system_message + <<~TEXT + You were trained on OLD data, lean on search to get up to date information + Discourse search joins all terms with AND. Reduce and simplify terms to find more results. + TEXT + end + end + + def search_args + parameters.slice(:category, :user, :order, :max_posts, :tags, :before, :after, :status) + end + + def invoke(bot_user, llm) + search_string = + search_args.reduce(+parameters[:search_query].to_s) do |memo, (key, value)| + return memo if value.blank? + memo << " " << "#{key}:#{value}" + end + + @last_query = search_string + + yield(I18n.t("discourse_ai.ai_bot.searching", query: search_string)) + + if options[:base_query].present? + search_string = "#{search_string} #{options[:base_query]}" + end + + url = "https://meta.discourse.org/search.json?q=#{CGI.escape(search_string)}" + + json = JSON.parse(Net::HTTP.get(URI(url))) + + # let's be frugal with tokens, 50 results is too much and stuff gets cut off + max_results = calculate_max_results(llm) + results_limit = parameters[:limit] || max_results + results_limit = max_results if parameters[:limit].to_i > max_results + + posts = json["posts"] || [] + posts = posts[0..results_limit.to_i - 1] + + @last_num_results = posts.length + + if posts.blank? + { args: parameters, rows: [], instruction: "nothing was found, expand your search" } + else + categories = self.class.categories + topics = (json["topics"]).map { |t| [t["id"], t] }.to_h + + format_results(posts, args: parameters) do |post| + topic = topics[post["topic_id"]] + + category = categories[topic["category_id"]] + category_names = +"" + if category["parent_category_id"] + category_names << categories[category["parent_category_id"]]["name"] << " > " + end + category_names << category["name"] + row = { + title: topic["title"], + url: "https://meta.discourse.org/t/-/#{post["topic_id"]}/#{post["post_number"]}", + username: post["username"], + excerpt: post["blurb"], + created: post["created_at"], + category: category_names, + likes: post["like_count"], + tags: topic["tags"].join(", "), + } + + row + end + end + end + + protected + + def self.categories + return @categories if defined?(@categories) + url = "https://meta.discourse.org/site.json" + json = JSON.parse(Net::HTTP.get(URI(url))) + @categories = + json["categories"] + .map do |c| + [c["id"], { "name" => c["name"], "parent_category_id" => c["parent_category_id"] }] + end + .to_h + end + + def description_args + { + count: @last_num_results || 0, + query: @last_query || "", + url: "https://meta.discourse.org/search?q=#{CGI.escape(@last_query || "")}", + } + end + + private + + def calculate_max_results(llm) + max_results = options[:max_results].to_i + return [max_results, 100].min if max_results > 0 + + if llm.max_prompt_tokens > 30_000 + 60 + elsif llm.max_prompt_tokens > 10_000 + 40 + else + 20 + end + end + end + end + end +end diff --git a/lib/ai_bot/tools/search.rb b/lib/ai_bot/tools/search.rb index aa2b5e2d..c2139407 100644 --- a/lib/ai_bot/tools/search.rb +++ b/lib/ai_bot/tools/search.rb @@ -88,7 +88,7 @@ module DiscourseAi end def search_args - parameters.slice(:user, :order, :max_posts, :tags, :before, :after, :status) + parameters.slice(:category, :user, :order, :max_posts, :tags, :before, :after, :status) end def invoke(bot_user, llm) diff --git a/spec/fixtures/search_meta/search.json b/spec/fixtures/search_meta/search.json new file mode 100644 index 00000000..b02212a1 --- /dev/null +++ b/spec/fixtures/search_meta/search.json @@ -0,0 +1 @@ +{"posts":[{"id":218354,"name":"Robin Ward","username":"eviltrout","avatar_template":"/user_avatar/meta.discourse.org/eviltrout/{size}/5275_2.png","created_at":"2016-08-24T20:48:02.587Z","like_count":15,"blurb":"Automated tests are a great way to protect your code against future regressions. Many people are familiar with how to do this in our Rails codebase with http://rspec.info/ rspec , but the Javascript s...","post_number":1,"topic_title_headline":"Write acceptance tests and component tests for Ember code in Discourse","topic_id":49167},{"id":138484,"name":"Robin Ward","username":"eviltrout","avatar_template":"/user_avatar/meta.discourse.org/eviltrout/{size}/5275_2.png","created_at":"2015-08-27T21:32:26.407Z","like_count":29,"blurb":"Previous tutorial: https://meta.discourse.org/t/developing-discourse-plugins-part-5-add-an-admin-interface/31761 Developing Discourse Plugins - Part 5 - Add an admin interface Did you know that Discou...","post_number":1,"topic_title_headline":"Developing Discourse Plugins - Part 6 - Add acceptance tests","topic_id":32619},{"id":1381521,"name":"Alan Tan","username":"tgxworld","avatar_template":"/user_avatar/meta.discourse.org/tgxworld/{size}/106117_2.png","created_at":"2023-10-24T23:13:37.118Z","like_count":16,"blurb":"Writing automated tests for themes is an important part of the theme development process which can help ensure that the features being introduced by a theme continues to work well overtime with core D...","post_number":1,"topic_title_headline":"End-to-end system testing for themes and theme components","topic_id":281579},{"id":311252,"name":"David Taylor","username":"david","avatar_template":"/user_avatar/meta.discourse.org/david/{size}/157490_2.png","created_at":"2017-07-26T14:09:58.126Z","like_count":17,"blurb":"Discourse has extensive frontend tests for core, plugins and themes. Once you have a functioning local development environment, those tests can be run locally in a number of different ways. Running te...","post_number":1,"topic_title_headline":"How to run Discourse core, plugin and theme QUnit test suites","topic_id":66857},{"id":59431,"name":"Erlend Sogge Heggen","username":"erlend_sh","avatar_template":"/user_avatar/meta.discourse.org/erlend_sh/{size}/119475_2.png","created_at":"2014-07-03T11:45:09.463Z","like_count":5,"blurb":"...view=1 to an URL, but the emulator has the added benefit of letting you select the screen profile of a specific device. I also tested all of the most popular online screen emulators, but unfortunately...","post_number":1,"topic_title_headline":"Test Discourse in mobile screen emulator","topic_id":17155},{"id":1419473,"name":"","username":"ToddZ","avatar_template":"/user_avatar/meta.discourse.org/toddz/{size}/328350_2.png","created_at":"2023-12-12T10:51:08.401Z","like_count":2,"blurb":"...amount of time troubleshooting inbound email because Discourse was rejecting every reply-by-email from my fake users. It had worked fine when I first tested several weeks ago… I finally realized that ...","post_number":1,"topic_title_headline":"Tip: when testing inbound email with fake user accounts…","topic_id":288363},{"id":722424,"name":"Falco","username":"Falco","avatar_template":"/user_avatar/meta.discourse.org/falco/{size}/179432_2.png","created_at":"2020-03-26T21:31:38.463Z","like_count":17,"blurb":"Continuing the discussion from https://meta.discourse.org/t/user-api-keys-specification/48536 User API keys specification : I created a small utility script in order to test User API keys locally. Fir...","post_number":1,"topic_title_headline":"Generate User API Keys for testing","topic_id":145744},{"id":266441,"name":"Andrew Waugh","username":"JagWaugh","avatar_template":"/user_avatar/meta.discourse.org/jagwaugh/{size}/69335_2.png","created_at":"2017-03-03T13:34:08.009Z","like_count":19,"blurb":"Regardless of if you're a moderator or an admin, you will no doubt at some time think about making some change to your live site and wonder if this will bring shame on you, and/or cause yourself an en...","post_number":1,"topic_title_headline":"Build a sandbox to test changes before making them live","topic_id":58298},{"id":582008,"name":"","username":"Wurzelseppi","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/w/eada6e/{size}.png","created_at":"2019-05-21T10:42:51.099Z","like_count":0,"blurb":"Hi guys, just wanted to migrate from 2.3.0beta9 to stable release and got this error: What can I do here ? Caused by: PG::UndefinedColumn: ERROR: column \"email_private_messages\" of relation \"user_opti...","post_number":1,"topic_title_headline":"Migrate from tests-passed to stable","topic_id":118296},{"id":1421414,"name":"Robert","username":"merefield","avatar_template":"/user_avatar/meta.discourse.org/merefield/{size}/176214_2.png","created_at":"2023-12-14T17:11:26.575Z","like_count":1,"blurb":"Restarting the server, restarting the container, console rebuilding doesn't help. Container is up as I can ./launcher enter app Got a bunch of these in logs, ideas on how to investigate redis failure?...","post_number":1,"topic_title_headline":"502 Bad Gateway after online rebuild of tests-passed Production just now","topic_id":288705},{"id":1204506,"name":"Coin-coin le Canapin","username":"Canapin","avatar_template":"/user_avatar/meta.discourse.org/canapin/{size}/119591_2.png","created_at":"2022-12-02T20:49:55.867Z","like_count":1,"blurb":"Hi! I want to add support of /shorts/ Youtube link. My modification of the YoutubeOnebox class works, but it is required that I add a test in https://github.com/discourse/discourse/blob/493d437e79f88a...","post_number":1,"topic_title_headline":"Trouble on adding a simple unit test for Youtube oneboxing","topic_id":247546},{"id":1339808,"name":"Robert","username":"merefield","avatar_template":"/user_avatar/meta.discourse.org/merefield/{size}/176214_2.png","created_at":"2023-08-07T10:05:22.444Z","like_count":2,"blurb":"I have a strange issue with QUnit. This test is extremely simple and should be straightforward … but … A plugin setting is changing from those I have set up. https://github.com/paviliondev/discourse-l...","post_number":1,"topic_title_headline":"Strange QUnit behaviour?: test failing because setting value doesn’t survive","topic_id":274165},{"id":1211823,"name":"Robert","username":"merefield","avatar_template":"/user_avatar/meta.discourse.org/merefield/{size}/176214_2.png","created_at":"2022-12-16T18:32:29.231Z","like_count":1,"blurb":"...presenting formatted location on User Card by merefield · Pull Request #73 · paviliondev/discourse-locations · GitHub I'm attempting to cover the change with a new Front End test. But the test fails t...","post_number":1,"topic_title_headline":"Is it possible to override the Site object with own fixture during Front End tests of a Plugin?","topic_id":249167},{"id":1408389,"name":"Pierre Romera","username":"pirhoo","avatar_template":"/user_avatar/meta.discourse.org/pirhoo/{size}/120058_2.png","created_at":"2023-11-22T18:46:46.469Z","like_count":5,"blurb":"...m setting up a new plugin based on the https://github.com/discourse/discourse-plugin-skeleton/tree/main/assets skeleton you provided which already helped me a lot. I am now writing tests, both for the...","post_number":1,"topic_title_headline":"Acceptance tests failing on Github Actions","topic_id":286355},{"id":443129,"name":"JK Baseer","username":"JKBaseer","avatar_template":"/user_avatar/meta.discourse.org/jkbaseer/{size}/80471_2.png","created_at":"2018-07-01T17:12:48.446Z","like_count":0,"blurb":"...but still could myself. Background: I installed discourse using digitalocean oneclick installer. The website is running under http://forum.example.org forum.example.org without any problem except the ...","post_number":1,"topic_title_headline":"There was a problem sending the test email","topic_id":91312},{"id":1412219,"name":"Robert","username":"merefield","avatar_template":"/user_avatar/meta.discourse.org/merefield/{size}/176214_2.png","created_at":"2023-11-29T23:18:11.815Z","like_count":1,"blurb":"I'm trying to create a foreign key relationship with the Topics table. The problem is it is failing in github workflow test environment during tests for the strangest reason, it is trying to access a ...","post_number":1,"topic_title_headline":"Strange migration error in tests during GH workflow","topic_id":287022},{"id":1160803,"name":"Bryan Joseph","username":"Bryan_Joseph","avatar_template":"/user_avatar/meta.discourse.org/bryan_joseph/{size}/273248_2.png","created_at":"2022-09-07T20:22:11.191Z","like_count":1,"blurb":"...SETTINGS ==================== DISCOURSE_HOSTNAME=url SMTP_ADDRESS=smtp.mailgun.org DEVELOPER_EMAILS=REDACTED SMTP_PASSWORD=REDACTED SMTP_PORT=2525 SMTP_USER_NAME=url LETSENCRYPT_ACCOUNT_EMAIL=REDACTED...","post_number":1,"topic_title_headline":"Smtp doctor test using port 465 even though its configured to use 2525","topic_id":238372},{"id":725228,"name":"james.network","username":"sunjam","avatar_template":"/user_avatar/meta.discourse.org/sunjam/{size}/175682_2.png","created_at":"2020-03-31T18:51:44.216Z","like_count":0,"blurb":"...Redis or updating it; it hasn't really been touched in the last 8+ months. I have not personally dealt with Redis before, but our Tests-Pass Discourse instance was setup using https://hub.docker.com/r...","post_number":1,"topic_title_headline":"Sidekiq not running. Sidekiq heartbeat test failed, restarting","topic_id":146326},{"id":1240758,"name":"Jay Pfaffman","username":"pfaffman","avatar_template":"/user_avatar/meta.discourse.org/pfaffman/{size}/120154_2.png","created_at":"2023-02-16T22:12:10.456Z","like_count":4,"blurb":"I see that the discourse-plugin-skeleton now has this: uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1 so we don't have to keep updating stuff. But I have a plugin that requires the ...","post_number":1,"topic_title_headline":"Tests for plugin that requires a plugin","topic_id":255406},{"id":1197679,"name":"","username":"SilK","avatar_template":"/user_avatar/meta.discourse.org/silk/{size}/268124_2.png","created_at":"2022-11-18T17:03:46.056Z","like_count":0,"blurb":"...a new dev environment for working on plugins. Discourse is up to date with the main branch. I need to restart Ember in order to test changes made to the front end. This includes changes to Handlebars,...","post_number":1,"topic_title_headline":"Need to restart Ember in order to test front-end changes","topic_id":246069},{"id":1103913,"name":"Banibrata Dutta","username":"bdutta","avatar_template":"/user_avatar/meta.discourse.org/bdutta/{size}/259973_2.png","created_at":"2022-05-15T18:02:33.290Z","like_count":0,"blurb":"...only in a captive host-only testbed, so wondering if there is any local network SMTP daemon / service that I could start to complete the testing ? I'm happy with 100% command line mail client and serv...","post_number":1,"topic_title_headline":"Bitnami Discourse VM on Virtualbox + SMTP mail-server for testing","topic_id":227090},{"id":722608,"name":"Lona Lee","username":"Lona_Lee","avatar_template":"/user_avatar/meta.discourse.org/lona_lee/{size}/169072_2.png","created_at":"2020-03-27T07:14:10.239Z","like_count":1,"blurb":"Hello. I'm trying to get email setup working on my discourse instance. Done set-up properly and looks fine(no errors), so sent test emails. (logs confirmed : \"Admin\" - \"Emails\" - \"Sent\") However, I ha...","post_number":1,"topic_title_headline":"Test emails sent but","topic_id":145781},{"id":679950,"name":"Oleg Bovykin","username":"arrowcircle","avatar_template":"/user_avatar/meta.discourse.org/arrowcircle/{size}/100035_2.png","created_at":"2020-01-01T11:20:33.618Z","like_count":1,"blurb":"Hi! I found strange error in my admin page, that sidekiq is not running. I opened logs and found hundreds errors like: /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.5.1/lib/logster/logger...","post_number":1,"topic_title_headline":"Sidekiq heartbeat test failed, restarting","topic_id":137496},{"id":1033333,"name":"М. М.","username":"М_М","avatar_template":"/user_avatar/meta.discourse.org/м_м/{size}/243710_2.png","created_at":"2021-12-20T13:52:10.488Z","like_count":0,"blurb":"...user, the logs say like this Job exception: could not get 3xx (421: 421 Domain sandbox410fe5c7bb85483c941c05b4ec5f3495.mailgun.org is not allowed to send: Sandbox subdomains are for test purposes only...","post_number":1,"topic_title_headline":"MailGun & Discourse: Sandbox subdomains are for test purposes only. Please add your own domain","topic_id":212684},{"id":498559,"name":"","username":"desrocchi","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/d/eb9ed0/{size}.png","created_at":"2018-11-14T15:20:59.607Z","like_count":0,"blurb":"Is there a way for me to see or test the admin options in the demo area? I am just a moderator on the platform we use but I would like to see which options could be of use without having to install th...","post_number":1,"topic_title_headline":"Test admin features without having to install Discourse","topic_id":102035},{"id":596557,"name":"Flaviu","username":"UnivacTwo","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/u/df705f/{size}.png","created_at":"2019-06-25T17:12:34.710Z","like_count":0,"blurb":"Let's encrypt has a limit of how many certificates can be generated in a week for the same domain. Unfortunately we reach this limit and we cannot generate a new certificate this week. We did a backup...","post_number":1,"topic_title_headline":"Install discourse with a staging (test) ssl certificate","topic_id":121299},{"id":583541,"name":"mark78","username":"Mark_Schmucker","avatar_template":"/user_avatar/meta.discourse.org/mark_schmucker/{size}/124810_2.png","created_at":"2019-05-24T00:14:35.895Z","like_count":0,"blurb":"Should I be able to run any Badge Query in https://meta.discourse.org/t/32566 Data Explorer ? I want to create a custom Badge Query using \"Appreciated\" as a starting point. I type the Appreciated quer...","post_number":1,"topic_title_headline":"Problem testing Badge Query from Data Explorer","topic_id":118568},{"id":569209,"name":"Penar Musaraj","username":"pmusaraj","avatar_template":"/user_avatar/meta.discourse.org/pmusaraj/{size}/119489_2.png","created_at":"2019-04-25T01:24:56.741Z","like_count":26,"blurb":"...device and installing the app via TestFlight: https://testflight.apple.com/join/NkdBQgmg testflight.apple.com https://testflight.apple.com/join/NkdBQgmg TestFlight - Apple Using TestFlight is a great ...","post_number":1,"topic_title_headline":"New iOS mobile app beta available for testing","topic_id":115912},{"id":1090520,"name":"Mac玩儿法","username":"waerfa","avatar_template":"/user_avatar/meta.discourse.org/waerfa/{size}/216044_2.png","created_at":"2022-04-17T21:46:04.755Z","like_count":0,"blurb":"...rebuild the container: git pull ./launcher rebuild app I got the fatal error which shows: FAILED -------------------- Pups::ExecError: cd /var/www/discourse & & git fetch --depth 1 origin tests-passed...","post_number":1,"topic_title_headline":"502 Bad Gateway after trying to rebuild test-passed branch","topic_id":224560},{"id":860593,"name":"james.network","username":"sunjam","avatar_template":"/user_avatar/meta.discourse.org/sunjam/{size}/175682_2.png","created_at":"2020-12-11T18:44:18.021Z","like_count":1,"blurb":"Continuing the discussion from https://meta.discourse.org/t/postgresql-13-update/172563/27 PostgreSQL 13 update : Run into trouble while updating 2.7.0beta1 Tests-Pass in order to remove some troubles...","post_number":1,"topic_title_headline":"Forum offline due to failed rebuilds on Tests-Pass","topic_id":173019},{"id":960683,"name":"","username":"daniyal","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/d/58f4c7/{size}.png","created_at":"2021-07-08T19:58:55.634Z","like_count":3,"blurb":"...which we want to experiment. An example would be to experiment different styles of topic list view. For this we are using Google Optimize A/B testing. Currently we plan to show theme without changes t...","post_number":1,"topic_title_headline":"[A/B Testing] Changing parent CSS class based on experiment variable","topic_id":196501},{"id":1389188,"name":"Angus McLeod","username":"angus","avatar_template":"/user_avatar/meta.discourse.org/angus/{size}/341715_2.png","created_at":"2023-10-20T03:44:49.737Z","like_count":7,"blurb":"I've been looking at the performance of the https://meta.discourse.org/t/activitypub-plugin/266794 ActivityPub plugin recently and considering the best ways to reliably test, and prove, performance fo...","post_number":1,"topic_title_headline":"Code-level performance testing","topic_id":282856},{"id":1329017,"name":"","username":"dodibi","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/d/9fc348/{size}.png","created_at":"2023-07-19T12:45:57.446Z","like_count":0,"blurb":"Hello everyone! I'm currently facing some challenges while configuring my local environment to run discourse tests in a docker container. My main objective is to run the core tests with plugins attach...","post_number":1,"topic_title_headline":"Running core tests in docker environment","topic_id":272112},{"id":421687,"name":"Jay Pfaffman","username":"pfaffman","avatar_template":"/user_avatar/meta.discourse.org/pfaffman/{size}/120154_2.png","created_at":"2018-05-11T22:03:23.232Z","like_count":0,"blurb":"Is there a way to initiate an email test from the Rails console? For a zillion reasons I would love to be able to send a test email without having to create an account. I've looked in config/routes.rb...","post_number":1,"topic_title_headline":"Email test from the console?","topic_id":87295},{"id":272436,"name":"David Taylor","username":"david","avatar_template":"/user_avatar/meta.discourse.org/david/{size}/157490_2.png","created_at":"2017-03-20T20:29:06.608Z","like_count":1,"blurb":"It is my understanding that running rake qunit:test should run all of the qunit tests in Discourse, including those for any installed plugins. However, when I run the task in the docker development en...","post_number":1,"topic_title_headline":"Plugin QUnit tests are not running as part of rake qunit:test","topic_id":59577},{"id":899205,"name":"","username":"JQ331","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/j/41988e/{size}.png","created_at":"2021-03-03T18:09:29.452Z","like_count":6,"blurb":"I came across this https://blog.codinghorror.com/low-fi-usability-testing/ excellent article on how to do low-fi usability testing by @codinghorror . Usability testing (and user testing in general) is...","post_number":1,"topic_title_headline":"How does the Discourse team do usability testing?","topic_id":181856},{"id":530438,"name":"","username":"kleinfreund","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/k/a6a055/{size}.png","created_at":"2019-02-01T09:52:27.150Z","like_count":1,"blurb":"One can write tests for the backend of a plugin. For example, I created the following file in my plugin directory: spec/lib/route_store_spec.rb : require 'rails_helper' describe MyPlugin::RouteStore d...","post_number":1,"topic_title_headline":"Advice on writing Ruby tests for plugins","topic_id":108110},{"id":260691,"name":"Rimian Perkins","username":"rimian","avatar_template":"/user_avatar/meta.discourse.org/rimian/{size}/120658_2.png","created_at":"2017-02-13T02:48:10.177Z","like_count":0,"blurb":"What's the best way to (QUnit) assert an element on the page has some content in it? This passes: ok($.trim($('.foo').text()) == 'bar', 'content bar renders on page'); But isn't very practical. Is the...","post_number":1,"topic_title_headline":"Acceptance test content is present on page","topic_id":57292},{"id":1432567,"name":"Ayke","username":"rrit","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/r/b5ac83/{size}.png","created_at":"2024-01-09T16:53:57.916Z","like_count":0,"blurb":"Right now Discourse on meta.discourse.org serves the mobile-view instead of the crawler-view to the https://search.google.com/test/rich-results Google Rich Results Test . As there is no Schema Markup ...","post_number":1,"topic_title_headline":"Google Search Console/Schema Markup test tool “Google Rich Results Test”: mobile-view instead of crawler-view","topic_id":291039},{"id":1305996,"name":"Larry Diehl","username":"larrytheliquid","avatar_template":"/user_avatar/meta.discourse.org/larrytheliquid/{size}/310576_2.png","created_at":"2023-06-08T22:35:51.914Z","like_count":1,"blurb":"Hi Discourse Community! :slight_smile: I've been working on tech ( https://colimit.io Colimit ) that helps people apply https://en.wikipedia.org/wiki/Model-based_testing Model-based testing to test th...","post_number":1,"topic_title_headline":"Experiments with Model-Based Testing","topic_id":267737},{"id":1135474,"name":"Robert","username":"merefield","avatar_template":"/user_avatar/meta.discourse.org/merefield/{size}/176214_2.png","created_at":"2022-07-20T08:48:28.868Z","like_count":0,"blurb":"...my case running: rake \"plugin:qunit[discourse-multilingual]\" with a branch installed. I'm declaring a function in my initializer (i'm extending I18n ) The tests sometimes (25%?) seem to run before the...","post_number":1,"topic_title_headline":"Qunit tests not deterministic in Plugin?","topic_id":233389},{"id":672801,"name":"Jay Pfaffman","username":"pfaffman","avatar_template":"/user_avatar/meta.discourse.org/pfaffman/{size}/120154_2.png","created_at":"2019-12-12T21:01:31.303Z","like_count":0,"blurb":"Thanks, @Mittineague ! After a while, that made sense. I even wrote a spec, but even before I added my spec (and when I reverted to before I added any code), specs fail because: An error occurred whil...","post_number":1,"topic_title_headline":"Issues migrating test database","topic_id":135876},{"id":871105,"name":"","username":"Alteras","avatar_template":"/user_avatar/meta.discourse.org/alteras/{size}/179824_2.png","created_at":"2021-01-07T19:56:05.071Z","like_count":4,"blurb":"Hello! I'm currently working on a Markdown Extension/plugin that adds quite a number of BBCode tags, and I am looking to write QUnit Acceptance tests for them (I got really tired of constantly checkin...","post_number":1,"topic_title_headline":"Acceptance Test for Markdown Extension?","topic_id":175413},{"id":747613,"name":"","username":"xrav3nz","avatar_template":"/user_avatar/meta.discourse.org/xrav3nz/{size}/76894_2.png","created_at":"2020-05-08T04:27:56.920Z","like_count":8,"blurb":"...development - #2 by taylorthurlow - A May Of WTFs - Ruby on Rails Discussions Not sure if we have explored this before, but Rails can automatically maintain test databse schema with ActiveRecord::Migr...","post_number":1,"topic_title_headline":"Auto migrate test database schema","topic_id":150786},{"id":583961,"name":"Kim Miller","username":"kimardenmiller","avatar_template":"/user_avatar/meta.discourse.org/kimardenmiller/{size}/119631_2.png","created_at":"2019-05-24T22:21:24.996Z","like_count":3,"blurb":"Adding some polls API endpoints for PR to discourse_api, which work fine. Now I'm trying to understand how to create tests before submitting the PR, e.g.: require 'spec_helper' describe DiscourseApi::...","post_number":1,"topic_title_headline":"Building Tests for New discourse_api Endpoints","topic_id":118639},{"id":621707,"name":"Andrew Lank","username":"alank","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/a/c89c15/{size}.png","created_at":"2019-08-17T02:13:06.679Z","like_count":1,"blurb":"In my development and testing I'm running a Discourse instance (Docker Discourse from Bitnami) and it fulfills most of my API testing for our API service which talks to Discourse, however I now need t...","post_number":1,"topic_title_headline":"Seed or API calls to create test users","topic_id":126025},{"id":334186,"name":"Chris","username":"ChrisBeach","avatar_template":"/user_avatar/meta.discourse.org/chrisbeach/{size}/214628_2.png","created_at":"2017-10-01T08:18:48.148Z","like_count":1,"blurb":"...from the core team. I propose that on hitting the upgrade button, a new docker image is built in the background, and within it, acceptance tests of all plugins are run before the switch-over happens f...","post_number":1,"topic_title_headline":"Smoke-testing plugins during upgrade process","topic_id":71118},{"id":288991,"name":"David Taylor","username":"david","avatar_template":"/user_avatar/meta.discourse.org/david/{size}/157490_2.png","created_at":"2017-05-16T10:28:58.496Z","like_count":1,"blurb":"I'm trying to use the docker image for tests both on my mac, and also https://meta.discourse.org/t/setting-up-plugin-continuous-integration-tests-on-travis-ci/59612 on travis . For a while now the qun...","post_number":1,"topic_title_headline":"QUnit tests won’t pass in discourse_dev docker image","topic_id":62797},{"id":187533,"name":"Sckott","username":"sckott","avatar_template":"/user_avatar/meta.discourse.org/sckott/{size}/115359_2.png","created_at":"2016-04-21T19:15:00.191Z","like_count":0,"blurb":"What's the best or fastest way to get Discourse installed on Travis for testing a client for the Discourse API ? It appears as though the discourse_api gem uses webmock so I think does not use a real ...","post_number":1,"topic_title_headline":"Testing a Discourse API client on Travis-CI","topic_id":42947},{"id":966756,"name":"Connor Parrish","username":"Connor_Parrish","avatar_template":"/user_avatar/meta.discourse.org/connor_parrish/{size}/225463_2.png","created_at":"2021-07-22T16:57:05.885Z","like_count":1,"blurb":"When you're conditionally adding a PostMenuButton using the plugin-api , the extra button is included in _extraButtons in between acceptance tests. When I run tests, if the tests where the button shou...","post_number":1,"topic_title_headline":"PostMenu’s ‘_extraButtons’ isn’t reset in between acceptance tests","topic_id":197887}],"topics":[{"id":49167,"title":"Write acceptance tests and component tests for Ember code in Discourse","fancy_title":"Write acceptance tests and component tests for Ember code in Discourse","slug":"write-acceptance-tests-and-component-tests-for-ember-code-in-discourse","posts_count":3,"reply_count":1,"highest_post_number":3,"created_at":"2016-08-24T20:48:02.492Z","last_posted_at":"2017-02-01T18:22:01.859Z","bumped":true,"bumped_at":"2017-02-01T18:22:01.859Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["tutorial","ember","testing"],"tags_descriptions":{},"category_id":56,"has_accepted_answer":false},{"id":32619,"title":"Developing Discourse Plugins - Part 6 - Add acceptance tests","fancy_title":"Developing Discourse Plugins - Part 6 - Add acceptance tests","slug":"developing-discourse-plugins-part-6-add-acceptance-tests","posts_count":33,"reply_count":26,"highest_post_number":38,"created_at":"2015-08-27T21:32:26.323Z","last_posted_at":"2022-06-02T11:06:38.274Z","bumped":true,"bumped_at":"2022-06-02T11:06:38.274Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["plugins","tutorial","plugin-guides","testing"],"tags_descriptions":{"plugins":""},"category_id":56,"has_accepted_answer":false},{"id":281579,"title":"End-to-end system testing for themes and theme components","fancy_title":"End-to-end system testing for themes and theme components","slug":"end-to-end-system-testing-for-themes-and-theme-components","posts_count":1,"reply_count":0,"highest_post_number":1,"created_at":"2023-10-24T23:13:37.118Z","last_posted_at":"2023-10-24T23:13:37.118Z","bumped":true,"bumped_at":"2023-11-13T23:20:01.596Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["how-to","themes"],"tags_descriptions":{"how-to":"How to guides contain steps to follow to solve a specific problem"},"category_id":56,"has_accepted_answer":false},{"id":66857,"title":"How to run Discourse core, plugin and theme QUnit test suites","fancy_title":"How to run Discourse core, plugin and theme QUnit test suites","slug":"how-to-run-discourse-core-plugin-and-theme-qunit-test-suites","posts_count":1,"reply_count":2,"highest_post_number":1,"created_at":"2017-07-26T14:09:58.032Z","last_posted_at":"2017-07-26T14:09:58.126Z","bumped":true,"bumped_at":"2023-09-04T17:56:33.079Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["how-to"],"tags_descriptions":{"how-to":"How to guides contain steps to follow to solve a specific problem"},"category_id":56,"has_accepted_answer":false},{"id":17155,"title":"Test Discourse in mobile screen emulator","fancy_title":"Test Discourse in mobile screen emulator","slug":"test-discourse-in-mobile-screen-emulator","posts_count":3,"reply_count":1,"highest_post_number":3,"created_at":"2014-07-03T11:45:09.360Z","last_posted_at":"2014-10-12T22:19:24.137Z","bumped":true,"bumped_at":"2014-10-12T22:19:24.137Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["how-to"],"tags_descriptions":{"how-to":"How to guides contain steps to follow to solve a specific problem"},"category_id":56,"has_accepted_answer":false},{"id":288363,"title":"Tip: when testing inbound email with fake user accounts...","fancy_title":"Tip: when testing inbound email with fake user accounts…","slug":"tip-when-testing-inbound-email-with-fake-user-accounts","posts_count":1,"reply_count":0,"highest_post_number":1,"created_at":"2023-12-12T10:51:07.868Z","last_posted_at":"2023-12-12T10:51:08.401Z","bumped":true,"bumped_at":"2023-12-12T10:51:08.401Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["email"],"tags_descriptions":{},"category_id":55,"has_accepted_answer":false},{"id":145744,"title":"Generate User API Keys for testing","fancy_title":"Generate User API Keys for testing","slug":"generate-user-api-keys-for-testing","posts_count":4,"reply_count":1,"highest_post_number":4,"created_at":"2020-03-26T21:31:38.269Z","last_posted_at":"2022-08-07T15:27:18.788Z","bumped":true,"bumped_at":"2022-08-07T15:27:18.788Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["how-to"],"tags_descriptions":{"how-to":"How to guides contain steps to follow to solve a specific problem"},"category_id":56,"has_accepted_answer":false},{"id":58298,"title":"Build a sandbox to test changes before making them live","fancy_title":"Build a sandbox to test changes before making them live","slug":"build-a-sandbox-to-test-changes-before-making-them-live","posts_count":21,"reply_count":13,"highest_post_number":21,"created_at":"2017-03-03T13:34:07.921Z","last_posted_at":"2022-02-16T23:18:54.680Z","bumped":true,"bumped_at":"2022-02-16T23:18:54.680Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["how-to"],"tags_descriptions":{"how-to":"How to guides contain steps to follow to solve a specific problem"},"category_id":55,"has_accepted_answer":false},{"id":118296,"title":"Migrate from tests-passed to stable","fancy_title":"Migrate from tests-passed to stable","slug":"migrate-from-tests-passed-to-stable","posts_count":12,"reply_count":7,"highest_post_number":12,"created_at":"2019-05-21T10:42:51.017Z","last_posted_at":"2019-06-21T15:55:53.072Z","bumped":true,"bumped_at":"2019-05-22T15:55:47.651Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":288705,"title":"502 Bad Gateway after online rebuild of tests-passed Production just now","fancy_title":"502 Bad Gateway after online rebuild of tests-passed Production just now","slug":"502-bad-gateway-after-online-rebuild-of-tests-passed-production-just-now","posts_count":6,"reply_count":1,"highest_post_number":6,"created_at":"2023-12-14T17:11:26.387Z","last_posted_at":"2024-01-13T17:37:27.535Z","bumped":true,"bumped_at":"2023-12-14T17:36:57.066Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":247546,"title":"Trouble on adding a simple unit test for Youtube oneboxing","fancy_title":"Trouble on adding a simple unit test for Youtube oneboxing","slug":"trouble-on-adding-a-simple-unit-test-for-youtube-oneboxing","posts_count":10,"reply_count":5,"highest_post_number":10,"created_at":"2022-12-02T20:49:55.713Z","last_posted_at":"2023-01-05T17:47:40.629Z","bumped":true,"bumped_at":"2022-12-06T17:47:28.771Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["onebox","testing"],"tags_descriptions":{},"category_id":7,"has_accepted_answer":true},{"id":274165,"title":"Strange QUnit behaviour?: test failing because setting value doesn't survive","fancy_title":"Strange QUnit behaviour?: test failing because setting value doesn’t survive","slug":"strange-qunit-behaviour-test-failing-because-setting-value-doesnt-survive","posts_count":5,"reply_count":2,"highest_post_number":5,"created_at":"2023-08-07T10:05:22.298Z","last_posted_at":"2023-09-06T11:19:24.509Z","bumped":true,"bumped_at":"2023-08-07T11:24:27.150Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":true},{"id":249167,"title":"Is it possible to override the Site object with own fixture during Front End tests of a Plugin?","fancy_title":"Is it possible to override the Site object with own fixture during Front End tests of a Plugin?","slug":"is-it-possible-to-override-the-site-object-with-own-fixture-during-front-end-tests-of-a-plugin","posts_count":4,"reply_count":0,"highest_post_number":4,"created_at":"2022-12-16T18:32:29.079Z","last_posted_at":"2022-12-28T21:57:56.070Z","bumped":true,"bumped_at":"2022-12-28T21:57:56.070Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":true},{"id":286355,"title":"Acceptance tests failing on Github Actions","fancy_title":"Acceptance tests failing on Github Actions","slug":"acceptance-tests-failing-on-github-actions","posts_count":6,"reply_count":0,"highest_post_number":6,"created_at":"2023-11-22T18:46:46.128Z","last_posted_at":"2023-11-24T13:59:40.100Z","bumped":true,"bumped_at":"2023-11-24T13:59:40.100Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":true},{"id":91312,"title":"There was a problem sending the test email","fancy_title":"There was a problem sending the test email","slug":"there-was-a-problem-sending-the-test-email","posts_count":8,"reply_count":5,"highest_post_number":8,"created_at":"2018-07-01T17:12:48.366Z","last_posted_at":"2018-08-01T09:28:21.935Z","bumped":true,"bumped_at":"2018-07-02T09:28:16.014Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":287022,"title":"Strange migration error in tests during GH workflow","fancy_title":"Strange migration error in tests during GH workflow","slug":"strange-migration-error-in-tests-during-gh-workflow","posts_count":6,"reply_count":3,"highest_post_number":6,"created_at":"2023-11-29T23:18:11.686Z","last_posted_at":"2023-12-31T15:09:05.633Z","bumped":true,"bumped_at":"2023-12-01T15:08:31.257Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":true},{"id":238372,"title":"Smtp doctor test using port 465 even though its configured to use 2525","fancy_title":"Smtp doctor test using port 465 even though its configured to use 2525","slug":"smtp-doctor-test-using-port-465-even-though-its-configured-to-use-2525","posts_count":12,"reply_count":7,"highest_post_number":12,"created_at":"2022-09-07T20:22:10.976Z","last_posted_at":"2022-10-09T00:21:55.656Z","bumped":true,"bumped_at":"2022-09-09T00:21:48.272Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":146326,"title":"Sidekiq not running. Sidekiq heartbeat test failed, restarting","fancy_title":"Sidekiq not running. Sidekiq heartbeat test failed, restarting","slug":"sidekiq-not-running-sidekiq-heartbeat-test-failed-restarting","posts_count":16,"reply_count":9,"highest_post_number":16,"created_at":"2020-03-31T18:51:44.061Z","last_posted_at":"2020-06-10T01:39:28.366Z","bumped":true,"bumped_at":"2020-05-11T01:39:26.054Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["unsupported-install"],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":255406,"title":"Tests for plugin that requires a plugin","fancy_title":"Tests for plugin that requires a plugin","slug":"tests-for-plugin-that-requires-a-plugin","posts_count":3,"reply_count":0,"highest_post_number":3,"created_at":"2023-02-16T22:12:10.344Z","last_posted_at":"2023-02-28T16:10:36.498Z","bumped":true,"bumped_at":"2023-02-28T20:21:06.122Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":true},{"id":246069,"title":"Need to restart Ember in order to test front-end changes","fancy_title":"Need to restart Ember in order to test front-end changes","slug":"need-to-restart-ember-in-order-to-test-front-end-changes","posts_count":5,"reply_count":1,"highest_post_number":5,"created_at":"2022-11-18T17:03:45.900Z","last_posted_at":"2022-11-18T18:17:53.648Z","bumped":true,"bumped_at":"2022-11-18T18:17:53.648Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":true},{"id":227090,"title":"Bitnami Discourse VM on Virtualbox + SMTP mail-server for testing","fancy_title":"Bitnami Discourse VM on Virtualbox + SMTP mail-server for testing","slug":"bitnami-discourse-vm-on-virtualbox-smtp-mail-server-for-testing","posts_count":3,"reply_count":0,"highest_post_number":3,"created_at":"2022-05-15T18:02:33.136Z","last_posted_at":"2022-05-16T09:10:43.794Z","bumped":true,"bumped_at":"2022-05-16T09:10:43.794Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["unsupported-install"],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":145781,"title":"Test emails sent but","fancy_title":"Test emails sent but","slug":"test-emails-sent-but","posts_count":5,"reply_count":2,"highest_post_number":5,"created_at":"2020-03-27T07:14:10.116Z","last_posted_at":"2020-04-29T02:52:31.927Z","bumped":true,"bumped_at":"2020-03-30T02:52:29.062Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":137496,"title":"Sidekiq heartbeat test failed, restarting","fancy_title":"Sidekiq heartbeat test failed, restarting","slug":"sidekiq-heartbeat-test-failed-restarting","posts_count":13,"reply_count":8,"highest_post_number":13,"created_at":"2020-01-01T11:20:33.492Z","last_posted_at":"2020-02-11T23:09:42.375Z","bumped":true,"bumped_at":"2020-01-12T23:09:39.730Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":212684,"title":"MailGun & Discourse: Sandbox subdomains are for test purposes only. Please add your own domain","fancy_title":"MailGun & Discourse: Sandbox subdomains are for test purposes only. Please add your own domain","slug":"mailgun-discourse-sandbox-subdomains-are-for-test-purposes-only-please-add-your-own-domain","posts_count":4,"reply_count":2,"highest_post_number":5,"created_at":"2021-12-20T13:52:10.405Z","last_posted_at":"2022-01-19T15:27:11.368Z","bumped":true,"bumped_at":"2021-12-20T15:26:24.911Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":102035,"title":"Test admin features without having to install Discourse","fancy_title":"Test admin features without having to install Discourse","slug":"test-admin-features-without-having-to-install-discourse","posts_count":6,"reply_count":2,"highest_post_number":6,"created_at":"2018-11-14T15:20:59.484Z","last_posted_at":"2021-09-09T07:35:18.270Z","bumped":true,"bumped_at":"2021-09-09T07:35:18.270Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":121299,"title":"Install discourse with a staging (test) ssl certificate","fancy_title":"Install discourse with a staging (test) ssl certificate","slug":"install-discourse-with-a-staging-test-ssl-certificate","posts_count":5,"reply_count":1,"highest_post_number":5,"created_at":"2019-06-25T17:12:34.552Z","last_posted_at":"2023-04-01T03:25:32.925Z","bumped":true,"bumped_at":"2019-09-04T15:15:31.153Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":true},{"id":118568,"title":"Problem testing Badge Query from Data Explorer","fancy_title":"Problem testing Badge Query from Data Explorer","slug":"problem-testing-badge-query-from-data-explorer","posts_count":5,"reply_count":1,"highest_post_number":6,"created_at":"2019-05-24T00:14:35.814Z","last_posted_at":"2019-05-24T00:46:42.560Z","bumped":true,"bumped_at":"2019-05-24T00:46:42.560Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["sql-triggered-badge"],"tags_descriptions":{"sql-triggered-badge":"SQL queries for custom triggered badges"},"category_id":148,"has_accepted_answer":true},{"id":115912,"title":"New iOS mobile app beta available for testing","fancy_title":"New iOS mobile app beta available for testing","slug":"new-ios-mobile-app-beta-available-for-testing","posts_count":49,"reply_count":31,"highest_post_number":49,"created_at":"2019-04-25T01:24:56.608Z","last_posted_at":"2019-05-31T17:31:02.516Z","bumped":true,"bumped_at":"2020-01-21T17:07:37.817Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":224560,"title":"502 Bad Gateway after trying to rebuild test-passed branch","fancy_title":"502 Bad Gateway after trying to rebuild test-passed branch","slug":"502-bad-gateway-after-trying-to-rebuild-test-passed-branch","posts_count":6,"reply_count":1,"highest_post_number":6,"created_at":"2022-04-17T21:46:04.598Z","last_posted_at":"2022-04-17T22:15:37.255Z","bumped":true,"bumped_at":"2022-04-17T22:15:37.255Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":false},{"id":173019,"title":"Forum offline due to failed rebuilds on Tests-Pass","fancy_title":"Forum offline due to failed rebuilds on Tests-Pass","slug":"forum-offline-due-to-failed-rebuilds-on-tests-pass","posts_count":2,"reply_count":0,"highest_post_number":2,"created_at":"2020-12-11T18:44:17.952Z","last_posted_at":"2020-12-11T19:12:11.141Z","bumped":true,"bumped_at":"2020-12-11T19:12:11.141Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":31,"has_accepted_answer":false},{"id":196501,"title":"[A/B Testing] Changing parent CSS class based on experiment variable","fancy_title":"[A/B Testing] Changing parent CSS class based on experiment variable","slug":"a-b-testing-changing-parent-css-class-based-on-experiment-variable","posts_count":3,"reply_count":1,"highest_post_number":3,"created_at":"2021-07-08T19:58:55.503Z","last_posted_at":"2021-07-15T18:19:21.092Z","bumped":true,"bumped_at":"2021-07-15T18:19:21.092Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":282856,"title":"Code-level performance testing","fancy_title":"Code-level performance testing","slug":"code-level-performance-testing","posts_count":2,"reply_count":0,"highest_post_number":2,"created_at":"2023-10-20T03:44:49.568Z","last_posted_at":"2023-10-23T23:29:59.741Z","bumped":true,"bumped_at":"2023-10-23T23:29:59.741Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":272112,"title":"Running core tests in docker environment","fancy_title":"Running core tests in docker environment","slug":"running-core-tests-in-docker-environment","posts_count":1,"reply_count":0,"highest_post_number":1,"created_at":"2023-07-19T12:45:57.266Z","last_posted_at":"2023-07-19T12:45:57.446Z","bumped":true,"bumped_at":"2023-07-19T12:45:57.446Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["docker","spec","testing"],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":87295,"title":"Email test from the console?","fancy_title":"Email test from the console?","slug":"email-test-from-the-console","posts_count":4,"reply_count":1,"highest_post_number":4,"created_at":"2018-05-11T22:03:23.101Z","last_posted_at":"2018-05-12T00:55:41.843Z","bumped":true,"bumped_at":"2018-05-12T00:55:41.843Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":59577,"title":"Plugin QUnit tests are not running as part of rake qunit:test","fancy_title":"Plugin QUnit tests are not running as part of rake qunit:test","slug":"plugin-qunit-tests-are-not-running-as-part-of-rake-qunit-test","posts_count":8,"reply_count":5,"highest_post_number":8,"created_at":"2017-03-20T20:29:06.536Z","last_posted_at":"2017-07-17T18:26:45.188Z","bumped":true,"bumped_at":"2017-07-17T18:26:45.188Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":181856,"title":"How does the Discourse team do usability testing?","fancy_title":"How does the Discourse team do usability testing?","slug":"how-does-the-discourse-team-do-usability-testing","posts_count":5,"reply_count":2,"highest_post_number":6,"created_at":"2021-03-03T18:09:29.357Z","last_posted_at":"2021-03-04T15:23:46.571Z","bumped":true,"bumped_at":"2021-03-04T15:23:46.571Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":3,"has_accepted_answer":false},{"id":108110,"title":"Advice on writing Ruby tests for plugins","fancy_title":"Advice on writing Ruby tests for plugins","slug":"advice-on-writing-ruby-tests-for-plugins","posts_count":15,"reply_count":13,"highest_post_number":15,"created_at":"2019-02-01T09:52:27.051Z","last_posted_at":"2019-05-03T03:54:47.163Z","bumped":true,"bumped_at":"2019-05-03T03:54:47.163Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":57292,"title":"Acceptance test content is present on page","fancy_title":"Acceptance test content is present on page","slug":"acceptance-test-content-is-present-on-page","posts_count":7,"reply_count":3,"highest_post_number":7,"created_at":"2017-02-13T02:48:10.108Z","last_posted_at":"2017-02-14T05:55:31.520Z","bumped":true,"bumped_at":"2017-02-14T05:55:31.520Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":291039,"title":"Google Search Console/Schema Markup test tool \"Google Rich Results Test\": mobile-view instead of crawler-view","fancy_title":"Google Search Console/Schema Markup test tool “Google Rich Results Test”: mobile-view instead of crawler-view","slug":"google-search-console-schema-markup-test-tool-google-rich-results-test-mobile-view-instead-of-crawler-view","posts_count":3,"reply_count":1,"highest_post_number":3,"created_at":"2024-01-09T16:53:57.797Z","last_posted_at":"2024-01-09T17:17:09.039Z","bumped":true,"bumped_at":"2024-01-09T17:17:09.039Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":1,"has_accepted_answer":false},{"id":267737,"title":"Experiments with Model-Based Testing","fancy_title":"Experiments with Model-Based Testing","slug":"experiments-with-model-based-testing","posts_count":1,"reply_count":0,"highest_post_number":1,"created_at":"2023-06-08T22:35:51.784Z","last_posted_at":"2023-06-08T22:35:51.914Z","bumped":true,"bumped_at":"2023-06-08T22:35:51.914Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":233389,"title":"Qunit tests not deterministic in Plugin?","fancy_title":"Qunit tests not deterministic in Plugin?","slug":"qunit-tests-not-deterministic-in-plugin","posts_count":2,"reply_count":0,"highest_post_number":2,"created_at":"2022-07-20T08:48:28.757Z","last_posted_at":"2022-07-20T11:03:42.522Z","bumped":true,"bumped_at":"2022-07-20T11:03:42.522Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":135876,"title":"Issues migrating test database","fancy_title":"Issues migrating test database","slug":"issues-migrating-test-database","posts_count":9,"reply_count":1,"highest_post_number":9,"created_at":"2019-12-12T21:01:31.303Z","last_posted_at":"2021-03-02T16:44:20.120Z","bumped":true,"bumped_at":"2021-03-02T16:44:20.120Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":175413,"title":"Acceptance Test for Markdown Extension?","fancy_title":"Acceptance Test for Markdown Extension?","slug":"acceptance-test-for-markdown-extension","posts_count":3,"reply_count":0,"highest_post_number":4,"created_at":"2021-01-07T19:56:04.931Z","last_posted_at":"2021-01-10T11:26:16.888Z","bumped":true,"bumped_at":"2021-01-10T16:30:56.164Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":150786,"title":"Auto migrate test database schema","fancy_title":"Auto migrate test database schema","slug":"auto-migrate-test-database-schema","posts_count":2,"reply_count":0,"highest_post_number":2,"created_at":"2020-05-08T04:27:56.739Z","last_posted_at":"2020-05-08T13:15:45.247Z","bumped":true,"bumped_at":"2020-05-08T13:15:45.247Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":118639,"title":"Building Tests for New discourse_api Endpoints","fancy_title":"Building Tests for New discourse_api Endpoints","slug":"building-tests-for-new-discourse-api-endpoints","posts_count":20,"reply_count":9,"highest_post_number":21,"created_at":"2019-05-24T22:21:24.896Z","last_posted_at":"2019-10-02T21:13:35.140Z","bumped":true,"bumped_at":"2019-10-02T21:36:26.639Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":126025,"title":"Seed or API calls to create test users","fancy_title":"Seed or API calls to create test users","slug":"seed-or-api-calls-to-create-test-users","posts_count":7,"reply_count":5,"highest_post_number":7,"created_at":"2019-08-17T02:13:06.578Z","last_posted_at":"2019-08-19T11:50:36.137Z","bumped":true,"bumped_at":"2019-08-19T11:50:36.137Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":71118,"title":"Smoke-testing plugins during upgrade process","fancy_title":"Smoke-testing plugins during upgrade process","slug":"smoke-testing-plugins-during-upgrade-process","posts_count":22,"reply_count":17,"highest_post_number":22,"created_at":"2017-10-01T08:18:48.067Z","last_posted_at":"2017-10-02T23:44:59.852Z","bumped":true,"bumped_at":"2017-10-02T23:44:59.852Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["pr-welcome"],"tags_descriptions":{"pr-welcome":"You're welcome to submit a Github pull request that implements this"},"category_id":2,"has_accepted_answer":false},{"id":62797,"title":"QUnit tests won't pass in discourse_dev docker image","fancy_title":"QUnit tests won’t pass in discourse_dev docker image","slug":"qunit-tests-wont-pass-in-discourse-dev-docker-image","posts_count":20,"reply_count":11,"highest_post_number":21,"created_at":"2017-05-16T10:28:58.397Z","last_posted_at":"2017-07-25T15:50:27.716Z","bumped":true,"bumped_at":"2017-07-25T15:50:27.716Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":42947,"title":"Testing a Discourse API client on Travis-CI","fancy_title":"Testing a Discourse API client on Travis-CI","slug":"testing-a-discourse-api-client-on-travis-ci","posts_count":5,"reply_count":3,"highest_post_number":5,"created_at":"2016-04-21T19:15:00.130Z","last_posted_at":"2016-04-22T03:03:47.976Z","bumped":true,"bumped_at":"2016-04-22T03:03:47.976Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false},{"id":197887,"title":"PostMenu's '_extraButtons' isn't reset in between acceptance tests","fancy_title":"PostMenu’s ‘_extraButtons’ isn’t reset in between acceptance tests","slug":"postmenus-extrabuttons-isnt-reset-in-between-acceptance-tests","posts_count":2,"reply_count":0,"highest_post_number":4,"created_at":"2021-07-22T16:57:05.803Z","last_posted_at":"2021-08-04T09:11:29.538Z","bumped":true,"bumped_at":"2021-08-04T09:11:29.538Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":[],"tags_descriptions":{},"category_id":7,"has_accepted_answer":false}],"users":[],"categories":[],"tags":[],"groups":[],"grouped_search_result":{"more_posts":null,"more_users":null,"more_categories":null,"term":"testing","search_log_id":2089836,"more_full_page_results":true,"can_create_topic":false,"error":null,"post_ids":[218354,138484,1381521,311252,59431,1419473,722424,266441,582008,1421414,1204506,1339808,1211823,1408389,443129,1412219,1160803,725228,1240758,1197679,1103913,722608,679950,1033333,498559,596557,583541,569209,1090520,860593,960683,1389188,1329017,421687,272436,899205,530438,260691,1432567,1305996,1135474,672801,871105,747613,583961,621707,334186,288991,187533,966756],"user_ids":[],"category_ids":[],"tag_ids":[],"group_ids":[]}} \ No newline at end of file diff --git a/spec/fixtures/search_meta/site.json b/spec/fixtures/search_meta/site.json new file mode 100644 index 00000000..9651e0ce --- /dev/null +++ b/spec/fixtures/search_meta/site.json @@ -0,0 +1 @@ +{"default_archetype":"regular","notification_types":{"mentioned":1,"replied":2,"quoted":3,"edited":4,"liked":5,"private_message":6,"invited_to_private_message":7,"invitee_accepted":8,"posted":9,"moved_post":10,"linked":11,"granted_badge":12,"invited_to_topic":13,"custom":14,"group_mentioned":15,"group_message_summary":16,"watching_first_post":17,"topic_reminder":18,"liked_consolidated":19,"post_approved":20,"code_review_commit_approved":21,"membership_request_accepted":22,"membership_request_consolidated":23,"bookmark_reminder":24,"reaction":25,"votes_released":26,"event_reminder":27,"event_invitation":28,"chat_mention":29,"chat_message":30,"chat_invitation":31,"chat_group_mention":32,"chat_quoted":33,"assigned":34,"question_answer_user_commented":35,"watching_category_or_tag":36,"new_features":37,"admin_problems":38,"following":800,"following_created_topic":801,"following_replied":802,"circles_activity":900},"post_types":{"regular":1,"moderator_action":2,"small_action":3,"whisper":4},"user_tips":{"first_notification":1,"topic_timeline":2,"post_menu":3,"topic_notification_levels":4,"suggested_topics":5,"admin_guide":6},"trust_levels":{"newuser":0,"basic":1,"member":2,"regular":3,"leader":4},"groups":[{"id":183,"name":"ai-personas","flair_url":null,"flair_bg_color":"","flair_color":""},{"id":160,"name":"community-moderators","flair_url":null,"flair_bg_color":"","flair_color":""},{"id":184,"name":"glimmer-search-menu","flair_url":null,"flair_bg_color":"","flair_color":""},{"id":157,"name":"new-new-testers","flair_url":null,"flair_bg_color":"","flair_color":""},{"id":48,"name":"plugin_authors","flair_url":"fa-plug","flair_bg_color":"dddddd","flair_color":"111111"},{"id":148,"name":"support-advocates","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/4/e4038d4d9848de2eabab38e17b8bdb69da154024.svg","flair_bg_color":"FFFFFF","flair_color":""},{"id":151,"name":"support-enthusiasts","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/1/3/13f5d8d7e56be8a6a1ea3de009b985a548aec8d4.svg","flair_bg_color":"FFFFFF","flair_color":""},{"id":142,"name":"support-experts","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/2/e250ec403580530d19e6a9ed42d0d525a51a9dbe.svg","flair_bg_color":"FFFFFF","flair_color":""},{"id":118,"name":"support-explorers","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/4X/d/1/b/d1ba0acf09b9d01f87f9e05bbee1dc5b0e316d5f.png","flair_bg_color":"dddddd","flair_color":"111111"},{"id":47,"name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_bg_color":"","flair_color":"111"},{"id":73,"name":"theme_authors","flair_url":"fa-paint-brush","flair_bg_color":"ddd","flair_color":"111"},{"id":84,"name":"theme_creator","flair_url":"fa-palette","flair_bg_color":"ddd","flair_color":"111"},{"id":50,"name":"translators","flair_url":"fa-globe","flair_bg_color":"ddd","flair_color":"111"}],"filters":["latest","unread","new","unseen","top","read","posted","bookmarks","hot"],"periods":["all","yearly","quarterly","monthly","weekly","daily"],"top_menu_items":["latest","unread","new","unseen","top","read","posted","bookmarks","hot","categories"],"anonymous_top_menu_items":["latest","top","categories","hot","categories","top"],"uncategorized_category_id":17,"user_field_max_length":2048,"post_action_types":[{"id":2,"name_key":"like","name":"Like","description":"Like this post","short_description":"Like this post","is_flag":false,"is_custom_flag":false},{"id":3,"name_key":"off_topic","name":"Off-Topic","description":"This post is not relevant to the current discussion as defined by the title and first post, and should probably be moved elsewhere.","short_description":"Not relevant to the discussion","is_flag":true,"is_custom_flag":false},{"id":4,"name_key":"inappropriate","name":"Inappropriate","description":"This post contains content that a reasonable person would consider offensive, abusive, to be hateful conduct or a violation of \u003ca href=\"/guidelines\"\u003eour community guidelines\u003c/a\u003e.","short_description":"A violation of \u003ca href=\"/guidelines\"\u003eour community guidelines\u003c/a\u003e","is_flag":true,"is_custom_flag":false},{"id":8,"name_key":"spam","name":"Spam","description":"This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.","short_description":"This is an advertisement or vandalism","is_flag":true,"is_custom_flag":false},{"id":6,"name_key":"notify_user","name":"Send @%{username} a message","description":"I want to talk to this person directly and personally about their post.","short_description":"I want to talk to this person directly and personally about their post.","is_flag":true,"is_custom_flag":true},{"id":10,"name_key":"illegal","name":"Illegal","description":"This post requires staff attention because I believe it contains content that is illegal.","short_description":"This is illegal","is_flag":true,"is_custom_flag":true},{"id":null,"name_key":null,"name":"Translation missing: en.post_action_types..title","description":"Translation missing: en.post_action_types.description","short_description":"Translation missing: en.post_action_types.short_description","is_flag":false,"is_custom_flag":false},{"id":7,"name_key":"notify_moderators","name":"Something Else","description":"This post requires staff attention for another reason not listed above.","short_description":"Requires staff attention for another reason","is_flag":true,"is_custom_flag":true}],"topic_flag_types":[{"id":4,"name_key":"inappropriate","name":"Inappropriate","description":"This topic contains content that a reasonable person would consider offensive, abusive, to be hateful conduct or a violation of \u003ca href=\"/guidelines\"\u003eour community guidelines\u003c/a\u003e.","short_description":"A violation of \u003ca href=\"/guidelines\"\u003eour community guidelines\u003c/a\u003e","is_flag":true,"is_custom_flag":false},{"id":8,"name_key":"spam","name":"Spam","description":"This topic is an advertisement. It is not useful or relevant to this site, but promotional in nature.","short_description":"This is an advertisement","is_flag":true,"is_custom_flag":false},{"id":10,"name_key":"illegal","name":"Illegal","description":"This topic requires staff attention because I believe it contains content that is illegal.","short_description":"This is illegal","is_flag":true,"is_custom_flag":true},{"id":null,"name_key":null,"name":"Translation missing: en.topic_flag_types..title","description":"Translation missing: en.topic_flag_types.description","short_description":"Translation missing: en.topic_flag_types.short_description","is_flag":false,"is_custom_flag":false},{"id":7,"name_key":"notify_moderators","name":"Something Else","description":"This topic requires general staff attention based on the \u003ca href=\"/guidelines\"\u003eguidelines\u003c/a\u003e, \u003ca href=\"/tos\"\u003eTOS\u003c/a\u003e, or for another reason not listed above.","short_description":"Requires staff attention for another reason","is_flag":true,"is_custom_flag":true}],"can_create_tag":false,"can_tag_topics":false,"can_tag_pms":false,"tags_filter_regexp":"[/\\?#\\[\\]@!\\$\u0026'\\(\\)\\*\\+,;=\\.%\\\\`^\\s|\\{\\}\"\u003c\u003e]+","top_tags":["how-to","chat","rest-api","sql-query","unsupported-install","email","pr-welcome","completed","ai","activity-summary","official","solved","sidebar","release-notes","server-resources","calendar-and-event","badges","topic-voting","docker","tags","advertising","invites","search","sql-triggered-badge","subscriptions","new-feature","chat-integration","wordpress","groups","themes","css"],"navigation_menu_site_top_tags":[{"name":"how-to","description":"How to guides contain steps to follow to solve a specific problem","pm_only":false},{"name":"chat","description":null,"pm_only":false},{"name":"rest-api","description":"Topics about making an external request to Discourse","pm_only":false},{"name":"sql-query","description":"SQL queries for the data-explorer","pm_only":false},{"name":"unsupported-install","description":null,"pm_only":false}],"topic_featured_link_allowed_category_ids":[149,120,122,157,121,153,127,9,136,138,61,83,96,56,132,123,144,104,10,27,137,25,124,22,134,24,110,105,143,119,145,135,129,7,30,89,131,150,6,155,31,20,133,55,102,148,147,95,152,151,128,154,21,139,108,69,3,14,125,63,2,126,115,106,1,118,117,17,53,13,5,65,8,67,35],"user_themes":[{"theme_id":272,"name":"Accessible contrast (dark)","default":false,"color_scheme_id":85},{"theme_id":271,"name":"Accessible contrast (light)","default":false,"color_scheme_id":84},{"theme_id":242,"name":"Air Theme","default":false,"color_scheme_id":82},{"theme_id":337,"name":"Central","default":false,"color_scheme_id":100},{"theme_id":335,"name":"CentralStaffOnly","default":false,"color_scheme_id":96},{"theme_id":31,"name":"Dark","default":false,"color_scheme_id":86},{"theme_id":140,"name":"Default","default":false,"color_scheme_id":34},{"theme_id":281,"name":"Default (full-width)","default":false,"color_scheme_id":34},{"theme_id":51,"name":"Discourse-classic","default":false,"color_scheme_id":34},{"theme_id":296,"name":"Fully","default":false,"color_scheme_id":null},{"theme_id":131,"name":"Ghost","default":false,"color_scheme_id":66},{"theme_id":80,"name":"Graceful","default":false,"color_scheme_id":54},{"theme_id":83,"name":"Grey Amber","default":false,"color_scheme_id":57},{"theme_id":232,"name":"Hidden Whispers","default":false,"color_scheme_id":null},{"theme_id":34,"name":"Material Design","default":false,"color_scheme_id":37},{"theme_id":331,"name":"Meta Branded","default":true,"color_scheme_id":34},{"theme_id":125,"name":"Minima Dark","default":false,"color_scheme_id":43},{"theme_id":299,"name":"redditish","default":false,"color_scheme_id":null},{"theme_id":30,"name":"Sam's Simple Theme","default":false,"color_scheme_id":null}],"user_color_schemes":[{"id":93,"name":"Central Dark","is_dark":true},{"id":95,"name":"Central Dark","is_dark":true},{"id":100,"name":"Central Light","is_dark":false},{"id":96,"name":"Central Light","is_dark":false},{"id":86,"name":"Dark","is_dark":true},{"id":34,"name":"Default Light","is_dark":false},{"id":87,"name":"Solarized Light","is_dark":false},{"id":85,"name":"WCAG Dark","is_dark":true},{"id":84,"name":"WCAG Light","is_dark":false}],"default_dark_color_scheme":null,"censored_regexp":[{"(?:\\P{L}|^)(EICARTESTCENSOR)(?=\\P{L}|$)":{"case_sensitive":false}}],"custom_emoji_translation":{},"watched_words_replace":{"(?:\\P{L}|^)(¯_\\(ツ\\)_/¯)(?=\\P{L}|$)":{"word":"¯_(ツ)_/¯","replacement":"¯\\_(ツ)_/¯","case_sensitive":false}},"watched_words_link":{"(?:\\P{L}|^)(Data Explorer)(?=\\P{L}|$)":{"word":"Data Explorer","replacement":"https://meta.discourse.org/t/32566?silent=true","case_sensitive":false},"(?:\\P{L}|^)(discourseconnect)(?=\\P{L}|$)":{"word":"discourseconnect","replacement":"https://meta.discourse.org/t/13045?silent=true","case_sensitive":false},"(?:\\P{L}|^)(discourse connect)(?=\\P{L}|$)":{"word":"discourse connect","replacement":"https://meta.discourse.org/t/13045?silent=true","case_sensitive":false},"(?:\\P{L}|^)(discourse sso)(?=\\P{L}|$)":{"word":"discourse sso","replacement":"https://meta.discourse.org/t/13045?silent=true","case_sensitive":false},"(?:\\P{L}|^)(official install)(?=\\P{L}|$)":{"word":"official install","replacement":"https://meta.discourse.org/t/142537?silent=true","case_sensitive":false},"(?:\\P{L}|^)(standard install)(?=\\P{L}|$)":{"word":"standard install","replacement":"https://meta.discourse.org/t/142537?silent=true","case_sensitive":false},"(?:\\P{L}|^)(safe mode)(?=\\P{L}|$)":{"word":"safe mode","replacement":"https://meta.discourse.org/t/53504?silent=true","case_sensitive":false}},"categories":[{"id":67,"name":"announcements","color":"ED207B","text_color":"FFFFFF","slug":"announcements","topic_count":312,"post_count":3973,"position":0,"description":"The place for all Discourse announcements.","description_text":"The place for all Discourse announcements.","description_excerpt":"The place for all Discourse announcements.","topic_url":"/t/about-the-announcements-category/68629","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":true,"sort_order":null,"sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":true,"custom_fields":{"has_chat_enabled":null,"activity_pub_ready":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_enabled":true,"activity_pub_username":"announcements","activity_pub_name":"Announcements","activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":["new-feature","security"],"allowed_tag_groups":[],"allow_global_tags":true,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":true,"activity_pub_ready":true,"activity_pub_actor":{"id":2,"handle":"announcements@meta.discourse.org","name":"Announcements"},"activity_pub_username":"announcements","activity_pub_name":"Announcements","activity_pub_default_visibility":"public","activity_pub_publication_type":"first_post","activity_pub_post_object_type":"Note","uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":13,"name":"blog","color":"8080ff","text_color":"FFFFFF","slug":"blog","topic_count":170,"post_count":1477,"position":1,"description":"Discussion topics generated from the official Discourse Blog. These topics are linked from the bottom of each blog entry where the blog comments would normally be.","description_text":"Discussion topics generated from the official Discourse Blog. These topics are linked from the bottom of each blog entry where the blog comments would normally be.","description_excerpt":"Discussion topics generated from the official Discourse Blog. These topics are linked from the bottom of each blog entry where the blog comments would normally be.","topic_url":"/t/about-the-blog-category/5250","read_restricted":false,"permission":null,"parent_category_id":67,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"created","sort_ascending":false,"show_subcategory_list":true,"num_featured_topics":3,"default_view":"","subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"activity_pub_default_visibility":null,"activity_pub_publication_type":null,"activity_pub_post_object_type":null,"enable_unassigned_filter":null,"enable_accepted_answers":null},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":10,"name":"documentation","color":"00A94F","text_color":"FFFFFF","slug":"documentation","topic_count":2,"post_count":2,"position":2,"description":"Documentation for how to use Discourse, install and configure sites, and troubleshoot common issues. Includes topics for tutorials, how-tos, general reference and troubleshooting. Topics need to be created in one of the subcategories, and may only be created by trust level 2 and up.","description_text":"Documentation for how to use Discourse, install and configure sites, and troubleshoot common issues. Includes topics for tutorials, how-tos, general reference and troubleshooting. Topics need to be created in one of the subcategories, and may only be created by trust level 2 and up.","description_excerpt":"Documentation for how to use Discourse, install and configure sites, and troubleshoot common issues. Includes topics for tutorials, how-tos, general reference and troubleshooting. Topics need to be created in one of the subcategories, and may only be created by trust level 2 and up.","topic_url":"/t/about-the-documentation-category/2629","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":true,"sort_order":"","sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":"top","subcategory_list_style":"boxes","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":true,"custom_fields":{"has_chat_enabled":null,"activity_pub_ready":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Article","activity_pub_publication_type":"full_topic","activity_pub_username":"documentation","activity_pub_enabled":true,"activity_pub_name":"Documentation"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":true,"activity_pub_ready":true,"activity_pub_actor":{"id":31769,"handle":"documentation@meta.discourse.org","name":"Documentation"},"activity_pub_username":"documentation","activity_pub_name":"Documentation","activity_pub_default_visibility":"public","activity_pub_publication_type":"full_topic","activity_pub_post_object_type":"Article","uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":53,"name":"admins","color":"F15D22","text_color":"FFFFFF","slug":"admins","topic_count":222,"post_count":1703,"position":3,"description":"Guides for Discourse admins and community managers with admin access.","description_text":"Guides for Discourse admins and community managers with admin access.","description_excerpt":"Guides for Discourse admins and community managers with admin access.","topic_url":"/t/about-the-admins-category/56207","read_restricted":false,"permission":null,"parent_category_id":10,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":true,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":["hosted-support","migrations"],"allowed_tag_groups":[],"allow_global_tags":true,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":125,"name":"moderators","color":"40d0e2","text_color":"FFFFFF","slug":"moderators","topic_count":16,"post_count":71,"position":4,"description":"Documentation for moderators and community managers using Discourse.","description_text":"Documentation for moderators and community managers using Discourse.","description_excerpt":"Documentation for moderators and community managers using Discourse.","topic_url":"/t/about-the-moderators-category/238588","read_restricted":false,"permission":null,"parent_category_id":10,"notification_level":1,"topic_template":null,"has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":126,"name":"users","color":"0088CC","text_color":"FFFFFF","slug":"users","topic_count":53,"post_count":184,"position":5,"description":"Documentation for all members of communities running Discourse.","description_text":"Documentation for all members of communities running Discourse.","description_excerpt":"Documentation for all members of communities running Discourse.","topic_url":"/t/about-the-users-category/238917","read_restricted":false,"permission":null,"parent_category_id":10,"notification_level":1,"topic_template":null,"has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":55,"name":"sysadmin","color":"E9DD00","text_color":"FFFFFF","slug":"sysadmin","topic_count":175,"post_count":2803,"position":6,"description":"Documentation for self-hosters and Discourse system administrators.","description_text":"Documentation for self-hosters and Discourse system administrators.","description_excerpt":"Documentation for self-hosters and Discourse system administrators.","topic_url":"/t/about-the-sysadmin-category/56209","read_restricted":false,"permission":null,"parent_category_id":10,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":true,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"activity_pub_default_visibility":null,"activity_pub_publication_type":null,"activity_pub_post_object_type":null,"enable_unassigned_filter":null,"enable_accepted_answers":null},"allowed_tags":["migrations"],"allowed_tag_groups":[],"allow_global_tags":true,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":127,"name":"theme developers","color":"92278F","text_color":"FFFFFF","slug":"theme-developers","topic_count":41,"post_count":215,"position":7,"description":"Documentation for developing themes and components that can be installed by admins.","description_text":"Documentation for developing themes and components that can be installed by admins.","description_excerpt":"Documentation for developing themes and components that can be installed by admins.","topic_url":"/t/about-the-theme-developers-category/239285","read_restricted":false,"permission":null,"parent_category_id":10,"notification_level":1,"topic_template":null,"has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"activity_pub_default_visibility":null,"activity_pub_publication_type":null,"activity_pub_post_object_type":null,"enable_unassigned_filter":null,"enable_accepted_answers":null},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":56,"name":"developers","color":"00A94F","text_color":"FFFFFF","slug":"devs","topic_count":96,"post_count":1185,"position":8,"description":"Documentation for developing features, plugins, or integrations with Discourse.","description_text":"Documentation for developing features, plugins, or integrations with Discourse.","description_excerpt":"Documentation for developing features, plugins, or integrations with Discourse.","topic_url":"/t/about-the-developers-category/56210","read_restricted":false,"permission":null,"parent_category_id":10,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":true,"custom_fields":{"has_chat_enabled":null,"activity_pub_ready":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Article","activity_pub_enabled":true,"activity_pub_username":"developer-docs","activity_pub_name":"Developer Documentation","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":true,"activity_pub_ready":true,"activity_pub_actor":{"id":35545,"handle":"developer-docs@meta.discourse.org","name":"Developer Documentation"},"activity_pub_username":"developer-docs","activity_pub_name":"Developer Documentation","activity_pub_default_visibility":"public","activity_pub_publication_type":"first_post","activity_pub_post_object_type":"Article","uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":6,"name":"support","color":"CEA9A9","text_color":"FFFFFF","slug":"support","topic_count":15841,"post_count":103687,"position":9,"description":"The category for general support questions on using your Discourse site.","description_text":"The category for general support questions on using your Discourse site.","description_excerpt":"The category for general support questions on using your Discourse site.","topic_url":"/t/about-the-support-category/389","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"\u003e Before asking, did you search first? Press 🔍 at the upper right to search.","has_children":true,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_accepted_answers":"true","enable_unassigned_filter":"false","activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":21,"name":"wordpress","color":"F9CFCF","text_color":"FFFFFF","slug":"wordpress","topic_count":732,"post_count":5110,"position":10,"description":"Support for the official Discourse WordPress plugin at \u003ca href=\"https://github.com/discourse/wp-discourse\" class=\"inline-onebox\"\u003eGitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog\u003c/a\u003e","description_text":"Support for the official Discourse WordPress plugin at GitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog","description_excerpt":"Support for the official Discourse WordPress plugin at \u003ca href=\"https://github.com/discourse/wp-discourse\" class=\"inline-onebox\"\u003eGitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog\u003c/a\u003e","topic_url":"/t/about-the-wordpress-category/12282","read_restricted":false,"permission":null,"parent_category_id":6,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":"true","activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":1,"name":"bug","color":"e9dd00","text_color":"000000","slug":"bug","topic_count":5153,"post_count":35973,"position":11,"description":"A bug report means \u003cstrong\u003esomething is broken, preventing normal/typical use of Discourse\u003c/strong\u003e. Do be sure to search prior to submitting bugs. \u003ca href=\"https://meta.discourse.org/t/how-to-write-a-good-bug-report/183671/\"\u003eInclude repro steps\u003c/a\u003e, and only describe one bug per topic please.","description_text":"A bug report means something is broken, preventing normal/typical use of Discourse. Do be sure to search prior to submitting bugs. Include repro steps, and only describe one bug per topic please.","description_excerpt":"A bug report means something is broken, preventing normal/typical use of Discourse. Do be sure to search prior to submitting bugs. \u003ca href=\"https://meta.discourse.org/t/how-to-write-a-good-bug-report/183671/\"\u003eInclude repro steps\u003c/a\u003e, and only describe one bug per topic please.","topic_url":"/t/about-the-bug-category/2","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_accepted_answers":null,"enable_unassigned_filter":"true","activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":true,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":9,"name":"ux","color":"5F497A","text_color":"FFFFFF","slug":"ux","topic_count":2700,"post_count":18225,"position":12,"description":"Discussion about the user interface of Discourse and how features are presented (including language and UI elements).","description_text":"Discussion about the user interface of Discourse and how features are presented (including language and UI elements).","description_excerpt":"Discussion about the user interface of Discourse and how features are presented (including language and UI elements).","topic_url":"/t/about-the-ux-category/2628","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":"","subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":2,"name":"feature","color":"0E76BD","text_color":"FFFFFF","slug":"feature","topic_count":6997,"post_count":58067,"position":13,"description":"Discussion about existing Discourse features, how they can be improved or enhanced, and how proposed new features could work.","description_text":"Discussion about existing Discourse features, how they can be improved or enhanced, and how proposed new features could work.","description_excerpt":"Discussion about existing Discourse features, how they can be improved or enhanced, and how proposed new features could work.","topic_url":"/t/about-the-feature-category/11","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_ready":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_username":"feature","activity_pub_name":"Feature Requests","activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post","activity_pub_enabled":true},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":true,"activity_pub_ready":true,"activity_pub_actor":{"id":1,"handle":"feature@meta.discourse.org","name":"Feature Requests"},"activity_pub_username":"feature","activity_pub_name":"Feature Requests","activity_pub_default_visibility":"public","activity_pub_publication_type":"first_post","activity_pub_post_object_type":"Note","uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":148,"name":"data \u0026 reporting","color":"D24899","text_color":"FFFFFF","slug":"data-reporting","topic_count":631,"post_count":3056,"position":14,"description":"This is the category for everything related to Discourse data and reporting. Here, you can discuss dashboard reports, custom badge queries, data-explorer queries and any other analytic add-ons.","description_text":"This is the category for everything related to Discourse data and reporting. Here, you can discuss dashboard reports, custom badge queries, data-explorer queries and any other analytic add-ons.","description_excerpt":"This is the category for everything related to Discourse data and reporting. Here, you can discuss dashboard reports, custom badge queries, data-explorer queries and any other analytic add-ons.","topic_url":"/t/about-the-data-reporting-category/274664","read_restricted":false,"permission":null,"notification_level":1,"topic_template":null,"has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","enable_accepted_answers":"true","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":24,"name":"sso","color":"d47711","text_color":"FFFFFF","slug":"sso","topic_count":493,"post_count":2546,"position":15,"description":"For queries specifically about SSO (single sign-on) and login using third-party providers (Google, Facebook, GitHub etc). See the \u003ca href=\"https://meta.discourse.org/t/discourseconnect-official-single-sign-on-for-discourse-sso/13045\"\u003eofficial documentation on DiscourseConnect SSO\u003c/a\u003e.","description_text":"For queries specifically about SSO (single sign-on) and login using third-party providers (Google, Facebook, GitHub etc). See the official documentation on DiscourseConnect SSO.","description_excerpt":"For queries specifically about SSO (single sign-on) and login using third-party providers (Google, Facebook, GitHub etc). See the \u003ca href=\"https://meta.discourse.org/t/discourseconnect-official-single-sign-on-for-discourse-sso/13045\"\u003eofficial documentation on DiscourseConnect SSO\u003c/a\u003e.","topic_url":"/t/about-the-sso-category/13110","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":"true","activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":65,"name":"community","color":"12A89D","text_color":"FFFFFF","slug":"community","topic_count":866,"post_count":8844,"position":16,"description":"A great platform doesn’t guarantee success. Community building is a science. This category is for discussions about launching, building, growing and managing a thriving community.","description_text":"A great platform doesn’t guarantee success. Community building is a science. This category is for discussions about launching, building, growing and managing a thriving community.","description_excerpt":"A great platform doesn’t guarantee success. Community building is a science. This category is for discussions about launching, building, growing and managing a thriving community.","topic_url":"/t/about-the-community-category/67750","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":7,"name":"dev","color":"292929","text_color":"fff","slug":"dev","topic_count":3467,"post_count":20210,"position":17,"description":"The category for all things Discourse Development. Building a customization for yourself or the community? Then this is the category for you!","description_text":"The category for all things Discourse Development. Building a customization for yourself or the community? Then this is the category for you!","description_excerpt":"The category for all things Discourse Development. Building a customization for yourself or the community? Then this is the category for you!","topic_url":"/t/about-the-dev-category/1026","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":true,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"boxes","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":"true","activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":27,"name":"translations","color":"808281","text_color":"FFFFFF","slug":"translations","topic_count":297,"post_count":1832,"position":18,"description":"This category is for discussion about localizing Discourse.","description_text":"This category is for discussion about localizing Discourse.","description_excerpt":"This category is for discussion about localizing Discourse.","topic_url":"/t/about-the-translations-category/14549","read_restricted":false,"permission":null,"parent_category_id":7,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"activity_pub_default_visibility":null,"activity_pub_publication_type":null,"activity_pub_post_object_type":null,"enable_unassigned_filter":null,"enable_accepted_answers":null},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":14,"name":"marketplace","color":"8C6238","text_color":"FFFFFF","slug":"marketplace","topic_count":1162,"post_count":5865,"position":19,"description":"This is your hub for all Discourse-related commerce: jobs, gigs, plugins, themes, hosting, and more.","description_text":"This is your hub for all Discourse-related commerce: jobs, gigs, plugins, themes, hosting, and more.","description_excerpt":"This is your hub for all Discourse-related commerce: jobs, gigs, plugins, themes, hosting, and more.","topic_url":"/t/about-the-marketplace-category/5425","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"What would you like done?\n\nWhen do you need it done?\n\nWhat is your budget, in $ USD that you can offer for this task?\n\n\u003c!-- We encourage caution and due diligence when engaging with potential contractors or clients. Verify their credentials, check previous work, and ensure a transparent and legitimate transaction. Always remember, your safety and security in the marketplace is your responsibility. --\u003e","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":"","subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":["delivered"],"allowed_tag_groups":[],"allow_global_tags":true,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":22,"name":"plugin","color":"F7941D","text_color":"FFFFFF","slug":"plugin","topic_count":315,"post_count":10429,"position":20,"description":"A directory of Discourse plugins, both official and third-party.","description_text":"A directory of Discourse plugins, both official and third-party.","description_excerpt":"A directory of Discourse plugins, both official and third-party.","topic_url":"/t/about-the-plugin-category/12648","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"| | | |\n| - | - | - |\n| :information_source: | **Summary** | In a few words, what does this plugin do? |\n| :hammer_and_wrench: | **Repository Link** | \u003c\u003e |\n| :open_book: | **Install Guide** | [How to install plugins in Discourse](https://meta.discourse.org/t/install-plugins-in-discourse/19157) |\n\n\u003cbr\u003e \n\n### Features\n \nDescribe the major features of the plugin\n \n### Configuration\n \nInclude detailed steps on how to configure the plugin (include screenshots where necessary)\n \n### CHANGELOG\n- Add new bullets when major features are committed here\n \n### TODO\n- Add any #pr-welcome TODO tasks here","has_children":true,"sort_order":"","sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"boxes","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":["Resource Status"],"allow_global_tags":true,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":5,"name":"extras","color":"25AAE2","text_color":"FFFFFF","slug":"extras","topic_count":90,"post_count":985,"position":21,"description":"A directory of all extensions \u0026amp; integrations for Discourse which are \u003cem\u003enot\u003c/em\u003e Discourse plugins, i.e. a CMS plugin, a browser extension or a native application.","description_text":"A directory of all extensions \u0026amp; integrations for Discourse which are not Discourse plugins, i.e. a CMS plugin, a browser extension or a native application.","description_excerpt":"A directory of all extensions \u0026amp; integrations for Discourse which are not Discourse plugins, i.e. a CMS plugin, a browser extension or a native application.","topic_url":"/t/about-the-extras-category/28","read_restricted":false,"permission":null,"parent_category_id":22,"notification_level":1,"topic_template":"","has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":["Resource Status"],"allow_global_tags":true,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":61,"name":"theme","color":"E43D30","text_color":"FFFFFF","slug":"theme","topic_count":66,"post_count":2138,"position":22,"description":"Themes are expansive customizations that change multiple elements of the style of your forum design, and often also include additional front-end features.","description_text":"Themes are expansive customizations that change multiple elements of the style of your forum design, and often also include additional front-end features.","description_excerpt":"Themes are expansive customizations that change multiple elements of the style of your forum design, and often also include additional front-end features.","topic_url":"/t/about-the-theme-category/60925","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"||||\n|-|-|-|\n| :information_source: | **Summary** | ADD SHORT SUMMARY \n| :eyeglasses:|**Preview**| PREVIEW_LINK |\n| :hammer_and_wrench:|**Repository**| REPOSITORY_LINK |\n| :question:|**Install Guide**|[How to install a theme or theme component](https://meta.discourse.org/t/how-do-i-install-a-theme-or-theme-component/63682)|\n| :open_book:|**New to Discourse Themes?**| [Beginner’s guide to using Discourse Themes](https://meta.discourse.org/t/beginners-guide-to-using-discourse-themes/91966)\n\n\u003c!-- Describe this theme in one or two sentences --\u003e\n\nShort description...\n\n\u003c!-- Add screenshots (if applicable) --\u003e\n\nScreenshots...\n\n\u003c!-- Add more details and explain the settings (if applicable) --\u003e\n\nDetailed description...\n","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"none","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":["color-palette"],"allowed_tag_groups":["Resource Status"],"allow_global_tags":true,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":120,"name":"theme-component","color":"1dedf8","text_color":"FFFFFF","slug":"theme-component","topic_count":300,"post_count":7516,"position":23,"description":"Theme components are customizations that change surface elements of your forum design, or add extra front-end features.","description_text":"Theme components are customizations that change surface elements of your forum design, or add extra front-end features.","description_excerpt":"Theme components are customizations that change surface elements of your forum design, or add extra front-end features.","topic_url":"/t/about-the-theme-component-category/232731","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"| | | |\n| - | - | - |\n| :information_source: | **Summary** | ADD SHORT SUMMARY |\n| :eyeglasses: |**Preview**| PREVIEW_LINK |\n| :hammer_and_wrench: | **Repository**| REPOSITORY_LINK |\n| :question: | **Install Guide** | [How to install a theme or theme component](https://meta.discourse.org/t/how-do-i-install-a-theme-or-theme-component/63682) |\n| :open_book: | **New to Discourse Themes?** | [Beginner’s guide to using Discourse Themes](https://meta.discourse.org/t/beginners-guide-to-using-discourse-themes/91966) |\n\n\u003c!-- Fill in \"repoName\" and \"repoURL\" for the automatic install button --\u003e\n\n[wrap=theme-install-button repoName=\"Component's name\" repoUrl=\"GitHub repository link\"]\nInstall this theme component\n[/wrap]\n\n\u003c!-- Describe this theme/component in one or two sentences --\u003e\n\nShort description...\n\n\u003c!-- Add screenshots (if applicable) --\u003e\n\nScreenshots...\n\n\u003c!-- Add more details and explain the settings (if applicable) --\u003e\n\nDetailed description...","has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"none","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":["Resource Status"],"allow_global_tags":true,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":31,"name":"installation","color":"997E7E","text_color":"FFFFFF","slug":"installation","topic_count":3426,"post_count":29611,"position":24,"description":"Getting Discourse up and running, keeping it going, upgrading, and any other general sysadmin maintenance.","description_text":"Getting Discourse up and running, keeping it going, upgrading, and any other general sysadmin maintenance.","description_excerpt":"Getting Discourse up and running, keeping it going, upgrading, and any other general sysadmin maintenance.","topic_url":"/t/about-the-installation-category/21019","read_restricted":false,"permission":null,"notification_level":1,"topic_template":null,"has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":"true","activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":106,"name":"migration","color":"652D90","text_color":"FFFFFF","slug":"migration","topic_count":215,"post_count":1558,"position":25,"description":"You want to migrate your community to Discourse? Awesome! This is the category where you can ask questions, get help, and document your Discourse migration journey.","description_text":"You want to migrate your community to Discourse? Awesome! This is the category where you can ask questions, get help, and document your Discourse migration journey.","description_excerpt":"You want to migrate your community to Discourse? Awesome! This is the category where you can ask questions, get help, and document your Discourse migration journey.","topic_url":"/t/about-the-migration-category/196969","read_restricted":false,"permission":null,"notification_level":1,"topic_template":null,"has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":"true","activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":["Migration"],"allow_global_tags":true,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":8,"name":"hosting","color":"00AEEF","text_color":"FFFFFF","slug":"hosting","topic_count":501,"post_count":4117,"position":26,"description":"Topics about hosting Discourse, either on your own servers, in the cloud, or with specific hosting services.","description_text":"Topics about hosting Discourse, either on your own servers, in the cloud, or with specific hosting services.","description_excerpt":"Topics about hosting Discourse, either on your own servers, in the cloud, or with specific hosting services.","topic_url":"/t/about-the-hosting-category/2626","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":"","subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post","enable_accepted_answers":"true"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":30,"name":"releases","color":"BF1E2E","text_color":"FFFFFF","slug":"releases","topic_count":23,"post_count":104,"position":27,"description":"Outlining each official release of Discourse, and plans for future releases.","description_text":"Outlining each official release of Discourse, and plans for future releases.","description_excerpt":"Outlining each official release of Discourse, and plans for future releases.","topic_url":"/t/about-the-releases-category/20857","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"created","sort_ascending":false,"show_subcategory_list":true,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"activity_pub_default_visibility":null,"activity_pub_publication_type":null,"activity_pub_post_object_type":null,"enable_unassigned_filter":null,"enable_accepted_answers":null},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":3,"name":"site feedback","color":"888","text_color":"FFFFFF","slug":"site-feedback","topic_count":417,"post_count":3220,"position":28,"description":"Discussion about \u003ca href=\"http://meta.discourse.org\"\u003emeta.discourse.org\u003c/a\u003e itself - the organization of this forum, how it works, and how we can improve this site.","description_text":"Discussion about meta.discourse.org itself - the organization of this forum, how it works, and how we can improve this site.","description_excerpt":"Discussion about \u003ca href=\"http://meta.discourse.org\"\u003emeta.discourse.org\u003c/a\u003e itself - the organization of this forum, how it works, and how we can improve this site.","topic_url":"/t/about-the-site-feedback-category/24","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":true,"sort_order":"","sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":"","subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"activity_pub_default_visibility":null,"activity_pub_publication_type":null,"activity_pub_post_object_type":null,"enable_unassigned_filter":null,"enable_accepted_answers":null},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":152,"name":"theme feedback","color":"ED207B","text_color":"FFFFFF","slug":"theme-feedback","topic_count":11,"post_count":44,"position":29,"description":"This is the category to gather all the UX reports for \u003ca href=\"https://meta.discourse.org/t/we-have-a-new-default-theme-here-on-meta/284692\"\u003eour new theme on meta\u003c/a\u003e. It also uses the new Form Templates feature that I’ve been wanting to try out.","description_text":"This is the category to gather all the UX reports for our new theme on meta. It also uses the new Form Templates feature that I’ve been wanting to try out.","description_excerpt":"This is the category to gather all the UX reports for \u003ca href=\"https://meta.discourse.org/t/we-have-a-new-default-theme-here-on-meta/284692\"\u003eour new theme on meta\u003c/a\u003e. It also uses the new Form Templates feature that I’ve been wanting to try out.","topic_url":"/t/about-the-theme-feedback-category/284904","read_restricted":false,"permission":null,"parent_category_id":3,"notification_level":1,"topic_template":null,"has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[1],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":157,"name":"forum summaries","color":"72e9a7","text_color":"FFFFFF","slug":"forum-summaries","topic_count":4,"post_count":36,"position":30,"description":"Stay up-to-date with the pulse of our community through AI-crafted summaries. This category harnesses the power of artificial intelligence to collate and condense forum activities, providing you with comprehensive yet succinct overviews. From emerging discussions to trending topics, our AI summaries deliver the essence of the Discourse community’s heartbeat, right at your fingertips.","description_text":"Stay up-to-date with the pulse of our community through AI-crafted summaries. This category harnesses the power of artificial intelligence to collate and condense forum activities, providing you with comprehensive yet succinct overviews. From emerging discussions to trending topics, our AI summaries deliver the essence of the Discourse community’s heartbeat, right at your fingertips.","description_excerpt":"Stay up-to-date with the pulse of our community through AI-crafted summaries. This category harnesses the power of artificial intelligence to collate and condense forum activities, providing you with comprehensive yet succinct overviews. From emerging discussions to trending topics, our AI summarie\u0026hellip;","topic_url":"/t/about-the-forum-summaries-category/291765","read_restricted":false,"permission":null,"parent_category_id":3,"notification_level":0,"topic_template":null,"has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":35,"name":"praise","color":"9EB83B","text_color":"FFFFFF","slug":"praise","topic_count":294,"post_count":1091,"position":31,"description":"Have something nice to say about Discourse?","description_text":"Have something nice to say about Discourse?","description_excerpt":"Have something nice to say about Discourse?","topic_url":"/t/about-the-praise-category/30010","read_restricted":false,"permission":null,"notification_level":1,"topic_template":null,"has_children":true,"sort_order":null,"sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"activity_pub_default_visibility":null,"activity_pub_publication_type":null,"activity_pub_post_object_type":null,"enable_unassigned_filter":null,"enable_accepted_answers":null},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":63,"name":"comparison","color":"F1592A","text_color":"FFFFFF","slug":"comparison","topic_count":11,"post_count":137,"position":32,"description":"Topics comparing Discourse to other platforms.","description_text":"Topics comparing Discourse to other platforms.","description_excerpt":"Topics comparing Discourse to other platforms.","topic_url":"/t/about-the-comparison-category/65736","read_restricted":false,"permission":null,"parent_category_id":35,"notification_level":1,"topic_template":"### About PLATFORM_NAME\n\nA blurb about the platform being compared to Discourse. \n\nhttp://link.to.website\n\n ### Previous discussions:\n\nlinks to previous discussions related\n\n### Importer status\n\nIs there an official Discourse importer? Where is it? ","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"latest","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"activity_pub_default_visibility":null,"activity_pub_publication_type":null,"activity_pub_post_object_type":null,"enable_unassigned_filter":null,"enable_accepted_answers":null},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":105,"name":"community support program","color":"92278F","text_color":"FFFFFF","slug":"support-program","topic_count":4,"post_count":27,"position":33,"description":"Get recognition for your work in helping and supporting Discourse communities by joining our Community Support Program.","description_text":"Get recognition for your work in helping and supporting Discourse communities by joining our Community Support Program.","description_excerpt":"Get recognition for your work in helping and supporting Discourse communities by joining our Community Support Program.","topic_url":"/t/about-the-community-support-program-category/193906","read_restricted":false,"permission":null,"notification_level":1,"topic_template":"","has_children":false,"sort_order":"","sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":"","subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":true,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":"","form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":124,"name":"General","color":"25AAE2","text_color":"FFFFFF","slug":"general","topic_count":155,"post_count":1408,"position":35,"description":"Create topics here that don’t fit into any other existing category.","description_text":"Create topics here that don’t fit into any other existing category.","description_excerpt":"Create topics here that don’t fit into any other existing category.","topic_url":"/t/about-the-general-category/237517","read_restricted":false,"permission":null,"notification_level":1,"topic_template":null,"has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":false,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows_with_featured_topics","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"enable_unassigned_filter":null,"enable_accepted_answers":null,"activity_pub_default_visibility":"public","activity_pub_post_object_type":"Note","activity_pub_publication_type":"first_post"},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false},{"id":17,"name":"Uncategorized","color":"AB9364","text_color":"FFFFFF","slug":"uncategorized","topic_count":0,"post_count":0,"position":77,"description":"Topics that don't need a category, or don't fit into any other existing category.","description_text":"Topics that don't need a category, or don't fit into any other existing category.","description_excerpt":"Topics that don't need a category, or don't fit into any other existing category.","topic_url":"/t/","read_restricted":false,"permission":null,"notification_level":1,"topic_template":null,"has_children":false,"sort_order":null,"sort_ascending":null,"show_subcategory_list":true,"num_featured_topics":3,"default_view":null,"subcategory_list_style":"rows","default_top_period":"all","default_list_filter":"all","minimum_required_tags":0,"navigate_to_first_post_after_read":false,"custom_fields":{"has_chat_enabled":null,"activity_pub_enabled":null,"activity_pub_ready":null,"activity_pub_username":null,"activity_pub_name":null,"activity_pub_default_visibility":null,"activity_pub_publication_type":null,"activity_pub_post_object_type":null,"enable_unassigned_filter":null,"enable_accepted_answers":null},"allowed_tags":[],"allowed_tag_groups":[],"allow_global_tags":false,"read_only_banner":null,"form_template_ids":[],"activity_pub_enabled":false,"uploaded_logo":null,"uploaded_logo_dark":null,"uploaded_background":null,"uploaded_background_dark":null,"required_tag_groups":[],"can_edit":false}],"markdown_additional_options":{"chat":{"limited_pretty_text_features":["anchor","bbcode-block","bbcode-inline","code","category-hashtag","censored","chat-transcript","discourse-local-dates","emoji","emojiShortcuts","inlineEmoji","html-img","hashtag-autocomplete","mentions","unicodeUsernames","onebox","quotes","spoiler-alert","table","text-post-process","upload-protocol","watched-words"],"limited_pretty_text_markdown_rules":["autolink","list","backticks","newline","code","fence","image","table","linkify","link","strikethrough","blockquote","emphasis","replacements"],"hashtag_configurations":{"topic-composer":["category","tag","channel"],"chat-composer":["channel","category","tag"]}}},"hashtag_configurations":{"topic-composer":["category","tag","channel"],"chat-composer":["channel","category","tag"]},"hashtag_icons":{"category":"folder","tag":"tag","channel":"comment"},"displayed_about_plugin_stat_groups":["chat_messages"],"anonymous_default_navigation_menu_tags":[{"name":"official","description":"This is a theme or plugin built by the Discourse team","pm_only":false},{"name":"release-notes","description":"Release notes for Discourse beta and stable branches. See https://meta.discourse.org/t/198215 for more details on the Discourse release process.","pm_only":false}],"anonymous_sidebar_sections":[{"id":56,"title":"Community","links":[{"id":274,"name":"Topics","value":"/latest","icon":"layer-group","external":false,"full_reload":false,"segment":"primary"},{"id":275,"name":"My Posts","value":"/my/activity","icon":"user","external":false,"full_reload":true,"segment":"primary"},{"id":276,"name":"Review","value":"/review","icon":"flag","external":false,"full_reload":false,"segment":"primary"},{"id":277,"name":"Admin","value":"/admin","icon":"wrench","external":false,"full_reload":false,"segment":"primary"},{"id":279,"name":"Users","value":"/u","icon":"users","external":false,"full_reload":false,"segment":"secondary"},{"id":280,"name":"About","value":"/about","icon":"info-circle","external":false,"full_reload":false,"segment":"secondary"},{"id":281,"name":"FAQ","value":"/faq","icon":"question-circle","external":false,"full_reload":false,"segment":"secondary"},{"id":282,"name":"Groups","value":"/g","icon":"user-friends","external":false,"full_reload":false,"segment":"secondary"},{"id":283,"name":"Badges","value":"/badges","icon":"certificate","external":false,"full_reload":false,"segment":"secondary"},{"id":287,"name":"Leaderboard","value":"/leaderboard/7","icon":"trophy","external":false,"full_reload":false,"segment":"secondary"},{"id":290,"name":"Global Leaderboard","value":"/leaderboard","icon":"trophy","external":false,"full_reload":false,"segment":"secondary"},{"id":291,"name":"Topic Filter","value":"/filter","icon":"filter","external":false,"full_reload":false,"segment":"secondary"}],"slug":"community","public":true,"section_type":"community"}],"tos_url":"/tos","privacy_policy_url":"https://www.discourse.org/privacy","activity_pub_enabled":true,"activity_pub_publishing_enabled":true,"activity_pub_host":"meta.discourse.org","docs_path":"docs","default_gamification_leaderboard_id":1,"hosting_tier":"enterprise","archetypes":[{"id":"regular","name":"Regular Topic","options":[]},{"id":"banner","name":"Banner Topic","options":[]}],"user_fields":[{"id":2,"name":"Pronouns","description":"Gender Pronouns (he/him, she/her, they/them, etc.)","field_type":"text","editable":true,"required":false,"show_on_profile":true,"show_on_user_card":true,"searchable":false,"position":1}],"auth_providers":[{"name":"facebook","custom_url":null,"pretty_name_override":null,"title_override":null,"frame_width":580,"frame_height":400,"can_connect":true,"can_revoke":true,"icon":"fab-facebook"},{"name":"google_oauth2","custom_url":null,"pretty_name_override":null,"title_override":null,"frame_width":850,"frame_height":500,"can_connect":true,"can_revoke":true,"icon":null},{"name":"github","custom_url":null,"pretty_name_override":null,"title_override":null,"frame_width":null,"frame_height":null,"can_connect":true,"can_revoke":true,"icon":"fab-github"},{"name":"twitter","custom_url":null,"pretty_name_override":null,"title_override":null,"frame_width":null,"frame_height":null,"can_connect":true,"can_revoke":true,"icon":"fab-twitter"},{"name":"discord","custom_url":null,"pretty_name_override":null,"title_override":null,"frame_width":null,"frame_height":null,"can_connect":true,"can_revoke":true,"icon":"fab-discord"},{"name":"apple","custom_url":null,"pretty_name_override":null,"title_override":null,"frame_width":null,"frame_height":null,"can_connect":true,"can_revoke":true,"icon":"fab-apple"}]} \ No newline at end of file diff --git a/spec/lib/modules/ai_bot/personas/persona_spec.rb b/spec/lib/modules/ai_bot/personas/persona_spec.rb index dd19a8d4..2a30ead0 100644 --- a/spec/lib/modules/ai_bot/personas/persona_spec.rb +++ b/spec/lib/modules/ai_bot/personas/persona_spec.rb @@ -144,6 +144,7 @@ RSpec.describe DiscourseAi::AiBot::Personas::Persona do DiscourseAi::AiBot::Personas::General, DiscourseAi::AiBot::Personas::Artist, DiscourseAi::AiBot::Personas::Creative, + DiscourseAi::AiBot::Personas::DiscourseHelper, DiscourseAi::AiBot::Personas::Researcher, DiscourseAi::AiBot::Personas::SettingsExplorer, DiscourseAi::AiBot::Personas::SqlHelper, @@ -159,6 +160,7 @@ RSpec.describe DiscourseAi::AiBot::Personas::Persona do DiscourseAi::AiBot::Personas::SqlHelper, DiscourseAi::AiBot::Personas::SettingsExplorer, DiscourseAi::AiBot::Personas::Creative, + DiscourseAi::AiBot::Personas::DiscourseHelper, ) AiPersona.find( @@ -171,6 +173,7 @@ RSpec.describe DiscourseAi::AiBot::Personas::Persona do DiscourseAi::AiBot::Personas::SqlHelper, DiscourseAi::AiBot::Personas::SettingsExplorer, DiscourseAi::AiBot::Personas::Creative, + DiscourseAi::AiBot::Personas::DiscourseHelper, ) end end diff --git a/spec/lib/modules/ai_bot/tools/discourse_meta_search_spec.rb b/spec/lib/modules/ai_bot/tools/discourse_meta_search_spec.rb new file mode 100644 index 00000000..b844aff5 --- /dev/null +++ b/spec/lib/modules/ai_bot/tools/discourse_meta_search_spec.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true +RSpec.describe DiscourseAi::AiBot::Tools::DiscourseMetaSearch do + before do + SiteSetting.ai_bot_enabled = true + SiteSetting.ai_openai_api_key = "asd" + end + + let(:bot_user) { User.find(DiscourseAi::AiBot::EntryPoint::GPT3_5_TURBO_ID) } + let(:llm) { DiscourseAi::Completions::Llm.proxy("open_ai:gpt-3.5-turbo") } + let(:progress_blk) { Proc.new {} } + + let(:mock_search_json) do + File.read(File.expand_path("../../../../../fixtures/search_meta/search.json", __FILE__)) + end + + let(:mock_site_json) do + File.read(File.expand_path("../../../../../fixtures/search_meta/site.json", __FILE__)) + end + + before do + stub_request(:get, "https://meta.discourse.org/site.json").to_return( + status: 200, + body: mock_site_json, + headers: { + }, + ) + end + + it "searches meta.discourse.org" do + stub_request(:get, "https://meta.discourse.org/search.json?q=test").to_return( + status: 200, + body: mock_search_json, + headers: { + }, + ) + + search = described_class.new({ search_query: "test" }) + results = search.invoke(bot_user, llm, &progress_blk) + expect(results[:rows].length).to eq(20) + + expect(results[:rows].first[results[:column_names].index("category")]).to eq( + "documentation > developers", + ) + end + + it "passes on all search parameters" do + url = + "https://meta.discourse.org/search.json?q=test%20category:test%20user:test%20order:test%20max_posts:1%20tags:test%20before:test%20after:test%20status:test" + + stub_request(:get, url).to_return(status: 200, body: mock_search_json, headers: {}) + params = + described_class.signature[:parameters] + .map do |param| + if param[:type] == "integer" + [param[:name], 1] + else + [param[:name], "test"] + end + end + .to_h + .symbolize_keys + + search = described_class.new(params) + results = search.invoke(bot_user, llm, &progress_blk) + + expect(results[:args]).to eq(params) + end +end diff --git a/spec/lib/modules/ai_bot/tools/search_spec.rb b/spec/lib/modules/ai_bot/tools/search_spec.rb index 066937c3..060103e9 100644 --- a/spec/lib/modules/ai_bot/tools/search_spec.rb +++ b/spec/lib/modules/ai_bot/tools/search_spec.rb @@ -37,7 +37,7 @@ RSpec.describe DiscourseAi::AiBot::Tools::Search do search_post = Fabricate(:post, topic: topic_with_tags) - bot_post = Fabricate(:post) + _bot_post = Fabricate(:post) search = described_class.new({ order: "latest" }, persona_options: persona_options) @@ -53,7 +53,7 @@ RSpec.describe DiscourseAi::AiBot::Tools::Search do end it "can handle no results" do - post1 = Fabricate(:post, topic: topic_with_tags) + _post1 = Fabricate(:post, topic: topic_with_tags) search = described_class.new({ search_query: "ABDDCDCEDGDG", order: "fake" }) results = search.invoke(bot_user, llm, &progress_blk) @@ -107,6 +107,25 @@ RSpec.describe DiscourseAi::AiBot::Tools::Search do expect(results[:rows].to_s).to include("/subfolder" + post1.url) end + it "passes on all search params" do + params = + described_class.signature[:parameters] + .map do |param| + if param[:type] == "integer" + [param[:name], 1] + else + [param[:name], "test"] + end + end + .to_h + .symbolize_keys + + search = described_class.new(params) + results = search.invoke(bot_user, llm, &progress_blk) + + expect(results[:args]).to eq(params) + end + it "returns rich topic information" do post1 = Fabricate(:post, like_count: 1, topic: topic_with_tags) search = described_class.new({ user: post1.user.username })