Back to Writing
ChessIQProduct engineeringVisualization

How ChessIQ Turns Statistics Into a Player Portrait

A confidence-aware visualization built from reviewed games, not guesswork.

Chess statistics have an awkward middle problem.

On one side, they can become tables: accurate, useful, and emotionally flat. On the other side, they can become personality claims: memorable, dramatic, and much too confident.

The ChessIQ statistics visualization sits in that middle space on purpose. It should feel alive. It should give the player a recognizable portrait of their decision style. But it should not pretend the app has discovered an objective chess personality, predicted a rating, or measured intelligence.

The goal was narrower and more useful:

Turn reviewed-game history into a stable, confidence-aware player portrait.

The product constraint

ChessIQ is a personal review and training app.

The core loop is not "get a mystical score." It is:

Review your games. Find mistakes and missed opportunities. Train from those positions. Inspect the patterns that keep showing up.

That matters because the statistics page is downstream of the review loop. It only has the games the user has reviewed locally. It does not have a cloud profile. It does not have every game the player has ever played. It should get more useful as the local sample grows, and it should be honest when the sample is still thin.

So the visualization needed to carry two truths at the same time:

  • The profile should feel memorable enough that a player wants to come back to it.
  • The profile should never look more certain than the data underneath it.

That second point shaped almost every decision.

The model

The ChessIQ profile is built from five top-level factors:

  • Precision: move quality and tactical correctness.
  • Conversion: how reliably advantages turn into results.
  • Stability: resistance to collapses and volatile decision phases.
  • Resilience: defensive survival and recovery under pressure.
  • Adaptability: portability across color, openings, clocks, and opposition context.

Those factors are intentionally limited. There are supporting metrics behind them, but the visualization does not keep adding new identity pillars just because the data exists.

Confidence is also separate from factor quality.

That distinction matters. A high precision score with low confidence is not the same product statement as a high precision score backed by many reviewed games. Sparse samples shrink toward neutral so early profiles do not swing wildly from one good game or one disaster.

The model is descriptive: a profile of supported signals, not a verdict.

Why an attractor

The current visualization is a canvas-based Halvorsen attractor: a living particle field shaped by the five ChessIQ factors.

That sounds more abstract than it feels in use. The point is not to show a math toy. The point is to give the profile a stable visual identity that can still move, breathe, and change as the player's reviewed history changes.

A static chart would have been easier to explain, but it would have made the page feel like a report card. A decorative animation would have been more dramatic, but it would have weakened the trust contract.

The attractor gave me a better middle path:

  • Fixed factor colors preserve meaning.
  • Fixed factor ordering keeps the semantic slots stable.
  • Stronger supported factors occupy more of the field.
  • Factor-specific motion changes the character of the shape.
  • Confidence changes clarity and noise instead of exploding the particle count.
  • A deterministic seed keeps the same profile anchored to the same base shape.

So the visualization can feel personal without becoming arbitrary.

What the factors do visually

Each factor has a fixed hue and a fixed role in the field.

Precision is smoother and tighter. Adaptability spreads more. Stability leaves more trailing structure. Resilience and conversion pull the motion in their own directions.

The visual weighting is bounded. A strong factor can become more present, but it cannot swallow the whole field. A weaker factor can recede, but it does not disappear completely. The goal is a differentiated portrait, not a winner-take-all chart disguised as art.

Support matters too.

If a factor has a strong raw score but little backing data, the field presence is dampened. That keeps the visualization from turning one lucky slice of history into a confident identity.

This is the same principle as the rest of ChessIQ: useful signals are welcome, but unsupported certainty is not.

Restraint is part of the feature

The hardest part of this kind of visualization is not making it look interesting once.

The hard part is keeping it from becoming visual noise.

Particle systems tend to drift toward spectacle. More glow. More density. More brightness. More movement. It can look impressive in a screenshot and terrible after five minutes of real use.

ChessIQ's version has explicit caps for field width, alpha, visibility, filament strength, glow, and luminance. Those limits are not aesthetic afterthoughts. They are product safeguards.

The profile should look alive, but it should not turn into white haze. It should feel premium, but it should not become louder than the statistics it is summarizing.

Reduced motion is part of the same contract. If the user prefers reduced motion, the canvas renders a still frame instead of going blank or pretending the feature cannot work. On desktop, the five-factor legend stays visible. On mobile, it collapses so the main surface remains usable.

Testing the visual truth

The tests for this feature are unusually visual for a statistics surface.

There are focused rendering tests for score normalization, luminance caps, low-support dampening, field semantics, and tuning bounds. There is also an end-to-end test that seeds local reviewed games, opens the statistics page, and samples the rendered canvas.

That test checks that the canvas is large enough, nonblank, chromatic, and not blown out white. It also verifies that all five factor labels render and that reduced-motion mode still produces a visible frame.

I like that because it treats the visualization as product behavior, not decoration.

If the canvas goes blank, loses color, washes out, or fails under reduced motion, that is a regression. The test suite says so.

The result

The best version of this surface is not "ChessIQ knows who you are."

It is closer to:

ChessIQ reviewed the games you have analyzed locally, found the supported patterns, separated confidence from quality, and turned that into a player portrait you can recognize.

That framing is less sensational, but it is more durable.

The visualization gives the statistics page a memorable identity. The model keeps it tied to reviewed-game evidence. The confidence handling keeps early samples from lying. The rendering caps keep drama from becoming glare. The tests keep the canvas from quietly failing.

That is the kind of product surface I like building: expressive enough to feel worth returning to, restrained enough to stay true.