Current independent project | Source available
Ocean Intelligence
A full-stack vessel research application that turns historical AIS observations and public registry records into an explorable research workflow.
View the source on GitHub
Uncertain maritime data becomes an organized research view. Search results lead into a structured vessel dossier with Global Fishing Watch attribution and clear data caveats. Historical AIS observations indicate past presence in the searched area, not a live vessel position.
The problem
Maritime data is incomplete, sometimes conflicting, rate-limited, and easy to overstate. The application needs to make useful evidence understandable without presenting historical observations as live or verified truth.
What I built
A React and TypeScript interface backed by an ASP.NET Core API. The backend owns authenticated Global Fishing Watch requests, validation, caching, concurrency control, rate limiting, and safe error mapping. The frontend supports cancellable searches, cached vessel details, keyboard-accessible selection, and a structured research dossier.
The engineering choices
The system keeps its public contracts separate from upstream response models and preserves attribution and data caveats in the interface. It deliberately uses native fetch and local React state, with no database, map library, or authentication until a real product need justifies them.
Engineering evidence
- Application-owned API contracts stay separate from upstream Global Fishing Watch response models.
- The access token and all Global Fishing Watch communication remain on the ASP.NET Core backend.
- Caching, request cancellation, concurrency coordination, and rate limiting protect upstream access and user interactions.
- Problem Details and xUnit coverage exercise validation, mapping, upstream failures, caching, and irregular registry data.
- 01 React interface
- 02 ASP.NET Core API
- 03 Global Fishing Watch
React 19 | TypeScript | ASP.NET Core | .NET 10 | xUnit | Global Fishing Watch API