Skip to content

AI Presentation SaaS Platform is a modern web application built with Next.js, OpenAI, Clerk, Prisma, and Lemon Squeezy. It enables users to generate, edit, and manage professional presentations in minutes using AI. The platform includes authentication, subscription management, payment integration, and a user-friendly dashboard for seamless access.

License

Notifications You must be signed in to change notification settings

be-a-guptaji/AI-PPT-Builder

Repository files navigation

πŸš€ Kraton - AI PPT Builder

License Status Next.js TypeScript TailwindCSS


πŸ“– About The Project

Kraton - AI PPT Builder is a next-gen SaaS tool that helps you create beautiful, professional presentations in just one click. Using AI (OpenAI GPT + DALLΒ·E), Kraton generates slide outlines, themes, layouts, and visuals while allowing full customization with an intuitive drag-and-drop editor.

This project was built with Next.js, Clerk, Prisma, and Lemon Squeezy to ensure scalability, secure authentication, and monetization.


✨ Key Features

  • πŸ”‘ Clerk Authentication – Secure login and signup.
  • 🧠 AI Outline Generator – Turn prompts into structured slides.
  • 🎨 Themes & Layouts – Choose from prebuilt or AI-generated themes.
  • πŸ–Ό AI-Powered Images – Generate visuals using DALLΒ·E.
  • πŸ–± Drag-and-Drop Editor – Fully customizable.
  • πŸ’Ύ Save & Manage Projects – Keep all your presentations in one place.
  • πŸ’³ Monetization – Integrated with Lemon Squeezy.

πŸ“Έ Screenshots

Landing Page

Landing

Dashboard

Dashboard

Project Creation

Project

Theme Generator

Theme

Prompt Management

Prompt

Settings (API Integration)

Settings

Recycle Bin

Trash

Slides Edits

Slides

Slide Show

Presntation


πŸ“ Directory Structure

The project is organized as follows:

