A Discord bot that monitors company career pages for new job postings and delivers daily digests to your server. Built with Botpress ADK.
Wuffin watches career pages you care about, scrapes them daily, uses AI to validate and extract job details (title, summary, experience level), and sends a formatted digest to a Discord channel every morning. You can also search stored jobs using natural language right in Discord.
- Career Page Monitoring — Add any company's careers page and Wuffin will track it for new postings
- Daily Digest — Automated scan at 9 AM with results posted to Discord
#general - Keyword Filtering — Only get notified about jobs matching your keywords
- Natural Language Search — Ask questions like "Any new backend roles?" in
#generaland get results from the database - Discord Commands — Manage everything from a
#add-linkchannel
| Command | Description |
|---|---|
/add <company> <url> |
Add a career page to the watchlist |
/remove <company> |
Stop monitoring a company |
/list |
Show all monitored sites |
/sync |
Manually trigger a full scan |
/addkw <keyword> |
Add a keyword filter |
/rmkw <keyword> |
Remove a keyword filter |
/keywords |
List active keyword filters |
/help |
Show available commands |
- You add a career page via
/addin the#add-linkDiscord channel - Wuffin seeds the site by fetching the page and storing all job links
- Every day at 9 AM, a scheduled workflow scans all watched sites
- New links are parsed by AI (GPT-4o-mini) to extract job title, summary, and experience level
- Results are filtered by your keyword preferences and posted as a digest to
#general - You can ask natural language questions about jobs anytime in
#general
wuffinBot/
├── agent.config.ts # Bot config (integrations, models, state)
├── package.json
└── src/
├── actions/ # Reusable bot functions
│ ├── addWatchedSite.ts # Add site to watchlist
│ └── postToConversation.ts # Send messages to Discord channels
├── conversations/ # Message handlers
│ ├── discord.ts # Main Discord command & search handler
│ └── index.ts # Fallback handler for other channels
├── tables/ # Database schemas
│ ├── WatchedSitesTable.ts # Monitored career page URLs
│ ├── LinksTable.ts # All discovered job postings
│ ├── KeywordsTable.ts # Keyword filters
│ └── DailyNewJobsTable.ts # Today's new jobs (cleared each scan)
├── utils/ # Shared logic
│ ├── scanSites.ts # Core scanning & AI parsing
│ └── extractJobLinks.ts # Regex link extraction from HTML
└── workflows/ # Scheduled & background tasks
├── jobScanner.ts # Daily 9 AM scan workflow
└── seedSite.ts # Initial site seeding on /add
Channels must be registered before the bot responds to commands in them. The general channel is the only exception — it's hardcoded and always active as a conversational AI chatbot.
In the channel you want to register, send:
@wuffin /regist-channel:<type>
The bot verifies it was actually mentioned (not another user or role) by comparing the mention ID against its own Discord user ID. If they match, the channel is registered.
Examples:
@wuffin /regist-channel:add-link
@wuffin /regist-channel:insight
| Type | Purpose |
|---|---|
add-link |
Manage watched career pages. Supports /add, /remove, /list, /sync, /addkw, /rmkw, /keywords, /help. |
insight |
Receives the daily job digest and supports /insight to post it on demand. |
- A channel can only be registered once. Attempting to re-register replies with:
⛔ This channel is already registered as <type>. Please contact admin to change it. - Unregistered channels are completely ignored.
- The general channel is never registered via this system.
To confirm the bot is online and check its Discord user ID:
@wuffin /debug
The bot replies with meRes parsed bot id = <id>.
- Node.js (v18+)
- Bun (recommended) or npm/yarn/pnpm
- Botpress ADK CLI — install with
npm install -g @botpress/adk - A Botpress Cloud account
- A Discord bot token
-
Clone the repository
git clone https://github.com/your-username/Wuffin.git cd Wuffin/wuffinBot -
Install dependencies
bun install
-
Log in to Botpress
adk login
-
Link to your Botpress workspace
If this is a fresh setup, link the bot to your workspace and bot:
adk link
Follow the prompts to select your workspace and bot.
-
Configure Discord
Update the Discord bot token in
agent.config.tsunder thediscordintegration config. You'll also need to update the channel IDs insrc/conversations/discord.tsto match your server's channels. -
Start the development server
adk dev
This starts the bot in dev mode, syncing changes automatically with Botpress Cloud.
To deploy the bot to production:
adk deployThis pushes the bot to Botpress Cloud where it runs 24/7 with the scheduled daily scan.