Identified confirmed/reported issues such as re-renders and created a backlog for potential improvements.
measure
Used Macro tool measurements.
ANALYZE
Selected the most promising performance changes.
IMPROVE
Implemented changes following React Native best practices.
CONTROL
Re-measured with the Marco tool and compared to the 4.58.0 native version.
Deployment
Developed the release process for both Android and iOS.
API DESIGN
Proposed an API based on the Rive Android library features.
INTEGRATION
Implemented Rive SDK integration for Android and created an example app for testing.
iOS SUPPORT
Extended the integration to iOS after successful Android testing.
AUTOMATION
Created a Github Action workflow for automated library releases.
PUBLIC RELEASE
Made the library publicly available on platforms like CocoaPods and Maven.
DEPENDENCIES
Managing dependencies, including Expo and react-native packages for each new release.
RELEASES
Automating the release process with custom GitHub Actions.
TRAINING
Providing React Native training through pair programming, code reviews, and workshops.
01
CODE REFACTORING
Kicked off the project with refactoring the whole socket.MIGRATION Migrated the codebase to TypeScript.
02
MIGRATION
Migrated the codebase to TypeScript.
03
DEPENDENCIES
Upgraded major dependencies such as Expo, React Navigation, and React Query.
04
PAYMENTS
Created two options: In-app purchase with Google Play or App Store and credit card payment.
05
linking
Sorted out links, integrated content, and implemented html rendering.
We provided full front-end support, project configuration, feature parity, and expert advice on technical and user experience. We also implemented a new design guideline, including dark mode with auto theme detection.
01
RN PAPER
Forked the React Native Paper library.
02
ci
Established continuous integration for automated code updates.
03
testing
Set up a Storybook for component testing.
04
design
Developed the basis of the design – color, layout, and typography.
Once we had the basics down, we started working on the UI library components. The components we developed included: AppBar, TextField. Button, Icon Button, Toast, which included animation and swipe-to-dismiss, Match Status, Search, and many more!
Apart from all the fixes and improvements, we provided metrics that should be tracked over time so the client knows exactly what to monitor and correct to maintain great performance levels long term.
16.8s
App start time, before 48.5s
8.6s
Report screen load time, before 15.9s
2.5s
Sending a message, before 14.5s
60FPS
Average FPS on LHN
2.6s
Search screen load time, before 11.8s
01
Together
we acted as staff augmentation within Advantys’ team.
02
Engaged
in collaborative problem-solving and solution exploration.
03
supervised
by Advantys' CTO, the project utilized GitHub, Notion, and Slack for communication.
01
migrating
from a custom server-side rendering (SSR) solution to Next.js
02
Focusing
on Core Web Vitals metrics
03
Optimizing
a large shared JS bundle
04
Introducing
Fast Refresh for accelerated development iterations
The introduction of Fast Refresh in Next.js further accelerated development iterations. All in all, it contributed to an enhanced user and developer experience.In a span of several months, our team effectively overhauled the AutoZone app's performance, which initially struggled on both desktop and mobile devices. To find out more about the whole AutoZone project, head over to the case study on main case study title.
01
strong
architecture with professional maintenance and continuous updates
02
high
code coverage with quality-compliant unit and integration tests
03
Comprehensive
testing, including end-to-end.
04
Faster
time-to-market with mobile process automation.
05
New PoC
features like biometrics and mobile health kit integration.
Last but not least, our collaboration significantly enhanced the knowledge of Thriva's development team regarding React and React Native.
Students new to programming and React Native
Web developers unfamiliar with device APIs and native apps
Native developers exploring web app frameworks and React Native's UX potential
React Native developers prototyping and sharing ideas
Library maintainers creating examples and documentation
Users providing reproducible cases for bug reports
Speakers and workshop presenters conducting live coding sessions
We at We Are Voice realized the need to have a React Native app for our choral music service. In that process, Callstack became a natural development partner for us given their deep knowledge of the platform. Despite the geographical distance, our collaboration has been successful with strong deliveries on time, together with a good communication.
Martin Rolinski
-
CEO We Are Voice
In brief
We optimized the client’s mobile app performance and introduced a custom tool to measure performance regressions. We set up performance tests and documentation to enable a seamless transition of knowledge with the in-house team of developers.
Client Info
Entain is one of the world’s largest sports betting and gaming entertainment groups.
Industry
Commercial gaming
Company type
Enterprise
Region
Australia, Asia & Oceania
Tech Info
Performance optimization project with the best practices, approaches & tech solutions
Technologies
React Native | Native
Platforms
iOS | Android
Stack
Redux | Tanstack | Reassure | GraphQL
Performance Boost
87.5%
In 87.5% of the screens, the number of rerenders decreased or remained the same, which affected the acceleration of the initial performance.
In brief
An app that allows choral singers to work on their arrangements with voice files and notes
The main problem laid in the complexity of one of the main application requirements, the music service.
Given the music player specifications, we were challenged to prove that React Native has no limits when it comes to build mobile applications, no matter how complex they are. Performance and cross-platform were a must, so we needed to deal with Android and iOS native audio APIs, implement multi-channel audio streaming, support searching and come up with an unified API exposed to JavaScript.
The other part of the system was the score SVG, that represented the notes and voices for a particular arrangement and had to work seamlessly and harmonically with the music player, taking things like the tempo and highlighting the notes into account. Last but not least, the player had to work in an offline mode, being able to send out analytics data regardless the network status.
Native module vs Native UI Component
That was one of the cases when bridging the native code to JS was necessary, forcing us to write different ad-hoc code for Android (in Kotlin) and iOS (in Objective C) for the audio streaming. In React Native, there are two different approaches to expose functionality to JavaScript - a native module or a native UI component.
Going with the Native UI Component
Native modules are inherently imperative, whereas UI components are declarative. React presents a declarative model, giving us a chance to express UI as a function of state and props. But it doesn’t have to be UI at all.
The power of React Native Animated API and Interpolation
In fact, we can take any imperative API and encapsulate it on a declarative component. That’s the beauty of React. We have chosen the approach of using a native UI component, which allowed us to remove one of the most important constraints in the music player implementation - time.
Highly performant music player on both Android and iOS
Having a possible further development in mind, we’ve left an open door for the possibility of decoupling the player from the app, to make it a standalone package that lets us test songs in isolation. We have proved that React Native is ready for the high stakes after being put under the test and coming up with a high performant music player that works seamlessly on both Android and iOS. Also, the high predictability of the system is another win, thanks to the declarative approach we have taken. As a result, we have developed an application that has around 20k active users and growing, with a rating on Android Play Store of 4.7/5.
Power of React Native Animated API and Interpolation
We had two different pieces that worked separately, the music player and the SVG score. How did we set the whole system in motion? With the power of React Native Animated API and Interpolation. A native scrollview component exposes a callback in JS that fires every time we get new scroll positions, but the scrolling occurs on the native side. Source
If you think about it, a music player can be analyzed with the same mental model, just by replacing scroll positions with timestamps. It means that by leveraging Animated API and Interpolation in particular, we can define all the system motion upfront, just once, declaratively. Hooking up native-JS events with Animated.event we can define all the relationships with different interpolations over this.state.progress (score, vertical tempo bar, progress bar...). Moreover, if we use the right transformations, such as transforms, we can offload all the animations to the native driver, relieving the JS thread. Source
For solving the SVG scaling issue, we decided to integrate a proxy serverless lambda in order to wrap the SVG into an HTML document, so we can control the meta tags added and avoid render inconsistencies between iOS and Android, that could have arose otherwise.
If we had chosen a Native Module instead of a Native UI Component, we couldn’t have tackled the problem that way and the state machine of the music player would be way more complex.
We Are Voice is an initiative that makes singing together easier and more fun. With an application that offers the singers the possibility of working on their arrangements with voice files and notes, the company aims to facilitate the everyday life of choir singers and choir leaders, by combining a communication system and streaming music service.