Case study · Built and running

MarOps — the back office a small shipowner actually needs.

A working, multi-tenant operations system for owners running 3,000–80,000 DWT dry bulk tonnage on spot voyage charters. Built by someone who stood the watches the software now accounts for. Live in production; 231 automated tests.

The problem

The real competitor is Excel + WhatsApp

A four-to-eight person office runs the fleet from spreadsheets and chat threads. Certificate expiries are tracked by memory, laytime is recalculated by hand for every dispute, and nobody can say what a voyage actually earned per day until weeks later.

The bar

Faster than the spreadsheet, or it's wrong

The design rule for every screen: if an operation takes longer here than it does in Excel, the screen is wrong. Quick SOF entry, one-click alert actions, paste-an-email extraction — speed is a feature requirement, not a nice-to-have.

What runs today

The full voyage-economics chain

Noon report → fuel reconciliation → bunker cost. Agent DA (proforma vs final) → port costs. Statement of Facts → GENCON laytime → demurrage or despatch. All three feed one voyage P&L, per vessel, per day.

Inside the system

What was built.

MarOps laytime calculation screen: stored basis JSON, per-port timeline, demurrage result and PDF/Excel statement links
Laytime calculation with its stored basis; demo tenant, sample data.

Flag-rule certificate alerts

Crew documents and ship certificates are watched by an alert engine whose thresholds are derived from per-flag lead times stored in a table — a Panama endorsement that takes 45 days to issue raises its first alert 75 days out. A fourth flag is a table row, not a release.

Evidence-grade laytime

The GENCON engine (SHINC/SHEX/WWD, reversible, half despatch) stores its full input and rule set with every calculation, so the same calculation gives the same answer six months later in a dispute. Statements export as PDF and Excel, in charterer-facing English.

Deterministic email extraction

Paste the master's noon report email; a rule-based parser (Turkish and English) pre-fills the form — and never writes a record itself. The person reviewing keeps the last word, and unreadable fields are flagged, not guessed.

Multi-tenant by construction

Tenant scoping is enforced at SQL compile time; every model ships with a mandatory cross-tenant isolation test. Money is Decimal with an explicit currency; every quantity carries its unit; ship-local timestamps are stored beside UTC and never trusted for ordering.

An audit trail that only appends

Nothing is physically deleted. Every renewal, alert action and cost fill lands in an append-only event log the application role cannot update or delete — the office can always answer “who changed this, and when?”

Boring, dependable operations

Nightly reconciliation catches anything the write path missed. Daily database and file backups are pulled off-site automatically, and a monthly restore drill proves the backups actually restore — it has already caught one empty dump.

Discipline

How it stays trustworthy.

231 tests, golden rules

Every laytime rule is pinned by a golden test against a hand-verified Statement of Facts — and golden tests are never “fixed” by updating the expected value. Extraction samples are pinned the same way.

Scope is written down

What the product deliberately does not do — no stability calculations, no bunker planning, no emissions reporting yet — is documented as binding scope, so features enter through a decision, not through drift.

Domain-first design

Ten years at sea as a deck officer, ending as chief mate: NOR clauses, SOF interruptions and flag-state paperwork are modelled from practice, not from a textbook.

Stack

Small and proven

Python 3.12, Django 5, PostgreSQL 16, HTMX — server-rendered, fast on bad connections. Docker Compose behind an nginx proxy with automatic TLS. One external Python dependency beyond the framework stack.

Delivery

Phased, tagged, shipped

Phase 0 (core engines) and Phase 1 (full office workflows) are closed and tagged; Phase 2 (noon reports, DA tracking, extraction) is live. Every work package landed with tests green and deployed the same day.

Next step

Run a fleet from spreadsheets?

Ask for a walkthrough — or bring one voyage and we will enter it together.

Get in touch