Directory structure:
└── ai-ppt-builder/
    β”œβ”€β”€ README.md
    β”œβ”€β”€ components.json
    β”œβ”€β”€ eslint.config.mjs
    β”œβ”€β”€ LICENSE
    β”œβ”€β”€ next.config.ts
    β”œβ”€β”€ package.json
    β”œβ”€β”€ postcss.config.mjs
    β”œβ”€β”€ tsconfig.json
    β”œβ”€β”€ .env.samples
    β”œβ”€β”€ .prettierignore
    β”œβ”€β”€ .prettierrc.json
    β”œβ”€β”€ prisma/
    β”‚   └── schema.prisma
    β”œβ”€β”€ public/
    β”‚   └── slide.webp
    └── src/
        β”œβ”€β”€ middleware.ts
        β”œβ”€β”€ actions/
        β”‚   β”œβ”€β”€ chatGPT.ts
        β”‚   β”œβ”€β”€ lemonSqueezy.ts
        β”‚   β”œβ”€β”€ openAI.ts
        β”‚   β”œβ”€β”€ projects.ts
        β”‚   └── user.ts
        β”œβ”€β”€ app/
        β”‚   β”œβ”€β”€ globals.css
        β”‚   β”œβ”€β”€ layout.tsx
        β”‚   β”œβ”€β”€ page.tsx
        β”‚   β”œβ”€β”€ (auth)/
        β”‚   β”‚   β”œβ”€β”€ layout.tsx
        β”‚   β”‚   β”œβ”€β”€ callback/
        β”‚   β”‚   β”‚   β”œβ”€β”€ loading.tsx
        β”‚   β”‚   β”‚   └── page.tsx
        β”‚   β”‚   β”œβ”€β”€ sign-in/
        β”‚   β”‚   β”‚   └── [[...sign-in]]/
        β”‚   β”‚   β”‚       └── page.tsx
        β”‚   β”‚   └── sign-up/
        β”‚   β”‚       └── [[...sign-up]]/
        β”‚   β”‚           └── page.tsx
        β”‚   β”œβ”€β”€ (protected)/
        β”‚   β”‚   β”œβ”€β”€ layout.tsx
        β”‚   β”‚   β”œβ”€β”€ (pages)/
        β”‚   β”‚   β”‚   β”œβ”€β”€ layout.tsx
        β”‚   β”‚   β”‚   └── (dashboardPages)/
        β”‚   β”‚   β”‚       β”œβ”€β”€ create-page/
        β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ page.tsx
        β”‚   β”‚   β”‚       β”‚   └── _components/
        β”‚   β”‚   β”‚       β”‚       β”œβ”€β”€ renderPage.tsx
        β”‚   β”‚   β”‚       β”‚       β”œβ”€β”€ common/
        β”‚   β”‚   β”‚       β”‚       β”‚   β”œβ”€β”€ addCardButton.tsx
        β”‚   β”‚   β”‚       β”‚       β”‚   β”œβ”€β”€ card.tsx
        β”‚   β”‚   β”‚       β”‚       β”‚   └── cardList.tsx
        β”‚   β”‚   β”‚       β”‚       β”œβ”€β”€ create-page/
        β”‚   β”‚   β”‚       β”‚       β”‚   β”œβ”€β”€ createPage.tsx
        β”‚   β”‚   β”‚       β”‚       β”‚   └── createPageSkeleton.tsx
        β”‚   β”‚   β”‚       β”‚       β”œβ”€β”€ generate-ai/
        β”‚   β”‚   β”‚       β”‚       β”‚   β”œβ”€β”€ creativeAI.tsx
        β”‚   β”‚   β”‚       β”‚       β”‚   └── recentPrompts.tsx
        β”‚   β”‚   β”‚       β”‚       └── scratch/
        β”‚   β”‚   β”‚       β”‚           └── scratchPage.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ dashboard/
        β”‚   β”‚   β”‚       β”‚   └── page.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ settings/
        β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ page.tsx
        β”‚   β”‚   β”‚       β”‚   └── _components/
        β”‚   β”‚   β”‚       β”‚       └── userSettings.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ share/
        β”‚   β”‚   β”‚       β”‚   └── [shareID]/
        β”‚   β”‚   β”‚       β”‚       └── page.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ templates/
        β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ page.tsx
        β”‚   β”‚   β”‚       β”‚   └── [templates]/
        β”‚   β”‚   β”‚       β”‚       └── page.tsx
        β”‚   β”‚   β”‚       └── trash/
        β”‚   β”‚   β”‚           β”œβ”€β”€ page.tsx
        β”‚   β”‚   β”‚           └── _components/
        β”‚   β”‚   β”‚               └── deleteAllButton.tsx
        β”‚   β”‚   └── presentation/
        β”‚   β”‚       β”œβ”€β”€ layout.tsx
        β”‚   β”‚       β”œβ”€β”€ page.tsx
        β”‚   β”‚       └── [presentationID]/
        β”‚   β”‚           β”œβ”€β”€ page.tsx
        β”‚   β”‚           β”œβ”€β”€ _components/
        β”‚   β”‚           β”‚   β”œβ”€β”€ editor/
        β”‚   β”‚           β”‚   β”‚   β”œβ”€β”€ dropZone.tsx
        β”‚   β”‚           β”‚   β”‚   β”œβ”€β”€ editor.tsx
        β”‚   β”‚           β”‚   β”‚   └── masterRecursiveComponent.tsx
        β”‚   β”‚           β”‚   β”œβ”€β”€ editor-sidebar/
        β”‚   β”‚           β”‚   β”‚   β”œβ”€β”€ left-sidebar/
        β”‚   β”‚           β”‚   β”‚   β”‚   β”œβ”€β”€ dragableSlidePreview.tsx
        β”‚   β”‚           β”‚   β”‚   β”‚   β”œβ”€β”€ layoutPreview.tsx
        β”‚   β”‚           β”‚   β”‚   β”‚   └── scaledPreview.tsx
        β”‚   β”‚           β”‚   β”‚   └── right-sidebar/
        β”‚   β”‚           β”‚   β”‚       β”œβ”€β”€ index.tsx
        β”‚   β”‚           β”‚   β”‚       └── tabs/
        β”‚   β”‚           β”‚   β”‚           β”œβ”€β”€ layoutChooser.tsx
        β”‚   β”‚           β”‚   β”‚           β”œβ”€β”€ themeChooser.tsx
        β”‚   β”‚           β”‚   β”‚           └── components-tabs/
        β”‚   β”‚           β”‚   β”‚               β”œβ”€β”€ componentPreview.tsx
        β”‚   β”‚           β”‚   β”‚               └── layoutPreviewItem.tsx
        β”‚   β”‚           β”‚   └── navbar/
        β”‚   β”‚           β”‚       β”œβ”€β”€ navbar.tsx
        β”‚   β”‚           β”‚       └── presentationMode.tsx
        β”‚   β”‚           └── select-theme/
        β”‚   β”‚               β”œβ”€β”€ page.tsx
        β”‚   β”‚               └── _components/
        β”‚   β”‚                   β”œβ”€β”€ themeCard.tsx
        β”‚   β”‚                   β”œβ”€β”€ themePicker.tsx
        β”‚   β”‚                   └── themePreview.tsx
        β”‚   └── api/
        β”‚       └── webhook/
        β”‚           └── subscriptions/
        β”‚               └── route.ts
        β”œβ”€β”€ components/
        β”‚   β”œβ”€β”€ global/
        β”‚   β”‚   β”œβ”€β”€ alert-dialog/
        β”‚   β”‚   β”‚   └── index.tsx
        β”‚   β”‚   β”œβ”€β”€ app-sidebar/
        β”‚   β”‚   β”‚   β”œβ”€β”€ index.tsx
        β”‚   β”‚   β”‚   β”œβ”€β”€ navFooter.tsx
        β”‚   β”‚   β”‚   β”œβ”€β”€ navMain.tsx
        β”‚   β”‚   β”‚   └── recentOpen.tsx
        β”‚   β”‚   β”œβ”€β”€ editor/
        β”‚   β”‚   β”‚   └── components/
        β”‚   β”‚   β”‚       β”œβ”€β”€ blockQuote.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ calloutBox.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ codeBlock.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ columnComponent.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ divider.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ headings.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ imageComponent.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ listComponent.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ paragraph.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ tableComponet.tsx
        β”‚   β”‚   β”‚       β”œβ”€β”€ tableOfContents.tsx
        β”‚   β”‚   β”‚       └── uploadImage.tsx
        β”‚   β”‚   β”œβ”€β”€ mode-toggle/
        β”‚   β”‚   β”‚   └── index.tsx
        β”‚   β”‚   β”œβ”€β”€ not-found/
        β”‚   β”‚   β”‚   └── index.tsx
        β”‚   β”‚   β”œβ”€β”€ project-card/
        β”‚   β”‚   β”‚   β”œβ”€β”€ index.tsx
        β”‚   β”‚   β”‚   └── thumbnailPreview.tsx
        β”‚   β”‚   β”œβ”€β”€ projects/
        β”‚   β”‚   β”‚   └── index.tsx
        β”‚   β”‚   └── upper-infobar/
        β”‚   β”‚       β”œβ”€β”€ index.tsx
        β”‚   β”‚       β”œβ”€β”€ newProjectButton.tsx
        β”‚   β”‚       β”œβ”€β”€ sellButton.tsx
        β”‚   β”‚       └── upperInfoSearchBar.tsx
        β”‚   └── ui/
        β”‚       β”œβ”€β”€ accordion.tsx
        β”‚       β”œβ”€β”€ alert-dialog.tsx
        β”‚       β”œβ”€β”€ alert.tsx
        β”‚       β”œβ”€β”€ aspect-ratio.tsx
        β”‚       β”œβ”€β”€ avatar.tsx
        β”‚       β”œβ”€β”€ badge.tsx
        β”‚       β”œβ”€β”€ breadcrumb.tsx
        β”‚       β”œβ”€β”€ button.tsx
        β”‚       β”œβ”€β”€ calendar.tsx
        β”‚       β”œβ”€β”€ card.tsx
        β”‚       β”œβ”€β”€ carousel.tsx
        β”‚       β”œβ”€β”€ chart.tsx
        β”‚       β”œβ”€β”€ checkbox.tsx
        β”‚       β”œβ”€β”€ collapsible.tsx
        β”‚       β”œβ”€β”€ command.tsx
        β”‚       β”œβ”€β”€ context-menu.tsx
        β”‚       β”œβ”€β”€ dialog.tsx
        β”‚       β”œβ”€β”€ drawer.tsx
        β”‚       β”œβ”€β”€ dropdown-menu.tsx
        β”‚       β”œβ”€β”€ form.tsx
        β”‚       β”œβ”€β”€ hover-card.tsx
        β”‚       β”œβ”€β”€ input-otp.tsx
        β”‚       β”œβ”€β”€ input.tsx
        β”‚       β”œβ”€β”€ label.tsx
        β”‚       β”œβ”€β”€ menubar.tsx
        β”‚       β”œβ”€β”€ navigation-menu.tsx
        β”‚       β”œβ”€β”€ pagination.tsx
        β”‚       β”œβ”€β”€ popover.tsx
        β”‚       β”œβ”€β”€ progress.tsx
        β”‚       β”œβ”€β”€ radio-group.tsx
        β”‚       β”œβ”€β”€ resizable.tsx
        β”‚       β”œβ”€β”€ scroll-area.tsx
        β”‚       β”œβ”€β”€ select.tsx
        β”‚       β”œβ”€β”€ separator.tsx
        β”‚       β”œβ”€β”€ sheet.tsx
        β”‚       β”œβ”€β”€ sidebar.tsx
        β”‚       β”œβ”€β”€ skeleton.tsx
        β”‚       β”œβ”€β”€ slider.tsx
        β”‚       β”œβ”€β”€ sonner.tsx
        β”‚       β”œβ”€β”€ switch.tsx
        β”‚       β”œβ”€β”€ table.tsx
        β”‚       β”œβ”€β”€ tabs.tsx
        β”‚       β”œβ”€β”€ textarea.tsx
        β”‚       β”œβ”€β”€ toggle-group.tsx
        β”‚       β”œβ”€β”€ toggle.tsx
        β”‚       └── tooltip.tsx
        β”œβ”€β”€ hooks/
        β”‚   └── use-mobile.ts
        β”œβ”€β”€ lib/
        β”‚   β”œβ”€β”€ axios.ts
        β”‚   β”œβ”€β”€ constant.ts
        β”‚   β”œβ”€β”€ IconsComponent.tsx
        β”‚   β”œβ”€β”€ prisma.ts
        β”‚   β”œβ”€β”€ slideComponents.ts
        β”‚   β”œβ”€β”€ slideLayouts.ts
        β”‚   β”œβ”€β”€ types.ts
        β”‚   └── utils.ts
        β”œβ”€β”€ provider/
        β”‚   └── theme-provider.tsx
        └── store/
            β”œβ”€β”€ useCreativeAIStore.tsx
            β”œβ”€β”€ usePromptStore.tsx
            β”œβ”€β”€ useSlideStore.tsx
            └── useStartScratchStore.tsx

