One sentence, many pictures
Type what you need and how many. Press one button. The spreadsheet is there when you want it, not before.
Bulk AI image generation from a sentence or a spreadsheet, using your own API keys. Free to run, no account, keys stay on your machine.
Type what you need and how many. Press one button. The spreadsheet is there when you want it, not before.
OVHcloud needs no signup. Cloudflare gives ~690 a day with no card. Your own machine is unlimited.
No account, no server. Keys live on your computer and go only to the engine you picked.
Every paid run stops first: how many, which model, the price each, the total, and a free alternative.
Installed side by side, the video app can ask the forge for its pictures. No keys cross over.
An MCP server with eight tools lets Claude Code, Cursor or n8n fill the list and run it.
React 18 + Vite + TypeScript, packaged with Electron for Windows. No backend,
no state library, ~20k lines. Everything durable is a CSV or a localStorage
key. 672 tests (vitest) run in CI on every push with typecheck and build.
npm install
npm run dev # http://localhost:3000 (browser mode)
npm test && npm run typecheck && npm run build
node scripts/build-exe.js # NSIS installer + portable exe
src/lib/engines.mjs is the single source of truth for routing, prices,
network calls and file naming, and it is DOM-free — no React, window or
document. That is what lets the app and the MCP server (scripts/mcp-server.js)
run the same code. Browser-only concerns live in src/lib/providers.ts.
resolveRoute(row, settings) → { engine, apiModel, def }. The row’s
model column wins; blank falls back to the engine picked in the toolbar
(default for a fresh install: ovh).generateBytes() makes the request, then overrides the claimed MIME type
with the one the bytes declare (mimeFromBytes); the filename’s extension
is corrected to match (nameForMime), never the stem.429 the key is benched and the same row retries with the next key.checkPaidRun() → a confirmation dialog.withStyleBlock() places a style’s words per engine: last normally, first
on SDXL/OVHcloud, whose CLIP text encoder reads ~77 tokens and drops the
rest silently.
| id | engine | cost | notes |
|---|---|---|---|
ovh-sdxl |
OVHcloud SDXL | free, no key | 2/min, paced in-process; 1024² only; no seed |
cloudflare-flux |
Workers AI | free | no CORS → proxied (/cf-api); rejects seed |
flux / turbo |
Pollinations | free | needs a token |
| (local) | LocalAI & co. | free | ref_images supported |
nano-banana* |
paid | JPEG only; 429 may mean “no prepay balance” |
|
gpt-image-1, dall-e-3 |
OpenAI-compatible | paid |
Two apps, not a merge. The desktop main process (electron/link.mjs) owns a
folder under userData:
link/presence.json { app, version, port, inbox, outbox }
link/inbox/<id>.json request from the other app
link/processing/<id>.json claimed, being made
link/outbox/<id>/* pictures, then done.json
Requests are validated in the main process only (id shape, ≤ 60 rows, plain
filenames, size limit); invalid ones are moved to inbox/rejected/ with a
.why.txt. The page polls /link/requests every 5 s behind an
X-Forge-Link: 1 header — a custom header forces a CORS preflight the server
never grants, so no other web page can drive it. Rows carry request_id;
when all end, the page PUTs each picture and POSTs done. Keys never
cross over. The vid creator side is tools/lib/forgeLink.mjs +
npm run ask-forge.
Window or browser (electron/appctl.mjs, src/lib/desktop.ts): the
same server either way. Switching posts the page’s whole localStorage to
/app/mode; the other side takes it once from /app/handover before
React mounts. The window and a browser are separate storage even on one
origin, so without this the switch would look like data loss.
Update now: /app/update accepts only
github.com/Stravelakis/image-forge/releases/download/…Setup….exe,
downloads it and runs it with /S --updated --force-run. /app/* needs
the X-Forge-App: 1 header, like the link.
ESM main process; never require() (it crashed the proxies in 1.0.0).
Fixed ports 47821–47825, never listen(0): storage is per origin.
Data in %APPDATA%\image-forge (package name; no productName).
Loads report stored | empty | rescued; a rescued load keeps a .rescue
copy and holds autosave instead of writing defaults over real data.
Branch → bump five version fields (tests/version.test.ts enforces) →
CHANGELOG → tests/typecheck/build → build exe and install it → PR → merge →
tag vX.Y.Z. release.yml publishes the exes; docs.yml rebuilds this site.
Full map: HANDOFF.md.
A Windows app that makes pictures in bulk. You say what you need and how many, and it makes them, names them properly, and puts them in a folder.
It uses AI image services — some free, some paid — with your own keys. There is no account and no Image Forge server. Your keys stay on your computer and are sent only to the service you chose.
The app opens on the Start screen.
With nothing set up it uses OVHcloud, which is free and needs no key. It makes two pictures a minute and they are always square. The pictures appear under the box as they finish; click one to see it full size.
Open Settings → Image engines:
A paid engine never runs without asking. You see how many pictures, the price each, the total and which credit pays — with a button to switch to a free engine instead.
The Start screen varies a set by framing. For genuinely different pictures in one set, add a text engine: Settings → Text engines → Your accounts. One free Mistral key covers writing, code and vision.
The top of Settings says when your settings were last saved and checked, and how many keys are stored (it never shows them). Press Back up to a file once your keys are in, and keep the file private — it holds the keys.
If both apps are installed, the video app can ask Image Forge for pictures, such as mouth-shape sheets for its characters. Free requests run by themselves; anything that costs money still asks you first.
Be aware: free engines often draw one picture when asked for a grid of nine, so check sheets by eye. A Google model follows grid instructions far better.
The full troubleshooting page, with the cause of each problem, is in the repository.
Image Forge can open in its own window or in the browser you already use — Settings → Advanced → Where Image Forge opens. Your settings and keys come along. When a new version is out, Update now installs it for you and reopens the app; nothing of yours is touched.
Image Forge is a picture-making machine on your computer.
You tell it what you want — “twelve cute potion bottles” — and it asks a robot artist on the internet to draw them. Then it puts all the drawings in a folder with sensible names.
Not if you don’t want it to. Some robot artists are free. One of them doesn’t even need you to sign up.
Some robot artists cost a little money for each picture. Image Forge will always ask you first before using one of those, and tell you how much.
To use some robot artists you need a secret password called a key. Image Forge keeps your keys on your own computer. It never sends them anywhere except to the robot artist you picked.
There is another app called BYOK Vid Creator that makes videos with talking cartoon characters. If you have both, the video app can ask Image Forge to draw pictures for it. They help each other.
Usually it just needs a minute — free robot artists are a bit slow. If a picture looks wrong, you can ask for it again. And if you are stuck, the people who made it would like to hear about it on GitHub.
You can open the picture factory in its own window or in your web browser — you choose. And when there is a newer factory, one button swaps it in for you. Your pictures stay right where they are.