Recurve AI — Project Story
Inspiration
We wanted an SDR that learns from its own mistakes and reacts to real-world events—not a static playbook. Recurve AI is that: it generates strategy from a product description, validates leads with live data, stores corrections in a graph, and refines itself—and can react to triggers like competitor outages.
What it does
You give it a product description (text or voice). It generates an ICP, keywords, and competitors (Tavily + SLM), stores strategy in Neo4j, and finds leads. Each lead is fact-checked and classified as Strike (pursue), Monitor (watch), or Disregard (skip). Disregards create Lesson nodes; the agent uses them to refine the next strategy. A scout can poll a status URL and, on change (e.g. outage), draft context-aware outreach for affected leads. The dashboard shows strategy, lead list, live activity feed, strategy timeline, and a knowledge graph of strategies, companies, evidence, and lessons.
How we built it
Frontend: React 19, TypeScript, Vite, Tailwind; WebSocket activity feed; react-force-graph-2d for the graph. Backend: FastAPI with REST + /api/ws/feed; background scout worker and async agent pipeline. Data: Neo4j for Strategy, Company, Evidence, Lesson and relationships. Services: Tavily (research + fact-check), Fastino Pioneer / Qwen3-8B (strategy, classification, pivot emails), Modulate (voice). Deployed on Render.
Challenges we ran into
Keeping SLM outputs and the agent loop consistent; making the UI feel live with one WebSocket feed and event-driven refresh; running the scout as a lifespan task and making the mock-outage demo reliable; designing the Neo4j schema for versioned strategies and lesson/evidence links.
Accomplishments that we're proud of
Self-improvement loop from product description → strategy → validation → lessons → refinement with no human in the loop. Graph as the brain: Neo4j powers a visible knowledge graph. Trigger-based pivots when the scout sees status changes. Voice input for product description. Clear split between API, agent logic, and dashboard.
What we learned
Storing corrections in a graph (Lesson/Evidence, EVOLVED_FROM) makes the agent auditable and gives a clean input for refinement. A single WebSocket feed plus event-driven refresh beats polling. Background workers in FastAPI need careful lifespan and error handling.
What's next for Recurve AI
Richer lead discovery from the ICP; more trigger types (funding, hiring, tech changes); sending drafted pivot emails; multi-product and strategy A/B tests; production hardening (rate limits, retries, observability).
Built With
- fastapi
- fastino
- modulate
- neo4j
- python
- react
- render
- tailwindcss
- tavily
- typescript
Log in or sign up for Devpost to join the conversation.