All case studies
SaaS · live, paying subscribersWeb Development

PodatekMT5

podatekmt5.pl
Next.js 15TypeScriptPostgreSQL (Neon)Drizzle ORMStripeBetter Auth
PodatekMT5, SaaS · live, paying subscribers
Scroll to play

Brief

Polish traders settling MT5 profits for PIT-38 must convert every single position to złoty at the NBP mid-rate from the working day before the trade closed. Across a few hundred trades that is hours of spreadsheet work and very easy to get wrong. The product turns an exported MT5 report into PIT-38-ready figures in a couple of minutes.

Decisions

01Parse in the browser, not on the server

The MT5 report is parsed client-side; the trade history never leaves the device. For a file that is effectively somebody's brokerage statement, that is the difference between “trust me with it” and “there is nothing to trust me with”.

02Rates straight from the NBP API

Exchange rates come from the official NBP API and implement the art. 30b / art. 11a rule: the mid-rate published on the working day preceding the close, correctly stepping back over weekends and public holidays. The output has to hold up at a tax office, not merely look plausible.

03An embedded font, because Polish

jsPDF's built-in Helvetica cannot render ą ć ę ł ń ó ś ź ż, so the export used to silently drop diacritics from a document headed to Urząd Skarbowy. It now embeds a subsetted Lato, lazy-imported so the font is only downloaded when somebody actually exports a PDF.

04Getting a third-party player off the critical path

An embedded YouTube demo was loading its full player on every single visit: roughly 950 KB of third-party JavaScript and CSS, about half the weight of the page, on a page most visitors never watched the video on. It is now a lightweight thumbnail that only mounts the real player once you click it.

Result· before → after

Page payload1,833 KB807 KB
Performance (desktop)7491
Largest Contentful Paint (desktop)2.8 s1.4 s
Time to Interactive (mobile)12.8 s6.3 s
First Contentful Paint (desktop)1.3 s0.6 s
Total Blocking Time (mobile)410 ms320 ms
Performance (mobile)5863
Best Practices (desktop)96100

Mobile

Performance5863
Accessibility9595
Best Practices9396
SEO100100

Desktop

Performance7491
Accessibility100100
Best Practices96100
SEO100100

Mobile performance is still held back by roughly 210 KB of unused JavaScript in the application bundles. Splitting that out is the next planned pass; this page will be updated with the new measurement when it lands.

All figures are real Lighthouse measurements (v12.8.2) taken against the live site on July 2026. Nothing is estimated.

Want results like these?

Tell me what you're building and I'll tell you honestly what it needs.

Start a project