A phone-first currency converter. Enter an amount, pick a base currency, and see it converted into the other supported currencies at live rates — styled like a ledger receipt, with light and dark mode.
Supported currencies: CHF · EUR · USD · GBP · ZAR · BWP
- Frontend — React 19 + Vite + Tailwind CSS 4 (
src/) - Backend — Express proxy in front of the exchange-rates API, with a 30-minute in-memory rate cache (
backend/)
The backend exists so the API key never reaches the browser.
# Backend (reads .env from the repo root when started there)
node backend/server.js
# Frontend
npm install
npm run dev| Variable | Used by | Purpose |
|---|---|---|
EXCHANGE_RATES_API_KEY |
backend | Access key for the exchange-rates API |
EXCHANGE_RATES_API_URL |
backend | Base URL of the exchange-rates API |
VITE_BACKEND_URL |
frontend | Backend origin; empty string for same-origin |
PORT |
backend | Backend port (default 3001) |
docker compose up --buildServes the built frontend via nginx on port 3000 and the backend on port 3001.
GET /health— health checkGET /api/convert?from=CHF&to=EUR&amount=100— convertsamountbetween two supported currencies; responds with{ success, from, to, amount, result, rate, timestamp }