Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,15 +113,15 @@ function createAppClientStack(queryClient: QueryClient, origin: string) {

![The current Blog backend and client registrations point to the real published Blog route they produce.](docs/assets/product-proof/code-to-result.webp)

Blog adds publishing routes, API operations, its data model, hooks, SSR-aware pages, editor UI, SEO metadata, RSS, and sitemap entries. Other plugins have different boundaries: one-sided and companion plugins are labeled instead of being forced into a full-stack claim.
Blog adds publishing routes, API operations, its data model, hooks, SSR-aware pages, editor UI, published-page metadata, and sitemap entries. Other plugins have different boundaries: one-sided and companion plugins are labeled instead of being forced into a full-stack claim.

## Released capabilities

Every capability below is installable from the released CLI. Follow its documentation for the actual payload, services, storage, auth, and adapter prerequisites.

| Capability | Topology | Outcome |
| --- | --- | --- |
| [Blog](https://www.better-stack.ai/docs/plugins/blog) | Full-stack | Publishing workflow, routes, API, data model, editor, SEO, and RSS |
| [Blog](https://www.better-stack.ai/docs/plugins/blog) | Full-stack | Publishing workflow, routes, API, data model, editor, metadata, and sitemap entries |
| [AI Chat](https://www.better-stack.ai/docs/plugins/ai-chat) | Full-stack | Streaming conversations, model integration, history, routes, and chat UI |
| [CMS](https://www.better-stack.ai/docs/plugins/cms) | Full-stack | Typed content models, APIs, generated forms, and editorial UI |
| [Form Builder](https://www.better-stack.ai/docs/plugins/form-builder) | Full-stack | Form authoring, validation, rendering, and submissions |
Expand Down
Binary file added docs/assets/product-proof/cms-proof.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/product-proof/comments-proof.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/product-proof/kanban-proof.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
57 changes: 56 additions & 1 deletion docs/assets/product-proof/manifest.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"version": 1,
"assetRevision": 3,
"assetRevision": 4,
"kitMaxBytes": 1800000,
"forbiddenText": [
"Better Stack",
Expand Down Expand Up @@ -124,6 +124,61 @@
"source": "../../../e2e/product-proof/capture.mjs",
"decorative": false
},
{
"file": "cms-proof.webp",
"format": "webp",
"width": 1600,
"height": 900,
"maxBytes": 260000,
"alt": "Two real BTST CMS states showing code-defined content types in the dashboard and stored Product records in the generated application.",
"caption": "CMS turns application-defined Zod content types into an operator dashboard and stored records; public rendering remains an application-owned workflow.",
"source": "../../../e2e/product-proof/capture.mjs",
"decorative": false
},
{
"file": "kanban-proof.webp",
"format": "webp",
"width": 1600,
"height": 900,
"maxBytes": 250000,
"alt": "Real BTST Kanban board with To Do, In Progress, and Done columns containing prioritized tasks.",
"caption": "The shipped Kanban workflow stores boards, columns, task order, priorities, and assignees in the adopter's database.",
"source": "../../../e2e/product-proof/capture.mjs",
"decorative": false
},
{
"file": "comments-proof.webp",
"format": "webp",
"width": 1600,
"height": 900,
"maxBytes": 240000,
"alt": "Real BTST Comments moderation page showing an approved discussion attached to the shipping-plugin-catalog Blog resource.",
"caption": "A resource-bound comment passes through the real Comments API and appears in the supplied moderation workflow.",
"source": "../../../e2e/product-proof/capture.mjs",
"decorative": false
},
{
"file": "media-proof.webp",
"format": "webp",
"width": 1600,
"height": 900,
"maxBytes": 240000,
"alt": "Real BTST Media library showing the checked-in product-proof image after upload, metadata registration, and search.",
"caption": "The proof fixture moves through the registered Media upload route into the searchable library, ready for picker and image-field reuse.",
"source": "../../../e2e/product-proof/capture.mjs",
"decorative": false
},
{
"file": "route-docs-proof.webp",
"format": "webp",
"width": 1600,
"height": 900,
"maxBytes": 250000,
"alt": "Real BTST Route Docs page generated from the client stack, with registered plugin routes, paths, and parameter context.",
"caption": "Route Docs derives its reference from the application's registered client plugins rather than a separate hand-maintained route inventory.",
"source": "../../../e2e/product-proof/capture.mjs",
"decorative": false
},
{
"file": "code-to-result.webp",
"format": "webp",
Expand Down
Binary file added docs/assets/product-proof/media-proof.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion docs/content/docs/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ runs.

| Capability | Topology | What it adds |
| --- | --- | --- |
| [Blog](/plugins/blog) | Full-stack | Publishing workflow, routes, API, data model, editor, SEO, and RSS |
| [Blog](/plugins/blog) | Full-stack | Publishing workflow, routes, API, data model, editor, metadata, and sitemap entries |
| [AI Chat](/plugins/ai-chat) | Full-stack | Streaming conversations, model integration, history, routes, and UI |
| [CMS](/plugins/cms) | Full-stack | Typed content models, APIs, generated forms, and editorial UI |
| [Form Builder](/plugins/form-builder) | Full-stack | Form authoring, validation, rendering, and submissions |
Expand Down
14 changes: 2 additions & 12 deletions docs/content/docs/plugins/ai-chat.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,9 @@ description: AI-powered chat functionality with conversation history, streaming,

import { Tabs, Tab } from "fumadocs-ui/components/tabs";
import { Callout } from "fumadocs-ui/components/callout";
import Image from "next/image";
import { PluginEvaluatorHeader } from "@/components/plugin-evaluator";

import aiChatProof from "../../../assets/product-proof/ai-chat-proof.webp";

<div className="my-4">
<a href={aiChatProof.src} target="_blank" rel="noopener noreferrer">
<Image src={aiChatProof} alt="Real authenticated BTST AI Chat shell with an empty conversation-history sidebar, attachment control, and a product-context prompt ready to send." className="rounded-lg border shadow-sm w-full h-auto hover:opacity-90 transition-opacity cursor-pointer" placeholder="blur" />
</a>
</div>

This capture proves the shipped chat shell and prompt boundary. It deliberately does not fabricate a model response.

[View interactive demo →](https://www.better-stack.ai/playground?plugins=ai-chat&view=preview)
<PluginEvaluatorHeader pluginKey="ai-chat" />

## Installation

Expand Down
3 changes: 3 additions & 0 deletions docs/content/docs/plugins/better-auth-ui.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ description: Add optional auth and account pages to an application that already

import { Callout } from "fumadocs-ui/components/callout";
import { Tabs, Tab } from "fumadocs-ui/components/tabs";
import { PluginEvaluatorHeader } from "@/components/plugin-evaluator";

<PluginEvaluatorHeader pluginKey="better-auth-ui" />

[`@btst/better-auth-ui`](https://github.com/better-stack-ai/better-auth-ui)
is the separately maintained Better Auth UI companion for BTST v3. It adds
Expand Down
27 changes: 2 additions & 25 deletions docs/content/docs/plugins/cms.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,9 @@ description: Headless CMS with code-defined content types, dynamic forms, and ag

import { Tabs, Tab } from "fumadocs-ui/components/tabs";
import { Callout } from "fumadocs-ui/components/callout";
import { PluginEvaluatorHeader } from "@/components/plugin-evaluator";

import Image from "next/image";

The CMS plugin provides a headless content management system where developers define content types as Zod schemas in code. This "agency workflow" approach means:

- **Developers** define the content model (schemas, validation rules, field descriptions)
- **Clients** manage content items through a friendly admin UI
- **TypeScript** provides end-to-end type safety when schema shapes change

import cmsDemo from "../../../assets/cms-demo.png";
import cmsDemo1 from "../../../assets/cms-demo-1.png";
import cmsDemo2 from "../../../assets/cms-demo-2.png";

<div className="grid grid-cols-1 lg:grid-cols-2 gap-2 my-2">
<a href={cmsDemo.src} target="_blank" rel="noopener noreferrer">
<Image src={cmsDemo} alt="CMS Plugin Demo" className="rounded-lg border shadow-sm w-full h-auto hover:opacity-90 transition-opacity cursor-pointer" placeholder="blur" />
</a>
<a href={cmsDemo1.src} target="_blank" rel="noopener noreferrer">
<Image src={cmsDemo1} alt="CMS Plugin Demo" className="rounded-lg border shadow-sm w-full h-auto hover:opacity-90 transition-opacity cursor-pointer" placeholder="blur" />
</a>
<a href={cmsDemo2.src} target="_blank" rel="noopener noreferrer">
<Image src={cmsDemo2} alt="CMS Plugin Demo" className="rounded-lg border shadow-sm w-full h-auto hover:opacity-90 transition-opacity cursor-pointer" placeholder="blur" />
</a>
</div>

[View interactive demo →](https://www.better-stack.ai/playground?plugins=cms&view=preview)
<PluginEvaluatorHeader pluginKey="cms" />

## Installation

Expand Down
12 changes: 2 additions & 10 deletions docs/content/docs/plugins/comments.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,9 @@ description: Threaded comments with moderation, likes, replies, and embeddable C

import { Tabs, Tab } from "fumadocs-ui/components/tabs";
import { Callout } from "fumadocs-ui/components/callout";
import { PluginEvaluatorHeader } from "@/components/plugin-evaluator";

The Comments plugin adds threaded commenting to any resource in your application — blog posts, Kanban tasks, CMS content, or your own custom pages. Comments are displayed with the embeddable `CommentThread` component and managed via a built-in moderation dashboard.

**Key Features:**
- **Threaded replies** — Top-level comments and nested replies
- **Like system** — One like per user, optimistic UI updates, denormalized counter
- **Edit support** — Authors can edit their own comments; an "edited" timestamp is shown
- **Moderation dashboard** — Tabbed view (Pending / Approved / Spam) with bulk actions
- **Server-side user resolution** — `resolveUser` hook to embed author name and avatar in API responses
- **Optimistic updates** — New comments appear instantly with a "Pending approval" badge when `autoApprove: false`
- **Scroll-into-view lazy loading** — `CommentThread` is mounted only when it scrolls into the viewport
<PluginEvaluatorHeader pluginKey="comments" />

## Installation

Expand Down
65 changes: 15 additions & 50 deletions docs/content/docs/plugins/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description: Available plugins and features for BTST
---

import { Card, Cards } from "fumadocs-ui/components/card";
import { Database, Hammer, Bot, Route, Layout, Columns3, MessageSquare, ImageIcon, ShieldCheck } from "lucide-react";
import { Hammer } from "lucide-react";
import { PluginCatalogCard } from "@/components/plugin-evaluator";


Expand All @@ -30,55 +30,20 @@ workflow-heavy feature, and an intentionally one-sided plugin.

## More released plugins

<div className="not-prose my-6 grid gap-5 lg:grid-cols-2 2xl:grid-cols-3">
<PluginCatalogCard pluginKey="ai-chat" />
<PluginCatalogCard pluginKey="cms" />
<PluginCatalogCard pluginKey="ui-builder" />
<PluginCatalogCard pluginKey="kanban" />
<PluginCatalogCard pluginKey="comments" />
<PluginCatalogCard pluginKey="media" />
<PluginCatalogCard pluginKey="route-docs" />
<PluginCatalogCard pluginKey="better-auth-ui" />
</div>

## Build a plugin

<Cards>
<Card
title="AI Chat Plugin"
href="/plugins/ai-chat"
icon={<Bot size={20} />}
description="AI-powered chat with conversation history, streaming, and customizable models."
/>
<Card
title="CMS Plugin"
href="/plugins/cms"
icon={<Database size={20} />}
description="Headless CMS with custom content types, Zod schemas, and auto-generated forms."
/>
<Card
title="UI Builder Plugin"
href="/plugins/ui-builder"
icon={<Layout size={20} />}
description="Visual drag-and-drop page builder with component registry and public rendering."
/>
<Card
title="Kanban Plugin"
href="/plugins/kanban"
icon={<Columns3 size={20} />}
description="Project management with boards, columns, tasks, drag-and-drop, and priority levels."
/>
<Card
title="Comments Plugin"
href="/plugins/comments"
icon={<MessageSquare size={20} />}
description="Threaded comments with moderation, likes, replies, and embeddable comment threads."
/>
<Card
title="Media Plugin"
href="/plugins/media"
icon={<ImageIcon size={20} />}
description="Media library with uploads, folders, picker UI, URL registration, and reusable image inputs."
/>
<Card
title="Route Docs Plugin"
href="/plugins/route-docs"
icon={<Route size={20} />}
description="Auto-generated client route documentation with interactive navigation."
/>
<Card
title="Better Auth UI Companion"
href="/plugins/better-auth-ui"
icon={<ShieldCheck size={20} />}
description="Optional auth and account routes for applications that already run Better Auth."
/>
<Card
title="Building Plugins"
href="/plugins/development"
Expand All @@ -102,7 +67,7 @@ Consumers that cannot wait for a package release can read the checked-in
during their build or content-validation step. Pin the raw URL to a commit when
reproducibility matters. The same artifact is published as
`@btst/codegen/plugin-decisions.json`; check `schemaVersion` before consuming its
three `plugins` records. Do not fetch it from the browser at runtime.
eleven released `plugins` records. Do not fetch it from the browser at runtime.

After changing `PLUGIN_DECISIONS`, regenerate and verify the artifact from the
repository root:
Expand Down
23 changes: 2 additions & 21 deletions docs/content/docs/plugins/kanban.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,9 @@ description: Project management with boards, columns, tasks, drag-and-drop, and

import { Tabs, Tab } from "fumadocs-ui/components/tabs";
import { Callout } from "fumadocs-ui/components/callout";
import Image from "next/image";
import { PluginEvaluatorHeader } from "@/components/plugin-evaluator";

import kanbanDemo from "../../../assets/kanban-demo.png";

<div className="grid grid-cols-1 gap-2 my-2">
<a href={kanbanDemo.src} target="_blank" rel="noopener noreferrer">
<Image src={kanbanDemo} alt="Kanban Plugin Demo - Board View" className="rounded-lg border shadow-sm w-full h-auto hover:opacity-90 transition-opacity cursor-pointer" placeholder="blur" />
</a>
</div>

## Overview

The Kanban plugin provides a full-featured project management system with:
- **Boards** - Organize different projects or workflows
- **Columns** - Define workflow stages (e.g., To Do, In Progress, Done)
- **Tasks** - Track individual work items with priorities
- **Assignees** - Assign users to tasks with avatar display
- **Drag-and-Drop** - Reorder tasks and columns with smooth animations
- **Priority Levels** - LOW, MEDIUM, HIGH, URGENT with visual badges
- **Organization Support** - Optional scoping by user or organization

[View interactive demo →](https://www.better-stack.ai/playground?plugins=kanban&view=preview)
<PluginEvaluatorHeader pluginKey="kanban" />

## Installation

Expand Down
17 changes: 2 additions & 15 deletions docs/content/docs/plugins/media.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,9 @@ description: Media library, uploads, folders, picker UI, and reusable image inpu

import { Tabs, Tab } from "fumadocs-ui/components/tabs";
import { Callout } from "fumadocs-ui/components/callout";
import Image from "next/image";
import { PluginEvaluatorHeader } from "@/components/plugin-evaluator";

import mediaDemo1 from "../../../assets/media-demo-1.png";

<div className="my-2">
<a href={mediaDemo1.src} target="_blank" rel="noopener noreferrer">
<Image
src={mediaDemo1}
alt="Media Plugin Demo - Media library picker"
className="rounded-lg border shadow-sm w-full h-auto hover:opacity-90 transition-opacity cursor-pointer"
placeholder="blur"
/>
</a>
</div>

The Media plugin gives you a built-in media library with folders, uploads, URL-based asset registration, and reusable picker components that can be embedded anywhere in your app. It works well as a standalone `/media` library route and as shared infrastructure for other plugins such as Blog, CMS, and Kanban.
<PluginEvaluatorHeader pluginKey="media" />

## Installation

Expand Down
21 changes: 2 additions & 19 deletions docs/content/docs/plugins/route-docs.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,9 @@ description: Auto-generated client route documentation with interactive navigati

import { Tabs, Tab } from "fumadocs-ui/components/tabs";
import { Callout } from "fumadocs-ui/components/callout";
import Image from "next/image";
import { PluginEvaluatorHeader } from "@/components/plugin-evaluator";

import routeDocsDemo from "../../../assets/route-docs-demo.png";

<div className="my-2">
<a href={routeDocsDemo.src} target="_blank" rel="noopener noreferrer">
<Image src={routeDocsDemo} alt="Route Docs Plugin Demo - Interactive route documentation" className="rounded-lg border shadow-sm w-full h-auto hover:opacity-90 transition-opacity cursor-pointer" placeholder="blur" />
</a>
</div>

The Route Docs plugin automatically generates documentation for all your client-side routes. It provides an interactive reference page that displays route paths, parameters, sitemap entries, and navigation tools.

## Features

- **Automatic Route Discovery** - Traverses all registered client plugins and extracts route metadata
- **Interactive Navigation** - Click any route to scroll to its details, or use the sidebar
- **Parameter Documentation** - Shows path and query parameters with types and descriptions
- **Sitemap Integration** - Displays sitemap entries for each route
- **Live Route Testing** - Fill in parameters and navigate directly to routes
- **Responsive Design** - Mobile-friendly with collapsible sidebar
<PluginEvaluatorHeader pluginKey="route-docs" />

## Installation

Expand Down
34 changes: 2 additions & 32 deletions docs/content/docs/plugins/ui-builder.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,9 @@ description: Visual drag-and-drop page builder with component registry, variable

import { Tabs, Tab } from "fumadocs-ui/components/tabs";
import { Callout } from "fumadocs-ui/components/callout";
import { BookOpen } from "lucide-react";
import Image from "next/image";
import { PluginEvaluatorHeader } from "@/components/plugin-evaluator";

import uiBuilderProof from "../../../assets/product-proof/ui-builder-proof.webp";

<div className="my-4">
<a href={uiBuilderProof.src} target="_blank" rel="noopener noreferrer">
<Image src={uiBuilderProof} alt="Real BTST UI Builder editing a release-evidence page with layers, canvas, status, and component properties." className="rounded-lg border shadow-sm w-full h-auto hover:opacity-90 transition-opacity cursor-pointer" placeholder="blur" />
</a>
</div>

The UI Builder plugin provides a visual drag-and-drop page creation interface where administrators can create pages using pre-defined components. Pages are stored as JSON layers in the CMS and can be rendered on public routes.

<div className="flex gap-4 my-4">
<a href="https://www.uibuilder.app/" target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors">
<BookOpen className="w-5 h-5" />
Full Documentation
</a>
</div>

<Callout type="info">
For comprehensive documentation including interactive demos, block templates, and advanced customization options, visit [uibuilder.app](https://www.uibuilder.app/).
</Callout>

**Key Features:**
- **Visual Page Builder** - Drag-and-drop interface for creating pages with components
- **Component Registry** - Pre-built shadcn/ui components + custom component support
- **Variables** - Define page variables for dynamic content
- **CMS Integration** - Leverages the CMS plugin for data persistence
- **Public Page Rendering** - Render pages by slug with the `PageRenderer` component
- **Shared Authorization** - One CMS rule set gates browser UI and backend operations

[View interactive demo →](https://www.better-stack.ai/playground?plugins=ui-builder&view=preview)
<PluginEvaluatorHeader pluginKey="ui-builder" />

## Installation

Expand Down
Loading
Loading