Key Folders and Files:

  • /components: Contains reusable.
  • /pages: Includes the main routes for pages like login, createve page, and ppt pages.
  • /api: Server-side route handlers for database interactions and ppt creation.
  • /prisma: Prisma schema and client for database interaction.
  • /styles: TailwindCSS styles and global styling.

πŸ—οΈ Architecture

The system architecture is built to balance performance, scalability, and modularity. It follows a client-server model with clear responsibilities:

  • Frontend (Next.js + TailwindCSS + ShadCN UI): Renders the dashboard, editor, and presentation views. Handles client-side logic and state with Zustand.
  • Backend (Next.js API Routes): Handles slide generation requests, image creation, and data persistence.
  • AI Integration (OpenAI GPT + DALLΒ·E): Powers content generation (outlines, text, images).
  • Database (Prisma + PostgreSQL): Stores user accounts, projects, slides, and history.
  • Authentication (Clerk): Provides secure user login and session management.
  • Payments (Lemon Squeezy): Handles subscriptions and monetization for premium features.
graph TD
    %% ==============================
    %% CLIENT LAYER
    %% ==============================
    subgraph Client
    U[πŸ–₯️ User Browser] --> F[πŸ’» Next.js Frontend]
    end

    %% ==============================
    %% BACKEND & API LAYER
    %% ==============================
    subgraph Backend
    F --> API[βš™οΈ Next.js API Routes]
    API --> AI[πŸ€– OpenAI GPT & 🎨 DALLΒ·E]
    API --> DB[(πŸ—„οΈ PostgreSQL via Prisma)]
    end

    %% ==============================
    %% SERVICES LAYER
    %% ==============================
    subgraph Services
    F --> Clerk[πŸ” Clerk Authentication]
    API --> LS[πŸ’³ Lemon Squeezy Payments]
    end

    %% ==============================
    %% FLOWS
    %% ==============================
    U -->|πŸ”‘ Login / Sign Up| Clerk
    Clerk -->|βœ… Auth Response| F
    U -->|πŸ’° Buy Premium Plan| LS
    LS -->|πŸ“œ Subscription Verified| API
    API -->|✨ Generate Content| AI
    API -->|πŸ’Ύ Store / Retrieve Data| DB

    %% ==============================
    %% STYLING
    %% ==============================
    classDef client fill:#6ac6b7,stroke:#000,stroke-width:2px,color:#000,font-weight:bold;
    classDef backend fill:#f1a4cb,stroke:#000,stroke-width:2px,color:#000,font-weight:bold;
    classDef services fill:#82c7f9,stroke:#000,stroke-width:2px,color:#000,font-weight:bold;
    classDef user fill:#ffcc00,stroke:#000,stroke-width:2px,color:#000,font-weight:bold;
    classDef db fill:#f1e1a4,stroke:#000,stroke-width:2px,color:#000,font-weight:bold;
    classDef ai fill:#c6a0f6,stroke:#000,stroke-width:2px,color:#000,font-weight:bold;

    %% Apply Classes
    class U user;
    class F client;
    class API backend;
    class DB db;
    class AI ai;
    class Clerk,LS services;

