All Engineering

Stream Loves Open Source: Aug 2022

At Stream, we rely on open source to build our products and SDKs. In this article, we want to take the time to highlight some of our favorite projects and maintainers ❤️. The key takeaway of this article is to support open source projects you rely on in any way you can. We can al…

Using Xcode: Creating Reusable and Shareable Color Palettes

Having a full range of colors that can be shared and reused in different Xcode projects improves efficiency and workflow because it removes the time wasted in looking for colors that will work together for your projects. Additionally, it ensures consistency of color usage within …

Definitive Flutter Painting Guide

“Everything is a widget.” Well, yes – but what is a widget? Widgets used in making Flutter apps can themselves be composed of smaller widgets. Most widgets carry some kind of visual component – either defined by themselves or represented by smaller widgets. Unlike native framewor…

Exploring Google’s Now in Android Open-Source Project

In 2022 Google I/O, Google’s DevRel team released an open-source project, Now in Android, built with the modern Android architecture and Jetpack libraries. In this article, you will cover the overall architecture, each layer, and tech stacks that are used in Now in Android projec…

Transformations in Machine Learning

On 8th September 2020, an article in the Guardian was written by a robot called GPT-3. They asked the robot to write an article about why humans should not be scared of robots and Artificial Intelligence. The human editors wrote the introduction for the article and instructed GPT…

Seeding a Core Data Store With Remote JSON Data

There are various situations where you’ll find yourself needing to import a sizable amount of JSON to seed a Core Data store. Sometimes you can ship this data alongside your app in the form of a pre-populated SQLite store. Other times, the data that you need to retrieve is so dyn…

WWDC State of the Union, What Can We Look Forward To?

Yesterday we wrote about the Apple WWDC Keynote on our blog. On the same day of the WWDC keynote, Apple also live-streamed the Apple WWDC Platform State of the Union. Apple focussed software developers often call this “the Developer Keynote”. The State of the Union session is a m…

Apple WWDC Keynote Impressions

Like many things, software development happens in cycles. Apple as a company is like this as well. Each year Apple releases new hardware and new major versions of their hardware and software. To give software developers working in the Apple ecosystem a chance to adopt new hardwar…

Server-Side Vapor Swift Implementation With Google, Apple, and Github Authentication

In this post, you’ll learn how to build a server application with the Vapor framework to provide tokens to an iOS app to use with the Stream Chat SDK. You’ll learn how to leverage different types of authentication for users and provide them with tokens. Note: for this tutorial, y…

The 2022 Android Developer Roadmap: Part 3

We’ve broken down our 2022 Android developer roadmap into a multi-part series. Each section dives deep into important Android fundamentals and the current Android ecosystem. In the last post, we discussed important elements of Android’s primary components, including Intents and A…

Building Your First Application With Deno

Deno is a recently launched runtime environment for JavaScript and TypeScript used for building modern server-side applications. In this article, you will learn how to build a backend server with Deno. I will show you how to create a live server, create API routes, store environm…

Modeling Retrofit Responses With Sealed Classes and Coroutines

As the rate of data communication increases, the complexity of the application architecture also increases. How an application handles API responses will determine its overall architectural design and code complexity. In this post, you will cover how to model Retrofit responses w…

Scaling Your Xcode Projects With Tuist

One of the biggest challenges for iOS development teams is scaling a codebase when their company or product takes off. Growth and scaling issues are a great thing, but they introduce some typical growing pains as well, like: Clearly defining responsibilities when splitting up you…

Reducing App and SDK Size With Emerge Tools

The Importance of Mobile App and SDK Size When developing a mobile app, one crucial performance metric is app size. An app’s size can be difficult to accurately measure with multiple variants and device spreads. Once measured, it’s even more difficult to understand and identify w…

The 2022 Android Developer Roadmap: Part 2

We’ve broken down the Android developer roadmap into five modules, each covering different aspects of the Android development ecosystem. In the last post, we discussed important elements of Android’s architecture, including the primary Android languages, the OS, the Android Platf…

AvatarView for Android: Take Your Profile Images to the Next Level

Introducing the AvatarView Library AvatarView supports loading profile images with fractional style, borders, indicators, and initials for Android. It also provides internal image loaders to load profile images with your loading strategies. To show you how useful the API is, this…

Tips & Tricks to Improve Flutter Performance

Held in Oslo, Norway (and more recently online), FlutterVikings is the largest community-driven Flutter conference in the Nordic region. Focused on Flutter and Dart, the conference gathers global Flutter experts from some of the world’s most innovative and well-known tech compani…

