All work
Professional work

Artist Evolve

Content + analytics platform

A production content and analytics platform for creators — publishing workflows, large-range analytics timelines, real-time notifications, and cloud storage integrations.

Role
Software Engineer
Year
2025
Status
Shipped
Artist EvolveCapture pending

Overview

Artist Evolve is the product I work on day to day at Inicrea. It combines content publishing, scheduling and cross-platform analytics in one interface, which makes it a genuinely state-heavy frontend: long-range timelines that have to stay responsive across years of data, live notification streams, and third-party storage integrations that page through thousands of files.

Problem

Creators manage content across several platforms and had no single place to publish, schedule and measure it. The interface has to hold a lot of state at once — drafts, scheduled posts, live analytics and notifications — without becoming slow or confusing.

Approach

Treat it as a data-fetching problem first and a UI problem second. Server state lives in TanStack Query with explicit cache keys and optimistic updates; only genuinely local UI state goes to Zustand. That split keeps the components thin enough to reason about.

Architecture

Feature-scoped modules, each owning its queries, hooks and components. A shared WebSocket connection fans notifications out through a subscription hook rather than each feature opening its own socket.

Key interactions

  • Long-range analytics timelines that stay responsive across large date spans
  • Real-time notification delivery over a single shared WebSocket connection
  • Google Drive integration with cursor pagination and infinite scrolling
  • Optimistic updates on publish and schedule actions
  • Content publishing workflow across multiple destination platforms

Technical decisions

Windowed rendering for the timeline

Rendering every node in a multi-year range stalled interaction. Rendering only the visible window, with the range computed from scroll position, kept it smooth regardless of span.

One socket, many subscribers

Per-feature sockets multiplied connections and made reconnection logic inconsistent. A single connection with a subscription hook centralised retry and backoff in one place.

What I took from it

  • Cache key design is the architecture on a data-heavy product — get it wrong and every feature inherits the problem.
  • Most perceived performance work was rendering strategy, not bundle size.