A lightweight self-hosted currency monitor that tracks EUR/CZK exchange rates, stores local history and provides practical conversion notifications for different deadlines.
I built a personal currency monitor for the EUR/CZK exchange rate. The system automatically tracks the current rate, stores local history and provides practical notifications when a conversion moment becomes interesting.
The project started with a simple question:
Is the exchange rate good enough to convert euros to Czech koruna now, or should I wait a little longer?
Looking only at the current rate is not enough for that decision. A rate can be high compared to yesterday, but still low compared to the last few weeks. At the same time, an intraday movement can be useful when you need to convert soon, even if no long-term record has been reached.
That is why I built a small self-hosted tool that translates raw exchange-rate data into practical notifications.
The Currency Monitor periodically retrieves the EUR/CZK rate, stores measurements locally and shows the current situation in a dashboard. The first version mainly sent a notification when the rate reached a new high within a configurable lookback period, for example 45 days.
Later I extended this with a smarter notification model. Not every conversion decision has the same deadline. Sometimes you want to convert today or tomorrow, sometimes within a week, and sometimes you can patiently wait for a better moment.
The system therefore uses three practical modes:
The selected mode controls both the dashboard interpretation and the live notification profile.
The monitor combines exchange-rate data, historical comparison, momentum and simple backtesting into practical notifications.
Key features:
The system is intentionally lightweight. It runs locally, uses simple components and is designed as a practical tool, not as a complex financial platform.
One of the main goals of this project was to make the interface show meaning, not just data.
The dashboard therefore translates the current market situation into plain language. Instead of only showing a chart with numbers, the system gives a conclusion such as:
Below the advice, the UI shows reasons and warnings. Green chips support the notification, while red chips explain why the system is more cautious. This keeps the notification understandable.
Examples of factors used by the model:
This makes the system more useful than a simple price alert. It does not only say that a rate is high, but also whether that moment fits the selected deadline.

The frontend is built as a clear React dashboard. The top cards show the latest rate, the highest rate within the available period and the timestamp of the last update.
Below that is the most important section: the conversion notification. This shows in plain language whether the current rate is interesting enough for the selected mode.
The dashboard includes:

The charts are not meant to be a trading terminal. They are intended as quick visual support. You can immediately see whether the rate is peaking, falling back, staying stable or slowly moving upward.
An interesting part of this project is that the same data is interpreted differently depending on the deadline.
In urgent mode, the system looks much more closely at intraday behaviour. When you need to convert today or tomorrow, the day high, short-term momentum and visible pullbacks matter. This mode is also allowed to notify more often, because the decision is more time-sensitive.
In week mode, recent multi-day context becomes more important. The system checks whether the rate is strong within the recent period, without reacting to every small intraday movement.
In patient mode, longer historical context is more important. This mode is calmer and mainly looks for moments that are genuinely strong within a longer period.
The UI selection is also the notification profile:
A 45-day high remains active as a separate notification.
A monitor is only useful if its notifications remain reliable and calm. The system therefore does not send a message for every small movement.
Thresholds, cooldowns and minimum improvements are built in. A notification can be interesting in the dashboard, but still not trigger a push notification if it comes too soon after a previous alert or does not improve enough.
This keeps the system practical. The dashboard may show a lot of context, but notifications should only arrive when something is actually worth attention.
To get a better feeling for the quality of the notification model, I added a backtest section. It shows how the current strategy would have behaved historically on the locally stored data.

The backtest shows, among other things:
This does not make the notification predictive. You cannot know the future. But it does help to judge whether the model behaved reasonably in historical situations.
The project is a small full-stack application.
The backend is built with FastAPI and retrieves exchange-rate data from an external API. Data is stored in SQLite, allowing the system to run locally and independently.
The backend is responsible for:
The frontend is built with React and Vite. Charts are rendered with Recharts. The UI is designed to give quick insight without requiring manual interpretation of all raw data.
The application is service-ready for Linux. Backend and frontend can be started automatically using systemd and restarted if they fail.
For longer-term context, the project also supports historical backfill of daily candles. This allows the system to provide useful long-term context without waiting months for live data to accumulate.
This project is intended for use within a private network. The application does not include a login layer and is not designed to be exposed directly to the public internet.
A public deployment would require additional steps such as authentication, HTTPS, reverse proxy configuration, production workers and further security hardening.
It is also important to mention that this system is not financial advice. It is a decision-support tool based on my own rules, historical data and practical notifications.
This project is a good example of software that solves a small everyday problem in a practical way.
It shows how I like to work:
The value is not only in retrieving an exchange rate. The real value is in translating raw data into a clear question:
Given my deadline, is this a good moment to convert?
The Currency Monitor started as a simple exchange-rate alert, but grew into a small decision-support application with historical context, notifications and backtesting.
The project intentionally remains compact, but still includes many elements that are important in larger systems: API integration, data modelling, scheduling, frontend visualisation, reliability, configuration and deployment.
For me, this is mostly a practical tool: small enough to stay understandable, but complete enough to be useful in everyday use.