Context
AKO manufactures components for the cold chain. Its IoT SaaS (Akonet.cloud / Akoneth.cloud) had to grow from an initial MVP into a platform able to support the company’s shift from selling hardware to selling software services, including a €7M PERTE project that added six new device types.
My role
Head of Software: owned the platform architecture and technical decisions, executed by a team of up to 14 people.
Constraints
- Devices with intermittent connectivity, some battery-powered in remote locations.
- Slow thermal dynamics (samples every 5 minutes), but critical alarms that need an immediate response.
- A small internal team, extended with an external software factory.
- A clear wish to avoid vendor lock-in.
Architecture I inherited
- Protocols by device profile: MQTT for always-connected devices, CoAP over NB-IoT for low-power ones.
- Generic input/output MQTT topics, following the application protocol of the edge devices.
- Store-and-forward on the devices, which act as data loggers and keep readings until connectivity returns.
- MongoDB for operational data and a specialized time-series platform, fed by a minimal in-house MQTT handler in Node.js.
Platform at a glance
- Node.js/Express microservices with Angular frontends on a shared design system.
- nginx as reverse proxy to internal services.
- Public API with webhooks for client integrations; GraphQL piloted.
- RabbitMQ queues between services.
Decisions I made
- Replace the in-house MQTT handler (a Node.js server without full protocol support) with a market-standard broker such as EMQX, avoiding vendor lock-in.
- Two latency paths: minutes of tolerance for regular telemetry, a real-time path for critical alarms.
- Adopt TimescaleDB: consolidated 2.5 TB of time-series data as volumes grew, reducing storage costs at scale, and designed the consolidation of relational data (such as device–user relationships) from MongoDB into the same PostgreSQL-based store.
- Selective AWS adoption: pushed the platform beyond self-hosting towards managed services where they reduced operational load, while keeping core components free of lock-in.
- Secure the public endpoints: put AWS WAF and an Elastic Load Balancer in front of nginx, filtering malicious requests and balancing the load, plus a CDN to cache selected content.
- Serverless where it fit: AWS Lambda with API Gateway for coordination tasks and an in-house URL shortener, which started as a proof of concept and reached production, instead of adding always-on services for small workloads.
- End-to-end observability: introduced OpenTelemetry with a self-hosted Grafana to improve the observability of the services.
- Unified NB-IoT protocol: contributed to the design, with the electronics team, of a unified protocol and device definition model to integrate six new device types under the PERTE project.
- Professionalize delivery: created the SRE function and built CI/CD from scratch (GitHub Actions, GitLab CI) with QA gates, plus Architecture Decision Records so decisions stayed visible and could be challenged.
- Map the business domain with strategic DDD: an initiative led from software and never completed, which still led manufacturing to change industrialization processes and improve product traceability.
Outcome
The PERTE project was kept on schedule and on budget through to its final delivery phase. Grew the internal team from 2 to 5 and led up to 14 people across development, systems and QA, including an external software factory; created the SRE function and introduced CI/CD, QA gates and ADRs.