Everything your AI product needs. Except the AI.
A Next.js framework for AI SaaS: sign-up, teams, plans, credits, usage and an admin console — a complete SaaS around your agent. The pages land in your repo as your code. The engine under them is npm packages you upgrade. Open source, nothing rented.
Built on Next.js 16 · PostgreSQL · Drizzle · Better-Auth · Stripe · Vercel AI SDK
watch it buildFrom a working agent to a running product.
One minute.
Everything on screen is the registry's own pages and the real execution boundary, not a mock-up. Jump to the act you care about.
read it instead
- 0:00 — Your agent works. It isn't a product yet.
- 0:07 — Intelligo ships that half. One command.
- 0:13 — Every page lands as your own source.
- 0:25 — A running product. Day one.
- 0:30 — Your agent runs unmodified.
- 0:42 — Every run, accounted for.
- 0:48 — Make it yours — config, not forks.
- 0:54 — You build the agent. Intelligo is everything around it.
A whole product,
on the first run.
Sign-in, workspaces, billing, usage and a streaming chat are already pages in your app. Each tab is one of the 28 registry blocks itself, running on fixture data — the source the shadcn CLI installs, not a screenshot.
Every AI product is two halves.
You should only write one.
The interesting half is your agent. The other half — who is signed in, what their plan allows, what a run cost, who to bill, what to tell an auditor — is the same in every AI SaaS, and it is where the time goes.
- Promptsthe voice, the guardrails, the domain
- Toolswhat the agent can actually do
- Domain datathe knowledge nobody else has
- Evalshow you know it's getting better
- authsign-in, verification and reset; workspaces, roles, invitations, ownership transfer
- billingplans as data, gates and quotas; credits with reservations; trials; Stripe behind an idempotent ledger
- executionsevery run admitted, settled and recorded, against a model registry with per-token pricing
- coreconversations, versioned documents, notifications; data export and per-fact deletion
- auditappend-only audit events
- jobsa Postgres job queue, no Redis
- adminan operator's console with audited impersonation
Pages you own, parts you compose,
packages you upgrade.
- 28BlocksPages, shells and drop-in surfaces installed with the shadcn CLI as your own source — used as-is, varied through config and message files.auth 6shell 6settings 5commerce 6ai 5see every block, live →
- 40Components26 AI parts — messages, reasoning, tool calls, approvals, citations, artifacts — and 14 patterns and motion pieces, on base-nova and one token contract.suggestionprompt-inputbranchspeech-inputcomposer-menumessage-bubbleopen the design system →
- 11PackagesVersioned on npm as @intelligo-dev/*. Services behind ports, one database, rules enforced as failing tests.authbillingchatnextexecutionscoreauditjobsadminclimastrasee how they fit →
Two lines of route.
The rest is your agent.
- Auth, limits, gates, persistence, billinghappen inside createChatHandler — every turn admitted, streamed and settled exactly once.
- Prompts, tools and modelsstay in your framework's own idiom, in a config file the install hands you.
- Outside chatbracket any run with begin → complete or fail. No wrapper, no agent abstraction to adopt.
// app/api/chat/route.ts — installed by the chat block
import { createChatHandler } from "@intelligo-dev/chat";
import { chatServerConfig } from "@/lib/chat-server-config";
export const { POST, DELETE } = createChatHandler(chatServerConfig);// lib/chat-server-config.ts — yours to edit
agent: {
systemPrompt: "You answer from the workspace's documents.",
tools: ({ workspaceId }) => ({
searchDocs: tool({
description: "Search the workspace's documents",
inputSchema: z.object({ query: z.string() }),
execute: ({ query }) => search(workspaceId, query),
}),
}),
},// anywhere else: Mastra, the AI SDK, your own loop
const run = await executions.begin({ workspaceId, userId, capability: "support.reply" });
if (!run.allowed) return refuse(run.reason);
try {
const result = await supportAgent.generate(messages); // native
await run.complete({ usage: result.usage, model: result.model });
} catch (error) {
await run.fail({ error });
}Three commands.
Running before you touch a model key.
Node 22.14 or newer, pnpm 9 and PostgreSQL with pgvector. The chat page streams against a built-in stub model, so the whole app runs before you configure a provider.
Spend your time on the half that is yours.
Everything else is already here — versioned on npm, installed as source you own, Apache-2.0.
Environment, AI providers, deployment and every other block are in the docs.