· 4 Min read

The Next Abstraction Layer: One Product That Becomes Many

I've been almost a decade now since I've started building software. I've lived through jQuery spaghetti, the React revolution, the rise of design systems, and now the AI-assisted everything era. Each shift felt massive at the time - and then, eventually, it just became the way we work.

Lately, I've been asking myself a question that won't leave me alone: What's next?

Not "what's the next framework" or "what's the next tool." But what's the next fundamental shift in how we think about building products? What assumption are we making today that we'll look back on and wonder why it took us so long to question?

That question led me here.

Prism Dispersing Light into Interfaces

Frontend development has always progressed through abstraction, each layer removing assumptions we didn't realize we were making:

We stopped manipulating the DOM directly because it assumed too much about browsers. We moved to components because repeating markup assumed too much about structure. We built design systems because one-off styling assumed too much about scale.

Each step removed a constraint. Each step also surfaced new complexity that had previously been hidden.

Now we're confronting a much larger assumption:

That a single product experience should work for everyone.

This shift doesn't simplify the job. It fundamentally changes what the job is.

From Fixed Products to Generated Experiences

Historically, a "product" meant:

  • One navigation model
  • One feature hierarchy
  • One core mental model
  • Minor personalization at the edges

The product was fixed, and users adapted to it.

The emerging model inverts that relationship.

A product is no longer a static experience. It's a set of rules, components, and constraints capable of producing multiple valid experiences.

Instead of asking: "What should the app look like?"

We increasingly ask: "Under what conditions should the app look like this?"

That shift - from structure to rules - is the next abstraction layer.

This is not about generating UI for its own sake. Generative UI is simply one visible consequence of a deeper change: products are becoming decision systems.

This Is Already Happening

If this sounds theoretical, look closer at products you already use.

Spotify doesn't just play music. It generates a different product for every user. Your home screen, your Discover Weekly, even the order of your playlists - all assembled from rules about listening patterns, time of day, and inferred context. Two people opening the same app see fundamentally different products.

Duolingo adapts lesson difficulty, content order, and even notification timing based on your behavior. It's not showing you a fixed curriculum with personalized progress bars. It's generating a unique learning path - the actual structure of the product changes based on how you struggle and succeed.

Notion's onboarding asks what you're using it for - personal notes, team wiki, project management - and generates different starting templates, suggested features, and even navigation patterns. The same codebase becomes different products based on declared intent.

These aren't personalization features bolted onto static products. They're early glimpses of rule-driven architecture leaking into mainstream software.

But the biggest opportunity might be in enterprise.

Enterprise software has always struggled with a painful reality: every customer wants something slightly different. Feature toggles, custom builds, white-label versions, compliance variants - the result is often a brittle mess of conditional logic, forked codebases, or "enterprise tier" features nobody can maintain.

Rule-built products flip this from a liability into an architecture.

Why Backoffice Tools Are the Perfect Testbed

If this sounds abstract, enterprise backoffice software is where it becomes concrete - and why this could be a genuine game changer. Backoffice tools live at the intersection of policy, process, and permission. The work is repeatable, but the rules are not.

Think about the surfaces these teams use every day: HRIS, procurement, finance, IT admin, operations dashboards, compliance tooling. The workflows are dense, the approvals are layered, and the stakes are real. A small change in org policy can ripple across dozens of screens. A new regulation can invalidate an entire flow.

Rule-built architecture is built for exactly this kind of complexity:

  • Rules are already the product. Backoffice work is defined by "who can do what, when, and with what proof." That's a rules engine, not a set of screens.
  • Variability is the norm. Every company has different approval chains, spending thresholds, regional rules, and naming conventions. This isn't edge case behavior - it's the baseline.
  • Permissions are multidimensional. Role-based access isn't enough. Access depends on department, location, contract terms, and the specific entity in context. Rule-driven UIs can express that without hardcoding hundreds of variants.
  • Compliance is non-negotiable. These systems need audit trails, explicit reasoning, and provable constraints. Rule-driven products make those constraints first-class.

The alternative is what most teams live with today: a monolithic admin UI with layers of conditional logic, dozens of "enterprise only" toggles, and fragile customization pipelines that become a maintenance tax.

With rules at the core, you get a different shape of product:

  • Procurement teams see flows optimized for approvals and vendor risk checks.
  • Finance teams see reconciliations, audit summaries, and exception queues.
  • HR teams see onboarding, access provisioning, and policy compliance checks.

Same codebase. Same system. Different products - generated from policy and context instead of built as forks.

