Spotlight: Cross-Platform Graffiti App

In this project I was the developer for the team at the agency A&B One Digital tasked with designing and implementing an image composer app for Diakonie Deutschland. Sadly, due to company politics™, the app has yet to be published.

The application was a continuation of a previous concept: use pictures of known landmarks in Berlin, such as the Brandenburg Gate or a piece of the Berlin wall, and overlay it with your personal message, stylized like a graffiti. Provocative vandalism without the vandalism.

To allow a broad use for the social media image generator, the app was planned to be published for iOS and Android.

Tall benchmarks

What do customers reference when they describe what they want? Correct, the familiar things they use every day. In this case, the order was to create an image composer like Instagram’s, with intuitive edit controls, stickers, and text layers.

Even if it was a little unrealistic to achieve the same smooth frictionless compositing experience as a company with a developer budget of a country, we did manage to produce a delightful little app (IMHO).

The secret sauce: Flutter

At the time, hype around Flutter was quite large, and Dart seemed like a language that was straight-forward to learn. And it worked out brilliantly. Flutter’s UI element library is a great source to get started and learn how to build things, Dart’s hot reload saved a ton of time, and the multi-touch gesture handling was one of features I had implemented by the end of the first few days.

Of course, there were downsides as well. With Flutter being relatively young at the time, the open source package situation was often dismal. Use the pre-alpha library or let it inspire you to roll your own? And after almost every update of the Flutter SDK, some package broke in a new and interesting way. Notable exceptions were the excellent image and share packages.

9 out of 10, would recommend

Creating a mobile application that can run on many platforms is not only possible, it’s almost easy. It becomes hard as soon as you reach the edge of what the framework authors considered a priority. Interacting with the platform itself can be frustrating, squeezing out performance by writing native code becomes a fiddly mess, and sometimes a certain effect is just not possible within the existing structure.

Luckily, jump to definition works because Flutter is open source. When becoming stuck it is invaluable to be able to see how the sausage is made.