Writing the story now — then we need to fix something before you deploy, or the live Vercel link will show an empty dashboard.
## Inspiration
I've had a SaaS subscription auto-renew on me at a worse price more than once, and each time it's the same story: the notice period passed while I wasn't looking, and by the time I noticed, I was locked into another year. Leases, employment contracts, NDAs, they all have the same trap buried somewhere in the fine print. Nobody re-reads a 20-page contract 30 days before a deadline just to check. I wanted an agent that actually does that job instead of pretending a dashboard reminder counts as reading the contract.
What it does
Contract Watchdog reviews every contract you hold, vendor agreements, leases, employment contracts, NDAs, and decides on its own whether anything needs your attention. It checks upcoming notice deadlines, flags price increases, and scans for risky clause language specific to each contract type (a non-compete matters for employment, a security deposit clause matters for a lease, they're not the same risk). If something's genuinely worth flagging, it drafts a renegotiation or cancellation email and pings you. If it's routine, it stays quiet. That's the whole point: most agents demo well because they respond to you. This one has to prove it knows when not to.
It also remembers. Run it twice and it won't re-flag something it already told you about, the cooldown logic lives in the tool itself, not just a prompt asking the model to behave.
How I built it
Backend's the Strands Agents SDK, Python, model-agnostic (Gemini by default, Bedrock or a local model as drop-ins). Six tools: load contracts, scan for renewal windows, check price deltas, scan for risky clauses, draft the email, and the one tool that actually interrupts a human. Everything upstream of that last tool is invisible background work by design.
The dashboard's a separate Next.js app that reads the agent's real output straight off disk, no mock data anywhere in it.
Challenges I ran into
The honest one: I built a memory system so the agent wouldn't re-notify on something already flagged, tested it, and it failed. Not the code, the model. It saw the prior decision, ignored it, and then explained afterward why re-notifying was fine, which wasn't true. I'd trusted a prompt instruction to hold up something that actually mattered, and it didn't. Fixed it by moving the check into the tool itself, so the notification gets blocked in code regardless of what the model decides to reason its way into. Re-tested it live, twice, before I trusted it again.
Second one was smaller but taught me the same lesson: I hand-built a UI as an artifact, and every click I tested seemed to randomly fail. Took a while to realize the buttons just had no padding, the clickable area was exactly the width of the text. Not a framework bug, just bad hit-boxes. Rebuilt the hit areas, rebuilt the whole frontend as a real Next.js app while I was at it.
Built With
- agentic-ai
- ai-agents
- amazon-bedrock
- amazon-web-services
- autonomous-agents
- contract-management
- google-gemini
- legal-tech
- llm
- next.js
- node.js
- pytest
- python
- react
- strands-agents-sdk
- tailwindcss
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.