Indian Railway · Desktop App · Java
Finishing

ESMON

Desktop analytics platform for the Indian Railway Speed and Energy Monitoring System.

ESMON Analytics SoftwareImportReportsChartsExportFILTERSFile TypeLTMDate From2024-01-01Date To2024-03-31Driver IDAllTrain No.12301Run ReportResetSpeed vs Time — File: LTM_20240115_12301.bin0255075100Speed (km/h)00:0001:0002:0003:0004:0005:00Time (HH:MM)SpeedEnergyRecords: 1,847 · File: LTM_20240115_12301.bin · Driver: D-2201 · Train: 12301Connected
01 — Overview

Turning binary recordings into actionable insight.

Monitoring devices on locomotives record detailed journey data—speed, energy, events—that engineers need to analyse and report on. The raw output from these devices is binary and completely unusable without software built specifically to decode it. I built the application that bridges that gap: load recordings from SD cards or USB, parse them into structured data, and surface everything through filterable reports, time-series charts, and composed PDF exports ready for operational review.

A core constraint shaped the architecture from the start: the application needs to work in environments where internet access cannot be assumed. These devices operate in remote areas, depots, and fieldwork settings—connectivity is unreliable or simply not there. Running everything locally with no server dependency wasn't a simplification, it was a requirement. Data stays on the machine, analysis happens offline, and the tool is usable anywhere the device is.

The people using this daily are operations engineers, not software engineers—so it had to be fast, reliable, and self-explanatory across Windows and macOS. It ships as a signed installer on both platforms, produced from a single CI pipeline, with no manual packaging steps required.

02 — The Hard Parts
01

Binary Parsing & Data Integrity

The devices produce binary output in multiple formats, each with its own structure, field layout, and edge cases. Parsing binary data correctly means handling byte alignment, distinguishing between valid records and noise, and gracefully dealing with corruption—partial writes, truncated files, and malformed records that occur naturally in field conditions. The parser had to be defensive enough to recover from bad data without silently producing wrong results.

02

Designing Without a Net

I had no designer, no senior to review my decisions, and no existing pattern to follow for this kind of tool. The filter system spans multiple tabs, each needing independent state but sharing the same UI panel—a non-trivial UX problem I had to reason through on my own. A lot of the design work happened in cycles of building, using it myself, noticing what felt wrong, and iterating. That process taught me more about interface design than any resource I've read.

03

PDF Generation Deadlocks

Embedding charts in PDFs required rendering them as images during generation—but the UI framework and the PDF pipeline have conflicting threading requirements. The rendering process needs to happen on the UI thread, while PDF generation runs in the background. Getting these two to cooperate without deadlocking, particularly on macOS, required understanding where the conflict originated and separating the rendering step from the export pipeline entirely using offscreen rendering techniques.

03 — Outcomes
4

Independent filter contexts across tabs

0

Deadlocks in PDF generation after offscreen fix

2

Signed installers shipped from one CI pipeline

Records processable — SQLite, local, no server

04 — Stack
Java 21JavaFX (FXML)Spring BootSpring JDBCSQLiteApache PDFBoxMavenjpackageGitHub ActionsBellSoft Liberica JDK

This is a private project — but I'm happy to talk through the engineering.

Ask me about it