Instead of:

  • "Customer A gets features X, Y, Z; Customer B gets X, Y, W"
  • Hardcoded in config files, maintained by hand, breaking silently

You get:

  • "This customer is in healthcare, so HIPAA rules apply"
  • "This customer has 500+ users, so admin delegation surfaces"
  • "This customer's contract includes advanced analytics"

The rules compose. The product assembles itself based on contractual requirements, compliance context, and organizational structure.

One codebase. One deployment. Different products - not because of hacks, but because of architecture.

This isn't hypothetical. Large SaaS platforms already do primitive versions of this with feature flags and entitlements. But those systems are usually bolted on afterward, not designed in. Rule-built architecture makes this the foundation, not an afterthought.

For enterprise, the value isn't just better UX. It's:

  • Faster sales cycles - custom requirements become configuration, not development
  • Lower maintenance burden - one system to evolve, not dozens of variants
  • Safer compliance - rules are explicit, auditable, testable
  • Scalable customization - what took months takes days

The same architecture that personalizes a consumer app can differentiate an enterprise product per customer - without the technical debt.

None of them are fully there yet. But the direction is unmistakable. We're not waiting for some future technology. We're already building this way - we just haven't fully named it or embraced its implications.

One Product, Many Experiences

To make this concrete, here's an example.

Imagine a single product - one codebase, one design system, one set of constraints - that expresses itself differently based on user context.

For a college student, the product optimizes for:

  • Motivation and progress
  • Short-term goals
  • Low perceived risk

For a pre-retirement user, it optimizes for:

  • Stability and trust
  • Long-term planning
  • Clarity over speed

For a business owner, it optimizes for:

  • Cash-flow visibility
  • Operational control
  • Time efficiency

These differences aren't cosmetic. They affect:

  • Navigation structure
  • Feature prominence
  • Language and tone
  • Interaction density
  • Default workflows

This pattern isn't unique to finance. Any product with meaningfully different user contexts - healthcare, e-commerce, productivity tools, enterprise software - faces the same opportunity and the same complexity.

This isn't content personalization. It's product intent changing based on context.

Personalization vs. Product Generation

This distinction is where complexity compounds.

Personalization asks: "What should we show this user?"

Product generation asks: "What kind of product should this user be using?"

Product generation determines:

  • Which features exist at all
  • How they relate to each other
  • What the "happy path" is
  • Which tradeoffs the product makes

At this point, you're no longer building an app. You're building a decision system that outputs apps.

That decision system must be correct, safe, explainable, and maintainable - at scale.

The Hard Problems Nobody's Solved Yet

This vision sounds compelling in theory. In practice, there are fundamental challenges that will determine whether it actually works.

The Latency Problem: Generation Must Feel Instant

Here's a truth we take for granted: traditional UI doesn't have loading states for itself.

When you click a button, the button is already there. When you navigate to a page, the layout renders immediately. We've spent years optimizing for perceived performance - skeleton screens, optimistic updates, lazy loading - all to maintain the illusion that UI is instant.

Generative UI threatens to break that contract.

If every interaction requires the system to "think" about what to show next, we've regressed to the worst days of server-rendered pages. Users don't want to watch a spinner while the app figures out what kind of app it should be.

The constraint is clear: generated experiences must feel as instant as static ones.

That means aggressive pre-computation, predictive generation, and intelligent caching of likely states. The system needs to generate not just the current experience, but probable next experiences - before the user asks for them.

This is hard. But it's non-negotiable. A product that feels slow while "personalizing" isn't personalized - it's just broken.

The Learning Problem: Apps That Build Themselves

Think about how social media works.

You don't configure your feed. You don't tell the algorithm what you want. You just use it - and the feed learns. It observes your behavior, infers your preferences, and continuously reshapes itself around what keeps you engaged.

Now imagine that same principle applied to a product's entire structure.

The app observes which features you use and which you ignore. It notices when you struggle and when you flow. Over time, it reshapes itself - surfacing what matters, hiding what doesn't, adjusting complexity to match your expertise.

This isn't science fiction. It's the logical extension of what we're already building.

But it requires a fundamental shift in how we think about product development. We're no longer designing a product. We're designing a product that designs itself based on observed behavior.

The implications are significant:

  • Every interaction becomes training data
  • The product must balance exploration (showing new things) with exploitation (reinforcing what works)
  • Changes must be gradual enough to not disorient users, but meaningful enough to matter
  • The system must distinguish between "user doesn't want this" and "user doesn't know this exists yet"

Social media optimizes for engagement. Products must optimize for outcomes - which are harder to measure and easier to get wrong.

The Cold Start Problem: What Do You Show When You Know Nothing?

