[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1425":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":35,"readmeContent":36,"aiSummary":37,"trendingCount":16,"starSnapshotCount":16,"syncStatus":15,"lastSyncTime":38,"discoverSource":39},1425,"open-carrusel","Hainrixz\u002Fopen-carrusel","Hainrixz","AI-powered Instagram carousel builder. Chat with Claude to design slides; export as PNGs at exact Instagram dimensions. Type \u002Fstart in Claude Code to bootstrap.","",null,"TypeScript",315,46,1,2,0,12,23,77,36,84.22,"MIT License",false,"main",true,[27,28,29,30,31,32,33,34],"ai","carousel","claude","claude-code","instagram","local-first","nextjs","react","2026-06-12 04:00:09","\u003Cdiv align=\"center\">\n\n# Open Carrusel\n\n### Chat with Claude. Design Instagram carousels. Export pixel-perfect PNGs.\n\n**Local-first. Open source. One command to start.**\n\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-1a1a2e.svg?style=flat-square)](.\u002FLICENSE)\n[![Built with Claude](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fbuilt%20with-Claude-e94560.svg?style=flat-square)](https:\u002F\u002Fclaude.ai)\n[![Made by tododeia](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fmade%20by-tododeia-1a1a2e.svg?style=flat-square)](https:\u002F\u002Fwww.tododeia.com)\n[![Next.js 16](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNext.js-16-000.svg?style=flat-square)](https:\u002F\u002Fnextjs.org)\n[![React 19](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReact-19-149eca.svg?style=flat-square)](https:\u002F\u002Freact.dev)\n[![TypeScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-5-3178c6.svg?style=flat-square)](https:\u002F\u002Fwww.typescriptlang.org)\n[![Tailwind v4](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTailwind-v4-38bdf8.svg?style=flat-square)](https:\u002F\u002Ftailwindcss.com)\n\n![Dashboard](.\u002Fdocs\u002Fscreenshots\u002Fdashboard.png)\n\n\u003C\u002Fdiv>\n\n---\n\n## Table of contents\n\n- [Why Open Carrusel](#-why-open-carrusel)\n- [See it in action](#-see-it-in-action)\n- [Quickstart (60 seconds)](#-quickstart-60-seconds)\n- [What you can do](#-what-you-can-do)\n- [How the AI agent works](#-how-the-ai-agent-works)\n- [Slash commands](#-slash-commands)\n- [Architecture](#-architecture)\n- [Tech stack](#-tech-stack)\n- [Project structure](#-project-structure)\n- [Configuration](#%EF%B8%8F-configuration)\n- [Troubleshooting](#-troubleshooting)\n- [Roadmap](#%EF%B8%8F-roadmap)\n- [Contributing](#-contributing)\n- [Acknowledgments](#-acknowledgments)\n- [About the maker](#-about-the-maker)\n- [License](#-license)\n\n---\n\n## ✨ Why Open Carrusel\n\nDesigning Instagram carousels eats hours. You either:\n\n- Pay $20–60\u002Fmonth for a closed-source tool that limits how creative you can get\n- Wrestle Canva templates that everyone else also uses\n- Hand-craft slides in Figma and lose your weekend\n\n**Open Carrusel takes a different bet.** You chat with Claude — the same model many designers already trust — and it generates real HTML\u002FCSS 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.\n\nIt's open source under MIT. Fork it, tweak the system prompt, ship your own variant. No accounts. No subscriptions. No vendor lock-in.\n\n---\n\n## 🎬 See it in action\n\n**Dashboard** — your carousels, templates, and one-click export.\n\n![Dashboard](.\u002Fdocs\u002Fscreenshots\u002Fdashboard.png)\n\n**Editor** — chat panel (left), live preview (center), drag-reorderable filmstrip (bottom).\n\n![Editor](.\u002Fdocs\u002Fscreenshots\u002Feditor.png)\n\n> 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.\n\n---\n\n## 🚀 Quickstart (60 seconds)\n\n> First run takes 1–2 minutes (Puppeteer downloads ~300 MB of Chromium for PNG export). After that, every launch is seconds.\n\n### One-command path (recommended)\n\n1. **Install [Claude Code](https:\u002F\u002Fdocs.anthropic.com\u002Fen\u002Fdocs\u002Fclaude-code)** and authenticate.\n2. **Clone and open the repo** in Claude Code:\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fopen-carrusel.git\n   cd open-carrusel\n   claude\n   ```\n3. In the Claude Code prompt, type:\n   ```\n   \u002Fstart\n   ```\n\nThat's it. Dependencies install, the dev server starts, your browser opens. Now design carousels by chatting.\n\n### Manual path (if you don't use Claude Code)\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FHainrixz\u002Fopen-carrusel.git\ncd open-carrusel\nnpm run setup        # installs deps + seeds \u002Fdata\u002F\nnpm run dev          # starts http:\u002F\u002Flocalhost:3000\n```\n\nYou 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.\n\n---\n\n## 🧰 What you can do\n\n- **Three-panel editor** designed for flow: chat (left), live preview (center), drag-reorderable slide filmstrip (bottom).\n- **Generate slides by chatting**: \"Make me a 5-slide carousel about productivity habits — bold sans-serif, dark mode, accent red.\" Watch them stream in.\n- **Iterate per slide**: \"Make slide 3 more minimal\", \"Change the accent to teal\", \"Swap the hook for something punchier.\"\n- **Three Instagram aspect ratios** ready to go: 1:1 (1080×1080), 4:5 (1080×1350), 9:16 (1080×1920).\n- **Brand config** — name, color palette, fonts, logo, style keywords. Claude reads it before every generation so output stays on-brand.\n- **Templates** — save any carousel as a template, reuse it for the next one.\n- **Reference images** — drop in screenshots of carousels you love. Claude studies them to match style.\n- **Drag to reorder** slides via dnd-kit. Undo per-slide if a tweak goes sideways (version history per slide).\n- **Safe-zone overlay** to verify nothing important crops behind Instagram's UI.\n- **Fullscreen preview** for the final review.\n- **One-click export** — Puppeteer screenshots each slide HTML at the exact pixel dimensions Instagram expects, zips them, downloads.\n- **Captions + hashtags** generator built into the editor.\n- **All local** — slides, brand, uploads, exports all live in `\u002Fdata\u002F` and `\u002Fpublic\u002Fuploads\u002F`. Nothing is sent to a cloud you don't control. The only network call is when Claude Code talks to Anthropic.\n\n---\n\n## 💬 How the AI agent works\n\nThe in-app agent is the **Claude CLI** spawned as a subprocess from `\u002Fapi\u002Fchat` with `--allowedTools Bash WebFetch`. Messages stream back to the browser via Server-Sent Events.\n\nWhen you ask for a slide, Claude:\n\n1. Reads your brand config + active carousel state from the system prompt\n2. Writes the slide as a complete HTML\u002FCSS string\n3. POSTs it to `\u002Fapi\u002Fcarousels\u002F[id]\u002Fslides` via `curl` (using its `Bash` tool)\n4. The new slide appears in your filmstrip seconds later\n\n### Example chat\n\n```\nYou    > Create a 5-slide carousel about “3 morning habits that\n         actually move the needle.” Punchy, dark mode, accent red,\n         portrait 4:5.\n\nClaude > Coming up. I'll build a hook slide, three habit slides,\n         and a CTA. Working...\n         [streams 5 HTML slides into the filmstrip]\n\nYou    > Slide 3 — the headline is too long. Cut it in half and\n         move the icon to the top.\n\nClaude > Done.\n         [updates that slide; you can \u002Fundo if you preferred the old one]\n```\n\n### How the slides become PNGs\n\nSlides are stored as **body-level HTML** (no `\u003Chtml>`\u002F`\u003Chead>`\u002F`\u003C!DOCTYPE>`). The shared function `wrapSlideHtml()` in [`src\u002Flib\u002Fslide-html.ts`](.\u002Fsrc\u002Flib\u002Fslide-html.ts) wraps that body into a full document — adding font loading, dimension constraints, and box-sizing reset — and serves it both:\n\n- to a **sandboxed `\u003Ciframe>`** for live preview in the editor\n- to **Puppeteer (headless Chromium)** for export, screenshot at exact Instagram pixel dimensions, zipped, downloaded\n\nBecause the same wrap function feeds both paths, what you see is exactly what you export. No surprises.\n\n---\n\n## 🛠 Slash commands\n\nType these inside Claude Code:\n\n| Command         | What it does                                                                                            |\n|-----------------|---------------------------------------------------------------------------------------------------------|\n| `\u002Fstart [port]` | Install + seed + run + open browser. Idempotent — re-running on a healthy install is seconds.           |\n| `\u002Fstop [port]`  | Kill the dev server. Defaults to `:3000`, accepts a port arg matching `\u002Fstart`.                         |\n| `\u002Freset`        | Wipe local carousels, templates, brand config, uploads, exports — and re-seed defaults. Asks first.    |\n| `\u002Fdoctor`       | Run setup diagnostics: Node version, Claude CLI on PATH, deps installed, data files seeded, port free. |\n\nYou can also run them outside Claude Code:\n\n```bash\nnpm run setup     # equivalent to \u002Fstart (skips the browser-open + background server bits)\nnpm run dev       # start the dev server\nnpm run build     # production build\nnpm run doctor    # run scripts\u002Fdoctor.mjs (works pre-`npm install`)\n```\n\n---\n\n## 🏗 Architecture\n\n```mermaid\nflowchart LR\n  U([\"Browser :3000\"])\n  C[\"Chat Panel\"]\n  P[\"Slide Preview\u003Cbr\u002F>(sandboxed iframe)\"]\n  F[\"Filmstrip\u003Cbr\u002F>(dnd-kit)\"]\n  API[\"\u002Fapi\u002Fchat\u003Cbr\u002F>SSE streaming\u002F\"]\n  CCLI[\"Claude CLI\u003Cbr\u002F>subprocess\"]\n  SLIDES[\"\u002Fapi\u002Fcarousels\u002F...\u002Fslides\u002F\"]\n  DATA[(\"\u002Fdata\u002F*.json\u003Cbr\u002F>async-mutex\u003Cbr\u002F>atomic writes\")]\n  EXP[\"\u002Fapi\u002F...\u002Fexport\u002F\"]\n  PUP[\"Puppeteer\u003Cbr\u002F>(headless Chromium)\"]\n  ZIP{{\"ZIP of PNGs\"}}\n\n  U --> C & P & F\n  C -- \"POST chat\" --> API\n  API -- \"spawn\" --> CCLI\n  CCLI -. \"SSE\" .-> API\n  API -. \"SSE\" .-> C\n  CCLI -- \"curl POST slide HTML\" --> SLIDES\n  SLIDES \u003C--> DATA\n  P \u003C--> SLIDES\n  F \u003C--> SLIDES\n  U -- \"Export\" --> EXP\n  EXP --> PUP\n  PUP --> ZIP\n  ZIP --> U\n```\n\n**Why these choices:**\n\n- **Local-first, single-user.** The whole app is a localhost web app talking to local files. No cloud, no auth, no database.\n- **Claude CLI as the agent.** Lets us reuse the user's existing Claude Code authentication, capabilities, and context. The subprocess gets `Bash` (to `curl` the slide-write endpoints) and `WebFetch` (for research while designing).\n- **Slides as HTML.** Claude already writes great HTML\u002FCSS — way more flexible than canvas, way easier to debug than a JSON DSL. The same HTML powers preview *and* export, so what you see is what you ship.\n- **Sandboxed iframes.** No `\u003Cscript>` tags allowed (enforced by the iframe `sandbox=\"\"` attribute). Slides can't run code or escape their box.\n- **JSON file storage with async-mutex + atomic writes.** No SQLite, no Postgres. Reads and writes go through [`src\u002Flib\u002Fdata.ts`](.\u002Fsrc\u002Flib\u002Fdata.ts) with proper locking, and writes are tmp-file + rename to avoid torn JSON.\n\nFor more, see [`CLAUDE.md`](.\u002FCLAUDE.md) — the architecture doc tuned for AI assistants working on this codebase.\n\n---\n\n## 📦 Tech stack\n\n| Layer        | Tool                                                                              |\n|--------------|-----------------------------------------------------------------------------------|\n| Framework    | [Next.js 16](https:\u002F\u002Fnextjs.org) (Turbopack), [React 19](https:\u002F\u002Freact.dev)       |\n| Language     | TypeScript 5                                                                      |\n| Styling      | [Tailwind CSS v4](https:\u002F\u002Ftailwindcss.com) (CSS-first config in `globals.css`)    |\n| UI primitives| [Radix UI](https:\u002F\u002Fwww.radix-ui.com), [lucide-react](https:\u002F\u002Flucide.dev)          |\n| Drag\u002Fdrop    | [@dnd-kit](https:\u002F\u002Fdndkit.com)                                                    |\n| AI agent     | [Claude CLI](https:\u002F\u002Fdocs.anthropic.com\u002Fen\u002Fdocs\u002Fclaude-code) subprocess           |\n| Image export | [Puppeteer](https:\u002F\u002Fpptr.dev), [Sharp](https:\u002F\u002Fsharp.pixelplumbing.com)           |\n| Zipping      | [Archiver](https:\u002F\u002Fgithub.com\u002Farchiverjs\u002Fnode-archiver)                           |\n| Storage      | JSON files + [async-mutex](https:\u002F\u002Fgithub.com\u002FDirtyHairy\u002Fasync-mutex)             |\n| Animation    | CSS-first ([Emil Kowalski's design philosophy](https:\u002F\u002Fanimations.dev))           |\n\n---\n\n## 📁 Project structure\n\n```\nopen-carrusel\u002F\n├── .claude\u002F\n│   └── commands\u002F             ← \u002Fstart, \u002Fstop, \u002Freset, \u002Fdoctor (Claude Code slash commands)\n├── data\u002F                     ← user state (gitignored): brand, carousels, templates, exports\n├── docs\u002Fscreenshots\u002F         ← README assets\n├── public\u002Fuploads\u002F           ← user uploads (gitignored): logos, reference images\n├── scripts\u002F\n│   ├── setup.mjs             ← npm install + seed data dirs + Claude CLI detection (cross-platform)\n│   └── doctor.mjs            ← env diagnostic (zero deps, runs pre-install)\n├── src\u002F\n│   ├── app\u002F\n│   │   ├── api\u002F              ← every backend route (chat, carousels, slides, export, brand, ...)\n│   │   ├── carousel\u002F[id]\u002F    ← editor page\n│   │   ├── globals.css       ← Tailwind v4 theme + Emil-style motion tokens\n│   │   ├── layout.tsx\n│   │   └── page.tsx          ← dashboard page\n│   ├── components\u002F\n│   │   ├── brand\u002F            ← BrandSetup, ColorPicker, FontSelector, LogoUpload\n│   │   ├── chat\u002F             ← ChatPanel, ChatMessage, ChatInput, ReferenceImages\n│   │   ├── editor\u002F           ← CarouselPreview, SlideFilmstrip, SlideRenderer, ExportButton, ...\n│   │   ├── layout\u002F           ← TopBar\n│   │   ├── templates\u002F        ← TemplateGallery, TemplateCard\n│   │   └── ui\u002F               ← Button, Input, Badge, ConfirmDialog, CreateCarouselDialog\n│   ├── lib\u002F\n│   │   ├── chat-system-prompt.ts   ← dynamic system prompt (brand + carousel context)\n│   │   ├── slide-html.ts            ← wrapSlideHtml() — the rendering contract\n│   │   ├── carousels.ts             ← carousel + slide CRUD with version history\n│   │   ├── data.ts                  ← JSON storage with async-mutex + atomic writes\n│   │   ├── claude-path.ts           ← portable Claude CLI discovery\n│   │   └── ...\n│   └── types\u002F                ← shared TypeScript types\n├── CLAUDE.md                 ← architecture doc for AI assistants working on this code\n├── LICENSE                   ← MIT\n├── README.md                 ← you are here\n├── next.config.ts\n├── package.json\n└── tsconfig.json\n```\n\n---\n\n## ⚙️ Configuration\n\n### Environment variables (`.env.local`)\n\nCreated automatically by `scripts\u002Fsetup.mjs` if it can find your Claude CLI. You can override:\n\n```bash\nCLAUDE_CLI_PATH=\u002Fpath\u002Fto\u002Fclaude   # set if `which claude` doesn't find it\n```\n\nOn Windows, run `where claude` in PowerShell to find the path (typically `C:\\Users\\\u003Cyou>\\AppData\\Roaming\\npm\\claude.cmd`), then set `CLAUDE_CLI_PATH` in `.env.local`.\n\n### Brand config\n\nSet on first run (or via the gear icon in the top bar). Stored at `\u002Fdata\u002Fbrand.json`. Fields:\n\n- **Name** — your handle \u002F company \u002F project\n- **Colors** — primary, secondary, accent, background, surface\n- **Fonts** — heading + body (Google Fonts; the `\u002Fapi\u002Ffonts` endpoint serves a curated list)\n- **Logo** — optional; used by Claude when you ask for branded slides\n- **Style keywords** — free-text style hints (\"editorial, minimalist, warm tones\") that get injected into Claude's system prompt\n\n### Templates\n\nSave any carousel as a template via the bookmark icon in the editor toolbar. Templates appear in the dashboard's Templates tab. Stored at `\u002Fdata\u002Ftemplates.json`.\n\n### Reference images\n\nDrop screenshots into the chat panel's \"Reference Images\" section. Stored under `\u002Fpublic\u002Fuploads\u002F`. Claude Code can read them via `WebFetch` of the local URL when designing.\n\n---\n\n## 🩺 Troubleshooting\n\n**`\u002Fstart` says \"Node v18 detected, need ≥20.\"**\nNext.js 16 requires Node 20+. Install via [nodejs.org](https:\u002F\u002Fnodejs.org) or [nvm](https:\u002F\u002Fgithub.com\u002Fnvm-sh\u002Fnvm).\n\n**`\u002Fstart` says \"Claude CLI not found.\"**\nInstall [Claude Code](https:\u002F\u002Fdocs.anthropic.com\u002Fen\u002Fdocs\u002Fclaude-code) and authenticate. The setup script searches `~\u002F.local\u002Fbin\u002Fclaude`, `\u002Fusr\u002Flocal\u002Fbin\u002Fclaude`, `\u002Fopt\u002Fhomebrew\u002Fbin\u002Fclaude`, `~\u002F.npm-global\u002Fbin\u002Fclaude`, and `$CLAUDE_CLI_PATH`. If yours lives elsewhere, set `CLAUDE_CLI_PATH` in `.env.local`.\n\n**Port 3000 is in use.**\nRun `\u002Fstop` to kill whatever's there, or run `\u002Fstart 3001` to use a different port.\n\n**Export fails or hangs.**\nLikely a Puppeteer\u002FChromium 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.).\n\n**Slides look fine in preview but export looks different.**\nThat shouldn't happen — both go through `wrapSlideHtml()`. If it does, file an issue with the slide HTML attached.\n\n**The AI keeps generating slides that ignore my brand colors.**\nOpen 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`.\n\n**Run `\u002Fdoctor`** for a full env audit — it'll tell you which of the above applies.\n\n---\n\n## 🗺️ Roadmap\n\nOpen ideas — PRs welcome. Tick what you ship, add your own.\n\n- [ ] **Multi-language slide generation** — Spanish-LATAM voice presets so creators don't fight the AI's English defaults\n- [ ] **Reels storyboard mode** — vertical 9:16 with optional text-on-clip annotations\n- [ ] **Twitter\u002FX thread export** — same brand voice, different surface\n- [ ] **Notion \u002F Linear export** — push the carousel as a doc with each slide as a section\n- [ ] **Theme presets gallery** — community-curated `style-presets.json` you can one-click apply\n- [ ] **Per-slide AI chat** — a smaller chat thread scoped to a single slide\n- [ ] **Hosted demo** — for people who want to try before installing Claude Code\n\n---\n\n## 🤝 Contributing\n\nPRs welcome. The bar:\n\n- **Run `npm run doctor` and `npm run build`** before opening a PR — both should pass clean.\n- **Follow the file conventions** in [`CLAUDE.md`](.\u002FCLAUDE.md) — components ≤ 300 lines, types in `src\u002Ftypes\u002F`, libs in `src\u002Flib\u002F`, `cn()` from `src\u002Flib\u002Futils.ts` for class merging, all data writes through `src\u002Flib\u002Fdata.ts`.\n- **Don't touch the slide rendering contract.** `wrapSlideHtml()` in `src\u002Flib\u002Fslide-html.ts` is the seam between preview and export. Change it carefully and test the export round-trip.\n- **Animations follow [Emil Kowalski's philosophy](https:\u002F\u002Fanimations.dev)** — CSS-first, custom easings (already defined as CSS variables in `globals.css`), respect `prefers-reduced-motion`. See the `oc-*` utility classes already in `globals.css` before authoring new ones.\n\nGood first contributions: roadmap items above, more brand templates, accessibility audits, real screenshots\u002Fdemos for the README, translations.\n\n---\n\n## 🙏 Acknowledgments\n\n- **[Emil Kowalski](https:\u002F\u002Femilkowal.ski)** — animation philosophy that shaped the whole motion system. The `oc-*` CSS classes encode his design-engineering principles (custom easings, restraint over excess, `@starting-style` over JS for entries).\n- **[Anthropic](https:\u002F\u002Fwww.anthropic.com)** — Claude (the model) and Claude Code (the CLI) are the brain of the in-app agent.\n- **[Vercel](https:\u002F\u002Fvercel.com)** — Next.js + Turbopack make local-first React apps feel snappy.\n- **[Radix UI](https:\u002F\u002Fwww.radix-ui.com)** + **[shadcn\u002Fui](https:\u002F\u002Fui.shadcn.com)** — the patterns underneath the dialog\u002Fbutton\u002Finput primitives.\n- **[dnd-kit](https:\u002F\u002Fdndkit.com)** — the only sane drag-and-drop story in React.\n- **[Puppeteer](https:\u002F\u002Fpptr.dev)** + **[Sharp](https:\u002F\u002Fsharp.pixelplumbing.com)** — the export pipeline.\n\n---\n\n## 👋 About the maker\n\nOpen Carrusel is built and maintained by **[tododeia](https:\u002F\u002Fwww.tododeia.com)** — a content + AI lab building tools for creators who want leverage without lock-in.\n\nFounder: **Enrique Rocha** ([@soyenriquerocha](https:\u002F\u002Fwww.instagram.com\u002Fsoyenriquerocha)) — Tijuanense, content creator, builds AI tools so creators don't fall behind. Also behind [@tododeia](https:\u002F\u002Fwww.instagram.com\u002Ftododeia) and [@metara.ai](https:\u002F\u002Fwww.instagram.com\u002Fmetara.ai).\n\nIf Open Carrusel saves you time, the best support is:\n\n- ⭐ **Star this repo** to help others find it\n- 🐛 **Open an issue** when something breaks (or send a PR)\n- 📲 **Tag [@soyenriquerocha](https:\u002F\u002Fwww.instagram.com\u002Fsoyenriquerocha) or [@tododeia](https:\u002F\u002Fwww.instagram.com\u002Ftododeia)** when you ship a carousel made with it — we love seeing it\n- 🌐 **Visit [tododeia.com](https:\u002F\u002Fwww.tododeia.com)** for more AI-for-creators content\n\n---\n\n## 📄 License\n\n[MIT](.\u002FLICENSE) — do anything you want with it. Attribution appreciated, never required.\n\n---\n\n\u003Cdiv align=\"center\">\n\n**Built with ❤️ in Tijuana by [tododeia](https:\u002F\u002Fwww.tododeia.com).**\n\n*Hecho para creadores que construyen el futuro.*\n\n\u003C\u002Fdiv>\n","Open Carrusel 是一个基于AI的Instagram轮播图生成工具，通过与Claude聊天来设计幻灯片，并以Instagram要求的确切尺寸导出为PNG图片。其核心功能包括利用先进的AI技术进行创意设计，支持本地优先运行，无需担心数据隐私问题。该项目采用TypeScript编写，结合了Next.js和React等现代前端技术栈，确保了高效稳定的用户体验。适用于需要快速制作高质量、独特且符合品牌风格的Instagram内容营销场景，特别适合个人创作者或小型团队使用。","2026-06-11 02:43:42","CREATED_QUERY"]