Project Screenshot


A platform that automatically matches applicants to vacancies based on skills

  • Idea

    Our Spanish client Kyle Stalberg saw the need for a job platform that would simplify the job search on the part of job seekers and the search for candidates on the part of employers. Kyle asked SteelKiwi to build a web application for employers and iOS and Android apps for job seekers. The killer feature of this app would be automatic matching of candidates to jobs based on location and skills. The platform would help employers avoid candidates who don’t fit their requirements while helping job hunters focus their search. Our client also requested to implement a convenient and safe system to pay for on-demand work by contractors.

  • Analysis

    Spain is working toward reducing its unemployment rate, which has averaged 16.56% from 1976 through 2018. To market Spain as a worker-friendly EU country, Spanish companies seeking talent aren’t hesitating to use various strategies including mobile apps. 45% of job seekers use mobile devices daily to search for jobs. Information technologies can deliver job market solutions that perfectly match applicants to positions using automated search. Empowered by such digital solutions, employers have a better chance of finding employees that are well suited for the job and already located nearby. And smart job platforms also benefit candidates – instant feedback is what they’re looking for, and that’s precisely what a digital platform can deliver.

User Roles

Platform manager

The platform manager can handle complaints both from companies and candidates as well as approve invoices.


Employers can create company profiles and add filters such as job type, skills, and location so that the platform finds the right candidates by matching them automatically. Employers can pay employees and chat with them via the platform.


Employees can create profiles, add their professional skills and portfolios, and get lists of suitable companies. Employees can chat with employers and get paid for finished work.


December 2016 – March 2017
Backend - 3 Frontend - 3 UX - 1 UI - 1 iOS - 2 Android - 2 QA - 3 PM - 1
Designed UX/UI

First, we decided to divide the target audience by platform. We determined that employers would find a web version of the app more convenient, while job seekers would prefer accessing the platform using native mobile apps.

We created detailed wireframes and chose appealing color palette and fonts so as not to distract users from the seriousness of the job and applicant search. Our designers avoided unnecessary animations and applied a swipe feature to make it easy for applicants to filter through job postings. This swipe logic is often used in entertainment and dating apps, but this pattern turned out to work really well for our client’s job app as well. We designed the mobile apps to be simple, clean, and highly intuitive.

Defined the web architecture

Our backend choices were driven by our need to support multiple platforms: native iOS and Android apps and a web app. We decided that the Django REST framework was a good match for our needs, so we used it to build the RESTful API.

To power real-time chat, which is an important part of the platform, we created a WebSocket server using an asynchronous web server (Aiohttp) and a asynchronous redis client (Aioredis).

Email and push notifications are handled by a separate notifications microservice backed with a distributed task queue powered by Celery. All scheduled operations and asynchronous tasks are handled with Celery as well.

Data security and integrity is ensured with the latest version of the PostgreSQL database and regular automated backups.

Developed the backend

When developing a complex app like JobMatch, we prefer using reliable tools that have proven both flexible and effective. To uncover its full potential, every powerful API must have an exhaustive documentation system. There's a lot of software instruments that help generate documentation for API's. Each of that instruments has its pros and cons, but we are choosing what best fits our current requirements on per-project basis. The documentation for JobMatch API also had a few essential requirements. It should be easy to generate, update, and expand.

The first users of this documentation were our colleagues from iOS, Android, and Web departments and the main requirements for it was ease of use, descriptive information along with a detailed technical information for each API call, and built-in functionality to send test requests and analyze responses. Django Rest Swagger best meets all requirements, so we chose it as a documentation tool.

JobMatch connects employers with potential employees, and this process seems very natural and easy when using the app. But under the hood, there are a number of criteria and various factors that go into what we call the “matching process.” One of the main things that ensures the efficiency of this process, along with smart querying, is a PostgreSQL database.

One of the challenges our team ran into was connected with chat. We built the chat functionality from the ground up with the help of the secure WebSocket protocol based on aiohttp and aioredis microservices.

Traditionally, we’ve used Stripe to handle finances and payments, and we used it again in JobMatch.

Developed the frontend

JobMatch was written in React as it’s a convenient tool that works perfectly for team development. React is optimized and easily expandable due to its component-based approach.

Since React is still a library and not a full-fledged framework, we decided to use the FLUX architecture, which was popular at that time. With the FLUX architecture, all application data is kept in one place – the flux store, which is conveniently used to receive and manage data, make an additional  optimizations of requests to API, and speed up the application as a whole.

The bundling and development of React was implemented with the help of create-react-app (tool for creating a bundler). To manage the layout seamlessly, we used gulp and the gulp-less, gulp-autoprefixer, gulp-sourcemap, gulp-svg-sprite, and other plugins.

We used axios to enable interactions between REST with the server and used react-router v3 to build routes and navigation in the app. We also used a number of open source components – for example, react-datepicker (UI component to select dates), react-modal (shows floating windows), react-s-alert (shows notifications), react-select (provides a cross-browser multifunction selection component), and react-simple-dropdown (a UI component for displaying and configuring drop-down menus). We also used the moment.js library, which provides a lot of localization functionality and works with time output. Classnamesis a utility for flexible management of CSS classes (styles). We used the validator.js library to validate forms.

Developed a native iOS application

Our iOS developer used Swift for the JobMatch app as it’s fast, safe, modern, and simpler than Objective-C. We chose the MVC (Model-View-Controller) architecture to make the code flexible and easy to test.

To detect bugs and fix them quickly, we applied Crashlytics by Fabric. This approach made the development smooth, allowing us to reduce time spent on testing.

We integrated the SDWebImage library to process and cache images, as it ensures good performance.

To power in-app chat, we used SwiftWebSocket as it’s easy to implement and works well.

All animations and custom UI elements we made on our own using only the native UIKit.

Developed a native Android application

The Android app is written in Java. We chose a Model-View-Presenter (MVP) architecture, which is a basic pattern used for the majority of modern apps. However, we divided the View to View as the facade object into Activity (or Fragment) to make the code clearer than it would be with the two components combined. The MVP architecture makes the application more modular and allows us to implement changes in each MVP component.

We applied Material Design concepts and guidelines to develop the app. We used Retrofit for REST interaction with the server and RxJava to make interactions with the server more flexible.

To store user settings, we used the famous Hawk library. The main benefit of this library is that it encrypts all user data  and is easy to implement for developers. We also used the Lombok library to save time on development and simplify the writing of data classes. Instead of writing getters and setters, we prefer code generation.

To display images, we used Picasso. This library covered all requirements for both developers and our customer, both saving time and loading images faster by simply using links. For custom fonts, we chose the Calligraphy library, which adds the ability to play with fonts and configure changes across the whole project.

To ensure smooth communication between the app’s screens, we used EventBus, as it’s very simple to deploy and is time-efficient.

The Timber library allows us to read application logs and is simple to deploy and use.

Implemented features

Job seekers and employers both receive notifications. Job seekers get notifications on the status of their jobs, disputes, invites, hiring, and payments. Employers are notified about disputes, money requests, and applications for their postings.

Job seekers can add jobs to their favorites list. Employers receive notifications when an applicant adds their job to a favorites list and can also send invites to job seekers whom the employer adds to their own favorites list.

Both job seekers and employers can file complaints. Notifications of complaints are sent to the platform admin and the party the complaint is filed against. The system will then show a message that a dispute has been initiated, and the admin will try to resolve the problem offline. As soon as the dispute is resolved, the admin can change the job status and release the money sent to the employee’s account.

After a candidate applies for a job and their application is approved, the employer can send money to the candidate’s account. In the case of full-time jobs, the money is pending till the end of month. Once the agreed scope of work is completed, the worker can request that the money be released. After payment has been received, the status of the payment will change to request withdrawn.

Companies and candidates can communicate via real-time chat once a candidate is approved. The chat feature also lets users attach files and photos.

Technology Stack

Python icon
React icon
Swift icon
Django icon
REST Framework icon
REST Framework
Java icon
Stripe icon
Redis icon