Overview
These are the product requirements in plain language — what a visitor should be able to do, and what the app should handle quietly.
How to read
Must = core value. Should = improves the experience. Can = nice to have.
Core User Tasks
| ID | Requirement | Priority |
|---|---|---|
| FR-01 | See live ECB rates at a glance in a scrolling markets ticker with day-over-day change badges | Must |
| FR-02 | Convert an amount between any of 57 currencies, typing into either field | Must |
| FR-03 | Swap the currency pair (and both amounts) in one click | Must |
| FR-04 | Search and pick a currency from a grouped catalog with flags, codes, and full names | Must |
| FR-05 | View a pair's rate history across six ranges (1D → 5Y) with open/last/change stats | Should |
| FR-06 | Compare every quote currency against the base, converted at the entered amount | Should |
| FR-07 | Pin favorite pairs; tapping one loads it into the converter | Should |
| FR-08 | Log conversions manually and manage entries (delete one / clear all) | Can |
| FR-09 | Favorites, log, and even the open tab survive a reload | Must |
| FR-10 | Operate the entire app with keyboard alone; screen readers announce dynamic results | Must |
Behavior That Matters
- Two-way without loops — typing in either field updates only the other; currency changes re-derive exactly once via a guarded protocol. No ping-pong.
- "Yesterday" means the previous business day — change badges compare real ECB publication dates, so weekends and holidays never produce fake 0.00% badges.
- Fresh feel, polite fetching — the UI signals freshness (ticker, badges) while caches ensure data that changes once per day is fetched rarely.
- Persistence without accounts — favorites, log, and tab state live on the device via localStorage. Nothing leaves the browser.
- Motion respects preferences — the marquee collapses to a scrollable strip under
prefers-reduced-motion.
Out of Scope
To keep the project focused:
- No accounts, authentication, or backend storage — persistence is browser-local.
- No intraday or trading data: ECB reference rates update at most once per business day.
- No automated test framework — type-checked build and lint are the automated gates.
Trade-off made visible
"Live" here means fresh-feeling, not tick-by-tick. The design embraces the daily rhythm of the data source instead of pretending otherwise.
Acceptance in One Glance
- A first-time visitor sees moving rates within a second of page load and can convert EUR → USD immediately (100 prefilled).
- Typing
500in the send field instantly shows the receive amount; focusing the receive field and typing divides instead — with no flicker or loop. - Pinning three favorites and logging two conversions survives a hard refresh.
Why it matters
The requirements target what users judge a converter by: instant answers, trustworthy change signals, and remembering what they care about.