This might be the hardest challenge of all.

Generative products adapt to context. But on day one, with a new user, there is no context. No behavior history. No inferred preferences. Just a blank slate.

The tempting answer is to show a blank canvas. Let users assemble their own experience from the start. But this fails for a fundamental reason:

Most users don't know what they want until they see it.

Asking someone to configure their ideal product experience is like asking someone what they want for dinner when they haven't seen the menu. The cognitive load is too high, the options are too abstract, and the result is usually frustration or abandonment.

So we need smarter approaches to bootstrapping.

One promising pattern: ask first, then generate.

Instead of dropping users into a generic experience and hoping the system learns fast enough, start with a brief conversation. A few well-chosen questions can collapse the possibility space dramatically.

"What brings you here today?" "Are you managing this for yourself or a team?" "What's most important to you right now - speed, thoroughness, or simplicity?"

These aren't configuration options. They're intent signals. And with just two or three answers, the system has enough context to generate a first experience that actually fits.

This is fundamentally different from traditional onboarding wizards that ask users to set preferences they don't understand yet. The questions aren't "which modules do you want?" - they're about goals, context, and priorities. The system translates those into structure.

Done well, this feels almost magical. The user answers a few simple questions, and the product assembles itself around their answers. They didn't configure anything - they just had a conversation, and the product understood.

But questions alone aren't enough.

Even with good initial questions, the first experience must feel complete. Users should feel like they're using a real product, not a prototype generated from a quiz.

This means:

  • Designing defaults that are genuinely useful, not just safe. A blank dashboard with "add widgets" isn't a default - it's a cop-out.
  • Asking questions that reveal intent, not preferences. "What are you trying to accomplish?" beats "Which features do you want?" every time.
  • Making the generated experience feel inevitable - as if this was always the right product for this person, not one of many possible outputs.
  • Earning the right to adapt further - showing value first, then introducing deeper personalization as a benefit rather than a requirement.

The cold start isn't just a technical problem. It's a trust problem. Users need to believe the product understands them before they'll let it adapt for them. A well-designed initial conversation can build that trust from the first interaction.

The Transparency Problem: When the Ground Shifts Under Users' Feet

Adaptive products change. That's the point. But change creates a dangerous UX trap.

When features disappear, users feel lost. They developed muscle memory. They knew where things were. Now they're hunting for a button that no longer exists - not because it's broken, but because the system decided they don't need it anymore.

That's not personalization. That's gaslighting.

When features appear, users feel overwhelmed. A new capability shows up unannounced. Now there's a learning curve they didn't ask for, cognitive load they didn't expect, and uncertainty about what else might change without warning.

Both scenarios share the same root cause: the system changed without explaining itself.

In static products, we solve this with release notes and onboarding flows. But adaptive products change continuously, per user. You can't write release notes for an audience of one.

So how do we keep users informed without drowning them in notifications?

Make changes visible, not surprising. If a feature is being phased out for a user, don't just remove it. Fade it. Move it to a "less used" section first. Give users a chance to notice the transition before it's complete. If they reach for it, they should understand why it moved - and have a clear path to bring it back.

Introduce new features in context, not in isolation. Don't announce "we added a new feature." Surface the feature at the moment it becomes relevant. "You've done this three times manually - want us to automate it?" That's not a learning curve. That's a natural extension of what the user already understands.

Let users see the reasoning. The best adaptive systems aren't black boxes. They can explain themselves: "We're showing you this because you frequently..." or "This was hidden because you haven't used it in 90 days." Transparency turns mysterious changes into understandable ones.

Always provide an escape hatch. Users must be able to override the system's decisions. If they want the "wrong" layout for their profile, let them have it. Adaptation should feel like a helpful suggestion, not an imposed reality.

The goal isn't to hide the fact that the product is changing. It's to make users feel like partners in that change, not victims of it.

What Rule-Built Products Look Like in Practice

Consider a single rule expressed in plain language:

A user must never be more than one step away from understanding the consequences of a financial action.

That rule might produce:

  • A confirmation modal for one user
  • Inline guidance for another
  • A forced review screen for high-risk contexts

The UI differs. The invariant does not.

In a fixed product, this principle would be embedded implicitly in screens and flows. In a generated product, it must be explicit, testable, and enforceable.

This is the difference between designing screens and designing guarantees.

Why This Becomes More Work, Not Less

Higher abstraction doesn't remove complexity. It forces you to manage it explicitly.

You're Encoding Judgment, Not Just UI

When structure is fixed, many decisions are implicit: what's primary, what's secondary, what can be safely ignored.

