KELS Curator Bot is a Discord community curator for Korean edtech and learning sciences researchers. It indexes useful public channel posts, supports private slash-command search and digests, posts research-resource recommendations, assists onboarding, and helps moderators keep the server clean.
The bot is designed for the Korean Edutech/Learning Sciences Researcher Network workflow, but the architecture is reusable for other research communities that need lightweight curation, archive Q&A, event reminders, and academic-resource discovery.
- Private slash commands for
/digest,/search,/deadlines,/ask-kels,/watch,/profile,/cfp-helper,/topic-digest,/field-map,/venue-scout,/review,/add-venue,/field-pulse, and/anon-submit. - Public weekly article recommendation from OpenAlex, limited to JLS, IJCSCL, ETR&D, Instructional Science, and Cognition and Instruction.
- KELS reading guide for recommended articles, including problem, contribution, method, KELS research application, reading lens, issue-taking topic, discussion questions, and a participation prompt.
- KELS Tech Signal that compares recent arXiv tech papers and high-signal GitHub repositories, then posts one item with fixed sections for why now, educational technology use, learning sciences use, discussion, and a participation prompt.
- FieldExplorer 1.0 bridge that positions a topic, abstract, CFP, or project idea against the latest
Educatian/fieldexplorer1.0venue/category map, links to the public app, and connects results back to related KELS archive originals. The bridge now adds:- Live verified CFP in
/cfp-helper: appends FieldExplorer's verified deadlines (D-day, official source URL, verified date) from Supabase, plus proactive D-30/14/7/1 deadline alerts to a channel. - Submission-fit scorecard in
/venue-scout: ranks venues for a pasted abstract by topic-fingerprint cosine, methodology-culture fit, and CFP readiness (the same scorer the app uses). /reviewwrite-bridge: posts a venue review straight into FieldExplorer's review feed./add-venuewrite-bridge: adds a new journal/conference to FieldExplorer (approved community venues merge into the app graph).
- Live verified CFP in
- Venue Scout that turns an abstract or project idea into strong/adjacent/exploratory journal and conference lanes, with framing guidance and related KELS originals.
- Field Pulse that summarizes recent KELS activity as community signals, FieldExplorer category positions, bridge opportunities, and discussion seeds.
- Community intelligence layer that builds a lightweight activity graph, tracks curation feedback from reactions and slash-command demand, and suggests profile topics from member activity.
- Learning experience scaffolds for stage-based pathways, weekly micro-challenges, reflection prompts, better question asking, paper reading coaching, and organizer-only peer-learning matches.
- Anonymous advice workflow where members privately submit concerns, moderators approve or reject in an admin channel, and approved items are posted without author identity to a dedicated advice channel.
- Announcement event automation that detects date/time/timezone plus Zoom, RSVP, and Google Form links; posts D-1 and one-hour
@everyonereminders; and opens follow-up threads after events end. - Monthly Knowledge Flow that summarizes community pulse, emerging topics, cross-channel knowledge bridges, evidence posts, and participation nudges.
- Automatic community reactions that add the KELS custom emoji and a like emoji to indexed member posts and thread replies.
- Personal watchlists and profiles for keyword and interest-topic DM alerts, plus recent related KELS originals that connect the member’s interests to the archive.
- KELS Archive Q&A powered by local Qwen/Ollama when enabled, with source links, channel/date evidence, relevance scores, related originals, and weak-evidence warnings.
- Personalized onboarding pathway that extracts the real full name, interests, affiliation/stage, and what the member is looking for, then creates a
Full Name 님thread with related originals, participation targets, first-comment drafts, and a one-week follow-up. - Role-tagging assistance with confidence thresholds, moderator review for ambiguous matches, and hard blocks for admin and communication-officer roles.
- Spam cleanup for obvious invite floods, free-Nitro scams, excessive URLs, excessive mentions, and repeated-message bursts.
- Optional Cloudflare Worker/D1 logging for bot interaction logs.
flowchart LR
Discord["Discord Server"] --> Bot["KELS Curator Bot"]
Bot --> Store["JSON Store<br/>posts, state, watchlists, profiles"]
Bot --> Qwen["Local Qwen/Ollama<br/>optional"]
Bot --> OpenAlex["OpenAlex API"]
Bot --> Arxiv["arXiv API"]
Bot --> GitHub["GitHub Search API"]
Bot --> Cloudflare["Cloudflare Worker + D1<br/>optional logs"]
Store --> Slash["Private Slash Commands"]
Store --> Schedules["Scheduled Public Posts"]
Qwen --> Slash
Qwen --> Schedules
OpenAlex --> Schedules
Arxiv --> Schedules
GitHub --> Schedules
More detail is in docs/ARCHITECTURE.md.
src/
index.js Discord client, event handlers, schedulers
commands.js Slash command definitions
config.js Environment configuration
connections.js Interest-to-archive connection suggestions
storage.js JSON-backed local data store
extractors.js URL/date/time/category/tag extraction
format.js Discord embed and message formatting
qwen.js Local Qwen/Ollama prompts and fallbacks
openalex.js OpenAlex article recommendation source
arxiv.js arXiv Tech Signal source
github-repos.js GitHub repository Tech Signal source
knowledge-flow.js Monthly topic flow and participation analysis
field-explorer.js Field-map topic loading and positioning
relevance.js Archive relevance and evidence ranking
moderation.js Spam detection
logger.js Local and optional Cloudflare logging
onboarding-pathway.js Personalized onboarding intervention logic
scripts/ Setup, diagnostics, one-shot posting, role utilities
docs/ Feature guide and architecture documentation
cloudflare/ Optional Worker/D1 logging service
test/ Vitest unit tests
- Create a Discord application and bot in the Discord Developer Portal.
- Enable Message Content Intent if you want automatic message indexing.
- Invite the bot with:
- Scopes:
bot,applications.commands - Permissions: read messages, send messages, create public threads, send in threads, manage messages, add reactions, use slash commands
- Scopes:
- Copy
.env.exampleto.envand fill in the required values:DISCORD_TOKENDISCORD_CLIENT_IDDISCORD_GUILD_ID
- Install dependencies and register slash commands:
npm.cmd install
npm.cmd run register
npm.cmd startnpm.cmd run doctor
npm.cmd run setup:check
npm.cmd run channels:list
npm.cmd run channels:verify
npm.cmd run knowledge-flow:demo
npm.cmd run article:demo
npm.cmd run tech-signal:demoManual public test posts:
npm.cmd run article:post
npm.cmd run tech-signal:postWindows background operation:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\start-bot.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\status-bot.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\stop-bot.ps1The main configuration groups are:
DISCORD_*: bot identity and target guild.INDEX_CHANNELS: public channels/forums to archive.AUTO_REACT_*: automatic KELS and like reactions for indexed member posts and thread replies.ARTICLE_DIGEST_*: weekly OpenAlex article recommendation.TECH_SIGNAL_*: weekly arXiv-vs-GitHub tech signal.FIELD_EXPLORER_*: optional FieldExplorer 1.0 integration.FIELD_EXPLORER_ENABLED/FIELD_EXPLORER_TOPICS_FILE/FIELD_EXPLORER_APP_URL: base/field-mapmap source (src/data/venues.json, older embeddedindex.tsxdata,Name,Type,CategoryCSV, or BERTopic CSV).FIELD_EXPLORER_CFP_ENABLED+FIELD_EXPLORER_SUPABASE_URL+FIELD_EXPLORER_SUPABASE_KEY(anon): live verified CFP in/cfp-helper.FIELD_EXPLORER_CFP_ALERT_*adds proactive deadline alerts to a channel.FIELD_EXPLORER_SCORECARD_ENABLED+FIELD_EXPLORER_PROFILES_FILE: submission-fit scorecard in/venue-scout(point at the app'ssemantic_profiles.json).FIELD_EXPLORER_REVIEW_ENABLED/FIELD_EXPLORER_ADD_VENUE_ENABLED+FIELD_EXPLORER_SUPABASE_SERVICE_KEY:/reviewand/add-venuewrite-bridges (service-role; the target tables have no anon insert policy)./add-venueneeds thecommunity_venuestable (supabase-community-venues.sqlin the FieldExplorer repo).
MONTHLY_RADAR_*: monthly public Knowledge Flow summary.DEADLINE_REMINDER_*: D-14/D-7/D-2 deadline reminders.EVENT_REMINDER_*:@everyoneone-hour reminders, D-1 reminders, event links, and follow-up threads for timed announcement events.QWEN_*: local Ollama/Qwen enhancement.ROLE_*: role-tagging behavior and safeguards.ONBOARDING_*: self-introduction pathway automation and one-week follow-up.SPAM_*: automatic spam deletion thresholds.ANON_ADVICE_*: anonymous advice submission, moderator review, and public anonymous posting.KELS_LOG_*: optional Cloudflare logging endpoint.
Never commit .env, local data/, logs/, bot PID files, or Cloudflare .dev.vars.
- Slash command replies are private by default.
- Public posts are limited to configured automated curation and reminder workflows.
- The bot indexes only configured public channels/forums.
- Admin, moderator, and communication-officer style roles are blocked from automatic creation or assignment.
- Cloudflare logging is optional and should be configured only after the community understands what is logged.
npm.cmd run lint
npm.cmd test
npm.cmd run doctor
npm.cmd audit --jsonCurrent test suite: Vitest unit tests for extractors, storage, commands, OpenAlex, arXiv, Qwen helpers, moderation, and configuration.

