Inspiration I'm on exchange at Creighton University in Omaha right now. I arrived with money and no map of US banking. Nobody explains when rent actually leaves your account. Nobody explains why your credit card balance went up after you paid it, or why a $12 menu item costs $16. The most basic question is also the hardest: does the money from home last until the flight back?
International students also have a very specific money pattern. Money arrives in a few big deposits from parents, a scholarship or a stipend. Bills are fixed: rent, phone, insurance. Many have their first credit card. They think in euros, pesos or rupees but spend in dollars, and they have a hard end date. They are also targeted by scammers who pose as immigration officers, tax agents or landlords and demand urgent payments.
Banking apps assume you already understand the US system. I wanted one that assumes you don't.
What it does Exchange Treasurer is a financial copilot for international students in their first year in the US. It does three things.
Tells you whether your money lasts. The runway forecast projects your checking balance day by day, from scheduled bills, recurring payments and your typical spending. It gives you one date that matters. In the demo, Ana is a student from Bilbao in Omaha. Her money runs out on October 10, and her flight home is October 31. Then it shows what would close the gap, such as moving $400 from savings or capping dining out. When she approves, the line reaches her flight.
Explains US banking in your language. Ana can ask "¿Puedo permitirme ir a Chicago este finde?" ("Can I afford Chicago this weekend?") and get an answer in Spanish, with her real numbers and a fix she can approve with one tap. The app also explains every bill and her credit card: utilization, statement balance versus current balance, and why paying in full matters. Every amount can be shown in dollars or in her home currency.
Stops scams before the money leaves. Before any transfer, the app scores its risk. When Ana tries to send $800 marked "URGENT apartment deposit" to someone she has never paid, the app pauses. It shows why: a new payee, a large share of her balance, a round amount and urgent wording. Then it asks the questions a scammer hopes she won't: did someone contact you and pressure you to pay? Her roommate, whom she has paid before, goes straight through. The app also flags card-testing bursts and impossible travel in her purchases.
It's live at https://exchangetreasurer.us, with a web app and a React Native phone app.
How I built it I built it alone, so I split it into four layers and wrote the API contract and mock JSON for every response first. That let me build each layer on its own and switch any of them between mock and live data.
Data and Nessie: a deterministic Python generator builds three student personas with about three months of history. It's calibrated so the story holds together: Ana's runway falls three weeks short, and a move from savings fixes it. I push it to Capital One's Nessie API across seven resource types: customers, accounts, merchants, purchases, bills, deposits and transfers, both reading and writing. Everything is mirrored into a local SQLite cache, so the demo never depends on the sandbox responding. Engine: pure Python functions for recurring-payment detection, the day-by-day forecast, affordability checks, suggested fixes, the transfer risk score, and anomaly detection on purchases. Each risk signal carries its points and a plain-language reason, and those reasons are what the user sees. API and copilot: FastAPI (with a standard-library server using the same routes as a fallback), plus a copilot that runs on Gemini, Claude or any OpenAI-compatible model. Users can also bring their own key, which stays on their device. The model gets eleven tools mapped to the engine. Two rules are enforced in code, not just in the prompt: The model never does the maths. Every number comes from a tool result, and each reply lists the tools it used. The model can't move money. It can only propose an action. The only path that writes is a confirmation step that runs when the user taps Approve. It updates the cache, writes the transfer to Nessie, and re-runs the forecast so the runway visibly moves. Clients: a Next.js 16 web app and an Expo / React Native phone app. Both render the same screens from one typed contract, the same file in both apps. Either can run entirely on the mock data with one environment variable. Tests: 141 Python tests across the data, engine, API, agent and frontend contract. One asks the copilot to move $500 and checks that no balance changed. Challenges I ran into The Nessie sandbox doesn't behave the way I assumed. Transfers can't name their payee. Nessie ignores a payee on transfers, yet "have you ever paid this person?" is the core scam signal. I rebuild payee history on my side. When a sync once erased it, the roommate transfer started getting paused. Balances aren't mine to set. Nessie accepts balance corrections, then ignores them. After a full upload, Ana's checking read $56 instead of $1,552.93. That's why every read goes through my cache. Customers can't be deleted. My early cleanup silently deleted nothing, so every upload duplicated about 1,200 objects. Dates have no time of day. Detecting "five charges in 24 minutes" or "two purchases 2,253 km apart in 95 minutes" needs one, so I store my own timestamps in the one free-text field Nessie keeps. Model quotas. Gemini's free tier ran out after a handful of turns mid-rehearsal. So I built a scripted router that uses the same tools and gives the same numbers, in English or Spanish, with no model at all. When a model call fails, the user still gets a correct answer. Building a backend, a web app and a phone app alone in one hackathon. Keeping them in agreement only worked because both apps share one contract file, and Python tests check it. Accomplishments that I'm proud of The numbers can't be hallucinated. The copilot has no way to invent a balance, and the app works without any model. Scam detection that explains itself. On my labelled synthetic scenarios it got 5 of 5 outcomes right. It flagged 8 of 8 fraud purchases and 0 of 480 normal ones. It's my own synthetic data, not real-world evidence, but every alert gives the user a reason they can read. A false-positive control built into the demo. Pausing everything would be easy. Letting the roommate's transfer through is the part that makes it a feature. Solo, from a problem I'm living right now: a live website, a phone app and a tested backend, not a slide. What I learned Treat the sandbox as the source of truth, and design around what it won't do. Probing Nessie early saved me from building on assumptions, and cost me time where I didn't. An AI copilot earns trust through what it can't do. Taking arithmetic and money movement away from the model made it more useful, not less. Writing the contract and mocks first makes solo work parallel too. I could finish a screen before its backend existed, and never had to hold the whole system in my head at once. For a real user, a plain-language reason matters more than a precise score. "You've never paid this person, and it's 43% of your balance" changes behaviour. "Risk: 84" doesn't. What's next for Exchange Treasurer "That was me / Not me" on alerts: freeze the card, issue a refund deposit, and learn the student's normal pattern from their answers. Trusted contact: a parent back home approves risky transfers. Live exchange rates and more languages, starting with the largest international student groups in the US. Push notifications on the phone when a bill or a risky charge lands. Real bank data in place of Nessie, so the forecast runs on a student's actual accounts. Partnering with international student offices so students have it from their first week on campus. Your repo still describes a four-person team: begin.md, the README glossary and code comments say P1–P4. A judge who opens it may ask. Say those were the four layers you planned, or I can reword the README before you submit.
more human Written for: Devpost judges. Same facts, told more like a person than a spec sheet.
Inspiration I'm an exchange student at Creighton, in Omaha. When I landed, I had money in my account and no idea how any of it worked here.
When does rent actually come out? Why did my card balance go up after I paid it? Why does a $12 lunch cost $16? And underneath all of it, the question that kept me up at night: is this money going to last until my flight home?
Every international student I've met has some version of that feeling. We get a lump sum from home or a scholarship, we have fixed bills, many of us have our first credit card, and we still do the maths in euros or rupees. We also have a date circled on the calendar, and we're exactly the people scammers go after: a fake immigration officer, a "tax fine", a landlord who needs a deposit right now.
Banking apps assume you already know how the US system works. I wanted to build the one I needed when I arrived.
What it does Exchange Treasurer is a money copilot for international students in their first year in the US.
It tells you if your money lasts. Meet Ana, a student from Bilbao in Omaha. The app looks at her accounts, her bills and how she usually spends, and draws her balance forward day by day. The answer is blunt: her money runs out on October 10, and her flight home is October 31. Then it shows her how to fix it. She can move $400 from savings or spend a little less eating out. She taps Approve, and the line stretches past her flight.
It explains things in your language. Ana can type "¿Puedo permitirme ir a Chicago este finde?" ("Can I afford Chicago this weekend?") and get an honest answer in Spanish, with her real numbers and a fix she can accept on the spot. It also explains her bills and her credit card like a friend would, and shows everything in euros if that's how she thinks.
It stops scams before the money's gone. When Ana is about to send $800 labelled "URGENT apartment deposit" to someone she's never paid, the app stops her. It tells her why this looks wrong, then asks the question that matters: did someone contact you and pressure you to pay? When she pays her roommate, whom she's paid before, it doesn't get in the way. It also notices strange card activity, like a burst of tiny test charges or two purchases thousands of kilometres apart within an hour and a half.
You can try it now at https://exchangetreasurer.us, on the web or as a phone app.
How I built it I built it alone, which meant I had to be disciplined. Before writing any real code, I wrote down exactly what every screen would ask the backend for and made fake responses for all of it. That way I could build the app, the backend and the data in any order, and plug them together at the end.
The data comes from Capital One's Nessie API. I wrote a generator that creates three students with about three months of realistic history, and tuned it so Ana's story actually holds up. It pushes all of that into Nessie across seven kinds of records: customers, accounts, merchants, purchases, bills, deposits and transfers. The app keeps its own copy, so a slow sandbox never ruins a demo.
The forecast and the scam check are plain Python, with no AI involved. Every risk flag comes with a sentence a human can understand, because a score on its own doesn't mean much to anyone.
The copilot sits on top. It can use Gemini, Claude or any OpenAI-style model, or your own key. I gave it two hard rules, enforced in the code rather than just asked for in a prompt. It never does the maths: every number comes from the engine. It can never move money on its own: it can only suggest, and nothing happens until you tap Approve.
On the front end there's a Next.js web app and an Expo phone app, both built on the same contract. Behind it all are 141 tests, including one that begs the copilot to move $500 and checks that it didn't.
Challenges I ran into Nessie kept surprising me.
Transfers don't record who you paid. That's a problem when "have you ever paid this person?" is the whole scam check, so I rebuilt that history myself. When a sync accidentally wiped it once, the app started flagging Ana's own roommate as a scammer. You can't set a balance. Nessie accepted my corrections and then quietly ignored them. At one point Ana's checking account showed $56 instead of $1,552.93. Deleting a customer isn't possible. My cleanup script didn't delete anything, so every upload silently doubled the data. Dates have no time of day, which you need to spot five charges in 24 minutes. I ended up hiding my own timestamps in a text field. Then the AI ran out. Gemini's free tier died a few messages into a rehearsal. Instead of panicking, I built a backup that answers the same questions with the same real numbers, in English or Spanish, with no AI at all. If the model goes down during a demo, nobody notices.
And honestly, the biggest challenge was scope. A backend, a web app and a phone app, alone, in one hackathon.
Accomplishments that I'm proud of It can't make up your balance. I care about this more than anything else in the app. A copilot that invents numbers about someone's rent money is worse than no copilot. The scam check explains itself. On the fake scenarios I built, it caught every scam and every fraudulent purchase, and flagged none of the 480 normal ones. It's my own test data, not the real world, but it's a start I can defend. It knows when to stay out of the way. Blocking everything is easy. Letting the roommate's payment through is what makes it useful. It's real and live, and it came from my own life, not a slide deck. What I learned Test the API before you trust it. Every hour I spent poking at Nessie early saved me three later. Every assumption I skipped checking cost me. People trust an AI more when you're clear about what it can't do. Taking the maths and the money away from the model made the copilot feel safer and more useful. Writing the plan and the fake data first is how one person builds several things at once. A reason beats a score. "You've never paid this person, and it's almost half your balance" makes someone stop and think. "Risk: 84" doesn't. What's next for Exchange Treasurer I want to add "That was me / Not me" buttons on alerts, so the app learns what's normal for you and can freeze your card when something isn't. I'd also like to let a parent back home approve big transfers, add live exchange rates and more languages, and send phone notifications when a bill or a strange charge lands.
The real goal is to run it on real bank accounts, and get it into students' hands through international student offices in their first week on campus. That's when I needed it most.
Log in or sign up for Devpost to join the conversation.