Tech Stack of a Bootstrapped Startup

Welcomy Tech
5 min readFeb 13, 2022

--

Welcomy is a Software-as-a-Service solution for creating and managing customer portals (Hubs) to linking customers to your internal resources and solutions. We are selling our software to Enterprise customers and SMBs.

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:

We also use shell scripts mainly in the infrastructure to boot and configure our servers.

Languages

  • JSX: We use react for our frontend. JSX is an extension to JavaScript commonly used in React framework.
  • 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.

Frameworks

  • 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.

Servers

  • 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.

Databases

  • 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
    - EC2, ASG and ELB: To host and scale our servers
    - 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.

Development

  • 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.
  • NPM: Package manager for JavaScript libraries. Also provides entrypoints to test, run and build client code.
  • Postman: To test APIs locally and collaborate within the team by adding and sharing examples of API usage.

Other Tools

  • 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.

Originally published at https://www.welcomy.co on February 13, 2022.

--

--