Loading

πŸ›  Built With

  • Frontend: Next.js 15, TypeScript, TailwindCSS, ShadCN UI
  • Backend: Prisma ORM, PostgreSQL
  • AI: OpenAI GPT + DALLΒ·E
  • Auth: Clerk
  • Payments: Lemon Squeezy
  • State Management: Zustand

βš™οΈ Getting Started

Prerequisites

  • Node.js 18+
  • PostgreSQL instance
  • OpenAI API Key
  • Clerk API Key
  • Lemon Squeezy API Key

Installation

git clone https://github.com/username/ai-ppt-builder.git
cd ai-ppt-builder
npm install

Configuration

Rename .env.example to .env.local and update:

DATABASE_URL=your_postgres_url
OPENAI_API_KEY=your_openai_key
CLERK_SECRET_KEY=your_clerk_secret
LEMON_SQUEEZY_API_KEY=your_api_key

Database Setup (Prisma)

  1. Install Prisma CLI:
npm install prisma --save-dev
  1. Initialize Prisma:
npx prisma init
  1. Generate Prisma client:
npx prisma generate
  1. Push database schema to PostgreSQL:
npx prisma db push
  1. (Optional) Open Prisma Studio to explore/manage DB:
npx prisma studio

Run

npm run dev

Visit http://localhost:3000


πŸ›£οΈ Roadmap

  • AI Slide Generator
  • AI Themes & Images
  • Clerk Authentication
  • Lemon Squeezy Integration
  • Team Collaboration
  • Export as PPTX/PDF
  • Cloud Deployment (Vercel/AWS)

πŸ“œ License

MIT License Β© 2025 Aryan Baadlas


πŸ“¬ Contact

πŸ‘¨β€πŸ’» Aryan Baadlas
πŸ“§ aryanbaadlas@gmail.com


⭐ Show some love!

If you like this project, give it a star ⭐ on GitHub!

About

AI Presentation SaaS Platform is a modern web application built with Next.js, OpenAI, Clerk, Prisma, and Lemon Squeezy. It enables users to generate, edit, and manage professional presentations in minutes using AI. The platform includes authentication, subscription management, payment integration, and a user-friendly dashboard for seamless access.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published