insforge 1.3.0 → 1.4.8

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 (269) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/auth/package.json +5 -3
  3. package/auth/src/lib/broadcastService.ts +115 -117
  4. package/auth/src/lib/insforge.ts +8 -0
  5. package/auth/src/main.tsx +2 -4
  6. package/auth/src/pages/SignInPage.tsx +60 -60
  7. package/auth/src/pages/SignUpPage.tsx +60 -60
  8. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  9. package/auth/tsconfig.json +2 -1
  10. package/backend/package.json +10 -6
  11. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  12. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  13. package/backend/src/api/routes/auth/index.routes.ts +85 -32
  14. package/backend/src/api/routes/auth/oauth.routes.ts +11 -6
  15. package/backend/src/api/routes/database/index.routes.ts +2 -0
  16. package/backend/src/api/routes/database/records.routes.ts +39 -175
  17. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  18. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  19. package/backend/src/api/routes/docs/index.routes.ts +3 -2
  20. package/backend/src/api/routes/email/index.routes.ts +35 -35
  21. package/backend/src/api/routes/functions/index.routes.ts +3 -3
  22. package/backend/src/api/routes/metadata/index.routes.ts +26 -0
  23. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  24. package/backend/src/infra/database/database.manager.ts +0 -10
  25. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  26. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  27. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  28. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  29. package/backend/src/infra/security/token.manager.ts +1 -4
  30. package/backend/src/providers/ai/openrouter.provider.ts +12 -3
  31. package/backend/src/providers/database/base.provider.ts +39 -0
  32. package/backend/src/providers/database/cloud.provider.ts +159 -0
  33. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  34. package/backend/src/server.ts +19 -7
  35. package/backend/src/services/ai/ai-config.service.ts +6 -6
  36. package/backend/src/services/ai/ai-model.service.ts +60 -60
  37. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  38. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  39. package/backend/src/services/ai/helpers.ts +64 -64
  40. package/backend/src/services/ai/index.ts +13 -13
  41. package/backend/src/services/auth/auth-config.service.ts +4 -4
  42. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  43. package/backend/src/services/auth/auth.service.ts +134 -74
  44. package/backend/src/services/auth/index.ts +4 -4
  45. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  46. package/backend/src/services/database/database-advance.service.ts +19 -55
  47. package/backend/src/services/database/database-table.service.ts +38 -85
  48. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  49. package/backend/src/services/deployments/deployment.service.ts +693 -0
  50. package/backend/src/services/functions/function.service.ts +61 -41
  51. package/backend/src/services/logs/audit.service.ts +10 -10
  52. package/backend/src/services/secrets/secret.service.ts +101 -27
  53. package/backend/src/services/storage/storage.service.ts +30 -30
  54. package/backend/src/services/usage/usage.service.ts +6 -6
  55. package/backend/src/types/ai.ts +8 -0
  56. package/backend/src/types/auth.ts +5 -1
  57. package/backend/src/types/database.ts +2 -0
  58. package/backend/src/types/deployments.ts +33 -0
  59. package/backend/src/types/storage.ts +1 -1
  60. package/backend/src/types/webhooks.ts +45 -0
  61. package/backend/src/utils/cookies.ts +34 -35
  62. package/backend/src/utils/environment.ts +0 -14
  63. package/backend/src/utils/s3-config-loader.ts +64 -64
  64. package/backend/src/utils/seed.ts +334 -301
  65. package/backend/src/utils/sql-parser.ts +126 -0
  66. package/backend/src/utils/utils.ts +114 -114
  67. package/backend/src/utils/validations.ts +10 -10
  68. package/backend/tests/local/test-rpc.sh +141 -0
  69. package/backend/tests/local/test-secrets.sh +1 -1
  70. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  71. package/backend/tests/manual/test-rawsql-modes.sh +24 -24
  72. package/backend/tests/unit/database-advance.test.ts +326 -0
  73. package/backend/tests/unit/helpers.test.ts +2 -2
  74. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +13 -10
  75. package/docker-compose.prod.yml +1 -1
  76. package/docker-compose.yml +1 -1
  77. package/docs/agent-docs/deployment.md +79 -0
  78. package/docs/changelog.mdx +165 -72
  79. package/docs/core-concepts/ai/architecture.mdx +1 -23
  80. package/docs/core-concepts/ai/sdk.mdx +26 -1
  81. package/docs/core-concepts/authentication/architecture.mdx +6 -8
  82. package/docs/core-concepts/authentication/sdk.mdx +387 -91
  83. package/docs/core-concepts/authentication/ui-components/customization.mdx +460 -256
  84. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +50 -24
  85. package/docs/core-concepts/authentication/ui-components/react-router.mdx +18 -19
  86. package/docs/core-concepts/authentication/ui-components/react.mdx +26 -19
  87. package/docs/core-concepts/database/architecture.mdx +58 -21
  88. package/docs/core-concepts/database/pgvector.mdx +138 -0
  89. package/docs/core-concepts/database/sdk.mdx +17 -17
  90. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  91. package/docs/core-concepts/email/architecture.mdx +4 -2
  92. package/docs/core-concepts/functions/architecture.mdx +1 -1
  93. package/docs/core-concepts/functions/sdk.mdx +0 -1
  94. package/docs/core-concepts/realtime/architecture.mdx +1 -1
  95. package/docs/core-concepts/storage/architecture.mdx +1 -1
  96. package/docs/core-concepts/storage/sdk.mdx +25 -25
  97. package/docs/docs.json +14 -6
  98. package/docs/favicon.png +0 -0
  99. package/docs/favicon.svg +3 -18
  100. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  101. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  102. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  103. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  104. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  105. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  106. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  107. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  108. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  109. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  110. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  111. package/docs/images/mcp-setup/cline-1.png +0 -0
  112. package/docs/images/mcp-setup/cline-2.png +0 -0
  113. package/docs/images/mcp-setup/cline-3.png +0 -0
  114. package/docs/images/mcp-setup/connect-project.png +0 -0
  115. package/docs/images/mcp-setup/copilot-1.png +0 -0
  116. package/docs/images/mcp-setup/copilot-2.png +0 -0
  117. package/docs/images/mcp-setup/copilot-3.png +0 -0
  118. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  119. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  120. package/docs/images/mcp-setup/qoder-1.png +0 -0
  121. package/docs/images/mcp-setup/qoder-2.png +0 -0
  122. package/docs/images/mcp-setup/roocode-1.png +0 -0
  123. package/docs/images/mcp-setup/roocode-2.png +0 -0
  124. package/docs/images/mcp-setup/trae-1.png +0 -0
  125. package/docs/images/mcp-setup/trae-2.png +0 -0
  126. package/docs/images/mcp-setup/trae-3.png +0 -0
  127. package/docs/images/mcp-setup/trae-4.png +0 -0
  128. package/docs/images/mcp-setup/trae-5.png +0 -0
  129. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  130. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  131. package/docs/insforge-instructions-sdk.md +7 -3
  132. package/docs/introduction.mdx +9 -8
  133. package/docs/mcp-setup.mdx +332 -0
  134. package/docs/oauth-server.mdx +563 -0
  135. package/docs/partnership.mdx +79 -10
  136. package/docs/quickstart.mdx +1 -1
  137. package/docs/vscode-extension.mdx +74 -0
  138. package/eslint.config.js +1 -0
  139. package/examples/response-examples.md +1 -1
  140. package/frontend/package.json +1 -1
  141. package/frontend/src/App.tsx +8 -3
  142. package/frontend/src/assets/logos/antigravity.svg +1 -0
  143. package/frontend/src/assets/logos/copilot.svg +10 -0
  144. package/frontend/src/assets/logos/deepseek.svg +139 -0
  145. package/frontend/src/assets/logos/kiro.svg +9 -0
  146. package/frontend/src/assets/logos/qoder.svg +4 -0
  147. package/frontend/src/assets/logos/qwen.svg +15 -0
  148. package/frontend/src/components/CodeBlock.tsx +2 -2
  149. package/frontend/src/components/ConnectCTA.tsx +3 -2
  150. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  151. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  152. package/frontend/src/components/datagrid/index.ts +1 -1
  153. package/frontend/src/components/index.ts +0 -1
  154. package/frontend/src/components/layout/AppHeader.tsx +4 -27
  155. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  156. package/frontend/src/components/layout/Layout.tsx +34 -32
  157. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  158. package/frontend/src/components/radix/Select.tsx +151 -151
  159. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  160. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  161. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  162. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  163. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  164. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  165. package/frontend/src/features/ai/components/index.ts +6 -6
  166. package/frontend/src/features/ai/helpers.ts +147 -141
  167. package/frontend/src/features/ai/pages/AIPage.tsx +166 -166
  168. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  169. package/frontend/src/features/auth/components/UsersDataGrid.tsx +55 -31
  170. package/frontend/src/features/auth/components/index.ts +5 -5
  171. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -275
  172. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +1 -1
  173. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  174. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  175. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  176. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  177. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  178. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  179. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  180. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  181. package/frontend/src/features/database/constants.ts +16 -28
  182. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  183. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  184. package/frontend/src/features/database/hooks/useTables.ts +5 -7
  185. package/frontend/src/features/database/pages/FunctionsPage.tsx +0 -5
  186. package/frontend/src/features/database/pages/IndexesPage.tsx +0 -5
  187. package/frontend/src/features/database/pages/PoliciesPage.tsx +0 -5
  188. package/frontend/src/features/database/pages/SQLEditorPage.tsx +2 -2
  189. package/frontend/src/features/database/pages/TriggersPage.tsx +0 -5
  190. package/frontend/src/features/database/services/advance.service.ts +1 -15
  191. package/frontend/src/features/database/services/record.service.ts +4 -20
  192. package/frontend/src/features/database/services/table.service.ts +1 -4
  193. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  194. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  195. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  196. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  197. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  198. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  199. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  200. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  201. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  202. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  203. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  204. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  205. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  206. package/frontend/src/features/functions/components/index.ts +5 -5
  207. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  208. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  209. package/frontend/src/features/functions/pages/SecretsPage.tsx +118 -118
  210. package/frontend/src/features/functions/services/function.service.ts +8 -25
  211. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  212. package/frontend/src/features/login/pages/CloudLoginPage.tsx +125 -118
  213. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  214. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  215. package/frontend/src/features/logs/components/index.ts +1 -0
  216. package/frontend/src/features/logs/pages/LogsPage.tsx +36 -6
  217. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  218. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  219. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  220. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  221. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  222. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  223. package/frontend/src/features/onboard/components/index.ts +9 -4
  224. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  225. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  226. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  227. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  228. package/frontend/src/features/onboard/index.ts +17 -13
  229. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  230. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  231. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +21 -8
  232. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +10 -1
  233. package/frontend/src/index.css +249 -249
  234. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  235. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  236. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  237. package/frontend/src/lib/routing/AppRoutes.tsx +103 -99
  238. package/frontend/src/lib/services/metadata.service.ts +20 -3
  239. package/frontend/src/lib/utils/menuItems.ts +223 -207
  240. package/frontend/src/lib/utils/utils.ts +196 -196
  241. package/functions/server.ts +315 -315
  242. package/functions/worker-template.js +1 -1
  243. package/openapi/ai.yaml +115 -5
  244. package/openapi/auth.yaml +97 -17
  245. package/openapi/logs.yaml +0 -2
  246. package/openapi/metadata.yaml +0 -2
  247. package/openapi/records.yaml +21 -21
  248. package/openapi/tables.yaml +1 -2
  249. package/package.json +1 -1
  250. package/shared-schemas/package.json +1 -1
  251. package/shared-schemas/src/ai-api.schema.ts +251 -143
  252. package/shared-schemas/src/ai.schema.ts +63 -63
  253. package/shared-schemas/src/auth-api.schema.ts +34 -6
  254. package/shared-schemas/src/auth.schema.ts +17 -10
  255. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  256. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  257. package/shared-schemas/src/deployments.schema.ts +30 -0
  258. package/shared-schemas/src/docs.schema.ts +8 -2
  259. package/shared-schemas/src/email-api.schema.ts +30 -30
  260. package/shared-schemas/src/functions-api.schema.ts +13 -4
  261. package/shared-schemas/src/functions.schema.ts +1 -1
  262. package/shared-schemas/src/index.ts +22 -18
  263. package/shared-schemas/src/metadata.schema.ts +30 -4
  264. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  265. package/shared-schemas/src/secrets.schema.ts +15 -0
  266. package/zeabur/README.md +13 -0
  267. package/zeabur/template.yml +20 -51
  268. package/backend/src/types/profile.ts +0 -55
  269. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
