Features
Dashboard and Watchlist
The application centers around a personalized dashboard that greets users by time of day and displays an overview of market activity. The main dashboard includes a gold fixing chart showing the official NBP gold price per gram in PLN over the last ten days, with a percentage change indicator and an area chart visualization. Users maintain a custom watchlist of currencies they care about. Each watchlist card shows the current PLN mid-rate, a small sparkline of recent trends, and quick links to the history page for deeper analysis. Currencies can be added or removed from the watchlist through a searchable modal that filters by name or code across all available NBP Table A currencies.
Historical Data and Analytics
The history page offers two analysis modes. In trend mode, users select a date range and optionally a currency (or gold) to fetch historical data. The results are presented as an interactive area chart and a data table with date, value, and NBP table number where applicable. The table supports expanding to view all rows and includes keyboard-friendly navigation for accessibility. In single-day mode, users retrieve the exact official rate for a specific date, useful for invoice verification or audit compliance. Data can be exported to CSV for use in spreadsheets and reporting. The history API enforces a maximum range of 93 days for exchange rates and uses appropriate date bounds for gold (from 2013) and currencies (from 2002).
User Account and Settings
Authentication is handled by Laravel Fortify with support for registration, login, email verification, and optional two-factor authentication. The profile settings page allows users to update their name, nickname, email, and avatar. Password changes require the current password and are rate-limited. A danger zone section enables account deletion with password confirmation. The app supports light and dark themes with persistence across sessions. Locale switching (English and Polish) is available and stored per user. Breadcrumb navigation and a responsive sidebar layout help users move between the dashboard, watchlist, history, and settings.
Data Source and Synchronization
All rate and gold data comes from the official NBP API. The application syncs currency definitions and caches exchange rates and gold prices via scheduled Artisan commands. Daily sync runs at 06:00 and caching at 06:15, with overlap prevention and single-server execution for deployment safety. The NBP service normalizes API responses into typed data objects and handles retries and timeouts for resilience.
Tech Stack
Backend
The backend is built with Laravel 12 on PHP 8.3. Laravel Fortify provides authentication and two-factor support. Inertia.js bridges the Laravel backend and React frontend so that pages are rendered as single-page-like components while preserving traditional server-side routing and session handling. Laravel Wayfinder generates type-safe route URLs for the frontend. Spatie Laravel Data is used for structured DTOs when passing data between layers. The database uses MySQL by default (configurable) with migrations for users, currencies, user_currencies, exchange_rates, and gold_prices. Laravel Pail is available for streaming logs during development, and Laravel Pint enforces PHP code style.
Frontend
The frontend is built with React 19 and TypeScript. Inertia.js with the React adapter powers the SPA-like experience without a separate API layer. Vite 7 serves assets in development and builds for production. Tailwind CSS 4 with the Vite plugin provides styling. Recharts renders area charts for the dashboard gold trend, watchlist sparklines, and history analytics. Lucide React provides icons. Class Variance Authority (CVA) and clsx/tailwind-merge handle conditional styling. The React Compiler (Babel plugin) is enabled for automatic memoization. ESLint, Prettier, and TypeScript strict checks are used for code quality.
Build and Deployment
The Vite configuration includes the Laravel plugin for asset integration and HMR refresh. Server-side rendering (SSR) is supported via a dedicated SSR entry point and Inertia’s server adapter. The Wayfinder plugin generates form variants and route definitions for the frontend. The development script runs the Laravel server, queue worker, and Vite in parallel via concurrently. Production builds can be run with or without SSR depending on deployment needs.