Tech Stack of a Bootstrapped Startup
Aktualisiert: 4. Apr.
Howdy folks! We are Welcomy, a SaaS startup based out of Munich, Germany.
Being engineers, we constantly make use of shared resources available online, be it blogs, videos, podcasts, stack overflow(of course deserves to be on its own ;)) and what not. Thanks to our vibrant tech community, we have immense resources to learn from. In the same spirit of sharing knowledge, we would like to pay it forward by doing a write up on our tech stack.
So without further ado, here it goes:
Python: Most of our backend code is in Python. We feel most comfortable with it, simple to use and keeps the codebase manageable if the structure is right.
SCSS: An extension of CSS. We use it to keep our style sheets organized as it provides inline imports, variables and much more.
We also use shell scripts mainly in the infrastructure to boot and configure our servers.
React: The web app for the businesses and for the visitors are built using React. We use it because it allows us to write modular code, create reusable components, incredible community support and last but not the least, it provides us the foundation to transition to react native when we plan to build mobile app for the visitors.
Redux: We use to manage our web application state. Reasoning about the application state becomes easier as there is one source of truth which is the Redux store. Since using Redux requires you to follow a specific paradigm, the code also is much organized.
Create React App: Command line tool that helps in quickly generating a boilerplate react app. We use it as it allows us to concentrate on building the app itself by removing the need to maintain any frontend build pipelines.
Ant Design: Pretty popular design framework. We use it for all our UI components on our web app. So far the development experience has been very smooth as lot of the functionality that we needed was out of the box. The slightly concerning thing is that some of the Github issues are in Chinese, so its hard to follow the discussions on those.
Flask: A simple lightweight WSGI application framework which we use to build our APIs. Its incredibly simple to use, only comes with essentials, extensible if needed through extensions and huge community support.
Gunicorn: A WSGI Server which sits in front of flask to handle HTTP requests. We use it as its very easy to configure and not CPU intensive.
Nginx: Web server and also serves as a reverse proxy. We use it to handle SSL, CSP, serving static files, rate limiting and much more.
PostgreSQL: Popular relational database. Its robust and flexible(For instance it allows you to define custom types and use them for table inheritance). We use it to store all our application data.
Deployment and Infrastructure
Github Actions: We use it for our CI/CD pipelines. Again, we chose this because of its simplicity and reusability. There are numerous open sourced actions that are ready to use. For instance, there are actions for logging into ECR, for pushing/pulling images, actions for deploying task definitions to ECS, deploying to Elastic Beanstalk and much more. There is no need to reinvent the wheel. Plus, all the deployment environment variables and secrets reside on Github, there is no need to share it with another service be it circleCI, TravisCI etc.
Docker: We containerize our web app as it makes it platform independent. Any host which can run docker can run our web app. This allows us to have reproducible environments.
AWS: We extensively use several AWS services to manage our infrastructure. Some of the services we use:
Cloudwatch: For application logging and to monitor the health of the application through metrics.
RDS: To host our PostgreSQL database
Lambda: Hosts our serverless backend for one of our products
SES: To send out transactional emails to the users of the web app
Route 53: DNS to route traffic to the application servers
Special mention to Elastic Beanstalk as we use it as an orchestration service to manage our deploys and also scale our web app. It has made our lives much easier as we do not have to spend much time on managing our infrastructure. It takes care of the platform updates regularly, scales our application up and down using the configured metrics and provides app health monitoring. It provides a nice abstraction on some of the AWS services we use but also lets you open the hood to have more control over the underlying resources if necessary. The one drawback that we heard about Elastic Beanstalk when we were in the process of defining our infrastructure was about occasional unreliable deployments but we haven't experienced one in over 500+ deployments.(Hopefully, I didn't jinx it ;))
Vegeta: Simple to use load testing tool. We use it as a command line utility to hammer our application every now and then.
Github: To host our code
VS Code: Our code editor for both frontend and backend. It provides good intellisense, code navigation, good extensions like GitLense which is a supercharger for Git as it allows to do revision navigation, file annotations and even review Pull Requests in VS Code. Last but not the least, it also has a nice live collaboration tool which comes handy during pair or even mob programming ;) There are several other extensions which boost the development productivity. Maybe more about it in another blog post.
Invoke: Simple python task execution CLI. All it takes is two commands to build and run our application locally with hot reloading.
Pip: Package manager for python libraries.
Postman: To test APIs locally and collaborate within the team by adding and sharing examples of API usage.
Slack: We mainly use slack for communication(However, we are also considering discord as a substitute)
Zoho: We use it as our business email as its reliable and light on the pocket ;)
Trello: Our product management tool to plan for features, ideas, roadmap and to track issues. It also has several useful power ups/extensions. We can recommend Planyway as it has helped us in developing our product roadmaps.