@agent-native/core 0.7.4 → 0.7.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/README.md +6 -5
  2. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  3. package/dist/agent/engine/anthropic-engine.js +8 -4
  4. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  5. package/dist/agent/engine/types.d.ts +1 -1
  6. package/dist/agent/engine/types.d.ts.map +1 -1
  7. package/dist/agent/production-agent.d.ts +7 -0
  8. package/dist/agent/production-agent.d.ts.map +1 -1
  9. package/dist/agent/production-agent.js +153 -118
  10. package/dist/agent/production-agent.js.map +1 -1
  11. package/dist/agent/run-manager.d.ts +4 -0
  12. package/dist/agent/run-manager.d.ts.map +1 -1
  13. package/dist/agent/run-manager.js +46 -25
  14. package/dist/agent/run-manager.js.map +1 -1
  15. package/dist/agent/run-store.d.ts +12 -3
  16. package/dist/agent/run-store.d.ts.map +1 -1
  17. package/dist/agent/run-store.js +25 -4
  18. package/dist/agent/run-store.js.map +1 -1
  19. package/dist/chat-threads/store.d.ts +13 -0
  20. package/dist/chat-threads/store.d.ts.map +1 -1
  21. package/dist/chat-threads/store.js +66 -10
  22. package/dist/chat-threads/store.js.map +1 -1
  23. package/dist/cli/create.d.ts.map +1 -1
  24. package/dist/cli/create.js +8 -1
  25. package/dist/cli/create.js.map +1 -1
  26. package/dist/cli/index.js +8 -0
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/cli/info.d.ts +2 -0
  29. package/dist/cli/info.d.ts.map +1 -0
  30. package/dist/cli/info.js +103 -0
  31. package/dist/cli/info.js.map +1 -0
  32. package/dist/client/AssistantChat.d.ts.map +1 -1
  33. package/dist/client/AssistantChat.js +249 -85
  34. package/dist/client/AssistantChat.js.map +1 -1
  35. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  36. package/dist/client/agent-chat-adapter.js +12 -1
  37. package/dist/client/agent-chat-adapter.js.map +1 -1
  38. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  39. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  40. package/dist/client/composer/TiptapComposer.js +46 -2
  41. package/dist/client/composer/TiptapComposer.js.map +1 -1
  42. package/dist/client/composer/VoiceButton.d.ts +21 -0
  43. package/dist/client/composer/VoiceButton.d.ts.map +1 -0
  44. package/dist/client/composer/VoiceButton.js +51 -0
  45. package/dist/client/composer/VoiceButton.js.map +1 -0
  46. package/dist/client/composer/useVoiceDictation.d.ts +38 -0
  47. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -0
  48. package/dist/client/composer/useVoiceDictation.js +398 -0
  49. package/dist/client/composer/useVoiceDictation.js.map +1 -0
  50. package/dist/client/onboarding/OnboardingPanel.js +2 -2
  51. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  52. package/dist/client/org/OrgSwitcher.d.ts +5 -4
  53. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  54. package/dist/client/org/OrgSwitcher.js +90 -24
  55. package/dist/client/org/OrgSwitcher.js.map +1 -1
  56. package/dist/client/resources/McpServerDetail.d.ts +15 -0
  57. package/dist/client/resources/McpServerDetail.d.ts.map +1 -0
  58. package/dist/client/resources/McpServerDetail.js +65 -0
  59. package/dist/client/resources/McpServerDetail.js.map +1 -0
  60. package/dist/client/resources/ResourceEditor.js +1 -1
  61. package/dist/client/resources/ResourceEditor.js.map +1 -1
  62. package/dist/client/resources/ResourceTree.d.ts +6 -1
  63. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  64. package/dist/client/resources/ResourceTree.js +18 -7
  65. package/dist/client/resources/ResourceTree.js.map +1 -1
  66. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  67. package/dist/client/resources/ResourcesPanel.js +191 -20
  68. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  69. package/dist/client/resources/use-mcp-servers.d.ts +68 -0
  70. package/dist/client/resources/use-mcp-servers.d.ts.map +1 -0
  71. package/dist/client/resources/use-mcp-servers.js +83 -0
  72. package/dist/client/resources/use-mcp-servers.js.map +1 -0
  73. package/dist/client/resources/use-resources.d.ts +39 -1
  74. package/dist/client/resources/use-resources.d.ts.map +1 -1
  75. package/dist/client/resources/use-resources.js +102 -0
  76. package/dist/client/resources/use-resources.js.map +1 -1
  77. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  78. package/dist/client/settings/SettingsPanel.js +3 -2
  79. package/dist/client/settings/SettingsPanel.js.map +1 -1
  80. package/dist/client/settings/VoiceTranscriptionSection.d.ts +14 -0
  81. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -0
  82. package/dist/client/settings/VoiceTranscriptionSection.js +111 -0
  83. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -0
  84. package/dist/client/sharing/ShareButton.d.ts +6 -4
  85. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  86. package/dist/client/sharing/ShareButton.js +299 -34
  87. package/dist/client/sharing/ShareButton.js.map +1 -1
  88. package/dist/client/sharing/ShareDialog.d.ts +22 -4
  89. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  90. package/dist/client/sharing/ShareDialog.js +170 -148
  91. package/dist/client/sharing/ShareDialog.js.map +1 -1
  92. package/dist/client/sharing/VisibilityBadge.d.ts.map +1 -1
  93. package/dist/client/sharing/VisibilityBadge.js +1 -2
  94. package/dist/client/sharing/VisibilityBadge.js.map +1 -1
  95. package/dist/client/use-action.d.ts.map +1 -1
  96. package/dist/client/use-action.js +20 -1
  97. package/dist/client/use-action.js.map +1 -1
  98. package/dist/db/migrations.d.ts +18 -3
  99. package/dist/db/migrations.d.ts.map +1 -1
  100. package/dist/db/migrations.js +25 -3
  101. package/dist/db/migrations.js.map +1 -1
  102. package/dist/deploy/workspace-core.js +2 -2
  103. package/dist/mcp-client/config.d.ts +20 -1
  104. package/dist/mcp-client/config.d.ts.map +1 -1
  105. package/dist/mcp-client/config.js +28 -11
  106. package/dist/mcp-client/config.js.map +1 -1
  107. package/dist/mcp-client/hub-client.d.ts +38 -0
  108. package/dist/mcp-client/hub-client.d.ts.map +1 -0
  109. package/dist/mcp-client/hub-client.js +147 -0
  110. package/dist/mcp-client/hub-client.js.map +1 -0
  111. package/dist/mcp-client/hub-routes.d.ts +42 -0
  112. package/dist/mcp-client/hub-routes.d.ts.map +1 -0
  113. package/dist/mcp-client/hub-routes.js +114 -0
  114. package/dist/mcp-client/hub-routes.js.map +1 -0
  115. package/dist/mcp-client/index.d.ts +15 -0
  116. package/dist/mcp-client/index.d.ts.map +1 -1
  117. package/dist/mcp-client/index.js +35 -0
  118. package/dist/mcp-client/index.js.map +1 -1
  119. package/dist/mcp-client/manager.d.ts +54 -8
  120. package/dist/mcp-client/manager.d.ts.map +1 -1
  121. package/dist/mcp-client/manager.js +276 -59
  122. package/dist/mcp-client/manager.js.map +1 -1
  123. package/dist/mcp-client/remote-store.d.ts +102 -0
  124. package/dist/mcp-client/remote-store.d.ts.map +1 -0
  125. package/dist/mcp-client/remote-store.js +200 -0
  126. package/dist/mcp-client/remote-store.js.map +1 -0
  127. package/dist/mcp-client/routes.d.ts +55 -0
  128. package/dist/mcp-client/routes.d.ts.map +1 -0
  129. package/dist/mcp-client/routes.js +384 -0
  130. package/dist/mcp-client/routes.js.map +1 -0
  131. package/dist/mcp-client/visibility.d.ts +16 -0
  132. package/dist/mcp-client/visibility.d.ts.map +1 -0
  133. package/dist/mcp-client/visibility.js +45 -0
  134. package/dist/mcp-client/visibility.js.map +1 -0
  135. package/dist/org/context.js +2 -2
  136. package/dist/org/context.js.map +1 -1
  137. package/dist/org/handlers.js +2 -2
  138. package/dist/org/handlers.js.map +1 -1
  139. package/dist/resources/handlers.d.ts.map +1 -1
  140. package/dist/resources/handlers.js +30 -0
  141. package/dist/resources/handlers.js.map +1 -1
  142. package/dist/secrets/register-framework-secrets.d.ts +13 -0
  143. package/dist/secrets/register-framework-secrets.d.ts.map +1 -0
  144. package/dist/secrets/register-framework-secrets.js +59 -0
  145. package/dist/secrets/register-framework-secrets.js.map +1 -0
  146. package/dist/secrets/register.d.ts.map +1 -1
  147. package/dist/secrets/register.js +8 -1
  148. package/dist/secrets/register.js.map +1 -1
  149. package/dist/server/action-routes.d.ts.map +1 -1
  150. package/dist/server/action-routes.js +22 -2
  151. package/dist/server/action-routes.js.map +1 -1
  152. package/dist/server/agent-chat-plugin.d.ts +16 -0
  153. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  154. package/dist/server/agent-chat-plugin.js +237 -70
  155. package/dist/server/agent-chat-plugin.js.map +1 -1
  156. package/dist/server/app-url.d.ts.map +1 -1
  157. package/dist/server/app-url.js +11 -3
  158. package/dist/server/app-url.js.map +1 -1
  159. package/dist/server/auth.d.ts.map +1 -1
  160. package/dist/server/auth.js +50 -0
  161. package/dist/server/auth.js.map +1 -1
  162. package/dist/server/better-auth-instance.d.ts.map +1 -1
  163. package/dist/server/better-auth-instance.js +99 -4
  164. package/dist/server/better-auth-instance.js.map +1 -1
  165. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  166. package/dist/server/core-routes-plugin.js +44 -0
  167. package/dist/server/core-routes-plugin.js.map +1 -1
  168. package/dist/server/create-server.d.ts.map +1 -1
  169. package/dist/server/create-server.js +6 -0
  170. package/dist/server/create-server.js.map +1 -1
  171. package/dist/server/date-utils.d.ts +15 -0
  172. package/dist/server/date-utils.d.ts.map +1 -0
  173. package/dist/server/date-utils.js +41 -0
  174. package/dist/server/date-utils.js.map +1 -0
  175. package/dist/server/index.d.ts +2 -1
  176. package/dist/server/index.d.ts.map +1 -1
  177. package/dist/server/index.js +2 -1
  178. package/dist/server/index.js.map +1 -1
  179. package/dist/server/onboarding-html.d.ts +3 -0
  180. package/dist/server/onboarding-html.d.ts.map +1 -1
  181. package/dist/server/onboarding-html.js +13 -3
  182. package/dist/server/onboarding-html.js.map +1 -1
  183. package/dist/server/request-context.d.ts +9 -0
  184. package/dist/server/request-context.d.ts.map +1 -1
  185. package/dist/server/request-context.js +10 -0
  186. package/dist/server/request-context.js.map +1 -1
  187. package/dist/server/transcribe-voice.d.ts +26 -0
  188. package/dist/server/transcribe-voice.d.ts.map +1 -0
  189. package/dist/server/transcribe-voice.js +143 -0
  190. package/dist/server/transcribe-voice.js.map +1 -0
  191. package/dist/styles/agent-native.css +111 -0
  192. package/dist/tailwind.preset.d.ts +2 -2
  193. package/dist/tailwind.preset.d.ts.map +1 -1
  194. package/dist/tailwind.preset.js +27 -7
  195. package/dist/tailwind.preset.js.map +1 -1
  196. package/dist/templates/default/app/global.css +65 -68
  197. package/dist/templates/default/components.json +1 -1
  198. package/dist/templates/default/package.json +2 -4
  199. package/dist/templates/default/vite.config.ts +3 -0
  200. package/dist/templates/workspace-core/package.json +1 -4
  201. package/dist/templates/workspace-core/src/index.ts +1 -1
  202. package/dist/templates/workspace-core/styles/tokens.css +22 -0
  203. package/dist/templates/workspace-core/tsconfig.json +1 -1
  204. package/dist/vite/client.d.ts +6 -0
  205. package/dist/vite/client.d.ts.map +1 -1
  206. package/dist/vite/client.js +18 -1
  207. package/dist/vite/client.js.map +1 -1
  208. package/docs/content/actions.md +169 -74
  209. package/docs/content/agent-teams.md +139 -0
  210. package/docs/content/cloneable-saas.md +98 -0
  211. package/docs/content/creating-templates.md +9 -11
  212. package/docs/content/deployment.md +2 -9
  213. package/docs/content/drop-in-agent.md +200 -0
  214. package/docs/content/enterprise-workspace.md +22 -10
  215. package/docs/content/getting-started.md +34 -19
  216. package/docs/content/integrations.md +3 -3
  217. package/docs/content/key-concepts.md +50 -23
  218. package/docs/content/mcp-clients.md +71 -0
  219. package/docs/content/pure-agent-apps.md +69 -0
  220. package/docs/content/recurring-jobs.md +123 -0
  221. package/docs/content/skills-guide.md +8 -0
  222. package/docs/content/template-analytics.md +190 -0
  223. package/docs/content/template-calendar.md +151 -0
  224. package/docs/content/template-clips.md +55 -0
  225. package/docs/content/template-content.md +141 -0
  226. package/docs/content/template-dispatch.md +58 -0
  227. package/docs/content/template-forms.md +51 -0
  228. package/docs/content/template-mail.md +169 -0
  229. package/docs/content/template-slides.md +218 -0
  230. package/docs/content/template-starter.md +68 -0
  231. package/docs/content/template-video.md +162 -0
  232. package/docs/content/voice-input.md +59 -0
  233. package/docs/content/what-is-agent-native.md +142 -45
  234. package/docs/content/workspace-management.md +1 -0
  235. package/docs/content/{resources.md → workspace.md} +94 -42
  236. package/package.json +9 -16
  237. package/src/templates/default/app/global.css +65 -68
  238. package/src/templates/default/components.json +1 -1
  239. package/src/templates/default/package.json +2 -4
  240. package/src/templates/default/vite.config.ts +3 -0
  241. package/src/templates/workspace-core/package.json +1 -4
  242. package/src/templates/workspace-core/src/index.ts +1 -1
  243. package/src/templates/workspace-core/styles/tokens.css +22 -0
  244. package/src/templates/workspace-core/tsconfig.json +1 -1
  245. package/dist/templates/default/postcss.config.js +0 -6
  246. package/dist/templates/default/tailwind.config.ts +0 -7
  247. package/dist/templates/workspace-core/tailwind.preset.ts +0 -34
  248. package/src/templates/default/postcss.config.js +0 -6
  249. package/src/templates/default/tailwind.config.ts +0 -7
  250. package/src/templates/workspace-core/tailwind.preset.ts +0 -34
