Back to the blog

2025 Highlights: a year of travel, AI exploration, and community impact

2025 reminded us why we invest in deep expertise, real partnerships and curiosity-driven innovation. Here’s a look back at what shaped our year!

2025 reminded us why we invest in deep expertise, real partnerships and curiosity-driven innovation. Here’s a look back at what shaped our year!

This year has been a big one for Rebel App Studio, Codemate’s Flutter team. Across projects, platforms and countries, we’ve kept doing what we do best: Building products that matter, with talented people who care.

AI isn’t a trend, it’s the new standard

We don’t just use AI – we work with it in a very practical way. Across design, development, marketing and sales, AI has become a natural part of our daily toolkit. Sometimes it helps us move faster, sometimes it helps us think smarter, but above all, it supports how we build solutions for our clients. 

Over the past year, we’ve also been cooking up something new: Rebel AI Studio (not to be confused with Rebel APP Studio…) It reflects how we approach generative AI in practice – thoughtfully, with a strong focus on real use cases rather than hype. Rebel AI Studio is already part of our client work, and we’ll tell you all more about it soon!

Flutter is flying across platforms

We’ve stayed committed to Flutter since the early days, and this year we doubled down. More events, more community support, and more time spent helping clients make the most of it. From phones to TVs, Flutter is expanding fast, and we’re right there with it. We are LG’s leading partner in developing the webOS Flutter SDK Beta, and we’ve seen first-hand how Flutter is expanding to the TV world.

Read more about Flutter’s next big screen moment!

Long-term clients, long-term value

The majority of our business still comes from clients we’ve been working with for years – and we wouldn’t have it any other way. Whether it’s Moi, Restel or Schaeffler, these partnerships prove that real impact takes time, trust and continuity. We’re grateful to keep building together and to see our clients go forward.

People, places and dev talks

Our team travelled a lot this year – from local meetups to international conferences, and they were out there connecting, learning and sharing. The Fluttercon events in New York and Berlin were obviously highlights: our own Joonas Kerttula gave talks on building the Google Maps Navigation SDK for Flutter. Thanks to our ongoing collaboration with Google, we have the chance to contribute directly to the platform with real-world impact. Community is more than attendance – it’s participation, and we are proud to keep showing up for Flutter devs.

Read more: Behind the talk: Joonas’s Google Maps SDK Journey at Fluttercon USA

Read more: Rebels at Flutter & Friends: Connecting through code and community

Joonas Kerttula from Rebel App Studio on stage at Fluttercon USA 2025, preparing to present 'Behind the Plugin: Building Google Maps Navigation for Flutter'.

What we’re proudest of

Honestly? The whole package. Our crew has grown stronger, our average experience per developer keeps going up, and we’ve stayed curious through it all. Running a company like this takes more than good code. It takes bold clients, smart partners, and people who genuinely care. That’s the formula, that comes from Codemate.

See you in 2026 – and probably at the airport

We’re continuing on this path: more events, more community, more chances to collaborate. Thanks for being a part of this ride. Let’s keep building together! 

Would you benefit from having extremely senior Flutter team?

Contact Miika to learn how we can help you proceed with your digital projects:

Read more

All blogs
Back to the blog

Rebels at Flutter & Friends: Connecting through code and community

At Rebel App Studio by Codemate, we believe that building with Flutter goes far beyond creating mobile apps – it’s about shaping digital experiences that bring people together. That’s why we were proud to be the official streaming partner for Flutter & Friends again this year.

At Rebel App Studio by Codemate, we believe that building with Flutter goes far beyond creating mobile apps – it’s about shaping digital experiences that bring people together. That’s why we were proud to be the official streaming partner for Flutter & Friends again this year.

Flutter & Friends is a conference designed not only to share knowledge, but to celebrate collaboration and community. Our teammate, Tero Tarvainen, joined the event in person, cycling through the city with fellow Flutter devs and diving into technical talks and late-night conversations. Here’s why Flutter & Friends is more than just another tech conference.

Building connections before the code

Unlike most tech conferences, Flutter & Friends begins with people, not presentations. The first day was dedicated to community-building: a group bike ride through Stockholm, a traditional Swedish dinner, and a pub quiz to break the ice.

– I talked with one of the founders, Alec Åström, about the idea behind Flutter and Friends. He shared how, at many tech conferences, it can be really hard to connect with people – especially if you’re more introverted, Tero tells.

– His approach was to flip the format: instead of throwing people straight into a big conference crowd, Flutter and Friends starts with smaller group activities. That way, by the time the actual sessions begin, you’ve already met people, shared experiences and built connections, Tero adds.

This approach reflects values we share at Rebel App Studio by Codemate. We believe that strong technical work is built on trust and collaboration, and that happens naturally when people know each other beyond job titles and GitHub handles. Whether it’s company trips, movie nights or other activities, we invest in building great teams alongside delivering high-quality, expert solutions.

Ready to cycle through Stockholm!

All about the talks

The mix of low-level technical talks, big-picture architecture and creative real-world examples made the programme both inspiring and practical. Filip Hracek opened with “The Boring Keynote”, which challenged the idea that only glamorous features matter – and actually, it’s the boring things that make glamorous things possible. Also, Slava Egorov earns a special praise for his deep dive into isolates and concurrency; his ability to balance low-level technical details with humour made the session both insightful and memorable.

For Tero, some sessions opened new perspectives, and also things that he might not usually spend time researching. For example, Anna Leuschenko made Dart annotations click in a way he didn’t expect, while Morgan Hunt shared thought-provoking ideas about architecting for massive scale. Even while the listener might not agree with every detail, it’s valuable to hear another angle. 

– The best part, though, was being able to continue the conversations with speakers and attendees afterwards – something you can’t replicate by just watching the talks online, Tero says.

Friendships, afterparties and midnight swim

After a full day of talks, it was time to turn things up. The Flutter in the Dark afterparty, where devs faced each other in a tournament mode, trying to solve a problem. Smoke, lights, DJ, Flutter – what else would you need for a great party?

And just when you thought it was over: midnight swim time. A group of Flutter devs from around the world jumped into chilly water under the city lights. 

– There’s nothing like bonding after a midnight swim, Tero says.

Hacking, workshops and goodbyes

The last day was for workshops and Hackeroo. While Tero skipped the official workshops, he spent the day hacking on e-ink nametags and coding the Flame game.

– And then, way too soon, it was time to thank the organisers and go home. I came back full of ideas and inspiration, Tero sums up.

Final thoughts: Why it matters

Flutter & Friends reminds us that building software is as much about people as it is about platforms. At the conference, Tero noticed that it didn’t matter whether someone was just taking first steps with Flutter, or had been coding for decades – everyone was welcome, and everyone wanted to help each other forward. When developers connect, share, and learn together, it shows up in the code – and in the culture.

We’re happy to support that kind of community!

Header image: Flutter & Friends

Want to hear more about us?

Read more

All blogs
Back to the blog

Behind the talk: Joonas’s Google Maps SDK Journey at Fluttercon USA

Fluttercons are always something to look forward to in the Flutter world. This June, Fluttercon USA brought the community together in a unique setting at the Brooklyn Storehouse in New York City.

Fluttercons are always something to look forward to in the Flutter world. This June, Fluttercon USA brought the community together in a unique setting at the Brooklyn Storehouse in New York City.

At Fluttercon USA, it wasn’t just the weather that was hot – the talks, the experts and the conversations were 🔥 too!

Our crew, Toni Piirainen, Miika Toljamo and Joonas Kerttula, were there for the full experience. This time, Joonas took the stage with his talk, “Building Google Maps Navigation for Flutter“. In this post, we’ll share his reflections from the event and what it meant for us to be part of the action.

Our second round at Fluttercon USA

This was the second-ever Fluttercon USA – and our second time sponsoring it. Over the years, we’ve shown up for Fluttercon Europe and various other Flutter events, and it’s been awesome to watch Fluttercon gather more momentum in the US, too. 

With Droidcon taking place in the same venue, the crossover between Android and Flutter developers created great synergy. As Joonas puts it:

– The Flutter community is super tight-knit. This being my second time at Fluttercon USA, I ran into so many familiar faces. It was easy to continue the conversations we started last year.

– There were very interesting exhibitors this year, and I liked being able to see what others have built. I also had great chats with people from the Android side at Droidcon, Joonas adds.

Speaker and Rebel representative

Joonas had a busier schedule than a standard Fluttercon participant. He wasn’t just a visitor, but also a speaker and represented Rebel App Studio by Codemate at our booth. Despite the busy schedule,  he was able to get the full experience: While getting ready for his prime tech talk, he chatted with other attendees and found time to catch a couple of sessions. Before the official event even started, he had an opportunity to network with other speakers at the Speakers party at the Duolingo office.

– At the speaker’s party, I got a chance to network and exchange ideas with other speakers. It was a truly collaborative environment; you could see people fine-tuning their presentations in real-time to reflect the ongoing conversations, Joonas says.

Joonas Kerttula meeting Duolingo’s green owl mascot, Duo, at the speaker party in the Duolingo office.
This year, the speaker party was at Duolingo office. Joonas got to meet the official Duolingo mascot, an owl named Duo. Picture credits: Droidcon.

Behind the talk

Joonas’ talk focused on how we have built Google Maps Navigation for Flutter. The topic was inspired by our long-term work with Google and our hands-on experience developing the Navigation SDK and other plugins. 

– I gave a similar talk earlier this year at a GDG meetup in Helsinki, and I also practised a week before Fluttercon at our own Flutter meetup hosted in our office in Helsinki. That helped me figure out what works and what to tweak, Joonas explains. 

Even though his role at Codemate includes some presenting and he has experience speaking at meetups and teaching a few lessons at university, giving a talk at a major event still required some extra preparation.

– I thought a lot about how to keep the presentation technically engaging. Practising helped me to see what clicked with the audience and where I needed to adjust.

On the day of the talk, there were some nerves.

– I was a bit nervous before going up, but I think it went well overall, even if I accidentally skipped a few bits. I was happy with how it came out. 

The goal of the talk was clear.

– I put a lot of focus on plugin quality – testing and documentation really matter, especially in community plugins. I also  wanted the audience to learn that Flutter’s capabilities for native interoperability have significantly improved recently, allowing better ways to interact with native libraries, Joonas highlights.

Why developer events matter

For Joonas, the best part of Fluttercon wasn’t hitting the stage; it was the people. 

– You can find all kinds of info and articles online, but having face-to-face conversations with people who deeply understand Flutter architecture is just different. These chats are the best part of the events, Joonas says.

That connection – sharing ideas, giving feedback and learning from others – is what keeps the Flutter community thriving.

Thinking of giving a talk? Here’s Joonas’ advice:

For anyone thinking about giving a talk at developer events, Joonas says: “Do it, if you think you have something to give to the community”. He also has some tips for first-time talkers.

– Watch how others present! See how they structure their talk, pace the delivery, and present their key points. And then practise. A lot. Until it flows naturally.

See you at Fluttercon Europe!

We are not done with Fluttercons this year. Next stop: Berlin and Fluttercon Europe! Our team cannot wait to catch up with the community again and keep sharing what we’ve learned.

If you are heading there, let us know. We’d love to chat!

In the mean time, have a look at Joonas’ talk recording from Fluttercon USA:

Want to hear more about us?

Read more

All blogs
Back to the blog

From phones to TVs: Flutter’s next big screen moment

The digital world is not just smartphones in portrait orientation. It also includes tablets, watches, TVs, and so much more. For businesses centred on on-demand content, a TV app may already be part of their infrastructure. Adapting existing apps for TVs presents a fresh opportunity to reach users in their living rooms.

Flutter unlocks a new era of engaging, well-crafted, and visually stunning TV apps, enabling businesses to reach millions of devices with a single dev team. Smart TVs are no longer just passive screens; they’re an active platform for apps, services, and brand experiences. For companies building media, streaming, or content-rich products, this opens up a real business opportunity.

As LG’s leading partner in developing the webOS Flutter SDK Beta, we’ve seen first-hand how well it works in practice. Whether you’re adding TV support to an existing app or starting from scratch, many apps just run — with minimal effort. And since Flutter scales beautifully across screens, from TVs to phones, tablets and laptops, you can create consistent, native-feeling experiences without splitting your effort. In this post, we’ll show what that means in practice: technically, practically, and from a developer’s point of view.

The digital world is not just smartphones in portrait orientation. It also includes tablets, watches, TVs, and so much more. For businesses centred on on-demand content, a TV app may already be part of their infrastructure. Adapting existing apps for TVs presents a fresh opportunity to reach users in their living rooms.

Flutter unlocks a new era of engaging, well-crafted, and visually stunning TV apps, enabling businesses to reach millions of devices with a single dev team. Smart TVs are no longer just passive screens; they’re an active platform for apps, services, and brand experiences. For companies building media, streaming, or content-rich products, this opens up a real business opportunity.

As LG’s leading partner in developing the webOS Flutter SDK Beta, we’ve seen first-hand how well it works in practice. Whether you’re adding TV support to an existing app or starting from scratch, many apps just run — with minimal effort. And since Flutter scales beautifully across screens, from TVs to phones, tablets and laptops, you can create consistent, native-feeling experiences without splitting your effort. In this post, we’ll show what that means in practice: technically, practically, and from a developer’s point of view.

Platform support

Flutter supports several officially endorsed platforms maintained by Google: Android, iOS, Linux, macOS, Windows, and the web. Each package in the Flutter ecosystem indicates which platforms it supports.

LG and Samsung have extended the Flutter SDK to support their respective TV platforms. In practice, this means that instead of using the regular flutter command, developers should use flutter-webos for LG TVs or flutter-tizen for Samsung TVs.

Both manufacturers are also building their own ecosystems of packages tailored for webOS and Tizen.

Android TV

While there’s no official Flutter support for Android TV, it’s still a good old Android device, and Android is one of Flutter’s core platforms. That means building and running apps for Android TV is as straightforward as any other Android app. To optimise the experience, you may need to add a few new values to the AndroidManifest to ensure the app is recognised as a TV app and that the icon appears correctly on the home screen.

Samsung Tizen

Flutter-Tizen is an extension to the Flutter SDK designed to build apps on Tizen-powered devices, including TVs. It supports Tizen 6 and later (starting with devices released in 2021), and the SDK is officially supported by Samsung.

LG webOS

In 2024, LG announced their support for Flutter apps on the webOS platform. That same year, they hosted a TV app hackathon, where all three winners built games for LG TVs using Flutter.

LG is not only enabling Flutter development for webOS—they’re rewriting their own core webOS TV apps with Flutter. A public SDK release is expected in the first half of 2026.

A speaker presents on stage at Google I/O in May, introducing the Flutter webOS SDK. The slide highlights features like native webOS integration, dynamic audio, and lists beta partners including Lukas Klingsbo, Codemate, and others.
Codemate was featured among the beta partners for the Flutter webOS SDK at Google I/O 2025.

Codemate is LG’s leading partner in developing the webOS Flutter SDK Beta. From our experience, the SDK offers an excellent opportunity to add TV support to existing apps or to build new apps from scratch. We have used Flutter webOS SDK extensively and can say that many apps can be built for TV with minimal effort – most things just work when you run the app on TV.

Apple TV

There’s no official support from Google or Apple for Flutter on Apple TV. However, Flutter enthusiasts maintain a custom Flutter engine with Apple TV support. This project is experimental, and package availability is a big question mark.

Challenges of building TV apps with Flutter

Supporting a new device category or screen size always comes with challenges. For example, properly supporting tablets or foldables is not just making sure the app works, but also making the user experience great.

Here are some of the challenges we’ve encountered when bringing Flutter apps for TV:

Adaptive UI and big-screen considerations

TVs are large, but that doesn’t always mean you should use all available screen space for content. TV content is viewed from a distance and is usually navigated with a remote. This sets some limitations on how the content is presented to the user.

DRM content

One of the biggest challenges is playing DRM content on different TV platforms. Each platform needs its own implementation of DRM video playback. Tizen and webOS have their own custom video player packages with DRM support, but not all DRM protocols are supported across platforms. You’ll need to choose the right video player package for each platform and ensure the app knows which one it’s running on.

Detecting the platform at runtime

Since not all TV platforms are officially endorsed, normal runtime checks and conditional imports don’t always work. During our tests, we used Flutter flavours to identify the current platform at runtime.

Real TV testing

It’s not always possible to test how well the app works on a TV platform using an emulator. It could be a lack of emulator support or a less realistic and less physical testing environment. Thus, we’ve used real TVs to test the app on Android TV, Tizen and webOS.

D-pad navigation

Imagine using an app on a device without a touchscreen. This is something that should be considered when building TV apps. Usually, TVs have remotes with directional navigation (also known as D-pad, a set of arrow keys to select an element and an OK button to confirm the selection). This part doesn’t always work well with Flutter, especially with multi-directional scrolling and custom components.

For webOS, the Magic Remote is treated as a mouse pointer, which triggers hover events and works out of the box in Flutter.

Platform overview

PlatformStatus
Android TV✅ Supported
Samsung Tizen✅ Supported, SDK released
LG webOS✅ Supported, SDK to be released
Apple TV❌ Not supported

Flutter is no longer just about mobile — it’s stepping into the living room and onto the biggest screen in the house. With growing support for Android TV, Tizen, and webOS, developers have new opportunities to bring apps to the TV experience using the tools they already know. We’re excited to see Flutter’s future on the big screen unfold — and proud to play a small part in helping developers make the most of it.

Want to hear more about us?

Read more

All blogs
Back to the blog

Behind the apps: The story of one Flutter team

At Rebel App Studio, we’ve worked with Moi Mobile since 2019, when the first version of their app was built in record time – just ahead of the Ice Hockey World Championships in Finland, where Moi was a major sponsor. Since then, both Flutter and the dedicated team behind the project have grown significantly. While you can explore more about the collaboration in this article, this story brings the spotlight on the team that powers Moi’s cross-platform app development.

At Rebel App Studio, we’ve worked with Moi Mobile since 2019, when the first version of their app was built in record time – just ahead of the Ice Hockey World Championships in Finland, where Moi was a major sponsor. Since then, both Flutter and the dedicated team behind the project have grown significantly. While you can explore more about the collaboration in this article, this story brings the spotlight on the team that powers Moi’s cross-platform app development.

Efficient technology backed by experience

Flutter’s appeal lies in its fast development pace and ability to support multi-platform delivery from a single codebase. For Moi, it enables a six-person team to manage and develop four applications – for iOS, Android, and Web – simultaneously.

– When I became team lead, our team size doubled, and so did the number of applications. With native technologies, we would’ve likely needed a much larger team, says Jussi-Tapio Lamminheimo (Jusu), the team lead.

Starting with Flutter’s early days, this team has been ahead of the curve – building one of the first commercial Flutter for Web applications, which was even showcased at a Google meetup.

– Flutter helps us streamline app management through one codebase. It also boosts team satisfaction, because developers genuinely enjoy working with it, Jusu adds.

Building a culture of ownership, openness and agility

The team includes developers Alex Lindroos, Hung Nguyen, Mikael Gousetis, and Iiro Pelttari, along with designer Petri Pystynen. While Jusu provides guidance, daily collaboration is driven more by shared ownership and results than hierarchy.

– We have a flat structure. If we have different opinions, we talk them through – and if needed, we vote. Everyone has a say, Alex notes.

Instead of following agile methods by the book, the team has crafted a workflow that suits their rhythm:

– We follow sprints and respond quickly to evolving needs, Mikael explains.

– It’s agile, but in our own way – we’ve taken the parts that serve us best, Iiro adds.

This flexibility thrives on trust, feedback culture, and transparency. The team proactively supports one another, tackles issues collaboratively, and values constructive feedback – making continuous improvement a natural part of their everyday work.

– We don’t blame – we solve things together, Hung explains.

– We’ve built deep trust. There’s psychological safety to experiment and grow, Iiro says.

Intentional team-building yields long-term results

What makes this team’s dynamic exceptional is not luck; it’s intent. Over the years, they’ve invested in team-building both during and beyond working hours: sharing knowledge, solving problems together, and strengthening interpersonal trust through openness and honest communication.

While not every team becomes a tightly bonded unit overnight, the practices behind this one – psychological safety, shared goals, respect for one another’s strengths, and mutual accountability – are replicable and valuable for any project team. And fostering this kind of team culture is exactly what we always aim for at Rebel.

In addition to investing in team-building, we also prioritise employee happiness and retention. On average, our team members stay with us for nearly seven years – a rare figure in our industry, and a key reason why strong, lasting team dynamics like these can truly develop.

Moi team showed their creativity during Halloween 2023.

A partnership built on trust and continuity

Working closely with the same customer over time deepens mutual understanding. Jusu and the team know Moi’s business environment, values, and communication styles inside out, which leads to faster decisions, stronger alignment, and better outcomes.

– Jusu understands Moi’s needs intuitively. That clarity helps all of us deliver more efficiently, Petri says.

Despite balancing new development with app maintenance across four platforms, the team maintains consistently high morale and delivery quality. Their openness to collaboration and shared accountability is a cornerstone of the partnership’s success.

– We’ve been working together for years, and the chemistry we’ve built enhances both speed and quality. We can tackle anything together, Jusu notes.

From early adoption to streamlined excellence

From the early days of Flutter to today’s mature, multiplatform solutions, this team has evolved with the technology, always seeking better ways to deliver value.

– Back then, we had to invent our own solutions. Now, we’re focused on refining the user experience and performance, Hung shares.

– Flutter gives us the flexibility and consistency we need across platforms. Our users get a native-like experience, and we work from one codebase, Mikael and Petri agree.

It’s not just about the tools – it’s about the team

At Rebel App Studio, we believe that great digital products are the result of great teams. Technology like Flutter enables efficiency, but it’s the way teams collaborate, give feedback, and take ownership that truly makes a difference.The team behind Moi’s applications demonstrates how intentional team-building, trust, and shared purpose can be turned into long-term value, not just for the team but for the customer too.

Want to hear more about us?

Read more

All blogs
Back to the blog

4 key benefits of Flutter – and why it might be the right choice for your next app

Expectations for mobile apps have skyrocketed. Users want seamless services on their devices that don’t just work but also feel great – but building native apps separately for iOS, Android, web, and desktop? That can drain your budget faster than you say “MVP”.

So here’s the real question:

How can businesses build better, faster, more beautiful apps without breaking the bank? We are here to help you and to tell you the key benefits of Flutter.

Expectations for mobile apps have skyrocketed. Users want seamless services on their devices that don’t just work but also feel great – but building native apps separately for iOS, Android, web, and desktop? That can drain your budget faster than you say “MVP”.

So here’s the real question:

How can businesses build better, faster, more beautiful apps without breaking the bank? We are here to help you and to tell you the key benefits of Flutter.

In this post, we take a closer look to key benefits of Flutter, Google’s cross-platform framework, and why it’s become one of the most exciting choices in modern app development. We’ll explore its benefits from the perspective of designers, developers, business decision-makers and of course, end users.

What is Flutter, in a nutshell?

Flutter is a modern, open-source framework created by Google and based on our experience, it’s often the fastest, most elegant way to build high-quality products today.

With one codebase, you can build:

  • Android apps
  • iOS apps
  • Desktop apps for Windows, macOS and Linux
  • Progressive web apps
  • That’s a serious reach, all without juggling multiple tech stacks.

Read more: Moi Mobile – From young rascal to serious mobile operator contender

Of course, Flutter isn’t a silver bullet. It’s not the best solution for every use case – if you’re building a content-heavy blog or traditional web shop, there might be better tools. But when it comes to apps that need to look and feel good across different platforms, Flutter is hard to beat.

What are the key benefits of Flutter?

The benefits of Flutter go beyond just having a single codebase. It speeds up development, makes designing a breeze, and, most importantly, helps create apps that users love to use. Let’s look at benefits of Flutter through the lens of the people who matter most.

01 Designers love Flutter’s flexibility

If you’re a designer, Flutter is your playground. It gives you pixel-level control, which means your design vision can come to life exactly as intended, with no compromises. From sleek UI to smooth animations, Flutter gives you the tools to create consistently beautiful experiences across devices and platforms.

Coupon animation in Taco Bell Finland application.

Because development with Flutter is fast, design iteration becomes easier, too. Want to tweak a prototype and test it with real users? No problem. The feedback loop is short, so it’s easier to fine-tune your design based on real insight instead of guesswork.

02 Developers get speed and control

One of the benefits of Flutter is that it is built for productivity. Thanks to features like hot reload, developers can see changes instantly, which keeps the workflow smooth and efficient.

Example of the hot reload feature.

It also includes everything you need to build high-quality apps, right out of the box:

  • A huge library of ready-to-use widgets
  • No compromise on visuals – customise existing widgets to your needs or build your own widgets easily
  • Automated testing tools to keep things running smoothly
  • And a thriving global community to lean on

In short: developers can do more, faster, and have fun doing it.

If you want to learn more about test automation tools, check out our test automation tools -blog series!

03 Business stakeholders value its speed and cost-efficiency

The sooner you can get your product to market, the faster you can start learning, iterating and growing. Did you know that with Media Group Keskisuomalainen, we launched 17 apps in just 3 months – thanks to Flutter’s rapid development speed. It allows you to ship faster, more frequently, and with a smaller team. The sooner you get your product to market, the sooner you can start learning, iterating, and growing. 

No need for separate teams for Android, iOS and web. One skilled Flutter team can cover it all. That keeps overheads low and delivery timelines short.

And here’s something that often gets overlooked: long-term maintenance costs. Native apps can become expensive to maintain, especially when iOS updates demand rework. Flutter’s architecture helps mitigate that by shielding much of your codebase from those changes.

04 End users just notice that your app feels great

Most users don’t care what your app is built with, but they do care that it works flawlessly, feels intuitive, and looks fantastic – no matter what device they’re using. 

With Flutter, you get:

  • A consistent brand look across mobile, desktop and web
  • A smooth, bug-free experience, supported by automated testing
  • More time for developers to focus on building delightful features, not just the basics

All of which leads to happier users who keep coming back.

Let’s build something brilliant, together

There’s a lot that goes into building a 5-star app, and tech is just one part of the puzzle. For example, in a restaurant app, users might complain about delivery delays or missing mayo, not the app’s code. That’s why we approach every project with the full picture in mind.

With Flutter, we can move fast, stay flexible, and keep the focus where it belongs: on creating apps that users actually enjoy using.

At Rebel App Studio, our designers and developers work hand-in-hand to create seamless, user-focused experiences. Whether you’re still weighing your tech options or ready to dive into your next app build, we’re here to help.

Got a project in mind? Let’s chat.

Want to hear more about us?

Read more

All blogs
Back to the blog

Flutter localisation assumptions you should stop making

Localising an app in Flutter seems straightforward: define your strings, provide translations, and you’re done, right? Not quite. Even with Flutter’s powerful internationalisation tools and ARB file structure, subtle mistakes can creep in and lead to broken user experiences and localisation headaches.

If you’ve ever struggled with missing translations, inconsistent pluralisation, or strings that don’t quite fit the target language, you’re not alone. This blog explores the most common traps developers fall into when localising Flutter apps and shares practical tips to ensure your app speaks every language fluently.

Localising an app in Flutter seems straightforward: define your strings, provide translations, and you’re done, right? Not quite. Even with Flutter’s powerful internationalisation tools and ARB file structure, subtle mistakes can creep in and lead to broken user experiences and localisation headaches.

If you’ve ever struggled with missing translations, inconsistent pluralisation, or strings that don’t quite fit the target language, you’re not alone. This blog explores the most common traps developers fall into when localising Flutter apps and shares practical tips to ensure your app speaks every language fluently.

Flutter offers great built-in support for internationalisation. If you’re unfamiliar with it, Flutter uses ARB files (JSON-like files), with one file per supported language in the app. The main ARB file contains all key-value string pairs used by the app, while the other ARB files replicate the same keys with values translated into different languages:

intl_en.arb (default):
{
 "@@locale": "en",
 "homePageTitle": "Home page",
 "buttonText": "Open next page"
}

intl_fi.arb:
{
 "@@locale": "fi",
 "homePageTitle": "Kotisivu",
 "buttonText": "Avaa seuraava sivu"
}

While the process is straightforward, mistakes can still happen. From forgotten strings to assumptions about how all languages work, let’s dive into the most common localisation issues developers encounter and how to fix them.

01 Don’t forget to add strings to ARB files

It’s easy to overlook adding a string to the ARB file. This can result in an inconsistent user experience:

const Text('System status') // Can't be translated to other languages

02 Translate everything: avoid overlooking key texts

Some developers assume that text like unit names (e.g. “km” for kilometres or “MB” megabytes) don’t need localisation. However, unit names may differ in languages that don’t use Latin characters: For example: 

  • Greek: “km” → “χλμ” 
  • Bulgarian “km” → “км”
Text("$calculatedDistance km") // Can't be properly translated

03 Keep your strings updated: No room for errors

It’s human to forget. When adding a new string to the main localisation file, it’s easy to overlook providing the corresponding translations. During development or even before building a release app, there’s often no reminder to ensure up-to-date translations.

Another common issue arises when existing localisations are not updated after changes to a feature. For example, if a feature is modified and its strings are updated, developers might adjust the main translation strings to match the new design but neglect to update the translations. This results in inconsistent user experience and misleading translations.

Additionally, not all strings need to stay forever. If a string is no longer used, it should be removed to reduce translation workload and keep the localisation files clean. 

04 English isn’t universal: adjust for language rules

Languages handle plurals in different ways, and assuming English pluralisation rules apply universally can lead to incorrect translations. For example:

final myString = cartItems.length > 1 ? “items” : “item”;

This approach may work in English but fails in other languages with more complex pluralisation rules. Just to show the issue: the code above doesn’t even work for the quantity of 0 in English. The solution is to always use plurals in ARB files, which are designed to handle such variations.

