Skip to content
Josef Richter

Case study

Enaia

Enaia is a commercial real-estate CRM used by teams at CBRE and JLL. I worked directly with the CEO and CTO on design cleanup, an agentic design system, working prototypes and the mobile app.

Design Cleanup

The design and workflows needed an update to provide a trustworthy, modern and professional look & feel.

Enaia prospect tracker, with Researching as the first of five columns

Agentic Design System

An agentic design system takes a redesign from weeks to hours. Shared foundations, contracts and journey guidance keep both the interface and its workflows consistent with Enaia.

Human AI agent Agnostic contracts Foundations & tokensComponents · patternsBehaviors · templatesJourney guidance Foundations & tokensUI & workflowsJourney guidance Figma Component library Paper Design canvas LiveView Production codebase React Prototyping mirror Any other tool Mappings Which implementation Validation Check · repair · re-check Governance Proposals · human approval · adoption Decision journal Decisions · rationale · evidence
Select a part to explore the system.

A human instructs the agent or edits any tool directly. Shared foundations and tokens support contracts for components, patterns, behaviors and templates. Journey guidance covers flows across steps and screens. Tools propose changes and conform to approved rules. Mappings identify implementations and their adoption status. Validation returns actionable feedback. Governance reviews proposals before the system changes; the decision journal records the reasoning.

Human

Sets the intent, reviews proposals and decides what becomes part of the system. A human can instruct the agent or edit any design or code tool directly.

“Make this Button feel native on mobile.” The edit can start in any tool; changing the shared rule still needs an explicit decision.

AI agent

Reads the relevant foundations, contracts, journey guidance, mappings and decisions before editing. It composes the appropriate components, patterns, behaviors and templates for the task.

Adoption status tells it to use the current Button, migrate legacy uses only within the agreed scope, and leave protected exceptions alone.

After editing, it runs validation and follows the feedback. A gap in the contract becomes a proposal; the agent does not rewrite the rule just to make its output pass.

Foundations, contracts & guidance

The shared model spans individual controls, screen composition and complete workflows. Product context supplies who the product is for, what people need to do and the constraints they work within.

Foundations & tokens
Principles, color, typography, spacing, responsive behavior, elevation, platform conventions and iconography. Foundations define the rules; tokens hold the concrete values.
Components
Individual building blocks such as Button, Field or Card: purpose, anatomy, variants, states and accessibility.
Patterns
How pieces work together to solve a recurring task. A multi-step form coordinates its fields, progress, validation and navigation.
Behaviors
Shared interaction policies such as focus, disabled state, selection, disclosure and field validation. Each implementation declares what it conforms to.
Templates
Reusable screen structure: regions, slots, hierarchy and composition constraints. For example, an app shell or a record detail layout.
Flows & journeys
Guidance across steps and screens: Next validates before advancing; Back retains recoverable input. Exact steps and business outcomes stay with the product.
Rules & relationships
Which pieces compose, conform to or refine others. Detectable requirements become checks; contextual conflicts go to human review.

Enaia keeps journey guidance separate from artifact contracts. Shared behavior contracts have explicit adoption status; a separate flow-contract type remains deferred.

Example: the Button contract
Purpose & boundaries
A labeled action. When to use it, when to choose a link, tab, toggle or Icon Button, and what is outside its scope.
Anatomy & variants
A required label, optional leading icon, sizes and action hierarchy.
Appearance
Blue primary fill, typography, spacing and a radius token. Platform differences must be explicit, approved mappings.
Behavior & accessibility
Default, hover, focus and disabled states; accessible names, keyboard activation and focus treatment.
Composition & content
How it fits beside other actions, handles long labels and responds to its available space.
Verification
Stable requirement IDs, examples, testable expectations and the decisions behind them.
Figma

The mapping connects the Button contract to a component set, its properties, variants and variables. Validation compares that representation with the approved contract.

A designer changes a corner radius. The difference is either repaired to conform or submitted as a proposal to change the rule.

Paper

A canvas is another place to explore and edit the same design intent. Its nodes and styles need a mapping to the contract, just like a code component does.

Trying a rounder Button on the canvas proposes a direction. It becomes shared guidance only after review and approval.

LiveView · production codebase

The contract maps to the Phoenix component, its API and its usage in production. Existing code can contain several implementations with different adoption rules.

Illustrative Button inventory

Current
Use for new work; validate against the contract.
Legacy
Migrate when its surface is in scope; do not add new uses.
Protected exception
A known mismatch. Leave it unchanged until the recorded constraint is resolved and its owner approves.
React · prototyping mirror

A separate implementation for fast prototypes, using the same semantic contract. The React mapping translates properties, tokens and states into its own API.

A prototype Button and a Phoenix Button can use different code while satisfying the same requirements. A prototype does not become the production authority by accident.

Any other tool

Another canvas, framework or native platform can join through a mapping and a way to check its output. The contract does not depend on one vendor.

A native Button can follow platform conventions where an approved mapping allows it. Unsupported or unverified requirements stay visible; they do not silently count as passing.

Mappings & adoption status

Mappings connect a stable contract ID to real files, functions or design nodes. They translate properties and states and identify how each requirement can be checked.

Alongside them, the adoption manifest records which implementation is current, which needs migration, whether new usage is allowed and which exceptions must be preserved.

action.button → Figma component set · Phoenix function · React component. One meaning, with an explicit address and status for each implementation.

Validation & feedback

The checker reads the relevant foundations, contracts and mappings, then inspects the implementation or rendered result. It checks composition and behavior as well as individual components. Feedback names the requirement, location, expected value, observed value and next action.

Example · Button / disabled state

Expected
A disabled Button cannot activate.
Observed
It looks disabled, but still responds to a click.
Action
Use native disabled behavior in the mapped implementation; re-run the check.

Evidence is tied to the checked contract and mapping versions. Missing or stale evidence is not a pass. Changes to the rule itself go through governance.

Journey checks validate rule references and their links to feature tests. Whether guidance fits the task, or conflicts with other guidance, still needs review.

Governance

Decides who can approve a change, which surfaces adopt it and how exceptions expire or get revisited. Validation supplies evidence; human review decides whether to repair the implementation or change the contract.

A different Button radius may be drift or a valid platform convention. An accepted proposal updates the rule and mapping, defines migration scope and triggers fresh validation.

Decision journal

Records what was decided, by whom, when and why, with alternatives, evidence and any decision it supersedes. Entries distinguish design decisions from business or technical constraints.

Example · design decision

“Use the shared Button radius on web. Follow native platform conventions where explicitly mapped, instead of prescribing one fixed radius everywhere.”

Rationale: preserve a familiar native interaction. Record the affected platforms, approver and evidence with the decision.

The journal preserves the reasoning. Current mappings and readiness records say what is approved and usable today.

Read about the process in Building an Agentic Design System and From Pipeline to Governed Artifacts.

Prototyping

JEV, Enaia’s AI command bar, turns plain-language requests into interfaces and actions.

Mobile app

Five desktop sections, five tab slots, and requests to give search and reminders more room. I used session data to question the proposed navigation and work through the alternatives.

Enaia on a phone: decisions, alternatives and hindsight ↗

“I wish we’d had you when we started this.”

– David Young, CEO, Enaia

“Josef works across visual design, UX and front-end, and takes his own work from idea to shipped rather than handing off mockups. That combination is genuinely rare, and ideal for startups.”

– Neil Berkman, CTO, Enaia