Java desktop applications, for the places a browser can’t reach

Some operations a browser tab simply doesn’t solve: continuous barcode scanning, scales and label printers on a serial port, eight hours a day of keyboard data entry, or a warehouse where the Wi-Fi drops three times per shift.

The desktop application has been declared dead for about fifteen years. Meanwhile, in warehouses, production halls and goods-in areas, people still work in installed applications — because that is where hardware access, keyboard speed and working without a network actually matter.

We build these applications in Java, with JavaFX for new interfaces and Swing when we take over or extend an existing system. We package them with jpackage: the user gets a normal installer — .msi on Windows, .dmg on macOS, .deb or .rpm on Linux — without ever learning what a JRE is and without installing anything separately.

The important part: the desktop app is not a parallel system. It talks to the same backend as the website and the mobile app. An order entered at goods-in is visible immediately in the web dashboard and on the sales rep’s phone.

What we build

Interfaces for heavy, repetitive work

Tables with tens of thousands of rows that stay responsive, full keyboard navigation, configurable shortcuts, forms designed for operators who use them all day without looking at the screen.

Offline operation with synchronisation

A local database (SQLite or H2), a queue of unsynchronised operations, reconciliation when the connection returns and explicit conflict-resolution rules. The operator keeps working; syncing is the application’s problem, not theirs.

Hardware integration

Barcode and QR scanners, Zebra or TSC label printers over ZPL/EPL, scales on a serial port, card readers, tablet signature capture, fiscal printers, document scanners.

Managed installation and updates

A digitally signed native installer built with jpackage, plus automatic updates on startup. You don’t send an IT technician round 40 workstations for every new version.

Reports and local export

PDF and Excel generated directly on the workstation, batch printing, templates somebody inside the company can modify without recompiling the application.

Modernising existing Swing applications

Migration from Java 8 to a current LTS release, gradual replacement of screens with JavaFX, cleanup of abandoned dependencies — without stopping production while we work.

Technologies

Desktop UI

  • JavaFX
  • Swing
  • FXML & CSS
  • AtlantaFX
  • ControlsFX

Packaging

  • jpackage
  • jlink
  • .msi / .dmg / .deb installers
  • code signing
  • auto-update

Local data

  • SQLite
  • H2
  • JPA / Hibernate
  • queue-based sync

Communication

  • REST
  • WebSocket
  • gRPC
  • serial port (jSerialComm)
  • ZPL / EPL

Reporting

  • JasperReports
  • Apache POI
  • PDFBox

A good fit if

  • you have a warehouse or a production hall where the connection isn’t guaranteed
  • your operators enter data for hours every day and speed matters
  • you need direct access to label printers, scales or scanners
  • you have an old Swing application nobody wants to touch any more
  • you want desktop, web and mobile to see the same data in real time

Frequently asked questions

Why desktop and not a web application?

For three concrete reasons: local hardware access, working without internet, and speed of manual data entry. If none of them applies in your case, we’ll recommend a web application — it’s cheaper to ship and cheaper to maintain. We don’t sell desktop where it isn’t needed.

Do users have to install Java separately?

No. With jpackage the Java runtime is bundled inside the installer. The user gets a program that installs like any other and shows up in the Start menu or in Applications.

Does it work on Windows, Mac and Linux?

Yes, from the same codebase. Each installer has to be built on its own operating system — that’s configured once in the CI pipeline and then runs automatically for every release.

How does offline mode behave, in detail?

The application writes to the local database and puts every operation into a queue. When the connection returns, the queue is sent to the server in order. Conflicts — the same stock level changed in two places, for example — are resolved by rules we define explicitly during analysis, not by luck.

Can it run on the old workstations in the warehouse?

Usually yes. JavaFX performs reasonably even on modest hardware; tell us what you have and we’ll confirm before promising anything. We’ve seen plenty of warehouses with ten-year-old machines that work perfectly for their purpose.

Let’s get specific

Do you have a project like this?

Message us on WhatsApp or by email with two or three sentences about what you need. We’ll come back with the questions that matter and a budget and timeline estimate.

No obligation, no follow-up pressure.