The presentation platform for teams that care about brand.
DeckForge is a self-hostable, AI-assisted presentation platform. It gives an entire organization a shared, brand-governed slide library, AI generation that respects your brand, secure trackable sharing, and a code-level (HTML/CSS) slide editor — one tool for the whole presentation lifecycle.
Slides are real HTML/CSS rendered with Handlebars against per-brand variables, so a single master slide re-skins itself to any brand automatically. No lock-in to a proprietary slide format.
- Master slide library — a central repository of reusable, on-brand slides. Categorize, search, lock, and publish; updates propagate to dependent decks.
- Brand engine — logo, typefaces, and OKLCH color tokens defined once per workspace and auto-applied to every new deck.
- Brand-aware AI generation — describe a slide in plain English and DeckForge generates editable HTML/CSS that already matches your brand. Bring your own provider (Anthropic, OpenAI-compatible, or custom endpoints).
- Code-level editor — CodeMirror-based HTML/JSON editing with live preview, Handlebars variables, and a "save as master" workflow.
- Secure sharing & analytics — public, time-bound, password-protected, or invite-only links; forward-only navigation, PDF-download control, and white-label sharing that hides DeckForge branding.
- Passwordless auth — magic-link login plus optional Google OAuth. No passwords to manage.
- Role-based collaboration — Admin / Manager / Contributor roles with per-workspace isolation.
- Media manager — upload and manage assets via MinIO / S3-compatible storage (with a local-filesystem fallback for development).
| Layer | Technology |
|---|---|
| Framework | Next.js 14 (App Router), React 18, TypeScript |
| Styling | Tailwind CSS, OKLCH design tokens |
| Database | PostgreSQL via Drizzle ORM |
| Slides | Handlebars-templated HTML/CSS |
| Auth | Magic-link (passwordless) + Google OAuth, JWT sessions |
| AI | Anthropic SDK + pluggable custom LLM providers |
| Storage | MinIO / S3-compatible (local filesystem fallback) |
| SendGrid or SMTP (via Nodemailer) |
- Node.js 20+ and pnpm
- PostgreSQL 14+
- (Optional) MinIO or any S3-compatible bucket for asset storage
- (Optional) An LLM API key (e.g. Anthropic) — or set
MOCK_LLM=trueto skip real calls during development
git clone https://github.com/indianic/deckforge.git
cd deckforge
pnpm installCopy the example env file and fill in your values:
cp .env.example .env.localAt minimum set DATABASE_URL, NEXT_PUBLIC_APP_URL, and a 32+ character
JWT_SECRET. See .env.example for the full list (email, OAuth, AI, and
storage settings are optional and documented inline).
Create the database, then apply migrations:
createdb deckforge # or use your existing Postgres instance
pnpm db:migrate # apply schema migrationspnpm db:seedThis creates a workspace and an admin user (admin@deckforge.test by default —
override with ADMIN_EMAIL / ADMIN_NAME).
pnpm devThe app starts at http://localhost:56001.
DeckForge uses passwordless magic-link auth. Generate a login link for your seeded user without needing email delivery:
pnpm bootstrap:magic-link admin@deckforge.testOpen the printed URL in your browser.
| Script | Description |
|---|---|
pnpm dev |
Start the dev server on port 56001 |
pnpm build / pnpm start |
Production build / serve |
pnpm lint |
ESLint |
pnpm typecheck |
TypeScript type check (tsc --noEmit) |
pnpm db:generate |
Generate a Drizzle migration from schema changes |
pnpm db:migrate |
Apply pending migrations |
pnpm db:studio |
Open Drizzle Studio |
pnpm db:seed |
Seed the first workspace + admin user |
pnpm bootstrap:magic-link |
Generate a one-time login link for a user |
app/ Next.js App Router — pages, layouts, and API routes
components/ React UI components (editor, master-slide, media, ui primitives)
lib/ Core logic — auth, db (Drizzle schema), AI providers, API client
hooks/ Reusable React hooks (auto-save, lock heartbeat)
stores/ Zustand client state
drizzle/ SQL migrations and Drizzle config
scripts/ Seeding, migration, and setup utilities
services/ Auxiliary services (e.g. markitdown document conversion)
public/ Static assets
- AI providers — configure Anthropic or any OpenAI-compatible / custom
endpoint in-app under Settings → AI Providers. Set
MOCK_LLM=trueto develop without an API key. - Object storage — leave
MINIO_ENDPOINTunset to use the local filesystem fallback (public/uploads/). Set MinIO/S3 credentials to use a real bucket. - Email — SendGrid is used when
SENDGRID_API_KEYis set; otherwise it falls back to SMTP (e.g. a local Mailpit/Mailcatcher for development).
Issues and pull requests are welcome. Please run pnpm lint and
pnpm typecheck before submitting.
Released under the MIT License. © 2026 IndiaNIC Infotech Ltd.
