| Summary | Everything JTech Forums runs on top of Discourse, in one plugin: moderator tools, whispers to chosen people, REQ-PM, Dumbcourse, a Telegram bridge, sale-thread listings, smart search, pop-ups, and our whole theme. Every piece has its own switch. | |
| Repository | GitHub - TripleU613/JtechTools: The plugin behind JTech Forums: moderator tools and whispers, REQ-PM, Dumbcourse for flip phones, a Telegram bridge, sale-thread listings, smart search, pop-ups and the JTech theme. Every module has its own switch. · GitHub | |
| Install guide | How to install plugins in Discourse |
Hey all,
Some of this has already been floating around Meta in pieces. Dumbcourse got its own topic back in February, @ars18 posted Mini-mod in April, and in August I dropped a long reply in the Dumbcourse thread listing everything else we’d stuffed into one plugin. That deserved better than being buried at post #38, so here’s the proper version. With a lot of pictures this time.
JTech is a tech forum, mostly phones, flip phones, filters and ROMs, and a lot of our members use keypad phones on purpose. Every tool here exists because our own forum needed it.
“Why is this one plugin?”
merefield asked this in the Dumbcourse thread and it’s a fair question, so here’s the answer up front.
- Every module has its own on/off switch. Some are on out of the box (Dumbcourse, REQ-PM, the moderator tools), others wait for you (Mini-mod, smart search, Disteleplus, Another SMTP), and a few of the “on” ones do nothing until you point them at a category or topic. Go through the tabs after installing and switch off what you don’t want.
jtech_enabledstops everything at once, including the permission changes and background jobs. @satonotdead, you asked in the Mini-mod topic why Mini-mod kept running after you switched the bundle off. You were right, it did: code patched into core and scheduled jobs only checked their own switch. That’s fixed since September 24. Every module now checks the master switch too.- Turning things off never leaks anything. Switching whispers off doesn’t make an existing whisper public, for example.
- Each module is kept separate inside: its own file in
sub_plugins/, its own settings tab, its own docs page. If you only want one thing, fork it and split it out, go for it. The old standalone Mini-mod repo is archived, and this is where it’s maintained now.
What’s inside
Each one is folded up, so open whatever looks interesting. Every picture is a real screen from our forum unless it says otherwise. Private stuff (staff chat, contact details, mod notes) is blurred.
Dumbcourse: the whole forum on a flip phone
The whole forum at /dumb, for flip phones, KaiOS and old Android browsers that can’t run the normal site. It’s driven by the D-pad and keypad like the phone’s own apps, and still works with touch and a mouse.
- Reading: Latest, New, Unread, Top, Hot, categories and tags. ↑↓ reads (a long post scrolls before focus moves on), ←→ switches tabs, unread topics open at your first unread post, and Back takes you exactly where you were.
- Doing: OK on a post opens like, react, reply, quote, bookmark, edit, flag, copy link, every link in the post, spoilers and its pictures. There’s a full-screen composer with mentions, emoji, uploads, preview and optional spell check (LanguageTool).
- Keys:
*menu,#search,0help,3reply,5like,2/8page up and down. Phones that name their soft keys weirdly can be taught them in Preferences. - Signing in without typing a password on a keypad: approve the phone from a device you’re already signed in on, or use an emailed link or code. Social logins and 2FA work too.
- Old browsers find it by themselves. A browser that can’t run the full forum gets sent to the matching Dumbcourse page, including from links in emails. Search engines don’t get redirected.
- It’s plain ES5, and CI checks that it keeps working on Chrome 30, Firefox 30 and Android 4.4.
Since the name came up last time: the path is a setting (dumbcourse_base_path), so /simple or /lite is one change away.
We also have an Android app that wraps Dumbcourse for keypad phones, with push notifications. It’s set up for our forum, but the code’s there if you want to build one for yours. Our members have been hammering on it in the app thread (450+ replies) and the last big refresh.
Moderator tools: whispers to chosen people, private notes, staff alerts
The whisper and the note in the middle row are from our docs, with made-up users. The rest is the real UI.
Whispers to specific people. People have been asking for this on Meta for years (letting the post author see a whisper, whispers for groups other than staff). Reply inside a topic to just a few users, a group, or everyone holding a badge. Only staff, the author and those people can see it. It doesn’t show up anywhere else: not in search, activity, emails, notifications, link previews, RSS, Dumbcourse or the Telegram bridge. Replies to a whisper stay private to the same people automatically, and a whisper never bumps the topic for anyone else. Staff can turn an existing post into a whisper or back, and every change goes in the staff log.
Private notes. A staff-only note on a topic, with a reply thread and a “seen by” row. New notes show in the bell and in a shield tab in the user menu, but only for staff who can actually see that topic.
Staff alerts. Get told when another staff member deletes a post, approves or rejects a queued post, or adds a note to a user or a flag. Each kind has its own switch.
Checklists and topic tools. A checklist new members tick before their first post (with a log of who accepted which version), checklists aimed at specific users or attached to one topic, a footer message under a topic, a pinned post copied to the bottom, reply approval for a single topic, a “before you post” note per category, and a badge picker for adding everyone with a badge to a PM.
The rule for all of it: moderators don’t see everything. A tool never shows a moderator a PM or a restricted category that core wouldn’t show them, and alerts only go to staff who can open what they point at.
REQ-PM: contact details instead of private messages
Our forum has no private messages, on purpose. So how do two members get in touch? They ask each other for contact details. (Our launch thread, if you want to see how members took it.)
- Press REQ-PM on someone’s user card, tick what you’d like (phone, WhatsApp, email, Telegram, Signal…), and send. There’s no text box, so it can’t turn into a back door for messages.
- They tick exactly which details you get. Either side can take back what they shared, at any time, silently. Saying no is silent too: the person who asked only ever sees “waiting” and then “expired”.
/reqpmholds your requests, your contacts (with Call / Text / Chat buttons), your own card and who you’ve shared with.- Privacy: values are encrypted at rest (AES-256-GCM) and only returned to their owner and the people the owner picked. There’s no admin screen for them, and the endpoints refuse API keys and impersonation.
Listing format: sale threads that stay tidy
A real listing from our phones-and-computers sale thread.
We have one big “phones and computers for sale” thread, and it used to be a mess of “still available?” and “DM me”. Now, in the topics you pick, every post has to be a listing in the thread’s format, or it’s turned away (with the reason) before it’s saved.
- Members get a Create listing button instead of Reply. It opens a form with a box for each section (item, quantity, condition, specs, pickup or shipping), choices to pick for condition, and the normal editor for pictures and notes.
- Listings show up as cards like the one above. The seller (or staff) can mark one sold, and then it fades and gets crossed out.
- No links to other sites. Phone numbers and emails are fine, and buyers use the seller’s REQ-PM button instead of replying.
- Staff are exempt, and old posts are left alone.
Disteleplus: a staff chat bridged both ways with Telegram
This one grew into a whole thing. Not all our staff had (or wanted) WhatsApp, and not everyone had Telegram either. So: a one-room chat inside Discourse that’s mirrored both ways with a Telegram group.
- In Discourse: a drawer or a full page with replies, edits, reactions, voice notes, polls, files, mentions, search, link previews and typing indicators. Message text is encrypted in the database. It doesn’t need the official Chat plugin.
- In Telegram: people you’ve linked post as their forum account and everyone else shows with their Telegram name. Optionally you can announce new forum posts into the group, and mirror the review queue into a Reports topic with Approve / Deny buttons that work for staff right there in Telegram.
- Setup takes about five minutes: make a bot with
@BotFather, add it to the group as admin, paste the token, press Register webhook.
If what you want is to bridge Discourse Chat channels to Telegram, look at Discourse-Telegram chat bridge or Discourse Chat Bridge (Telegram) instead. Ours is one staff room, without Chat.
The JTech theme (it ships with the plugin)
Our forum’s own theme now ships with the plugin. A rebuild installs it and keeps it up to date, but it’s never made the default. You turn it on yourself under Customize → Themes.
It’s black and white, with hairline borders, rounded corners and the Geist font. Light and dark are exact opposites, and there’s a softer JTech Dim for people who find OLED black too harsh.
- Topic cards instead of table rows, with the first picture beside the title and Quick look to read a topic without leaving the list.
- A command menu on ⌘K / Ctrl+K that jumps to pages, categories, topics and people, with keyboard shortcuts listed beside each command.
- A front-page banner with a planet of dots that turns, follows your mouse and stays still for anyone who asks their device for reduced motion. Plus a redesigned header, sidebar, profiles, user cards, login page and about page.
- It replaces about a dozen theme components we used to run, each now a setting: reader mode, a table of contents for guides, a print/PDF button, a QR code in Share, voice messages from the composer, post badges, a Copy-as-Markdown button, a replies filter, search from selected text, the closed-topic reply warning, and more. Our forum now runs with zero theme components.
- We spent a silly amount of time on accessibility: WCAG AA contrast on grey text in all three palettes, focus rings you can actually see on every control, bigger tap targets on phones, Windows high contrast mode, right-to-left languages, and 320px-wide phones.
The smaller ones: Mini-mod, Dislike, smart search, pop-ups, Another SMTP, translator
Desktop pop-ups (from our docs, made-up users).
- Mini-mod. A few extra rights for people who moderate one category through a group: creating and editing categories, moving topics in, tags. Each right has its own switch, and none of them reach past what that person can already see. It can also take rights away, like reopening closed topics. @ars18’s original topic has more, and here’s the kind of request it answers.
- Dislike. In the categories you choose, likes stop counting: no notification, no “likes received” history, and they don’t count on the leaderboard. You can also hide the button there completely, or only let some groups like.
- Smart search. When a search finds almost nothing, it quietly tries again with synonyms, so “k8s” finds “kubernetes” and “js” finds “javascript”. It uses WordNet plus a small tech-jargon list, runs in-process with no API keys, keeps every filter and permission, and falls back to normal search if anything goes wrong.
- Desktop pop-ups. A small card in the corner when a notification comes in. Each member opts in, it’s quiet during Do Not Disturb, and it works with a keyboard and screen reader.
- Another SMTP. Send forum email through a different mail server than the one in
app.yml, set from the admin. - Translator tweaks. For sites still on the old discourse-translator plugin with Google: point its requests at your own proxy.
Installing
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/TripleU613/JtechTools.git jtech-tools
Keep the folder name jtech-tools, lowercase. Discourse builds the stylesheet URL from it.
Then rebuild and go to Admin → Plugins → Jtech Tools. There’s one tab per module, and each module’s docs page says what to set first.
We track main on Discourse 2026.8 and newer, and .discourse-compatibility pins older versions. The CHANGELOG says what changed and anything worth checking after an update.
Being honest about it
We’re a forum’s admin team, not a Discourse shop. A fair amount of this was built with AI help. What makes me OK sharing it is the guard rails: rules in the repo that every change has to follow (permissions first, never reach past what core allows, nothing core already does), about 1,700 tests across 119 spec files that run on every PR, and most of it running on our own forum every day. There will still be bugs and odd edge cases. Please tell us when you find one.
Issues and PRs are very welcome on GitHub. Security problems go privately through SECURITY.md.
Thanks to @ars18 and Shalom Karr, who built a big chunk of this with me, to everyone on JTech who reported bugs and tried half-finished things, and to the people in the Dumbcourse and Mini-mod threads whose questions made it better.
enjoy ![]()









