💡 Inspiration Millions of students and job seekers from underserved communities miss out on life-changing scholarships, fellowships, training bootcamps, and jobs simply because they don't know they exist or don't have the time to scan dozens of portals daily. We wanted to build a solution that brings these opportunities directly to where they already communicate and collaborate: Slack.

⚙️ What it does Opportunity Finder is a Slack-native AI agent that continuously monitors public web sources (via search engines and APIs) for new scholarships, jobs, internships, and fellowships.

It automatically scores new opportunities against team members' profiles (skills, interests, location). It delivers personalized, interactive cards to matched channels/DMs. The cards include one-click actions: View & Apply, Add to Calendar (sends thread reminders), and Share with Team (broadcasts to other channels). Users can query the agent on-demand via @opportunity_finder to instantly fetch up to 3 highly matched opportunities. 🛠️ How we built it Backend: Built with Python using the slack-bolt framework. Real-Time Integration: Integrated Google Custom Search Engine (CSE) API to scan live opportunity portals, with a high-fidelity local mockup database fallback. Matching Engine: Developed a multi-dimensional weighted matching algorithm that pairs opportunities against profile skills, location, and interests. Slack UI/UX: Designed clean, premium Block Kit layouts using interactive buttons, markdown formatting, and context sections. Scheduler: Created a background daemon (scheduler.py) that polls for opportunities and handles proactive alerts. 🚧 Challenges we ran into Plural vs. Singular Mismatches: Queries like "scholarships" failed to match "scholarship" in the database. We solved this by implementing a bidirectional prefix matching logic. Message Clutter: When multiple matches were found, the bot initially sent up to 5-6 status and card messages. We optimized the event handler to combine the header and the first card, strictly limiting the bot response to only 3 messages per query to keep the channel clean. Mention Stripping: The bot received the full mention string <@USERID> scholarships, which polluted search queries. We added regex sanitization to strip user IDs from the input. 🏆 Accomplishments that we're proud of Creating a highly interactive, non-spammy Slack experience. Achieving a robust search and matching system that yields precise recommendations. Designing actions like Add to Calendar and Share with Team which turn Slack from a simple chat app into an actionable workflow dashboard. 🧠 What we learned How to leverage Slack Block Kit actions and Socket Mode for rapid local development. Design patterns for building lightweight, scalable matching engines. The importance of keeping bot interaction footprints minimal and highly summarized. 🔮 What's next for Opportunity Finder LLM Personalization: Integrate Google Gemini to read long opportunity descriptions and generate custom application tips or resume pointers for users. Direct Profile Modals: Allow users to update their skills, location, and interests directly inside Slack using modal views. Expanded Crawlers: Integrate LinkedIn and government job board APIs for broader coverage.

Built With

  • google-custom-search-api
  • pytest
  • python
  • slack-bolt
  • slack-sdk
  • socket-mode
Share this project:

Updates

Submission history