In a rule-driven product, those judgments must be formalized and enforced by code.

You're no longer relying on static screens to communicate intent. You're encoding intent into systems.

Every Rule Introduces Combinatorial Risk

A static app has a finite number of flows.

A rule-driven product has interacting constraints, conditional behavior, and edge cases you won't see until production.

Developers must think in terms of state spaces, invariants, and failure modes. This is closer to systems engineering than traditional frontend work.

Ambiguity Becomes a Technical Problem

In fixed designs, ambiguity is often resolved informally - by designers, PMs, or last-minute decisions.

In adaptive systems, ambiguity becomes executable:

  • What happens when signals conflict?
  • Which principle wins when tradeoffs collide?

If the system can't decide, you must teach it how. That means defining priorities, escalation paths, and safe defaults.

Uncertainty doesn't disappear. It becomes code.

Where This Approach Doesn't Belong

Not everything should be rule-built. Some products are better off fixed.

High-stakes, infrequent workflows. Filing taxes. Submitting insurance claims. Completing legal documents. Users don't want adaptation here - they want predictability. They need to know exactly what's coming next, every time. Surprise is the enemy. A fixed, well-designed flow is more trustworthy than a clever one.

Products where muscle memory matters. Professional tools used for hours daily - video editors, IDEs, trading platforms - reward consistency. Users invest in learning the interface. Changing it "for their benefit" destroys that investment. Power users often want the same product they mastered, not a smarter one.

Domains where explainability is legally required. Healthcare diagnostics, financial advice, loan decisions. If you can't explain exactly why the interface showed what it showed, you may not be allowed to show it at all. Rule-driven products can be explainable, but the burden of proof is higher.

Small, focused tools. A calculator. A timer. A unit converter. These don't need adaptation. They need to do one thing well, instantly, every time. Adding intelligence would make them worse.

Early-stage products still finding fit. If you don't yet know who your users are or what they need, building adaptive infrastructure is premature optimization. You need to learn from a fixed product before you can encode that learning into rules.

The question isn't "can we make this adaptive?" It's "should we?"

Adaptive products shine when user contexts genuinely diverge - when a college student and a retiree have fundamentally different needs from the same domain. They shine when the product is complex enough that one-size-fits-all becomes no-size-fits-anyone.

But adaptation has costs: complexity, testing burden, reduced predictability, organizational overhead. Sometimes a well-crafted fixed experience is the right answer.

The skill isn't building adaptive products everywhere. It's recognizing where adaptation creates value - and where it destroys trust.

From Screens to Systems: A New Architecture

This is the real shift.

Frontend development stops being primarily about screens and starts being about possibility spaces.

Instead of defining:

  • "This is the layout"
  • "This is the flow"

You define:

  • What layouts are allowed
  • What tradeoffs are acceptable
  • What must always remain true

You don't design outcomes. You design boundaries.

And boundaries are harder to get right than screens. Poorly defined boundaries are worse than rigid UI - they allow technically valid but experientially dangerous outcomes.

This mindset shift implies a fundamental change in how we architect systems.

Three Layers, Not Two

Traditionally, the backend drives structure. APIs are designed around screens: "here's the endpoint for the dashboard," "here's the endpoint for user settings." The frontend is largely a renderer - it takes what the backend provides and displays it.

In adaptive products, we need to think in three layers.

Layer 1: Capabilities. This is your traditional backend - data, business logic, security, APIs. But instead of designing APIs around screens, you expose capabilities: what data exists, what actions can be taken, what rules constrain them. The capability layer doesn't dictate how things should be presented. It describes what's possible.

Layer 2: Orchestration. This is the intelligence layer - and here's the key insight: it doesn't have to live on the client. The orchestration layer takes user context, available capabilities, and composition rules, then decides what experience to generate. It answers: "Given who this user is and what they're trying to accomplish, how should we assemble these capabilities?"

Layer 3: Rendering. The frontend becomes a rendering layer. It receives a composed experience - components, data, layout instructions - and renders it. The intelligence has already happened upstream.

Where Does Intelligence Live?

Orchestration could happen:

  • In the cloud - a service that composes experiences server-side, storing component definitions, user models, and composition rules. The frontend receives fully-formed experiences to render.
  • At the edge - closer to users for lower latency, making real-time composition decisions based on cached rules and context.
  • On the client - for offline-capable or highly interactive applications where composition needs to happen instantly without round-trips.
  • Hybrid - initial composition in the cloud, with client-side orchestration handling real-time adaptations.

The cloud approach has significant advantages: component definitions and composition rules live centrally, updates propagate instantly, and you can leverage more compute for complex decisions. The frontend stays thin - focused purely on rendering whatever it's told.

