From 9f858c0ba890ee8f18bd64ab91cf766a050e133c Mon Sep 17 00:00:00 2001 From: Anil Chandra Naidu Matcha Date: Tue, 21 Apr 2026 17:22:35 +0530 Subject: [PATCH 1/4] Add link to Awesome-GPT-Image-2-API-Prompts at top --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5e702bd..a0b3213 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ > **The free, open-source, unrestricted alternative to Higgsfield AI, Freepik, Krea, Openart AI.** Generate AI images and videos using 200+ state-of-the-art models — no content filters, no closed ecosystem, no subscription fees. +> 💡 **Looking for GPT-Image-2 prompts?** Check out [Awesome GPT-Image-2 API Prompts](https://github.com/Anil-matcha/Awesome-GPT-Image-2-API-Prompts) — a curated collection of 40+ ready-to-use prompts for the OpenAI `gpt-image-2` API covering portraits, posters, UI mockups, game screenshots, and more. + ## 🌐 Try it Online — No Install Required **Hosted version:** [https://dev.muapi.ai/open-generative-ai](https://dev.muapi.ai/open-generative-ai) From 4c48d58159942e31d43feb1ed82c7b232ba3bdcc Mon Sep 17 00:00:00 2001 From: Anil Matcha Date: Wed, 22 Apr 2026 00:58:30 +0530 Subject: [PATCH 2/4] docs: add Workflow Studio section with Vibe Workflow link Co-Authored-By: Claude Sonnet 4.6 --- README.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a0b3213..5f5337d 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,7 @@ For a deep dive into the technical architecture and the philosophy behind the "I - **Video Studio** — Generate videos from text prompts (40+ text-to-video models) or animate a start-frame image (60+ image-to-video models). Same intelligent mode switching as Image Studio. - **Lip Sync Studio** — Animate portrait images or sync lips on existing videos using audio. 9 dedicated models across two modes: portrait image + audio → talking video, and video + audio → lipsync video. - **Cinema Studio** — Interface for photorealistic cinematic shots with pro camera controls (Lens, Focal Length, Aperture) +- **Workflow Studio** — Build and run multi-step AI pipelines visually. Chain image, video, and audio models into automated flows. Browse community templates, create your own with a node-based editor, and run them via an interactive playground. - **Upload History** — Reference images are uploaded once and stored locally. A picker panel lets you reuse any previously uploaded image across sessions — no re-uploading. - **Smart Controls** — Dynamic aspect ratio, resolution/quality, and duration pickers that adapt to each model's capabilities (including t2i models with resolution or quality options) - **Generation History** — Browse, revisit, and download all past generations (persisted in browser storage) @@ -235,6 +236,20 @@ The **Lip Sync Studio** generates audio-driven talking videos using 9 models acr Generation history is saved separately in `lipsync_history` and pending jobs resume automatically on page reload. +### 🔀 Workflow Studio + +The **Workflow Studio** lets you build and run multi-step AI pipelines without writing code. + +**Key capabilities:** +- **Templates** — Start from pre-built workflows (image chains, video pipelines, and more) +- **My Workflows** — Save and manage your own custom pipelines +- **Community** — Browse and run workflows published by other users +- **Node-based Builder** — Drag-and-drop visual editor to connect models and route outputs between steps +- **Playground** — Run any workflow interactively with a form UI; results render inline +- **API execution** — Every workflow is also callable via the Muapi API + +> 💡 **Want to add workflows to your own app?** Check out **[Vibe Workflow](https://github.com/SamurAIGPT/Vibe-Workflow)** — the open-source workflow engine powering this feature. Drop it into any project. + ### 🎥 Cinema Studio Controls The **Cinema Studio** offers precise control over the virtual camera, translating your choices into optimized prompt modifiers: @@ -325,14 +340,15 @@ Open-Generative-AI/ ├── packages/ │ └── studio/ # Shared React component library │ └── src/ -│ ├── index.js # Exports: ImageStudio, VideoStudio, LipSyncStudio, CinemaStudio +│ ├── index.js # Exports: ImageStudio, VideoStudio, LipSyncStudio, CinemaStudio, WorkflowStudio │ ├── models.js # 200+ model definitions (single source of truth) │ ├── muapi.js # API client (named exports, apiKey as first param) │ └── components/ │ ├── ImageStudio.jsx # Dual-mode t2i/i2i studio │ ├── VideoStudio.jsx # Dual-mode t2v/i2v studio │ ├── LipSyncStudio.jsx # Portrait/video + audio → talking video -│ └── CinemaStudio.jsx # Pro studio with camera controls +│ ├── CinemaStudio.jsx # Pro studio with camera controls +│ └── WorkflowStudio.jsx # Multi-step pipeline builder & playground ├── next.config.mjs # transpilePackages: ['studio'] ├── tailwind.config.js └── package.json # workspaces: ["packages/studio"] From aa6917e33932bcf6f22d9ec244b91e0b55f067d7 Mon Sep 17 00:00:00 2001 From: Anil Matcha Date: Wed, 22 Apr 2026 06:57:25 +0530 Subject: [PATCH 3/4] =?UTF-8?q?release:=20v1.0.2=20=E2=80=94=20rename=20Se?= =?UTF-8?q?edance=202.0=20models=20to=20SD=202,=20fix=20Windows=20build=20?= =?UTF-8?q?size?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename Seedance 2.0 → SD 2 (t2v, extend, i2v models) - Bump version to 1.0.2 - Update README download links to v1.0.2 - Fix afterPack.js to strip platform-inappropriate @next/swc native binaries, reducing Windows installer from ~739 MB unpacked to ~144 MB - Windows build now targets x64 only (arm64 cross-compile via Wine is broken on macOS) Co-Authored-By: Claude Sonnet 4.6 --- README.md | 6 +++--- afterPack.js | 29 ++++++++++++++++++++++++++++- package.json | 5 ++--- src/lib/models.js | 8 ++++---- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 5f5337d..f048a7b 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ One-click installers — no Node.js or terminal required. | Platform | Download | |---|---| -| macOS Apple Silicon (M1/M2/M3/M4) | [Open Generative AI-1.0.0-arm64.dmg](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.0/Open.Generative.AI-1.0.0-arm64.dmg) | -| macOS Intel (x64) | [Open Generative AI-1.0.0.dmg](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.0/Open.Generative.AI-1.0.0.dmg) | -| Windows (x64 + ARM64) | [Open Generative AI Setup 1.0.0.exe](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.0/Open.Generative.AI.Setup.1.0.0.exe) | +| macOS Apple Silicon (M1/M2/M3/M4) | [Open Generative AI-1.0.2-arm64.dmg](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.2/Open.Generative.AI-1.0.2-arm64.dmg) | +| macOS Intel (x64) | [Open Generative AI-1.0.2.dmg](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.2/Open.Generative.AI-1.0.2.dmg) | +| Windows (x64 + ARM64) | [Open Generative AI Setup 1.0.2.exe](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.2/Open.Generative.AI.Setup.1.0.2.exe) | | Linux (Ubuntu x64) | Build locally with `npm run electron:build:linux` | All releases: [github.com/Anil-matcha/Open-Generative-AI/releases](https://github.com/Anil-matcha/Open-Generative-AI/releases) diff --git a/afterPack.js b/afterPack.js index 869b8ce..f407ee0 100644 --- a/afterPack.js +++ b/afterPack.js @@ -1,8 +1,35 @@ import { execSync } from 'child_process'; import path from 'path'; +import fs from 'fs'; export default async function afterPack({ appOutDir, packager }) { - if (packager.platform.name !== 'mac') return; + const platformName = packager.platform.name; + + // Remove Next.js SWC native binaries that don't belong on this target platform. + // They are bundled because `next` is in dependencies, but only the host-platform + // binary is ever used at runtime in the Electron app. + const nextDir = path.join(appOutDir, + platformName === 'mac' + ? `${packager.appInfo.productName}.app/Contents/Resources` + : 'resources', + 'app.asar.unpacked/node_modules/@next' + ); + + if (fs.existsSync(nextDir)) { + const keepPrefix = platformName === 'mac' ? 'swc-darwin' + : platformName === 'windows' ? 'swc-win32' + : 'swc-linux'; + + for (const entry of fs.readdirSync(nextDir)) { + if (entry.startsWith('swc-') && !entry.startsWith(keepPrefix)) { + const fullPath = path.join(nextDir, entry); + fs.rmSync(fullPath, { recursive: true, force: true }); + console.log(` • removed foreign SWC binary path=${fullPath}`); + } + } + } + + if (platformName !== 'mac') return; const appPath = path.join(appOutDir, `${packager.appInfo.productName}.app`); console.log(` • ad-hoc signing path=${appPath}`); diff --git a/package.json b/package.json index 75ae726..6af5412 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "open-generative-ai", "description": "Open-source alternative to Higgsfield AI — AI image, video, cinema and lip sync studio", "private": true, - "version": "1.0.1", + "version": "1.0.2", "workspaces": [ "packages/studio" ], @@ -52,8 +52,7 @@ { "target": "nsis", "arch": [ - "x64", - "arm64" + "x64" ] } ] diff --git a/src/lib/models.js b/src/lib/models.js index 0a9a010..f4c4073 100644 --- a/src/lib/models.js +++ b/src/lib/models.js @@ -2162,7 +2162,7 @@ export const t2vModels = [ }, { "id": "seedance-v2.0-t2v", - "name": "Seedance 2.0", + "name": "SD 2", "inputs": { "prompt": { "type": "string", "title": "Prompt", "name": "prompt", "description": "The prompt to generate the video" }, "aspect_ratio": { "enum": ["16:9", "9:16", "4:3", "3:4"], "title": "Aspect Ratio", "name": "aspect_ratio", "type": "string", "description": "Aspect ratio of the output video.", "default": "16:9" }, @@ -2172,10 +2172,10 @@ export const t2vModels = [ }, { "id": "seedance-v2.0-extend", - "name": "Seedance 2.0 Extend", + "name": "SD 2 Extend", "requiresRequestId": true, "inputs": { - "request_id": { "type": "string", "title": "Request ID", "name": "request_id", "description": "Request ID of the original Seedance 2.0 video generation.", "placeholder": "abcdefg-123-456-789-a1b2c3d4e5f6" }, + "request_id": { "type": "string", "title": "Request ID", "name": "request_id", "description": "Request ID of the original SD 2 video generation.", "placeholder": "abcdefg-123-456-789-a1b2c3d4e5f6" }, "prompt": { "type": "string", "title": "Prompt", "name": "prompt", "description": "Optional prompt to guide the extension. If omitted, the model continues with the original scene." }, "duration": { "enum": [5, 10, 15], "title": "Duration", "name": "duration", "type": "int", "description": "The duration of the generated video extension in seconds", "default": 5 }, "quality": { "enum": ["high", "basic"], "title": "Quality", "name": "quality", "type": "string", "description": "Quality of the generated video.", "default": "basic" } @@ -7938,7 +7938,7 @@ export const i2vModels = [ }, { "id": "seedance-v2.0-i2v", - "name": "Seedance 2.0 I2V", + "name": "SD 2 I2V", "endpoint": "seedance-v2.0-i2v", "family": "seedance-v2.0", "imageField": "images_list", From 9de0de34308741392d0a48ad1dc1d63473656f4d Mon Sep 17 00:00:00 2001 From: Anil Matcha Date: Wed, 22 Apr 2026 12:04:52 +0530 Subject: [PATCH 4/4] fix: correct predictions poll URL in studio muapi client MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PROXY_APP_BASE ('/api/app') produced /api/app/v1/predictions/... which after the Next.js rewrite hit 127.0.0.1:8000/app/v1/... → 404. Poll now uses BASE_URL directly, consistent with how submit works. Co-Authored-By: Claude Sonnet 4.6 --- packages/studio/src/muapi.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/studio/src/muapi.js b/packages/studio/src/muapi.js index 4a008b5..fb15023 100644 --- a/packages/studio/src/muapi.js +++ b/packages/studio/src/muapi.js @@ -1,11 +1,10 @@ import { getModelById, getVideoModelById, getI2IModelById, getI2VModelById, getV2VModelById, getLipSyncModelById } from './models.js'; -const BASE_URL = 'https://api.muapi.ai'; // Legacy direct URL -const PROXY_APP_BASE = '/api/app'; +const BASE_URL = 'https://api.muapi.ai'; const PROXY_WF_BASE = '/api/workflow'; async function pollForResult(requestId, key, maxAttempts = 900, interval = 2000) { - const pollUrl = `${PROXY_APP_BASE}/v1/predictions/${requestId}/result`; + const pollUrl = `${BASE_URL}/api/v1/predictions/${requestId}/result`; for (let attempt = 1; attempt <= maxAttempts; attempt++) { await new Promise(resolve => setTimeout(resolve, interval)); try {