MoSCoW method in digital products design

Prioritization is one of the things we need to do for all the steps in the project creation. We can use a lot of different techniques to make these decisions easier and faster. Below, we say a little bit more about one of the most common methods we often use in workshops. 

What is MoSCoW and why should you know it? 

It’s one of the simplest and easiest ways to check what functions have the biggest priority in a project. It is helpful in defining the MVP of the project. You can use this method in analysis, business, project workshops, and more. MoSCoW creates a common understanding of the topic for all stakeholders. It’s good to ensure that all the team members know what is a priority for each requirement. 

Important! Remember that every prioritization method is actual only for a specific moment of the project. For example, on different stages of project development or a few months later this priority list can look a little bit different. Why? The answer is easy – priorities we use for the given situations can change in time. 

What does MoSCoW mean?

Below, we crack what is covered by letter M, S, C, and W. We also explain what it means.

Must have: Project cannot exist without it (without it our project will fail)

Should have: Must-have in the long run (necessary to have, but project can exist without it)

Could have: Low-cost tweaking (nice to have, but not necessary)

Won’t have: Get back to them at better days (we can use them for the future)

How to use it correctly?

What is important – every method often needs to be fitted for a specific situation, project, and stakeholders. For example, there is no one way for us to make a canva for this method.  Sometimes we put it into a square, sometimes we present it on timeline, and another time we put dots on story mapping to add for a quick prioritization. But for what it is worth, most important are the questions that will guide you through this method:

Must have

Without what product/things/service can’t work?

What is critical from the user’s point of view?

Which requirements realize the business benefit?

When will it make no sense?

… and more

Should and could

What is necessary to have, but a project can exist without it?
What is nice to have?
What gives extra value but is low-cost?


What can we plan in the next phase of the project?
What will we not do this time/sprint/MVP?

What gives extra value but is high-cost?

To summarize, MoSCoW is a nice technique that we like to use and totally recommend. We wrote this post to show you the value of work and functionalities prioritization. Hopefully, now you understand why it is so important. You should also definitely try it! Not sure how? Contact us to figure out how we can help in your product development.

How does a tester work in Scrum?

1. What’s Scrum?

It’s a highly elastic framework allowing a team of specialists to work on complex problems and provide iterative solutions that translate into a highest value, quality product.

Scrum is a simple and effective methodology of working as a group on complex products. Its creators define it as easy to learn, hard to master, and more accurately – as a light methodology in the context of processes, easy to comprehend, but demanding when it comes to mastering it to the core. Main difficulties are implementing it in organizations that aren’t based on agile project management and executing the idea of Scrum in practise. A project conducted according to Scrum will be as complicated and advanced as the team members want it to be.

1.1. Roles in a Scrum team.

We can define three main roles in a Scrum team:

  • Product owner: responsible for product value maximization resulting from Project Team’s work and Product Backlog management.
  • Development Team: a group of specialists who provide a product potentially ready for delivery at the end of every Sprint. Project teams are organized and authorised by a client to manage their own work. It results in a synergy which optimizes the overall efficiency and effectiveness of the Developers Team. 
  • Scrum Master: responsible for promoting and supporting Scrum, helping each member of the team understand the methodology’s theory, practices, principles, and values. It’s a person who also assists in communication between a project team and the rest of the organization so it’s beneficial for both sides and maximizes the value created by the Scrum Team. Scrum Master organizes all the meetings, too.

1.2. Scrum events.

The idea of Scrum is completing the project by a self-sufficient and self-organized group. The work of Development Teams is based on a series of cyclical events – they plan the tasks possible to fulfill in a particular sprint. As a result of every iteration, we have a closed part of a product a Scrum Team is working on. 

  • Sprint: a time interval defined in a project in which a team has to provide a previously planned part of the software. A duration of sprint can vary depending on the project’s specifics and can take from 1 to 4 weeks. 
  • Sprint planning: a meeting during which the team members plan the scope of to-do work in the next Sprint. They use a chosen manner of tasks estimation. A popular practice is defining/evaluating the complexity of fulfilling a task with Story Points.
  • Daily Scrum: everyday, maximally 15-minutes long meeting during which each team member answers these three questions:
  • What did I do yesterday?
  • What do I plan to do today?
  • Do I have any problems that make it harder to complete the sprint’s goal?
  • Sprint Review: a meeting organized at the end of a finished sprint allowing the team and and stakeholders (e.g. business departments, marketing or other interested entities representatives) to see the results of work in a particular sprint. The presentation is conducted by the development team members who show the effects of work in the form of a readymade software and answer the stakeholders’ questions and suggestions.
  • Sprint Retrospective: a meeting at the end of sprint allows the team to evaluate its work and develop improvements that should be implemented in the next round. During the meeting, the team should answer the three crucial questions:
  • What went well during the sprint?
  • What can be improved in the next sprint? (ideas)
  • Which improvements will be implemented in the next sprint?
  • Scrum Grooming: separate, cyclical meeting of the whole project team to review and optimize the Product Backlog elements. 

Every event mentioned above can have a different course and form of realization depending on the team and practices of a particular organization. However, they should be an integral part of the work cycle in sprints to let the team work according to the Scrum framework. 

2. The role of a tester in a Scrum team.

In the perfect version of Scrum Team, each member has sufficient competence to fulfill every task. Then, what’s the role of a tester if it’s not clearly defined in the methodology’s assumptions?

