Agent-Native Limitations: 7 Critical Constraints Developers Must Know

Agent-native requires additive-only database migrations, supports only single-author real-time editing, and mandates TypeScript for all SDK interactions.

Agent-native is a framework that enables AI agents and UI components to share a unified data and action surface within the BuilderIO ecosystem. While the BuilderIO/agent-native repository provides powerful abstractions for building agent-driven applications, it imposes specific architectural constraints that affect collaboration patterns, data modeling, and production deployment strategies.

Real-Time Collaboration Constraints

The framework's real-time collaboration features are currently limited to basic synchronization without sophisticated conflict resolution mechanisms.

Single-Author Editing Only

As documented in packages/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md, the v1 implementation supports only single-author editing. If multiple users attempt to edit a document simultaneously, the system does not merge changes automatically, resulting in conflicts or stale data. The useRealtimeCollab hook expects a single active writer per document.

No Built-in CRDT or OT Engine

Unlike dedicated collaboration platforms, agent-native lacks a conflict-free replicated data type (CRDT) or operational-transform (OT) layer. This means concurrent edits will overwrite each other rather than being intelligently merged, making the framework unsuitable for Google Docs-style multi-user editing without additional infrastructure.

Agent-Driven UI Boundaries

The UI layer operates under strict constraints regarding how it can invoke logic and what components it can render.

Actions-Only Invocation Pattern

According to the four-area checklist in AGENTS.md, the UI can only invoke behavior exposed through the actions/ surface. There is no "raw fetch" shortcut for custom endpoints; every interaction must be wrapped as a defined action. This enforces strict boundaries between the agent and UI but adds boilerplate for simple HTTP requests.

UI Primitive Restrictions

The framework enforces the use of shadcn/ui primitives and Tabler icons. Creating bespoke UI widgets requires manual integration and may break optimistic UI updates managed by the agent. Custom components must conform to the existing design system or risk incompatible state management.

Data Persistence and Schema Limitations

Data management follows strict SQL-centric rules that limit flexibility in schema evolution.

Additive-Only Schema Migrations

Per the data-lives-in-SQL contract in AGENTS.md, migrations must be additive only. You cannot drop, rename, or truncate columns without violating the architecture contract. Schema changes require creating new columns rather than altering existing ones, which can lead to data duplication over time.

SQL-First Architecture Requirements

All application state lives in a Drizzle-managed SQL database. While local-file mode exists, features like real-time sync and multi-tenant access filters assume a relational store. This constraint eliminates NoSQL or serverless database options for production deployments.

Security and Secrets Management

Hardcoded credentials are explicitly forbidden by the framework's security model.

Manual Secret Configuration

The framework never auto-injects API keys or tokens. Third-party integrations must expose credentials via Builder Vault or .env placeholders. CI lint rules will reject any commits containing secrets in source files, enforcing external secret management.

Extensibility and Language Support

Plugin architecture and language bindings impose build-time and TypeScript constraints.

Static Plugin Discovery

Plugins are discovered at build time only, as noted in the core documentation. Dynamically loading plugins at runtime is unsupported; you must add the plugin to the codebase and rebuild the application. This prevents hot-swapping functionality in production environments.

TypeScript-Only SDK

The current SDK is TypeScript-only. Using agent-native from Python, Go, or other languages requires writing a custom bridge layer. All action definitions, hooks, and components must be implemented in TypeScript.

Performance and Scaling Bottlenecks

Production scaling requires careful architecture due to process and memory constraints.

Single-Process Nitro Server

The Nitro API runs as a single Node process. High-throughput workloads require horizontal scaling via load-balanced deployments, which the framework does not handle automatically. See packages/core/docs/content/deployment.md for recommended scaling patterns.

Memory-Intensive Real-Time Sync

The useDbSync() polling mechanism stores a full snapshot of relevant rows in memory per client. For large datasets, this creates significant memory pressure on the server, potentially requiring vertical scaling or pagination workarounds.

Documentation and API Stability

Rapid evolution affects long-term maintenance.

Rapidly Evolving Public API

The public API surface—including actions, skills, and templates—changes frequently. Developers must monitor packages/core/CHANGELOG.md closely, as breaking changes occur without extended deprecation periods.

Code Examples Illustrating Key Limitations

The following examples demonstrate how these constraints manifest in actual implementation.

Defining Actions with Additive Schemas

// packages/core/src/actions/userProfile.ts
import { defineAction } from '@/actions';
import { z } from 'zod';

export const getUserProfile = defineAction({
  input: z.object({ userId: z.string() }),
  // LIMITATION: Schema must be additive only
  // Cannot remove 'legacyField' without creating new action version
  output: z.object({
    id: z.string(),
    name: z.string(),
    legacyField: z.string(), // Must keep for backward compatibility
    newField: z.string().optional(), // Additions only
  }),
  async handler({ input }) {
    return await db.select().from(users).where(eq(users.id, input.userId));
  },
});

Implementing Single-Author Real-Time Collaboration

import { useRealtimeCollab } from '@/hooks';

export function DocumentEditor({ docId }: { docId: string }) {
  const { state, sendEdit } = useRealtimeCollab(docId);
  
  // LIMITATION: Only one author can edit at a time
  // Concurrent edits will cause conflicts or data loss
  return (
    <textarea
      value={state.content}
      onChange={(e) => sendEdit(e.target.value)}
    />
  );
}

Working Within UI Primitive Constraints

import { Button } from '@/components/ui/button';
// LIMITATION: Must use shadcn/ui primitives
// Custom components require manual agent integration

export function CustomActionButton() {
  return (
    <Button
      onClick={async () => {
        // All UI interactions must go through actions surface
        await invokeAction('custom/action');
      }}
    >
      Execute Action
    </Button>
  );
}

Summary

  • Single-author editing: Real-time collaboration supports only one writer per document without CRDT/OT merge capabilities.
  • Additive migrations: Database schemas can only grow; dropping or renaming columns violates the architecture contract.
  • Actions-only pattern: UI cannot perform raw HTTP requests; all logic must be wrapped in defined actions.
  • TypeScript exclusivity: The SDK supports no other languages natively; polyglot usage requires custom bridges.
  • Build-time plugins: Runtime plugin loading is impossible; all extensions require rebuilds.
  • Memory-intensive sync: Real-time database synchronization stores full row snapshots in memory per client.
  • Single-process server: The Nitro backend requires external load balancing for horizontal scaling.

Frequently Asked Questions

Can multiple users edit documents simultaneously in agent-native?

No. The v1 real-time collaboration implementation in packages/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md explicitly supports single-author editing only. Concurrent edits will not be merged and may result in conflicts or data loss, as the framework lacks CRDT or OT engines.

How do I handle schema changes that require dropping or renaming columns?

You cannot drop or rename columns directly. Per the data-lives-in-SQL contract in AGENTS.md, all schema migrations must be additive. Create new columns with desired changes and deprecate old fields gradually, or write migration scripts that preserve the additive-only policy while duplicating data temporarily.

Is agent-native suitable for high-throughput production workloads?

Only with external scaling. The Nitro server runs as a single Node process, and useDbSync() maintains row snapshots in memory per client. High-throughput scenarios require load-balanced deployments and careful memory management, as documented in packages/core/docs/content/deployment.md.

Can I use Python or other languages with the agent-native SDK?

No. The current SDK is TypeScript-only. Using Python, Go, or other languages requires building a custom bridge that communicates with the TypeScript actions surface, as the framework provides no native bindings for other languages.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →