2026 / Web platform, frontend systems & technical direction (2020 — present)
AnyChart Ecosystem
The whole web surface of a data-visualization company: product sites, a developer playground, a headless CMS, internal services, and the infrastructure under all of it.
Visit project
The work
AnyChart is not one website. It is a charting toolkit with twenty years of history, and every year of that history left something on the web: a PHP marketing site, a Clojure playground, a blog, a Strapi CMS, static archives that stay frozen by design, and a fleet of internal services holding the seams together.
My work is the whole surface. Not a redesign handed off at launch, but continuous ownership: deciding what gets rebuilt, what gets migrated, what gets left alone because it already works, and what has to be rewritten before it takes the rest of the platform down with it.
The surfaces
anychart.com — the flagship product site. PHP with filesystem routing, a Gulp and Webpack asset pipeline, and a separate blog service behind the same edge. Old stack, deliberately kept: the content breadth is the product, and rewriting it would buy nothing a developer evaluating the toolkit would notice.
Partner platform — a Next.js and MUI application that grew past what it should have carried. I moved the public site to Astro with React islands and left the Next.js app owning only the signed-in area. Same design system, same CMS, a fraction of the JavaScript on the pages that need to convert.
The CMS — a Strapi instance behind both sites, managed as a Turborepo, multi-locale, with a build gate that fails the site build if any CMS-backed page loses its data. Content should not be able to break production silently.
playground.anychart.com — a live code editor for chart samples, originally a ClojureScript application on tooling that had drifted well past its useful life. It is being rewritten in TypeScript — Fastify, React 19, CodeMirror 6 — as a parity migration with real fixtures, not a redesign. The old system stays live until the new one earns the traffic.
Chart samples and gallery — a few hundred chart samples and the generator that renders, screenshots, and publishes them. Headless rendering at scale is unglamorous and full of traps; a blank-detection heuristic keyed on the wrong DOM node will happily discard every valid preview it was meant to protect.
Internal services — a fleet of small Node and PHP tools, each one replacing something a person used to do by hand. None of them are interesting alone; together they are why the platform runs without anyone babysitting it.
Infrastructure — Ansible for the servers, Docker Swarm for the services, Cloudflare in front, GitHub Actions between. Every config change goes through Git; nothing is edited on a server. Deploys are targeted per service and driven from the repository.
Technical note
Two problems recur across all of it.
The first is cross-domain identity. The platform spans a dozen subdomains with one identity provider behind them, and browsers have spent the last several years making that harder on purpose. Getting sign-in and sign-out to propagate correctly meant a cookie-and-beacon protocol built around __Host- prefixes and an explicit session epoch — not third-party cookies and hope.
The second is finding the actual cause. A deploy pipeline that reported success while shipping nothing turned out to be a Docker context left switched by a composite action, so docker save was reading images from the target server instead of the runner. A chart link serving the wrong library version was one clause of ordering in a database query. Neither symptom pointed anywhere near its cause, and both fixes were three lines.
That is the honest shape of platform work: most of the value is in reading the system correctly before writing anything at all.