Inspiration
Students and young graduates often miss valuable opportunities because information is scattered across hundreds of websites, platforms, and communities. Hackathons, internships, fellowships, scholarships, conferences, and certifications are published in different formats and with different deadlines.
We wanted to build a personal agent that could continuously monitor these sources, understand the user's profile, remove irrelevant results, and highlight the opportunities that matter most.
What it does
Recal is an AI-powered opportunity radar for students and young graduates.
It discovers new opportunities across the web, including hackathons, internships, fellowships, scholarships, conferences, and certifications. It analyzes each opportunity with Claude Haiku 4.5, scores its relevance according to the user's profile, explains why it matches, removes duplicate results, and stores the results for later use.
Users can configure their profile and watch preferences, save or pass on opportunities, and consult personalized results through a desktop Electron application. Recal also supports English and French interfaces, light and dark themes, and offline access to recently synchronized opportunities.
How we built it
Recal uses a serverless AWS architecture combined with a desktop application.
The backend is built with Python, FastAPI, Pydantic, and a hexagonal architecture. Amazon EventBridge Scheduler triggers the scheduled watch, which is executed by AWS Lambda. The Lambda worker uses the Strands Agents SDK to orchestrate the opportunity discovery workflow. Strands coordinates web search with Parallel Search, structured opportunity analysis with Claude Haiku 4.5 through Amazon Bedrock, relevance scoring, deduplication, and persistence in DynamoDB.
Opportunities, profiles, runs, and watch states are stored in Amazon DynamoDB. Amazon SQS is used as a dead-letter queue for failed scheduled executions.
The desktop client is built with Electron, React, Vite, TypeScript, and Tailwind CSS. It communicates with the backend through a versioned REST API.
The project also includes automated tests, Ruff, Mypy, dependency scanning, secret scanning, and AWS SAM infrastructure as code.
Challenges we ran into
One of the main challenges was creating a reliable pipeline from unstructured web pages to useful, structured opportunities. Search results can vary between runs, and many pages are aggregators, incomplete listings, or irrelevant content.
We addressed this with domain filtering, validation, deduplication, relevance scoring, and structured AI analysis orchestrated by Strands Agents.
Deploying the system to AWS also required solving several infrastructure challenges, including Lambda packaging, Docker-based SAM builds on Windows, IAM permissions, Bedrock inference profiles, and DynamoDB's requirement to serialize numbers as Decimal values.
We also had to design the application so that the frontend never contains AWS, Bedrock, or search-provider secrets. The backend remains responsible for validation, scoring, deduplication, access control, and cloud integrations.
Accomplishments that we're proud of
We are proud to have built and validated a complete end-to-end MVP rather than only a prototype.
The deployed system can run a scheduled watch cycle in AWS, use Strands Agents to orchestrate the workflow, search for real opportunities, analyze them with Claude Haiku 4.5 through Amazon Bedrock, calculate relevance scores, remove duplicates, persist results in DynamoDB, expose them through a FastAPI API, and display them in a working Electron application.
We are also proud of the user experience, including onboarding, profile configuration, bilingual support, saved opportunities, offline cache, light and dark themes, notifications, and explainable relevance scores.
The infrastructure is reproducible through AWS SAM, and the project includes automated quality checks and security controls.
What we learned
We learned that building an AI agent is not only about connecting a language model to a search API. The most important work is designing the surrounding system: validation, domain rules, structured outputs, deduplication, persistence, quotas, observability, security, and user experience.
We also learned how important it is to keep the AI layer replaceable. Recal can use a local heuristic analyzer for development and testing, or Strands Agents with Claude through Bedrock for real analysis. This makes the domain and application logic testable without requiring AWS for every local run.
Finally, we learned that a good opportunity product must optimize for trust. Users need to know where an opportunity came from, why it is relevant, and whether they can still act on it.
What's next for Recal
The next step is to strengthen the product for broader use.
Planned improvements include complete user authentication and resource-level authorization, a production-ready shared rate limiter, improved search stability and source quality, richer notification channels, automated AWS integration tests, and stronger Electron security with CSP, signed builds, and secure auto-updates.
We also plan to add better opportunity tracking from discovery to application, deadline reminders, richer analytics about watch quality and user preferences, and support for more regions, languages, and opportunity sources.
Our long-term goal is to make Recal a trusted personal opportunity assistant that helps more students discover and act on opportunities they would otherwise miss.
Built With
- amazon-web-services
- bedrock
- css
- html
- json
- mermaid
- opencode
- python
- strands
- typescript
- yaml
Log in or sign up for Devpost to join the conversation.