When my co-founder and I started Moo.do, our goals seemed far too ambitious for the two of us alone. We wanted to build an email client, todo list, kanban board, and calendar — all working together in one app. With real-time collaboration on all desktop and mobile platforms.

Of course, that much work would be nuts for just two people.

We were passionate about the front-end user experience, but to make our product work we would also need to build a large scalable backend. This in itself would be a huge amount of work, so we would need to hire developers to build the backend and manage the servers.

To afford that, we would be stuck investing months into getting VC funding. And then it would take a few more months to hire employees and ramp them up.

And all of that would be before we could start validating whether customers would even like the product.

Fortunately, we started right when cloud databases like the Google Drive Realtime API and Firebase were launching. We realized we could skip the backend completely, save a huge amount of time and money, and bootstrap the company ourselves.

Serverless

Serverless is the hip new trend in web development these days. The idea is that your server code magically runs in the cloud while the cloud provider manages and scales their servers behind the scenes. It’s a great way to reduce the work required to build a web app. But we took it even further: Moo.do is fully client-side and we use free external services as our backend.

Ok, that’s actually a little bit of a lie. We do have a small server just for minor user account details like settings and billing, but that’s it.

This is an enormous undertaking, and it would have been impossible if we had to build the backend required for large-scale data storage and real-time collaboration as well as the web and mobile apps.

How it works

All of a user’s private data is stored in their personal Google Drive account and we use client-side APIs for everything:

When you launch the app, everything is downloaded and stored locally in Application Cache so that it can work offline and to speed up load time. It loads any local data stored in IndexedDB and then connects to the Google Drive Realtime API to set up the real-time sync, and syncs with the Gmail, Google Calendar, and Google Drive APIs. And finally it quickly pings our server to confirm the user’s premium account status.

In typical web apps, most of that would happen on the server instead of on the client. Doing it all client-side might sound crazy, but I’ll explain why: