editor-pro-max
AI-Powered Video Editor by @soyenriquerocha Built with Remotion + Claude Code | React 19 | TypeScript | Whisper AI
AI-powered Instagram carousel builder. Chat with Claude to design slides; export as PNGs at exact Instagram dimensions. Type /start in Claude Code to bootstrap.
Repo: Hainrixz/open-carrusel
What's inside
Local-first. Open source. One command to start.

Designing Instagram carousels eats hours. You either:
Open Carrusel takes a different bet. You chat with Claude β the same model many designers already trust β and it generates real HTML/CSS slides that get screenshotted to PNGs at exact Instagram dimensions. Slides are unique, on-brand, and pixel-perfect. Everything runs on your laptop. Nothing is sent to a cloud you don't control.
It's open source under MIT. Fork it, tweak the system prompt, ship your own variant. No accounts. No subscriptions. No vendor lock-in.
Dashboard β your carousels, templates, and one-click export.

Editor β chat panel (left), live preview (center), drag-reorderable filmstrip (bottom).

The slides shown above were generated by chatting with Claude. No templates, no copy-paste β every layout, color, and font choice came from a conversation.
First run takes 1β2 minutes (Puppeteer downloads ~300 MB of Chromium for PNG export). After that, every launch is seconds.
git clone https://github.com/Hainrixz/open-carrusel.git
cd open-carrusel
claude
/start
That's it. Dependencies install, the dev server starts, your browser opens. Now design carousels by chatting.
git clone https://github.com/Hainrixz/open-carrusel.git
cd open-carrusel
npm run setup # installs deps + seeds /data/
npm run dev # starts http://localhost:3000
You won't get the AI chat without Claude Code installed (the in-app agent shells out to the claude CLI), but the editor and export still work for static slides.
/data/ and /public/uploads/. Nothing is sent to a cloud you don't control. The only network call is when Claude Code talks to Anthropic.The in-app agent is the Claude CLI spawned as a subprocess from /api/chat with --allowedTools Bash WebFetch. Messages stream back to the browser via Server-Sent Events.
When you ask for a slide, Claude:
/api/carousels/[id]/slides via curl (using its Bash tool)You > Create a 5-slide carousel about β3 morning habits that
actually move the needle.β Punchy, dark mode, accent red,
portrait 4:5.
Claude > Coming up. I'll build a hook slide, three habit slides,
and a CTA. Working...
[streams 5 HTML slides into the filmstrip]
You > Slide 3 β the headline is too long. Cut it in half and
move the icon to the top.
Claude > Done.
[updates that slide; you can /undo if you preferred the old one]
Slides are stored as body-level HTML (no <html>/<head>/<!DOCTYPE>). The shared function wrapSlideHtml() in src/lib/slide-html.ts wraps that body into a full document β adding font loading, dimension constraints, and box-sizing reset β and serves it both:
<iframe> for live preview in the editorBecause the same wrap function feeds both paths, what you see is exactly what you export. No surprises.
Type these inside Claude Code:
| Command | What it does |
|---|---|
/start [port] | Install + seed + run + open browser. Idempotent β re-running on a healthy install is seconds. |
/stop [port] | Kill the dev server. Defaults to :3000, accepts a port arg matching /start. |
/reset | Wipe local carousels, templates, brand config, uploads, exports β and re-seed defaults. Asks first. |
/doctor | Run setup diagnostics: Node version, Claude CLI on PATH, deps installed, data files seeded, port free. |
You can also run them outside Claude Code:
npm run setup # equivalent to /start (skips the browser-open + background server bits)
npm run dev # start the dev server
npm run build # production build
npm run doctor # run scripts/doctor.mjs (works pre-`npm install`)
flowchart LR
U(["Browser :3000"])
C["Chat Panel"]
P["Slide Preview<br/>(sandboxed iframe)"]
F["Filmstrip<br/>(dnd-kit)"]
API["/api/chat<br/>SSE streaming/"]
CCLI["Claude CLI<br/>subprocess"]
SLIDES["/api/carousels/.../slides/"]
DATA[("/data/*.json<br/>async-mutex<br/>atomic writes")]
EXP["/api/.../export/"]
PUP["Puppeteer<br/>(headless Chromium)"]
ZIP{{"ZIP of PNGs"}}
U --> C & P & F
C -- "POST chat" --> API
API -- "spawn" --> CCLI
CCLI -. "SSE" .-> API
API -. "SSE" .-> C
CCLI -- "curl POST slide HTML" --> SLIDES
SLIDES <--> DATA
P <--> SLIDES
F <--> SLIDES
U -- "Export" --> EXP
EXP --> PUP
PUP --> ZIP
ZIP --> U
Why these choices:
Bash (to curl the slide-write endpoints) and WebFetch (for research while designing).<script> tags allowed (enforced by the iframe sandbox="" attribute). Slides can't run code or escape their box.src/lib/data.ts with proper locking, and writes are tmp-file + rename to avoid torn JSON.For more, see CLAUDE.md β the architecture doc tuned for AI assistants working on this codebase.
| Layer | Tool |
|---|---|
| Framework | Next.js 16 (Turbopack), React 19 |
| Language | TypeScript 5 |
| Styling | Tailwind CSS v4 (CSS-first config in globals.css) |
| UI primitives | Radix UI, lucide-react |
| Drag/drop | @dnd-kit |
| AI agent | Claude CLI subprocess |
| Image export | Puppeteer, Sharp |
| Zipping | Archiver |
| Storage | JSON files + async-mutex |
| Animation | CSS-first (Emil Kowalski's design philosophy) |
open-carrusel/
βββ .claude/
β βββ commands/ β /start, /stop, /reset, /doctor (Claude Code slash commands)
βββ data/ β user state (gitignored): brand, carousels, templates, exports
βββ docs/screenshots/ β README assets
βββ public/uploads/ β user uploads (gitignored): logos, reference images
βββ scripts/
β βββ setup.mjs β npm install + seed data dirs + Claude CLI detection (cross-platform)
β βββ doctor.mjs β env diagnostic (zero deps, runs pre-install)
βββ src/
β βββ app/
β β βββ api/ β every backend route (chat, carousels, slides, export, brand, ...)
β β βββ carousel/[id]/ β editor page
β β βββ globals.css β Tailwind v4 theme + Emil-style motion tokens
β β βββ layout.tsx
β β βββ page.tsx β dashboard page
β βββ components/
β β βββ brand/ β BrandSetup, ColorPicker, FontSelector, LogoUpload
β β βββ chat/ β ChatPanel, ChatMessage, ChatInput, ReferenceImages
β β βββ editor/ β CarouselPreview, SlideFilmstrip, SlideRenderer, ExportButton, ...
β β βββ layout/ β TopBar
β β βββ templates/ β TemplateGallery, TemplateCard
β β βββ ui/ β Button, Input, Badge, ConfirmDialog, CreateCarouselDialog
β βββ lib/
β β βββ chat-system-prompt.ts β dynamic system prompt (brand + carousel context)
β β βββ slide-html.ts β wrapSlideHtml() β the rendering contract
β β βββ carousels.ts β carousel + slide CRUD with version history
β β βββ data.ts β JSON storage with async-mutex + atomic writes
β β βββ claude-path.ts β portable Claude CLI discovery
β β βββ ...
β βββ types/ β shared TypeScript types
βββ CLAUDE.md β architecture doc for AI assistants working on this code
βββ LICENSE β MIT
βββ README.md β you are here
βββ next.config.ts
βββ package.json
βββ tsconfig.json
.env.local)Created automatically by scripts/setup.mjs if it can find your Claude CLI. You can override:
CLAUDE_CLI_PATH=/path/to/claude # set if `which claude` doesn't find it
On Windows, run where claude in PowerShell to find the path (typically C:\Users\<you>\AppData\Roaming\npm\claude.cmd), then set CLAUDE_CLI_PATH in .env.local.
Set on first run (or via the gear icon in the top bar). Stored at /data/brand.json. Fields:
/api/fonts endpoint serves a curated list)Save any carousel as a template via the bookmark icon in the editor toolbar. Templates appear in the dashboard's Templates tab. Stored at /data/templates.json.
Drop screenshots into the chat panel's "Reference Images" section. Stored under /public/uploads/. Claude Code can read them via WebFetch of the local URL when designing.
/start says "Node v18 detected, need β₯20."
Next.js 16 requires Node 20+. Install via nodejs.org or nvm.
/start says "Claude CLI not found."
Install Claude Code and authenticate. The setup script searches ~/.local/bin/claude, /usr/local/bin/claude, /opt/homebrew/bin/claude, ~/.npm-global/bin/claude, and $CLAUDE_CLI_PATH. If yours lives elsewhere, set CLAUDE_CLI_PATH in .env.local.
Port 3000 is in use.
Run /stop to kill whatever's there, or run /start 3001 to use a different port.
Export fails or hangs.
Likely a Puppeteer/Chromium issue. Try rm -rf node_modules && npm install to re-trigger the Chromium download. On Linux you may need apt install of common Chromium dependencies (libnss3, libatk1.0-0, libxss1, etc.).
Slides look fine in preview but export looks different.
That shouldn't happen β both go through wrapSlideHtml(). If it does, file an issue with the slide HTML attached.
The AI keeps generating slides that ignore my brand colors.
Open the brand setup (gear icon) and confirm your colors and style keywords are saved. They're injected into Claude's system prompt on every chat request via chat-system-prompt.ts.
Run /doctor for a full env audit β it'll tell you which of the above applies.
Open ideas β PRs welcome. Tick what you ship, add your own.
style-presets.json you can one-click applyPRs welcome. The bar:
npm run doctor and npm run build before opening a PR β both should pass clean.CLAUDE.md β components β€ 300 lines, types in src/types/, libs in src/lib/, cn() from src/lib/utils.ts for class merging, all data writes through src/lib/data.ts.wrapSlideHtml() in src/lib/slide-html.ts is the seam between preview and export. Change it carefully and test the export round-trip.globals.css), respect prefers-reduced-motion. See the oc-* utility classes already in globals.css before authoring new ones.Good first contributions: roadmap items above, more brand templates, accessibility audits, real screenshots/demos for the README, translations.
oc-* CSS classes encode his design-engineering principles (custom easings, restraint over excess, @starting-style over JS for entries).Open Carrusel is built and maintained by tododeia β a content + AI lab building tools for creators who want leverage without lock-in.
Founder: Enrique Rocha (@soyenriquerocha) β Tijuanense, content creator, builds AI tools so creators don't fall behind. Also behind @tododeia and @metara.ai.
If Open Carrusel saves you time, the best support is:
MIT β do anything you want with it. Attribution appreciated, never required.
Built with β€οΈ in Tijuana by tododeia.
Hecho para creadores que construyen el futuro.
.claude/
commands/
doctor.md
reset.md
start.md
stop.md
.gitignore
AGENTS.md
CLAUDE.md
docs/
screenshots/
dashboard.png
editor.png
eslint.config.mjs
LICENSE
next.config.ts
package-lock.json
package.json
postcss.config.mjs
public/
file.svg
globe.svg
next.svg
vercel.svg
window.svg
README.md
scripts/
doctor.mjs
setup.mjs
src/
app/
api/
brand/
route.ts
carousels/
[id]/
caption/
route.ts
duplicate/
route.ts
export/
route.ts
references/
route.ts
route.ts
slides/
[slideId]/
route.ts
undo/
route.ts
route.ts
route.ts
chat/
check/
route.ts
route.ts
fonts/
route.ts
staged-actions/
[id]/
route.ts
route.ts
style-presets/
[id]/
route.ts
route.ts
templates/
[id]/
route.ts
use/
route.ts
route.ts
upload/
route.ts
carousel/
[id]/
page.tsx
favicon.ico
globals.css
layout.tsx
page.tsx
components/
brand/
BrandSetup.tsx
ColorPicker.tsx
FontSelector.tsx
LogoUpload.tsx
chat/
ChatInput.tsx
ChatMessage.tsx
ChatPanel.tsx
ReferenceImages.tsx
editor/
AspectRatioSelector.tsx
CaptionPanel.tsx
CarouselPreview.tsx
ExportButton.tsx
FullscreenPreview.tsx
SafeZoneOverlay.tsx
SlideFilmstrip.tsx
SlideRenderer.tsx
layout/
TopBar.tsx
templates/
TemplateCard.tsx
TemplateGallery.tsx
ui/
badge.tsx
button.tsx
confirm-dialog.tsx
create-carousel-dialog.tsx
input.tsx
lib/
brand.ts
carousels.ts
chat-system-prompt.ts
claude-path.ts
data.ts
export-slides.ts
fonts.ts
slide-html.ts
staged-actions.ts
style-presets.ts
templates.ts
utils.ts
types/
brand.ts
carousel.ts
staged-action.ts
style-preset.ts
template.ts
tsconfig.jsonAI-Powered Video Editor by @soyenriquerocha Built with Remotion + Claude Code | React 19 | TypeScript | Whisper AI
The SEO + AI-search (GEO/AEO) optimization toolkit for Claude Code β two-score audit + opt-in fixer. Built for 2026-2027.
Claude Code plugin that analyzes your project, asks 3 questions, and generates a complete payment integration (Stripe Β· Mercado Pago Β· Wompi Β· Lemon Squeezy + frontend + DB + signed webhook + customer portal + refund). Local-first, security-enforced via PostToolUse hooks. Bilingual ES/EN.
FAQ
open-carrusel is a Claude Code plugin with hand-picked skills for content work, indexed on Flowy. Install it with the command on its page. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.