In a team built according to Scrum dynamics, the role of a tester shouldn’t be based only on testing readymade fragments of software. It starts at the stage of planning. A tester, along with the development team members, discusses and analyzes individual elements of the software and helps plan the stages of development. When the project team works out the details of implementation, a tester identifies how the particular functionalities should work and, at this stage, is able to create tests (in the form of Test Plans). A tester can also look for defects while discussing and planning the implementation of functionalities. 

During sprints, when the development team fulfills the goals, a tester can still work on adjusting and maintaining the test cases or prepare the data necessary for applying tests after the programmers’ job is done.   

3. The idiosyncrasy of a tester’s work in Scrum.

What are the advantages of such a broad testers’ participation in creating products in teams based on the Scrum methodology?

Most of all, an actual impact on the product. A possibility to suggest improvements during the scrum events for solutions worked out by the team. A tester has a chance to detect errors on a very early stage of work or even before it starts which translates directly into reducing the final product cost. 

Working in Scrum is characterized by efficient and frequent communication between all the people involved in the process of software development. Close cooperation with all the team members, from Project Owner through the whole development team to the Scrum Master, has a great impact on the information flow and high comfort of working. 

A tester who co-creates the product in a Scrum team has a chance of influencing and smattering every stage of the process so the final product was possibly the best, highest quality, safe, and complete. 

Other advantages of testers working in Scrum:

  • Thanks to participating in the project development at the early stage, a tester has time to prepare an analysis and functionality fragments testing, and doesn’t have to deal with a readymade product with many functionalities and dependencies.
  • Considering the time needed for tests at the stage of planning the work of the project team allows obtaining an accurate estimation of the team’s engagement with planned functionalities.
  • Possibility of basing the tests on User Stories (US) can be a groundwork for tests planning and the satisfaction criteria can be an oracle for some test cases.
  • Working on defined US provides clear and transparent acceptance criteria (AC) that allow addressing them at the stage of verification.

As every methodology, Scrum is not challenge free. Here are some elements that can be quite demanding in testers’ work:

  • A large number of meetings can influence the speed of work. The scope of testers’ interest is so broad that they could participate in most iterations which is extremely time consuming (we should highlight the fact that the time is definitely not lost but the situation can be organizationally demanding).
  • It’s possible to modify and verify the testing documentation in the form of TP and TC many times due to the dynamics of conducting scrum projects and their high elasticity.
  • Another time-absorbing element in constantly evolving and developing projects are regression tests that validate maintaining integrity of the software which is continuously changed and improved.
  • Depending on the project team work’s organization, it can turn out that the end of the sprint is characterized by a large accumulation of tasks to be tested. It can result in exceeding the time of sprint or not providing the functionality according to the methodology’s assumptions. 

Working in Scrum projects is not for everyone. It requires a certain style of work – dynamic and adjustable to a load of multilateral communication. However, testing being a part of the scrum team enables independence and self-reliance while completing the tasks which translates into higher possibilities of self-improvement. It also gives a lot of satisfaction – a tester has a chance to take care of the product’s quality at every stage of its life. 

nopCommerce hosting capabilities

When you have your application or internet shop completed, the last and the most important thing is to deploy your application to the server. You can do it using different pages that share hosting features or server spaces. In today’s article we would like to give you some insights about the pros and cons of each of them and help you choose the best fitted option. 

Differences between server and hosting

A server is a physical machine which contains separate spaces available for specific resources, including those transferred to subsequent clients, such as web hosting, mail hosting, etc. One server may contain data of many clients. In this case, we talk about the concept of shared hosting. Private server may contain more than one application which can consist of separate programs, sites or work together like a big business app. Having your own machine allows you to configure all features starting from the operating system and finishing up with security settings.

Hosting, on the other hand, is a separate part of the server power and capacity. Multiple hosts on a single server create so-called shared hosting. The whole mechanism behaves like a multi-family house, so all its users draw from the resources of one server which can be expanded but is still limited by parameters. Users and their behavior can influence other users but they can always count on the support of the administrator who still manages the whole server.

How to choose best fitted solution for your shop

Users who expect full control over their space, use the services of an exclusive server, such as a dedicated server. This way, they depend on their needs and available resources, create space, and give it adequate computing power. It’s dependent only upon the power and  the internet provider. Subcontractors’ or user’s skills can help manage the server’s services. The owner is the administrator, but he can still use the help of other service providers. Server is a more expensive option than hosting, but gives a better option for scalability and allows you to set up an environment specifically for your application. If you can handle administration tasks on your own, this solution should be better.

On the other hand, we also have shared hosting services – they are cheap and popular. A client who starts building his presence on the internet, usually does not know how big his application will be. Shared hosting offers many packets which can be upgraded to better  performance plans expanding its capacity and calculation power. What’s unfortunate about this solution is that hosting plans have limited resources when you hit maximum performance limit. It would be a better option to change your service to dedicated server or server in cloud (VPS).

Recommended solution for enterprise class e-shop

Virtual private server in cloud

Most recommended services are the solutions from Azure. Its virtual machines allow you to configure continuous deployment, support windows and Linux platforms, have built-in autoscale and load balancing features. It helps you monitor your budget, gives unlimited opportunity to scale up your machine, encrypt sensitive data, protect the server from malicious threats, and secure network traffic.

Second most renowned one is cloud platform based on AWS (Amazon Web Services). It’s quite similar to Azure. Its sample service which we can use to deploy and host the application is AWS Elastic Beanstalk. It’s easy for deploying and scaling web apps and automatically handles the deployment process from capacity provisioning, load balancing, auto-scaling to application health monitoring. It’s important to know that it can scale the application up and down based on its workload. This feature minimizes costs of virtual machines.


Recommended hostings for nopCommerce internet shops can be found on the official site.

If you want to choose a good hosting provider, it’s important to know the price, performance, bandwidth, processing power, security, backups, certificates support, and up-time. Hosting nopCommerce additionally requires windows-based hosting providers which support ASP.Net Core and database SQL Server or MySQL.

nopCommerce server requirements

All applications that run on computers have their hardware and software requirements. It’s similar when we deploy an application on a server. Programs need specific resources to work correctly. We can often see that, after completed deployment, an internet shop doesn’t use much resources, but when it comes to rush hours, the server can be loaded up to 100%.

nopCommerce provides information about technology and system requirements, which need to be fulfilled.

If you are looking for the best solution for your nopCommerce store, we will gladly provide you with our recommendations.

GraphQL on Android with Apollo Client

Next revolution

GraphQL is a really hot topic now. While it’s adopted by backend and frontend, the natural path is to transform the mobile side also. But the task is not so trivial. After years of battling about the best mobile architecture, Android developers around the world agreed to a more or less common technological stack.

There is a Room library for the local databases, RxKotlin for reactive streams, and finally some code like Retrofit to handle REST requests. In most cases, with their use a project will be completed painlessly and in reasonable time.

Do we need the next revolution? If we want to ship products even faster, the answer is yes!

Benefits of GraphQL

GraphQL is a quite new solution with concepts varying from the current approach. Fundamental idea to perceive the results as a graph is made to cure most of the REST’s weak points.

Let’s recall the advantages of GraphQL:

  • Strong typed data
  • Reduced size of response
  • Better performance
  • Generated documentation
  • Useful tools
  • Active community

That is a lot! Now, what impact does it have on mobile architecture?

Choose the right way

At this moment we have two ways to start consuming graph’s responses. First is to use Apollo Client written for mobile platforms. Second is to adjust the current HTTP consumer for receiving and sending query language requests.

In my opinion, a dedicated Apollo solution is better to start coding and significantly accelerates the process of creating an MVP. In this article, I assume that we are using Apollo Client for Android which can be found here.

Let’s see how much code we have to write to start.

apollo client graph ql

This is very straightforward – with default values creating a client is just a matter of 3 lines of code 🙂

Everything in single query

The main goal of this technology is to combine data from different sources in a single response. From the backend side it seems logical to have a separate table in the database and corresponding REST endpoint for a single type of information, for example a list of jobs.


What if the frontend (mobile) has to present a list of jobs with an additional thing. In this case, the logo of a company may be serving a job offer. The problem is illustrated in the image below.

To reach this result with REST API, it is necessary to follow these steps:

  1. Fetch a list of jobs
  2. Fetch a list of companies
  3. Create a model for job
  4. Create a model for company
  5. Merge fields from both models in view and display

It is a lot of work for such a simple list. On the other hand, graph query may look like this:

graph ql diagram

Then you will receive all pieces of information you were asking for in only one response! 🙂

Strong typed data and model generation

Using the GraphQL, we always know the type of returned field. This way, it doesn’t lead to errors recognized from REST API, like expecting Integer and receiving String.

Moreover, the declared type tells you whether a value can be null or not. It is especially important for modern languages like Swift or Kotlin with null-safety for models.

Speaking of models, a code from Apollo automatically generates classes. It really simplifies all the process of handling responses from the network.

Generated job model by Apollo may look like this:

graph ql iteo

As you can see, although all code is generated, it is much logical for a data class!

It is also worth mentioning that, when generated models are very handy, the developer loses some flexibility, such as use of generics, abstraction, and inheritance.

Cache strategy

With a single query, a user can fetch a lot of info. For example a list of jobs already with their details. It would be great to cache this list for future usage, e.g. offline work. For our convenience, Apollo Client has three steps of caching:

  • HTTP cache – sets regular well known HTTP cache for queries with appropriate policy
  • Normalized cache – stores in memory pieces of response that can be reused in future
  • Automatic Persisted Queries – immediately returns cached queries on server and thus graph doesn’t have to be searched every time

It allows building blazing fast applications without annoying loaders just with a few lines of code.

Without problems during migration

All these functionalities are awesome and mostly can convince developers that GraphQL is better and faster than REST, but what if we want to migrate an existing project?

Fortunately, an Apollo product can generate models in both Kotlin and Java. What’s more, it is based on regular okHttpClient so if you have experience with Retrofit this knowledge is suitable here, too.

It is possible to use RxJava or Kotlin Coroutines for handling the results – it depends on your necessities.

Great documentation

This advantage doesn’t correspond directly to Apollo Client but working with well written documentation is easier and faster. 

GraphQL tools like GraphiQL or GraphQL Voyager help understand the API and see what fields will be returned. 

Developers can write queries and test their result right in the browser. Many of these online documentations are interactive which means you can jump between the nested types.

I won’t go through all the details. The key is that a developer fetching information from the server knows everything and doesn’t have to attach external tools like Postman.


