When building Quickloop, our highest priority is moving fast and making a great product without costing a fortune. The first challenge that we (and many other tech founders) face early in their startup journey is choosing the right tech stacks. Setting a good foundation at this stage will enable us to build and iterate fast without causing many troubles in the long run.
Obviously, there’s no one-size-fits-all database that works for everyone. We’ve always liked SQL databases due to the strict schematics and query performance. However, for Quickloop at its early stage, we decided to go with MongoDB – a NoSQL database.
Unlike a SQL database, MongoDB offers enough flexibility for me to move forward quickly without overthinking the data model. It also significantly reduced overhead in database migration since the schemas can be dynamic.
It’s important to note that using a NoSQL database doesn’t mean we could ignore all rules and best practices in database design. Even though the schemas can be dynamic, we always treat them as strictly as possible. Occasionally, we still run manual backfilling scripts to maintain data integrity. Years of experience as a software engineer have taught us enough about the danger of a messy database.
At Quickloop, we use NX mono repo to manage code and share dependencies between multiple projects. Mono repo is a powerful architecture that enables us to keep both front and back-end code within one repository, making it easier to centralize our CI/CD pipeline and share common code.
For example, NX lets you create a library of common functions and share it between multiple projects without the need for symlinks, all within a single Git repository.
The API Framework
We started our API as a monolith service. However, we wanted to keep our door open to break it into microservices when needed.
For that reason, we use NestJS. NestJS may require a learning curve for beginners, but it provides a perfect framework to keep the code clean and modularized. It also offers some common features like authentication and validation out-of-the-box so you can focus more on your business logic.
Again, we wanted to move fast and focus on important features. That’s why we decided to outsource the authentication logic to Auth0 instead of writing our own code. If you’re still in the early stage, Auth0 free plan is more than enough, and it should take almost no time to get started.
When starting Quickloop, we decided to go serverless as early as possible. Serverless framework offers a quick way to deploy your backend at almost $0 cost while still maintaining its scalability when your app grows.
However, it comes with a risk when you’re not careful. We’ve once seen our bill shoot up 10 times because of a bug that constantly hammers our API. To avoid this, we later set up a billing alert on AWS to make sure we react quickly when the same thing happens again.
We use ReactJS for our frontend (just like many other startups). To be honest, there’s no rocket science behind our decision here – we picked it simply because that’s the framework we’re familiar with the most. But if you’re also using React for your product, here are a few npm libraries that help speed up our development:
- swr – a library for HTTP request cache. Therefore, we can significantly reduce global states.
- react-hook-form – a library with built-in functions to manage forms.
- usehooks-ts – a library of common React hooks so you don’t have to build them yourself.
- Chakra UI – a super neat and lightweight UI library. Its design is also much more modern than something like Material UI.
And that’s how Quickloop was able to build our first MVP in 6 weeks without giving up the product quality! After 2 months of launching, we’ve only received one bug report from our customers. We’ve also been profitable since day one due to our low server cost.
We hope this article can shed some light in your next journey! We’re excited for you and good luck!