Additionally, programmatically constructed strings often overlook important linguistic features such as word order, grammar cases, punctuation, and pluralisation rules:

final myString = strings.question + items.length + "?";

 Instead, use localisable strings that accommodate these nuances. For example:

"message": "Would you like to remove {count, plural, other{{count} items} one{{count} item}}?"

This structure enables accurate translations that respect the grammar and pluralisation rules of the target language, such as:

"message": "¿Desea eliminar {count, plural, other{{count} elementos} many{{count} elementos} one{{count} elemento}}?"

To better understand the pluralisation rules across different languages, unicode.org provides a detailed table of plural rules. These variations highlight why it’s often better to rely on Flutter’s built-in localisation support rather than attempting to build a custom solution.

05 Manage plurals properly: avoid missing or extra rules

Flutter supports plural strings for all supported languages, but the rules for plurals vary widely. For example, English requires just two options to handle all possible plural forms:

"message": "{count, plural, other{{count} items} one{{count} item}}"

In contrast, other languages may need more plural options to account for their specific grammar rules. . For instance:

  • Vietnamese uses only one option. 
  • Irish requires five options.
  • Arabic requires all six plural forms. 

Here’s an example of Arabic pluralisation:

"message": "{count, plural, other{{count} ceann} one{{count} cheann} two{{count} cheann} few{{count} cinn} many{{count} gcinn}}"

It’s important to avoid translating plural options that are not used in a particular language. Including unnecessary options increases the effort required to translate and maintain ARB files without providing any benefit. For example, normally English localisation does not need values for “zero,” “two,” “few,” or “many”, however it uses “one”, “two”, “few” and “other” as ordinals (values like “1st” or “2nd”).

06 Understand “One” and other plural forms

Despite their names, plural forms like “one” and “two” can apply to more than just the quantities of 1 and 2 in certain languages. For example, these forms may also apply to quantities like 21, 22, or even other specific quantities. Assuming “one” or “two” refers only to the quantities of 1 and 2 can lead to incorrect results:

"durationHours": "{count, plural, one{1 sat}..."

durationHours(1)  // Returns "1 sat" (correct)
durationHours(21) // Returns "1 sat" (incorrect)

The fix is easy: always use placeholders in plural strings to ensure the correct value is displayed:

"durationHours": "{count, plural, one{{count} sat}..."

This guarantees that the correct number is included in the output, respecting the pluralisation rules of the target language.

07 Define placeholder types for safer code

Specifying a placeholder type makes generated Dart code type-safe. For example, consider this string, which uses a placeholder but doesn’t define its type:

"key": "Hello, {username}!"

This will generate the following Flutter code:

String key(Object username) {
  return Intl.message(
    'Hello $username!',
    name: 'key',
    desc: '',
    args: [username],
  );
}

As you can see, the placeholder’s type is Object, which lacks type safety. To address this, you can explicitly define the placeholder type in the ARB file:

"key": "Hello, {username}!",
"@key": {
  "placeholders": {
    "username": {
      "type": "String"
    }
  }
}

This results in type-safe Dart code, ensuring only the correct type can be passed to the function:

String key(String username) {
  ...

By specifying types for placeholders, you reduce the risk of runtime errors and improve code robustness.

08 Account for text length: accessibility matters

The impact of text length on an app may not always be obvious. For example, limiting the text length in a Text widget can negatively affect the app’s accessibility:

return TextButton(
  onPressed: onPressed,
  child: const Text(
    'Add to cart',
    maxLines: 1,
  ),
);

If a user increases the text size in their device settings or if the app’s locale changes, the button’s label could become truncated, making it difficult or even impossible to read. Read more about the accessibility of Flutter apps in one of our previous articles here.

09 Keep ARB files clean and organised

While developers often strive to keep their code clean, ARB files are frequently overlooked—even though they are a crucial part of the app and eventually converted into Dart code.

Here are some common issues that can make ARB files and the generated Dart code inconsistent:

  • Key naming conventions: Inconsistent naming makes the file harder to maintain.
  • Empty @-keys: Keys meant for metadata but left empty create unnecessary clutter.
  • Empty strings: Untranslated or placeholder strings can cause runtime issues.
  • Redundant or unused @-keys: These add noise and increase maintenance overhead.
  • Duplicated keys: Repeated keys lead to conflicts and confusion in localisation.

By addressing these issues, ARB files can be kept clean, improving the maintainability and reliability of the app’s localisation.

Tools to simplify ARB file management

How can one identify, fix, and minimise issues in ARB files? While not all problems can be automatically detected and resolved, many common issues are easy to spot with tools provided by the Flutter community.

ARB Editor is an official VS Code extension from Google that checks ARB files’ validity. It’s a great extension that also provides a set of snippets for creating strings, plurals and selects.

Rebellion by Rebel App Studio is a command line lint tool for ARB files. It ensures that all strings are properly organised and that ARB files are free from errors. It can catch issues like missing translations, unused keys, incorrect pluralisation, and inconsistent naming conventions. For example:

> rebellion analyse ./lib/l10n/

l10n/intl_fi.arb: all caps string key "key2"
l10n/intl_fi.arb: no @@locale key found
l10n/intl_en.arb: key "@key4" is missing placeholders definition
l10n/intl_fi.arb key "key3" is missing a plural value "one"
l10n/intl_en.arb key "key3" contains a redundant plural value "zero"
l10n/intl_fi.arb: missing translation for key "key_5"
l10n/intl_fi.arb: @-key "@key" should only be present in the main file
l10n/intl_en.arb: key "key_5" does not match selected naming convention (camel case)

8 issues found

Adding Rebellion to your CI/CD pipeline ensures potential issues are caught before they’re merged into the main branch, saving you time and preventing errors from reaching production. We’re continuously improving Rebellion, with plans to integrate lint rules directly into the IDE for even smoother development workflows.

Let’s connect!

Rebellion is built by developers, for developers, and we’re always looking for feedback to make it even better. If you have questions about ARB file management, localisation best practices, or how to integrate Rebellion into your projects, feel free to reach out to us.

Want to hear more about us?

Read more

All blogs
Back to the blog

2024 highlights: New platforms, stronger teams, and a thriving Flutter community

As 2024 draws to a close, we at Rebel App Studio want to take a moment to reflect. It’s been another great year for Rebels, as we’ve continued to create stunning Flutter apps and make meaningful contributions to the Flutter community – which we love dearly!

As 2024 draws to a close, we at Rebel App Studio want to take a moment to reflect. It’s been another great year for Rebels, as we’ve continued to create stunning Flutter apps and make meaningful contributions to the Flutter community – which we love dearly!

A year of growth

2024 was a year of success for both Rebels and Flutter. With an increasing number of big production apps built using Flutter—including several developed by our team—we’ve seen the framework thrive. Rebel App Studioby Codemate now boasts a team of 100 skilled professionals and strong operations in Europe and the US. As part of a larger company group with over 1,500 consultants, we have the expertise and resources to tackle any technical challenge or business goal.

Rebel App Studio by Codemate is, above all, about our awesome employees, and our top priority is to give them opportunities to grow and advance in their careers. One of the best ways to grow is by collaborating with a team of experts who inspire and challenge you. This commitment is reflected in some key achievements from 2024:

🚀 Our eNPS remains consistently excellent, scoring above 50.
👩‍💻 The average coding experience across our team is now 15+ years.
🏆 The median employee tenure has reached an impressive 6.8 years.

Unlocking new platforms

This year, we are continuing to unlock Flutter’s full potential, exploring new possibilities with projects targeting emerging screens. As early adopters, we were among the first in the world to create a production Flutter app – Hookle’s iOS and Android apps launched in 2017 while Flutter was still in beta. In 2021, we broke new ground again with the Moi Web app, one of the first Flutter for Web applications. Now, in 2024, we are thrilled to announce that we are developing multiple Flutter apps for TV platforms, including Android TV, Tizen and webOS. 

Building solutions that make a difference

This year, our team was privileged to work on impactful projects that solve real-world problems.

Here are some highlights:

📰 Media Group Keskisuomalainen: Driving digital transformation for Finland’s largest media group
📱 Moi Mobile: Elevating a bold mobile operator contender to the next level
🌮 Taco Bell Finland: Creating a user-centric app to boost customer engagement

These collaborations showcase our ability to create innovative, tailored solutions that meet the unique needs of our clients and their users.

Sharing knowledge, building community

This year, our Rebels took centre stage on the global Flutter scene. In July, we joined Fluttercon Europe, sharing our expertise and connecting with the vibrant Flutter community. Not stopping there, we had the honour of participating in the first-ever Fluttercon USA in September.

For the second consecutive year, we partnered with Flutter & Friends to host engaging livestreams, further cementing our place in the Flutter ecosystem. These collaborations allowed us to share insights, learn from others, and contribute to the ever-growing Flutter ecosystem.

Building for everyone: Accessibility and localisation highlights of 2024

Empowering the Flutter community with practical, developer-friendly solutions is at the core of what we do. In fall 2024, we launched Rebellion, a tool designed to simplify localisation in Flutter apps. With Rebellion, developers can easily check localisation files for errors, making it easier to create apps that resonate with users worldwide.

Accessibility also saw major strides. We updated our Accessibility Tools, by adding a set of tools for manual accessibility testing. Now font size, dark/light theme, text direction, bold text flag, and visual density can be changed directly from the app to ensure that your app handles changes correctly. This aligns with our focus on the upcoming European Accessibility Act, which will bring accessibility requirements to new heights in 2025.

Psst 🤫 Our senior developer Alexander shared insights on accessibility tools during Fluttercon Europe—check out his talk here.

Looking forward

To date, we have released over 80 Flutter applications, solidifying our expertise and commitment to delivering exceptional cross-platform solutions.

As we prepare for 2025, we’re excited to continue innovating, collaborating, and growing within the Flutter community. Thank you to our clients, partners, and team members for making 2024 unforgettable. Here’s to an even brighter future!

Would you benefit from having extremely senior Flutter experts on your team?

Contact Miika to learn how we can help you proceed with your digital projects:

Read more

All blogs
Back to the blog

Flutter vs FlutterFlow: which is right for your project?

Are you considering whether FlutterFlow can benefit your development team or project? FlutterFlow is a low-code platform that allows users to build mobile applications using a visual drag-and-drop interface, making it an appealing option for teams with limited coding experience. We tested this by developing the same app twice – once using Flutter and once using FlutterFlow. Our goal was to see how each method impacts development from various perspectives, including resource usage and the overall developer experience.

Are you considering whether FlutterFlow can benefit your development team or project? FlutterFlow is a low-code platform that allows users to build mobile applications using a visual drag-and-drop interface, making it an appealing option for teams with limited coding experience. We tested this by developing the same app twice – once using Flutter and once using FlutterFlow. Our goal was to see how each method impacts development from various perspectives, including resource usage and the overall developer experience.

In this blog, we summarise the insights from software developer, Joakim Liukkonen, who coded a simple app using both tools.

Key differences in resource usage

Why consider FlutterFlow? Here are some factors that standout:

Time savings

FlutterFlow’s drag-and-drop interface makes prototyping faster, saving valuable time for other essential project phases, such as gathering customer requirements and design.

💵 Cost efficiency

With faster production times, you can save money on development costs, especially during the early stages. FlutterFlow is also an excellent tool for less experienced developers or interns to contribute to simpler tasks, lowering overall resource costs.

⚖️ Lower expertise requirements

FlutterFlow is beginner-friendly and requires less expertise to get started, making it an ideal choice for teams with limited experience in mobile development.

While these factors make FlutterFlow appealing, Flutter has its advantages. Though it may take longer to develop prototypes, Flutter produces robust, cross-platform applications with code quality that stands out, especially when handled by experienced developers. If your project demands higher complexity and long-term maintenance, Flutter’s flexibility and powerful features are more likely to meet your needs.

Choosing between Flutter and FlutterFlow

When deciding between Flutter and FlutterFlow, consider the nature of your project. If you’re focusing on quick prototypes or proofs of concept, FlutterFlow’s speed and ease of use are highly advantageous. However, for larger, more intricate projects that require expert-level customisation and long-term code maintenance, Flutter is the better choice.

In some cases, you may find a complementary approach works best – using both tools where they excel. For instance, you can create a prototype in FlutterFlow but switch to Flutter for full-scale development, keeping in mind the limitations of back-and-forth transitions between the two.

Flutter vs. FlutterFlow

A simple example elaborating the difference between Flutter and FlutterFlow code.

Developer experience: Flutter vs. FlutterFlow

The development experience with Flutter and FlutterFlow differs significantly based on a developer’s expertise level.

Flutter allows senior developers to take full control of the code structure, optimising it for maintainability and performance. Experienced developers prefer this freedom, as it enables them to produce clean, efficient code tailored to the project’s specific needs.

FlutterFlow drag and drop editor.

On the other hand, FlutterFlow’s drag-and-drop interface requires minimal coding skills, making it ideal for less experienced developers. However, as projects grow more complex, FlutterFlow’s auto-generated code can become difficult to manage, especially compared to the well-structured code that can be written with Flutter.

During our experiment, Liukkonen noted that FlutterFlow lacks the flexibility to organise widgets, variables, or files in a developer-friendly manner. In contrast, Flutter gives developers complete control over how they structure the app, allowing for greater scalability and easier code management.

Final takeaways: Which tool should you use?

Here are three key takeaways from our experiment:

🤙🏽 FlutterFlow excels in prototyping and quick PoCs

Its low barrier to entry allows for rapid prototyping, enabling more team members to contribute to the development process, even with minimal coding experience.

👥 Flutter is the go-to for complex projects requiring expert-level control

Projects that require a high degree of customization and long-term maintenance benefit from the flexibility and structure Flutter offers, making it the preferred tool for senior developers.

💙 Resource savings intrigue many companies

For short-term projects or those needing quick proof-of-concept development, FlutterFlow’s simplicity and speed make it an attractive option. It also enables non-developers to contribute to UI changes, speeding up updates and involving more team members in the process.

Bonus Tip:

FlutterFlow can even be a fun, easy way to introduce coding concepts to beginners – including primary school students! 🖥️

Contact Miika

Read more

All blogs
Back to the blog

Flutter Test Automation with widget and golden tests

We have prepared a three-article series on test automation for everyone interested in the quality of digital projects. The first article helps you identify how to achieve your goals through test automation. The second article will provide an introduction to Flutter automation testing, catering to Flutter testers and developers. The third and final article in the series delves deeper into Flutter test automation, specifically tailored for Flutter developers.

We have prepared a three-article series on test automation for everyone interested in the quality of digital projects. The first article helps you identify how to achieve your goals through test automation. The second article will provide an introduction to Flutter automation testing, catering to Flutter testers and developers. The third and final article in the series delves deeper into Flutter test automation, specifically tailored for Flutter developers.

Widget tests

Widgets tests despite their name can help testing the whole user flow, not only separate widgets. For example, Burger King Suomi app has many widget tests to test that the most important parts of what the user does in the app work as expected: signing in, finding a restaurant, using coupons, customizing a meal, placing an order. Some tests check the whole flow end to end: from app launch to successfully placed order.

Since widgets tests can be run headlessly (without a device or emulator) it’s impossible to make network calls, use actual user accounts and real backend responses. In order to overcome this we’re using a lot of mock data.

Most of the mocks are happening at the very bottom of the app’s layered architecture. For example, HTTP client returns mock API responses in order to return a certain menu structure, coupon or error code. Mocking API calls makes the app work architecturally the same way it does when using actual API responses. These mocks don’t change the way app’s business logic works, there’s no special “test app behavior”.

The reason we’re using widgets tests to test user flows is that they’re easier to write and faster to run than Flutter’s integration tests. We run widget tests before every pull request can be merged to main.

Here’s an example of a simple widget test for ShoppingCardWidget’s functionality of adding cart items:

testWidgets(
  'ShoppingCartWidget can add items to the cart',
  (WidgetTester tester) async {
    // Build the widget
    await tester.pumpWidget(ShoppingCartWidget());
    await tester.pumpAndSettle();

    // Verify that the cart is initially empty
    expect(find.text('Cart is empty'), findsOneWidget);

    // Tap on the "Add Item" button
    await tester.tap(find.text('Add to cart'));
    await tester.pumpAndSettle();

    // Verify that the cart now contains the added item
    expect(find.text('Item added to cart'), findsOneWidget);
    expect(find.text('Cart: 1 item'), findsOneWidget);
  },
);

Golden tests

Running tests headlessly is the same as running the app on a device but instead of an app or a window for drawing it uses a virtual canvas. This canvas is an array of pixels and can be saved as a picture.

Golden tests compare the current state of the canvas with the previously saved state. In practice it works as pixel by pixel comparison of screenshots. In a way it’s the same old “expect” but instead of checking an object it compares two images.

As with other test types, it’s important to test what actually matters. Golden tests easily fail if there’s a tiny UI change. It’s easy to update golden files but it’s harder to validate these changes. For example, if there’s a one-liner color change in the app’s theme it’s quite possible that a lot of PNGs would need to be regenerated and thoroughly checked by a human at the pull request review step. This could lead to issues when reviewer didn’t notice some unwanted changes.

Here’s an addition to the previous code example where golden test is used to check how widget looks before and after new card item is added:

// Build the widget
// ...

// Initial state: cart is empty
await screenMatchesGolden(tester, 'shopping_cart_widget_initial');

// Tap on the "Add Item" button
// ...

// One cart item state
await screenMatchesGolden(tester, 'shopping_cart_widget_one_item');

Testing is an important part of the app development process. Deciding what and how to test is crucial for ensuring the reliability and functionality of the app. Framework and community offer many options for testing. To learn more about testing Flutter apps explore official documentation and golden_toolkit package documentation.

Wrap up

We hope you have enjoyed reading some of our thoughts on Flutter test automation and perhaps will take a few ideas that can promote active discussion before you jump in. Follow our Rebel App Studio X account if you haven’t already. We share timely topics and provide updates on Flutter related events we are arranging or participating in.

Want to hear more about us?

Read more

All blogs