Nowadays, GraphQL seems to be a perfect technology for creating MVP. Developers can focus more on the visual layer of application and consume data right from the queries.

It is too early to say whether applications made with Apollo Client will scale without the efforts. Generated models, break up with REST methods, and different approaches may lead to some complications in the future.

In my opinion, Android development should be calmly adopting GraphQL as it reduces much of the work on the earliest stages of production.

Want to know more? We’ve already written about the architecture and advantages of this technology in our latest blogpost

If you’d like to see sample repository with examples used in this article, check our github.

All you need to know about Size Classes

As you may know, there are more and more devices working under the iOS system. Differences in their sizes may cause problems connected with adjusting the elements’ size while creating an application. To make it all easier, Apple introduced so-called Size Classes which allow distinguishing the device’s size we’re dealing with. 

1. What are Size Classes?

Both iPad and iPhone enable changing the orientation from vertical to horizontal which comes with simultaneous alteration of width and height. It means that the value which was a width before changes into height and vice versa. Size Classes help recognize what kind of case we’re dealing with. There are some features that allow us to establish if the current size is regular or compact. The regular value defines a vast space, and compact a limited one. The size can consist of one of the combinations:

  • Width regular, height regular
  • Width regular, height compact
  • Width compact, height regular
  • Width compact, height regular

This approach allows reducing all the brainstorming connected with placing the interface’s elements to four cases only – we aren’t bothered with factors such as: resolution, kind of device, or orientation. A well prepared Size Classes solution results in the app’s predictability and compatibility with previous establishments on every iOS system device. 

size classes

2. Size Classes’ behaviour on iPads and iPhones

Defaultly, in case of iPhones, the device’s height is defined as regular and its width as compact. For iPads both values are regular. It gets a little bit complicated when the device’s orientation changes into vertical. It’s well described in Pic. 1. Smaller devices both values are compact, whereas bigger iPhones have regular width and compact height. iPads’ are still both regular. It allows planning the interface’s combination easily depending on the current Size Classes. 

Size Classes behaviour depending on orientation

Pic.1. Size Classes behaviour depending on orientation.

Additionally, iPads allow launching several applications in a divided view with dedicated 3 liminal values that can change the Size Classes: ⅓, ½ and ⅔ of the screen’s width occupied by an app. The apps can be smoothly narrowed down and broadened, adjusted perfectly to our needs. Depending on the device and a part of the screen’s occupancy, an operating system decides if the width is regular or compact. As a result, the app is displayed in the same manner as on iPhones’ portrait orientation – compact width, regular height.

Different proportions of screen divisions

Pic.2. Different proportions of screen divisions.

3. Using Size Classes in the Interface Builder

When it comes to interface configuration according to particular Size Classes, the Interface Builder gives us two possibilities. We can, for example, configure varied behaviours for an applied font, its color, the color of the background, or, what’s the most important, the constraints. Clicking the “+” icon next to chosen features allows adjusting them in a random width and height combination. Thus, the view looks good on both iPhone and iPad with elements’ configuration and font size adjusted to the interface depending on the Gamut value – color space available for the device. It allows setting the colors that combine with broader color palette and are reflected better on the screen which supports such possibilities.

Adjusting constraints to SIze Classes

Pic.3. Adjusting constraints to Size Classes.

Using Interface Builder, we can check the behaviour of different interface elements on varied devices and orientations and implement the changes according to previous establishments in case of problems at any time. 

interface builder

In the simplest case – to achieve the same application’s look on iPad and iPhone in vertical orientation and a different one on iPhone in horizontal orientation, we can focus on the fact that it’s the only situation with the compact value of height. Similarly, if other interface elements’ setting is only for iPhone in vertical orientation, it’s valid that the width is compact and the height is regular at the same time. 

4. Using Size Classes in code

If we want to use Size Classes in the code, we should implement the traitCollection value available in every UIView and UIViewController object. It consists of information about current vertical and horizontal Size Class value. Responding to changes occurring in current values implies overstraining the traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) method which is called out every time when traitCollection changes. At this moment, it’s worth updating the constraints so they adjust to the new sizes and arrange the interface elements properly. 

the traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) method

Unfortunately, creating views from code is not as smooth as in Interface Builder. This time, if we want to obtain various effects for various Size Classes, we need to create separate constraints for particular cases and change their isActive attribute according to previous establishments. This way, only those adequate for current width and height values are active. 

5. Why should we know all that?

Most of all, the information above allows creating applications that behave predictably on all devices they were prepared for. Thanks to the Size Classes, we don’t have to worry about varied devices’ sizes. We should only consider four cases for which the height and width can be either regular or compact. It’s also an easy way to configure the app’s look without the need of implementing many valid changes, and the effects are visible on different devices at any time.

Engagement models with offshore IT agencies

When you finally decide to develop an app for your business, you might wonder how much it will cost. And it’s not that easy to tell at the beginning. You need to make a decision that will influence the budget and the workflow of your team – choose the engagement model perfect for your needs. We explain the most common ones.

Basically, engagement models are types of contracts used in offshore development. They determine what you will pay for when hiring mobile app developers. They also describe atypical situations like a need for a sudden direction change in the project that can result in delays and longer time-to-market. 

The type of engagement model you choose depends on your needs, the budget you have, the number and complexity of the features, and other details of the project. Don’t worry, your digital agency will present all options you can choose from and you will be able to make a decision based on your preferences.

So what can you pick?

Dedicated team

In the dedicated team model, you pay monthly fees that equal the hourly rates of all developers you hired. The idea here is to optimize the production process to make sure the delivery is within the budget, time, and scope of the project. We always start by familiarizing ourselves with client’s expectations and goals, to make sure our dedicated squad will be able to fulfill them.

Our developers are becoming your temporary employees dedicated to a project. They can either work remotely or visit the company that hired them to be on-site during the main project management activities. Speaking of PMs, they are usually a part of the product owner’s company and they coordinate the production for both internal team and external additions.

The company that decides to outsource developers in a Dedicated Hiring model gains full control over the project, which is great when the scope is extensive and somewhat not entirely determined. What’s beneficial about external developers is that all the administrative matters are handled by their company, so it reduces the burden of such duties for the employer.

This model is also quite flexible, as cooperation with an offshore external agency allows the partner to add more team members or change tasks when the project evolves. Having a dedicated developer means they will get to know the product better and their work will be more insightful. At the same time, the hiring party needs to have excellent management skills and provide technical resources to handle various employees.

Team enhancement

If you have an internal team and you just need an extension, this model will be the best option for you. Sometimes outsourcing means that you need to hire developers that have particular skills. Adding new members to your in-house team means a lot of time spent on recruiting them, onboarding, and then you need to pay their salaries. If you don’t need them full-time, it’s an unnecessary cost. It is better to find an offshore company that will lend you their employees to complete certain tasks.

No matter what type of unusual skill you need, you should enhance your team with an external employee if you need something extraordinary to be done. It will be much more efficient than hiring an entirely new worker at your own company.

What about the pricing?

Both engagement types are offered in two different price models: Fixed Price and Time & Material. Let’s take a look at their characteristics.

Fixed Price model

It requires longer preparations as you need to define the exact scope of the project with all the functionalities that are going to be developed. Then, you pay the fixed amount of money and the work begins.

The Fixed Price model is not too flexible, because the cost and workflow are pre-established and changing them could disturb the initial plan which requires additional funds. This model is better for short-term projects with detailed goals and predictable tasks. The main point here is that the idea needs to be as concrete as possible – because there won’t be too much space for changes later on. Also, use the Fixed Price model when you want to test the software development company you consider to work with.

The most significant benefit is the fact that you pay the full amount beforehand – so you don’t need to worry about changing the cost of app development. The pre-production phase is also quite advantageous, as it allows both parties to clearly state their expectations and outline all the details of the project at the very beginning.

On the other hand, a Fixed Price model project is not flexible at all and any problems with the tasks in the scope or sudden changes in the market will result in additional costs.

Time and Material model

This model is great for progressive projects that are predicted to scale and expand. As you might conclude from the name, Time and Material model means you pay for resources that your app development team uses. At the beginning of the collaboration you agree upon a certain hourly rate and then you need to pay what you are billed for.

This is the most common model in digital agencies that use Agile and Scrum methodologies in their project management. It’s perfect for clients who are not sure about all the details of their product yet and want it to evolve with the process. It’s also great for a long-term commitment that requires many stages to be completed.

Unlike the Fixed Price model, Time and Material allows both sides to freely communicate as they can put these hours on the bill. Sprints, calls, and workshops are necessary for such projects to make sure everything is progressing at the right pace. Contact between the product owner and the team also allows them to discuss changes that suddenly need to be introduced.

The main drawback of the Time and Material model is the fact that costs can quickly escalate if we change the scope of the project constantly or introduce new components all the time. To avoid this kind of situation, we should determine as many details as possible in the early stage of the project. Taking advantage of flexibility should be based on common sense.

Combination of both

It’s quite common that the two pricing models are combined. A project starts with a Fixed Price and then, when there’s a need for some alterations, all the changes are evaluated in Time and Material. It’s usually most optimal and convenient, but generally depends on the client’s needs, goals, and the project itself. 

Which engagement model should you choose?

If you are looking for a reliable IT partner, we can offer our support in turning your idea into a robust mobile or web app whatever type of cooperation you’re interested in. We can help choose the most appropriate and scalable engagement model adjusting it to the project’s and company’s requirements.  Contact us and we will show you what are our capabilities in terms of software development. You surely won’t regret it. 

Top 10 Figma Plugins that we love

I’m a classic example of a lazy person that loves finding shorter or simpler ways of doing something. That’s why I’m in love with Figma’s plugins. Over the past couple of years, Figma became one of the most popular apps among digital designers thanks to great collaboration, free plans, and TONS and TONS of plugins. Some of them are really live-saving but sometimes you gotta find the ugly duckling. You may ask: but why the hell do we need plugins? Well, they have the power to transform the way designers work. They extend Figma’s functionality and automate a lot of processes. Smart usage of plugins results in a huge productivity boost, workflow improvements, and a faster design process. Filling 10 lines of copy or inserting 30 random images into your screen with one click. Sounds great, huh? And it’s only a small piece of what you can achieve with some of the plugins. 

Since the numbers of available plugins are growing tremendously, you might have a problem which plugins you should install and which not. 

And that’s why you need to read the rest of this article. We’re gonna help you choose the best tools to improve your productivity and workflow.

Let’s start

Ready? Steady? Go to, download Figma, and create a free account. Then you simply need to click on the “Community Tab”, “Plugins”, and you’re good to go. Scroll through them like never before!



