2026 / In progress
obchodnirejstrik-ai
Financial analysis of Czech companies based on their public financial statements and any information available online.
Problem
Czech financial statements and annual reports are public, but it is hard to turn them quickly into an analysis. Some of the information is in PDFs, some in registries, and risk signals (insolvency, sanctions, connections between people) have to be tracked down separately. Manual review takes a lot of time.
Solution
My application first looks up a company by its business ID or name, then extracts information from the last three annual reports and prepares a financial, risk, and valuation report. An LLM extracts structured data from the PDFs, the system supplements it from Czech registries and sanctions lists, and from this validated foundation it computes the valuation and risk factors. The hard checks and calculations are not free text from the model: they are produced deterministically in the application. The report therefore goes through a fixed workflow: a fixed schema, validation, deterministic calculations and flags, predefined sections and a template, and only then the AI interpretation.
The current version is a rewritten and expanded successor to an older prototype. In a blog post I describe why direct PDF processing by the model replaced an OCR intermediate layer, and how I handle the operational boundaries of an AI product.
Architecture
The interface is built in Next.js, and the server side runs on FastAPI over its own PostgreSQL database (SQLAlchemy, Alembic migrations). Longer tasks such as reading a document, querying registries, and producing the output are handled by a queue via ARQ and Redis. Payments and credits are handled through Stripe, and monitoring is provided by the self-hosted Uptime Kuma platform.
The project includes
- Reading PDFs directly with the model (vision), without a separate OCR step.
- Data from ARES, justice.cz, ADIS, eISIR, and the EU and OFAC sanctions lists.
- A valuation module that uses centrally managed industry multiples and benchmarks; their use is governed by the application’s rules, not by the AI model.
- Forensic signals: ownership structure, connected persons, the reputation of executives, and public subsidies.
- Risk flags computed in Python, for example insolvency or an unreliable VAT payer, not by the model.
- A credit system and per-report tracking of model costs.
What I learned
In financial analysis you need to clearly separate interpretation from reliability. The model can help with explanation and summary, but the calculations, validation, registries, accounting, and the resulting document have to be owned by the application. The move from an OCR tool to reading PDFs directly with the model also showed how quickly the architecture can be simplified when a new model can do what previously required a separate extra step.