@@ -1,23 +1,33 @@
1
1
  ---
2
2
  title: Next.js
3
- description: Zero-configuration authentication for Next.js with built-in UI components
3
+ description: Quick authentication setup for Next.js apps using hosted auth pages
4
4
  ---
5
5
 
6
- The `@insforge/nextjs` package provides **zero-configuration authentication** for Next.js applications. Authentication pages are hosted on your backend by default—no UI code needed.
6
+ The `@insforge/nextjs` package provides authentication for Next.js applications using **hosted auth pages**.
7
+
8
+ When users sign in, they're redirected to your InsForge backend's login page, then returned to your app after authentication—no UI code required.
9
+
10
+ <Tip>
11
+ Want to build custom login pages instead? See [Custom Auth
12
+ Pages](/core-concepts/authentication/ui-components/customization).
13
+ </Tip>
7
14
 
8
15
  ## Quick Start
9
16
 
10
- ### Step 1: Install Package and Set Environment Variables
17
+ ### Step 1: Create New Next.js Project (Required)
11
18
 
12
19
  ```bash
13
20
  npm install @insforge/nextjs@latest
14
21
  ```
15
22
 
23
+ ### Step 2: Set Environment Variables
24
+
16
25
  ```bash .env.local
17
26
  NEXT_PUBLIC_INSFORGE_BASE_URL=https://your-app.region.insforge.app
27
+ NEXT_PUBLIC_INSFORGE_ANON_KEY=your-anon-key-here
18
28
  ```
