Back to flin
flin

151 FlinUI Components Built by AI Agents

How we used parallel AI agents to build 151 FlinUI components in a single extended session -- the orchestration strategy, quality controls, and what it reveals about AI-assisted development.

Thales & Claude | March 25, 2026 11 min flin
flinflinuiai-agentsparallelbuild

On a single day in January 2026, Thales opened a terminal and started what would become the most productive session in ZeroSuite's history. By the time the session ended, 151 FlinUI components had been created -- not prototypes, not stubs, but production-ready components with proper props, variant handling, design token integration, and accessibility attributes.

One hundred fifty-one components. Built by AI agents running in parallel. Orchestrated by a human who understood what his product needed. This article is the story of that sprint -- the orchestration strategy, the quality controls, the failures, and what the session reveals about the future of software development.

The Setup: Why 151 at Once

By Session 037, FlinUI had 70 components. By Session 038, it had 100. But the gap analysis was brutal. A developer trying to build a real SaaS application with FlinUI would hit missing components within minutes. No DataTable with sorting. No DateRangePicker. No OrgChart. No ActivityFeed. No Kanban board. No command palette.

Thales had a spreadsheet. Three columns: Component Name, Category, Priority. One hundred fifty-one rows. Each row represented a component that existed in Material UI, Ant Design, or Chakra UI but did not yet exist in FlinUI.

The decision was not whether to build them. It was how fast.

The Orchestration Strategy

Building 151 components sequentially -- even at the pace of an AI that writes code without pausing to think about syntax -- would take an entire day. Each component needs a prop interface, variant handling, responsive behavior, dark mode support, and integration with the design token system. At 15 minutes per component, 151 components would take 38 hours.

Instead, we used parallel agents in waves:

Wave 1: Specifications (30 minutes)

Before any agent wrote a single line of FLIN code, we generated specifications for all 151 components. Each specification included:

  • Component name
  • Category (basic, layout, data, forms, feedback, navigation, enterprise, pro)
  • Props with types and defaults
  • Variants (visual variations)
  • Size options
  • Behavior description
  • Design token references
Component: DateRangePicker
Category: forms
Props:
  start_date: time? = none
  end_date: time? = none
  min_date: time? = none
  max_date: time? = none
  placeholder: text = "Select date range"
  format: text = "YYYY-MM-DD"
  disabled: bool = false
  onChange: fn(start, end)
Variants: default, inline
Design tokens: primary, bg-surface, border-color, radius-md, shadow-md

The specifications ensured every agent worked from the same requirements. No ambiguity about what a component should do. No conflicting interpretations of how props should work.

Wave 2: Basic and Layout (6 agents, 45 minutes)

The first wave of agents built the simplest components -- the ones with few props and no complex interactions:

  • Agent 1: 8 additional basic components (Kbd, Code, Highlight, Mark, Abbr, Sub, Sup, BlockQuote)
  • Agent 2: 5 layout extensions (Section, Header, Footer, Sidebar layout, Holy Grail)
  • Agent 3: 10 typography components (Heading, Paragraph, Caption, Label, Overline, etc.)
  • Agent 4: 8 data display additions (Timeline, Tree, Description, Callout, Metric, etc.)
  • Agent 5: 10 feedback additions (Banner, Snackbar, ProgressToast, LoadingOverlay, etc.)
  • Agent 6: 10 navigation additions (CommandPalette, MegaMenu, ScrollSpy, BackToTop, etc.)

Each agent received its specification list and the design token file. Each agent worked independently. At the end of 45 minutes, 51 components existed.

Wave 3: Complex Components (6 agents, 90 minutes)

The second wave tackled components with complex behavior:

  • Agent 1: DataGrid (with sorting, filtering, pagination, selection, inline editing)
  • Agent 2: Pivot Table (with row/column grouping, aggregation, drill-down)
  • Agent 3: 10 chart components (LineChart, BarChart, PieChart, etc.)
  • Agent 4: 10 form components (DateRangePicker, ColorPicker, FileUpload, etc.)
  • Agent 5: 10 enterprise components (OrgChart, Workflow, AuditLog, etc.)
  • Agent 6: 10 mobile components (SwipeAction, PullToRefresh, BottomSheet, etc.)

These components were more complex, so fewer were assigned per agent. The DataGrid alone is over 400 lines of FLIN code. The Pivot Table required implementing aggregation logic. The chart components required SVG generation with scaling algorithms.

Wave 4: PRO and Specialized (6 agents, 60 minutes)

The third wave built the remaining specialized components:

  • Agent 1: 15 AI/Chat components (ChatBubble, TypingIndicator, ModelSelector, etc.)
  • Agent 2: 15 e-commerce components (ProductCard, CartSummary, Checkout, etc.)
  • Agent 3: 10 admin components (PermissionEditor, TenantSwitcher, BulkAction, etc.)
  • Agent 4: 10 content components (ImageGallery, VideoPlayer, AudioPlayer, etc.)
  • Agent 5: 10 notification components (Push, InApp, Badge, Counter, etc.)
  • Agent 6: 10 developer tool components (JSON Viewer, Console, Network Inspector, etc.)

Wave 5: Integration and Testing (2 agents, 30 minutes)

The final wave verified that all components worked together:

  • Agent 1: Created index files for each category, built a demo application using 50+ components on a single page
  • Agent 2: Reviewed all components for design token consistency, prop naming conventions, and accessibility attributes

Quality Controls

Building fast creates risk. Here is how we maintained quality:

Convention Enforcement

Every component followed the same patterns:

// Every component starts with prop extraction and defaults
label = props.label || ""
variant = props.variant || "default"
size = props.size || "md"
disabled = props.disabled || false

// Every component uses design tokens

// Every component handles the disabled state

```

Agents were instructed to follow these patterns exactly. Deviations were caught in Wave 5's review.

Prop Naming Consistency

All components use the same prop names for the same concepts:

ConceptProp NameType
Visual stylevarianttext ("default", "primary", "danger", etc.)
Dimensionssizetext ("sm", "md", "lg", "xl")
Interactabilitydisabledbool
Loading stateloadingbool
Click handlerclick or onClickfn
Change handleronChangefn
Close handleronClosefn
Label textlabeltext
Placeholderplaceholdertext
Error stateerrortext?

This consistency means a developer who knows how to use

Loading responses...

Related Articles