Recurring payments drain money quietly. The gym membership from February, the 2TB cloud plan holding 180GB, the family streaming tier after the kids moved out. Bank apps already list the transactions; the pain is noticing in time, with a recommendation ready when you do.
Renewal Radar is a quiet watchdog for exactly that. It runs on a schedule, scans a 14 day decision window, and only surfaces when a renewal actually needs a decision. It never cancels, pays or changes anything itself: every consequential action is a proposal that waits for human approval.
- Watches recurring payments from a simple JSON state file (renewals.json), maintained by you or an export script.
- For each renewal inside the window, a Strands agent makes exactly one focused judgement call through exactly one tool: propose_action.
- Recommendations land in a proposal store (proposals.json). The digest is compiled from those records, never from model prose, so the report always matches what the agent actually did.
- The human approves or rejects each proposal from the CLI. There is no tool the agent can call to mark a decision, so no prompt injection or over-eager model can approve itself.
- Fully local: the agent brain is Qwen3-1.7B served by llama.cpp on the same box. It runs on a 2 core / 4 GB machine with zero cloud API keys. Your subscription list never leaves the machine.
Python orchestration (window scan, proposal store, digest) is deterministic; the Strands Agents SDK drives the judgement engine (LiteLLMModel -> llama.cpp OpenAI-compatible endpoint). 13 unit tests cover the proposal lifecycle. The demo video replays a transcript of a real run on the target hardware, including real judge timings.
Small local models are unreliable at long multi-turn bookkeeping, so the design leans into focused single-turn judgement instead of fighting it. Tool-call discipline (call exactly once per item) is enforced in the tool itself, not the prompt.
A money-adjacent agent whose report cannot drift from reality, because every number in the digest is read back from the record store the agent wrote to.
That the honest architecture for small models is to give them a small job: one renewal, one tool, one turn.
Optional bank-statement import, and a small notification surface (email/Telegram) for the digest.
Built With
- automation
- litellm
- llama-cpp
- local-llm
- python
- qwen3
- strands-agents
Log in or sign up for Devpost to join the conversation.