apollo-ui — Engineering Performance
17 engineers all time · Jan 2025 – Sep 2026 · built 2026-09-08 · GitHub
Performance snapshot
Today's rolling 90-day reading for apollo-ui, compared with the start of the series. Pick a window to move that comparison point.
Avg. perf / dev / mo
−39.2%
2.09 → 1.27 ETV
Active engineers
+450.0%
2.0 → 11.0
Features
−19.8pp
60.7% → 40.9%
vs. UiPath
1.2x
2.1x → 1.2x · +22% above
apollo-ui vs. UiPath
Per-engineer ETV for apollo-ui against UiPath as a whole. Both lines are 90-day rolling averages scaled to a 30-day month, so they share one axis and can be read against each other at any point. Pick a window to zoom the chart to it.
Performance Composition
Each month's output split by type of work: Features (new value), Maintenance (sustaining systems), Tests, Docs, and Fixes (rework). The yellow line is output per engineer, so when it rises each engineer is delivering more, whatever the team size did. Unit: Engineering Throughput Value (ETV).
Engineering capacity
Effective engineers behind apollo-ui, against its pre-AI baseline. Each subject has its own: apollo-ui's is 1.05 ETV / dev / mo, its first reading in April 2025. Per-engineer ETV divided by that gives a capacity multiple, and that multiple applied to the engineers active in the trailing 90 days turns it into engineer-equivalents. The line is the real headcount, so the gap between line and area is what the leverage is worth. Because each baseline is its own, every subject opens at 1.0x on its first day: multiples measure improvement and are not comparable between subjects.
Knowledge concentration
How dependent is this repo on a small number of engineers? Higher top-1 share = higher key-person risk.
Cristian Calina owns 36.6 % of commits.
Behind the numbers
Written summary of the work completed each month.
No monthly reports available yet.
Top engineers
Most impactful commits
Top 10 by ETV in the all-time window.
- 3.9ETVfix(apollo-wind): quality pass across the component library A single change covering the apollo-wind audit: exports, test coverage, accessibility, design tokens, API consistency and dependency hygiene. Coverage gate: - vitest only enforces limits nested under coverage.thresholds, so the previous top-level keys were silently ignored and the gate never ran; nest them with a ratcheting floor (lines 60, functions 63, branches 54, statements 58) and exclude the Storybook-only src/templates demos from the metric - raise testTimeout and hookTimeout to 20s so wall-clock variance on shared CI runners cannot fail correct tests - new suites for src/components/custom (14 components), the untested ui components (chart, drawer, editable-cell, button-group, command, datetime-picker), the layout row/column/grid primitives, and form-designer, form-plugins, form-state-viewer and schema-viewer, each file including a jest-axe check Exports: - chart and drawer were implemented but unreachable from both the ui barrel and the package root; add them along with portal-container, lockable-value-field and variable-picker - give src/foundation an index barrel; the ./foundation subpath is held back for now, because the token surface is not ready for consumption Accessibility: - name the icon-only controls that had tooltip-only labels: panel-flow rail nav, form-designer section and field move/delete buttons, the section accordion chevron, the Always required checkbox and the rule-builder selects - associate the field-renderer and flow-properties-simple select triggers with their field labels Tokens and consistency: - unify the dialog, alert-dialog, sheet and drawer overlays on the theme-aware bg-curtain scrim token, whose alpha is restored in the preceding apollo-core commit - stats-card moves its per-render variant map into cva variants; avatar gains a cva size variant - forward refs from combobox, date-picker, date-range-picker, datetime-picker, file-upload and tree-view - adopt the shadcn v4 data-slot convention across all ~70 ui components, which also fixes calendar selectors that never matched Dependencies: - de-duplicate tailwindcss, @tailwindcss/postcss and autoprefixer, each of which was declared in both dependencies and devDependencies; all three stay in dependencies, because dist/tailwind.css ships a bare `@import "tailwindcss"` that Tailwind resolves from the installed package's own directory, and postcss.config.export.js imports the other two at consumer runtime. Installing @uipath/apollo-wind alone must be sufficient, so tailwindcss is a dependency and not a peer. Cleanup: - fix the biome templates exclusion, which never matched src/templates - delete the empty src/components/UiPath directory; the deprecated fontFamily.sans alias is kept a while longer for existing templates Storybook: - stories added for previously undocumented ui and custom components - derive the component gallery's story-ID prefix from the gallery's own story ID, so its links resolve both standalone and composed - drop the quick start's `npx shadcn@latest add` step Claude-Session: https://claude.ai/code/session_015n5YBa3rwBSxCUjkGNRKbG Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>snuziale · f4f880f2 · 2026-08-25
- 3.3ETVfeat(apollo-react): port over agents canvas [AG-330] (#4) * feat: port over agents canvas [AG-330] more minor code cleanup Run prettier Fix edges Fix typecheck and lint Fix format * fix: move constants, panning component, and conditional edge component * fix: use NodeContextMenu component and add todo for removing NodeBoundaryIconsContainer * chore: export agent canvas in build and add test coverage script * fix: add missing newline to icons index.ts --------- Co-authored-by: snuziale <6452957+snuziale@users.noreply.github.com>Akramin Akib · 717eef65 · 2025-09-10
- 2.7ETVfeat(apollo-react): add unified CanvasEdge with waypoint editing and pluggable routing Introduce CanvasEdge, a single canvas edge component whose behaviors compose via data flags (enableEditing, enableExecution, enableToolbar), and refactor SequenceEdge into a thin backward-compatible preset (routing: 'handle' + execution + toolbar). - Orthogonal waypoint routing with draggable segments, insert/remove waypoints, grid snapping, and node-drag rebalancing - Shared primitives (EdgePath, EdgeArrow, EdgeLabel, handles) and hooks extracted from the old SequenceEdge monolith - Pluggable EdgeRouter contract with useGraphRouter orchestration (fingerprint-based store subscription; manual waypoints win) - Support React Flow's animated edge flag (no dasharray override) - Stories: editing, handle routing, controlled mode, pluggable router, and execution states; unit tests for geometry and waypoint math Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>snuziale · 106d268b · 2026-06-11
- 2.5ETVfeat(apollo-react): copy edge toolbar changes from uix [MST-5311]Ben Schulz · 121a59b7 · 2026-01-06
- 2.0ETVfeat(apollo-react): support auto expansion of loop container [MST-9193]Sreedhar Avvari · 80e05c04 · 2026-04-30
- 2.0ETVfeat(apollo-react): add loop node [MST-8596]Sreedhar Avvari · 7624d02b · 2026-04-28
- 1.9ETVfeat(apollo-react): support category nesting and constraint filteringBen Schulz · f1f7260a · 2026-01-17
- 1.7ETVfeat(apollo-core): add core and playgroundCristian Calina · d5c56aa1 · 2025-11-21
- 1.6ETVfeat(apollo-react): chat service, messageRenderers, markdown, attachments renderCristian Calina · 85544e55 · 2025-01-31
- 1.6ETVfeat(apollo-react): add line jumps to crossing canvas edges Waypoint-routed edges can now hop over the edges they cross, so criss-crossing lines read as passing over rather than joining. Opt in per edge with `data.enableLineJumps`. Edges publish their polylines to a shared `EdgeCrossingsStore`, which derives every crossing once per commit and hands each edge back only its own jumps. At a crossing it is the horizontal segment that arcs, which keeps the notch pattern stable while nodes are dragged. Jumps are derived from the vertices and only ever change the path string, so publishing cannot re-trigger the computation that produced it. A crossing counts only where it clears both segments' ends, so a T-junction or a shared handle reads as a junction rather than a crossing. The clearance widens to the border radius at a bend, where the rendered line curves off the ideal corner and an arc would sit beside the stroke rather than over it. `createRoundedPath` grows an optional `jumps` argument that replaces a stretch of a straight run with a semicircular arc. Jumps that would eat into a rounded corner, or that sit closer together than one arc width, are dropped so a densely crossed stretch degrades to fewer notches instead of a scalloped line. A registration that repeats positions the store already holds is dropped. That is what a re-render hands over while a drag rebuilds its waypoints, and without the guard every notification would schedule a second whole-graph pass that could only reproduce the jumps it just published. `EdgePath`, `EdgeArrow` and `EdgeLabel` are memoized so an edge notified about a crossing elsewhere on its path does not reconcile its arrow and label as well. `EdgeCrossingsProvider` defers to an ancestor store, so mounting one over a `BaseCanvas` cannot split a canvas across two registries. The story is built as a documentation page rather than a bare canvas, since the rules are subtle enough that a caption did not explain them: an annotated diagram of a single jump, cards for the interiority rule and for the guards that suppress an arc, and a rule table covering all eight outcomes including the mixed opt-in case. That page rests on shared chrome extracted from BaseNode's Shapes and Execution States stories, which had each grown a private copy of it: - StoryPage: themed root, title and lede, plus StorySection and StoryCollapsibleSection for the blocks below the preview - StoryPreview: framed 90vw canvas with an expand overlay. The children are live in one branch at a time, so toggling remounts the canvas - StorySpecTable: generic over the row type, with per-column cell variants Waypoint routing only: handle-routed edges produce a path string with no vertices to intersect. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C3Toj3SHbt75zwJ9ufqojSsnuziale · 1e553a23 · 2026-08-10