Architectural overview of the system, its parts and their interactions + why we chose this particular stack?
PHP Laravel backend running on AWS Lambda through Laravel Vapor with RDS database (MySQL). Frontend is a React Native build to cross platform (iOS and Android). We went with the backend to speed up building during the early stage as it enabled us to go fast due to framework capabilities and our experience with it. React Native is a natural choice to allow limited resources to deploy cross platform without independent team working in native.
Laravel was decided on as the team has long experience with this and it would be the most efficient framework to work with especially on the MVP phase of the project. Having available Laravel Vapor was another deciding factor as it allowed us to have a robust production infrastructure without needing dedicated knowledge.
Frontend (apps) - React Native was an easy choice as we were (and still are) a small team and having a shared codebase between Android and iOS (With only minor tweaks to each platform) was necessary.
While we don’t expect real scale challenges in the short term, we are set up for this through the way we use AWS Lamba. We are hosting images on AWS S3 as well. Other services we integrate to facilitate insight are Postmark, Bugsnag, Segment and Intercom. We also send notifications through Twilio and Pusher.
Development is managed through Shortcut for ticketing, connected to a GitHub organisation where we host our private repos.
In terms of CI/CD, we use GitHub actions for all of our pipelines, which are in charge of running tests, running SonarCloud analysis and performing builds. For our mobile CI/CD needs, we have deployed a Mac Mini over the cloud which is capable of running Github Actions jobs.
We have linters enabled on pre commit hooks both for React Native and PHP. We are also covering most of the important parts with unit tests in both applications. At the moment we are working on integrating e2e tests with Detox in our main application.
How are we approaching mobile development and publishing?
Typical workflow for a new mobile feature: