Inspiration

Savings circles (known as chama, susu, ROSCA and many other names) move real money across the world on one thing: trust. In practice, trust means one person’s notebook and everyone’s memory. Someone says “I sent it”, someone else says “I never got it”, and there’s no neutral record to settle it.

What it does

Serion is a voice-first treasurer for savings circles. Two-sided confirmation: “I paid John 7000” creates a pending claim, and it becomes real only when the receiver confirms it. A payer can never confirm their own payment. Partial payments: if John got only 3000 of the 7000, Serion confirms 30 and tracks the missing 20 as a new pending claim. Nothing is rounded up or lost. Payout forecasting: before payout day, it compares confirmed payments against the whole roster, and shows how much is covered and who still owes. Private ballots: loan requests go to a vote. Serion records every vote and blocks double voting, but never reveals how anyone voted, only the totals and the outcome. Receipt parsing: paste a mobile money message and it reads the amount and sender, then checks with you before logging it.

How we built it

Agent: a Strands Agents SDK agent running on Gemini, with 10 tools: log_payment, confirm_payment, check_status, check_payout_forecast, open_ballot, cast_ballot, check_ballot_result, explain_rule, cycle_report and parse_receipt_text. Ledger: a plain SQLite database behind simple Python functions. The agent never touches the database directly, only through the tools. App: Flask with a single Jinja page. It has a landing screen, an identity step, and a chat with dashboards for the ledger, payout forecast and ballots. The confirm and vote buttons call the ledger directly and bypass the AI. Rules as data: each cycle stores its own late fine, loan cap and vote threshold, so a ballot’s outcome comes from the circle’s rules, not a hardcoded majority. Alexa+ framing: the web chat simulates the Alexa+ experience, and the agent and its tools are what a real Alexa+ skill would call.

Challenges we ran into

Making the rules unbreakable. An AI can be talked into things, so a prompt alone wasn’t enough for “never reveal a vote” or “only the receiver confirms”. The ledger code enforces these rules itself, and the vote functions only ever return totals. Partial payments. Our first forecast treated anyone with any confirmed payment as fully paid. A test (test_day7.py) caught that a partly paid member was wrongly marked as done, so we split the original claim into a confirmed part and a pending remainder, and the forecast now compares against each member’s full share. Duplicate claims. A retried request could log the same payment twice, so we added a 30-second duplicate guard. Free-tier limits. Gemini’s free tier sometimes returns busy or quota errors. We fail fast with a clear message on quota limits and retry only on temporary overload. Name matching. The ledger compares names exactly, so “ana” and “Ana” are different people to it, which we had to account for in the interface

What we learned

Put trust-critical rules in code that can be tested, and use the AI to understand what people say. Small tests on the ledger caught real bugs that conversation testing never would. A good interface matters for trust too. Showing the ledger and pending claims next to the chat makes the agent’s actions visible and checkable. Voice-first is a design decision. Short, direct replies suit a speaking assistant much better than long chatbot answers.

What's next for Serion.

Real Alexa+ voice input and output through an MCP skill Multiple circles and cycles An LLM-based receipt parser to replace the regex one Showing the agent’s real tool calls in the interface as they happen

Built With

Share this project:

Updates

Submission history