{"users":[{"id":115923,"username":"Discourse","name":null,"avatar_template":"/user_avatar/meta.discourse.org/discourse/{size}/148734_2.png","admin":true,"trust_level":4},{"id":100484,"username":"JammyDodger","name":"","avatar_template":"/user_avatar/meta.discourse.org/jammydodger/{size}/254611_2.png","trust_level":3},{"id":-1,"username":"system","name":"system","avatar_template":"/user_avatar/meta.discourse.org/system/{size}/443519_2.png","admin":true,"moderator":true,"trust_level":4},{"id":173746,"username":"唐帅华","name":"tang shuaihua","avatar_template":"/user_avatar/meta.discourse.org/唐帅华/{size}/497828_2.png","trust_level":1},{"id":174008,"username":"Dimava","name":"Dimava","avatar_template":"/user_avatar/meta.discourse.org/dimava/{size}/498540_2.png","trust_level":2},{"id":127446,"username":"gormus","name":"Osman Görmüş","avatar_template":"/user_avatar/meta.discourse.org/gormus/{size}/428592_2.png","flair_name":"theme_authors","flair_url":"paintbrush","flair_bg_color":"ddd","flair_color":"111","flair_group_id":73,"trust_level":2},{"id":142665,"username":"Eviepayne","name":"vladtheimplier","avatar_template":"/user_avatar/meta.discourse.org/eviepayne/{size}/352733_2.png","trust_level":2},{"id":21029,"username":"pmusaraj","name":"Penar Musaraj","avatar_template":"/user_avatar/meta.discourse.org/pmusaraj/{size}/119489_2.png","primary_group_name":"team","flair_name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"admin":true,"trust_level":3},{"id":135392,"username":"NateDhaliwal","name":"Nate Dhaliwal","avatar_template":"/user_avatar/meta.discourse.org/natedhaliwal/{size}/313494_2.png","flair_name":"theme_authors","flair_url":"paintbrush","flair_bg_color":"ddd","flair_color":"111","flair_group_id":73,"trust_level":3},{"id":35474,"username":"Canapin","name":"Coin-coin le Canapin","avatar_template":"/user_avatar/meta.discourse.org/canapin/{size}/119591_2.png","trust_level":3},{"id":95552,"username":"Moin","name":"","avatar_template":"/user_avatar/meta.discourse.org/moin/{size}/523407_2.png","trust_level":3},{"id":105081,"username":"Decorbuz","name":"","avatar_template":"/user_avatar/meta.discourse.org/decorbuz/{size}/235124_2.png","trust_level":2},{"id":125230,"username":"Pieces","name":"","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/p/958977/{size}.png","trust_level":2},{"id":14353,"username":"simon","name":"","avatar_template":"/user_avatar/meta.discourse.org/simon/{size}/339122_2.png","trust_level":2},{"id":169973,"username":"yuriy","name":"Yuriy Kurant","avatar_template":"/user_avatar/meta.discourse.org/yuriy/{size}/498097_2.png","trust_level":2},{"id":23968,"username":"david","name":"David Taylor","avatar_template":"/user_avatar/meta.discourse.org/david/{size}/157490_2.png","primary_group_name":"team","flair_name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"admin":true,"trust_level":3},{"id":15209,"username":"pfaffman","name":"Jay Pfaffman","avatar_template":"/user_avatar/meta.discourse.org/pfaffman/{size}/120154_2.png","flair_name":"support-experts","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/2/e250ec403580530d19e6a9ed42d0d525a51a9dbe.svg","flair_bg_color":"FFFFFF","flair_group_id":142,"trust_level":4},{"id":71968,"username":"petepan23","name":"Peter","avatar_template":"/user_avatar/meta.discourse.org/petepan23/{size}/161836_2.png","trust_level":2},{"id":27384,"username":"merefield","name":"Robert","avatar_template":"/user_avatar/meta.discourse.org/merefield/{size}/176214_2.png","trust_level":3},{"id":34980,"username":"keyboardstaff","name":"Keyboardstaff","avatar_template":"/user_avatar/meta.discourse.org/keyboardstaff/{size}/119694_2.png","trust_level":2},{"id":1,"username":"sam","name":"Sam Saffron","avatar_template":"/user_avatar/meta.discourse.org/sam/{size}/102149_2.png","primary_group_name":"team","flair_name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"admin":true,"trust_level":3},{"id":40486,"username":"TheBestPessimist","name":"","avatar_template":"/user_avatar/meta.discourse.org/thebestpessimist/{size}/247704_2.png","trust_level":2},{"id":57427,"username":"Machigatta","name":"","avatar_template":"/user_avatar/meta.discourse.org/machigatta/{size}/125064_2.png","trust_level":1},{"id":104279,"username":"nat","name":"Natalie T","avatar_template":"/user_avatar/meta.discourse.org/nat/{size}/235063_2.png","primary_group_name":"team","flair_name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"admin":true,"trust_level":3},{"id":23842,"username":"AhmadF.Cheema","name":"","avatar_template":"/user_avatar/meta.discourse.org/ahmadf.cheema/{size}/87109_2.png","trust_level":2},{"id":13093,"username":"pacharanero","name":"Marcus Baw","avatar_template":"/user_avatar/meta.discourse.org/pacharanero/{size}/500583_2.png","trust_level":4},{"id":28866,"username":"schungx","name":"Stephen Chung","avatar_template":"/user_avatar/meta.discourse.org/schungx/{size}/70989_2.png","trust_level":2},{"id":141900,"username":"maaatt","name":"","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/m/ecb155/{size}.png","trust_level":2},{"id":125035,"username":"misham","name":"Mykhailo","avatar_template":"/user_avatar/meta.discourse.org/misham/{size}/282796_2.png","trust_level":1},{"id":66204,"username":"fzngagan","name":"Faizaan Gagan","avatar_template":"/user_avatar/meta.discourse.org/fzngagan/{size}/259349_2.png","primary_group_name":"team","flair_name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"admin":true,"trust_level":3},{"id":13900,"username":"thoka","name":"Thomas Kalka","avatar_template":"/user_avatar/meta.discourse.org/thoka/{size}/115652_2.png","trust_level":2},{"id":11208,"username":"philip_rhoades","name":"Philip Rhoades","avatar_template":"/user_avatar/meta.discourse.org/philip_rhoades/{size}/114647_2.png","trust_level":2},{"id":83775,"username":"fitzy","name":"Michael Fitz-Payne","avatar_template":"/user_avatar/meta.discourse.org/fitzy/{size}/192549_2.png","primary_group_name":"team","flair_name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"trust_level":4},{"id":82960,"username":"manuel","name":"Manuel Kostka","avatar_template":"/user_avatar/meta.discourse.org/manuel/{size}/468169_2.png","primary_group_name":"team","flair_name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"admin":true,"trust_level":2},{"id":36692,"username":"seanblue","name":"","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/s/dc4da7/{size}.png","trust_level":2},{"id":131037,"username":"GregorSondermeier","name":"Gregor Sondermeier","avatar_template":"/user_avatar/meta.discourse.org/gregorsondermeier/{size}/299039_2.png","trust_level":2},{"id":188663,"username":"pean","name":"Pean","avatar_template":"/user_avatar/meta.discourse.org/pean/{size}/542427_2.png","trust_level":0},{"id":36685,"username":"Arkshine","name":"","avatar_template":"/user_avatar/meta.discourse.org/arkshine/{size}/298682_2.png","flair_name":"support-advocates","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/4/e4038d4d9848de2eabab38e17b8bdb69da154024.svg","flair_bg_color":"FFFFFF","flair_group_id":148,"trust_level":3},{"id":186126,"username":"singi2016cn","name":"Singi2016cn","avatar_template":"/user_avatar/meta.discourse.org/singi2016cn/{size}/532755_2.png","trust_level":2},{"id":108265,"username":"pangbo","name":"","avatar_template":"/user_avatar/meta.discourse.org/pangbo/{size}/538562_2.png","trust_level":2},{"id":23163,"username":"j.jaffeux","name":"Joffrey Jaffeux","avatar_template":"/user_avatar/meta.discourse.org/j.jaffeux/{size}/60297_2.png","primary_group_name":"team","flair_name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"admin":true,"trust_level":2},{"id":2770,"username":"awesomerobot","name":"Kris","avatar_template":"/user_avatar/meta.discourse.org/awesomerobot/{size}/142900_2.png","primary_group_name":"team","flair_name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"admin":true,"trust_level":3},{"id":101447,"username":"leonardo","name":"Leonardo Mosquera","avatar_template":"/user_avatar/meta.discourse.org/leonardo/{size}/228634_2.png","trust_level":2},{"id":128201,"username":"kjs-fgx","name":null,"avatar_template":"https://avatars.discourse-cdn.com/v4/letter/k/a9adbd/{size}.png","trust_level":1},{"id":114728,"username":"darkpixlz","name":"Pyx ","avatar_template":"/user_avatar/meta.discourse.org/darkpixlz/{size}/549896_2.png","flair_name":"support-enthusiasts","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/1/3/13f5d8d7e56be8a6a1ea3de009b985a548aec8d4.svg","flair_bg_color":"FFFFFF","flair_group_id":151,"trust_level":4}],"primary_groups":[{"id":47,"name":"team"}],"flair_groups":[{"id":73,"name":"theme_authors","flair_url":"paintbrush","flair_bg_color":"ddd","flair_color":"111"},{"id":47,"name":"team","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_bg_color":"","flair_color":"111"},{"id":142,"name":"support-experts","flair_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/e/2/e250ec403580530d19e6a9ed42d0d525a51a9dbe.svg","flair_bg_color":"FFFFFF","flair_color":""},{"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":""}],"topic_list":{"can_create_topic":false,"more_topics_url":"/c/documentation/developer-guides/56?page=1","per_page":30,"top_tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":820,"name":"theme-guides","slug":"theme-guides"},{"id":819,"name":"code","slug":"code"},{"id":274,"name":"руководства-по-плагинам","slug":"plugin-guides"},{"id":484,"name":"учебник","slug":"tutorial"},{"id":150,"name":"dev-install","slug":"dev-install"},{"id":482,"name":"ссылка","slug":"reference"},{"id":479,"name":"объяснение","slug":"explanation"},{"id":70,"name":"уголёк","slug":"ember"},{"id":58,"name":"тестирование","slug":"testing"},{"id":543,"name":"ии","slug":"ai"},{"id":643,"name":"авто-темная","slug":"auto-dark"},{"id":275,"name":"автоматизация","slug":"automation"},{"id":436,"name":"css","slug":"css"},{"id":814,"name":"customization","slug":"customization"},{"id":24,"name":"docker","slug":"docker"},{"id":799,"name":"index","slug":"index"},{"id":52,"name":"markdown","slug":"markdown"},{"id":328,"name":"плагин-api","slug":"plugin-api"},{"id":566,"name":"создатель-тем","slug":"theme-creator"},{"id":16,"name":"перевод","slug":"translation"},{"id":25,"name":"wiki-посты","slug":"wiki-posts"}],"topics":[{"fancy_title":"Индекс руководств для разработчиков","fancy_title_localized":true,"locale":"en","id":308036,"title":"Developer Guides Index","slug":"developer-guides-index","posts_count":2,"reply_count":1,"highest_post_number":3,"image_url":null,"created_at":"2024-05-15T06:05:51.350Z","last_posted_at":"2024-05-25T18:50:58.149Z","bumped":true,"bumped_at":"2024-05-15T06:05:51.457Z","archetype":"regular","unseen":false,"pinned":true,"unpinned":null,"excerpt":"Документация о расширении Discourse с помощью плагинов, тем и компонентов тем, работе с основным кодом и использовании API Discourse.\nВведение\n\nВведение: Введение в разработку для Discourse\n\nРазработка&hellip;","visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":799,"name":"index","slug":"index"}],"tags_descriptions":{"index":"Documentation category index topics."},"views":1801,"like_count":13,"has_summary":false,"last_poster_username":"JammyDodger","category_id":56,"op_like_count":13,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Discussion about creating a plugin skeleton, with the original link now found at https://meta.discourse.org/t/automating-discourse-plugin-setup-with-create-discourse-plugin-gem/315013, which provides a rake task for automating Discourse plugin setup.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":100484,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Developing Discourse using a Dev Container","fancy_title_localized":false,"locale":null,"id":336366,"title":"Developing Discourse using a Dev Container","slug":"developing-discourse-using-a-dev-container","posts_count":9,"reply_count":3,"highest_post_number":10,"image_url":null,"created_at":"2024-11-15T16:44:08.898Z","last_posted_at":"2026-04-09T03:37:52.803Z","bumped":true,"bumped_at":"2026-04-09T03:37:52.803Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Dev Containers is an open standard for configuring a development environment inside a container. This almost entirely eliminates the need to install/configure Discourse-specific tools/dependencies on your local machine, &hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":16231,"like_count":33,"has_summary":false,"last_poster_username":"Eviepayne","category_id":56,"op_like_count":13,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"A user provided CLI-based instructions for building, running, and accessing a Discourse development environment using Dev Containers without Visual Studio Code, complementing the existing VSCode setup guide.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":-1,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":173746,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":174008,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":127446,"primary_group_id":null,"flair_group_id":73},{"extras":"latest","description":"Последний автор","user_id":142665,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Альтернативные иконки","fancy_title_localized":true,"locale":"en","id":206693,"title":"Alternative icons","slug":"alternative-icons","posts_count":29,"reply_count":20,"highest_post_number":30,"image_url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/c/d/e/cded433ea1794fd5c80acacad2bdfe2c7b422f4a_2_1024x650.png","created_at":"2021-10-21T16:32:27.473Z","last_posted_at":"2026-04-07T16:36:02.711Z","bumped":true,"bumped_at":"2026-04-07T16:36:02.711Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"По умолчанию Discourse включает иконки из превосходной библиотеки FontAwesome. Однако существует множество бесплатных библиотек иконок. Эта тема посвящена альтернативным наборам иконок. В ней перечислены некоторые компоненты тем, которые...","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":1824,"height":1158,"url":"https://d11a6trkgmumsb.cloudfront.net/original/4X/c/d/e/cded433ea1794fd5c80acacad2bdfe2c7b422f4a.png"},{"max_width":1024,"max_height":1024,"width":1024,"height":650,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/c/d/e/cded433ea1794fd5c80acacad2bdfe2c7b422f4a_2_1024x650.png"},{"max_width":800,"max_height":800,"width":800,"height":507,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/c/d/e/cded433ea1794fd5c80acacad2bdfe2c7b422f4a_2_800x507.png"},{"max_width":600,"max_height":600,"width":600,"height":380,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/c/d/e/cded433ea1794fd5c80acacad2bdfe2c7b422f4a_2_600x380.png"},{"max_width":400,"max_height":400,"width":400,"height":253,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/c/d/e/cded433ea1794fd5c80acacad2bdfe2c7b422f4a_2_400x253.png"},{"max_width":300,"max_height":300,"width":300,"height":190,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/c/d/e/cded433ea1794fd5c80acacad2bdfe2c7b422f4a_2_300x190.png"},{"max_width":200,"max_height":200,"width":200,"height":126,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/c/d/e/cded433ea1794fd5c80acacad2bdfe2c7b422f4a_2_200x126.png"}],"tags":[{"id":482,"name":"ссылка","slug":"reference"},{"id":820,"name":"theme-guides","slug":"theme-guides"}],"tags_descriptions":{},"views":2351,"like_count":69,"has_summary":false,"last_poster_username":"Moin","category_id":56,"op_like_count":30,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"The community is transitioning from the Feather icons theme component to the more comprehensive official Lucide icons set, while discussing brand logo availability and plans to update the central discourse-alt-icons repository with new alternatives.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":21029,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"Частый автор","user_id":135392,"primary_group_id":null,"flair_group_id":73},{"extras":null,"description":"Частый автор","user_id":35474,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":95552,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Using service objects in Discourse","fancy_title_localized":false,"locale":null,"id":333641,"title":"Using service objects in Discourse","slug":"using-service-objects-in-discourse","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2024-10-30T15:56:38.400Z","last_posted_at":"2024-10-30T15:56:38.536Z","bumped":true,"bumped_at":"2026-04-03T07:44:43.847Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Overview\nA service is a small object that encompasses business logic for a given action. \nFrom outside, it should be seen as a sort of black box. You provide it with parameters, it runs (including all the side effects it&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":543,"like_count":17,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":17,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Service objects in Discourse encapsulate business logic as stateless, step-driven processes that handle input validation, error handling, and outcome matching, inspired by Trailblazer and dry-transaction.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"Исходный автор, Последний автор","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Install Discourse on macOS for development","fancy_title_localized":false,"locale":"en","id":15772,"title":"Install Discourse on macOS for development","slug":"install-discourse-on-macos-for-development","posts_count":103,"reply_count":235,"highest_post_number":401,"image_url":null,"created_at":"2014-05-19T16:59:50.976Z","last_posted_at":"2026-04-02T22:39:51.987Z","bumped":true,"bumped_at":"2026-04-02T22:39:51.987Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":":warning: This guide covers installation instructions for a macOS development environment, for production guides see: Install Discourse in production with the official supported instructions \n\nSo you want to set up Disc&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":150,"name":"dev-install","slug":"dev-install"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы","dev-install":"Инструкции и проблемы при установке Discourse для разработки"},"views":113776,"like_count":282,"has_summary":true,"last_poster_username":"yuriy","category_id":56,"op_like_count":78,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Users clarify that after installing dependencies on macOS, developers should reload their shell environment using `omz reload` or `source .zprofile` to ensure paths are correctly recognized before proceeding.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":105081,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":125230,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":14353,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":169973,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Theme Developer Tutorial: 6. Using the JS API","fancy_title_localized":false,"locale":null,"id":357801,"title":"Theme Developer Tutorial: 6. Using the JS API","slug":"theme-developer-tutorial-6-using-the-js-api","posts_count":4,"reply_count":2,"highest_post_number":4,"image_url":null,"created_at":"2025-03-18T15:59:11.630Z","last_posted_at":"2025-04-14T23:16:42.528Z","bumped":true,"bumped_at":"2026-03-24T08:13:56.617Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"In the last couple of chapters, we’ve explored how to use the JavaScript API to render content into outlets. renderInOutlet is the most commonly-used API, but there are a ton more! In this chapter we’ll try out a few of &hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":908,"like_count":9,"has_summary":false,"last_poster_username":"pfaffman","category_id":56,"op_like_count":3,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Users can target specific categories in posts using helper.getModel().topic.category_id within decorateCookedElement, avoiding inefficient text searches.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":-1,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":23968,"primary_group_id":47,"flair_group_id":47},{"extras":"latest","description":"Последний автор","user_id":15209,"primary_group_id":null,"flair_group_id":142}]},{"fancy_title":"Модификаторы тем: краткое введение","fancy_title_localized":true,"locale":"en","id":150605,"title":"Theme modifiers: A brief introduction","slug":"theme-modifiers-a-brief-introduction","posts_count":21,"reply_count":18,"highest_post_number":25,"image_url":null,"created_at":"2020-05-06T14:35:41.625Z","last_posted_at":"2025-10-24T06:20:57.900Z","bumped":true,"bumped_at":"2026-03-24T08:13:55.825Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"По мере того как темы становятся всё более амбициозными, мы ищем способы предоставить им возможность влиять на основное поведение серверной части. Хотя они никогда не получат такого же уровня контроля, как плагины, мы можем предложить некоторые заранее определённые хуки…","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":820,"name":"theme-guides","slug":"theme-guides"}],"tags_descriptions":{},"views":4570,"like_count":94,"has_summary":false,"last_poster_username":"NateDhaliwal","category_id":56,"op_like_count":35,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"A typo in the documentation link for theme modifiers was identified and a pull request to fix it was submitted.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":71968,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":23968,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"Частый автор","user_id":27384,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":135392,"primary_group_id":null,"flair_group_id":73}]},{"fancy_title":"Use Discourse Core Variables in your Theme","fancy_title_localized":false,"locale":"en","id":77551,"title":"Use Discourse Core Variables in your Theme","slug":"use-discourse-core-variables-in-your-theme","posts_count":1,"reply_count":6,"highest_post_number":1,"image_url":"https://d11a6trkgmumsb.cloudfront.net/original/4X/9/b/5/9b5dab67124a569aa5d4a946b31f4abd1953a94f.png","created_at":"2018-01-09T04:55:37.096Z","last_posted_at":"2018-01-09T04:55:37.185Z","bumped":true,"bumped_at":"2026-03-24T08:13:54.300Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Discourse is incredibly customizable! \nThe goal of this topic is to show you how make use of all the amazing options that are available to you as a theme developer. You know… so that you don’t have to reinvent the wheel &hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":848,"height":951,"url":"https://d11a6trkgmumsb.cloudfront.net/original/4X/9/b/5/9b5dab67124a569aa5d4a946b31f4abd1953a94f.png"},{"max_width":800,"max_height":800,"width":713,"height":800,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/9/b/5/9b5dab67124a569aa5d4a946b31f4abd1953a94f_2_713x800.png"},{"max_width":600,"max_height":600,"width":535,"height":600,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/9/b/5/9b5dab67124a569aa5d4a946b31f4abd1953a94f_2_535x600.png"},{"max_width":400,"max_height":400,"width":356,"height":400,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/9/b/5/9b5dab67124a569aa5d4a946b31f4abd1953a94f_2_356x400.png"},{"max_width":300,"max_height":300,"width":267,"height":300,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/9/b/5/9b5dab67124a569aa5d4a946b31f4abd1953a94f_2_267x300.png"},{"max_width":200,"max_height":200,"width":178,"height":200,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/9/b/5/9b5dab67124a569aa5d4a946b31f4abd1953a94f_2_178x200.png"}],"tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":820,"name":"theme-guides","slug":"theme-guides"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы"},"views":12016,"like_count":45,"has_summary":false,"last_poster_username":"Discourse","category_id":56,"op_like_count":45,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Discourse provides numerous customizable options, including font sizes, colors, and z-index values, allowing theme developers to utilize and override variables in the theme editor.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"Исходный автор, Последний автор","user_id":115923,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Structure of themes and theme components","fancy_title_localized":false,"locale":"en","id":60848,"title":"Structure of themes and theme components","slug":"structure-of-themes-and-theme-components","posts_count":1,"reply_count":30,"highest_post_number":1,"image_url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/1/c/b/1cb8db919e91f31c0192da0e184e0347ce72e3cb_2_1024x540.png","created_at":"2017-04-12T15:41:30.632Z","last_posted_at":"2017-04-12T15:41:30.756Z","bumped":true,"bumped_at":"2026-03-24T08:13:53.535Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Discourse supports native themes that can be sourced from a .tar.gz archive or from a remote git repository including private repositories. \n  \nAn example theme is at: GitHub - discourse/discourse-simple-theme: Sam&#39;s sim&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":1296,"height":684,"url":"https://d11a6trkgmumsb.cloudfront.net/original/4X/1/c/b/1cb8db919e91f31c0192da0e184e0347ce72e3cb.png"},{"max_width":1024,"max_height":1024,"width":1024,"height":540,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/1/c/b/1cb8db919e91f31c0192da0e184e0347ce72e3cb_2_1024x540.png"},{"max_width":800,"max_height":800,"width":800,"height":422,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/1/c/b/1cb8db919e91f31c0192da0e184e0347ce72e3cb_2_800x422.png"},{"max_width":600,"max_height":600,"width":600,"height":316,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/1/c/b/1cb8db919e91f31c0192da0e184e0347ce72e3cb_2_600x316.png"},{"max_width":400,"max_height":400,"width":400,"height":211,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/1/c/b/1cb8db919e91f31c0192da0e184e0347ce72e3cb_2_400x211.png"},{"max_width":300,"max_height":300,"width":300,"height":158,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/1/c/b/1cb8db919e91f31c0192da0e184e0347ce72e3cb_2_300x158.png"},{"max_width":200,"max_height":200,"width":200,"height":105,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/1/c/b/1cb8db919e91f31c0192da0e184e0347ce72e3cb_2_200x105.png"}],"tags":[{"id":482,"name":"ссылка","slug":"reference"},{"id":820,"name":"theme-guides","slug":"theme-guides"}],"tags_descriptions":{},"views":29163,"like_count":62,"has_summary":false,"last_poster_username":"Discourse","category_id":56,"op_like_count":62,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Discourse supports native themes sourced from .tar.gz archives or remote git repositories, with updates checked daily or manually using the Check for Updates button.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"Исходный автор, Последний автор","user_id":115923,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Add a new provider to discourse-chat-integration","fancy_title_localized":false,"locale":"en","id":68156,"title":"Add a new provider to discourse-chat-integration","slug":"add-a-new-provider-to-discourse-chat-integration","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2017-08-16T13:28:28.623Z","last_posted_at":"2017-08-16T13:28:28.734Z","bumped":true,"bumped_at":"2026-03-24T08:13:52.651Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"discourse-chat-integration abstracts away the boilerplate for integrating Discourse with external chatroom systems. There are three features which a provider implementation can support: Notifications, Slash Commands and T&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":274,"name":"руководства-по-плагинам","slug":"plugin-guides"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы"},"views":4662,"like_count":15,"has_summary":false,"last_poster_username":"Discourse","category_id":56,"op_like_count":15,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Discourse-chat-integration abstracts away boilerplate for integrating Discourse with external chatroom systems, supporting notifications, slash commands, and transcripts.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"Исходный автор, Последний автор","user_id":115923,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Add a new locale from plugin","fancy_title_localized":false,"locale":"en","id":78962,"title":"Add a new locale from plugin","slug":"add-a-new-locale-from-plugin","posts_count":2,"reply_count":0,"highest_post_number":2,"image_url":null,"created_at":"2018-01-25T15:03:26.576Z","last_posted_at":"2019-06-11T13:51:24.993Z","bumped":true,"bumped_at":"2026-03-24T08:13:51.553Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Usually the best way to add a new language to Discourse is by creating a pull request as described in “How to add a new language”. \nThe following guide is for you, if you want to use a language that can’t be added to cor&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":274,"name":"руководства-по-плагинам","slug":"plugin-guides"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы"},"views":3362,"like_count":20,"has_summary":false,"last_poster_username":"keyboardstaff","category_id":56,"op_like_count":17,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Users seek to customize translations for plugins like discourse-details and discourse-local-dates, noting some lack full translation support despite locale setup guidance.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":34980,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Developing Discourse Plugins - Part 6 - Add acceptance tests","fancy_title_localized":false,"locale":"en","id":32619,"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,"image_url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/6/2/62a63eca67d134def1580fd9fbd84ff62b531ee1_2_1024x715.png","created_at":"2015-08-27T21:32:26.323Z","last_posted_at":"2022-06-02T11:06:38.274Z","bumped":true,"bumped_at":"2026-03-24T08:13:50.918Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Previous tutorial: Developing Discourse Plugins - Part 5 - Add an admin interface \n\nDid you know that Discourse has two large test suites for its code base? On the server side, our Ruby code has a test suite that uses rs&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":1058,"height":739,"url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/6/2/62a63eca67d134def1580fd9fbd84ff62b531ee1.png"},{"max_width":1024,"max_height":1024,"width":1024,"height":715,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/6/2/62a63eca67d134def1580fd9fbd84ff62b531ee1_2_1024x715.png"},{"max_width":800,"max_height":800,"width":800,"height":558,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/6/2/62a63eca67d134def1580fd9fbd84ff62b531ee1_2_800x558.png"},{"max_width":600,"max_height":600,"width":600,"height":419,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/6/2/62a63eca67d134def1580fd9fbd84ff62b531ee1_2_600x419.png"},{"max_width":400,"max_height":400,"width":400,"height":279,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/6/2/62a63eca67d134def1580fd9fbd84ff62b531ee1_2_400x279.png"},{"max_width":300,"max_height":300,"width":300,"height":209,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/6/2/62a63eca67d134def1580fd9fbd84ff62b531ee1_2_300x209.png"},{"max_width":200,"max_height":200,"width":200,"height":139,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/6/2/62a63eca67d134def1580fd9fbd84ff62b531ee1_2_200x139.png"}],"tags":[{"id":484,"name":"учебник","slug":"tutorial"},{"id":274,"name":"руководства-по-плагинам","slug":"plugin-guides"},{"id":58,"name":"тестирование","slug":"testing"}],"tags_descriptions":{"учебник":""},"views":17224,"like_count":80,"has_summary":false,"last_poster_username":"nat","category_id":56,"op_like_count":30,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Users are troubleshooting issues with running acceptance tests for Discourse plugins, resolving errors related to test suites, plugin registration, and EmberCLI, with solutions involving test setup, plugin configuration, and code updates.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":1,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"Частый автор","user_id":40486,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":57427,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":104279,"primary_group_id":47,"flair_group_id":47}]},{"fancy_title":"Developing Discourse Plugins - Part 4 - Setup git","fancy_title_localized":false,"locale":"en","id":31272,"title":"Developing Discourse Plugins - Part 4 - Setup git","slug":"developing-discourse-plugins-part-4-setup-git","posts_count":11,"reply_count":5,"highest_post_number":11,"image_url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/3/8/38c2d794af363a8a9840cddc5ac8d92a24374b12.png","created_at":"2015-07-21T20:54:59.409Z","last_posted_at":"2024-01-30T11:12:28.312Z","bumped":true,"bumped_at":"2026-03-24T08:13:50.331Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Previous tutorial: Developing Discourse Plugins - Part 3 - Add custom site settings \n\nNow that your plugin is getting more sophisticated, it’s time to get more sophisticated about how you develop it. \nWe suggest that you&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":730,"height":413,"url":"https://d11a6trkgmumsb.cloudfront.net/original/3X/3/8/38c2d794af363a8a9840cddc5ac8d92a24374b12.png"},{"max_width":600,"max_height":600,"width":600,"height":339,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/3/8/38c2d794af363a8a9840cddc5ac8d92a24374b12_2_600x339.png"},{"max_width":400,"max_height":400,"width":400,"height":226,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/3/8/38c2d794af363a8a9840cddc5ac8d92a24374b12_2_400x226.png"},{"max_width":300,"max_height":300,"width":300,"height":169,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/3/8/38c2d794af363a8a9840cddc5ac8d92a24374b12_2_300x169.png"},{"max_width":200,"max_height":200,"width":200,"height":113,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/3X/3/8/38c2d794af363a8a9840cddc5ac8d92a24374b12_2_200x113.png"}],"tags":[{"id":484,"name":"учебник","slug":"tutorial"},{"id":274,"name":"руководства-по-плагинам","slug":"plugin-guides"}],"tags_descriptions":{"учебник":""},"views":13009,"like_count":37,"has_summary":false,"last_poster_username":"maaatt","category_id":56,"op_like_count":23,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Windows and macOS users face challenges with symbolic links in Discourse plugin development; solutions include using junctions in Windows, aliases in macOS, or a synced folder in Vagrant to create working symlinks within the development environment.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":23842,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":13093,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":28866,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":141900,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"(не рекомендуется) Переопределение шаблонов Discourse из темы или плагина","fancy_title_localized":true,"locale":"en","id":247487,"title":"(not recommended) Overriding Discourse templates from a Theme or Plugin","slug":"not-recommended-overriding-discourse-templates-from-a-theme-or-plugin","posts_count":12,"reply_count":6,"highest_post_number":17,"image_url":null,"created_at":"2022-12-02T13:52:58.399Z","last_posted_at":"2024-07-26T11:30:50.026Z","bumped":true,"bumped_at":"2026-03-24T08:13:48.226Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"В идеале при кастомизации Discourse через темы или плагины следует использовать CSS, JavaScript Plugin API или outlet-ы плагинов. Если ни один из этих вариантов не подходит для вашего случая, не стесняйтесь открыть PR в ядро Discourse или начать обсуждение в т&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"visibility_reason_id":4,"tags":[{"id":478,"name":"как-сделать","slug":"how-to"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы"},"views":2566,"like_count":42,"has_summary":false,"last_poster_username":"JammyDodger","category_id":56,"op_like_count":17,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Discourse is shifting towards Ember's `.gjs` file format, limiting template overrides; however, Wrapper Plugin Outlets allow themes and plugins to override small template chunks, offering a way forward for customization and extensibility.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":125035,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":23968,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"Частый автор","user_id":27384,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":100484,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Adding a new &lsquo;managed&rsquo; authentication method to Discourse","fancy_title_localized":false,"locale":"en","id":106695,"title":"Adding a new 'managed' authentication method to Discourse","slug":"adding-a-new-managed-authentication-method-to-discourse","posts_count":3,"reply_count":1,"highest_post_number":7,"image_url":null,"created_at":"2019-01-16T13:44:45.295Z","last_posted_at":"2023-11-29T07:48:14.411Z","bumped":true,"bumped_at":"2026-03-24T08:13:47.545Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Continuing from Future Social Authentication Improvements… \nWe are now in the process of moving all ‘associated account’ information into a single database table. This will help to significantly reduce duplicated logic, &hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":479,"name":"объяснение","slug":"explanation"}],"tags_descriptions":{},"views":3599,"like_count":30,"has_summary":false,"last_poster_username":"thoka","category_id":56,"op_like_count":23,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Users discuss implementing a new authentication method in Discourse, focusing on using ManagedAuthenticator for OAuth integration and exploring its application for email-based login via deep links, while noting technical issues with local development setups.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":66204,"primary_group_id":47,"flair_group_id":47},{"extras":"latest","description":"Последний автор","user_id":13900,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Использование API DModal для отображения модальных окон (также известных как всплывающие окна/диалоги) в Discourse","fancy_title_localized":true,"locale":"en","id":268304,"title":"Using the DModal API to render Modal windows (aka popups/dialogs) in Discourse","slug":"using-the-dmodal-api-to-render-modal-windows-aka-popups-dialogs-in-discourse","posts_count":2,"reply_count":1,"highest_post_number":4,"image_url":"https://d11a6trkgmumsb.cloudfront.net/original/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35.png","created_at":"2023-07-03T09:52:06.275Z","last_posted_at":"2023-12-27T06:11:48.954Z","bumped":true,"bumped_at":"2026-03-24T08:13:46.730Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Discourse 3.1.0.beta6 поставляется с совершенно новым компонентным API <DModal>.\n\nℹ️ Он заменяет устаревший API на основе контроллеров. Если у вас есть существующие модальные окна, использующие старые API,...","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":696,"height":258,"url":"https://d11a6trkgmumsb.cloudfront.net/original/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35.png"},{"max_width":600,"max_height":600,"width":600,"height":222,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35_2_600x222.png"},{"max_width":400,"max_height":400,"width":400,"height":148,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35_2_400x148.png"},{"max_width":300,"max_height":300,"width":300,"height":111,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35_2_300x111.png"},{"max_width":200,"max_height":200,"width":200,"height":74,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35_2_200x74.png"}],"tags":[{"id":819,"name":"code","slug":"code"}],"tags_descriptions":{},"views":2015,"like_count":17,"has_summary":false,"last_poster_username":"sam","category_id":56,"op_like_count":17,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Discourse 3.1.0.beta6 introduces the <DModal> component API for rendering modals, replacing the deprecated controller-based method, with examples for template use, component wrapping, and service-based triggering.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":1,"primary_group_id":47,"flair_group_id":47}]},{"fancy_title":"Developer&rsquo;s guide to Markdown extensions","fancy_title_localized":false,"locale":"en","id":66023,"title":"Developer's guide to Markdown extensions","slug":"developers-guide-to-markdown-extensions","posts_count":1,"reply_count":13,"highest_post_number":1,"image_url":null,"created_at":"2017-07-11T21:23:25.941Z","last_posted_at":"2017-07-11T21:23:26.066Z","bumped":true,"bumped_at":"2026-03-24T08:13:45.965Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Discourse uses a Markdown engine called Markdown-it. \nHere are some dev notes that will help you either fix bugs in core or create your new plugins. \nThe Basics\nDiscourse only contains a few helpers on top of the engine,&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":482,"name":"ссылка","slug":"reference"},{"id":52,"name":"markdown","slug":"markdown"},{"id":819,"name":"code","slug":"code"}],"tags_descriptions":{},"views":13450,"like_count":35,"has_summary":false,"last_poster_username":"Discourse","category_id":56,"op_like_count":35,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Discourse uses Markdown-it engine with a few helpers, and learning Markdown-it is crucial for creating plugins or fixing bugs, with documentation and source code available for reference.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"Исходный автор, Последний автор","user_id":115923,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Настройка Discourse для разработки на Fedora Linux","fancy_title_localized":true,"locale":"en","id":163348,"title":"Set up Discourse for development on Fedora Linux","slug":"set-up-discourse-for-development-on-fedora-linux","posts_count":11,"reply_count":12,"highest_post_number":23,"image_url":null,"created_at":"2020-09-08T11:00:32.308Z","last_posted_at":"2025-11-12T10:46:02.940Z","bumped":true,"bumped_at":"2026-03-24T08:13:45.317Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Данное руководство протестировано на свежих установках Fedora 31 и 33, но может работать и на более старых версиях, которые также используют dnf как инструмент управления пакетами. Это не официальное руководство, но оно может оказаться полезным для других разработчиков...","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":150,"name":"dev-install","slug":"dev-install"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы","dev-install":"Инструкции и проблемы при установке Discourse для разработки"},"views":4335,"like_count":42,"has_summary":false,"last_poster_username":"manuel","category_id":56,"op_like_count":27,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"A user encountered issues with pgvector version compatibility on Fedora, requiring compilation from source but facing conflicts with postgresql-private-devel and libpq-devel, prompting a discussion on resolving the build environment setup.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":11208,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":83775,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"Частый автор","user_id":35474,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":82960,"primary_group_id":47,"flair_group_id":47}]},{"fancy_title":"Настройка локальной среды разработки Discourse?","fancy_title_localized":true,"locale":"en","id":182882,"title":"Set up a local Discourse Development Environment?","slug":"set-up-a-local-discourse-development-environment","posts_count":1,"reply_count":2,"highest_post_number":1,"image_url":null,"created_at":"2021-03-11T11:33:53.263Z","last_posted_at":"2021-03-11T11:33:53.409Z","bumped":true,"bumped_at":"2026-03-24T08:13:43.950Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Итак, вы хотите настроить Discourse локально для разработки и экспериментов? \nЭта главная страница объединяет все <span class=\"hashtag-icon-placeholder\"></span>dev-install</span> руководства по настройке Discourse локально на различных системах. Если вы хотите добавить своё руководство в этот список, убедитесь, что...","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":150,"name":"dev-install","slug":"dev-install"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы","dev-install":"Инструкции и проблемы при установке Discourse для разработки"},"views":8609,"like_count":17,"has_summary":false,"last_poster_username":"Discourse","category_id":56,"op_like_count":16,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Discourse provides local development environment setup guides for various systems, including Ubuntu, macOS, Windows, Docker, and Fedora, to help developers hack on and work with Discourse.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"Исходный автор, Последний автор","user_id":115923,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Install Discourse for development using Docker","fancy_title_localized":false,"locale":"en","id":102009,"title":"Install Discourse for development using Docker","slug":"install-discourse-for-development-using-docker","posts_count":223,"reply_count":187,"highest_post_number":322,"image_url":null,"created_at":"2018-11-16T09:40:04.247Z","last_posted_at":"2026-02-07T16:00:54.807Z","bumped":true,"bumped_at":"2026-03-24T08:13:43.248Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Developing using Docker\nSince Discourse runs in Docker, you should be able to run Discourse directly from your source directory using a Discourse development container. \n:white_check_mark: Pros: No need to install any &hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":24,"name":"docker","slug":"docker"},{"id":150,"name":"dev-install","slug":"dev-install"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы","dev-install":"Инструкции и проблемы при установке Discourse для разработки"},"views":86601,"like_count":364,"has_summary":true,"last_poster_username":"pean","category_id":56,"op_like_count":72,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"A user resolved PostgreSQL authentication issues in a Discourse Docker development environment by modifying the pg_hba.conf file to use 'trust' authentication, mounting the modified config, and exposing the database port for external access via a local client like DBeaver.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":36692,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":131037,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":27384,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":188663,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Тип объектов для настройки темы","fancy_title_localized":true,"locale":"en","id":305009,"title":"Objects type for theme setting","slug":"objects-type-for-theme-setting","posts_count":30,"reply_count":15,"highest_post_number":34,"image_url":null,"created_at":"2024-04-23T06:24:06.493Z","last_posted_at":"2026-03-18T08:17:24.114Z","bumped":true,"bumped_at":"2026-03-18T08:17:24.114Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Мы добавляем новый тип: объекты, в список поддерживаемых типов для настроек темы, который можно использовать для замены существующего типа json_schema, который мы планируем вскоре устареть.\nОпределение настройки темы типа объектов\nЧтобы создать...","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":820,"name":"theme-guides","slug":"theme-guides"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы"},"views":1797,"like_count":95,"has_summary":false,"last_poster_username":"singi2016cn","category_id":56,"op_like_count":16,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Discourse introduces an `objects` type for theme settings to replace `json_schema`, detailing schema definitions and validations, while a user questions the lack of `max` limit support for this new type.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":27384,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":36685,"primary_group_id":null,"flair_group_id":148},{"extras":null,"description":"Частый автор","user_id":15209,"primary_group_id":null,"flair_group_id":142},{"extras":"latest","description":"Последний автор","user_id":186126,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Theme Developer Tutorial: 7. Wrapping up","fancy_title_localized":false,"locale":null,"id":357802,"title":"Theme Developer Tutorial: 7. Wrapping up","slug":"theme-developer-tutorial-7-wrapping-up","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2025-03-18T15:59:12.182Z","last_posted_at":"2025-03-18T15:59:12.273Z","bumped":true,"bumped_at":"2026-03-17T10:27:43.026Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"This tutorial has been a whistle-stop tour through the process of creating a Discourse theme and experimenting with a few of the most common APIs. Of course, there’s plenty more to learn, so let’s map out some more place&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":236,"like_count":2,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":2,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"This tutorial covered creating a Discourse theme, experimenting with APIs, and provided resources for further learning and exploration of theme development.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"Исходный автор, Последний автор","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Theme Developer Tutorial: 2. Creating a remote theme","fancy_title_localized":false,"locale":null,"id":357797,"title":"Theme Developer Tutorial: 2. Creating a remote theme","slug":"theme-developer-tutorial-2-creating-a-remote-theme","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2025-03-18T15:59:09.382Z","last_posted_at":"2025-03-18T15:59:09.454Z","bumped":true,"bumped_at":"2026-03-17T10:27:42.090Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"In the last chapter, we created a basic theme via the Discourse admin interface. This works well enough for very simple themes. But as soon as you want to do something more complex, or share a theme more widely, you’ll n&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":623,"like_count":2,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":2,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"The tutorial guides users through creating a remote Discourse theme using the discourse_theme CLI, syncing it to a Discourse instance, adding custom code, and preparing it for GitHub hosting.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"Исходный автор, Последний автор","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Customizing the topic list","fancy_title_localized":false,"locale":null,"id":350411,"title":"Customizing the topic list","slug":"customizing-the-topic-list","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2025-02-04T10:40:33.076Z","last_posted_at":"2025-02-04T10:40:33.148Z","bumped":true,"bumped_at":"2026-03-17T10:27:41.095Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"The topic-list is one of the most-used and most-customized user-interfaces in Discourse. There are many different tools available to theme and plugin developers to achieve this customization, each with their own advantag&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":730,"like_count":8,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":8,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Topic-list customization is commonly achieved through CSS, with other methods available via JS plugin API for adding, removing, and rearranging columns.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"Исходный автор, Последний автор","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Использование modifyClass для изменения базового поведения","fancy_title_localized":true,"locale":"en","id":262064,"title":"Using modifyClass to change core behavior","slug":"using-modifyclass-to-change-core-behavior","posts_count":7,"reply_count":14,"highest_post_number":26,"image_url":null,"created_at":"2023-04-18T10:24:36.929Z","last_posted_at":"2026-03-04T07:13:43.215Z","bumped":true,"bumped_at":"2026-03-17T10:27:37.770Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Для продвинутых тем и плагинов Discourse предлагает систему modifyClass. Это позволяет расширять и переопределять функциональность во многих классах JavaScript ядра.\nКогда использовать modifyClass\nmodifyClass следует использовать только в крайних случаях...","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":2285,"like_count":34,"has_summary":false,"last_poster_username":"pangbo","category_id":56,"op_like_count":16,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"A contributor notes that the example code for `api.modifyClass` in the Discourse plugin API documentation still utilizes the deprecated legacy syntax and requires updating to the modern native-class approach.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":23968,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"Частый автор","user_id":27384,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":108265,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Владение объектами Ember (getOwner, внедрение сервисов и т.д.)","fancy_title_localized":true,"locale":"en","id":292080,"title":"Ember object ownership (getOwner, service injections, etc.)","slug":"ember-object-ownership-getowner-service-injections-etc","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2024-01-19T13:28:42.440Z","last_posted_at":"2024-01-19T13:28:42.440Z","bumped":true,"bumped_at":"2026-03-17T10:27:36.896Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":":warning: Импортирование getOwner из discourse-common/lib/get-owner устарело.\n\nЧтобы получить доступ, например, к сервисам, у вас есть несколько доступных методов.\n\n\nВ компонентах, контроллерах и маршрутах следует использовать внедрение сервисов …","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":819,"name":"code","slug":"code"}],"tags_descriptions":{},"views":1400,"like_count":7,"has_summary":false,"last_poster_username":"Discourse","category_id":56,"op_like_count":7,"pinned_globally":false,"featured_link":null,"ai_topic_gist":null,"is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"Исходный автор, Последний автор","user_id":115923,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Automatically lint and format code before commits","fancy_title_localized":false,"locale":"en","id":132947,"title":"Automatically lint and format code before commits","slug":"automatically-lint-and-format-code-before-commits","posts_count":2,"reply_count":2,"highest_post_number":2,"image_url":null,"created_at":"2019-11-08T17:16:11.987Z","last_posted_at":"2026-03-13T06:34:52.950Z","bumped":true,"bumped_at":"2026-03-17T10:27:35.758Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Discourse uses lefthook for git hooks, and bin/lint as the main CLI entry point for running the same checks manually. \nIf you are working in a local clone, install the hooks once: \npnpm install\npnpm lefthook install\n\nAft&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":819,"name":"code","slug":"code"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы"},"views":1427,"like_count":11,"has_summary":false,"last_poster_username":"sam","category_id":56,"op_like_count":11,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"The Discourse repository now uses lefthook to automatically lint and format code before commits, blocking the process if errors are detected after running installation commands.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":1,"primary_group_id":47,"flair_group_id":47}]},{"fancy_title":"Run Discourse AI evals","fancy_title_localized":false,"locale":null,"id":390080,"title":"Run Discourse AI evals","slug":"run-discourse-ai-evals","posts_count":2,"reply_count":0,"highest_post_number":2,"image_url":null,"created_at":"2025-12-01T18:09:55.986Z","last_posted_at":"2025-12-01T21:12:09.904Z","bumped":true,"bumped_at":"2026-03-16T09:05:20.582Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Overview\nThe Discourse AI plugin ships a Ruby CLI under plugins/discourse-ai/evals that exercises AI features against YAML definitions and records results. Use it to benchmark prompts, compare model outputs, and regressi&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":543,"name":"ии","slug":"ai"}],"tags_descriptions":{},"views":171,"like_count":9,"has_summary":false,"last_poster_username":"Moin","category_id":56,"op_like_count":6,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"The discussion focuses on running AI evaluations using the Discourse AI plugin's Ruby CLI, which allows benchmarking prompts, comparing model outputs, and testing AI behaviors through YAML cases, personas, judges, and datasets, with recent comments indicating a need for clarification or feedback on the process.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":-1,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"Последний автор","user_id":95552,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Discourse toolkit to render forms","fancy_title_localized":false,"locale":null,"id":326439,"title":"Discourse toolkit to render forms","slug":"discourse-toolkit-to-render-forms","posts_count":29,"reply_count":18,"highest_post_number":33,"image_url":null,"created_at":"2024-09-13T21:20:27.941Z","last_posted_at":"2025-12-23T17:55:56.356Z","bumped":true,"bumped_at":"2026-03-13T19:33:39.712Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Basic Usage\nFormKit exposes a single component as its public API: &lt;Form /&gt;. All other elements are yielded as contextual components, modifiers, or plain data. \nEvery form is composed of one or multiple fields, represen&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":1270,"like_count":45,"has_summary":false,"last_poster_username":"merefield","category_id":56,"op_like_count":6,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"A discussion about correcting the parameter structure for the validateUsername function in FormKit, clarifying that it should accept { data, addError } instead of (name, value, data, { addError }) to avoid destructuring errors.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":-1,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":23163,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"Частый автор","user_id":2770,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"Частый автор","user_id":23968,"primary_group_id":47,"flair_group_id":47},{"extras":"latest","description":"Последний автор","user_id":27384,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Get started with Theme Creator and the Theme CLI","fancy_title_localized":false,"locale":"en","id":108444,"title":"Get started with Theme Creator and the Theme CLI","slug":"get-started-with-theme-creator-and-the-theme-cli","posts_count":8,"reply_count":13,"highest_post_number":26,"image_url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/7/0/7/707f15c4b072258fb9e33c3a4fe7f30b715b4277_2_777x1024.png","created_at":"2019-02-05T18:40:04.304Z","last_posted_at":"2026-01-27T08:38:26.436Z","bumped":true,"bumped_at":"2026-03-12T14:24:17.770Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"This topic will walk you through how to use the Theme CLI with our Theme Creator site to develop a theme and preview your changes on a live Discourse site. \n\n\nSign up for an account here on Meta if you haven’t already \n\n\n&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":1224,"height":1612,"url":"https://d11a6trkgmumsb.cloudfront.net/original/4X/7/0/7/707f15c4b072258fb9e33c3a4fe7f30b715b4277.png"},{"max_width":1024,"max_height":1024,"width":777,"height":1024,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/7/0/7/707f15c4b072258fb9e33c3a4fe7f30b715b4277_2_777x1024.png"},{"max_width":800,"max_height":800,"width":607,"height":800,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/7/0/7/707f15c4b072258fb9e33c3a4fe7f30b715b4277_2_607x800.png"},{"max_width":600,"max_height":600,"width":455,"height":600,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/7/0/7/707f15c4b072258fb9e33c3a4fe7f30b715b4277_2_455x600.png"},{"max_width":400,"max_height":400,"width":303,"height":400,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/7/0/7/707f15c4b072258fb9e33c3a4fe7f30b715b4277_2_303x400.png"},{"max_width":300,"max_height":300,"width":227,"height":300,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/7/0/7/707f15c4b072258fb9e33c3a4fe7f30b715b4277_2_227x300.png"},{"max_width":200,"max_height":200,"width":151,"height":200,"url":"https://d11a6trkgmumsb.cloudfront.net/optimized/4X/7/0/7/707f15c4b072258fb9e33c3a4fe7f30b715b4277_2_151x200.png"}],"tags":[{"id":478,"name":"как-сделать","slug":"how-to"},{"id":566,"name":"создатель-тем","slug":"theme-creator"},{"id":820,"name":"theme-guides","slug":"theme-guides"}],"tags_descriptions":{"как-сделать":"Руководства содержат шаги для решения конкретной проблемы","создатель-тем":"Темы о создателе тем Discourse"},"views":12662,"like_count":58,"has_summary":false,"last_poster_username":"Moin","category_id":56,"op_like_count":42,"pinned_globally":false,"featured_link":null,"ai_topic_gist":"Users report that `discourse_theme watch` no longer auto-refreshes themes on save, requiring manual browser refresh, with a possible fix linked in a related thread.","is_nested_view":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"Исходный автор","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":101447,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":128201,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"Частый автор","user_id":114728,"primary_group_id":null,"flair_group_id":151},{"extras":"latest","description":"Последний автор","user_id":95552,"primary_group_id":null,"flair_group_id":null}]}]}}