Our one and only true love when it comes to handovers with developers. It allows designers to upload their wireframes or visual designs straight from Figma and add them to project folders in Zeplin. The best thing? Annotations will be added automatically to the designs (sizes, colors, margins, and even CSS suggestions for certain elements) which will leave you with an online repository that the whole team can contribute to. You can also export your whole design system which includes Color Styles, Text Styles, and assets. And zeplin will automatically connect used components in screens with main components and help developers see where what was used. Number #1 if you’re a UX/UI/Product Designer. Absolute must-have!

You’ll find it here.

Content Reel 


If you’ve been a Sketch user, you’re probably familiar with Craft and its ability to input data into your designs. Content Reel does exactly that but in a new different way. You can choose the precise category you want to fill with content, for example Names, Companies, Date, Time, E-mails, URLs, even avatars, and Lorem Ipsum. Furthermore, you have super fine-grained control over how you want the data to display. For instance, you can say “I want 182 words of Lorem Ipsum here and 12 there”. 

Great tool if you work with a lot of data in your designs. 

You can find it here.

Feather Icons


Oh my lord. I would lie if I wouldn’t say it’s my almost #1 plugin in Figma. 

Total life and time saver if your client doesn’t have enough budget for custom made icons or if you’re making High Fidelity Wireframes and you want to have nice icons with zero effort. What is great about this plugin is that you have icons on stroke, so you can easily change to fill without messing up the icon. Just simply launch the plugin, enter your phrase, and you’re good to go. 

If you’re interesed, it’s here.

Reattach Instance


Great plugin when you have a problem with your components, and some of them just unlinked from their main instance. This problem sometimes also occurs while coping Frame from one project to another. 

You just simply go to Plugins > Reattach Instance and Figma automatically swaps your frame with Child Instance of your desired component. Just make sure you have the exact name of your unlinked component and your main component. Great way to save your time. Did I mention that you can select more than one component at the time? 🙂 

You’ll find the plugin here.

Figma Chat


And here we have it. The king of communication (only if you don’t use Slack. Slack Rulez!) between designers/developers/clients. It’s a simple chat with the ability to send text and the current selections of frames or other elements. Just select the elements you want to send to other people and tick the checkbox. All messages are encrypted and can only be read by people who are able to run plugins inside your file. So yeah, if you’re cooperating with other designers, just run Figma Chat, select Frame that you want to talk about, and send it! 

The plugin’s here.



This time we have a plugin that I personally recommend if you’re more of an illustrator than a Product Designer. With SmoothShadow, you will be able to create really eye-catching and soft shadows. You’re basically doing shadows but with easing curves which makes it a huge game-changer. Colors, Layers, Alpha, Offset, and Blur within a single window and beziers. It makes shadows really nice, but unfortunately, it’s horrible when it comes to development. One layer with 8,9 shadows with totally different values? No way. Use it wisely! 

You’ll find it here.



Another one for illustrators! Yay! At one time, blobs were really popular. I mean, really… really popular. They’re a great complement to the illustration which gives you a kind of depth of field to your design, but sometimes people have a problem with creating smooth blobs. And if you’re one of these people, download Blobs and make your problems go away. A really simple plugin to define the Complexity and Contrast of your Blobs and that’s it. “Make Blob” and you have a perfectly created smooth Blob.

If you’re interested, the Blob is here.



With this Figma plugin, you can easily insert amazing Unsplash images straight into your designs. You can either place a random image or search for a specific term and look for the perfect image for your needs, directly in the plugin’s simple interface. What’s great about it, all images can be used for free, regardless of whether it is a personal or commercial project. 

Also, Unsplash will automatically fit the image to the size of your vector, so you won’t have a tremendous image pasted into small objects. 

You can check it out here.

Find and replace


This one does exactly what it says. It finds your text/layer name, so you can replace it with another name. That’s all. It’s a very simple but incredibly useful Figma plugin. How many times did you have to do it manually? Well, those days are gone!

Try for yourself here.

Rename It


A few months ago it was as a plugin, now it’s a built-in feature that can save you a lot of time. You can keep your files tidy and organized by batch renaming multiple layers using very specific naming rules and conventions.

Just select more than one layer, and hit CMR + R. Now you can swap exact words, letters, use numbering, etc. 

That’s it for today folks! I hope you enjoyed our “specially curated” Top 10 Figma Plugins. If you want more Design Articles like this, you can just simply click on the Design tag, and you will get tons of information. 


What’s the fuss about the “Swift vs Objective-c” thing?

You can find a lot of articles about comparing Swift to Objective-C. When it comes to choosing language for the new project there is no doubt that Swift will be a better choice. But we have to understand why. 

Objective-C language is around for a really long time. It was first introduced in 1984 – the same year that Apple presented its Macintosh 128K with the famous Super Bowl ad (the number stands for its built-in RAM – blazing 128kb). It’s not difficult to count that it is getting close to 40 years old. When you see it this way, you can understand that Apple built its whole ecosystem on this language. Everything we use now was initially written in Objective-C. Even now Apple is still releasing new features including Objective-C implementations in developer documentations. It is a grown, adult, respected, and well developed language.

Objective-C – pros and cons

