Project 03 · Kotlin

EngineRoomLog

Paper does this job, but it cannot prove itself. A page can be torn out and rewritten, and the only defence is the inspector's suspicion. This keeps everything paper does — the watch hierarchy, the sign-off chain, the day-by-day pages — and adds the one thing paper never had.

Replaces
The paper engine room logbook
Built for
Watchkeepers, engineers, and the inspectors who read the log afterwards
Status
Portfolio project
Source
github.com/baranDincsoy/EngineRoomLog
Login screen. Watch entry form. Journal grid for a day. Exported PDF page. Exported PDF page. Exported PDF page. Exported PDF page. Exported PDF page.

Why it exists

Rows of readings, signed off by the engineer, kept for inspectors who need to trust that no page was altered after the fact. That is the job. The design decisions here come from having done it: why removing a parameter has to be deactivation and never deletion, why the person who collects a reading should not be the one who posts it, and why the log has to keep working with no connection for weeks.

What it does

Offline-first by construction

A ship spends most of its life without connectivity, so nothing waits on a network. Room is the source of truth and the cloud is a mirror. The sync runs one way, ship to office, and there is no conflict resolution by design: the tablet produces, the cloud archives.

Room (source of truth) → Flow → Compose UI   |   Room + filesystem → sync → Firebase (mirror)

How it is built

MVVM with unidirectional data flow and manual dependency injection. ViewModels read Room through Flow, and the interface never touches the cloud directly. Role and crew identity are carried through navigation as route arguments, so an oiler never sees the buttons an engineer does — the menu is gated at the route, not hidden with a conditional in the layout.

Room migrations are hand-written with exportSchema on. PDFs use Android's own PdfDocument and Canvas with no third-party library. Passwords are hashed with bcrypt; integrity uses MessageDigest.

A fresh install has no seeded test data. It walks through vessel setup, then a chief engineer account with employee-number login, then a realistic starter template the chief can reshape. The app is born configured rather than hard-coded.

Scope and limits

What I took from it

The hardest parts were not technical. Deciding that a single-engineer watch may sign its own entries, or that retiring a parameter must never touch a record already signed, took knowing what an inspector looks for. Those rules are not in any specification I could have read.