PortSight~8 min read

A freight tool that hands you the next move.

Four A-versus-B calls that only added up to a thesis afterwards, in a logistics prototype I built alone.

  • Role: Research, product strategy, design, front-end
  • Timeline: Side project
  • Team: Solo
  • Impact: Not measured yet
  • Platform: Web
The Command screen: a ranked queue of six items, each with a type tag, time remaining, dollar exposure, a confidence percentage, and a single action link.
What shipped. One ranked queue, one action per row, and the dollar figure and the deadline on the same line as the decision.

The short version

In freight operations, missing a customs filing is priced rather than inconvenient. A team learns on a Tuesday that a filing is overdue, a port is closed, and a carbon declaration is short by 170 tonnes, each with its own deadline and its own fine. The systems that track all of it are good at surfacing everything and silent on which one costs the most if you deal with it after lunch.

I built PortSight alone, design through front-end. The first version monitored beautifully, which is what tools in this category tend to do, and you could study it for a minute without knowing what to do next.

The work came down to four decisions, one per surface, and each was the same question. Show the situation, or hand someone the next move. I made them separately, then read the log back and found I had been answering the same question all along.

Scope

I owned

  • Research with five shipping operations managers over a week, covering both whether the problem was real and how the four pairs of directions performed
  • Product strategy and the thesis, which arrived after the decisions rather than before them
  • Four A-versus-B direction calls, one per surface, each logged with what was rejected and why
  • The design system: tokens, seven shared components, severity tiers, motion timings
  • Front-end implementation in React and TypeScript: no engineer on this
  • The accessibility and status-indicator pass, and the drift backlog naming what’s still wrong

The problem

What good is a tool that tells you everything except what to do?

A shipment is late, a filing is overdue, a port is closed. The systems that track this are good at surfacing all of it and they leave the hardest part on the desk: of the nine things currently wrong, which one costs the most if you deal with it after lunch?

That’s not a data problem. Everything needed to answer it is already on the screen: the deadline, the fine, the route, the owner. It’s an arrangement problem, and arrangement is the part nobody treats as a decision.

Port operations

Vessel arrivals, berth assignment, and the question of which disruption to work first.

Compliance and regulatory affairs

Filings against statutory deadlines, where being late is priced rather than inconvenient.

Finance

Exposure across the portfolio, and what any of it means before a board meeting.

I built two directions per surface, far enough to be wrong in public.

Four surfaces, and for each one an A and a B taken to working prototype rather than to a comparison table. Over a week I put them in front of five shipping operations managers, first to find out whether the problem was worth solving at all and then to watch them work with both versions of each surface. Then a decision, written down with the rejected option and the reason next to it, so a call made in April can still be argued with in June.

What follows is that log. Three of the four rejections are things I had already built and liked.

The decisions log

Cockpit or queue?

I chose a ranked decision queue with one row per item over a system-health cockpit showing risk index, active disruptions, and regulatory intelligence side by side. The cockpit couldn’t immediately tell a user what to do now, and it needed opinionated, data-rich panels the prototype lacked the fidelity to support.

A queue makes a strong claim about priority, and getting its first item wrong makes the product confidently wrong rather than merely unhelpful. So each row shows confidence beside exposure, and filters let users re-cut the queue by type or deadline. Three of the five favoured the queue’s ordering outright — a read from five people, not an instrumented result.

The rejected cockpit: a risk-exposure score of 72 and four KPI blocks across the top, active disruptions listed in the centre, and a regulatory intelligence panel down the right.
Rejected. Handsome, dense, and it never says which of the four disruptions to open first.
The shipped decision queue: six numbered rows, each with a type tag, time remaining, dollar exposure, confidence, and one action link.
Shipped. The same information, ordered, with the question already answered.

Was the map helping anyone?

I removed the map and rebuilt the list around exceptions, rather than rebuilding a map on real AIS data. The existing one used hardcoded CSS percentages, had no connection to the vessel-tracking feed, and occupied a third of the screen without operational value over the list. A real map needs a live feed, coordinate rendering, and clustering; shipping the fake one would make the prototype lie to its author.

It is also the screenshot you put in a portfolio, and it took real work to build — which is why it was the hardest to give up. But an operations manager doesn’t need to know a vessel is somewhere in the Indian Ocean; they need to know the import security filing on it expires in six hours. Two of the five said as much unprompted: a map gives position rather than priority. The rebuilt list carries exception type, for which the map version had no room.

The earlier Shipments screen: a list of eight shipments on the left, and on the right a dark grid with seven scattered coloured dots and a critical/watch/on-track legend.
The map. Seven dots on a grid, positioned by hardcoded percentages, representing nothing.
The rebuilt Fleet screen: the same shipments at full width with a new exception column showing tags like WEEE Directive Violation and ISF Filing Overdue, plus status and exception filters.
The space the map used, spent on an exception column and a filter that can cut the list by exception type.

What happens when there are twenty holds, not one?

I chose a triage board with Open, In Progress, Submitted, and Resolved states plus a single-screen action view per violation, instead of a five-step wizard with a fast track for simple violations. UFLPA-style enforcement creates five to twenty simultaneous compliance holds, and the wizard makes each one travel through five screens.

The board risks losing the wizard’s review step, and an incomplete filing is worse than a late one because a customs officer rejects it while the clock continues — so the confirmation sheet retains the full review: required fields, uploaded document, receiving authority contact. The same two rejected the wizard on the same grounds: five screens per violation hides the other nineteen.

The rejected wizard: a vertical five-step rail reading Violation, Docs, Upload, Review, Submit, with step two showing two documentation checkboxes and a Continue button.
Rejected. Five steps per violation, and a “draft restored, resuming at step 2 of 5” banner that exists because people leave halfway through.
The shipped triage board: violations grouped under Open, In Progress, Submitted, and Resolved on the left, with a full action view for one violation on the right showing required fields, an upload zone, and the receiving officer’s contact details.
Shipped. Every violation’s state visible at once, and the whole of one violation’s work on a single screen beside it.
The submission confirmation: a check mark, “Submitted successfully”, the filing destination, a CBP reference number, and a Return to board button.
The end of the flow returns you to the board rather than to the item, because the next violation is the actual next task.

Do reports need more charts or a point of view?

I chose a three-part narrative intelligence briefing with charts in a supporting sidebar over a fixed analytics grid with working filters and real exports. CFOs and risk officers open Reports to decide, and a $14.8M projected loss without its implication isn’t useful.

That editorial position can be wrong in a way someone can point to, so each recommendation carries its arithmetic: “saves $136,000 of $756K total exposure, adds 1.5 days transit, 88% probability of SLA preservation.” Readers can reject the recommendation and keep the calculation. Working filters and real exports remain prerequisites built under the briefing format, not instead of it.

The briefing’s first section, “What happened”: three risk events, each with an ID, a status badge, a projected exposure figure, a paragraph of context, and an action link.
01: What happened. Three events, priced, each with the next action attached.
The briefing’s third section, “What to decide”: three ranked recommendations with estimated savings, effort labels, decision windows, and links.
03: What to decide. Estimated ROI, effort, and how long the window stays open.

The thesis, arrived at backwards

PortSight is a decision-support tool. Monitoring is the thing it stopped doing.

That sentence is in the decisions log, and it is written after the four entries above it rather than before them. I did not start with a thesis and apply it four times. I made four separate calls about four unrelated screens, wrote down why each went the way it did, and then read the log back and found I had been answering the same question all along. Which is an argument for keeping the log: the pattern wasn’t visible from inside any single decision.

The sessions said the same thing in the operators’ own words, and they said it about the two surfaces I had found hardest to give up. Everything at once, and a clear account of what demands attention now. The map failed the second half and the wizard failed the first.

One question per screen

  • Command: what do I act on right now, and in what order?
  • Fleet, which shipments are off-plan, and why?
  • Exposure: what violations need resolution, and which can I batch?
  • Analytics: what does our risk exposure mean, and what should we do about it?

The rejected directions aren’t wrong. A cockpit, a real map, a wizard, an analytics grid, each is the right next layer once the decision layer underneath is proven, and each needs data fidelity this prototype doesn’t have. Build the decision layer first, then add awareness on top of it. That ordering is the product plan.

The Assignments view: five people, each with the exposure they’re carrying, time remaining, and Escalate, Reassign, and Message actions.
The same ordering logic applied to people. Total exposure, and how much of it nobody has touched.

Building it alone

No engineer on this, so the design system had to be code that actually runs. Shared style values in code, seven shared components, three severity tiers, motion timings with entrance and exit easing separated. The discipline matters on a solo project because the design decisions have to survive me implementing them at eleven at night.

The system doc carries a Known Drift section listing what’s still wrong: off-grid spacing at 7px, 10px, and 14px, and page-level styles still using hardcoded font sizes where the shared components read from the shared values. Writing the backlog down is what stops the drift being rediscovered later as a surprise.

Five people, from one of the three audiences

Five shipping operations managers saw this over a week. Three favoured the queue’s ordering and two rejected the map and the wizard, which is enough to establish that the problem is real and that the directions I shipped are the ones operators reach for. It is not enough to call any of it settled. Three out of five is a direction, not a majority, and a week is a week.

They are also one of the three audiences this page names. Compliance and regulatory affairs and Finance each have a surface built for them here and nobody doing either job has sat in front of it, so two load-bearing claims are still mine alone: that five to twenty simultaneous holds is the realistic case, and that someone opening Reports wants a recommendation rather than a grid. Reports is the one surface no participant was asked about at all. An afternoon with a compliance officer could still overturn either.

Nothing here is instrumented. The $813K exposure, $14.8M projected loss, and 92% delivery-guarantee breach probability on screen are demo data, invented to make the interface legible. They are not results. Five people in a week can make a direction clear; they cannot show it holds at scale.

Sam Cusano