19
29
 
20
- ### Step 2: Add Middleware
30
+ ### Step 3: Add Middleware
21
31
 
22
32
  Create middleware to protect routes:
23
33
 
@@ -36,7 +46,7 @@ export const config = {
36
46
  };
37
47
  ```
38
48
 
39
- ### Step 3: Create API Route
49
+ ### Step 4: Create API Route
40
50
 
41
51
  Create an API route to enable server-side rendering (SSR) and cookie-based authentication:
42
52
 
@@ -54,19 +64,36 @@ export const DELETE = handlers.DELETE;
54
64
 
55
65
  <Info>**Why?** This route syncs auth tokens to HTTP-only cookies for server-side middleware.</Info>
56
66
 
57
- ### Step 4: Add InsforgeProvider
67
+ ### Step 5: Create InsforgeProvider Component
68
+
69
+ ```tsx
70
+ // app/providers.tsx
71
+ 'use client';
72
+ import { InsforgeBrowserProvider, type InitialAuthState } from '@insforge/nextjs';
73
+ import { insforge } from '@/lib/insforge';
74
+
75
+ export function InsforgeProvider({ children }: { children: React.ReactNode }) {
76
+ return (
77
+ <InsforgeBrowserProvider client={insforge} afterSignInUrl="/dashboard">
78
+ {children}
79
+ </InsforgeBrowserProvider>
80
+ );
81
+ }
82
+ ```
83
+
84
+ ### Step 6: Add InsforgeProvider to Root Layout
58
85
 
59
86
  Wrap your application with the `InsforgeProvider` in your root layout:
60
87
 
61
88
  ```tsx app/layout.tsx