Build Vikings Feb 2022 Winners 🎉

As avid open-source Flutter developers, the Stream team was in full attendance at this year’s Flutter Vikings conference. Similar to our previous participation at Flutter Vikings, the team decided to host a codelab and hackathon for the event. For this year’s codelab, entrants we…

Exploring Jetpack WindowManager for Foldable Devices

Of this new generation of foldable devices, dual-screen devices, which provide symmetrical screens that work together in unique ways, are particularly interesting. But, they also present unique challenges. A key feature of these foldable, responsive UIs is that screen sizes can c…

The 2022 Android Developer Roadmap

The 2022 Android Developer Roadmap is designed to give you a comprehensive understanding of the current Android ecosystem and provides suggested learning paths along the way to help you grasp the concepts. In part one of this 5-part series, we’ll start by covering the first four …

Why Every Flutter Dev Should Care About BuildContext

While the quest for abstraction and the purist’s assertion that all APIs should be simple by design are both noble pursuits, there is a point where too much abstraction becomes harmful and hinders the personal growth of new developers. One of the most common complaints of develop…

Exploring Material You for Jetpack Compose

You’ll learn all about Material You and how you can dynamically import colors from the Material 3 Compose library into our versatile Chat Compose SDK, giving your app a more polished and personalized feel for your users. To show you just how powerful the API is, you’ll also learn…

macOS Performance Comparison: Flutter Desktop vs. Electron

This article covers the following: The underlying engines and technologies powering Flutter and Electron. Important performance considerations and how they relate to Flutter Desktop and Electron. Real performance metrics demoing example Flutter Desktop and Electron applications o…

Flutter vs React Native: The Ultimate Comparison

Over the years, it’s become common for developers to compare Flutter and React Native. Both are prevalent multi-platform tools for quickly and easily building mobile applications. If you walk into a developer meetup and ask the question, "What should I pick, Flutter or React Nati…

Building a Production-Ready Chat SDK Using Jetpack Compose

Released in July 2021, Jetpack Compose is the highly anticipated native UI toolkit for Android that is designed to help developers build faster and with more ease. After two years in development, Jetpack Compose is now in its 1.0 version, and is both stable and deeply flexible. S…

Keeping Public API in Check With the Kotlin Binary Validator Plugin

Within the Stream Chat Android SDK project, we use the Kotlin binary compatibility validator plugin to keep track of all the changes we make to our public API. This is a first-party plugin by JetBrains, though it’s still experimental (it’s an incubator project by JetBrains on Git…

Clean Chat Example App with Jetpack Compose

Stream now provides a Jetpack Compose Chat SDK. Check out the Compose Chat Messaging Tutorial and give it a try today! We’ve recently published a Jetpack Compose design sample on Twitter, recreating the Contacts & Messages design by Mickael Guillaume on Dribbble. The source code …

Activity Feed Personalization 101: Top Feed Features to Improve User Engagement

Personalization comes in many flavors, and the data science team at Stream can help you build your own feeds personalization engine based on your specific needs. In conjunction with our analytics client we recommend tracking every event for every user, such as clicking on a link)…

Jetpack Compose: First Impressions and Learning Resources

As you most certainly already know, Jetpack Compose is the hot new thing for Android UI development. Its promise is to save us by making all the pain points of the old View system and XML layouts go away. Stream now provides a Jetpack Compose Chat SDK. Check out the Compose Chat …

React Native: How To Build Bidirectional Infinite Scroll

Introduction There have been many discussions on Stack Overflow and GitHub around implementing infinite scroll using React Native, on top of FlatList or SectionList. I’ve found that there aren’t any easy solution out there for bidirectional infinite scroll for React Native. Recen…

Swift WebSockets: Starscream or URLSession in 2021?

Building applications such as online games and real-time chat has never been more straightforward since the standardization of the WebSocket protocol in 2011. Before that, most app experiences were plagued with manual refreshes to access the latest data available. Remember F5? Si…

Singleton vs Dependency Injection in Swift

When coding iOS apps, we often create classes that manage a particular aspect of the application. For example, it’s common to develop "manager" classes that encapsulate methods for interacting with a specific application aspect. These aspects commonly include the REST API, WebSoc…

Publishing Android libraries to MavenCentral in 2021

Introduction This is an updated version of an article published two years ago on blog.autsoft.hu. This new version supports non-Android libraries, uses command line GPG handling instead of a specific Windows GUI app, includes new best practices, and uses GitHub Actions for its CI…

Tutorial: How to Build a Slack Clone with React Native – Part 3