Although a newly released language like Swift was designed to conquer all the weaknesses of its antecedent, Objective-C still has some advantages. First of all, it is interoperable with C and C++. Also, it supports binary frameworks development and offers dynamic features – for example method swizzling. Not to mention, a language that is around for more than 30 years was thoroughly tested on thousands of code lines and applications.

When it comes to cons, the main problem with Objective-C is the fact that its structure is quite complicated. It requires explicit pointers, the knowledge of prefixes and understanding of its complex syntax. We need to remember that it is old, so reverse engineering and hacking is much easier, too.

As you can see, despite its age, Objective-C can still be used for some purposes but it can be harder to learn, especially for new developers that didn’t have a lot to do with old-fashioned languages. Swift has something more to offer and it is picked as primary technology used to code for Apple devices. Why?

Swift – pros and cons

Apple’s goal with creating Swift was not only to fix some issues that Objective-C couldn’t overcome. With rapidly growing technological advancement, all hardware and dedicated apps started to become more sophisticated. They needed a programming language that would cope with all the requirements and would allow developers to code faster.

Swift is compatible with Objective-C and Apple development frameworks called Cocoa and Cocoa Touch. The app’s code can be a mix of two languages and also migrating from one language to another is not problematic.

What are the main benefits of Swift?

  1. Swift is definitely faster when it comes to coding and performance. It also offers more stability.
  2. It is easier to learn and use for programmers – especially ones that knew Java, JavaScript, Python, C#, or C++ before. Its syntax is quite concise and doesn’t require as much code to achieve excellent results.
  3. Overall, Swift code is easier to maintain and more productive to write. It is considered safer as it doesn’t use pointers. They are often responsible for security vulnerabilities and constrict finding bugs.
  4. With SwiftUI, a dedicated framework, building accessible and multi-platform interfaces is easy.
  5. Swift is one of the leading programming languages in the IT community and has enormous support from hundreds of devs.
  6. There are many development tools like Playgrounds that make the app production process more efficient.

Disadvantages of Swift

Changing versions of the language sometimes can become problematic, as they can eat up a significant part of the developer’s time. This problem though is shrinking as Swift matures and doesn’t require so many updates.

Speaking of age, as a young programming language, Swift still requires some fixes and upgrades. Migrating software between two versions of Swift is oftentimes complicated, especially with advanced apps that have lots of code.

It is obvious that there is no perfect technology without flaws. The question is – when to pick Swift and when you should trust Objective-C?

So – which to choose?

And here we are, reading what to choose. The answer is quite clear – choose Swift.  If you’re dealing with a new project, or even have an old one that still works pretty well, I encourage you to migrate to Swift. It is developer friendly and fast, and it gives you decent flexibility. It lets the developer focus on his tasks being clear and readable, with many unnecessary syntax elements stripped of. Swift has been with us since 2014 and it is open-source. It had gone through some major changes and a lot of tweaking. Right now, it is safe to say that it has entered adulthood in its development. In 2019 it implemented ABI stability for all Apple platforms – it means that since Swift 5 version, all custom libraries will be compatible with future versions of Swift. It was a big milestone and now, when developing an app in Swift, you can no longer fear that a new major release will bring breaking changes.

When comparing Swift and Objective-C with regard to general overhaul of the languages, Objective-C doesn’t really deserve much credit these days. Why? Because we can achieve almost everything using Swift. You can, with no trouble at all, include code in C or C++. There are some solutions that Objective-C gives out of box but some of them are considered a bad practice – mainly for security and code encapsulation reasons. Furthermore, you can make Swift projects look exactly like Objective-C in case of code and files structure but it would be somewhat impossible to do that other way around.

On the other hand writing in Objective-C can give you access to lower level resources when compared to Swift. Sometimes we can do more in Objective-C which brings us to the other topic. When using Swift, you can still implement Objective-C code with no problem at all. And with only little tweaking, you can also include C and C++ code just as that.

Summing up 

Picking a technology is not an easy choice – so trust your digital agency with it. They will recommend the best solutions and then create an app that will become an essential part of your business.

Contact us, so we can talk about your ideas and goals. Who knows, maybe your mobile app will become the next big hit? To achieve that, you need great quality of code and sophisticated IT services. You can find all that at iteo.

Is mobile development ready for graphQL

Most web and mobile applications institute client – server communication. Acquired data are used in the app’s internal processes. Nevertheless, you must know that the beginnings were tough and didn’t provide any models of proceedings. Engineers tried to create a standard which would make the manner of communication more legible and easier to implement. Examples of such standards are REST and SOAP. Unfortunately, nothing in the world is perfect. REST is used most frequently being a main player and overtaking slightly older SOAP. However, years of using REST have shown its shortages which arose due to changes in the world of web and mobile applications. Main instigators of those alterations were mobile apps which constitute larger and larger market share. 

Progress = new problems

Mobile devices have become a chief tool for using the internet resources, yet smartphones have limited computing power and memory. Although their efficiency is constantly rising, the level is still much lower than in laptops. Another constraint is the battery that always runs out too soon :). That’s why we want the apps to encumber batteries in the least. After initial analysis, it has been established that a triggering factor can be the amount of uploaded data. We send too much and not use enough of it.

Somebody had to come up with proper solutions. In 2012 Facebook app had a substantial user flow so the server – client data exchange was extremely large. 

Facebook programmers decided to solve the problem by creating a new manner of communication which would limit the amount of sent data.

