Back to Portfolio
Client: Kokozi

Kokozi Smart IoT Learning Platform

ReactNestjsTypescriptIoTRest APIAWSCloudTwilioMicroservicesKafkaMQTTMongoDB
Kokozi platform architecture: admin frontend over HTTP to NestJS microservices that exchange messages through Kafka, each with its own MongoDB database, reaching the connected device over MQTT.

Project Overview

Kokozi is an interactive learning platform for children in South Korea, built around a connected device. Learning activities run across the device and the web application, so the platform has to keep hardware in the field and software in the browser in step with each other.

The client ran an engineering group of around thirty people. Boffin Coders supplied one developer on a twelve-month contract, working inside that team.

Our Scope

Backend services and the admin frontend. The system was built as NestJS microservices communicating over Kafka, each service owning its own MongoDB database. Requests out to the connected device were carried over MQTT.

The Architecture

Three decisions shape a platform like this, and they are worth spelling out because they are the difference between a system that survives its second year and one that does not.

Kafka for service-to-service messaging

Services publish events rather than calling each other directly. A service can be slow, restarted or redeployed without the services around it failing — the messages wait. In a product with hardware in the field, where you cannot take the whole platform down for a release, that decoupling is what makes routine deployment possible.

A database per service

Each service owns its own MongoDB instance and no service reads another's data directly. This is the part teams most often skip, and skipping it produces a distributed monolith: the deployment cost of microservices with none of the independence. Owning the data is what lets a service change its schema without a coordinated release across the platform.

MQTT to the device

Connected hardware is not a browser. It has less memory, an unreliable connection and a power budget, and HTTP request-response suits none of that. MQTT is a lightweight publish-subscribe protocol built for exactly those constraints — small message overhead, a persistent connection, and delivery guarantees that survive a device dropping off the network and coming back.

The admin frontend sits on top of the same services, giving the client's team a way to see and manage what the platform is doing without a developer in the loop.

How It Ran

Requirements came through the client's Jira board on two-week sprints. Our developer worked their process rather than ours — their board, their standups, their release cadence, their definition of done.

That is deliberate. A dedicated developer is only useful if they are inside your team rather than beside it. We do not run a parallel process, we do not ask a client to adopt ours, and we do not put an account manager between the developer and the people they work with.

How It Ended

The contract ran its full twelve months. The client then hired an internal engineer for the role and we handed over.

That is the intended ending. A dedicated developer covers work that exists now, while a permanent hire is found, or through a stretch when the roadmap is ahead of the team. When the hire lands, the engagement should end - and it should end tidily, with the code and the context already in the client's hands, because it was always in their repository and their process.

When This Kind of Engagement Fits

An open role that is taking longer to fill than the work can wait for. A service or a feature that needs building while the existing team keeps the platform running. A specific gap - backend, mobile, frontend — inside a team that is otherwise complete.

It fits less well where a whole product needs owning end to end, or where the client has no engineering process for a developer to join.

What We Are Not Claiming

We did not build Kokozi. Around thirty engineers did, across several teams, and one of them was ours for a year.

We have no production figures to publish. Our developer worked against staging, so any throughput, device count, or uptime number on this page would be invented. We would rather leave the section empty.