In Part 2 of this tutorial, we covered how to build Slack-like navigation, channel list screen, channel screen, reaction picker, and action sheet. In this tutorial, Part 3, we will build various search screens and thread screen. Resources 👇 Below are a few helpful links if you g…

Tutorial: How to Build a Slack Clone with React Native – Part 2

React Native has come a long way since its first release in 2015. In fact, it has enough components, APIs, and supporting libraries in its present state that you can re-create every app that’s out there on the Google Play Store or Apple App Store in no time! In this series, we wi…

Announcing Experimental Multi-Platform Support for the Stream Flutter SDK

Stream is always looking out for the next big thing in developer tools to build new applications. React Native was one of the first mobile development framework supported by our SDKs and is still going strong. We announced support for Dart/Flutter in February of 2020. Flutter has…

Choose Your iOS Dependencies Wisely

Dependencies are vital for most iOS projects. They allow us to speed up development and not reinvent the wheel every time we need components such as networking, rendering, chat, calendar, and many others which can be common to different types of projects. It’s also an efficient w…

How to use GitHub with Android Studio

Android Studio makes it easy to push changes to your favorite Open Source, professional, or personal projects on GitHub. In this tutorial, we’ll learn how to use GitHub with Android Studio. We’ll use an Open Source contribution for context. Android developers use Open Source proj…

Tutorial: How to Build a Slack Clone with React Native – Part 1

React Native has a significant footprint in the mobile development world. And with every new release, it gets better and better in terms of development speed and performance. Building a chat application used to be a massive chunk of work, but with the power of react-native and St…

Styled Components vs. CSS Stylesheets

Over the last few years, CSS-in-JS solutions have become prevalent across the front-end landscape with many offerings such as styled-components, and emotion that provides a way to colocate your components and style definitions. The power of these libraries lies in the ability to …

Stream Is Deprecating Virtual Go – It’s Time to Move to Go Modules

TL;DR Stream released vg almost three years ago, and since its inception, Go has improved quite a bit in regards to its dependency management. Since Go has come so far, we’re now advocating that the community use native Go modules rather than vg. The Gist Stream provides an API a…

Rolling a Custom Docs CMS with Slate and Django REST Framework

The Rundown In 2019 we realized we had a big problem here at Stream. Our documentation for Feeds and Chat was outdated, hard to navigate, and difficult to update due to legacy systems that were in place. We made it a goal to set out and build the best documentation site available…

Prevent Native Race Conditions with React’s Context API

Here on the Stream Services team, we have the pleasure of working with a variety of clients and get to solve exciting challenges daily. This blog post provides a peek into one such occasion by highlighting the intricacies of building a native app in Javascript, and the creative s…

Create a GraphQL API with Node, Mongoose, and Express

GraphQL is a technology that helps developers across the board to build more robust software more quickly. The ability to request all of the information you need in a single request is a game-changer. It has simplified my backend development of APIs for consumption by mobile and …

MongoDB vs. DocumentDB: Which Is Right for You?

Are you trying to decide if you should use MongoDB or DocumentDB? With the recent controversy surrounding licensing with MongoDB, it can be confusing to decide which option is right for your company or project. Amazon decided the core MongoDB code is challenging to scale while re…

Crafting a Command Line Experience that Developers Love

If you’re setting out to build a highly usable developer tool, it goes without saying that a proper CLI to interface with your API is paramount. As Zeit and Heroku have been setting the tone for these types of developer tools by doing extensive research into best practices when i…

How a Go Program Compiles down to Machine Code

Here at Stream, we use Go extensively, and it has drastically improved our productivity. We have also found that by using Go, the speed is outstanding and since we started using it, we have implemented mission-critical portions of our stack, such as our in-house storage engine po…

Go 1.11 Rocket Tutorial

This tutorial combines two of my favorite things, the Go programming language and images of SpaceX rocket launches. With Go rapidly picking up adoption in the developer community, its becoming one of the leading languages for building backend systems. Go’s performance is similar …

Google Feed Personalization and Recommender Systems

Lately, I’ve been using Google’s feed on Android and it contains several interesting best practices for content discovery. Google’s feed strikes an effective balance between machine learning and follow relationships. With the recent advancements in AI, it can be hard to know when…

JavaScript: Promises and Why Async/Await Wins the Battle

Asynchronous functions are a good and bad thing in JavaScript. The good side is that asynchronous functions are non-blocking and, therefore, are fast – especially in a Node.js context. The downside is that dealing with asynchronous functions can be cumbersome, as you sometimes ha…