Starting a new code project? Look here first to select the right technologies.
This is a collection of guides for starting new projects. It's a living document that will be updated as we learn more about what works and what doesn't.
The goal of this document is to help you select the right technologies for your project. By standardizing on a set of technologies, we can maintain a consistent codebase and make it easier to onboard new developers.
Since we jump between projects frequently, it's important that we can quickly get up to speed on a new codebase. That's why we've selected some standard technologies you should use, or have a good reason not to use.
- We use TypeScript for all projects on web, server and IoT. It's a superset of JavaScript that adds static typing and other features. It's a great way to write code that's easier to maintain and less error-prone. It can be used on web, server, mobile and IoT
- All code should be stored in GitHub, with documentation bundled in the same repository
- We use automation to build, test and deploy our code. This ensures that we can deploy code quickly and reliably
- The primary branch is called
main
- Protect the
main
branch and require pull requests for merging - This branch must always be deployable. Only merge code that's ready to be released
- Protect the
- Use Conventional Commits for commit messages. This makes it easier to generate changelogs and automate releases
- You can use Husky to enforce this. It'll block commits that don't follow the format
- Stick to Semantic Versioning for version numbers if your project uses versioning. This makes it easier to understand the impact of a new release
- Install the Release Please GitHub Action to automate releases. This generates the changelog, releases the new version and bumps the version number for you
We use React, preferably Next.js, for all new web projects
- Next.js is a framework for building web applications with React
- Vercel is a platform for hosting Next.js applications. It also supports serverless functions to link to a database or other services
We use React Native for mobile apps. It lets us quickly prototype apps, but also release to both iOS and Android.
- Expo is a framework for building React Native apps
- Expo Application Services is a cloud service for building and deploying React Native apps. It also supports push notifications and hotfixes
We have an Apple Developer and Google Play Console account to submit apps to the App Store and Google Play.
We manage IoT devices (mostly Raspberry Pis) with Balena. It's a great way to manage a fleet of devices and deploy code to them. We can push code to all devices without having to physically connect to each one.
- BalenaCloud is a platform for managing IoT devices. It supports Raspberry Pi, Intel NUC, and other devices
- BalenaOS is a lightweight operating system for IoT devices. It lets us run Docker containers on our devices
We use the CKC & partners server infrastructure for backend and full stack services. This supports Node.js, Python and PHP applications, and static websites. You get to pick from MySQL and MariaDB databases.
- Nest.js is a framework for building Node.js applications
Depending on your needs, you can pick between a NoSQL and SQL database. NoSQL is great for prototyping, but some more complicated queries are easier to write in SQL.
- Firebase Firestore is a NoSQL database that's easy to use and scales automatically
We use GitHub Actions for CI/CD. Services like Vercel have built-in support for GitHub Actions.
We want to make it easy to sign in to our applications with existing credentials, so please don't roll your own authentication system. We use the following services for authentication:
- CKC Account is the Auth0 based single sign-on service that we use for customer facing authentication
- Auth0 has SDKs and quickstarts for most platforms, so it's easy to integrate with
- CKC Account also supports employee authentication for mixed use applications
- Azure Active Directory is the single sign-on service for employee authentication