Skip to main content

Overview

This document shows a overview of the technologies we use in our projects.

Repository​

We use a monorepo structure for handling all code related to a specific application. Every application domain is inside this repository: backend, IoT, machine learning, web, and mobile applications. Such repository structure is helpful because we can access any part of the application without changing the repository.

We follow this template.

Our primary runtime environment is Node.js, with TypeScript as primary programming language. We opt for it because it can handle the entire stack, from Lambdas to web applications.

Backend​

We work heavily with cloud computing, in special using AWS. Some services that we commonly use in our applications:

Depending on the application, we can use other services, such as Amazon Kinesis Video Streams with WebRTC or AWS IoT Core.

We follow what we call CloudFormation Driven Development (CFNDD). We make cloud resources deployments by CluodFormation templates—infrastructure as code.

Datacube​

We call Datacube a group of resources containing all our applications' data. We can think about this group as "If we lost some resource inside this group and if it doesn't have a backup, we lost your application." It can be an Amazon DynamoDB table, Amazon Cognito user pool, or an Amazon S3 bucket.

Our principal technology for databases is Amazon DynamoDB. We always try to create applications using a single table, mainly because it's serverless. But we always consider all database options, and it depends on the kind of database that is more effective for the application we're building.

APIs​

Backend communicates with clients through APIs. GraphQL API with AWS AppSync is our leading choice when building an application.

Frontend​

We've chosen React to be our main library to build user interfaces. We've decided to use it because it has a big community and we can build web, mobile, desktop, VR applications, and email templates. It's the same idea for choosing Node.js: learn one thing, use it everywhere.

We divide our frontend applications into two parts: UI and App.

UI​

It takes care of the design system and the basic UI components. The technologies we use here are:

  • Storybook to develop the components and document them.
  • Theme UI for theming and design system. We've chosen this library because it fits our design process, and it has a robust design specification based on styled system.

App​

It is responsible for creating the application itself. It handles API requests, routing, authentication, among others. Depending on the kind of application, we may use:

To handle data fetching, Relay is our option if we're using a GraphQL API. If it's a REST API, we choose React Query.

Testing​

Testing is an indispensable step of our development process because it guarantees lower engineering costs in the future. This article shows how we evolved our development process and planning over time.

We've chosen Jest to be our testing framework. Jest comes in handy because we can use it on backend and frontend packages. Together with Jest, we also use React Testing Library to get APIs for working with React components.