An AI-powered presentation generator built with Next.js, Google Gemini, and Supabase. Create professional presentations in seconds using natural language prompts.
- π€ AI-Powered Generation: Create presentations using Google Gemini 1.5 Pro
- π Smart Slide Creation: Automatically generates 5-8 slides with structured content
- βοΈ Full Editor: Edit titles, descriptions, and individual slides
- ποΈ Presentation Viewer: Fullscreen viewer with keyboard navigation
- π₯ Trending Page: Discover popular presentations sorted by views
- πΎ Supabase Storage: Secure cloud storage with Row Level Security
- π¨ Modern UI: Beautiful, responsive design with dark mode support
- π± Responsive: Works seamlessly on desktop, tablet, and mobile
- Node.js 18+ installed
- A Google Gemini API key
- A Supabase project
-
Clone the repository
git clone <your-repo-url> cd PowerMyPoint
-
Install dependencies
npm install
-
Set up environment variables
Create a
.env.localfile in the root directory:# Google Gemini API Key (get from https://makersuite.google.com/app/apikey) GOOGLE_GEMINI_API_KEY=your_google_gemini_api_key_here # Supabase Configuration (get from your Supabase project settings) NEXT_PUBLIC_SUPABASE_URL=your_supabase_project_url_here NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key_here
-
Set up the database
- Open your Supabase project dashboard
- Navigate to SQL Editor
- Copy the contents of
src/database/schema.sql - Paste and run the SQL script
This will create:
userstable for user datapresentationstable for storing presentations- Indexes for performance
- Row Level Security policies
-
Run the development server
npm run dev
-
Open your browser
Navigate to http://localhost:3000
PowerMyPoint/
βββ src/
β βββ app/
β β βββ (main)/ # Main app routes
β β β βββ explore/ # Browse presentations
β β β βββ presentations/ # Presentation detail & edit
β β β βββ trendings/ # Trending presentations
β β β βββ settings/ # App settings
β β βββ api/ # API routes
β β β βββ generate/ # Claude AI generation
β β β βββ presentations/ # CRUD operations
β β βββ layout.tsx # Root layout
β βββ components/ # React components
β β βββ PresentationCard.tsx
β β βββ PresentationViewer.tsx
β β βββ SlideEditor.tsx
β β βββ LoadingSpinner.tsx
β βββ database/
β β βββ connect.ts # Supabase client
β β βββ schema.sql # Database schema
β βββ types/
β βββ types.ts # TypeScript types
βββ public/ # Static assets
βββ .env.local # Environment variables (create this)
βββ package.json
- Navigate to the Explore page
- Enter a prompt in the creation form, e.g., "Create a presentation about climate change"
- Click Create and wait for Google Gemini to generate your presentation
- Your presentation will appear in the grid
- Click on any presentation card
- Use the Previous/Next buttons or arrow keys to navigate slides
- Press F for fullscreen mode
- Press Esc to exit
- Click the Edit button on a presentation card or detail page
- Modify the title, description, or slide content
- Add new slides with the Add Slide button
- Delete slides (minimum 1 slide required)
- Click Save Changes when done
- Navigate to the Trending page
- View presentations sorted by popularity (views)
- See statistics and top-ranked presentations
POST /api/generate
Generate a new presentation using Google Gemini.
Request Body:
{
"prompt": "Create a presentation about renewable energy",
"userId": "optional-user-id"
}Response:
{
"data": {
"id": "uuid",
"title": "Renewable Energy",
"description": "An overview of renewable energy sources",
"slides": [...],
"created_at": "2025-12-07T...",
"views": 0
},
"message": "Presentation generated successfully"
}GET /api/presentations?public=true&limit=20&offset=0
Fetch presentations with pagination.
Query Parameters:
public(boolean): Filter public presentationslimit(number): Number of results (default: 20)offset(number): Pagination offset (default: 0)
GET /api/presentations/[id]
Fetch a specific presentation by ID. Automatically increments view count.
PUT /api/presentations/[id]
Update presentation details.
Request Body:
{
"title": "Updated Title",
"description": "Updated description",
"slides": [...],
"is_public": true
}DELETE /api/presentations/[id]
Delete a presentation permanently.
| Column | Type | Description |
|---|---|---|
| id | UUID | Primary key |
| title | TEXT | Presentation title |
| description | TEXT | Brief description |
| slides | JSONB | Array of slide objects |
| user_id | UUID | Foreign key to users |
| is_public | BOOLEAN | Public visibility |
| views | INTEGER | View count |
| created_at | TIMESTAMP | Creation timestamp |
| updated_at | TIMESTAMP | Last update timestamp |
| Column | Type | Description |
|---|---|---|
| id | UUID | Primary key |
| TEXT | User email | |
| name | TEXT | User name |
| created_at | TIMESTAMP | Creation timestamp |
- Framework: Next.js 15.5.4 with App Router
- Language: TypeScript 5
- Styling: Tailwind CSS 4
- AI: Google Gemini 1.5 Pro
- Database: Supabase (PostgreSQL)
- Icons: Lucide React
- Markdown: React Markdown
- Row Level Security (RLS) enabled on all tables
- Environment variables for sensitive credentials
- API key validation
- Secure database queries with Supabase client
- Push your code to GitHub
- Import project in Vercel
- Add environment variables in Vercel dashboard
- Deploy
The app can be deployed to any platform that supports Next.js:
- Netlify
- Railway
- AWS Amplify
- Self-hosted with Docker
| Variable | Description | Required |
|---|---|---|
GOOGLE_GEMINI_API_KEY |
Your Google Gemini API key | Yes |
NEXT_PUBLIC_SUPABASE_URL |
Supabase project URL | Yes |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase anonymous key | Yes |
OPENAI_API_KEY |
OpenAI API key for ChatGPT (optional, for better outline generation) | No |
PEXELS_API_KEY |
Pexels API key for image fallback (optional, for replacing broken images) | No |
GOOGLE_IMAGEN_API_KEY |
Google Imagen API key for image generation fallback (optional, can use GOOGLE_GEMINI_API_KEY if compatible) | No |
GOOGLE_CLOUD_PROJECT_ID |
Google Cloud Project ID (required if using Imagen API) | No |
GOOGLE_CLOUD_LOCATION |
Google Cloud location (default: us-central1, required if using Imagen API) | No |
Contributions are welcome! Please feel free to submit a Pull Request.
This project is open source and available under the MIT License.
If you encounter any issues:
- Check that all environment variables are set correctly
- Ensure the database schema has been run in Supabase
- Verify your Google Gemini API key is valid
- Check the browser console for errors
- User authentication with Supabase Auth
- Presentation templates
- Export to PDF/PPTX
- Collaborative editing
- Custom themes and styling
- Image generation for slides
- Presentation analytics
Built with β€οΈ using Next.js, Google Gemini, and Supabase