62
89
  import {
63
- InsforgeProvider,
64
90
  SignedIn,
65
91
  SignedOut,
66
92
  SignInButton,
67
93
  SignUpButton,
68
94
  UserButton,
69
95
  } from '@insforge/nextjs';
96
+ import { InsforgeProvider } from './providers';
70
97
 
71
98
  export const metadata: Metadata = {
72
99
  title: 'InsForge Next.js Quickstart',
@@ -77,11 +104,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
77
104
  return (
78
105
  <html lang="en">
79
106
  <body>
80
- <InsforgeProvider
81
- baseUrl={
82
- process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app' // Replace with your InsForge backend URL
83
- }
84
- >
107
+ <InsforgeProvider>
85
108
  <nav>
86
109
  <SignedOut>
87
110
  <SignInButton />
@@ -152,8 +175,8 @@ function UserProfile() {
152
175
  <div>
153
176
  <p>Id: {user.id}</p>
154
177
  <p>Email: {user.email}</p>
155
- <p>Name: {user.name}</p>
156
- <img src={user.avatarUrl} alt="Avatar" />
178
+ <p>Name: {user.profile.name}</p>
179
+ <img src={user.profile.avatar_url} alt="Avatar" />
157
180
  </div>
158
181
  );
159
182
  }
@@ -161,7 +184,8 @@ function UserProfile() {
161
184
 
162
185
  **Returns:**
163
186
 
164
- - `user` - User object with id, email, name, avatarUrl
187
+ - `user` - User object with id, email, profile
188
+ - `user.profile` - User profile object with name, avatar_url, and other custom fields
165
189
  - `isLoaded` - Boolean loading state
166
190
 
167
191
  ### Server side functions
@@ -177,15 +201,15 @@ import { createClient } from '@insforge/sdk';
177
201
  export async function POST(request: NextRequest) {
178
202
  try {
179
203
  // Authenticate the request and get user info
180
- const { user, userId, token } = await auth();
204
+ const { token } = await auth();
181
205
 
182
206
  // Parse request body to get the prompt
183
207
  const { prompt } = await request.json();
184
208
 
185
- // Create InsForge SDK
209
+ // Create InsForge SDK client with user's token for authenticated access
186
210
  const insforge = createClient({
187
- baseUrl: process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || "https://your-app.region.insforge.app",
188
- anonKey: token
211
+ baseUrl: process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app',
212
+ edgeFunctionToken: token,
189
213
  });
190
214
 
191
215
  // Request for AI response
@@ -209,13 +233,15 @@ export async function POST(request: NextRequest) {
209
233
  },
210
234
  { status: 201 }
211
235
  );
212
-
213
236
  } catch (error) {
214
237
  console.error(error);
215
- return NextResponse.json(
216
- { error: 'Internal server error' },
217
- { status: 500 }
218
- );
238
+ return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
219
239
  }
220
240
  }
221
241
  ```
242
+
243
+ **Returns:**
244
+
245
+ - `user` - User object with id, email, profile
246
+ - `userId` - User ID
247
+ - `token` - User's access token
@@ -1,15 +1,21 @@
1
1
  ---
2
- title: React + React Router
3
- description: Framework-agnostic authentication components for React + React Router application
2
+ title: React Router
3
+ description: Quick authentication setup for React+Vite+React Router apps using hosted auth pages
4
4
  ---
5
5
 
6
- The `@insforge/react-router` package provides **complete authentication solution for React applications**. Use deployed auth pages (built-in auth) or custom UI components—works with Vite + React Router.
6
+ The `@insforge/react-router` package provides authentication for React+Vite+React Router applications using **hosted auth pages**.
7
+
8
+ When users sign in, they're redirected to your InsForge backend's login page, then returned to your app after authentication—no UI code required.
9
+
10
+ <Tip>
11
+ Want to build custom login pages instead? See [Custom Auth
12
+ Pages](/core-concepts/authentication/ui-components/customization).
13
+ </Tip>
7
14
 
8
15
  ## Quick Start
9
16
 
10
17
  ### Step 1: Create New React Project (Required)
11
18
 
12
-
13
19
  ```bash
14
20
  npm install react-router-dom @insforge/react-router@latest
15
21
  ```
@@ -30,14 +36,11 @@ import { StrictMode } from 'react';
30
36
  import { createRoot } from 'react-dom/client';
31
37
  import { InsforgeProvider } from '@insforge/react-router';
32
38
  import App from './App';
39
+ import { insforge } from './lib/insforge';
33
40
 
34
41
  createRoot(document.getElementById('root')!).render(
35
42
  <StrictMode>
36
- <InsforgeProvider
37
- baseUrl={
38
- import.meta.env.VITE_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app' // Replace with your InsForge backend URL
39
- }
40
- >
43
+ <InsforgeProvider client={insforge}>
41
44
  <App />
42
45
  </InsforgeProvider>
43
46
  </StrictMode>
@@ -137,14 +140,10 @@ import { useAuth } from '@insforge/react-router';
137
140
 
138
141
  function LoginButton() {
139
142
  const { isSignedIn, isLoaded } = useAuth();
140
-
143
+
141
144
  if (!isLoaded) return <div>Loading...</div>;
142
145
 
143
- return (
144
- <div>
145
- {isSignedIn ? 'Welcome!' : 'Sign In'}
146
- </div>
147
- );
146
+ return <div>{isSignedIn ? 'Welcome!' : 'Sign In'}</div>;
148
147
  }
149
148
  ```
150
149
 
@@ -166,13 +165,12 @@ function UserProfile() {
166
165
  if (!isLoaded) return <div>Loading...</div>;
167
166
  if (!user) return <div>Not signed in</div>;
168
167
 
169
-
170
168
  return (
171
169
  <div>
172
170
  <p>Id: {user.id}</p>
173
171
  <p>Email: {user.email}</p>
174
- <p>Name: {user.name}</p>
175
- <img src={user.avatarUrl} alt="Avatar" />
172
+ <p>Name: {user.profile.name}</p>
173
+ <img src={user.profile.avatar_url} alt="Avatar" />
176
174
  </div>
177
175
  );
178
176
  }
@@ -180,5 +178,6 @@ function UserProfile() {
180
178
 
181
179
  **Returns:**
182
180
 
183
- - `user` - User object with id, email, name, avatarUrl
181
+ - `user` - User object with id, email, profile
182
+ - `user.profile` - User profile object with name, avatar_url, and other custom fields
184
183
  - `isLoaded` - Boolean loading state
@@ -1,11 +1,18 @@
1
1
  ---
2
2
  title: React
3
- description: Framework-agnostic authentication components for any React application
3
+ description: Quick authentication setup for React+Vite apps using hosted auth pages
4
4
  ---
5
5
 
6
- The `@insforge/react` package provides **complete authentication solution for React applications**. Use deployed auth pages (built-in auth) or custom UI components—works with Vite.
6
+ The `@insforge/react` package provides authentication for React+Vite applications using **hosted auth pages**.
7
7
 
8
- ## Quick start
8
+ When users sign in, they're redirected to your InsForge backend's login page, then returned to your app after authentication—no UI code required.
9
+
10
+ <Tip>
11
+ Want to build custom login pages instead? See [Custom Auth
12
+ Pages](/core-concepts/authentication/ui-components/customization).
13
+ </Tip>
14
+
15
+ ## Quick Start
9
16
 
10
17
  ### Step 1: Create New React Project (Required)
11
18
 
@@ -28,15 +35,12 @@ Wrap your app with `InsforgeProvider` in the root:
28
35
  import { StrictMode } from 'react';
29
36
  import { createRoot } from 'react-dom/client';
30
37
  import { InsforgeProvider } from '@insforge/react';
38
+ import { insforge } from './lib/insforge';
31
39
  import App from './App';
32
40
 
33
41
  createRoot(document.getElementById('root')!).render(
34
42
  <StrictMode>
35
- <InsforgeProvider
36
- baseUrl={
37
- import.meta.env.VITE_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app' // Replace with your InsForge backend URL
38
- }
39
- >
43
+ <InsforgeProvider client={insforge}>
40
44
  <App />
41
45
  </InsforgeProvider>
42
46
  </StrictMode>
@@ -46,7 +50,14 @@ createRoot(document.getElementById('root')!).render(
46
50
  ### Step 4: Use Hooks & Components
47
51
 
48
52
  ```tsx src/pages/Home.tsx
49
- import { SignInButton, SignUpButton, SignedIn, SignedOut, UserButton, useUser } from '@insforge/react';
53
+ import {
54
+ SignInButton,
55
+ SignUpButton,
56
+ SignedIn,
57
+ SignedOut,
58
+ UserButton,
59
+ useUser,
60
+ } from '@insforge/react';
50
61
 
51
62
  export default function Home() {
52
63
  const { user } = useUser();
@@ -82,14 +93,10 @@ import { useAuth } from '@insforge/react';
82
93
 
83
94
  function LoginButton() {
84
95
  const { isSignedIn, isLoaded } = useAuth();
85
-
96
+
86
97
  if (!isLoaded) return <div>Loading...</div>;
87
98
 
88
- return (
89
- <div>
90
- {isSignedIn ? 'Welcome!' : 'Sign In'}
91
- </div>
92
- );
99
+ return <div>{isSignedIn ? 'Welcome!' : 'Sign In'}</div>;
93
100
  }
94
101
  ```
95
102
 
@@ -111,13 +118,12 @@ function UserProfile() {
111
118
  if (!isLoaded) return <div>Loading...</div>;
112
119
  if (!user) return <div>Not signed in</div>;
113
120
 
114
-
115
121
  return (
116
122
  <div>
117
123
  <p>Id: {user.id}</p>
118
124
  <p>Email: {user.email}</p>
119
- <p>Name: {user.name}</p>
120
- <img src={user.avatarUrl} alt="Avatar" />
125
+ <p>Name: {user.profile.name}</p>
126
+ <img src={user.profile.avatar_url} alt="Avatar" />
121
127
  </div>
122
128
  );
123
129
  }
@@ -125,5 +131,6 @@ function UserProfile() {
125
131
 
126
132
  **Returns:**
127
133
 
128
- - `user` - User object with id, email, name, avatarUrl
134
+ - `user` - User object with id, email, profile
135
+ - `user.profile` - User profile object with name, avatar_url, and other custom fields
129
136
  - `isLoaded` - Boolean loading state
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: Architecture
2
+ title: Database Architecture
3
3
  description: PostgreSQL database with automatic REST APIs via PostgREST
4
4
  ---
5
5
 
@@ -113,32 +113,69 @@ AND category = 'electronics'
113
113
  InsForge uses two PostgreSQL databases:
114
114
 
115
115
  ### Main Database (`insforge`)
116
- All application and system tables reside in the `public` schema:
116
+ Tables are organized into dedicated schemas for better organization and security:
117
117
 
118
- | Table Type | Purpose | Examples |
119
- |------------|---------|----------|
120
- | **User Tables** | Created by developers | Any table you create |
121
- | **System Tables** | Internal InsForge tables | Prefixed with `_` |
118
+ | Schema | Purpose | Access |
119
+ |--------|---------|--------|
120
+ | **public** | User-created tables | PostgREST (auto-generated APIs) |
121
+ | **auth** | Authentication & user data | Internal APIs only |
122
+ | **storage** | File storage metadata | Internal APIs only |
123
+ | **ai** | AI configuration & usage | Internal APIs only |
124
+ | **functions** | Edge function definitions | Internal APIs only |
125
+ | **realtime** | Real-time pub/sub channels | Internal APIs only |
126
+ | **system** | Core system data | Internal APIs only |
122
127
 
123
- ### Analytics Database (`_insforge`)
124
- Separate database for analytics with `_analytics` schema for Logflare integration.
128
+ ### Schema Details
125
129
 
126
- ### System Tables (in `public` schema)
130
+ #### `auth` Schema (Authentication)
127
131
 
128
132
  | Table | Purpose |
129
133
  |-------|---------|
130
- | `_accounts` | Core user authentication records |
131
- | `users` | User profile data (references _accounts) |
132
- | `_account_providers` | OAuth provider connections |
133
- | `_storage_buckets` | Storage bucket configuration |
134
- | `_storage` | File metadata and references |
135
- | `_ai_configs` | AI model configurations per project |
136
- | `_ai_usage` | AI token usage tracking |
137
- | `_config` | System configuration key-value store |
138
- | `_metadata` | Application metadata |
139
- | `_mcp_usage` | MCP tool usage tracking |
140
- | `_edge_functions` | Serverless function definitions |
141
- | `logs` | Activity and audit logs |
134
+ | `users` | Core user records with metadata |
135
+ | `user_providers` | OAuth provider connections |
136
+ | `configs` | Authentication settings |
137
+ | `oauth_configs` | OAuth provider configurations |
138
+ | `email_otps` | Email verification codes |
139
+
140
+ #### `storage` Schema (File Storage)
141
+
142
+ | Table | Purpose |
143
+ |-------|---------|
144
+ | `buckets` | Storage bucket configuration |
145
+ | `objects` | File metadata and references |
146
+
147
+ #### `ai` Schema (AI Integration)
148
+
149
+ | Table | Purpose |
150
+ |-------|---------|
151
+ | `configs` | AI model configurations per project |
152
+ | `usage` | AI token usage tracking |
153
+
154
+ #### `functions` Schema (Edge Functions)
155
+
156
+ | Table | Purpose |
157
+ |-------|---------|
158
+ | `definitions` | Serverless function definitions |
159
+
160
+ #### `realtime` Schema (Real-time Pub/Sub)
161
+
162
+ | Table | Purpose |
163
+ |-------|---------|
164
+ | `channels` | Channel metadata and subscription configuration for real-time Pub/Sub |
165
+ | `messages` | Real-time message queue |
166
+
167
+ #### `system` Schema (Core System)
168
+
169
+ | Table | Purpose |
170
+ |-------|---------|
171
+ | `secrets` | Encrypted system secrets |
172
+ | `audit_logs` | Activity and audit logs |
173
+ | `mcp_usage` | MCP tool usage tracking |
174
+ | `migrations` | Database migration history |
175
+
176
+ <Note>
177
+ Only tables in the `public` schema are exposed via PostgREST auto-generated APIs. System schemas are accessible only through internal InsForge APIs.
178
+ </Note>
142
179
 
143
180
  ## Query Syntax
144
181
 
@@ -0,0 +1,138 @@
1
+ ---
2
+ title: PGVector
3
+ description: Store embeddings and perform similarity search with pgvector
4
+ ---
5
+
6
+ ## Overview
7
+
8
+ InsForge supports **pgvector**, a PostgreSQL extension for vector similarity search. Use it to build semantic search, recommendations, RAG pipelines, or anything that needs "find similar items" functionality.
9
+
10
+ ## Enabling the Extension
11
+
12
+ Enable pgvector via SQL:
13
+
14
+ ```sql
15
+ create extension if not exists vector;
16
+ ```
17
+
18
+ <Note>
19
+ The extension is named `vector` in PostgreSQL, though the package is commonly called "pgvector".
20
+ </Note>
21
+
22
+ ## Creating Vector Columns
23
+
24
+ Create a table with a vector column. The dimension must match your embedding model:
25
+
26
+ ```sql
27
+ create table documents (
28
+ id bigserial primary key,
29
+ content text,
30
+ embedding vector(1536) -- matches OpenAI ada-002
31
+ );
32
+ ```
33
+
34
+ Common embedding dimensions:
35
+
36
+ | Model | Dimensions |
37
+ |-------|------------|
38
+ | OpenAI text-embedding-ada-002 | 1536 |
39
+ | OpenAI text-embedding-3-small | 1536 |
40
+ | OpenAI text-embedding-3-large | 3072 |
41
+ | Cohere embed-english-v3.0 | 1024 |
42
+ | all-MiniLM-L6-v2 | 384 |
43
+
44
+ ## Storing Embeddings
45
+
46
+ Generate embeddings using any provider (OpenAI, Cohere, Hugging Face, etc.), then store them in InsForge.
47
+
48
+ Example using OpenAI:
49
+
50
+ ```javascript
51
+ import OpenAI from 'openai';
52
+ import { insforge } from './lib/insforge';
53
+
54
+ const openai = new OpenAI();
55
+
56
+ async function storeDocument(content) {
57
+ const response = await openai.embeddings.create({
58
+ model: 'text-embedding-ada-002',
59
+ input: content
60
+ });
61
+
62
+ const { data, error } = await insforge.database
63
+ .from('documents')
64
+ .insert({
65
+ content,
66
+ embedding: response.data[0].embedding
67
+ })
68
+ .select();
69
+
70
+ return { data, error };
71
+ }
72
+ ```
73
+
74
+ ## Querying Vectors
75
+
76
+ Use distance operators to find similar vectors:
77
+
78
+ ```sql
79
+ select * from documents
80
+ order by embedding <-> '[0.1, 0.2, ...]' -- your query embedding
81
+ limit 5;
82
+ ```
83
+
84
+ ## Distance Operators
85
+
86
+ | Operator | Description |
87
+ |----------|-------------|
88
+ | `<->` | L2 distance |
89
+ | `<#>` | Inner product (negative) |
90
+ | `<=>` | Cosine distance |
91
+
92
+ <Tip>
93
+ For normalized embeddings (like OpenAI's), use cosine distance `<=>`. Similarity = `1 - distance`.
94
+ </Tip>
95
+
96
+ ## Indexing
97
+
98
+ Without an index, pgvector does exact nearest neighbor search - accurate but slow on large datasets. Add an index for faster approximate search.
99
+
100
+ ### HNSW (Recommended)
101
+
102
+ Faster queries, uses more memory:
103
+
104
+ ```sql
105
+ create index on documents
106
+ using hnsw (embedding vector_cosine_ops);
107
+ ```
108
+
109
+ ### IVFFlat
110
+
111
+ Lower memory, but create it after inserting data:
112
+
113
+ ```sql
114
+ create index on documents
115
+ using ivfflat (embedding vector_cosine_ops)
116
+ with (lists = 100);
117
+ ```
118
+
119
+ ### Operator Classes
120
+
121
+ Match your distance operator:
122
+
123
+ | Distance | Operator Class |
124
+ |----------|---------------|
125
+ | L2 | `vector_l2_ops` |
126
+ | Inner product | `vector_ip_ops` |
127
+ | Cosine | `vector_cosine_ops` |
128
+
129
+ <Warning>
130
+ Create indexes **after** inserting initial data. IVFFlat needs representative data to build effective clusters.
131
+ </Warning>
132
+
133
+ ## Best Practices
134
+
135
+ - **Match dimensions** - Vector dimensions must match your embedding model
136
+ - **Normalize embeddings** - Use cosine distance for scores between 0 and 1
137
+ - **Index at scale** - Add indexes when you have ~10k+ vectors
138
+ - **Batch inserts** - Generate and insert embeddings in batches
@@ -35,17 +35,17 @@ Chain `.select()` after `.insert()` to return the inserted data
35
35
  <CodeGroup>
36
36
  ```javascript Single insert
37
37
  const { data, error } = await insforge.database
38
- .from('users')
39
- .insert({ name: 'John', email: 'john@example.com' })
38
+ .from('posts')
39
+ .insert({ title: 'Hello World', content: 'My first post!' })
40
40
  .select()
41
41
  ```
42
42
 
43
43
  ```javascript Bulk insert
44
44
  const { data, error } = await insforge.database
45
- .from('users')
45
+ .from('posts')
46
46
  .insert([
47
- { name: 'Alice', email: 'alice@example.com' },
48
- { name: 'Bob', email: 'bob@example.com' }
47
+ { title: 'First Post', content: 'Hello everyone!' },
48
+ { title: 'Second Post', content: 'Another update.' }
49
49
  ])
50
50
  .select()
51
51
  ```
@@ -56,7 +56,7 @@ const { data, error } = await insforge.database
56
56
  ```json
57
57
  {
58
58
  "data": [
59
- { "id": "789", "name": "John", "email": "john@example.com", "created_at": "2024-01-15T10:30:00Z" }
59
+ { "id": "789", "title": "Hello World", "content": "My first post!", "created_at": "2024-01-15T10:30:00Z" }
60
60
  ],
61
61
  "error": null
62
62
  }
@@ -92,9 +92,9 @@ Always use filters like `.eq()` or `.in()` to specify which rows to update
92
92
  <CodeGroup>
93
93
  ```javascript Update by ID
94
94
  const { data, error } = await insforge.database
95
- .from('users')
96
- .update({ name: 'Jane Doe' })
97
- .eq('id', userId)
95
+ .from('posts')
96
+ .update({ title: 'Updated Title' })
97
+ .eq('id', postId)
98
98
  .select()
99
99
  ```
100
100
 
@@ -112,7 +112,7 @@ const { data, error } = await insforge.database
112
112
  ```json
113
113
  {
114
114
  "data": [
115
- { "id": "123", "name": "Jane Doe", "email": "john@example.com", "updated_at": "2024-01-15T11:00:00Z" }
115
+ { "id": "123", "title": "Updated Title", "content": "My first post!", "updated_at": "2024-01-15T11:00:00Z" }
116
116
  ],
117
117
  "error": null
118
118
  }
@@ -196,20 +196,20 @@ Query records from a table or view.
196
196
  <CodeGroup>
197
197
  ```javascript Get all
198
198
  const { data, error } = await insforge.database
199
- .from('users')
199
+ .from('posts')
200
200
  .select()
201
201
  ```
202
202
 
203
203
  ```javascript Specific columns
204
204
  const { data, error } = await insforge.database
205
- .from('users')
206
- .select('id, name, email')
205
+ .from('posts')
206
+ .select('id, title, content')
207
207
  ```
208
208
 
209
209
  ```javascript With relationships
210
210
  const { data, error } = await insforge.database
211
211
  .from('posts')
212
- .select('*, users(nickname, avatar_url)')
212
+ .select('*, comments(id, content)')
213
213
  ```
214
214
  </CodeGroup>
215
215
 
@@ -218,8 +218,8 @@ const { data, error } = await insforge.database
218
218
  ```json
219
219
  {
220
220
  "data": [
221
- { "id": "123", "name": "John", "email": "john@example.com" },
222
- { "id": "456", "name": "Jane", "email": "jane@example.com" }
221
+ { "id": "123", "title": "Hello World", "content": "My first post!" },
222
+ { "id": "456", "title": "Second Post", "content": "Another update." }
223
223
  ],
224
224
  "error": null
225
225
  }
@@ -365,7 +365,7 @@ function MyProfile() {
365
365
 
366
366
  return (
367
367
  <div>
368
- <h1>{user.name}</h1>
368
+ <h1>{user.profile?.name}</h1>
369
369
  <p>{user.email}</p>
370
370
  <h2>My Posts: {posts.length}</h2>
371
371
  {posts.map(post => (