
Writing
Building Ship Companion: A No-Server Side Project Adventure
Hey everyone,
I recently launched a little side project called Ship Companion, an app designed to help guests on traditional sailing ships, particularly those navigating the beautiful IJsselmeer in the Netherlands. This wasn't just about building another app; it was a personal journey driven by specific goals and constraints, and I wanted to share a bit about the process.
Spotting a Need (and a Personal Challenge)
Working alongside my day job, I was itching to build something tangible, something different. A key personal constraint I set was: no servers. My day-to-day often involves backend systems, and I wanted this project to be entirely client-side.
Around the same time, I noticed a few things in the traditional sailing community. Firstly, many ships, despite offering amazing experiences, sometimes struggle to connect with new guests. Secondly, once guests are onboard, there's often a recurring pattern: skippers patiently explain the same details about harbours and points of interest trip after trip. It struck me that there wasn't really a dedicated app for any of these ships yet.
Providing guests with easy access to information about the ship, the trip, and the locations visited could reduce uncertainty and enhance their experience. An offline map, accessible even when wandering around a harbour town without the skipper, seemed like a logical core feature.
Choosing the Tools: Flutter and... Google Sheets?
With the “no server” rule firmly in place and the need to support both iOS and Android, the tech stack started taking shape. I opted for Flutter. I have prior experience with it, and frankly, I wasn't keen on learning React Native from scratch for this side project.
Now, how do you get ship-specific data into a serverless app, especially when you need an easy way for non-technical ship owners to update it? The solution: a highly structured and validated Google Sheet. Skippers fill in their details in a familiar spreadsheet format. I then wrote Python scripts to parse the sheet, validate the data, and convert it into configuration files that the app bundles and reads locally.
The Big Technical Hurdle: Offline Maps Without the Bloat
The map feature was crucial, but it presented the biggest technical challenge under the “no server” constraint. How do you get detailed map data for the entire IJsselmeer region onto a user's phone without requiring a multi-gigabyte download?
- Local Dev Server: During development, I set up a local OpenStreetMap tile server.
- Hyperlocal Tile Generation: I generated very specific, hyperlocal map tile packages — only the relevant coastlines, harbours, and waterways of the IJsselmeer.
- Limited Zoom Levels: Only two zoom levels: an overview for the general sailing area and a detailed harbour level for navigation on foot.
- Bundling: These pre-rendered, minimal tile sets are bundled directly within the app.
Beyond the Code: The Full Product Lifecycle
This project wasn't just about coding. I explicitly wanted to experience the entire process of bringing a product to market. This meant:
- Actually founding a small company (necessary legal structures).
- Navigating the sometimes-painful App Store and Google Play review processes.
- Creating basic marketing materials.
Reflections
Building Ship Companion has been an incredible learning experience. It's stretching me beyond pure software development into business administration and marketing. There's a deep satisfaction in tackling these varied challenges and seeing an idea through to completion.
It also feels great to give something back to the sailing community, a world where I've personally learned a lot. And honestly? It's been fantastic to just build again, driven by the enjoyment of the process itself. It's reminded me why I fell in love with software development in the first place.
Thanks for reading about the journey!