Context
Vesselspro helps operators manage vessels, cargo, crew, and maintenance in one product. The org ships a production web app, a dedicated AIS API, and mobile clients from the vesselspro GitHub organization.
The problem
Maritime operators need reliable vessel visibility and operational data in one place, not spreadsheets and disconnected tools. The product had to handle real-time tracking context, authenticated multi-tenant access, notifications, and room for AI-assisted workflows.
How we approached it
We structured the main product as a Next.js App Router application with Drizzle ORM, Better Auth, internationalized UI, and integrations for billing (Polar) and in-app notifications (Knock). AIS and telemetry flows run through a separate Bun + Elysia service. Mobile reach comes from dedicated iOS (Swift) and Android repositories alongside the web app.
What shipped
- Production web app (vesselspro/app) deployed at vessels.pro
- AIS / data service (vesselspro/ais) with Bun and Elysia
- iOS and Android app repositories (vessels_ios, vessels_android)
- Database migrations, auth flows, and i18n-ready message catalogs
Outcomes
- Unified fleet, cargo, crew, and maintenance workflows in a single SaaS surface
- Separated AIS ingestion from the main app for clearer scaling and ownership
- Stack chosen for type safety end-to-end: TypeScript, Drizzle, modern React
- Platform later moved to private operation; codebase remains our reference for maritime builds
Stack
- Next.js (App Router, Turbopack)
- TypeScript
- Drizzle ORM
- Neon Postgres
- Better Auth
- Vercel AI SDK (@ai-sdk/google)
- Knock
- Polar
- Bun
- Elysia
- Swift (iOS)
- Java (Android)
