Inspiration
The idea for Won(da) Won started when I decided to travel with a friend. Keeping track of exchange rates sounds like a small task, but it is easy to forget while planning everything else. I was also worried that the rate might drop unexpectedly before we exchanged our money.
I wanted one place where we could watch the Malaysian ringgit against the South Korean won, set a rate we would be comfortable with, and coordinate our decision together.
What it does
Won(da) Won is built for Malaysian travellers planning a South Korea trip with friends. It brings rate tracking, experimental target estimates, and group decisions into one place. Travellers can check the rate, explore a personal target, then join a Signal Room to agree on a shared target together.
- A shared Signal Room where travelers join with a six-digit code, see a common target, and send a “right now!” Alert to connected members.
- A timed target roundtable where the group can vote Follow, Fold, or Hold on a proposed target change.
- A recent market quote from Twelve Data, with its source and timestamp, alongside Frankfurter's daily reference-rate history.
- A two-week chart and selectable completed two-month periods for exploring earlier rates and peaks.
- Experimental target estimates for this month, next month, and the next three full calendar months, using available history from the past five years.
- Recent headlines from Malaysia, English-language South Korean reporting, and international business, war, trade-fair and aviation coverage.
The Signal Room helps turn individual preferences into a group decision. Members propose a target and vote Follow, Fold, or Hold; an accepted proposal updates the shared target for everyone.
The forecast percentages describe simulated outcomes, not guaranteed predictions. Market quotes can differ from daily reference rates and from the rate offered by a money changer. Browser alerts require the page to remain open and connected.
How I built it
I worked with Codex and the Devpost Learn Skill Pack to turn the idea into a proof of concept. The process used a scope document, product requirements, a technical specification, and a build checklist to organize decisions and implementation.
The process used flipped interaction: the coding agent asked questions, and I made decisions about the product. For example, I chose a no-billing approach for email notifications and a three-day news window with up to 30 headlines per section. I also reviewed working screens and requested changes to the forecasts, room controls, and news sources. Those decisions shaped the implementation.
The frontend uses React, TypeScript and Vite. Firebase Anonymous Authentication and Realtime Database support shared rooms, traveler presence, targets, alerts and voting. Twelve Data supplies market quotes and a separate daily-history source; Frankfurter supplies reference rates and historical data. Server-side routes keep the Twelve Data key out of the browser. Publisher RSS feeds supply headline links.
For the estimates, the app samples historical daily changes to generate 2,000 possible paths. Each percentage is the fraction that reaches the target during the selected window. The two providers run separate simulations. This is a historical simulation, not a trained machine-learning model.
Challenges I ran into
One challenge was understanding why the app's rate did not match Google Finance or Apple Stocks. Comparing sources and timestamps helped distinguish a recent market quote from a daily reference rate. The interface now explains that difference and checks the market quote every 30 minutes while the page is visible.
Another challenge was news reliability. GDELT failures and rate limits interrupted headlines, so the project moved to publisher RSS feeds. News now covers today and the previous two days in Malaysia time, with up to 30 headlines per section. Historical forecasts can continue without a news adjustment when headlines are unavailable.
Forecasting also required checking the assumptions behind the percentages. Historical backtests did not establish reliable, calibrated real-world probabilities, so the estimates remain clearly experimental. Shared-room synchronization and timed voting added another layer of behavior to check across two clients.
Accomplishments that I am proud of
I turned a concern from planning a trip with a friend into a deployed application. Two (or more) travellers can join the same Signal Room, see each other, vote on a proposed exchange target, and see the shared target update. I also confirmed that Test Alerts appeared, played a sound, and produced browser notifications when enabled on both devices.
I am proud of how the project improved through testing and feedback. When news feeds failed or exchange rates differed between sources, I worked through the cause and made the interface clearer about what the data meant.
What I learned
I found the whole process useful, although I am still building hands-on confidence with the tools. Working through planning documents, trying the app, and describing what felt wrong helped me participate in decisions even without much coding experience.
The project also showed why source dates, failed requests and testing assumptions matter. A displayed number needs context, and a simulation that runs successfully still needs evidence before it can be treated as an accurate prediction.
What's next for Won(da) Won
Next, I want to activate the prepared email-notification service so travellers can receive target alerts without keeping the page open. I also want to support additional currency pairs, such as MYR/CNY and USD/MYR (and more), while preserving the shared-room experience. I plan to strengthen room reliability and continue evaluating the experimental forecasts against new observations before making stronger accuracy claims.
Note: Email delivery is not connected in the current version.
Built With
- codex
- css3
- devpost
- firebase
- frankfurter
- html5
- javascript
- node.js
- react
- rss
- skill
- twelve-data
- typescript
- vite
- web-audio-api
Log in or sign up for Devpost to join the conversation.