The ultimate AI‑powered bot platform for automation – design, integrate and manage bots without writing code.
Demo • Documentation • Issues • Pull Requests
Nova Bot Studio is a modern SaaS‑style dashboard built with Next.js 16 and TailwindCSS that lets you:
- Create AI chat‑bots in minutes using a drag‑and‑drop visual flow editor.
- Connect to popular messaging platforms – Telegram, Discord, Instagram, WhatsApp – or a custom webhook.
- Manage bots, view real‑time statistics and control access from a unified admin panel.
Target audience – product managers, marketers, community managers, and developers who need a fast way to launch conversational agents without maintaining infrastructure.
Current version: v0.2.5 (development)
| Category | Feature | Status |
|---|---|---|
| Bot Builder | Visual flow editor with pre‑built templates | ✅ Stable |
| AI response generation (OpenAI / Claude integration) | ✅ Stable | |
| Integrations | Telegram, Discord, Instagram, WhatsApp | ✅ Stable |
| Custom webhook (any HTTP endpoint) | ✅ Stable | |
| Dashboard | Real‑time bot statistics (messages, uptime, active bots) | ✅ Stable |
| Multi‑tenant user management (role‑based) | ✅ Stable | |
| Theming | Dark / Light mode powered by next-themes |
✅ Stable |
| Notifications | Toast notifications via sonner |
✅ Stable |
| Animations | UI transitions with radix-ui and tw-animate-css |
✅ Stable |
| 3D Preview | Interactive 3‑D bot avatar using three |
🟡 Beta |
| Export / Import | JSON export/import of bot configurations | ✅ Stable |
| API | REST endpoints for auth, bot CRUD, analytics (backend) | ✅ Stable |
| Bot Config Editor – FreeStyle | Full‑screen HTML/CSS/JS customization | ✅ Stable |
| Bot Config Editor – Controlled Style | Node‑based FSM editor with API‑driven options | ✅ Stable |
| Improved Loading Experience | Graceful loading spinners & error handling for Controlled‑Style editor | ✅ Stable |
| Deployment | One‑click Vercel deployment & Docker support | ✅ Stable |
| Analytics | Built‑in usage analytics visualised in the dashboard | ✅ Stable |
| Internationalisation | UI strings translated via next-i18next |
✅ Stable |
| API Keys Management | Centralised UI for managing platform‑specific API keys (React Suspense lazy loading) | ✅ Stable |
| Playground | Private sandbox page for rapid UI prototyping and testing new components | ✅ Stable |
| Security | Session‑based auth, CSRF protection, rate‑limited endpoints | ✅ Stable |
| Layer | Technology | Reason |
|---|---|---|
| Framework | Next.js 16 (React 19) | File‑system routing, hybrid SSR/CSR |
| Language | TypeScript | End‑to‑end type safety |
| Styling | TailwindCSS 4, tw-animate-css |
Utility‑first, rapid UI prototyping |
| State Management | Zustand | Minimalist global store (useAuthStore, useBotStore) |
| UI Components | Radix UI, lucide-react, react-icons |
Accessible primitives & icons |
| Theming | next-themes |
Dark / Light mode |
| Animations | sonner, tw-animate-css |
Toasts & CSS‑based animations |
| 3D | three |
Optional 3‑D bot preview |
| Utilities | clsx, class-variance-authority, dotenv |
Class handling & env loading |
resend |
Transactional email (password reset, invites) | |
| Analytics | posthog, custom analytics/ helpers |
User‑behaviour tracking |
| Testing / Linting | eslint, eslint-config-next, prettier |
Code quality enforcement |
| Build & Deploy | next build, Vercel, Docker |
Optimized production bundles & containerisation |
src/
├─ app/
│ ├─ (private) ← Auth‑protected UI (dashboard)
│ │ ├─ layout.tsx ← Global layout with Sidebar & TopBar
│ │ ├─ Sidebar.tsx ← Collapsible navigation
│ │ ├─ TopBar.tsx ← User menu, theme switch, notifications
│ │ ├─ home/
│ │ │ ├─ page.tsx ← Dashboard home
│ │ │ ├─ Playground/
│ │ │ │ └─ page.tsx ← Sandbox for rapid UI experiments
│ │ │ ├─ API_Keys/
│ │ │ │ └─ page.tsx ← API keys management (Suspense‑based)
│ │ │ ├─ CreateBots/
│ │ │ │ └─ Website/
│ │ │ │ └─ ControlledStyle/
│ │ │ │ └─ [id]/page.tsx ← “Create Bot – Controlled Style”
│ │ │ ├─ Edit‑Bot‑Config/
│ │ │ │ └─ Website/
│ │ │ │ ├─ FreeStyle/
│ │ │ │ │ └─ (id)/page.tsx ← “Edit Bot Config – Website FreeStyle”
│ │ │ │ └─ Controlled_Style/
│ │ │ │ └─ (id)/page.tsx ← “Edit Bot Config – Controlled Style”
│ │ └─ … ← Other private sections (manage, stats)
│ ├─ (public) ← Public‑facing pages (landing, FAQ, pricing)
│ │ └─ Footer.tsx
│ └─ page.tsx ← Root page (redirects based on auth)
├─ components/
│ ├─ ui/ ← Re‑usable UI primitives (Button, Card, Spinner, …)
│ └─ FAQItemClient.tsx ← Client‑side FAQ accordion component
├─ lib/
│ ├─ Store/ ← Zustand stores (auth, bot data)
│ ├─ Types/ ← TypeScript interfaces
│ ├─ analytics/ ← Analytics helpers (PostHog wrapper, event utils)
│ ├─ posthog.ts
│ └─ utils.ts ← API wrappers, formatters, misc helpers
└─ proxy.ts ← Optional API‑proxy for server‑side requests
- Routing – Next.js file‑system routing separates public and private routes using the
(public)and(private)folders. - Auth –
useAuthStoreholdsisLoggedIn,userId,username,emailand provides helpers likerefreshUserandlogout. - Environment –
NEXT_PUBLIC_API_BASE_URLpoints to the backend API (e.g.,https://api.nova-bot.studio).
| Tool | Minimum version |
|---|---|
| Node.js | 20.x |
| npm | 10.x (or pnpm / yarn) |
| Git | any recent version |
| Docker (optional) | 24.x for containerised dev |
| Vercel CLI (optional) | 32.x for local preview |
A running backend API that implements authentication, bot CRUD and analytics is required. Supply its URL via NEXT_PUBLIC_API_BASE_URL.
# 1️⃣ Clone the repository
git clone https://github.com/GURUDAS-DEV/NOVA-BOT-STUDIO.git
cd NOVA-BOT-STUDIO
# 2️⃣ Install dependencies
npm ci # or `pnpm install` / `yarn install`
# 3️⃣ Copy the example environment file
cp .env.example .env.local
# 4️⃣ Edit .env.local (see below) and start the dev server
npm run devCreate (or edit) .env.local at the project root:
# Public – injected into the client bundle
NEXT_PUBLIC_API_BASE_URL=https://api.yourdomain.com
# Private – used only by server‑side code (if any)
RESEND_API_KEY=your_resend_api_key
POSTHOG_API_KEY=your_posthog_key # optional analyticsNote: Variables prefixed with
NEXT_PUBLIC_are exposed to the browser. All other variables remain server‑only.
npm run devOpen http://localhost:3000. You should see the public landing page. After logging in, you’ll be redirected to the dashboard.
To test the new Controlled‑Style editor: navigate to /home/Edit-Bot-Config/Website/Controlled_Style/<bot-id> (replace <bot-id> with an existing bot ID). The page now shows a loading spinner while the bot configuration is fetched and displays friendly error toasts if the request fails.
| Command | Description |
|---|---|
npm run dev |
Starts the Next.js dev server (http://localhost:3000) with hot‑reloading. |
npm run build |
Generates an optimized production build in .next. |
npm start |
Serves the production build locally (NODE_ENV=production). |
npm run lint |
Lints the codebase using ESLint (Next.js preset). |
npm run test |
Placeholder – add Jest/Playwright tests here. |
npm run format |
Runs Prettier to format all files. |
import { useEffect, useState } from "react";
import { useParams } from "next/navigation";
import { Button } from "@/components/ui/button";
import { toast, Toaster } from "sonner";
import { Spinner } from "@/components/ui/spinner";
export default function ControlledBotEditor() {
const { id: botId } = useParams() as { id: string };
const [bot, setBot] = useState<any>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/bots/${botId}`, {
credentials: "include",
})
.then((r) => {
if (!r.ok) throw new Error("Network response was not ok");
return r.json();
})
.then((data) => setBot(data))
.catch(() => toast.error("Failed to load bot configuration"))
.finally(() => setLoading(false));
}, [botId]);
const handleSave = async () => {
const res = await fetch(
`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/bots/${botId}`,
{
method: "PATCH",
credentials: "include",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(bot),
}
);
if (res.ok) toast.success("Bot configuration saved");
else toast.error("Save failed");
};
if (loading) {
return (
<div className="flex items-center justify-center h-screen">
<Spinner className="w-12 h-12" />
</div>
);
}
return (
<div className="p-8">
<h1 className="text-2xl font-bold mb-4">
Edit Controlled‑Style Bot: {bot?.name}
</h1>
{/* Render your node editor here – omitted for brevity */}
{/* <ControlledNodeEditor bot={bot} onChange={setBot} /> */}
<Button className="mt-6" onClick={handleSave}>
Save Changes
</Button>
<Toaster position="bottom-right" />
</div>
);
}The Playground page lets you experiment with a bot’s behaviour without creating a full bot configuration. A recent change renamed the request payload key from prompt to messages. The API now expects an array of message objects that follow the OpenAI‑compatible schema.
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { toast } from "sonner";
export default function Playground() {
const [input, setInput] = useState("");
const [response, setResponse] = useState("");
const callPlayground = async () => {
try {
const res = await fetch(
`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/playground`,
{
method: "POST",
credentials: "include",
headers: { "Content-Type": "application/json" },
// ✅ Updated request body key
body: JSON.stringify({
messages: [{ role: "user", content: input }],
}),
}
);
if (!res.ok) throw new Error("API error");
const data = await res.json();
setResponse(data.reply);
} catch (err) {
toast.error("Playground request failed");
}
};
return (
<div className="p-6">
<textarea
className="w-full p-2 border rounded"
rows={4}
placeholder="Ask your bot something..."
value={input}
onChange={(e) => setInput(e.target.value)}
/>
<Button className="mt-4" onClick={callPlayground}>
Send to Playground
</Button>
{response && (
<div className="mt-6 p-4 bg-gray-100 rounded">
<strong>Bot reply:</strong>
<p>{response}</p>
</div>
)}
</div>
);
}Important: Ensure the backend version you are running matches the frontend (
v0.2.5). Older backend releases still expect the oldpromptkey, which will result in a400 Bad Request.
The backend API is versioned independently. The following endpoints are consumed by the frontend. Adjust
NEXT_PUBLIC_API_BASE_URLaccordingly