The experience

Sky

React · config-driven UI

The config-driven interface: pages, widgets, and flows rendered from definitions, not hardcoded screens.

Shared platform component. Domain applications are documented separately.

config-driven factory UI
Pattern
DashboardRenderer · HITL flows
Renderers
self-registering widget registry
Extensible
home rotates by data richness
Adaptive

Sky is what you're looking at. It's a factory UI: dashboards, forms, and multi-step flows are rendered from configuration served by Grove, through a widget registry and a handful of generic renderers. New screens are new config, and when config can't express something, a self-registering widget extends the factory without touching the renderers.

What’s inside

Personal dashboard columns

Choose one or two columns, assign cards, and reorder them within each column. Narrow screens stack the columns while retaining the saved desktop arrangement.

Grouped workspaces

Home includes Home and Today tabs. Investments includes Tools, Ideas, Financial Digest, and Macro. Visible tabs continue to follow account access.

Config-driven pages

A page is a layout of widgets bound to data, served by Grove’s bundle and rendered generically. New page = new config.

Widget factory

A single registry; generic widgets self-register and resolve everywhere, so a new widget type is added once and reused.

HITL flow renderer

Walks a user through Grove’s human-in-the-loop workflows (start, render the form, submit, advance) entirely from flow config.

Generic factories

Heatmaps, charts, and lists are prop-driven primitives reused across features; the index-by-sector heatmap is the first of many.

Domain widgets

A domain ships its own widgets and registers them into the same factory registry, so domain UI resolves everywhere a generic widget would, with no renderer changes.

The UI is a renderer

Sky doesn’t hardcode screens. It fetches a page bundle from Grove, a layout of widgets each bound to data, and renders it with generic components. The adaptive home rotates its hero by how much data you have; domain examples such as the Investments research heatmap and goal carousel use configuration over the same shared renderers.

A factory you can extend

When configuration can’t express something, the widget registry lets a component self-register under a type name and be resolved from anywhere: dashboards, flows, and forms all fall back to it. The generic HeatmapGrid is the model citizen: a domain-free, accessible, prop-driven primitive reused across features.

Flows, not forms

For multi-step work, the HITL flow renderer drives Grove’s human-in-the-loop workflows end to end: starting a session, rendering each form from config, submitting, and advancing, so a complex guided experience is, again, mostly data.

Connects to