Trox

I came in for three months. I stayed for three years.

Client
Trox
Industry
Ventilation & Air Conditioning
Engagement
September 2022 – December 2025
Role
Senior React engineer · design system & frontend architecture
Stack
React, Tailwind, Vite, GraphQL, Storybook, Figma

The setup

TROX makes the kind of equipment most of us never think about. Fans, dampers, ventilation units, fire protection systems, sitting quietly in the ceilings of buildings, keeping the air moving and, occasionally, keeping people alive. In 2022, they started their first software product: a control system for monitoring and managing those units in real time.

I joined as a freelance React engineer on a three-month contract. They renewed it, then renewed it again, every quarter for a little over three years. At the end they offered me a full-time role. I turned it down. Nothing personal. I wanted to stay in the freelance shape: more projects, more rooms where the engineering culture is still being decided.

Room temperatureRoom 04.12
21.0 °C

A setpoint nudge, rebuilt for this page. One small state machine, idle to loading to success, and every visual follows from the state. Rapid taps collapse into a single commit, so the API sees one request, not six. At the bounds, the value wiggles and flashes hot or cold instead of silently disabling a button. Digits are tabular so the number doesn't shuffle sideways. Everything folds to instant when the OS asks for reduced motion. None of that is decoration. It's the difference between a control that feels trustworthy and one that feels like a demo.

What I actually did

The work split into three rough categories: code, consistency, and people. Most days I touched all three.


On the code side: in 2022, AI tools weren't anywhere near producing code you could put into a real codebase. So the first stretch was the artisanal phase. Every line typed by hand, every pattern argued out in PRs. A lot of the codebase's bones got laid down there, and deep modules with shallow interfaces was the principle behind most of them. A trending module that hid every category of live data (temperatures, airflow, dampers, smoke, occupancy) behind a one-line interface. A React Context layer that pulled scattered API calls into one place. None of these were fireworks. They were the kind of decisions whose value shows up six months later in a clean PR.


On the consistency side. This is the part I care about most, and the part a lot of engineers treat as someone else's job. When I arrived, the same button could be styled four different ways in four different files: styled-components, MUI inline props, emotion, plain CSS. Four paradigms means four sources of truth for one border radius. It wasn't a styling problem, it was a system problem.
So I made the case for one. Tailwind, applied everywhere, with the design's colours, spacing and type scale defined once as tokens in the config and referenced by name from then on. Not #E5484D - bg-alarm. The payoff was that "does this match" stopped being a judgment call and became a lookup. Fewer abstractions, fewer exceptions, one answer.
Every component went into Storybook: each variant, each state, each edge case, before it ever touched a screen. It made the component the unit of review instead of the page, and it gave the designers and me a shared place to look and discuss.
Then the screens, built pixel-perfect from Figma. Pixel-perfect is not the same as blindly faithful, though. Designs drift too: a padding that's 12 in one frame and 16 in the next, a grey that's almost the one from the palette, a state that was never drawn. When I caught those, I didn't reproduce them. I fixed them in the build, flagged them back, and the design got corrected to match. The system moved in both directions, and it got tighter every time.


About a year in, the same instinct pointed at a bigger gap. External agencies couldn't keep up with the design workload, and inconsistency was arriving faster than me or the team could catch it. I made a sustained case for an in-house designer. A few months after I started making noise, one was hired, and design and code finally had a shared vocabulary.
The other cases I made repeatedly: strict TypeScript with types generated from the GraphQL schema. Testing infrastructure clean enough that things were actually testable. Create React App to Vite. ESLint rules that caught real problems.


On the people side: the frontend team was growing, and a chunk of my time went into helping new engineers get up the curve. Pair programming, code review, the "here's the why behind this pattern" conversations that don't fit in a PR comment. A lot of that feedback was visual. That's 2px off, that's the wrong token, that state has no story. Taste transfers slower than syntax. More than one engineer who came in junior left more senior than I have any right to claim credit for. That's the part I'm most quietly proud of.


One prerelease week I'll mention. I was abroad. The system was going into a real environment for the first time and the bugs were doing what bugs do. I wasn't on call, but I'd built half the thing and knew where the bodies were buried, so I stayed in the codebase until the release went out. Not to brag about working late. I'm driven to finish what I start, and that doesn't show up in a metric.

Room temperatureRoom 04.12
22.0 °C
Setpoint 22.0Threshold 25.0

A room gauge crossing its threshold. The value is tied to scroll, rising as the widget passes the centre of your screen, so you see the alarm state without being told to click. The pulse runs only while over threshold, and only without reduced motion. The marker is computed geometry on the arc, not a PNG that drifts a pixel at odd sizes. And "hot" is one token: change it once and the label, the fill and the alarm all agree. The colour isn't the design decision. The fact that there's only one of it is.

What shifted

When I joined, the codebase had:

  • Loose TypeScript with nothing enforcing strictness
  • Four parallel styling approaches, sometimes inside one component
  • No tokens, no component library, no place to see a component outside its page
  • No testing infrastructure, no real ESLint guardrails
  • Create React App, slow builds, no path forward
  • A frontend leaning hard on external design, and drifting from it


When I left:

  • Strict TypeScript, types generated from GraphQL
  • Tailwind with a token layer in the config. Every colour, space and size defined once, used by name- Every component in Storybook, with its variants and states, as the reference for design and engineering both
  • Screens pixel-perfect to Figma, with the inconsistencies caught and corrected on both sides
  • A coherent design system with an in-house designer behind it
  • Testing, linting and Vite in place, and a team with several engineers who'd come in junior and left ready to lead


None of those are individually flashy. The point is they're still there. Architecture decisions are good when nothing dramatic happens because of them. Design systems are good when nobody has to ask.

TrendingRoom 04.12

A live trend with several units on one plot. Each unit gets its own axis column, and every axis draws its ticks at the same four positions so the gridlines line up instead of fighting. Toggle a series off and its axis leaves, the plot widens, and the lines redraw, every step tweened so your eye can follow what changed. Button, line and axis tint all read one token per series. A lot of geometry inside, one question on the outside: which series do you want to see?

What I take with me

TROX was around 20 people on the engineering side by the time I left. Designers, backend, embedded, product, the whole stack. We became friends and family. I miss it.

I also take a clearer picture of what I'm for. I'm a React engineer, but the work I'm best at sits in the seam between design and engineering: taking a direction someone set in Figma and making it hold up as a real system in production. Tokens that mean one thing. Components whose states live in Storybook rather than in someone's memory. Motion that explains instead of decorates.

Freelance is the shape I want my career to be in. More projects, more first-software-product moments, more teams to help scale up. Three years is enough to give to a single team. The rest of my work is ahead of me.


Happy client, happy me

“Robert settled into our team very quickly and working with him was always a pleasure! He soon felt like a valued member of the team. What I particularly appreciated about Robert was that he brought his knowledge and experience to improve our existing codebase and introduce new features. He never shied away from complex challenges, and we could always rely on his commitment, even when there were very last-minute or urgent tasks to be done. His positive attitude and sense of humour made him a valued colleague whom we all miss very much. I would love to work with Robert again at any time.”
Stefan Daniel HomfeldManager of Software Development, Trox

If you're building a serious product at a startup, a scale-up, or a company that's never built software before, if you value taste and experience-driven decisions, and you want someone who ships products with love for the detail, with care for performance, and with real respect for the people who'll end up using them - let's talk.

robert@kutschera.xyz