What This Means for APIs and Data

APIs become declarative, not prescriptive. Instead of /api/dashboard returning a pre-structured dashboard, you might have /api/capabilities returning a graph of available actions, data sources, and their relationships. The orchestration layer queries what's possible, then decides what to build.

Rules travel with data. Each capability comes with its constraints: who can use it, under what conditions, what validations apply. The orchestration layer doesn't just see data - it sees data plus the rules for using it safely.

Composition becomes a first-class concern. Which capabilities appear together? In what order? With what emphasis? These decisions move out of static code and into a dynamic orchestration layer that can be updated, tested, and evolved independently.

The contract between layers becomes clear: capabilities say "here's what's possible," orchestration says "here's what we'll build," and rendering says "here's what users see."

How This Changes Day-to-Day Work

Components Stop Representing UI

A component is no longer "a card" or "a modal." It becomes a capability: behavior constrained by rules.

Good components answer:

  • When should I appear?
  • When should I disappear?
  • What must remain consistent no matter how I'm used?

If a component only works in one flow, it's already too rigid.

Navigation Becomes Declarative

Hardcoded navigation becomes a liability.

In adaptive products, navigation is generated from intent, influenced by context, and constrained by safety and usability rules.

Navigation becomes data, not structure.

Design Systems Encode Reasoning

Design systems can't just answer "What does this look like?" They must answer "Why does this look like this?"

That means modeling tradeoffs:

  • Trust vs. speed
  • Density vs. clarity
  • Guidance vs. freedom

Once reasoning is explicit, systems can act on it. Making reasoning explicit is uncomfortable - but necessary - work.

Testing Moves Up the Abstraction Stack

You can't test every generated outcome. You test rules and invariants:

  • Critical safety actions must never be hidden
  • Every experience must expose a clear next step
  • No generated flow may exceed a defined cognitive threshold

Testing shifts from visual verification to behavioral guarantees.

Who Owns the Rules?

This might be the most uncomfortable question.

In traditional product development, ownership is clear. Design owns the screens. Engineering owns the implementation. Product owns the prioritization. The boundaries are imperfect but understood.

Rule-driven products blur these boundaries uncomfortably.

Consider a rule like: "First-time users should never see more than three actions on any screen." Who owns that?

  • Product might argue it's a strategic decision about user experience
  • Design might argue it's a UX principle that should live in the design system
  • Engineering might argue it's a technical constraint that must be enforced in code
  • Data might argue it should be learned from user behavior, not dictated

The honest answer: it's all of them. And none of them.

This isn't a problem to solve - it's a tension to navigate. Rule-driven products require a new kind of collaboration where:

  • Product defines outcomes and priorities, not screens
  • Design defines principles and constraints, not just visuals
  • Engineering defines what's enforceable and at what cost
  • Data/Research defines what's learnable and what's assumed

Some organizations will create new hybrid roles - "product systems designers" or "experience architects" - who sit at the intersection. Others will evolve existing roles. Either way, the traditional handoff model breaks down.

If you're used to designers producing Figma files and engineers implementing them, this shift will feel chaotic. Rules require continuous negotiation, not sequential handoffs. The rule isn't "done" when it's written - it's done when the team agrees it produces acceptable outcomes across contexts.

This isn't just a technical shift. It's an organizational one. And organizations that can't adapt their team structures will struggle to build adaptive products.

Why Developer Value Increases

As tools improve, low-level implementation gets cheaper.

Higher abstraction demands stronger judgment, deeper user understanding, and the ability to reason about unseen outcomes.

The hardest problems become:

  • Defining constraints that hold across contexts
  • Preventing catastrophic edge cases
  • Balancing competing goals without collapsing flexibility

Those problems can't be solved by code generation alone.

What This Means for You Right Now

You don't need AI, a new framework, or a greenfield project to start thinking this way.

Start by asking:

  • Where does this product assume a single type of user?
  • Which UI decisions are structural vs. contextual?
  • What decisions are hardcoded that could be rule-driven?
  • What must never change, no matter how the product adapts?

Notice where flexibility helps - and where it would be dangerous.

That awareness alone raises the quality of your work.

The Bottom Line

We're not moving toward "AI-built apps."

We're moving toward rule-built products - systems capable of responsibly generating different experiences for different people.

That makes frontend development more complex, more abstract, more demanding, and more valuable.

The next abstraction layer isn't about hiding complexity. It's about deciding where complexity is allowed to live.

The developers who understand that won't just build the future of software.

They'll define its boundaries.