Back to Zirve Asansör
PlateII

Yönetim Paneli — The Boss's Desktop Panel

A desktop app for one user was a strange choice in 2026 and I made it on purpose.

Role

I chose JavaFX and decided how every screen behaves, then drove the build with AI coding agents against the backend's contract. This app is the reference; the iPad version copies it screen for screen and is not allowed to improve on it.

Stack

Java 21JavaFXMavenHttpClientJacksonWebViewopenhtmltopdfJUnit
Yönetim Paneli — The Boss's Desktop Panel

Overview

A desktop app for one user was a strange choice in 2026 and I made it on purpose. I know Java, I wanted one client in the system that wasn't JavaScript, and a desktop client can't quietly share code with the server, so the REST API had to be complete from day one. This is that app: JavaFX, nine sections from the dashboard to the vehicle list, talking to the backend through Java's HttpClient. Taking a payment shows which months it will close before anything is saved, then prints a receipt that copies the firm's paper makbuz, letterhead and signature included. Contracts and finance reports go the same way, previewed in a WebView and exported to PDF.

What it does

  • INine sections over the same locked REST contract as every other client
  • IIA payment preview that says which months it closes, shown before the save
  • IIIReceipts, contracts and finance reports previewed in a WebView, then exported to PDF
  • IVLetterhead, office phones and staff mobiles read from a gitignored file. None of them is a literal in source
  • VSearch that folds Turkish letters, so typing sisli finds Şişli

Screens

Signing in
Signing in
The dashboard
The dashboard
Contracts due for renewal
Contracts due for renewal
Search that folds Turkish
Search that folds Turkish
Maintenance visits
Maintenance visits
Income and expenses
Income and expenses
Payment tracking
Payment tracking
Preview before saving
Preview before saving
The receipt window
The receipt window
Technicians
Technicians

Technical notes

  • IOne of the first contracts it printed carried two invented mobile numbers next to the technicians' names. They were placeholders that had replaced the real numbers when the git history was scrubbed, and they looked completely plausible on a legal document. Every address, phone and staff name moved into config/letterhead.properties, gitignored, with a committed template.
  • IISearch used toLowerCase and failed on Turkish, quietly. On a JVM without a Turkish locale a capital İ lowercases to i plus a combining dot, so it never matches a typed i, and there was no diacritic folding at all. Now İ and I are mapped explicitly before lowercasing with a fixed locale, and both sides of every comparison are folded.
  • IIIClosing a modal and opening a dialog in the same event freezes JavaFX on macOS. Creating a contract showed a blank white confirmation and the list behind it never refreshed. The record was fine; the UI was stuck. The same shape was in three other places, including the one dialog that shows a new staff member's temporary password. Each now defers the dialog to the next event with Platform.runLater.

What I learned

The receipt had the boss's signature in the wrong box for a while. On a tahsilat makbuzu the customer hands over money and the firm receives it, so the firm signs under Teslim Alan, the receiver. The first version put it under Teslim Eden. It's the kind of mistake you only make if you've never filled one in.