Skip to content
Kamil BinkoKB.
← Back to experience

January 2025 – June 2026 (~18 months)

CircularAI

Senior Software Developer — de facto technical lead

  • .NET / ASP.NET Core
  • Entity Framework Core
  • SQL
  • React
  • TypeScript
  • SignalR
  • WebSockets
  • Elasticsearch
  • JWT auth
  • AI API integration

An AI-powered platform that helps cities and public bodies turn circular-economy strategy into structured missions, projects, and measurable actions — spanning mission and procurement workflows, an AI assistant, and the infrastructure tying it together.

Team

  • 1 CEO / project manager
  • 2 senior backend-oriented developers, including myself
  • 2 React developers
  • 1 full-stack developer
  • 1 tester
  • Close collaboration with a separate AI team on the AI integration

Challenge

CircularAI was built under tight constraints. The first phase was especially intense: roughly six weeks to deliver most of the core functionality, with requirements still moving and a few team members new to parts of the stack.

Specs sometimes arrived incrementally — we'd build something, then get new requirements that invalidated a chunk of what we'd just finished. Most of the team, myself included, was new to building against an AI system.

During that first month I worked about 2.3x my contracted hours, by our own time tracking, and took the time back afterward. The harder problem wasn't the hours — it was keeping the system coherent while requirements, implementation, and team capacity were all shifting at once, instead of ending up with a pile of disconnected fixes.

Solution

A dedicated AI communication layer

Every developer adding an AI feature was re-implementing the same communication logic, with inconsistent results. AI communication wasn't going to be a one-off integration for a single feature — it was going to be a core part of the platform.

I designed and built a shared service, internally called Cai, to own the AI API connection, WebSocket communication, response streaming, background execution, error handling, persistence, response adaptation, and delivery to users over SignalR.

Features only had to define the request they needed; everything else came from the shared service. By the end of the project it was the standard way the platform talked to the AI system, used across roughly 25–50 integration points.

Handling long-running AI operations

Some operations sent files of around 10 MB to the AI system for analysis and took several minutes to come back — too slow for a normal request/response call, and not something you can just leave a thread blocked on.

I built a background-task mechanism instead: the app creates a task record, kicks off the AI operation, and hands the AI system a callback endpoint to hit once it's done. That decoupled the request from the processing time and gave the platform a pattern we reused for other long-running work later.

Simplifying real-time updates on the frontend

For the React frontend consuming SignalR events, I designed a provider/context-based subscription pattern: a component subscribes to a named message with an action to run when it arrives, and unsubscribes automatically on unmount.

The frontend developers implemented it from my design and examples. My own React and TypeScript experience was still developing at the time, so I used AI tooling to iterate on the implementation and get the architecture across clearly.

Taking on more of the platform

I ended up implementing most of Missions, Projects, and Procurement — including their underlying data model in EF Core — along with authentication and authorization (JWT access/refresh tokens), Elasticsearch search, and parts of the workflow and background-processing systems, plus taking over an existing workflow implementation from another developer.

Working across that much of the platform meant I usually had a sense of how a change in one area would affect another, which is why the harder problems and newer subsystems, like Elasticsearch, tended to land with me.

Making things easier for other developers

Where I could, I tried to keep the harder architectural decisions out of the way of the people building on top of them — developers shouldn't need to understand why Cai works the way it does to use it correctly.

I tried to do the same with specs: using structured templates and AI-assisted drafting to turn informal requirements into clearer technical write-ups, so developers spent less time guessing at what was actually needed.

Result

CircularAI reached production and was still live when I left Swappsi in June 2026, used by roughly a dozen customers and municipalities (exact count not verified). Cai stayed in production as the platform's standard way of talking to the AI system.

My role shifted over the course of the project. I started as a senior engineer and ended up handling most of the architecture and technical decisions for the product, on top of writing code, mentoring, and specifying work.

A reference from Swappsi's CEO (May 2026) describes this work as senior-level technical work: sound architecture and implementation decisions, clean and maintainable code, effective use of AI tooling, and proactive contribution to the wider team.