@@ -0,0 +1,68 @@
1
+ ---
2
+ title: "Starter Template"
3
+ description: "The minimal agent-native scaffold — agent chat, actions, application state, polling, auth — wired up, with no domain code. Build from scratch."
4
+ ---
5
+
6
+ # Starter
7
+
8
+ Starter is the minimum viable agent-native app. You get the six-rules architecture, the agent sidebar, the workspace tab, polling sync, auth, and exactly one example action. Nothing else. Build from there.
9
+
10
+ Pick Starter when you're not sure which domain template fits, or when you want to learn the framework by doing — there's almost nothing to delete.
11
+
12
+ ## What's in it {#whats-in-it}
13
+
14
+ - **Agent sidebar** (`<AgentSidebar>`) wired into `app/root.tsx`. Chat, CLI, workspace tabs all present.
15
+ - **Agent chat plugin** pre-configured so the chat actually talks to Claude (once `ANTHROPIC_API_KEY` is set).
16
+ - **Auth** via Better Auth — login, signup, sessions, organizations. Local-mode fallback (`local@localhost`) for first-run dev.
17
+ - **Actions directory** with one example (`actions/hello-world.ts`) and the `view-screen` / `navigate` standard actions wired up.
18
+ - **Drizzle schema** with the framework's core tables (application_state, settings, oauth_tokens, sessions, resources).
19
+ - **Polling sync** (`useDbSync`) already wired so UI auto-refreshes when the agent writes to the database.
20
+ - **AGENTS.md** with the framework-wide rules the agent reads on every turn.
21
+ - **One route** at `/` that says hi and renders the sidebar toggle. That's it.
22
+
23
+ ## What's _not_ in it {#not-in-it}
24
+
25
+ - No domain tables (no emails, no events, no forms)
26
+ - No fancy UI — no dashboards, no lists, no charts
27
+ - No template-specific actions beyond the stubs
28
+ - No integrations (Slack, SendGrid, etc.)
29
+
30
+ That's the point. Ship whatever belongs to _your_ app, not someone else's.
31
+
32
+ ## When to pick it {#when-to-pick}
33
+
34
+ - **Building a pure-agent app** — the kind where the UI is mostly "let me see what the agent did." See [Pure-Agent Apps](/docs/pure-agent-apps).
35
+ - **Learning the framework** — this is the smallest surface to wrap your head around.
36
+ - **An internal tool** with a unique domain that doesn't match any of the other templates.
37
+ - **A prototype** — ship the agent now, add real UI later.
38
+
39
+ Pick a domain template ([Mail](/docs/template-mail), [Calendar](/docs/template-calendar), [Content](/docs/template-content), [Forms](/docs/template-forms), [Analytics](/docs/template-analytics), etc.) when there's an existing product shape that fits.
40
+
41
+ ## Scaffolding {#scaffolding}
42
+
43
+ ```bash
44
+ pnpm dlx @agent-native/core create my-app --template starter --standalone
45
+ ```
46
+
47
+ Or, in a workspace:
48
+
49
+ ```bash
50
+ pnpm dlx @agent-native/core create my-platform # pick "Starter" (pre-selected by default) plus any others
51
+ ```
52
+
53
+ ## First edits {#first-edits}
54
+
55
+ After scaffolding:
56
+
57
+ 1. Ask the agent: "Add a data model for `notes` — a note has an id, title, body, owner. Render a list of notes at `/notes` and let the user create one."
58
+ 2. The agent adds the Drizzle schema, the `create-note` and `list-notes` actions, and the new route. You watch it happen.
59
+ 3. `pnpm dev`, navigate to `/notes`, add a note through the UI. Ask the agent "draft a note summarizing yesterday's standup." Watch it use your new action.
60
+
61
+ That's the loop.
62
+
63
+ ## What's next
64
+
65
+ - [**Getting Started**](/docs) — the broader CLI + workspace flow
66
+ - [**Key Concepts**](/docs/key-concepts) — the six rules and what you get for free
67
+ - [**Actions**](/docs/actions) — the action system you'll add to
68
+ - [**Adding a Feature**](/docs/key-concepts#four-area-checklist) — the four-area checklist every new feature should update
@@ -0,0 +1,162 @@
1
+ ---
2
+ title: "Video Template"
3
+ description: "A Remotion-based animation studio where compositions are React components, animations are timeline tracks, and the agent edits alongside you."
4
+ ---
5
+
6
+ # Video Template
7
+
8
+ The Video template is a programmatic video studio built on [Remotion](https://remotion.dev). Compositions are React components, animations are tracks on a timeline, and renders output to MP4 or WebM. It replaces point-and-click editors like After Effects, Premiere, and Veed for the kind of motion graphics, product demos, and kinetic text videos that are a pain to keyframe by hand.
9
+
10
+ ## Overview {#overview}
11
+
12
+ Everything you see in the studio is code. A composition is a `CompositionEntry` in `app/remotion/registry.ts` that points at a React component in `app/remotion/compositions/`. Every animation in that component reads from an `AnimationTrack` so users can drag, resize, and retime it in the timeline UI. The agent can create new compositions, add tracks, tune easing, and write whole React components that plug into the registry.
13
+
14
+ The studio runs on Remotion's `<Player>` for preview and the Remotion CLI for final render. Output defaults to 1920x1080 at 30fps.
15
+
16
+ ## Quick start {#quick-start}
17
+
18
+ Create a workspace with the Video app scaffolded:
19
+
20
+ ```bash
21
+ npx @agent-native/core create my-video-app
22
+ ```
23
+
24
+ During the picker, select **Video**. Then:
25
+
26
+ ```bash
27
+ cd my-video-app
28
+ pnpm install
29
+ pnpm dev
30
+ ```
31
+
32
+ Open the studio in your browser and pick a composition from the home screen. Ask the agent something like "add a logo reveal that fades in at 2 seconds" and it will edit the registry and the composition for you.
33
+
34
+ Live demo: [videos.agent-native.com](https://videos.agent-native.com).
35
+
36
+ ## Key features {#key-features}
37
+
38
+ ### React-based compositions
39
+
40
+ Every video is a React component built on Remotion primitives (`AbsoluteFill`, `useCurrentFrame`, `useVideoConfig`). Twelve example compositions ship by default — kinetic text, logo reveals, particle bursts, interactive UI demos, slideshows. Add new ones by dropping a `.tsx` file in `app/remotion/compositions/` and registering it in `app/remotion/registry.ts`.
41
+
42
+ ### Timeline tracks
43
+
44
+ Animations are tracks, not hardcoded frame checks. A track has `startFrame`, `endFrame`, `easing`, and a list of `animatedProps` (`opacity`, `translateY`, `scale`, rotation, colors, etc.). Three track shapes:
45
+
46
+ - **Duration tracks** — bars you can drag and resize in the timeline.
47
+ - **Keyframe tracks** — diamond markers at specific frames for instant state changes (`startFrame === endFrame`).
48
+ - **Expression tracks** — programmatic animations (typing reveals, particle bursts) flagged with `programmatic: true` and shown with a purple `fx` badge.
49
+
50
+ Helper utilities in `app/remotion/trackAnimation.ts` (`findTrack`, `trackProgress`, `getPropValue`) wire a track's values into a component's render.
51
+
52
+ ### Easing curves
53
+
54
+ 30+ easing curves ship in `app/types.ts` — linear, power1-4 in/out/inOut, back, bounce, circ, elastic, expo, sine, and Remotion's `spring`. The Properties panel shows a visual preview of the curve shape for each one.
55
+
56
+ ### Camera controls
57
+
58
+ Each composition has a dedicated `camera` track with six animatable properties: `translateX`, `translateY`, `scale`, `rotateX`, `rotateY`, `perspective`. The camera toolbar above the player has pan, zoom, and tilt tools — click a tool, drag on the preview, and a keyframe is auto-created at the current frame. `CameraHost` (in `app/remotion/CameraHost.tsx`) applies the chained CSS 3D transform to everything inside.
59
+
60
+ ### Multi-keyframe editing
61
+
62
+ Every animated property supports an optional `keyframes` array. Interpolation is linear between keyframes, with hold-at-first and hold-at-last at the edges. In the timeline you can box-select keyframes, shift-click to add or remove, and drag groups while keeping relative timing.
63
+
64
+ ### Adjustable parameters
65
+
66
+ Programmatic animations expose internal magic numbers as user-editable `parameters` — character width, drift distance, particle count, stagger delay. Inputs appear in the Properties panel with min/max/step bounds and save to localStorage automatically.
67
+
68
+ ### Interactive cursor system
69
+
70
+ The `cursor` track drives a visible cursor that moves across the composition. Hover zones on interactive elements (buttons, tabs, inputs, cards) change the cursor appearance — arrow, pointer, or I-beam. See `app/remotion/hooks/useInteractiveComponent.ts` and `app/remotion/ui-components/InteractiveCard.tsx`.
71
+
72
+ ### View range and repeat playback
73
+
74
+ The timeline has a range navigator at the bottom (AE-style triangular handles). Drag to zoom and pan the visible time window. Playback in the player is constrained to that range, with a repeat toggle that loops inside it.
75
+
76
+ ### Render output
77
+
78
+ Composition size, fps, and render quality are per-composition in the Properties panel. Render quality is supersampling — 1x, 2x, or 3x internal resolution to keep text and vectors crisp during camera zoom. Final render happens via the Remotion CLI to MP4 or WebM.
79
+
80
+ ### Composition persistence
81
+
82
+ User edits (track values, parameter values, prop overrides, composition settings) persist to localStorage per composition. The **Save** button in the top-right of the composition view writes the current state back to `app/remotion/registry.ts` as TypeScript — so new users and sessions pick up the changes.
83
+
84
+ ## Working with the agent {#working-with-the-agent}
85
+
86
+ The agent always knows which composition you have open. Navigation state (`{ view, compositionId }`) is written to the framework's `application_state` table, and the `view-screen` action returns it plus a hint pointing at `app/remotion/registry.ts`. You don't have to tell the agent which composition you're on — ask it to act on "this one" and it will.
87
+
88
+ Example prompts:
89
+
90
+ - "Add a title card that fades in at 2 seconds and holds until 5."
91
+ - "Change the camera to zoom 2x on the logo between frames 60 and 90."
92
+ - "Make the typing reveal slower — 40% longer."
93
+ - "The particle burst is too dense. Drop the count to 12."
94
+ - "Create a new composition called intro-loop, 1080x1080, 6 seconds."
95
+ - "Add a click animation on the button zone and animate the cursor to it."
96
+ - "Give this track a spring easing instead of ease-out."
97
+
98
+ Under the hood the agent calls actions like `navigate`, `create-composition`, `generate-animated-component`, and edits `app/remotion/registry.ts` and `app/remotion/compositions/*.tsx` directly. Every change shows up in the timeline.
99
+
100
+ If you select a track in the UI and hit Cmd+I to focus the agent, it sees which track you've selected — "make this one snappier" just works.
101
+
102
+ ## Data model {#data-model}
103
+
104
+ Server-side schema is in `templates/videos/server/db/schema.ts`:
105
+
106
+ - `compositions` — id, title, type, `data` (full composition JSON blob), ownership columns, timestamps.
107
+ - `composition_shares` — standard share grants produced by `createSharesTable()`.
108
+
109
+ The registry in `app/remotion/registry.ts` is the in-code source of truth for what ships with the template. The SQL table stores user-created compositions and overrides. Studio state (per-composition track edits, prop overrides, composition settings) is mirrored to `localStorage` under `videos-tracks:<id>`, `videos-props:<id>`, and `videos-comp-settings:<id>`, and deep-merged back onto the registry defaults on load.
110
+
111
+ Core TypeScript shapes (`app/types.ts`):
112
+
113
+ - `AnimationTrack` — `id`, `label`, `startFrame`, `endFrame`, `easing`, `animatedProps[]`.
114
+ - `AnimatedProp` — `property`, `from`, `to`, `unit`, plus optional `keyframes`, `programmatic`, `description`, `codeSnippet`, `parameters`, `parameterValues`.
115
+ - `CompositionEntry` — `id`, `title`, `description`, `component`, `durationInFrames`, `fps`, `width`, `height`, `defaultProps`, `tracks`.
116
+
117
+ Compositions are private by default. Visibility can be `private`, `org`, or `public`, and share grants give `viewer`, `editor`, or `admin` roles — wired through the framework's sharing primitive.
118
+
119
+ ## Customizing it {#customizing-it}
120
+
121
+ The template folder is `templates/videos/` (the user-facing slug is `video`, but the folder is plural).
122
+
123
+ **Actions** — `templates/videos/actions/`
124
+
125
+ - `view-screen.ts` — returns current navigation state for the agent.
126
+ - `navigate.ts` — navigate to a composition (`--compositionId <id>`) or the home view (`--view home`).
127
+ - `create-composition.ts` — scaffold a new composition with the standard camera and cursor tracks.
128
+ - `generate-animated-component.ts` — generate a new animated component file with boilerplate.
129
+ - `validate-compositions.ts` — check all registered compositions for structural problems.
130
+ - `list-compositions.ts`, `get-composition.ts`, `update-composition.ts`, `delete-composition.ts`, `save-composition.ts` — CRUD over the SQL table.
131
+
132
+ **Routes** — `templates/videos/app/routes/`
133
+
134
+ - `_index.tsx` — studio home; renders the shell and composition list.
135
+ - `c.$compositionId.tsx` — composition editor (timeline, player, properties panel).
136
+ - `components.tsx` — component library browser.
137
+ - `team.tsx` — team management.
138
+
139
+ **Remotion internals** — `templates/videos/app/remotion/`
140
+
141
+ - `registry.ts` — the authoritative composition list.
142
+ - `compositions/` — one `.tsx` per composition, plus an `index.ts` barrel.
143
+ - `trackAnimation.ts` — `trackProgress`, `getPropValue`, `findTrack`, `getPropValueKeyframed`.
144
+ - `CameraHost.tsx` — wraps composition content with the camera transform.
145
+ - `hooks/`, `ui-components/`, `components/` — interactive element helpers, cursor rendering, animated element wrappers.
146
+
147
+ **Studio UI** — `templates/videos/app/components/`
148
+
149
+ - `Timeline.tsx` — the fully-controlled timeline (`viewStart` / `viewEnd` own no state internally).
150
+ - `VideoPlayer.tsx` — Remotion `<Player>` wrapper with range-constrained playback.
151
+ - `TrackPropertiesPanel.tsx`, `CompSettingsEditor.tsx`, `PropsEditor.tsx` — the right-side panels.
152
+ - `CameraToolbar.tsx`, `CameraControls.tsx` — camera tools and numeric controls.
153
+
154
+ **Agent instructions** — `templates/videos/AGENTS.md` is the long-form guide the agent reads. It covers the animation-as-track rule, camera system, cursor system, CSS filter units, interactive component registration, UI spacing, and checklists for creating or editing compositions.
155
+
156
+ **Skills** — `templates/videos/.agents/skills/`
157
+
158
+ - `composition-management/SKILL.md` — how to create and register compositions.
159
+ - `animation-tracks/SKILL.md` — how to edit tracks and animated props.
160
+ - Plus the standard framework skills: `actions`, `self-modifying-code`, `delegate-to-agent`, `storing-data`, `security`, `frontend-design`, `create-skill`, `capture-learnings`.
161
+
162
+ To add a new composition, follow the checklist in `AGENTS.md`: create the component, declare `FALLBACK_TRACKS`, use `findTrack` / `trackProgress` / `getPropValue` (never hardcode frames), export from `compositions/index.ts`, add a `CompositionEntry` to the registry, and run `pnpm typecheck`.
@@ -0,0 +1,59 @@
1
+ ---
2
+ title: "Voice Input"
3
+ description: "Voice dictation in the agent chat composer — OpenAI Whisper with a browser Web Speech fallback."
4
+ ---
5
+
6
+ # Voice Input
7
+
8
+ Every agent-native app has a microphone in the chat composer. Click it, talk, and your words get transcribed into the prompt. Useful on mobile, useful for long prompts, useful when your hands are on something else.
9
+
10
+ The framework handles all of this automatically — no setup on your end other than an OpenAI API key for best-quality transcription.
11
+
12
+ ## How it works {#how-it-works}
13
+
14
+ The composer's voice button records audio in the browser, then picks a provider:
15
+
16
+ 1. **OpenAI Whisper (preferred).** If an `OPENAI_API_KEY` is configured, the browser POSTs the audio to `/_agent-native/transcribe-voice`, which proxies to Whisper and returns the transcript. Hard 25 MB limit per clip (Whisper's).
17
+ 2. **Browser Web Speech API (fallback).** If no key is available, the composer falls back to the browser's built-in speech recognition. Works in Chromium-based browsers (Chrome, Edge, Arc) and Safari. Less accurate; streams live.
18
+
19
+ Provider choice is stored in application state under `settings.voiceTranscriptionProvider` (`"openai"` or `"browser"`) so the user can force one or the other in the sidebar settings.
20
+
21
+ The route is **same-origin only** — cross-site POSTs are rejected so an attacker can't burn your OpenAI credits from an external page.
22
+
23
+ ## Enabling Whisper {#enabling-whisper}
24
+
25
+ Two ways to provide an OpenAI key:
26
+
27
+ ### Per-user (recommended for SaaS)
28
+
29
+ The user sets their own key via the agent sidebar settings UI. It's stored as a user-scoped encrypted secret (via `readAppSecret`). Each user pays for their own transcription; zero cost to the host.
30
+
31
+ ### Shared (for internal tools)
32
+
33
+ Set `OPENAI_API_KEY` as an environment variable or in the `settings` table. Every user's transcription hits the shared key.
34
+
35
+ The route checks user-scope first, then falls back to the shared credential — so a power user with their own key can override the shared one.
36
+
37
+ If no key is configured at all, the route returns a 400 the composer recognizes, and silently falls back to Web Speech.
38
+
39
+ ## The route {#route}
40
+
41
+ `POST /_agent-native/transcribe-voice`
42
+
43
+ - **Body:** multipart form with a single `audio` part (webm/opus by default).
44
+ - **Response:** `{ text }` on success, `{ error }` on failure.
45
+ - **Auth:** requires an active session (Better Auth cookie).
46
+ - **Origin check:** same-origin only.
47
+ - **Max size:** 25 MB (Whisper's hard limit).
48
+
49
+ You don't need to call this directly — the composer does. But if you're building a custom input surface and want the same transcription, POST a `FormData` with an `audio` blob to the same route.
50
+
51
+ ## Customizing the provider {#customizing}
52
+
53
+ The provider field is a plain application-state key, so the agent can change it on request (`"use the browser speech recognizer instead"`). If you're building a template with different requirements — say, an on-prem Whisper deployment — swap the route handler by registering your own `transcribe-voice` route before the framework mounts the default.
54
+
55
+ ## What's next
56
+
57
+ - [**Drop-in Agent**](/docs/drop-in-agent) — the composer that exposes the voice button
58
+ - [**Onboarding**](/docs/onboarding) — registering the OpenAI key as a setup step
59
+ - [**Security & Data Scoping**](/docs/security) — how encrypted secrets are stored per user
@@ -1,61 +1,152 @@
1
1
  ---
2
2
  title: "What Is Agent-Native?"
3
- description: "What agent-native apps are, what agent-native development means, and why every AI agent needs a management interface."
3
+ description: "The ladder from a naked llm() call to a full agent-native app and why every agent needs a UI (and every app benefits from an agent)."
4
4
  ---
5
5
 
6
6
  # What Is Agent-Native?
7
7
 
8
- Agent-native is a way of building software where the AI agent and the UI are equal partners. Everything the agent can do, the UI can do. Everything the UI can do, the agent can do.
8
+ Agent-native is a way of building software where the AI agent and the UI are **equal partners**. Everything the agent can do, the UI can do. Everything the UI can do, the agent can do. They share the same database, the same state, and they stay in sync.
9
9
 
10
- ## What is an agent-native app? {#what-is-an-agent-native-app}
10
+ If you only remember one thing from this page, remember this: most AI apps today stop at the first rung of the ladder, and it's the biggest mistake in the space right now.
11
11
 
12
- Think of agent-native apps as a layer on top of AI agents. An agent has skills, instructions, and tools. It can be autonomous and general purpose. The application sits on top of that and gives it structure.
12
+ ## The ladder {#the-ladder}
13
13
 
14
- Importantly, agent-native does **not** mean "app that calls an LLM." That's the anti-pattern. A text box that sends a prompt and returns a response gives you no ability to give feedback, no way to understand what the agent is doing, and no way to customize its behavior with instructions and skills.
14
+ Here's the progression. Most teams stop at rung 1. Agent-native is rung 3.
15
15
 
16
- An agent-native app gives you everything good about traditional applications databases, dashboards, workflows, persistence, shareability — plus everything good about AI agents. The agent can do anything the UI can do, and the things it does persist to the UI so you can inspect them, visualize them, and share them.
16
+ ### Rung 1a single LLM call (the anti-pattern) {#rung-one}
17
17
 
18
- ## Not just a chatbot {#not-just-a-chatbot}
18
+ ```ts
19
+ const output = await llm(prompt);
20
+ ```
19
21
 
20
- A chat interface alone isn't enough. When you're building tools for people to actually use, you need more than a box for them to type a prompt into:
22
+ A text box sends a prompt, you get a string back, maybe you parse it, and you render it. There's no way for the user to course-correct, no way for the LLM to take action, no way to inspect what happened. Non-deterministic output → deterministic pipeline. It breaks the moment reality gets messy.
21
23
 
22
- - **Discoverability** users need to know what the app can do without guessing prompts
23
- - **Workflows** — structured flows for common tasks like composing emails, creating events, or building forms
24
- - **Visualization** — charts, calendars, email threads, and slide decks are better as visual interfaces than text
25
- - **Persistence** — a dashboard to come back to, data that doesn't disappear between sessions
26
- - **Shareability** — share a form link, a slide deck URL, or a report with your team
27
- - **Speed** — clicking a button is faster than typing a prompt for routine tasks
24
+ You see this everywhere: "AI features" bolted onto SaaS that are basically `fetch('/summarize')` with a spinner. That's not AI product; that's a toy.
28
25
 
29
- Agent-native apps give you all of this while keeping the full power of the AI agent. The agent is always there you can ask it to do anything. But the UI makes common workflows fast, visual, and accessible to everyone on the team.
26
+ ### Rung 2tools and a loop {#rung-two}
27
+
28
+ ```ts
29
+ const loop = query({ prompt, tools });
30
+ for await (const msg of loop) {
31
+ if (msg.type === "tool_use") {
32
+ // run the tool, feed the result back into the loop
33
+ }
34
+ if (msg.type === "result") {
35
+ output = msg.text;
36
+ }
37
+ }
38
+ ```
39
+
40
+ Now the LLM can _do things_. You give it tools (`draftEmail`, `searchEmails`, `queryData`) and run a loop: LLM requests a tool → your code runs it → result goes back → loop continues until the task is done. This is what Claude Code, Codex, and the Anthropic/OpenAI agent SDKs all do under the hood.
41
+
42
+ This is a real step up. But on its own it still assumes the agent is correct. When it's not, the user has no steering wheel.
43
+
44
+ So the next move is obvious: stream the agent's work into a chat UI where the user can watch, interrupt, give feedback, queue the next message. That's the state of the art today — and it's still not enough for a real product.
45
+
46
+ ### Rung 3 — `<Agent />` + actions + workspace {#rung-three}
47
+
48
+ ```tsx
49
+ // actions/reply-to-email.ts
50
+ import { defineAction } from "@agent-native/core";
51
+ import { z } from "zod";
52
+
53
+ export default defineAction({
54
+ description: "Reply to an email thread",
55
+ schema: z.object({
56
+ emailId: z.string(),
57
+ body: z.string(),
58
+ }),
59
+ run: async ({ emailId, body }) => {
60
+ await db.replies.insert({ emailId, body });
61
+ },
62
+ });
63
+ ```
64
+
65
+ ```tsx
66
+ // Anywhere in your React app
67
+ import { AgentSidebar } from "@agent-native/core/client";
68
+
69
+ <AgentSidebar />;
70
+ ```
71
+
72
+ ```tsx
73
+ // The same action, typesafe, from a button
74
+ const { mutate } = useActionMutation("replyToEmail");
75
+
76
+ <Button onClick={() => mutate({ emailId, body: "Thanks!" })}>
77
+ Send Reply
78
+ </Button>;
79
+ ```
80
+
81
+ One action. The agent calls it as a tool. The UI calls it as an HTTP endpoint. External agents call it over [A2A](/docs/a2a-protocol). Claude Desktop calls it as an [MCP server](/docs/mcp-protocol). Four surfaces, one implementation.
82
+
83
+ And you didn't just add buttons to a chatbot — you added an agent to an app. The user has a real UI with dashboards, lists, forms, and keyboard shortcuts. The agent has real tools, real memory, and real context. Both write to the same database; both see the same state.
84
+
85
+ That's rung 3. That's agent-native.
86
+
87
+ ## Why every agent needs a UI {#why-every-agent-needs-a-ui}
88
+
89
+ The hot take floating around right now is "apps are dead, agents will replace UIs, everyone will just text an agent in Telegram." That's wrong.
90
+
91
+ Every agent eventually needs a UI. Even if the agent does all the _work_, humans still need to:
92
+
93
+ - **See what it's doing** — progress, tool calls, intermediate output
94
+ - **Steer it** — give feedback, interrupt, queue the next task
95
+ - **Manage it** — edit its instructions, skills, memory, scheduled jobs, connected accounts
96
+ - **Inspect its work** — review drafts, audit trails, rollbacks
97
+ - **Share its output** — dashboards, reports, forms, links
98
+
99
+ At minimum, "a UI for the agent" is an observability + management interface. At maximum, it's a full SaaS app with an agent embedded in it. Both ends of that spectrum are agent-native — see [Pure-Agent Apps](/docs/pure-agent-apps) for the minimal end and [Cloneable SaaS](/docs/cloneable-saas) for the maximal end.
100
+
101
+ ## Why every app benefits from an agent {#why-every-app-benefits-from-an-agent}
102
+
103
+ The flip side is equally important. Existing SaaS products hit a wall: 80% of what you need, and 20% you can't change. Bolting a sidebar chat onto a SaaS app rarely works because the chat can't actually _do_ the things the UI can.
104
+
105
+ Agent-native flips that. Because every action in the app is defined once and exposed as both a UI handler and an agent tool, the agent can do everything the buttons can — and a lot more — without a separate "AI world" to maintain. Natural language becomes a first-class input alongside clicks.
106
+
107
+ The argument isn't "agents replace UI." It's "**agents belong inside applications, with a UI on top, as equal partners**." Neither can stand alone.
30
108
 
31
109
  ## Agent + UI parity {#agent-ui-parity}
32
110
 
33
- This is the defining principle. Any application functionality should be able to be done by the agent _or_ the UI:
111
+ This is the defining principle.
34
112
 
35
- > **From the UI** — Click buttons, fill forms, navigate views. The UI writes to the database and the agent can see the results.
113
+ > **From the UI** — click buttons, fill forms, navigate views. The UI writes to the database; the agent sees the results.
36
114
  >
37
- > **From the agent** — Natural language, other agents via A2A, Slack, Telegram. The agent writes to the database and the UI updates automatically.
115
+ > **From the agent** — natural language, other agents via A2A, Slack, Telegram. The agent writes to the database; the UI updates automatically.
38
116
 
39
- When the agent creates a draft email, it appears in the UI. When the user clicks "Send," the agent knows it was sent. There's no separate "agent world" and "UI world" — it's one system.
117
+ When the agent creates a draft email, it appears in the UI. When the user clicks "Send," the agent knows it was sent. There's no separate "agent world" and "UI world" — it's one system. See [Key Concepts](/docs/key-concepts) for the architecture that makes this work.
40
118
 
41
- ## What makes it different {#what-makes-it-different}
119
+ ## Customization that's usually reserved for Claude Code {#workspace-customization}
42
120
 
43
- Every agent ultimately needs a management interface. At the minimum, you need to understand what it's doing, inspect the data it's creating, and debug when things go wrong. That's just called an application.
121
+ The reason tools like Claude Code and Codex are so powerful isn't the model it's the **customization layer**: per-project instructions, skills, memory files, sub-agents, connected MCP servers. You can shape the agent to your codebase, your preferences, your team.
122
+
123
+ Agent-native ships the same customization layer as a first-class part of every app — the **workspace**. Each app includes:
124
+
125
+ - `AGENTS.md` — team-wide rules (shared)
126
+ - `learnings.md` — per-user memory the agent writes to automatically (personal)
127
+ - `skills/` — reusable how-to guides (`/slash` commands)
128
+ - `agents/` — custom sub-agent profiles (invoked with `@mentions`)
129
+ - `jobs/` — scheduled tasks that run on a cron
130
+ - MCP servers — local _or_ remote, per-user or per-org
131
+
132
+ The twist: it's **SQL-backed, not filesystem-backed.** There's no dev-box to spin up, no container per user, no files to sync. Every user gets their own full workspace — personal memory, personal MCP servers, personal skills — for essentially free, because it's all rows in a database. That makes this model viable for real SaaS: multi-tenant, deployable to any serverless or edge host, with Claude-Code-level flexibility per user.
133
+
134
+ See [Workspace](/docs/workspace) for the full concept.
135
+
136
+ ## What makes it different {#what-makes-it-different}
44
137
 
45
138
  | Approach | Description |
46
139
  | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
47
140
  | **Traditional apps with AI bolted on** | The AI is an afterthought. Limited to autocomplete, summaries, or a chat sidebar that can't actually do anything in the app. |
141
+ | **Pure chat / agent interfaces** | Powerful but inaccessible. No dashboards, no workflows, no persistence. Non-developers can't use them effectively. |
142
+ | **Claude Code / Codex for SaaS** | Great for devs on their own machines. Doesn't translate to multi-tenant SaaS — one codebase per user on a dev-box doesn't scale. |
48
143
  | **Agent-native apps** | The agent is a first-class citizen. It shares the same database, the same state, and can do everything the UI can do — and vice versa. |
49
- | **Pure chat/agent interfaces** | Powerful but inaccessible. No dashboards, no workflows, no persistence. Non-developers can't use them effectively. |
50
- | **Agent-native apps** | Full application UI with discoverability, workflows, and visualization — plus the agent for anything that needs AI. |
51
-
52
- The argument is simple: make your agents composable, think of them as applications. An analytics application, a slide generation application, a document application. Each one is a complete tool that humans and agents can both use.
53
144
 
54
145
  ## What is agent-native development? {#what-is-agent-native-development}
55
146
 
56
- Agent-native development means building with agents first. You build projects that work great when prompted from AI coding tools like Claude Code, Codex, Cursor, Windsurf, and Builder.io.
147
+ Agent-native development means building with agents first. Projects are structured so any AI coding tool Claude Code, Codex, Cursor, Windsurf, Builder.io — reads the same instructions and follows the same patterns.
57
148
 
58
- The idea is that you build instructions and skills into the project as prerequisites. The agent will tend to do _better_ than a human developer because you can encode rules like "when you add a feature, also add a skill for it" — things that humans will tend to forget or skip reading the docs for.
149
+ The payoff: the agent tends to do _better_ than a human developer because you can encode rules like "when you add a feature, also add a skill for it" — the kind of thing humans skip when they're tired or rushed.
59
150
 
60
151
  ## Agents as first-class developers {#agents-as-first-class-developers}
61
152
 
@@ -63,38 +154,44 @@ In an agent-native project:
63
154
 
64
155
  - **AGENTS.md** gives every AI coding tool the same instructions — Claude Code, Cursor, Windsurf, and others all read the same file
65
156
  - **Skills** teach the agent patterns for specific tasks — adding features, storing data, wiring real-time sync
66
- - **Agent PR reviewers** can validate that the four-area checklist was followed, that skills were updated, and that the code matches the project's conventions
67
- - **Auto-maintained docs and tests** — agents can be instructed to keep documentation up to date and tests passing, making it easier for humans to contribute
157
+ - **Agent PR reviewers** validate the four-area checklist, that skills were updated, and that code matches conventions
158
+ - **Auto-maintained docs and tests** — agents are instructed to keep docs current and tests passing
68
159
 
69
- This is similar to the shift from desktop-first to mobile-first development. Mobile-first didn't mean "no desktop" — it meant designing for mobile constraints first and then scaling up. Agent-native development means designing for agent workflows first and then making sure humans can work effectively too.
160
+ This is the shift from desktop-first to mobile-first applied to development. Mobile-first didn't mean "no desktop" — it meant designing for mobile constraints first. Agent-native development means designing for agent workflows first, then ensuring humans work effectively too.
70
161
 
71
162
  ## Whole-team development {#whole-team-development}
72
163
 
73
- Agent-native development isn't just for developers. The goal is actual agent-native development as a team:
164
+ Agent-native development isn't just for developers:
74
165
 
75
- - **Designers** can update designs directly in the code through the agent
76
- - **Product managers** can update functionalities and requirements
77
- - **QA** can test and prompt for fixes
78
- - **Anyone on the team** can contribute through natural language
166
+ - **Designers** update designs directly in the code through the agent
167
+ - **Product managers** update functionalities and requirements
168
+ - **QA** tests and prompts for fixes
169
+ - **Anyone on the team** contributes through natural language
79
170
 
80
- The vision is to reduce handoffs and enable one-person-to-full-team productivity using real collaboration between humans and agents.
171
+ The vision: reduce handoffs, enable one-person-to-full-team productivity.
81
172
 
82
173
  ## Fork and customize {#fork-and-customize}
83
174
 
84
- Agent-native apps follow a fork-and-customize model. You start from a template — mail, calendar, analytics, slides — and make it yours:
175
+ Agent-native apps follow a fork-and-customize model. You start from a **cloneable SaaS** template — Mail, Calendar, Analytics, Slides, Clips, Forms, Dispatch — and make it yours:
85
176
 
86
- 1. Pick a template on [agentnative.com](/templates)
87
- 2. Start using it immediately as a hosted app (e.g. mail.agentnative.com)
88
- 3. Fork it when you want to customize — "connect to our Stripe account", "add a cohort chart"
177
+ 1. Pick a template on [agent-native.com](/templates)
178
+ 2. Use it immediately as a hosted app (e.g. mail.agent-native.com)
179
+ 3. Fork it when you want to customize — "connect our Stripe account," "add a cohort chart"
89
180
  4. The agent modifies the code to match your needs
90
- 5. Deploy your fork to your own domain
181
+ 5. Deploy your fork to your own domain — or stay on agent-native.com
91
182
 
92
- Because it's your app not shared infrastructure the agent can safely evolve the code over time. Your app keeps improving as you use it.
183
+ Because it's _your_ app, not shared infrastructure, the agent can safely evolve the code. Your app keeps improving as you use it. See [Cloneable SaaS](/docs/cloneable-saas) for the full story.
93
184
 
94
185
  ## Composable agents {#composable-agents}
95
186
 
96
- Agent-native apps can communicate with each other using the [A2A protocol](/docs/a2a-protocol). From the mail app, you can tag the analytics agent to query data and include results in a draft. An agent discovers what other agents are available, calls them over the protocol, and shows results in the UI.
187
+ Agent-native apps talk to each other over the [A2A protocol](/docs/a2a-protocol). From the mail app, you can tag the analytics agent to query data and include the results in a draft email. Agents discover what other agents are available, call them over the protocol, and show results in the UI.
188
+
189
+ Every action you define is also a tool exposed over A2A _and_ as an MCP server, so external tools like Claude Desktop can drive your app directly. Same definition, four surfaces.
97
190
 
98
- This is why agent-native is a **framework and not a library**. The architecture — shared database, polling sync, actions, application state — needs to be built in from the ground up. You can migrate existing apps, but the best practice is to build agent-native from the start.
191
+ ## What's next
99
192
 
100
- See the [Key Concepts](/docs/key-concepts) doc for the full technical details.
193
+ - [**Key Concepts**](/docs/key-concepts) the architecture: SQL, actions, polling sync, context awareness, portability
194
+ - [**Cloneable SaaS**](/docs/cloneable-saas) — templates as complete products you own
195
+ - [**Workspace**](/docs/workspace) — the per-user customization layer (skills, memory, instructions, MCP)
196
+ - [**Drop-in Agent**](/docs/drop-in-agent) — mount `<AgentPanel>` into any React app
197
+ - [**Getting Started**](/docs) — scaffold your first app
@@ -222,3 +222,4 @@ For a new workspace, after running `agent-native create`:
222
222
  - [ ] Configure the approval policy and approver emails
223
223
  - [ ] Set up SendGrid (`SENDGRID_API_KEY`, `SENDGRID_FROM_EMAIL`) for admin notifications
224
224
  - [ ] Connect Slack or Telegram for workspace messaging
225
+ - [ ] Configure shared MCP servers — drop `mcp.config.json` at the workspace root, or enable Dispatch as the workspace [MCP hub](/docs/mcp-clients#hub) so every app inherits the same server list