Inspiration

Everyone has 6–15 recurring subscriptions — streaming, gym memberships, meal kits, cloud storage, software tools. Prices creep up a dollar or two at a time, free trials silently convert to paid plans, and things like gym memberships keep renewing for months after you've stopped using them. Nobody wants to open every account every month and audit it by hand, so it just never happens — and it quietly costs real money. When I saw the Everyday Agents track, this felt like the perfect fit: not another dashboard to check, but an agent that does the checking for you and only interrupts you when there's an actual decision to make.

What it does

QuietBills reviews your recurring subscriptions in the background and applies one rule: stay silent unless something needs a real human judgment call. A subscription gets flagged only if it meets one of:

  • A price hike at renewal of roughly $\geq 10\%$ over recent history: $$ \frac{P_{\text{renewal}} - P_{\text{previous}}}{P_{\text{previous}}} \geq 0.10 $$
  • No usage in $\geq 45$ days with a renewal approaching
  • A renewal within 3 days combined with either condition above

When a subscription is flagged, QuietBills estimates the dollar impact of acting on it. For a cancellation, that's simply the full monthly price, $S = P_{\text{current}}$. For a negotiation or downgrade, it's the gap to the cheaper option found, $S = P_{\text{current}} - P_{\text{target}}$. It then drafts the actual cancellation email or negotiation script, so acting on the recommendation takes seconds instead of a phone call you'd keep putting off. It also remembers what you've already decided, so a dismissed issue doesn't get re-flagged unless the situation genuinely changes. for example :-[FitPulse Gym App] Why: The FitPulse Gym App hasn't been used in 97 days and it will renew in 2 days. Recommended: cancel Potential savings: $14.99/month Draft ready: Subject: Cancel my FitPulse Gym App subscription

Hi,

Please cancel my FitPulse Gym App subscription effective at the end of
the current billing period. Reason: I no longer use the service and
would like to cancel.

Please confirm the cancellation and the date my access ends.

Thanks.

How I built it

I built QuietBills with the Strands Agents SDK in Python. The agent has eight narrow tools — checking price history, computing days until renewal, recalling prior decisions, looking up cheaper alternatives, drafting messages — and exactly one, flag_for_user, that is allowed to produce user-visible output. That boundary is what enforces the "quiet by default" behavior: it's not a UI filter bolted on afterward, it's a hard constraint on what the agent is permitted to do.

On top of a CLI (scan, chat, decide), I built a small Streamlit dashboard so a flagged item can be approved or dismissed with a click, with that decision persisted to disk (decision_state.json) so future scans respect it. I also unit-tested the tool layer directly — independent of any live model call — so the core decision logic is verifiable without needing API access at all.

Challenges I ran into

The biggest challenges were entirely about model access, not the agent logic itself:

  • My AWS account had Bedrock's model-invocation API blocked at the account level — ListFoundationModels worked, but Converse/InvokeModel returned Operation not allowed across every model and region I tried. This is common on training/sandbox AWS accounts. I solved it by making the model provider swappable via an environment variable, adding direct support for Anthropic's API and for Groq's OpenAI-compatible endpoint.
  • Free-tier rate limits became the real fight after that: Groq's daily token cap ($200{,}000$ tokens/day) got exhausted from iterative testing, and a "new" free account didn't help — it turned out to share the same underlying organization quota rather than granting a fresh one.
  • I added retry-with-backoff for transient throttling and bounded the concurrency of parallel subscription reviews so they wouldn't blow past Groq's per-minute cap, and ultimately cut a slower feature (a second nested AI call for live market-price estimation) once real-world latency showed it roughly doubled every request's cost for marginal benefit.

It was a good lesson in designing for the actual constraints of the infrastructure you're shipping against, not just the happy path.

What I learned

Building the agent's reasoning and tools was the easy part — the real engineering problem was making a multi-provider, rate-limit-aware system that degrades gracefully (skip one failed subscription, keep going) instead of crashing the whole run when a single API call fails. I also learned to keep automated tests fully isolated from an app's live runtime state, after my own test suite accidentally overwrote real decision data by sharing a file path with production.

Built With

  • agentic-ai
  • agentsforhumans
  • ai-agent
  • amazon-web-services
  • anthropic
  • automation
  • autonomous-agent
  • background-agent
  • budgeting
  • claude
  • cli-tool
  • everyday-agents
  • fintech
  • groq
  • hackathon
  • llm
  • personal-finance
  • price-tracking
  • python
  • savings
  • strands-agents
  • streamlit
  • subscription-management
  • tool-use
Share this project:

Updates

Submission history