Appropriable reasons were:

  • higher usage of mobile apps
  • low power devices
  • impaired internet connection which makes it difficult to send larger data files

Technical reasons were:

  • over-fetching
  • under-fetching
  • alterations generated in API REST

GraphQL – new solution

So, what is this new Facebook tool? Actually, it’s a query language based on a type scheme created with API. Data is presented in the form of a graph – and that’s where the name came from. The solution was published in 2015 as an open source. Today, it’s developed and available in all popular programming environments. As opposed to REST, GraphQL uses one endpoint which provides all the server-side data. Decisions about the number and type of data are transferred to the client-side which means that the app decides what it wants to get from the server in this particular moment. 

Major REST’s problem is a consistent scheme of acquired data. Example: App displays user’s name, so it downloads data from API. In REST, endpoint response has a consistent number of attributes compatible with the user’s data. In GraphQL, we are able to determine what we need from all the available data reducing the business of the response. In the presented example, what’s downloaded from the server is only the user’s name and nothing else. Using such a solution, programmers don’t have to modify the backend and create a special endpoint to provide only the user’s name. 

Solved technical problems:

  1. Over-fetching

The problem lies in downloading data’s structure which consists of a large number of attributes. We have data that will be used in the application.

  1. Under-fetching

The problem is that downloaded data is insufficient. That’s why we have to send another query to the server and ask for additional data.

In both cases in GraphQL we only download the data we currently need.

Changes in API

Created endpoints in REST approach have a defined structure. To download additional data, programmers have to modify existing endpoints or add supplemental ones to fulfill the needs of the client’s layer. Besides, the client’s layer is not resistant to unexpected changes in endpoints which can lead to instability of the app’s operation. This kind of process is an additional burden also for the client’s budget. 

Summing up

GraphQL approach solves basic problems and is used more and more frequently. Will it substitute the REST approach? Rather not, but it’s a stron alternative showing that some elements can be managed better.

Tests automation in a project – when and why?

The world of programming is characterized by two types of tests – manual and automated ones. Some of the manual tests, eg. usability or exploratory ones, are an indispensable and inevitable part of a tester’s work. Nevertheless, if we’re talking about regression or smoke testing, doing them manually, especially if we deal with an advanced project, can be extremely time consuming or sometimes even impossible. In that case, automated tests come to the rescue. In this article we will focus on their pros and cons.

What are automated tests?

Automated tests involve testing cases performed by formerly written scripts. With their help, we are not only able to script the “clicks” around the web application. We can do much more. To understand them better, it’s best to distinguish some of the most popular types:

  • unit testing
  • API testing
  • integration testing
  • end to end testing
  • safety testing
  • performance testing

Let’s take a closer look at some of the most important ones.

End to end testing is the best way to make sure that a particular system works properly. It doesn’t check other methods operations or a number of times a certain function has been performed. What matters the most is the end result – a fact that a product has been added to the basket, an order has changed its status, a user has been logged, etc. Such tests recreate an end user’s actions which can be quite beneficial. The purpose is to go through the processes using business logic to confirm that the implementation went well. 

Performance tests don’t verify the functioning of buttons, fields, forms, and rolled-out lists. They examine the application’s behaviour in various load conditions – a load being a situation when x users use the same function simultaneously, eg. visit the same view of the app (searching through products or sending a return form). It’s worth adding that performance tests can be divided on the grounds of the amount of load and their purpose:

  • Performance testing shows the system’s weaknesses and helps establish the, so called, “bottleneck” using low and high load. 
  • Load testing verifies how the system works under the maximum load and if it’s even capable of performing.
  • Stress testing verifies if the system launched eg. a safe mode and if it meets the safety standards. In this case, the load is definitely higher than the maximum. 

Automated tests – pros and cons

Automated tests are indispensable when it comes to complex and long-range projects. The cost of creating tests detecting regression and resets errors is much lower than in case of hiring a manual tester for the same job. It’s efficient both money- and people-wise. The crucial employees are able to work in smaller projects in which it’s usually more profitable to perform manual tests. 

Preparing automated tests allows better analysis and error reporting thanks to easy and simple access to the history of tests results. However, automated tests are not only the land of milk and honey. Initial phase requires investing more time and money. Maintaining, performing and developing the scripts also generates costs but they are still lower than manual regression tests in long-term projects. 

What’s most important – automated tests can’t substitute a real person. Their purpose is performing the same test cases quickly but they won’t fill in for exploratory tests based on the tester’s imagination and experience. Automated tests usually cover only the basic test cases but allow a large number of test data and provide a software version faster. Additionally, testing new functionalities is typically performed manually to provide a thorough knowledge of a certain area. Later on, we can implement the automated testing, too.

Summing up

Following the market trends, it’s hard to say what the future of automated tests will bring. However, taking a closer look at the world’s giants that develop the automation processes, machine learning, and artificial intelligence, we can say that investing in manual testers’ development towards automated testing is a must. Despite the cost of creating these tests, they are inestimable while completing complex, long lasting projects. 

It’s good to remember that they don’t downgrade the tester’s qualifications. Quite the opposite. At the end, a tester is a person with full, in-depth business knowledge of a product which, as a result, provides the end users with satisfaction and is considered as highest priority in software quality assurance in the World Quality Report.
Do you want to implement automation tests in your project? Feel free to contact us, it will be our pleasure to cooperate with you. Together we can deliver everything!