Inspiration

“I’ll pay you back” is easy to say and easy to forget.

People cover lunch for their friends, buy tickets together, and lend out things like chargers or hoodies. Keeping track usually means searching through messages or trying to remember who paid for what.

Then you have to bring it up in person. Asking once is fine. Asking the same friend three times gets annoying.

That gave us the idea for IOU. We wanted somewhere to keep those records, with reminders that could sound friendly, playful, or serious depending on the situation.

What it does

IOU tracks money and items that friends borrow. You can record what someone owes, set a due date, and log repayments or returned items. If someone pays back part of a loan, you can see exactly how much is left.

The statistics page shows past payments and repayment progress. You can click a payment on the graph or in the history to open its receipt.

Our favorite feature is choosing the tone of a reminder. Users can pick Friendly, Playful, or Direct but polite, then preview and approve an email before sending it. It gives people a way to follow up without having to have the same conversation every time they see their friend.

We also added optional interest, late fees, and fictional reliability scores. IOU keeps records of payments, but it does not move money.

How we built it

We started with the HackAtUCI starter project. The frontend uses React and Vite, with Iosevka typography and a mint and emerald color theme.

We built the backend with Python and FastAPI and used PostgreSQL to store contacts, loans, and payment records. Supabase handles sign in. The backend checks which user owns each record before allowing access.

We store amounts in cents so money calculations stay accurate. We also give each repayment request a unique key so retrying a request does not accidentally record the same payment twice.

Email reminders use the Gmail API. We built preset message templates that fill in the borrowing details, followed by a preview and approval step before sending.

Challenges we ran into

A repayment changes more than one number. It needs to update the balance, payment history, graph, and progress indicator. Getting those parts to agree took more work than we initially expected.

Partial payments and corrections also made things more complicated. We needed to let people fix mistakes while keeping a record of what changed.

Email was another challenge. We had to think about recipient permission, duplicate sends, and what happens when a request fails without a clear delivery result.

We also worked on different branches, so combining our work sometimes meant resolving conflicts and fixing pages that had drifted into different styles.

Accomplishments that we're proud of

We are proud that we built more than a page that lists debts. Users can inspect receipts, track repayment progress, choose a reminder tone, and record payments.

We enjoyed adding personality to the app, especially the playful reminders and the celebration when someone pays off their balance.

We also spent time on things that are less obvious during a demo, like preventing duplicate payments, keeping records private, and testing what happens when something goes wrong.

What we learned

We learned how many details sit behind something that looks simple on screen. Showing a remaining balance is easy. Making sure it stays correct after partial payments, retries, and corrections takes more thought.

We also got a better understanding of how the frontend, backend, authentication, and database fit together. A feature working with demo data does not automatically mean the whole live flow works.

Working as a team taught us to agree on API responses and shared styles earlier. That would have saved us some integration work toward the end.

What's next for IOU

We want to test the full hosted flow more thoroughly, including sign in, loan creation, repayments, and email reminders.

We would also like to make adding a loan quicker and improve the layout on smaller screens. For reminders, we want clearer delivery updates and more message options while keeping approval in the user’s hands.

The goal is an app people can use without much effort, so remembering a small debt does not become a bigger problem than the debt itself.

Built With

Share this project:

Updates

Submission history